- Timestamp:
- 04/06/05 18:36:40 (20 years ago)
- Location:
- trunk/VUT/OcclusionCullingSceneManager
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/VUT/OcclusionCullingSceneManager/include/OgreOcclusionCullingTerrainSceneManager.h
r39 r40 10 10 11 11 #include "OgrePrerequisites.h" 12 #include "OgreOcclusionCulling SceneTraverser.h"12 #include "OgreOcclusionCullingTerrainSceneTraverser.h" 13 13 //#include "OgreSolidHalfBoundingBox.h" 14 14 … … 16 16 17 17 namespace Ogre { 18 template <typename T> class octreeless19 {20 public:21 myless(Camera *cam) { mCamera = cam; }22 //bool operator() (HierarchyNode *v1, HierarchyNode *v2) const23 bool operator() (T v1, T v2) const24 {25 v1->getCullBounds(&mAabb);26 return mAabb->getSquaredViewDepth(mCamera) > v2->getSquaredViewDepth(mCamera);27 }28 29 private:30 Camera *mCamera;31 AxisAlignedBox mAabb;32 };33 34 18 /** 35 19 Class which implements a scene mangager which uses occlusion queries for culling occluded objects … … 41 25 ~OcclusionCullingTerrainSceneManager(); 42 26 43 //void _renderVisibleObjects(void); 44 //void _findVisibleObjects(Camera* cam, bool onlyShadowCasters); 45 46 //void _updateSceneGraph(Camera* cam); 27 void _renderVisibleObjects(void); 28 void _findVisibleObjects(Camera* cam, bool onlyShadowCasters); 29 void _updateSceneGraph(Camera* cam); 47 30 48 31 /** Sets the given option for the SceneManager … … 62 45 bool getOptionKeys( StringVector &refKeys ); 63 46 47 /** Renders one octant of an octree, i.e., renders current octant 48 node and does not traverse deeper into the tree. 49 @remark Note that OctreeNode instances are NOT part of the octree 50 hierarchy, instead one octant of an Octree contains many OctreeNode instances. 51 @param octree the octree to be rendered 52 @param cam current camera 53 */ 54 void _renderOctant(Camera* cam, Octree *octree); 55 64 56 protected: 65 OcclusionCullingSceneTraverser *mOcclusionCullingSceneTraverser; 57 //OcclusionCullingTerrainSceneTraverser *mOcclusionCullingTerrainSceneTraverser; 58 OcclusionCullingSceneTraverser *mOcclusionCullingTerrainSceneTraverser; 66 59 }; 67 60 -
trunk/VUT/OcclusionCullingSceneManager/include/OgreOcclusionCullingTerrainSceneTraverser.h
r39 r40 8 8 9 9 namespace Ogre { 10 void Octree::_getCullBounds( AxisAlignedBox *b ) 10 /** 11 This class implements the compare operator for the priority queue 12 especially for octree hierarchies using getCullBounds for bounding 13 box computation. A lower distance has a higher value in the queue. 14 */ 15 template <typename T> class octreeless 16 { 17 public: 18 octreeless(Camera *cam) { mCamera = cam; } 19 20 bool operator() (T v1, T v2) const 21 { 22 AxisAlignedBox box1, box2; 23 v1->_getCullBounds(&box1); 24 v2->_getCullBounds(&box2); 25 26 return getSquaredViewDepth(mCamera, &box1) > getSquaredViewDepth(mCamera, &box2); 27 } 28 29 private: 30 Real getSquaredViewDepth(const Ogre::Camera* cam, const Ogre::AxisAlignedBox* box) const 31 { 32 Vector3 mid = ((box->getMinimum() - box->getMaximum()) * 0.5) + box->getMinimum(); 33 return (cam->getDerivedPosition() - mid).squaredLength(); 34 } 35 36 Camera *mCamera; 37 //AxisAlignedBox mBox1, mBox2; 38 //Ogre::Vector3 min, max, mid, dist; 39 }; 40 11 41 typedef pair<Octree *, HardwareOcclusionQuery *> OctreeQueryPair; 12 typedef priority_queue<Octree *, vector<Octree *>, myless<vector<Octree *>::value_type> > OctreePriorityQueue;42 typedef priority_queue<Octree *, vector<Octree *>, octreeless<vector<Octree *>::value_type> > OctreePriorityQueue; 13 43 //typedef queue<QueryPair> QueryQueue; 14 44 15 class OcclusionCullingTerrainSceneTraverser: OcclusionCullingSceneTraverser45 class OcclusionCullingTerrainSceneTraverser: public OcclusionCullingSceneTraverser 16 46 { 47 public: 48 OcclusionCullingTerrainSceneTraverser(SceneManager *sm, RenderSystem *rsys); 17 49 void renderScene( Camera *cam, Octree *root ); 50 51 protected: 52 /** Renders the scene with view frustum culling only. */ 18 53 void renderCullFrustum( Camera *cam ); 19 void pullUpVisibility( Octree *node ); 20 void traverseNode( Camera *cam, Octree *node ); 54 /** Renders the scene with the hierarchical stop and wait algorithm. */ 55 void renderStopAndWait( Camera *cam ); 56 /** Renders the scene with the coherent hierarchical algorithm and the query queye. */ 57 void renderCoherentWithQueue( Camera *cam ); 58 /** Issue a occlusion query for this node. */ 59 60 void pullUpVisibility( Octree *octree ); 61 void traverseOctree( Camera *cam, Octree *octree ); 62 void renderOctree( Camera *cam, Octree *octree ); 21 63 22 protected:23 64 OctreePriorityQueue *mDistanceQueue; 24 65 }; -
trunk/VUT/OcclusionCullingSceneManager/scripts/Plugin_OcclusionCullingSceneManager.vcproj
r36 r40 145 145 Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"> 146 146 <File 147 RelativePath="..\src\OgreOcclusionCullingDotSceneManager.cpp">148 </File>149 <File150 147 RelativePath="..\src\OgreOcclusionCullingResourceManager.cpp"> 151 148 </File> … … 158 155 <File 159 156 RelativePath="..\src\OgreOcclusionCullingSceneTraverser.cpp"> 160 </File>161 <File162 RelativePath="..\src\OgreOcclusionCullingTerrainSceneManager.cpp">163 </File>164 <File165 RelativePath="..\src\OgreOcclusionCullingTerrainSceneTraverser.cpp">166 157 </File> 167 158 <File … … 173 164 Filter="h;hpp;hxx;hm;inl;inc"> 174 165 <File 175 RelativePath="..\include\OgreOcclusionCullingDotSceneManager.h">176 </File>177 <File178 166 RelativePath="..\include\OgreOcclusionCullingResourceManager.h"> 179 167 </File> … … 183 171 <File 184 172 RelativePath="..\include\OgreOcclusionCullingSceneTraverser.h"> 185 </File>186 <File187 RelativePath="..\include\OgreOcclusionCullingTerrainSceneManager.h">188 </File>189 <File190 RelativePath="..\include\OgreOcclusionCullingTerrainSceneTraverser.h">191 173 </File> 192 174 <File … … 197 179 Name="Resource Files" 198 180 Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"> 181 </Filter> 182 <Filter 183 Name="TerrainSceneManager" 184 Filter=""> 185 <Filter 186 Name="Source Files" 187 Filter=""> 188 <File 189 RelativePath="..\src\OgreOcclusionCullingTerrainSceneManager.cpp"> 190 </File> 191 <File 192 RelativePath="..\src\OgreOcclusionCullingTerrainSceneTraverser.cpp"> 193 </File> 194 </Filter> 195 <Filter 196 Name="Header Files" 197 Filter=""> 198 <File 199 RelativePath="..\include\OgreOcclusionCullingTerrainSceneManager.h"> 200 </File> 201 <File 202 RelativePath="..\include\OgreOcclusionCullingTerrainSceneTraverser.h"> 203 </File> 204 </Filter> 205 </Filter> 206 <Filter 207 Name="DotSceneManager" 208 Filter=""> 209 <Filter 210 Name="Source Files" 211 Filter=""> 212 <File 213 RelativePath="..\src\OgreOcclusionCullingDotSceneManager.cpp"> 214 </File> 215 </Filter> 216 <Filter 217 Name="Header Files" 218 Filter=""> 219 <File 220 RelativePath="..\include\OgreOcclusionCullingDotSceneManager.h"> 221 </File> 222 </Filter> 199 223 </Filter> 200 224 </Files> -
trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneTraverser.cpp
r39 r40 42 42 mCurrentTestIdx = 0; 43 43 44 //mCurrentAlgorithm = RENDER_CULL_FRUSTUM;44 mCurrentAlgorithm = RENDER_CULL_FRUSTUM; 45 45 switch(mCurrentAlgorithm) 46 46 { … … 148 148 { 149 149 // update node's visited flag 150 char msg2[100]; 151 sprintf(msg2,"yes, visible\n"); 152 OutputDebugString(msg2); 153 150 154 node->setLastVisited(mFrameId); 151 155 node->setNodeVisible(true); … … 154 158 else 155 159 { 160 char msg2[100]; 161 sprintf(msg2,"no, invisible\n"); 162 OutputDebugString(msg2); 163 156 164 mNumFrustumCulledNodes ++; 157 165 } … … 252 260 setRenderingMode(MODE_RENDER); 253 261 254 //HACK (too slow)255 262 mSceneManager->_renderSceneNode(cam, node); 256 263 } … … 260 267 //-- initialise occlusion queries. 261 268 deleteQueries(); 262 263 //char str[100];sprintf(str, "num nodes: %d", mNumSceneNodes);264 //MessageBox( NULL, str, "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL);265 269 266 270 for(unsigned int i=0; i < mNumSceneNodes; i++) -
trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingTerrainSceneManager.cpp
r34 r40 14 14 OcclusionCullingTerrainSceneManager::OcclusionCullingTerrainSceneManager() 15 15 { 16 mOcclusionCullingSceneTraverser = new OcclusionCullingSceneTraverser(this, mDestRenderSystem); 16 //mOcclusionCullingTerrainSceneTraverser = 17 // new OcclusionCullingTerrainSceneTraverser(this, mDestRenderSystem); 18 19 mOcclusionCullingTerrainSceneTraverser = 20 new OcclusionCullingSceneTraverser(this, mDestRenderSystem); 21 17 22 mDisplayNodes = true; 18 23 //mShowBoundingBoxes = true; … … 22 27 OcclusionCullingTerrainSceneManager::~OcclusionCullingTerrainSceneManager() 23 28 { 24 delete mOcclusionCulling SceneTraverser;29 delete mOcclusionCullingTerrainSceneTraverser; 25 30 } 26 31 //----------------------------------------------------------------------- 27 /*void OcclusionCullingTerrainSceneManager::_renderVisibleObjects(void)32 void OcclusionCullingTerrainSceneManager::_renderVisibleObjects(void) 28 33 { 29 mOcclusionCullingSceneTraverser->renderScene(mCameraInProgress, mSceneRoot); 34 //-- render background 35 clearSpecialCaseRenderQueues(); 36 addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND); 37 addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY); 38 39 setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE); 40 SceneManager::_renderVisibleObjects( ); 41 _deleteRenderedQueueGroups(); 42 43 //-- render visible objects (i.e., all but overlay) 44 clearSpecialCaseRenderQueues(); 45 addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY); 46 setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE); 47 48 //mOcclusionCullingTerrainSceneTraverser->renderScene(mCameraInProgress, mOctree); 49 //mOcclusionCullingTerrainSceneTraverser->renderScene(mCameraInProgress, mTerrainRoot); 50 mOcclusionCullingTerrainSceneTraverser->renderScene(mCullCamera, mSceneRoot); 51 _deleteRenderedQueueGroups(); 52 53 //-- render overlay 54 clearSpecialCaseRenderQueues(); 55 SceneManager::_renderVisibleObjects( ); 56 57 clearSpecialCaseRenderQueues(); 30 58 } 31 59 //----------------------------------------------------------------------- … … 38 66 void OcclusionCullingTerrainSceneManager::_updateSceneGraph(Camera* cam) 39 67 { 40 mOcclusionCullingSceneTraverser->preprocess(); 68 mOcclusionCullingTerrainSceneTraverser->setNumSceneNodes(mSceneNodes.size()); 69 mOcclusionCullingTerrainSceneTraverser->setRenderSystem(mDestRenderSystem); 41 70 71 mOcclusionCullingTerrainSceneTraverser->preprocess(); 72 42 73 TerrainSceneManager::_updateSceneGraph(cam); 43 } */74 } 44 75 //----------------------------------------------------------------------- 45 76 bool OcclusionCullingTerrainSceneManager::setOption( const String & key, const void * val ) 46 77 { 47 return mOcclusionCulling SceneTraverser->setOption( key, val) || TerrainSceneManager::setOption( key, val );78 return mOcclusionCullingTerrainSceneTraverser->setOption( key, val) || TerrainSceneManager::setOption( key, val ); 48 79 } 49 80 //----------------------------------------------------------------------- 50 81 bool OcclusionCullingTerrainSceneManager::getOption( const String & key, void *val ) 51 82 { 52 return mOcclusionCulling SceneTraverser->getOption( key, val) || TerrainSceneManager::getOption( key, val ) ;83 return mOcclusionCullingTerrainSceneTraverser->getOption( key, val) || TerrainSceneManager::getOption( key, val ) ; 53 84 } 54 85 //----------------------------------------------------------------------- … … 60 91 bool OcclusionCullingTerrainSceneManager::getOptionKeys( StringVector & refKeys ) 61 92 { 62 return mOcclusionCullingSceneTraverser->getOptionKeys ( refKeys ) || TerrainSceneManager::getOptionKeys( refKeys ); 93 return mOcclusionCullingTerrainSceneTraverser->getOptionKeys ( refKeys ) || TerrainSceneManager::getOptionKeys( refKeys ); 94 } 95 //----------------------------------------------------------------------- 96 void OcclusionCullingTerrainSceneManager::_renderOctant(Camera *cam, Octree *octant) 97 { 98 //Add stuff to be rendered; 99 NodeList::iterator it = octant->mNodes.begin(); 100 101 if ( mShowBoxes ) 102 { 103 mBoxes.push_back( octant->getWireBoundingBox() ); 104 } 105 106 while ( it != octant->mNodes.end() ) 107 { 108 OctreeNode *sn = *it; 109 110 mNumObjects++; 111 112 // check bounding box visibility of scene nodes 113 if( cam->isVisible( sn->_getWorldAABB() ) ) 114 { 115 sn->_addToRenderQueue(cam, getRenderQueue(), false ); 116 //node->_findVisibleObjects(cam, getRenderQueue(), false, mDisplayNodes, false); 117 mVisible.push_back( sn ); 118 119 if ( mDisplayNodes ) 120 { 121 getRenderQueue()->addRenderable( sn ); 122 123 // check if the scene manager or this node wants the bounding box shown. 124 if (sn->getShowBoundingBox() || mShowBoundingBoxes) 125 sn->_addBoundingBoxToQueue(getRenderQueue()); 126 } 127 } 128 ++it; 129 } 130 131 SceneManager::_renderVisibleObjects(); 132 133 // delete all rendered objects from renderqueue 134 _deleteRenderedQueueGroups(); 63 135 } 64 136 } -
trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingTerrainSceneTraverser.cpp
r39 r40 1 1 #include "OgreOcclusionCullingTerrainSceneTraverser.h" 2 //#include <windows.h> 2 #include "OgreOcclusionCullingTerrainSceneManager.h" 3 4 #include <windows.h> 3 5 4 6 namespace Ogre { 5 7 //----------------------------------------------------------------------- 6 void OcclusionCullingTerrainSceneTraverser::traverseNode( Camera *cam, Octree *node ) 8 OcclusionCullingTerrainSceneTraverser::OcclusionCullingTerrainSceneTraverser(SceneManager *sm, RenderSystem *rsys): 9 OcclusionCullingSceneTraverser(sm, rsys) 10 { 11 } 12 //----------------------------------------------------------------------- 13 void OcclusionCullingTerrainSceneTraverser::traverseOctree( Camera *cam, Octree *octree ) 7 14 { 8 15 mNumTraversedNodes ++; 9 16 10 /* if(node->numAttachedObjects() > 0)17 if(octree->numNodes() > 0) 11 18 { 12 render SceneNode(cam, node);13 } */19 renderOctree(cam, octree); 20 } 14 21 15 22 for(int i=0; i<8; i++) 16 23 { 17 if(node->mChildren[i & 4][i & 2][i & 1] != 0) 18 traverseNode(cam, node->mChildren[i & 4][i & 2][i & 1]); 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]); 19 30 } 20 31 } 21 32 //----------------------------------------------------------------------- 22 33 void OcclusionCullingTerrainSceneTraverser::renderScene( Camera *cam, Octree *root ) 34 //TODO: Renderscene independent from hierarchynode => implement only once 23 35 { 24 36 mNumTraversedNodes = 0; … … 27 39 mNumRenderedGeometry = 0; 28 40 29 mDistanceQueue = new OctreePriorityQueue( myless<Octree *>(cam));30 //mDistanceQueue->push(root);41 mDistanceQueue = new OctreePriorityQueue(octreeless<Octree *>(cam)); 42 mDistanceQueue->push(root); 31 43 mCurrentTestIdx = 0; 32 44 33 45 mCurrentAlgorithm = RENDER_CULL_FRUSTUM; 34 46 switch(mCurrentAlgorithm) … … 37 49 renderCullFrustum(cam); 38 50 break; 39 /*case RENDER_STOP_AND_WAIT:51 case RENDER_STOP_AND_WAIT: 40 52 renderStopAndWait(cam); 41 53 break; 42 54 case RENDER_COHERENT: 43 55 renderCoherentWithQueue(cam); 44 break; */56 break; 45 57 default: 46 58 renderCullFrustum(cam); … … 48 60 } 49 61 50 //delete mDistanceQueue;62 delete mDistanceQueue; 51 63 52 64 mFrameId ++; … … 55 67 void OcclusionCullingTerrainSceneTraverser::renderCullFrustum(Camera *cam) 56 68 { 57 /*while(!mDistanceQueue->empty()) 69 AxisAlignedBox box; 70 FrustumPlane plane; 71 72 while(!mDistanceQueue->empty()) 58 73 { 59 SceneNode *node = mDistanceQueue->top();74 Octree *octree = mDistanceQueue->top(); 60 75 mDistanceQueue->pop(); 61 76 62 77 // interesting for visualization purpose 63 node->setNodeVisible(false); 64 65 if(cam->isVisible(node->_getWorldAABB())) 66 { 78 //TODO: octree->setNodeVisible(false); 79 octree->_getCullBounds(&box); 80 81 //if(cam->isVisible(box, &plane)) 82 //{ 67 83 // update node's visited flag 68 node->setLastVisited(mFrameId);69 node->setNodeVisible(true);70 traverse Node(cam, node);71 }84 //TODO: octree->setLastVisited(mFrameId); 85 //TODO: octree->setNodeVisible(true); 86 traverseOctree(cam, octree); 87 /*} 72 88 else 73 89 { 74 90 mNumFrustumCulledNodes ++; 75 } 76 } */91 }*/ 92 } 77 93 } 94 95 /** Renders the scene with the hierarchical stop and wait algorithm. */ 96 void OcclusionCullingTerrainSceneTraverser::renderStopAndWait( Camera *cam ) 97 { 98 } 99 100 /** Renders the scene with the coherent hierarchical algorithm and the query queye. */ 101 void OcclusionCullingTerrainSceneTraverser::renderCoherentWithQueue( Camera *cam ) 102 { 103 } 104 78 105 //----------------------------------------------------------------------- 79 106 /* bool OcclusionCullingTerrainSceneTraverser::isLeaf( SceneNode *node ) … … 85 112 { 86 113 } 114 //----------------------------------------------------------------------- 115 void OcclusionCullingTerrainSceneTraverser::renderOctree( Camera *cam, Octree *octree ) 116 { 117 setRenderingMode(MODE_RENDER); 118 ((OcclusionCullingTerrainSceneManager *)mSceneManager)->_renderOctant(cam, octree); 119 } 87 120 }
Note: See TracChangeset
for help on using the changeset viewer.