Changeset 30 for trunk/VUT/OcclusionCullingSceneManager/src
- Timestamp:
- 03/24/05 18:00:59 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneManager.cpp
r29 r30 15 15 OcclusionCullingSceneManager::OcclusionCullingSceneManager(): 16 16 mFrameId(1), mDistanceQueue(NULL), mVisibilityThreshold(0), mCurrentTestIdx(0), 17 mQueryMode(MODE_RENDER), mNumSceneNodes(0), mCurrentAlgorithm(RENDER_COHERENT) 17 mQueryMode(MODE_RENDER), mNumSceneNodes(0), mCurrentAlgorithm(RENDER_COHERENT), 18 mNumTraversedNodes(0), mNumQueryCulledNodes(0), mNumFrustumCulledNodes(0), mNumRenderedGeometry(0) 18 19 { 19 20 mHalfBoundingBox[0] = mHalfBoundingBox[1] = 0; … … 36 37 void OcclusionCullingSceneManager::_renderVisibleObjects(void) 37 38 { 39 mNumTraversedNodes = 0; 40 mNumQueryCulledNodes = 0; 41 mNumFrustumCulledNodes = 0; 42 mNumRenderedGeometry = 0; 43 38 44 mDistanceQueue = new PriorityQueue(myless<SceneNode *>(mCameraInProgress)); 39 40 45 mDistanceQueue->push(mSceneRoot); 41 42 46 mCurrentTestIdx = 0; 43 44 47 //renderZPass(); 45 48 … … 62 65 delete mDistanceQueue; 63 66 64 /*mDestRenderSystem->_setDepthBufferParams(true, false, CMPF_LESS);65 SceneManager::_renderVisibleObjects();66 mDestRenderSystem->_setDepthBufferParams();67 mDistanceQueue.push(mSceneRoot);68 Preprocess();69 //ResetQueries();70 */71 72 67 mFrameId ++; 73 68 } … … 102 97 traverseNode(node); 103 98 } 99 else 100 { 101 mNumQueryCulledNodes ++; 102 } 104 103 } 105 104 … … 108 107 { 109 108 SceneNode *node = mDistanceQueue->top(); 110 111 109 mDistanceQueue->pop(); 112 110 … … 134 132 // always traverse a node if it was visible 135 133 if(wasVisible) 134 { 136 135 traverseNode(node); 136 } 137 } 138 else 139 { 140 mNumFrustumCulledNodes ++; 137 141 } 138 142 } … … 157 161 traverseNode(node); 158 162 } 163 else 164 { 165 mNumFrustumCulledNodes ++; 166 } 159 167 } 160 168 } … … 179 187 query->pullOcclusionQuery(&visiblePixels); 180 188 181 //char str[100]; sprintf(str, "number: %d, id: %d", (int)visiblePixels, mCurrentTestIdx);182 //MessageBox( NULL, str, "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL);183 184 189 // node visible 185 190 if(visiblePixels > mVisibilityThreshold) … … 187 192 traverseNode(node); 188 193 } 189 } 194 else 195 { 196 mNumQueryCulledNodes ++; 197 } 198 } 199 else 200 { 201 mNumFrustumCulledNodes ++; 202 } 190 203 } 191 204 } … … 203 216 /* 204 217 static RenderOperation ro; 205 206 // Issue view / projection changes if any207 218 useRenderableViewProjMode(&box); 208 209 219 box.getRenderOperation(ro); 210 220 ro.srcRenderable = &box; … … 237 247 void OcclusionCullingSceneManager::traverseNode(SceneNode *node) 238 248 { 239 if(isLeaf(node)) 249 mNumTraversedNodes ++; 250 251 if(node->numAttachedObjects() > 0) 240 252 { 241 253 render(node); 242 254 } 243 else // internal node: add children to priority queue for further processing 244 {245 255 256 // internal node: add children to priority queue for further processing 257 Node::ChildNodeIterator it = node->getChildIterator(); 246 258 247 while (it.hasMoreElements()) 248 { 249 SceneNode* sceneChild = static_cast<SceneNode*>(it.getNext()); 250 mDistanceQueue->push(sceneChild); 251 } 252 } 259 while (it.hasMoreElements()) 260 { 261 SceneNode* sceneChild = static_cast<SceneNode*>(it.getNext()); 262 mDistanceQueue->push(sceneChild); 263 } 253 264 } 254 265 //----------------------------------------------------------------------- 255 266 void OcclusionCullingSceneManager::render(SceneNode *node) 256 267 { 257 //setRenderingMode(MODE_RENDER);258 //MessageBox( NULL, "harhar", "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL);268 setRenderingMode(MODE_RENDER); 269 259 270 //HACK (too slow) 260 271 node->_findVisibleObjects(mCameraInProgress, getRenderQueue(), false, … … 266 277 void OcclusionCullingSceneManager::_updateSceneGraph(Camera* cam) 267 278 { 268 int numnodes = countSceneNodes(mSceneRoot);269 279 unsigned int numnodes = countSceneNodes(mSceneRoot); 280 270 281 //-- initialise occlusion queries. 271 282 if(numnodes != mNumSceneNodes) 272 283 { 273 284 deleteQueries(); 285 274 286 mNumSceneNodes = numnodes; 275 287 276 288 for(unsigned int i=0; i < mNumSceneNodes; i++) 277 289 { 278 HardwareOcclusionQuery *hw = mDestRenderSystem->createHardwareOcclusionQuery(); 279 mOcclusionQueries.push_back(hw); 280 } 290 mOcclusionQueries.push_back(mDestRenderSystem->createHardwareOcclusionQuery()); 291 } 281 292 } 282 293 … … 284 295 } 285 296 //----------------------------------------------------------------------- 286 int OcclusionCullingSceneManager::countSceneNodes(SceneNode *node) 287 { 288 int num = 1; 289 if(isLeaf(node)) 290 { 291 return num; 292 } 293 297 unsigned int OcclusionCullingSceneManager::countSceneNodes(SceneNode *node) 298 { 299 unsigned int result = 1; 300 294 301 Node::ChildNodeIterator it = node->getChildIterator(); 295 302 … … 297 304 { 298 305 SceneNode* sceneChild = static_cast<SceneNode*>(it.getNext()); 299 num+= countSceneNodes(sceneChild);306 result += countSceneNodes(sceneChild); 300 307 } 301 308 302 return num;303 } 304 //----------------------------------------------------------------------- 305 intOcclusionCullingSceneManager::isLeaf(SceneNode *node)309 return result; 310 } 311 //----------------------------------------------------------------------- 312 bool OcclusionCullingSceneManager::isLeaf(SceneNode *node) 306 313 { 307 314 return (node->numChildren() == 0); … … 353 360 return true; 354 361 } 355 362 if ( key == "Threshold" ) 363 { 364 mCurrentAlgorithm = * static_cast < const int * > ( val ); 365 return true; 366 } 367 356 368 return SceneManager::setOption( key, val ); 357 369 } … … 362 374 { 363 375 * static_cast < int * > ( val ) = mCurrentAlgorithm; 376 return true; 377 } 378 if ( key == "Threshold" ) 379 { 380 * static_cast < int * > ( val ) = mVisibilityThreshold; 381 return true; 382 } 383 if ( key == "NumSceneNodes" ) 384 { 385 * static_cast < unsigned int * > ( val ) = mNumSceneNodes; 386 return true; 387 } 388 if ( key == "NumTraversedNodes" ) 389 { 390 * static_cast < unsigned int * > ( val ) = mNumTraversedNodes; 391 return true; 392 } 393 if ( key == "NumQueryCulledNodes" ) 394 { 395 * static_cast < unsigned int * > ( val ) = mNumQueryCulledNodes; 396 return true; 397 } 398 if ( key == "NumFrustumCulledNodes" ) 399 { 400 * static_cast < unsigned int * > ( val ) = mNumFrustumCulledNodes; 364 401 return true; 365 402 } … … 377 414 SceneManager::getOptionKeys( refKeys ); 378 415 refKeys.push_back( "Algorithm" ); 379 416 refKeys.push_back( "Threshold" ); 417 refKeys.push_back( "NumSceneNodes" ); 418 refKeys.push_back( "NumTraversedNodes" ); 419 refKeys.push_back( "NumQueryCulledNodes" ); 420 refKeys.push_back( "NumFrustumCulledNodes" ); 421 //refKeys.push_back( "mNumRenderedGeometry" ); 380 422 return true; 381 423 }
Note: See TracChangeset
for help on using the changeset viewer.