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

Revision 13041, 5.2 kB (checked in by robert, 2 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#include "TileMapper.h"
2#include "TXPPagedLOD.h"
3
4#include <algorithm>
5
6using namespace txp;
7
8TXPPagedLOD::TXPPagedLOD():
9    osg::PagedLOD()
10{
11}
12
13TXPPagedLOD::TXPPagedLOD(const TXPPagedLOD& plod,const osg::CopyOp& copyop):
14    osg::PagedLOD(plod,copyop),
15    _tileIdentifier(plod._tileIdentifier)
16{
17}
18
19TXPPagedLOD::~TXPPagedLOD()
20{
21}
22
23void TXPPagedLOD::traverse(osg::NodeVisitor& nv)
24{
25
26    //TileMapper* tileMapper = dynamic_cast<TileMapper*>(nv.getUserData());
27    //Modified by Brad Anderegg (May-27-08) because the black listing process appears to make tiles switch lods
28    //when they clearly shouldnt, in the worst cases a tile will page out that is right in front of you.
29    bool forceUseOfFirstChild = /*tileMapper ? (tileMapper->isNodeBlackListed(this)) :*/ false;
30
31    double timeStamp = nv.getFrameStamp()?nv.getFrameStamp()->getReferenceTime():0.0;
32    bool updateTimeStamp = nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR;
33    unsigned int frameNumber = nv.getFrameStamp()?nv.getFrameStamp()->getFrameNumber():0;
34
35    // set the frame number of the traversal so that external nodes can find out how active this
36    // node is.
37    if (nv.getFrameStamp() &&
38        nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR)
39    {
40        setFrameNumberOfLastTraversal(nv.getFrameStamp()->getFrameNumber());
41    }
42
43    switch(nv.getTraversalMode())
44    {
45        case(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN):
46            std::for_each(_children.begin(),_children.end(),osg::NodeAcceptOp(nv));
47            break;
48        case(osg::NodeVisitor::TRAVERSE_ACTIVE_CHILDREN):
49        {
50            float distance = nv.getDistanceToEyePoint(getCenter(),true);
51
52            int lastChildTraversed = -1;
53            bool needToLoadChild = false;
54
55            unsigned maxRangeSize = _rangeList.size();
56            if (maxRangeSize!=0 && forceUseOfFirstChild)
57                maxRangeSize=1;
58
59            for(unsigned int i=0;i<maxRangeSize;++i)
60            {
61                if (forceUseOfFirstChild ||
62                    (_rangeList[i].first<=distance && distance<_rangeList[i].second))
63                {
64                    if (i<_children.size())
65                    {
66                        if (updateTimeStamp)
67                        {
68                            _perRangeDataList[i]._timeStamp=timeStamp;
69                            _perRangeDataList[i]._frameNumber=frameNumber;
70                        }
71
72                        _children[i]->accept(nv);
73                        lastChildTraversed = (int)i;
74                    }
75                    else
76                    {
77                        needToLoadChild = true;
78                    }
79                }
80            }
81
82            if (needToLoadChild)
83            {
84                unsigned int numChildren = _children.size();
85
86                //std::cout<<"PagedLOD::traverse() - falling back "<<std::endl;
87                // select the last valid child.
88                if (numChildren>0 && ((int)numChildren-1)!=lastChildTraversed)
89                {
90                    //std::cout<<"    to child "<<numChildren-1<<std::endl;
91                    if (updateTimeStamp)
92                        _perRangeDataList[numChildren-1]._timeStamp=timeStamp;
93
94                    _children[numChildren-1]->accept(nv);
95                }
96
97                // now request the loading of the next unload child.
98                if (nv.getDatabaseRequestHandler() && numChildren<_perRangeDataList.size())
99                {
100                    // compute priority from where abouts in the required range the distance falls.
101                    float priority = (_rangeList[numChildren].second-distance)/(_rangeList[numChildren].second-_rangeList[numChildren].first);
102
103                    // modify the priority according to the child's priority offset and scale.
104                    priority = _perRangeDataList[numChildren]._priorityOffset + priority * _perRangeDataList[numChildren]._priorityScale;
105
106                    //std::cout<<"    requesting child "<<_fileNameList[numChildren]<<" priotity = "<<priority<<std::endl;
107                    nv.getDatabaseRequestHandler()->requestNodeFile(_perRangeDataList[numChildren]._filename,
108                                                                    nv.getNodePath(),
109                                                                    priority,
110                                                                    nv.getFrameStamp(),
111                                                                    _perRangeDataList[numChildren]._databaseRequest);
112                }
113
114
115            }
116
117
118           break;
119        }
120        default:
121            break;
122    }
123}
124
125osg::BoundingSphere TXPPagedLOD::computeBound() const
126{
127    // Force calculation of entire bounding sphere; this will include any
128    // externally-referenced models which are attached to the tile.
129    // If this is not done, then externally referenced models will disappear
130    // when the tile they are attached to leaves the view volume.
131    osg::BoundingSphere result = osg::Group::computeBound();
132
133    if (_centerMode==USER_DEFINED_CENTER && _radius>=0.0f)
134    {
135        float tempRadius = osg::maximum( _radius, result.radius() );
136        result = osg::BoundingSphere(_userDefinedCenter,tempRadius);
137    }
138    return result;
139}
Note: See TracBrowser for help on using the browser.