- Timestamp:
- 04/07/05 18:51:36 (20 years ago)
- Location:
- trunk/VUT/OcclusionCullingSceneManager
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/VUT/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.cpp
r34 r41 62 62 ColourValue fadeColour(0.93, 0.86, 0.76); 63 63 mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000); 64 //mSceneMgr->setFog( FOG_EXP, fadeColour, 0.005 ); 64 65 mWindow->getViewport(0)->setBackgroundColour(fadeColour); 66 67 // Create a skybox 68 //mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 500, false); 69 //mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8, 500, false ); 65 70 66 71 std::string terrain_cfg("terrain.cfg"); … … 70 75 mSceneMgr -> setWorldGeometry( terrain_cfg ); 71 76 // Infinite far plane? 72 if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE))77 /* if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE)) 73 78 { 74 79 mCamera->setFarClipDistance(0); 75 } 76 77 // Define the required skyplane80 }*/ 81 82 /* // Define the required skyplane 78 83 Plane plane; 79 84 // 5000 world units from the camera … … 81 86 // Above the camera, facing down 82 87 plane.normal = -Vector3::UNIT_Y; 88 // Create the plane 10000 units wide, tile the texture 3 times 89 mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane",10000,3);*/ 83 90 84 91 // Set a nice viewpoint … … 89 96 Ray(mCamera->getPosition(), Vector3::NEGATIVE_UNIT_Y)); 90 97 91 // Create a skybox 92 // mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox"); 93 94 // CEGUI setup 95 setupGui(); 98 Entity *robotEnt = mSceneMgr->createEntity( "Robot", "robot.mesh" ); 99 SceneNode *robotNode = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode", Vector3( 750, 25, 600 )); 100 robotNode->attachObject( robotEnt ); 101 robotNode->scale( .3, .3, .3 ); 102 robotNode->yaw( Degree( 160 ) ); 103 104 Entity *ogreEnt = mSceneMgr->createEntity( "Ogre", "ogrehead.mesh" ); 105 SceneNode *ogreNode = mSceneMgr->getRootSceneNode()->createChildSceneNode( "Ogre", Vector3( 800, 50, 830 ) ); 106 ogreNode->attachObject( ogreEnt ); 107 ogreNode->scale(.2,.2,.2); 108 ogreNode->yaw( Degree( 20 ) ); 109 110 Entity *ogreEnt2 = mSceneMgr->createEntity( "Ogre2", "ogrehead.mesh" ); 111 SceneNode *ogreNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "Ogre2", Vector3( 700, 50, 730 ) ); 112 ogreNode2->attachObject( ogreEnt2 ); 113 ogreNode2->scale(.05,.05,.05); 114 ogreNode->yaw( Degree( 40 ) ); 115 116 // CEGUI setup 117 setupGui(); 96 118 } 97 119 //----------------------------------------------------------------------- -
trunk/VUT/OcclusionCullingSceneManager/include/OgreOcclusionCullingSceneTraverser.h
r39 r41 93 93 void setNumSceneNodes(int num ); 94 94 95 /** Sets the required number of occlusion queries. 96 @param num number occlusion queries 97 */ 98 void setNumQueries( int num ); 99 95 100 protected: 96 101 /** query mode (= without color) or RENDER_MODE */ … … 114 119 /** Renders the scene with the coherent hierarchical algorithm and the query queye. */ 115 120 void renderCoherentWithQueue( Camera *cam ); 116 /** Issue a occlusion query for this node. */ 117 HardwareOcclusionQuery *issueOcclusionQuery( SceneNode *node, bool wasVisible ); 121 /** Issue a occlusion query for this node. 122 @param box the axis aligned bounding box of the node 123 @wasVisible if the node was visible in previous frame 124 */ 125 HardwareOcclusionQuery *issueOcclusionQuery( AxisAlignedBox *box, bool wasVisible ); 118 126 /** Pulls up the visibility from the child nodes. */ 119 127 void pullUpVisibility( SceneNode *node ); … … 121 129 void deleteQueries(); 122 130 /** Renders bounding box of specified node. 123 @param the scene node contained in the bounding box to be rendered 124 */ 125 void renderBoundingBox( SceneNode *node ); 131 @param box the bounding box of the scene node to be rendered */ 132 void renderBoundingBox( AxisAlignedBox *box ); 126 133 /** Returns one half of the bounding box. 127 @param the half of the bouding box134 @param half the half index of the bouding box (0 or 1) 128 135 */ 129 136 SolidHalfBoundingBox *getSolidHalfBoundingBox( int half ); … … 147 154 int mQueryMode; 148 155 156 unsigned int mNumQueries; 157 149 158 //--- statistics 150 159 unsigned int mNumSceneNodes; -
trunk/VUT/OcclusionCullingSceneManager/include/OgreOcclusionCullingTerrainSceneManager.h
r40 r41 55 55 56 56 protected: 57 //OcclusionCullingTerrainSceneTraverser *mOcclusionCullingTerrainSceneTraverser; 58 OcclusionCullingSceneTraverser *mOcclusionCullingTerrainSceneTraverser; 57 /** Recursively counts octree size (i.e., number of octree instances) 58 @param root current octree 59 */ 60 unsigned int countOctreeSize(Octree *root); 61 62 OcclusionCullingTerrainSceneTraverser *mOcclusionCullingTerrainSceneTraverser; 63 //OcclusionCullingSceneTraverser *mOcclusionCullingTerrainSceneTraverser; 59 64 }; 60 65 -
trunk/VUT/OcclusionCullingSceneManager/include/OgreOcclusionCullingTerrainSceneTraverser.h
r40 r41 59 59 60 60 void pullUpVisibility( Octree *octree ); 61 void traverseOct ree( Camera *cam, Octree *octree);62 void renderOct ree( Camera *cam, Octree *octree);61 void traverseOctant(Camera *cam, Octree *octant ); 62 void renderOctant( Camera *cam, Octree *octant ); 63 63 64 64 OctreePriorityQueue *mDistanceQueue; -
trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneManager.cpp
r37 r41 42 42 { 43 43 mOcclusionCullingSceneTraverser->setNumSceneNodes(mSceneNodes.size()); 44 mOcclusionCullingSceneTraverser->setNumQueries(mSceneNodes.size()); 44 45 mOcclusionCullingSceneTraverser->setRenderSystem(mDestRenderSystem); 45 46 -
trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneTraverser.cpp
r40 r41 16 16 mFrameId(1), mDistanceQueue(NULL), mVisibilityThreshold(0), mCurrentTestIdx(0), 17 17 mQueryMode(MODE_RENDER), mNumSceneNodes(0), mCurrentAlgorithm(RENDER_COHERENT), 18 mNum TraversedNodes(0), mNumQueryCulledNodes(0), mNumFrustumCulledNodes(0),18 mNumQueries(0), mNumTraversedNodes(0), mNumQueryCulledNodes(0), mNumFrustumCulledNodes(0), 19 19 mNumRenderedGeometry(0), mSceneManager(sm), mRenderSystem(rsys) 20 20 { … … 42 42 mCurrentTestIdx = 0; 43 43 44 mCurrentAlgorithm = RENDER_CULL_FRUSTUM;44 //mCurrentAlgorithm = RENDER_CULL_FRUSTUM; 45 45 switch(mCurrentAlgorithm) 46 46 { … … 99 99 SceneNode *node = mDistanceQueue->top(); 100 100 mDistanceQueue->pop(); 101 102 if(cam->isVisible(node->_getWorldAABB())) 103 { 104 // identify previously visible nodes 105 bool wasVisible = node->isNodeVisible() && (node->lastVisited() == mFrameId - 1); 101 102 //TODO: Isvisible also checked inside scenenode::findvisibleobjects 103 if(!cam->isVisible(node->_getWorldAABB())) 104 { 105 mNumFrustumCulledNodes ++; 106 continue; 107 } 108 109 // identify previously visible nodes 110 bool wasVisible = node->isNodeVisible() && (node->lastVisited() == mFrameId - 1); 106 111 107 108 109 110 111 112 113 114 112 // identify nodes that we cannot skip queries for 113 bool leafOrWasInvisible = !wasVisible || isLeaf(node); 114 115 // reset node's visibility classification 116 node->setNodeVisible(false); 117 118 // update node's visited flag 119 node->setLastVisited(mFrameId); 115 120 116 117 118 119 HardwareOcclusionQuery *query = issueOcclusionQuery(node, wasVisible);120 121 121 // skip testing previously visible interior nodes 122 if(leafOrWasInvisible) 123 { 124 HardwareOcclusionQuery *query = issueOcclusionQuery(&node->_getWorldAABB(), wasVisible); 125 queryQueue.push(QueryPair(node, query)); 126 } 122 127 123 // always traverse a node if it was visible 124 if(wasVisible) 125 { 126 traverseNode(cam, node); 127 } 128 // always traverse a node if it was visible 129 if(wasVisible) 130 { 131 traverseNode(cam, node); 128 132 } 129 133 else … … 144 148 // interesting for visualization purpose 145 149 node->setNodeVisible(false); 146 147 if(cam->isVisible(node->_getWorldAABB())) 148 { 149 // update node's visited flag 150 char msg2[100]; 151 sprintf(msg2,"yes, visible\n"); 152 OutputDebugString(msg2); 153 154 node->setLastVisited(mFrameId); 155 node->setNodeVisible(true); 156 traverseNode(cam, node); 157 } 158 else 150 151 //TODO: IsVisible also checked inside scenenode::_findvisibleobjects 152 if(!cam->isVisible(node->_getWorldAABB())) 159 153 { 160 154 char msg2[100]; … … 163 157 164 158 mNumFrustumCulledNodes ++; 159 continue; 165 160 } 161 162 // update node's visited flag 163 node->setLastVisited(mFrameId); 164 node->setNodeVisible(true); 165 traverseNode(cam, node); 166 167 char msg2[100]; 168 sprintf(msg2,"yes, visible\n"); 169 OutputDebugString(msg2); 166 170 } 167 171 } … … 178 182 node->setLastVisited(mFrameId); 179 183 180 if(cam->isVisible(node->_getWorldAABB())) 184 //TODO: Isvisible also checked inside scenenode::findvisibleobjects 185 if(!cam->isVisible(node->_getWorldAABB())) 181 186 { 182 HardwareOcclusionQuery *query = issueOcclusionQuery(node, false); 187 mNumFrustumCulledNodes ++; 188 continue; 189 } 190 191 HardwareOcclusionQuery *query = issueOcclusionQuery(&node->_getWorldAABB(), false); 183 192 184 185 186 193 unsigned int visiblePixels; 194 // wait if result not available 195 query->pullOcclusionQuery(&visiblePixels); 187 196 188 // node visible 189 if(visiblePixels > mVisibilityThreshold) 190 { 191 traverseNode(cam, node); 192 } 193 else 194 { 195 mNumQueryCulledNodes ++; 196 } 197 // node visible 198 if(visiblePixels > mVisibilityThreshold) 199 { 200 traverseNode(cam, node); 197 201 } 198 202 else 199 203 { 200 mNum FrustumCulledNodes ++;204 mNumQueryCulledNodes ++; 201 205 } 202 206 } 203 207 } 204 208 //----------------------------------------------------------------------- 205 HardwareOcclusionQuery *OcclusionCullingSceneTraverser::issueOcclusionQuery( SceneNode *node, bool wasVisible ) 209 HardwareOcclusionQuery *OcclusionCullingSceneTraverser::issueOcclusionQuery( 210 AxisAlignedBox *box, bool wasVisible ) 206 211 { 207 212 // change state so the bounding box gets not actually rendered on the screen 213 // TODO: in rendervisibleobjects, the rendermode is changed by ogre itself => change this!! 208 214 setRenderingMode(MODE_QUERY); 209 215 //setRenderingMode(MODE_RENDER); 210 216 217 char msg2[100]; 218 sprintf(msg2,"this is query %d of overall %d\n", mCurrentTestIdx, mNumQueries); 219 OutputDebugString(msg2); 220 211 221 // get next available test id 212 222 HardwareOcclusionQuery *query = mOcclusionQueries[mCurrentTestIdx++]; 213 223 224 //-- the actual query test 214 225 query->beginOcclusionQuery(); 215 226 216 renderBoundingBox( node);227 renderBoundingBox(box); 217 228 218 229 query->endOcclusionQuery(); … … 258 269 void OcclusionCullingSceneTraverser::renderSceneNode( Camera *cam, SceneNode *node ) 259 270 { 271 //TODO: does not do any changes 260 272 setRenderingMode(MODE_RENDER); 261 273 … … 268 280 deleteQueries(); 269 281 270 for(unsigned int i=0; i < mNum SceneNodes; i++)282 for(unsigned int i=0; i < mNumQueries; i++) 271 283 { 272 284 mOcclusionQueries.push_back(mRenderSystem->createHardwareOcclusionQuery()); … … 321 333 } 322 334 //----------------------------------------------------------------------- 323 void OcclusionCullingSceneTraverser::renderBoundingBox( SceneNode *node)335 void OcclusionCullingSceneTraverser::renderBoundingBox( AxisAlignedBox *box ) 324 336 { 325 337 // Render two halfes of the bounding box (using triangle fans) … … 327 339 { 328 340 //static Matrix4 xform[256]; 329 330 SolidHalfBoundingBox * box = getSolidHalfBoundingBox(half);331 box->setupBoundingBox(node->_getWorldAABB());341 //TODO: this should be full boudning box 342 SolidHalfBoundingBox *halfbox = getSolidHalfBoundingBox(half); 343 halfbox->setupBoundingBox(*box); 332 344 333 345 mRenderSystem->_setWorldMatrix(Matrix4::IDENTITY); … … 335 347 static RenderOperation ro; 336 348 337 mSceneManager->useRenderableViewProjMode( box);338 box->getRenderOperation(ro);339 ro.srcRenderable = box;349 mSceneManager->useRenderableViewProjMode(halfbox); 350 halfbox->getRenderOperation(ro); 351 ro.srcRenderable = halfbox; 340 352 mRenderSystem->_render(ro); 341 353 … … 421 433 mNumSceneNodes = num; 422 434 } 435 //----------------------------------------------------------------------- 436 void OcclusionCullingSceneTraverser::setNumQueries(int num) 437 { 438 mNumQueries = num; 439 } 423 440 } -
trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingTerrainSceneManager.cpp
r40 r41 8 8 #include "OgreSolidHalfBoundingBox.h" 9 9 10 //#include <windows.h>10 #include <windows.h> 11 11 12 12 namespace Ogre { … … 14 14 OcclusionCullingTerrainSceneManager::OcclusionCullingTerrainSceneManager() 15 15 { 16 //mOcclusionCullingTerrainSceneTraverser = 17 // new OcclusionCullingTerrainSceneTraverser(this, mDestRenderSystem); 16 mOcclusionCullingTerrainSceneTraverser = 17 new OcclusionCullingTerrainSceneTraverser(this, mDestRenderSystem); 18 //new OcclusionCullingSceneTraverser(this, mDestRenderSystem); 18 19 19 mOcclusionCullingTerrainSceneTraverser = 20 new OcclusionCullingSceneTraverser(this, mDestRenderSystem); 21 22 mDisplayNodes = true; 20 //mDisplayNodes = true; 23 21 //mShowBoundingBoxes = true; 24 22 mShowBoxes = true; 23 mMaxDepth = 20; 25 24 } 26 25 //----------------------------------------------------------------------- … … 46 45 setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE); 47 46 48 //mOcclusionCullingTerrainSceneTraverser->renderScene(mCameraInProgress, mOctree);47 mOcclusionCullingTerrainSceneTraverser->renderScene(mCameraInProgress, mOctree); 49 48 //mOcclusionCullingTerrainSceneTraverser->renderScene(mCameraInProgress, mTerrainRoot); 50 mOcclusionCullingTerrainSceneTraverser->renderScene(mCullCamera, mSceneRoot);49 //mOcclusionCullingTerrainSceneTraverser->renderScene(mCameraInProgress, mSceneRoot); 51 50 _deleteRenderedQueueGroups(); 52 51 … … 67 66 { 68 67 mOcclusionCullingTerrainSceneTraverser->setNumSceneNodes(mSceneNodes.size()); 68 //HACK 69 mOcclusionCullingTerrainSceneTraverser->setNumQueries(countOctreeSize(mOctree)); 69 70 mOcclusionCullingTerrainSceneTraverser->setRenderSystem(mDestRenderSystem); 70 71 … … 98 99 //Add stuff to be rendered; 99 100 NodeList::iterator it = octant->mNodes.begin(); 100 101 if ( mShowBoxes ) 102 { 103 mBoxes.push_back( octant->getWireBoundingBox() ); 104 } 105 101 106 102 while ( it != octant->mNodes.end() ) 107 103 { … … 118 114 119 115 if ( mDisplayNodes ) 120 {121 116 getRenderQueue()->addRenderable( sn ); 122 117 123 // check if the scene manager or this node wants the bounding box shown. 124 if (sn->getShowBoundingBox() || mShowBoundingBoxes) 125 sn->_addBoundingBoxToQueue(getRenderQueue()); 126 } 118 // check if the scene manager or this node wants the bounding box shown. 119 if (sn->getShowBoundingBox() || mShowBoundingBoxes) 120 sn->_addBoundingBoxToQueue(getRenderQueue()); 121 122 if ( mShowBoxes ) 123 getRenderQueue()->addRenderable(octant->getWireBoundingBox()); 127 124 } 128 125 ++it; … … 134 131 _deleteRenderedQueueGroups(); 135 132 } 133 //----------------------------------------------------------------------- 134 unsigned int OcclusionCullingTerrainSceneManager::countOctreeSize(Octree *root) 135 { 136 unsigned int result = 1; 137 138 for(int i=0; i<8; i++) 139 { 140 Octree *nextChild = root->mChildren[(i & 4) >> 2][(i & 2) >> 1][i & 1]; 141 142 if(nextChild != 0) 143 result += countOctreeSize(nextChild); 144 } 145 146 return result; 147 } 136 148 } -
trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingTerrainSceneTraverser.cpp
r40 r41 1 1 #include "OgreOcclusionCullingTerrainSceneTraverser.h" 2 2 #include "OgreOcclusionCullingTerrainSceneManager.h" 3 #include "OgreHardwareOcclusionQuery.h" 3 4 4 5 #include <windows.h> … … 11 12 } 12 13 //----------------------------------------------------------------------- 13 void OcclusionCullingTerrainSceneTraverser::traverseOct ree( Camera *cam, Octree *octree)14 void OcclusionCullingTerrainSceneTraverser::traverseOctant(Camera *cam, Octree *octant ) 14 15 { 15 16 mNumTraversedNodes ++; 16 17 17 if(octree->numNodes() > 0) 18 { 19 renderOctree(cam, octree); 20 } 18 //if(octant->numNodes() > 0) 19 renderOctant(cam, octant); 21 20 22 21 for(int i=0; i<8; i++) 23 22 { 24 char msg[100]; 25 sprintf(msg,"current node: %d\n", i); 26 OutputDebugString(msg); 27 28 if(octree->mChildren[i & 4][i & 2][i & 1] != 0) 29 traverseOctree(cam, octree->mChildren[i & 4][i & 2][i & 1]); 23 Octree *nextChild = octant->mChildren[(i & 4) >> 2][(i & 2) >> 1][i & 1]; 24 25 if(nextChild != 0) 26 mDistanceQueue->push(nextChild); 30 27 } 31 28 } … … 43 40 mCurrentTestIdx = 0; 44 41 45 mCurrentAlgorithm = RENDER_CULL_FRUSTUM;42 //mCurrentAlgorithm = RENDER_CULL_FRUSTUM; 46 43 switch(mCurrentAlgorithm) 47 44 { … … 53 50 break; 54 51 case RENDER_COHERENT: 55 renderCoherentWithQueue(cam); 52 //renderCoherentWithQueue(cam); 53 renderStopAndWait(cam); 56 54 break; 57 55 default: … … 68 66 { 69 67 AxisAlignedBox box; 70 FrustumPlane plane;71 68 72 69 while(!mDistanceQueue->empty()) 73 70 { 74 Octree *oct ree= mDistanceQueue->top();71 Octree *octant = mDistanceQueue->top(); 75 72 mDistanceQueue->pop(); 76 73 77 74 // interesting for visualization purpose 78 75 //TODO: octree->setNodeVisible(false); 79 octree->_getCullBounds(&box); 76 octant->_getCullBounds(&box); 77 78 if(static_cast<OctreeCamera *>(cam)->getVisibility(box) == OctreeCamera::NONE) 79 if(!cam->isVisible(box)) 80 { 81 mNumFrustumCulledNodes ++; 82 continue; 83 } 80 84 81 //if(cam->isVisible(box, &plane)) 82 //{ 83 // update node's visited flag 84 //TODO: octree->setLastVisited(mFrameId); 85 //TODO: octree->setNodeVisible(true); 86 traverseOctree(cam, octree); 87 /*} 88 else 89 { 90 mNumFrustumCulledNodes ++; 91 }*/ 85 // update node's visited flag 86 //TODO: octree->setLastVisited(mFrameId); 87 //TODO: octree->setNodeVisible(true); 88 89 traverseOctant(cam, octant); 92 90 } 93 91 } 94 92 //----------------------------------------------------------------------- 95 93 /** Renders the scene with the hierarchical stop and wait algorithm. */ 96 94 void OcclusionCullingTerrainSceneTraverser::renderStopAndWait( Camera *cam ) 97 95 { 96 AxisAlignedBox box; 97 98 while(!mDistanceQueue->empty()) 99 { 100 Octree *octant = mDistanceQueue->top(); 101 mDistanceQueue->pop(); 102 103 // interesting for visualization purpose 104 //octant->setNodeVisible(false); 105 //octant->setLastVisited(mFrameId); 106 107 //TODO: Isvisible also checked inside scenenode::findvisibleobjects 108 octant->_getCullBounds(&box); 109 110 char msg[100]; 111 Vector3 max = box.getMaximum(); 112 Vector3 min = box.getMinimum(); 113 114 sprintf(msg, "box max: %3.3f, %3.3f, %3.3f, min: %3.3f, %3.3f, %3.3f\n",max.x,max.y,max.z,min.x,min.y,min.z); 115 OutputDebugString(msg); 116 117 if(static_cast<OctreeCamera *>(cam)->getVisibility(box) == OctreeCamera::NONE) 118 //if(!cam->isVisible(box)) 119 { 120 mNumFrustumCulledNodes ++; 121 continue; 122 } 123 124 HardwareOcclusionQuery *query = issueOcclusionQuery(&box, false); 125 126 unsigned int visiblePixels; 127 // wait if result not available 128 query->pullOcclusionQuery(&visiblePixels); 129 //traverseOctant(cam, octant); 130 // node visible 131 if(visiblePixels > mVisibilityThreshold) 132 { 133 traverseOctant(cam, octant); 134 //mNumQueryCulledNodes ++; 135 } 136 else 137 { 138 mNumQueryCulledNodes ++; 139 } 140 } 98 141 } 99 142 //----------------------------------------------------------------------- 100 143 /** Renders the scene with the coherent hierarchical algorithm and the query queye. */ 101 144 void OcclusionCullingTerrainSceneTraverser::renderCoherentWithQueue( Camera *cam ) 102 145 { 103 146 } 104 105 //-----------------------------------------------------------------------106 /* bool OcclusionCullingTerrainSceneTraverser::isLeaf( SceneNode *node )107 {108 return (node->numChildren() == 0);109 }*/110 147 //----------------------------------------------------------------------- 111 148 void OcclusionCullingTerrainSceneTraverser::pullUpVisibility( Octree *node ) … … 113 150 } 114 151 //----------------------------------------------------------------------- 115 void OcclusionCullingTerrainSceneTraverser::renderOct ree( Camera *cam, Octree *octree )152 void OcclusionCullingTerrainSceneTraverser::renderOctant( Camera *cam, Octree *octree ) 116 153 { 117 154 setRenderingMode(MODE_RENDER);
Note: See TracChangeset
for help on using the changeset viewer.