source: trunk/VUT/GtpVisibility/src/CoherentHierarchicalCullingManager.cpp @ 148

Revision 148, 4.1 KB checked in by mattausch, 19 years ago (diff)

fixed

assumed visibility

RevLine 
[59]1#include "CoherentHierarchicalCullingManager.h"
[147]2#include <OgreLogManager.h>
[59]3
4namespace GtpVisibility {
5
6//-----------------------------------------------------------------------
[142]7CoherentHierarchicalCullingManager:: CoherentHierarchicalCullingManager():
[146]8mAssumedVisibility(0), mThreshold(0)
[142]9{
10        // initialise random generator because of assumed visibility
11        srand(time(NULL));
12}
13//-----------------------------------------------------------------------
[59]14void CoherentHierarchicalCullingManager::RenderScene()
15{
[85]16        QueryQueue queryQueue;
[86]17        unsigned int visiblePixels = 0;
18        bool isAvailable = false;
[87]19       
[59]20        //-- PART 1: process finished occlusion queries
21        while (!mHierarchyInterface->GetQueue()->empty() || !queryQueue.empty())
22        {
23                while (!queryQueue.empty() &&
[86]24                           queryQueue.front().second->GetQueryResult(visiblePixels,
25                                                                        mHierarchyInterface->GetQueue()->empty()))
[59]26                {
[94]27                HierarchyNode *node = queryQueue.front().first;
[115]28                       
[59]29                        queryQueue.pop();
30
[96]31                        if (visiblePixels > mVisibilityThreshold)
[59]32                        {
33                                mHierarchyInterface->PullUpVisibility(node);
34                                mHierarchyInterface->TraverseNode(node);
35                        }
36                        else
[142]37                        {       
[59]38                                mNumQueryCulledNodes ++;
[112]39                               
40                                if(mVisualizeCulledNodes)
41                                {
42                                        mHierarchyInterface->VisualizeCulledNode(node, QUERY_CULLED);
43                                }
[59]44                        }
[85]45                }
[87]46               
[59]47                //-- PART 2: hierarchical traversal
48                if (!mHierarchyInterface->GetQueue()->empty())
49                {
50                        HierarchyNode *node = mHierarchyInterface->GetQueue()->top();
51                        mHierarchyInterface->GetQueue()->pop();
52                               
53                        bool intersects = false;
54
[74]55                        if (!mHierarchyInterface->CheckFrustumVisible(node, intersects))
[130]56                        {
[147]57                                ++ mNumFrustumCulledNodes;
[112]58                               
[147]59                                if (mVisualizeCulledNodes)
[112]60                                {
[113]61                                        mHierarchyInterface->VisualizeCulledNode(node, FRUSTUM_CULLED);
[112]62                                }
[59]63                        }
[74]64                        else
[59]65                        {
[148]66                                // identify previously visible nodes
67                                bool wasVisible = mHierarchyInterface->IsNodeVisible(node) &&
68                                        (mHierarchyInterface->LastVisited(node) == mHierarchyInterface->GetFrameId() - 1);
69
70                                // if node is assumed to be visible in this frame => skip query
71                                // if intersects near plane => also skip query because wrong results possible
72                                bool assumeVisible = intersects ||
73                                        (wasVisible && (mAssumedVisibility > 0) &&
74                                         mHierarchyInterface->HasGeometry(node) && DecideVisible(node));       
75
76                                if (assumeVisible)
[74]77                                {
[148]78                                        // update node's visited flag
[74]79                                        mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());
[59]80
[74]81                                        mHierarchyInterface->PullUpVisibility(node);                   
82                                        mHierarchyInterface->TraverseNode(node);
[59]83
[74]84                                        continue;
85                                }
[59]86
[148]87                // identify nodes that we cannot skip queries for
[87]88                                // geometry not only in leaves => test for renderable geometry
[148]89                                bool issueQuery = !wasVisible || mHierarchyInterface->HasGeometry(node);
[147]90                                                               
91                                // reset node's visibility classification
[148]92                                mHierarchyInterface->SetNodeVisible(node, false);
[59]93
[74]94                                // update node's visited flag
95                                mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());
[59]96                       
[87]97                                // skip testing previously visible nodes without geometry
98                                if (issueQuery)
[74]99                                {
[147]100                                        ++ mNumQueriesIssued;
[142]101                                       
[87]102                                        queryQueue.push(QueryPair(node, mHierarchyInterface->
103                                                IssueOcclusionQuery(node, wasVisible)));
[74]104                                }
[147]105                               
[74]106                                // always traverse a node if it was visible
107                                if (wasVisible)
108                                {
109                                        mHierarchyInterface->TraverseNode(node);
110                                }
[59]111                        }
112                }
113        }
114}
[142]115//-----------------------------------------------------------------------
[146]116void CoherentHierarchicalCullingManager::SetAssumedVisibility(unsigned int assumedVisibility)
[142]117{
118        mAssumedVisibility = assumedVisibility;
[146]119       
120        mThreshold = 0;
121
[147]122        if (mAssumedVisibility > 0)
[146]123        {
[147]124                mThreshold =  RAND_MAX - RAND_MAX / mAssumedVisibility;
[146]125        }
[147]126        //std::stringstream d; d << "*** setting assumed vis: " << mAssumedVisibility; Ogre::LogManager::getSingleton().logMessage(d.str());
[142]127}
128//-----------------------------------------------------------------------
[147]129bool CoherentHierarchicalCullingManager::DecideVisible(HierarchyNode *node) const
[142]130{
[147]131        /*bool result = rand() < mThreshold;
132        std::stringstream d; d << "Assumed vis: " << mAssumedVisibility << ", result: " << result;
133        Ogre::LogManager::getSingleton().logMessage(d.str()); return result;*/
134       
[146]135        return rand() < mThreshold;
[142]136}
[59]137} // namespace GtpVisibility
Note: See TracBrowser for help on using the repository browser.