- Timestamp:
- 02/27/07 10:25:01 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgreOcclusionQueriesQueryManager.cpp
r2168 r2171 5 5 #include <OgreSubEntity.h> 6 6 #include "OgrePlatformHierarchyInterface.h" 7 #include "OgreOcclusionCullingSceneManager.h" 8 #include "VisibilityEnvironment.h" 9 10 7 11 8 12 namespace Ogre { … … 19 23 } 20 24 //----------------------------------------------------------------------- 21 void OcclusionQueriesQueryManager::ComputeCameraVisibility(const Camera &camera, 22 GtpVisibility::NodeInfoContainer *visibleNodes, 23 GtpVisibility::MeshInfoContainer *visibleGeometry, 24 GtpVisibility::PatchInfoContainer *visiblePatches, 25 bool relativeVisibility) 25 void OcclusionQueriesQueryManager::ComputeCameraVisibility( 26 const Camera &camera, 27 GtpVisibility::NodeInfoContainer *visibleNodes, 28 GtpVisibility::MeshInfoContainer *visibleGeometry, 29 GtpVisibility::PatchInfoContainer *visiblePatches, 30 bool relativeVisibility) 26 31 { 27 32 // we need access to the scene manager and the rendersystem 28 33 PlatformHierarchyInterface *pfHierarchyInterface = 29 //static_cast<PlatformHierarchyInterface *>(mHierarchyInterface);30 34 static_cast<PlatformHierarchyInterface *>(mHierarchyInterface); 31 35 32 36 // disable overlays, reset them later 33 37 bool overlayEnabled = mViewport->getOverlaysEnabled(); 34 Ogre::LogManager::getSingleton().logMessage("here020202"); 38 35 39 /////////// 36 40 //-- render scene with item buffer (i.e., objects with their id as color codes) 37 //mItemBufferMode = 0; 38 if ((mItemBufferMode && mQueryModes) != 0) 41 42 //mItemBufferMode = 0; 43 if (0 && 44 (mItemBufferMode && mQueryModes) != 0) 39 45 { 40 46 int savedQueryModes = mQueryModes; 41 47 mQueryModes = mItemBufferMode; 42 48 43 PlatformQueryManager::ComputeCameraVisibility(camera, visibleNodes, 44 visibleGeometry, visiblePatches, relativeVisibility); 49 PlatformQueryManager::ComputeCameraVisibility(camera, 50 visibleNodes, 51 visibleGeometry, 52 visiblePatches, 53 relativeVisibility); 45 54 46 55 // overlays cause false visibility … … 54 63 mViewport->setOverlaysEnabled(false); 55 64 65 //////////////////////// 56 66 //-- Render scene to get conservative visibility and fill depth buffer 57 pfHierarchyInterface->GetSceneManager()->_renderScene(pCam, mViewport, false); 58 } 59 60 61 /* Two query lists for projected pixels and for visibile pixels: 67 68 OcclusionCullingSceneManager *occlusionSceneMgr = 69 static_cast<OcclusionCullingSceneManager *>(pfHierarchyInterface->GetSceneManager()); 70 71 // no visibility manager available => no visibility scene manager, return 72 GtpVisibility::VisibilityManager *visManager = NULL; 73 74 if (!occlusionSceneMgr->getOption("VisibilityManager", &visManager)) 75 { 76 Ogre::LogManager::getSingleton().logMessage("no vismanager found"); 77 return; 78 } 79 80 // use stop and wait culling for from view point queries because probably 81 // no temporal coherence 82 GtpVisibility::VisibilityEnvironment::CullingManagerType occlusionType = 83 visManager->GetCullingManagerType(); 84 85 visManager->SetCullingManager(GtpVisibility::VisibilityEnvironment::STOP_AND_WAIT_CULLING); 86 87 if (1) 88 occlusionSceneMgr->RenderDepthForQuery(pCam, mViewport); 89 else 90 pfHierarchyInterface->GetSceneManager()->_renderScene(pCam, mViewport, false); 91 92 visManager->SetCullingManager(occlusionType); 93 } 94 95 96 /* Two query lists for projected pixels and for visibile pixels: 62 97 We test queries after a rendering pass 63 98 to get exact visibility with regard to the current camera. … … 88 123 if (mQueryModes & GEOMETRY_VISIBILITY) 89 124 { 90 for (visNodesIt = visNodes->begin(); visNodesIt != visNodesIt_end; ++ visNodesIt)125 for (visNodesIt = visNodes->begin(); visNodesIt != visNodesIt_end; ++ visNodesIt) 91 126 { 92 127 mHierarchyInterface->GetNodeGeometryList(*visNodesIt, &geometryList, false); … … 128 163 int n = relativeVisibility ? 2 : 1; 129 164 if (mItemBufferMode > 0) 130 LogManager::getSingleton().logMessage(" item buffer");131 132 for (int i = 0; i < n; ++ i)165 LogManager::getSingleton().logMessage("using item buffer"); 166 167 for (int i = 0; i < n; ++ i) 133 168 { 134 169 //-- queries for hierarchy nodes … … 139 174 } 140 175 176 //////////////////////////// 141 177 //-- queries for geometry: if item buffer, capture only projected visibility 178 142 179 if ((mItemBufferMode != GEOMETRY_VISIBILITY) || (i == 1)) 143 180 { 144 for (geometryIt = geometryList.begin(); geometryIt != geometryIt_end; ++ geometryIt)181 for (geometryIt = geometryList.begin(); geometryIt != geometryIt_end; ++ geometryIt) 145 182 { 146 183 queryList[i].push_back(pfHierarchyInterface->IssueMeshOcclusionQuery(*geometryIt)); … … 148 185 } 149 186 187 //////////////////////// 150 188 //-- queries for patches: if item buffer, capture only projected visibility 189 151 190 if ((mItemBufferMode != PATCH_VISIBILITY) || (i == 1)) 152 191 { … … 160 199 } 161 200 162 201 /////////////// 163 202 //-- collect results 203 164 204 GtpVisibility::QueryList::iterator visQueryIt = queryList[0].begin(); 165 205 GtpVisibility::QueryList::iterator projQueryIt = queryList[1].begin(); 166 206 167 207 // collect occlusion queries for hierarchy nodes 168 CollectNodeVisibility(visQueryIt, projQueryIt, &nodeList, visibleNodes, relativeVisibility); 208 CollectNodeVisibility(visQueryIt, 209 projQueryIt, 210 &nodeList, 211 visibleNodes, 212 relativeVisibility); 169 213 170 214 … … 174 218 // if visibility was established using the item buffer, 175 219 // the array is organized different (e.g., ordered by id, all possible objects) 176 CollectRelativeGeometryVisibilityForItemBuffer(projQueryIt, &geometryList, visibleGeometry); 220 CollectRelativeGeometryVisibilityForItemBuffer(projQueryIt, 221 &geometryList, 222 visibleGeometry); 177 223 } 178 224 else if (mItemBufferMode != GEOMETRY_VISIBILITY) 179 225 { 180 CollectGeometryVisibility(visQueryIt, projQueryIt, &geometryList, visibleGeometry, 226 CollectGeometryVisibility(visQueryIt, 227 projQueryIt, 228 &geometryList, 229 visibleGeometry, 181 230 relativeVisibility); 182 231 } … … 186 235 if ((mItemBufferMode == PATCH_VISIBILITY) && relativeVisibility) 187 236 { 188 CollectRelativePatchVisibilityForItemBuffer(projQueryIt, &patchList, visiblePatches); 237 CollectRelativePatchVisibilityForItemBuffer(projQueryIt, 238 &patchList, 239 visiblePatches); 189 240 } 190 241 else if (mItemBufferMode != PATCH_VISIBILITY) 191 242 { 192 CollectPatchVisibility(visQueryIt, projQueryIt, &patchList, visiblePatches, relativeVisibility); 243 CollectPatchVisibility(visQueryIt, 244 projQueryIt, 245 &patchList, 246 visiblePatches, 247 relativeVisibility); 193 248 } 194 249 195 196 //-- reset options 250 //////////// 251 //-- reset state 252 197 253 enableDepthWrite = true; 198 254 // this option must be provided by the scene manager … … 204 260 } 205 261 //----------------------------------------------------------------------- 206 void OcclusionQueriesQueryManager::ComputeFromPointVisibility(const Vector3 &point, 207 GtpVisibility::NodeInfoContainer *visibleNodes, 208 GtpVisibility::MeshInfoContainer *visibleGeometry, 209 GtpVisibility::PatchInfoContainer *visiblePatches, 210 bool relativeVisibility) 211 {Ogre::LogManager::getSingleton().logMessage("here5"); 212 PlatformQueryManager::ComputeFromPointVisibility(point, visibleNodes, 213 visibleGeometry, visiblePatches, relativeVisibility); 262 void OcclusionQueriesQueryManager::ComputeFromPointVisibility( 263 const Vector3 &point, 264 GtpVisibility::NodeInfoContainer *visibleNodes, 265 GtpVisibility::MeshInfoContainer *visibleGeometry, 266 GtpVisibility::PatchInfoContainer *visiblePatches, 267 bool relativeVisibility) 268 { 269 PlatformQueryManager::ComputeFromPointVisibility(point, 270 visibleNodes, 271 visibleGeometry, 272 visiblePatches, 273 relativeVisibility); 214 274 215 275 // adds up their visibility and removes duplicates 216 276 // (duplicates occur if an object is on the edge of the viewport) 217 277 RemoveDuplicateNodes(visibleNodes); 218 Ogre::LogManager::getSingleton().logMessage("here6"); 278 219 279 if (mItemBufferMode != GEOMETRY_VISIBILITY) 220 280 { 221 281 RemoveDuplicateGeometry(visibleGeometry); 222 282 } 223 Ogre::LogManager::getSingleton().logMessage("here7"); 283 224 284 if (mItemBufferMode != PATCH_VISIBILITY) 225 285 { … … 228 288 } 229 289 //------------------------------------------------------------------------ 230 void 290 void OcclusionQueriesQueryManager::CollectNodeVisibility( 231 291 GtpVisibility::QueryList::iterator &visQueryIt, 232 292 GtpVisibility::QueryList::iterator &projQueryIt, … … 238 298 239 299 //-- queries for nodes 240 for (nodeIt = nodeList->begin(); nodeIt != nodeList->end(); ++ nodeIt)300 for (nodeIt = nodeList->begin(); nodeIt != nodeList->end(); ++ nodeIt) 241 301 { 242 302 unsigned int visiblePixels = 0; … … 248 308 { 249 309 (*projQueryIt)->GetQueryResult(projectedPixels, true); 250 251 ++projQueryIt; 252 } 253 254 ++visQueryIt; 310 ++ projQueryIt; 311 } 312 313 ++ visQueryIt; 255 314 256 315 // node with visibilty 0 in queue (e.g., if node is intersected by near plane) 257 316 if (visiblePixels > 0) 258 317 { 259 visibleNodes->push_back( GtpVisibility::NodeInfo(*nodeIt, visiblePixels,260 projectedPixels));318 visibleNodes->push_back( 319 GtpVisibility::NodeInfo(*nodeIt, visiblePixels, projectedPixels)); 261 320 } 262 321 } … … 384 443 GtpVisibility::NodeInfoContainer *visibleNodes) 385 444 { 386 s table_sort(visibleNodes->begin(), visibleNodes->end()/*, nodeinfo_lt*/);445 sort(visibleNodes->begin(), visibleNodes->end()); 387 446 388 447 GtpVisibility::NodeInfoContainer::iterator visibleNodesIt, … … 412 471 GtpVisibility::MeshInfoContainer *visibleGeometry) 413 472 { 414 s table_sort(visibleGeometry->begin(), visibleGeometry->end());473 sort(visibleGeometry->begin(), visibleGeometry->end()); 415 474 416 475 GtpVisibility::MeshInfoContainer::iterator visibleGeomIt, … … 440 499 GtpVisibility::PatchInfoContainer *visiblePatches) 441 500 { 442 s table_sort(visiblePatches->begin(), visiblePatches->end());501 sort(visiblePatches->begin(), visiblePatches->end()); 443 502 444 503 GtpVisibility::PatchInfoContainer::iterator visiblePatchIt,
Note: See TracChangeset
for help on using the changeset viewer.