root/OpenSceneGraph/trunk/src/osgPlugins/txp/trpage_model.cpp @ 13041

Revision 13041, 9.7 kB (checked in by robert, 3 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/* ************************
2   Copyright Terrain Experts Inc.
3   Terrain Experts Inc (TERREX) reserves all rights to this source code
4   unless otherwise specified in writing by the President of TERREX.
5   This copyright may be updated in the future, in which case that version
6   supercedes this one.
7   -------------------
8   Terrex Experts Inc.
9   4400 East Broadway #314
10   Tucson, AZ  85711
11   info@terrex.com
12   Tel: (520) 323-7990
13   ************************
14   */
15
16#include <stdlib.h>
17#include <stdio.h>
18#include <string.h>
19
20#define OLDMODELSTYLE
21
22/* trpage_model.cpp
23    This source file contains the methods trpgModel and trpgModelTable.
24    You should only modify this code if you want to add data to these classes.
25    */
26
27#include <trpage_geom.h>
28#include <trpage_read.h>
29
30/* Write Model class
31    Represents a model reference.
32    */
33trpgModel::trpgModel()
34{
35    name = NULL;
36    type = External;
37    useCount = 0;
38    diskRef = -1;
39    handle = -1;
40    writeHandle = false;
41}
42
43trpgModel::trpgModel(const trpgModel &in):
44    trpgReadWriteable(in)
45{
46    if (in.name)
47    {
48        name = new char[strlen(in.name)+1];
49        strcpy(name,in.name);
50    }
51    else
52        name = NULL;
53
54    type=in.type;
55    useCount=in.useCount;
56    diskRef=in.diskRef;
57    handle = in.handle;
58    writeHandle = in.writeHandle;
59}
60
61
62// Reset function
63void trpgModel::Reset()
64{
65    if (name)
66        delete [] name;
67    name = NULL;
68    useCount = 0;
69    diskRef = -1;
70    handle = -1;
71    writeHandle = false;
72}
73
74trpgModel::~trpgModel()
75{
76    Reset();
77}
78
79// Set functions
80void trpgModel::SetType(int t)
81{
82    type = t;
83}
84
85void trpgModel::SetName(const char *nm)
86{
87    if (name)
88        delete [] name;
89
90    if (nm)
91    {
92        name = new char[(nm ? strlen(nm) : 0)+1];
93        strcpy(name,nm);
94    }
95}
96void trpgModel::SetReference(trpgDiskRef pos)
97{
98    diskRef = pos;
99}
100void trpgModel::SetNumTiles(int num)
101{
102    useCount = num;
103}
104void trpgModel::AddTile()
105{
106    useCount++;
107}
108
109// Validity check
110bool trpgModel::isValid() const
111{
112    if (type == External && !name)
113    {
114        strcpy(errMess, "Model is external with no name");
115        return false;
116    }
117
118    return true;
119}
120
121// Copy from one to another
122trpgModel& trpgModel::operator = (const trpgModel &in)
123{
124    if (name) {
125        delete [] name;
126        name = NULL;
127    }
128
129    type = in.type;
130    if (in.name)
131        SetName(in.name);
132    diskRef = in.diskRef;
133    useCount = in.useCount;
134    writeHandle = in.writeHandle;
135    handle = in.handle;
136    return *this;
137}
138
139// Compare two models
140int trpgModel::operator == (const trpgModel &in) const
141{
142    if (type != in.type)
143        return 0;
144
145    switch (type) {
146    case Local:
147        if (diskRef == in.diskRef)
148            return 1;
149        else
150            return 0;
151        break;
152    case External:
153        if (!name && !in.name)
154            return 1;
155        if (!name || !in.name)
156            return 0;
157        if (strcmp(name,in.name))
158            return 0;
159        break;
160    }
161
162    return 1;
163}
164
165// Write a model reference out
166bool trpgModel::Write(trpgWriteBuffer &buf)
167{
168    if (!isValid())
169        return false;
170
171    // We will use two different tokens to track the
172    // format used in terrapage 2.2, and older versions
173    int tok = TRPGMODELREF;
174    if(writeHandle)
175        tok = TRPGMODELREF2;
176
177// Nick messed up the model entries when checking into txv4; now we're
178// a bit stuck because U3 dbs don't have models in the U2 viewer.
179// This will force the old behavior.
180#ifdef OLDMODELSTYLE
181    buf.Begin(tok);
182    buf.Add(type);
183    //writeHandle is only set for terrapage 2.2, and we use the different token.
184    if(writeHandle) {
185        buf.Add((int)handle);
186    }
187    if (name)
188        buf.Add(name);
189    else
190        buf.Add(diskRef);
191    buf.Add(useCount);
192
193#else
194    buf.Begin(tok);
195    if(writeHandle) {
196        buf.Add((int)handle);
197    }
198    buf.Add(type);
199    buf.Add(name);
200    buf.Add(diskRef);
201    buf.Add(useCount);
202#endif
203    buf.End();
204
205    return true;
206}
207
208/*    *******************
209    Model Read Methods
210    *******************
211    */
212// Get methods
213bool trpgModel::GetType(int &t)
214{
215    if (!isValid()) return false;
216    t = type;
217    return true;
218}
219bool trpgModel::GetName(char *str,int strLen) const
220{
221    if (!isValid()) return false;
222    int len = (name ? strlen(name) : 0);
223    strncpy(str,name,MIN(len,strLen)+1);
224    return true;
225}
226bool trpgModel::GetNumTiles(int &ret) const
227{
228    if (!isValid()) return false;
229
230    ret = useCount;
231    return true;
232}
233bool trpgModel::GetReference(trpgDiskRef &ref) const
234{
235    if (!isValid() || type != Local) return false;
236    ref = diskRef;
237    return true;
238}
239
240bool trpgModel::Read(trpgReadBuffer &buf, bool hasHandle)
241{
242    // MD: added complexity here - written multiple ways by
243    // mistake, unraveling the various cases.
244    char tmpName[1024];
245
246    try {
247        buf.Get(type);
248        // TerraPage 2.2 will store the unique handle after the type
249        // we use a different token, so this is backwards compatible.
250        if(hasHandle) {
251            int32 tempHandle;
252            if(buf.Get(tempHandle))
253            {
254                handle = tempHandle;
255            }
256            else
257            {
258                handle = -1;
259            }
260        }
261        else
262            handle = -1;
263
264        if (type == Local) {
265            // two possibilities:
266            // name, diskRef, useCount
267            // diskRef, useCount
268            // diskRef + useCount = 12 bytes...
269            if (buf.TestLimit(13))
270            {
271                buf.Get(tmpName,1023);
272                SetName(tmpName);
273            }
274            buf.Get(diskRef);
275            buf.Get(useCount);
276        }
277        else
278        {
279            // two possibilities:
280            // name, diskRef, useCount
281            // name, useCount
282            buf.Get(tmpName,1023);
283            SetName(tmpName);
284            // useCount = 4 bytes...
285            if (buf.TestLimit(5))
286                buf.Get(diskRef);
287            buf.Get(useCount);
288        }
289    }
290    catch(...) {
291        return false;
292    }
293
294    // going to make this fail if the buffer isn't empty.
295    if (buf.TestLimit(1)) return false;
296
297    return isValid();
298}
299
300/* Write Model Reference table
301    Groups of models for the entire file.
302    */
303
304// Constructor
305trpgModelTable::trpgModelTable()
306{
307}
308
309trpgModelTable::~trpgModelTable()
310{
311}
312
313// Reset function
314void trpgModelTable::Reset()
315{
316    modelsMap.clear();
317}
318
319// Set functions
320void trpgModelTable::SetNumModels(int /*no*/)
321{
322    // This method isn't needed with a map
323    //models.resize(no);
324}
325void trpgModelTable::SetModel(int id,const trpgModel &mod)
326{
327    if (id < 0)
328        return;
329
330    modelsMap[id] = mod;
331    //models[id] = mod;
332}
333
334int trpgModelTable::AddModel(trpgModel &mod)
335{
336    int hdl = modelsMap.size();
337    if(mod.GetHandle()==-1) {
338        modelsMap[hdl] = mod;
339        return hdl;
340    }
341    modelsMap[mod.GetHandle()] = mod;
342    return mod.GetHandle();
343}
344
345int trpgModelTable::FindAddModel(trpgModel &mod)
346{
347
348    ModelMapType::iterator itr = modelsMap.begin();
349    for (  ; itr != modelsMap.end( ); itr++) {
350        if(itr->second == mod) {
351            return itr->first;
352        }
353    }
354    return AddModel(mod);
355}
356
357bool trpgModelTable::FindByName(const char *name, unsigned int &mId)
358{
359    ModelMapType::const_iterator itr = modelsMap.begin();
360    for (  ; itr != modelsMap.end( ); itr++) {
361        char theName[1023];
362        itr->second.GetName(theName,1023);
363        if(strcmp(name,theName)==0) {
364            mId = itr->first;
365            return true;
366        }
367    }
368    return false;
369}
370
371// Validity check
372bool trpgModelTable::isValid() const
373{
374    ModelMapType::const_iterator itr = modelsMap.begin();
375    for (  ; itr != modelsMap.end( ); itr++) {
376        if(!itr->second.isValid()) {
377            if(itr->second.getErrMess())
378                strcpy(errMess, itr->second.getErrMess());
379            return false;
380        }
381    }
382    return true;
383}
384
385
386
387// Write out the model table
388bool trpgModelTable::Write(trpgWriteBuffer &buf)
389{
390    if (!isValid())
391        return false;
392
393    buf.Begin(TRPGMODELTABLE);
394    buf.Add((int32)modelsMap.size());
395    ModelMapType::iterator itr = modelsMap.begin();
396    for (  ; itr != modelsMap.end( ); itr++) {
397        itr->second.Write(buf);
398    }
399    buf.End();
400
401    return true;
402}
403
404/*    ***************
405    Model Table Read methods
406    ***************
407    */
408
409// Get methods
410bool trpgModelTable::GetNumModels(int &nm) const
411{
412    if (!isValid())  return false;
413    nm = modelsMap.size();
414    return true;
415}
416bool trpgModelTable::GetModel(int id,trpgModel &model) const
417{
418    if (!isValid() || id < 0 ) //|| id >= models.size())
419        return false;
420    //model = models[id];
421    ModelMapType::const_iterator itr = modelsMap.find(id);
422    if(itr == modelsMap.end())    {
423        return false;
424    }
425    model = itr->second;
426    return true;
427}
428trpgModel *trpgModelTable::GetModelRef(int id)
429{
430    if (id < 0 ) //|| id >= models.size())
431        return NULL;
432    //return &models[id];
433    ModelMapType::iterator itr = modelsMap.find(id);
434    if(itr == modelsMap.end())    {
435        return false;
436    }
437    return &(itr->second);
438}
439
440bool trpgModelTable::Read(trpgReadBuffer &buf)
441{
442    int32 numModel;
443    trpgToken tok;
444    int32 len;
445    bool status;
446
447    try {
448        buf.Get(numModel);
449        for (int i=0;i<numModel;i++) {
450            trpgModel model;
451            buf.GetToken(tok,len);
452            bool readHandle;
453            if (tok == TRPGMODELREF)
454                readHandle = false;
455            else if (tok == TRPGMODELREF2)
456                readHandle = true;
457            else
458                throw 1;
459            buf.PushLimit(len);
460            status = model.Read(buf,readHandle);
461            buf.PopLimit();
462            if (!status)  throw 1;
463            AddModel(model);
464        }
465    }
466    catch (...) {
467        return false;
468    }
469
470    return isValid();
471}
Note: See TracBrowser for help on using the browser.