Changeset 174 for trunk/VUT/Ogre/src/OgreOcclusionQueriesQueryManager.cpp
- Timestamp:
- 07/14/05 09:06:16 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/VUT/Ogre/src/OgreOcclusionQueriesQueryManager.cpp
r173 r174 47 47 PlatformHierarchyInterface *hierarchyInterface, 48 48 Viewport *vp, 49 bool renderPatches,50 bool useItemBufferForGeometry):51 PlatformQueryManager(hierarchyInterface, vp, renderPatches),52 m UseItemBuffer(useItemBufferForGeometry)49 int queryModes, 50 int itemBufferMode): 51 PlatformQueryManager(hierarchyInterface, vp, queryModes), 52 mItemBufferMode(itemBufferMode) 53 53 { 54 54 } … … 60 60 bool relativeVisibility) 61 61 { 62 62 // we need access to the scene manager and the rendersystem 63 63 PlatformHierarchyInterface *pfHierarchyInterface = 64 64 dynamic_cast<PlatformHierarchyInterface *>(mHierarchyInterface); … … 68 68 69 69 //-- render scene with item buffer (i.e., objects with their id as color codes) 70 if (mUseItemBuffer) 71 { 70 if ((mItemBufferMode && mQueryModes) != 0) 71 { 72 int savedQueryModes = mQueryModes; 73 mQueryModes = mItemBufferMode; 74 72 75 PlatformQueryManager::ComputeCameraVisibility(camera, visibleNodes, 73 76 visibleGeometry, visiblePatches, relativeVisibility); 74 77 78 // overlays cause false visibility 75 79 mViewport->setOverlaysEnabled(false); 80 mQueryModes = savedQueryModes; 76 81 } 77 82 else … … 93 98 GtpVisibility::QueryList queryList[2]; 94 99 95 // rendered hierarchy nodes from previous render 96 GtpVisibility::HierarchyNodeList *nodeList = mHierarchyInterface->GetRenderedNodes(); 97 GtpVisibility::HierarchyNodeList::iterator nodeIt, nodeIt_end = nodeList->end(); 100 // rendered visibile hierarchy nodes from previous rendering 101 GtpVisibility::HierarchyNodeList *visNodes = mHierarchyInterface->GetVisibleNodes(); 102 GtpVisibility::HierarchyNodeList::iterator visNodesIt, visNodesIt_end = visNodes->end(); 103 104 GtpVisibility::HierarchyNodeList nodeList; 105 106 if (mQueryModes && NODE_VISIBILITY) 107 { 108 for (visNodesIt = visNodes->begin(); visNodesIt != visNodesIt_end; ++visNodesIt) 109 { 110 nodeList.push_back((*visNodesIt)); 111 } 112 } 113 114 GtpVisibility::HierarchyNodeList::iterator nodeIt, nodeIt_end = nodeList.end(); 98 115 99 116 // vector for storing entities of meshes 100 117 GtpVisibility::GeometryList geometryList; 101 118 102 // store geometry of the hierarchy node in a geometry list (only once!) 103 for (nodeIt = nodeList->begin(); nodeIt != nodeIt_end; ++nodeIt) 104 { 105 mHierarchyInterface->GetNodeGeometryList(*nodeIt, &geometryList, false); 106 } 107 119 // store geometry of the hierarchy nodes in a geometry list 120 if (mQueryModes && GEOMETRY_VISIBILITY) 121 { 122 for (visNodesIt = visNodes->begin(); visNodesIt != visNodesIt_end; ++visNodesIt) 123 { 124 mHierarchyInterface->GetNodeGeometryList(*visNodesIt, &geometryList, false); 125 } 126 } 127 108 128 // geometry list iterator 109 129 GtpVisibility::GeometryList::iterator geometryIt, geometryIt_end = geometryList.end(); … … 111 131 // vector for storing subentities of meshes 112 132 GtpVisibility::PatchList patchList; 133 134 // store patchges of the geometries in a patch list 135 if (mQueryModes && PATCH_VISIBILITY) 136 { 137 for (visNodesIt = visNodes->begin(); visNodesIt != visNodesIt_end; ++visNodesIt) 138 { 139 GetNodePatchList(*visNodesIt, &patchList); 140 } 141 } 142 113 143 GtpVisibility::PatchList::iterator patchIt, patchIt_end = patchList.end(); 114 144 … … 133 163 { 134 164 //-- queries for hierarchy nodes 135 for (nodeIt = nodeList ->begin(); nodeIt != nodeIt_end; ++nodeIt)165 for (nodeIt = nodeList.begin(); nodeIt != nodeIt_end; ++nodeIt) 136 166 { 137 167 // TODO: DELETE QUERIES FROM PREVIOUS RENDER … … 140 170 141 171 //-- queries for geometry: if item buffer, capture only projected visibility 142 for (geometryIt = geometryList.begin(); geometryIt != geometryIt_end; ++geometryIt) 143 { 144 queryList[i].push_back(mHierarchyInterface->IssueOcclusionQuery(*geometryIt)); 172 if ((mItemBufferMode != GEOMETRY_VISIBILITY) || (i == 1)) 173 { 174 for (geometryIt = geometryList.begin(); geometryIt != geometryIt_end; ++geometryIt) 175 { 176 queryList[i].push_back(mHierarchyInterface->IssueOcclusionQuery(*geometryIt)); 177 } 145 178 } 146 179 147 180 //-- queries for patches: if item buffer, capture only projected visibility 148 if ( !(mUseItemBuffer && (i == 0)))181 if ((mItemBufferMode != PATCH_VISIBILITY) || (i == 1)) 149 182 { 150 183 for (patchIt = patchList.begin(); patchIt != patchIt_end; ++patchIt) … … 162 195 GtpVisibility::QueryList::iterator projQueryIt = queryList[1].begin(); 163 196 164 CollectNodeVisibility(visQueryIt, projQueryIt, nodeList, visibleNodes, relativeVisibility); 165 166 if (mUseItemBuffer) 167 { 168 if (relativeVisibility) 169 { 170 CollectRelativePatchVisibilityForItemBuffer(projQueryIt, &patchList, visiblePatches); 171 } 172 } 197 // collect occlusion queries for hierarchy nodes 198 CollectNodeVisibility(visQueryIt, projQueryIt, &nodeList, visibleNodes, relativeVisibility); 199 200 201 202 // collect occlusion queries for geometry 203 if ((mItemBufferMode == GEOMETRY_VISIBILITY) && relativeVisibility) 204 { 205 // if visibility was established using the item buffer, 206 // the array is organized different (e.g., ordered by id, all possible objects) 207 CollectRelativeGeometryVisibilityForItemBuffer(projQueryIt, &geometryList, visibleGeometry); 208 } 209 else 210 { 211 CollectGeometryVisibility(visQueryIt, projQueryIt, &geometryList, visibleGeometry, 212 relativeVisibility); 213 } 214 215 216 // collect occlusion queries for patches 217 if ((mItemBufferMode == PATCH_VISIBILITY) && relativeVisibility) 218 { 219 CollectRelativePatchVisibilityForItemBuffer(projQueryIt, &patchList, visiblePatches); 220 } 173 221 else 174 222 { 175 223 CollectPatchVisibility(visQueryIt, projQueryIt, &patchList, visiblePatches, relativeVisibility); 176 224 } 177 178 CollectGeometryVisibility(visQueryIt, projQueryIt, &geometryList, visibleGeometry, relativeVisibility); 225 179 226 180 227 //-- reset options … … 201 248 RemoveDuplicateNodes(visibleNodes); 202 249 203 if ( !mUseItemBuffer)250 if (mItemBufferMode != GEOMETRY_VISIBILITY) 204 251 { 205 252 RemoveDuplicateGeometry(visibleGeometry); 253 } 254 255 if (mItemBufferMode != PATCH_VISIBILITY) 256 { 257 RemoveDuplicatePatches(visiblePatches); 206 258 } 207 259 } … … 442 494 patchinfo_eq), visiblePatches->end()); 443 495 } 496 //----------------------------------------------------------------------- 497 void OcclusionQueriesQueryManager::GetNodePatchList(GtpVisibility::HierarchyNode *node, 498 GtpVisibility::PatchList *patchList) 499 { 500 GtpVisibility::GeometryList geomList; 501 mHierarchyInterface->GetNodeGeometryList(node, &geomList, false); 502 503 // geometry list iterator 504 GtpVisibility::GeometryList::iterator geomIt, geomIt_end = geomList.end(); 505 506 for (geomIt = geomList.begin(); geomIt != geomIt_end; ++geomIt) 507 { 508 for (int i = 0; i < (int)(*geomIt)->getNumSubEntities(); ++i) 509 { 510 patchList->push_back((*geomIt)->getSubEntity(i)); 511 } 512 } 513 } 514 444 515 } // namespace Ogre
Note: See TracChangeset
for help on using the changeset viewer.