Changeset 41 for trunk/VUT/OcclusionCullingSceneManager/src
- Timestamp:
- 04/07/05 18:51:36 (20 years ago)
- Location:
- trunk/VUT/OcclusionCullingSceneManager/src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
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.