root/OpenSceneGraph/trunk/src/osgPlugins/txp/TerrapageNode.cpp @ 1476

Revision 1476, 4.6 kB (checked in by robert, 12 years ago)

Submission from Joseph Stell, added LoadModels? to TerrapageNode?.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#include "TerrapageNode.h"
2
3#include <osg/Notify>
4
5using namespace osg;
6
7namespace txp
8{
9
10TerrapageNode::TerrapageNode():
11    _pageManager(0)
12{
13    setNumChildrenRequiringUpdateTraversal(1);
14}
15       
16TerrapageNode::TerrapageNode(const TerrapageNode& pager,const osg::CopyOp&):
17    osg::Group(),
18    _databaseDimensions(pager._databaseDimensions),
19    _databaseName(pager._databaseName),
20    _databaseOptions(pager._databaseOptions),
21    _pageManager(0),
22    _lastRecordEyePoint(pager._lastRecordEyePoint)
23{
24    setNumChildrenRequiringUpdateTraversal(getNumChildrenRequiringUpdateTraversal()+1);           
25}
26
27TerrapageNode::~TerrapageNode()
28{
29    // will the page manger delete the archive?
30    delete _pageManager;
31}
32
33void TerrapageNode::traverse(osg::NodeVisitor& nv)
34{
35    if (_pageManager)
36    {
37        if (nv.getVisitorType()==osg::NodeVisitor::UPDATE_VISITOR)
38        {
39            updateSceneGraph();
40        }
41        else if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR)
42        {
43            updateEyePoint(nv.getEyePoint());
44        }
45    }
46   
47    Group::traverse(nv);
48}
49       
50       
51bool TerrapageNode::loadDatabase()
52{
53    // Open the TXP database
54    TrPageArchive *txpArchive = new TrPageArchive();
55    if (!txpArchive->OpenFile(_databaseName.c_str()))
56    {
57        osg::notify(osg::WARN)<<"Couldn't load TerraPage archive "<<_databaseName<<std::endl;
58        return false;
59    }
60   
61    // Note: Should be checking the return values
62    txpArchive->LoadMaterials();
63
64    // Note: Should be checking the return values
65    txpArchive->LoadModels();
66
67    // get the exents of the archive
68    const trpgHeader *head = txpArchive->GetHeader();
69    trpg2dPoint sw,ne;
70    head->GetExtents(sw,ne);
71   
72    _databaseDimensions.set(sw.x,sw.y,0.0f,
73                            ne.x,ne.y,0.0f);
74   
75
76    // set up the options.
77    bool loadAll=false;
78    OSGPageManager::ThreadMode threadMode = OSGPageManager::ThreadFree;
79
80    if (!_databaseOptions.empty())
81    {
82        if (_databaseOptions.find("LoadAll")!=std::string::npos)
83        {
84            loadAll = true;
85            std::cout<<"LoadAll selected"<<std::endl;
86        }
87       
88        if (_databaseOptions.find("ThreadNone")!=std::string::npos)
89        {
90            threadMode = OSGPageManager::ThreadNone;
91            std::cout<<"ThreadNone selected"<<std::endl;
92        }
93
94        if (_databaseOptions.find("ThreadFree")!=std::string::npos)
95        {
96            threadMode = OSGPageManager::ThreadFree;
97            std::cout<<"ThreadFree selected"<<std::endl;
98        }
99
100        if (_databaseOptions.find("ThreadSync")!=std::string::npos)
101        {
102            threadMode = OSGPageManager::ThreadSync;
103            std::cout<<"ThreadSync selected"<<std::endl;
104        }
105    }
106
107    if (loadAll)
108    {
109        // Load the whole scenegraph
110        osg::Node* node = txpArchive->LoadAllTiles();
111        if (!node) {
112            osg::notify(osg::WARN)<<"Couldn't load whole TerraPage archive "<<_databaseName<<std::endl;
113            return false;
114        }
115       
116        // need to think about ref counting these..
117        delete txpArchive;
118
119        // add the loaded database into the scenegraph.
120        addChild(node);
121       
122    } else {
123
124        _pageManager = new OSGPageManager(txpArchive);
125
126        if (threadMode!=OSGPageManager::ThreadNone)
127        {
128            ThreadID newThread;
129            _pageManager->StartThread(threadMode,newThread);
130        }
131
132    }
133
134    return true;
135}
136       
137
138void TerrapageNode::updateSceneGraph()
139{
140    if (_pageManager)
141    {        _bsphere_computed = true;
142
143        if (_pageManager->GetThreadMode() == OSGPageManager::ThreadNone)
144        {
145            // we're in non-thread mode, load in the given number of tiles (maximum).
146            int numTile = 1;
147            _pageManager->UpdateNoThread(this,_lastRecordEyePoint.x(),_lastRecordEyePoint.y(),numTile);
148        }
149        else
150        {
151            // we're in ThreadFree mode, merge in whatever may be ready.
152            _pageManager->MergeUpdateThread(this);
153        }
154    }
155}
156       
157
158void TerrapageNode::updateEyePoint(const osg::Vec3& eyepoint) const
159{
160    if (_pageManager && (_pageManager->GetThreadMode() != OSGPageManager::ThreadNone))
161    {
162        _pageManager->UpdatePositionThread(eyepoint.x(),eyepoint.y());
163    }
164   
165    _lastRecordEyePoint = eyepoint;
166}
167       
168bool TerrapageNode::computeBound() const
169{
170    if (_databaseDimensions.valid())
171    {
172        _bsphere.init();
173        _bsphere.expandBy(_databaseDimensions);
174        _bsphere_computed = true;
175        return true;
176    }
177    else
178    {
179        return Group::computeBound();
180    }
181}
182
183
184} // namespace txp
Note: See TracBrowser for help on using the browser.