Ignore:
Timestamp:
07/14/05 09:06:16 (19 years ago)
Author:
mattausch
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/Ogre/src/OgreOcclusionQueriesQueryManager.cpp

    r173 r174  
    4747                                                        PlatformHierarchyInterface *hierarchyInterface,  
    4848                                                        Viewport *vp, 
    49                                                         bool renderPatches, 
    50                                                         bool useItemBufferForGeometry): 
    51 PlatformQueryManager(hierarchyInterface, vp, renderPatches), 
    52 mUseItemBuffer(useItemBufferForGeometry) 
     49                                                        int queryModes, 
     50                                                        int itemBufferMode): 
     51PlatformQueryManager(hierarchyInterface, vp, queryModes),  
     52mItemBufferMode(itemBufferMode) 
    5353{ 
    5454} 
     
    6060                            bool relativeVisibility) 
    6161{ 
    62          // we need access to the scene manager and the rendersystem 
     62        // we need access to the scene manager and the rendersystem 
    6363        PlatformHierarchyInterface *pfHierarchyInterface =  
    6464                dynamic_cast<PlatformHierarchyInterface *>(mHierarchyInterface); 
     
    6868 
    6969        //-- 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                 
    7275                PlatformQueryManager::ComputeCameraVisibility(camera, visibleNodes, 
    7376                            visibleGeometry, visiblePatches, relativeVisibility); 
    74  
     77                 
     78                // overlays cause false visibility 
    7579                mViewport->setOverlaysEnabled(false); 
     80                mQueryModes = savedQueryModes; 
    7681        } 
    7782        else 
     
    9398        GtpVisibility::QueryList queryList[2]; 
    9499         
    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(); 
    98115 
    99116        // vector for storing entities of meshes 
    100117        GtpVisibility::GeometryList geometryList; 
    101118         
    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         
    108128        // geometry list iterator 
    109129        GtpVisibility::GeometryList::iterator geometryIt, geometryIt_end = geometryList.end(); 
     
    111131        // vector for storing subentities of meshes 
    112132        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 
    113143        GtpVisibility::PatchList::iterator patchIt, patchIt_end = patchList.end(); 
    114144 
     
    133163        { 
    134164                //-- queries for hierarchy nodes 
    135                 for (nodeIt = nodeList->begin(); nodeIt != nodeIt_end; ++nodeIt)                 
     165                for (nodeIt = nodeList.begin(); nodeIt != nodeIt_end; ++nodeIt)          
    136166                { 
    137167                        // TODO: DELETE QUERIES FROM PREVIOUS RENDER 
     
    140170 
    141171                //-- 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                        } 
    145178                } 
    146179                 
    147180                //-- queries for patches: if item buffer, capture only projected visibility 
    148                 if (!(mUseItemBuffer && (i == 0))) 
     181                if ((mItemBufferMode != PATCH_VISIBILITY) || (i == 1)) 
    149182                { 
    150183                        for (patchIt = patchList.begin(); patchIt != patchIt_end; ++patchIt) 
     
    162195        GtpVisibility::QueryList::iterator projQueryIt = queryList[1].begin(); 
    163196         
    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        } 
    173221        else 
    174222        { 
    175223                CollectPatchVisibility(visQueryIt, projQueryIt, &patchList, visiblePatches, relativeVisibility); 
    176224        }        
    177          
    178         CollectGeometryVisibility(visQueryIt, projQueryIt, &geometryList, visibleGeometry, relativeVisibility); 
     225 
    179226                 
    180227        //-- reset options 
     
    201248        RemoveDuplicateNodes(visibleNodes); 
    202249         
    203         if (!mUseItemBuffer) 
     250        if (mItemBufferMode != GEOMETRY_VISIBILITY) 
    204251        { 
    205252                RemoveDuplicateGeometry(visibleGeometry); 
     253        } 
     254         
     255        if (mItemBufferMode != PATCH_VISIBILITY) 
     256        { 
     257                RemoveDuplicatePatches(visiblePatches); 
    206258        } 
    207259} 
     
    442494                patchinfo_eq), visiblePatches->end()); 
    443495} 
     496//----------------------------------------------------------------------- 
     497void 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 
    444515} // namespace Ogre 
Note: See TracChangeset for help on using the changeset viewer.