Changeset 26 for trunk/VUT/OcclusionCullingSceneManager/src
- Timestamp:
- 03/22/05 14:51:26 (19 years ago)
- Location:
- trunk/VUT/OcclusionCullingSceneManager/src
- Files:
-
- 1 added
- 1 deleted
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneManager.cpp
r24 r26 6 6 #include "OgreHardwareOcclusionQuery.h" 7 7 //#include "OgreWireBoundingBox.h" 8 #include "OgreSolid BoundingBox.h"8 #include "OgreSolidHalfBoundingBox.h" 9 9 10 10 #include <windows.h> … … 15 15 OcclusionCullingSceneManager::OcclusionCullingSceneManager(): 16 16 mFrameId(1), mDistanceQueue(NULL), mVisibilityThreshold(0), mCurrentTestIdx(0), 17 mQueryMode(MODE_RENDER), mNumSceneNodes(0) 17 mQueryMode(MODE_RENDER), mNumSceneNodes(0), mAlgorithmType(RENDER_COHERENT) 18 18 { 19 mHalfBoundingBox[0] = mHalfBoundingBox[1] = 0; 19 20 } 20 21 //----------------------------------------------------------------------- … … 26 27 OcclusionCullingSceneManager::~OcclusionCullingSceneManager() 27 28 { 29 delete mHalfBoundingBox[0]; 30 delete mHalfBoundingBox[1]; 31 28 32 deleteQueries(); 29 33 //SceneManager::~SceneManager(); … … 37 41 38 42 mCurrentTestIdx = 0; 43 39 44 //renderZPass(); 40 //renderCullFrustum(); 41 //renderCoherentWithQueue(); 42 renderStopAndWait(); 45 46 switch(mAlgorithmType) 47 { 48 case RENDER_CULL_FRUSTUM: 49 renderCullFrustum(); 50 break; 51 case RENDER_STOP_AND_WAIT: 52 renderStopAndWait(); 53 break; 54 case RENDER_COHERENT: 55 renderCoherentWithQueue(); 56 break; 57 default: 58 renderCullFrustum(); 59 break; 60 } 61 43 62 delete mDistanceQueue; 44 63 … … 67 86 { 68 87 while(!queryQueue.empty() && 69 (queryQueue.front()->getOcclusionQuery()->resultAvailable() || mDistanceQueue->empty())) 70 { 71 SceneNode *node = queryQueue.front(); 88 ((queryQueue.front().second)->resultAvailable() || mDistanceQueue->empty())) 89 { 90 SceneNode *node = queryQueue.front().first; 91 HardwareOcclusionQuery *query = queryQueue.front().second; 92 72 93 queryQueue.pop(); 73 94 74 95 // wait until result available 75 96 unsigned int visiblePixels; 76 node->getOcclusionQuery()->pullOcclusionQuery(&visiblePixels);97 query->pullOcclusionQuery(&visiblePixels); 77 98 78 99 if(visiblePixels > mVisibilityThreshold) … … 99 120 100 121 // reset node's visibility classification 101 node->set Visible(false);122 node->setNodeVisible(false); 102 123 103 124 // update node's visited flag … … 107 128 if(leafOrWasInvisible) 108 129 { 109 issueOcclusionQuery(node, wasVisible);110 queryQueue.push( node);130 HardwareOcclusionQuery *query = issueOcclusionQuery(node, wasVisible); 131 queryQueue.push(query_pair(node, query)); 111 132 } 112 133 … … 126 147 mDistanceQueue->pop(); 127 148 128 // interesting for the visualization, so rest and set129 //node->SetVisible(false);149 // interesting for visualization purpose 150 node->setNodeVisible(false); 130 151 131 152 if(mCameraInProgress->isVisible(node->_getWorldAABB())) 132 153 { 133 // update node's visited flag => needed for rendering 134 // so set it also here 135 //node->SetLastVisited(mFrameID); 136 //node->SetVisible(true); 154 // update node's visited flag 155 node->setLastVisited(mFrameId); 156 node->setNodeVisible(true); 137 157 traverseNode(node); 138 158 } … … 148 168 149 169 // interesting for the visualization 150 //node->SetVisible(false);170 node->setNodeVisible(false); 151 171 node->setLastVisited(mFrameId); 152 172 153 173 if(mCameraInProgress->isVisible(node->_getWorldAABB())) 154 174 { 155 issueOcclusionQuery(node, false);175 HardwareOcclusionQuery *query = issueOcclusionQuery(node, false); 156 176 157 177 unsigned int visiblePixels; 158 178 // wait if result not available 159 node->getOcclusionQuery()->pullOcclusionQuery(&visiblePixels);179 query->pullOcclusionQuery(&visiblePixels); 160 180 161 181 //char str[100]; sprintf(str, "number: %d, id: %d", (int)visiblePixels, mCurrentTestIdx); … … 171 191 } 172 192 //----------------------------------------------------------------------- 173 voidOcclusionCullingSceneManager::issueOcclusionQuery(SceneNode *node, bool wasVisible)193 HardwareOcclusionQuery *OcclusionCullingSceneManager::issueOcclusionQuery(SceneNode *node, bool wasVisible) 174 194 { 175 195 // change state so the bounding box gets not actually rendered on the screen … … 178 198 // get next available test id 179 199 HardwareOcclusionQuery *query = mOcclusionQueries[mCurrentTestIdx++]; 180 node->setOcclusionQuery(query); 181 200 182 201 query->beginOcclusionQuery(); 183 202 184 SolidBoundingBox boxHalf[2];185 boxHalf[1].mIsFirstHalf = false;186 187 203 /* 188 204 static RenderOperation ro; … … 193 209 box.getRenderOperation(ro); 194 210 ro.srcRenderable = &box; 195 mDestRenderSystem->_render(ro);*/ 196 for(int i = 0; i < 2; i++) 197 { 198 boxHalf[i].setupBoundingBox(node->_getWorldAABB()); 199 //setPass(boxHalf[i].getTechnique()->getPass(0)); //setRenderingMode(MODE_QUERY); 200 SceneManager::renderSingleObject(&boxHalf[i], boxHalf[i].getTechnique()->getPass(0), false); 201 } 211 mDestRenderSystem->_render(ro); 212 */ 213 214 renderBoundingBox(node); 202 215 203 216 query->endOcclusionQuery(); 217 218 return query; 204 219 } 205 220 … … 212 227 bool enabled = (mode == MODE_RENDER); 213 228 214 // char str[100]; sprintf(str, "number: %d", mode);215 // MessageBox( NULL, str, "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL);216 229 mDestRenderSystem->_setColourBufferWriteEnabled(enabled, 217 230 enabled, enabled, enabled); … … 224 237 void OcclusionCullingSceneManager::traverseNode(SceneNode *node) 225 238 { 226 if(isLeaf(node)) // reached leaf239 if(isLeaf(node)) 227 240 { 228 241 render(node); … … 235 248 { 236 249 SceneNode* sceneChild = static_cast<SceneNode*>(it.getNext()); 237 //mDistanceQueue->addRenderable(sceneChild); 238 mDistanceQueue->push(sceneChild); 250 mDistanceQueue->push(sceneChild); 239 251 } 240 252 } … … 243 255 void OcclusionCullingSceneManager::render(SceneNode *node) 244 256 { 245 setRenderingMode(MODE_RENDER);246 257 //setRenderingMode(MODE_RENDER); 258 //MessageBox( NULL, "harhar", "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL); 247 259 //HACK (too slow) 248 260 node->_findVisibleObjects(mCameraInProgress, getRenderQueue(), false, … … 267 279 mOcclusionQueries.push_back(hw); 268 280 } 269 //char str[100]; sprintf(str, "number: %d", mNumSceneNodes);270 //MessageBox( NULL, str, "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL);271 281 } 272 282 … … 300 310 void OcclusionCullingSceneManager::pullUpVisibility(SceneNode *node) 301 311 { 302 while( node &&!node->isNodeVisible())312 while(!node->isNodeVisible()) 303 313 { 304 314 node->setNodeVisible(true); 305 node = static_cast<SceneNode *>(node->getParent()); 315 316 if(node != mSceneRoot) 317 node = static_cast<SceneNode *>(node->getParent()); 306 318 } 307 319 } … … 314 326 mOcclusionQueries.clear(); 315 327 } 328 //----------------------------------------------------------------------- 329 void OcclusionCullingSceneManager::renderBoundingBox(SceneNode *node) 330 { 331 // Render two halfes of the bounding box (using triangle fans) 332 for(int half=0; half < 2; half ++) 333 { 334 getSolidHalfBoundingBox(half)->setupBoundingBox(node->_getWorldAABB()); 335 SceneManager::renderSingleObject(getSolidHalfBoundingBox(half), 336 getSolidHalfBoundingBox(half)->getTechnique()->getPass(0), false); 337 } 338 } 339 //----------------------------------------------------------------------- 340 SolidHalfBoundingBox *OcclusionCullingSceneManager::getSolidHalfBoundingBox(int half) 341 { 342 if(!mHalfBoundingBox[half]) 343 mHalfBoundingBox[half] = new SolidHalfBoundingBox(half == 1); 344 345 return mHalfBoundingBox[half]; 346 } 347 //----------------------------------------------------------------------- 348 void OcclusionCullingSceneManager::setAlgorithmType(int type) 349 { 350 mAlgorithmType = type; 351 } 352 //----------------------------------------------------------------------- 353 int OcclusionCullingSceneManager::getAlgorithmType() 354 { 355 return mAlgorithmType; 356 } 316 357 }
Note: See TracChangeset
for help on using the changeset viewer.