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

Revision 115, 3.0 KB checked in by mattausch, 19 years ago (diff)

added depth pass algorithm + delayed transparent object rendering (so depth ordering is right)

Line 
1#include "CoherentHierarchicalCullingManager.h"
2//#include <OgreLogManager.h>
3
4namespace GtpVisibility {
5
6//-----------------------------------------------------------------------
7void CoherentHierarchicalCullingManager::RenderScene()
8{
9        //InitFrame();
10        //Ogre::LogManager::getSingleton().logMessage("chc culling");
11        QueryQueue queryQueue;
12        unsigned int visiblePixels = 0;
13        bool isAvailable = false;
14       
15        //-- PART 1: process finished occlusion queries
16        while (!mHierarchyInterface->GetQueue()->empty() || !queryQueue.empty())
17        {
18                while (!queryQueue.empty() &&
19                           queryQueue.front().second->GetQueryResult(visiblePixels,
20                                                                        mHierarchyInterface->GetQueue()->empty()))
21                {
22                HierarchyNode *node = queryQueue.front().first;
23                       
24                        queryQueue.pop();
25
26                        if (visiblePixels > mVisibilityThreshold)
27                        {
28                                mHierarchyInterface->PullUpVisibility(node);
29                                mHierarchyInterface->TraverseNode(node);
30                        }
31                        else
32                        {       //if (mHierarchyInterface->mIsShadowPass)
33                                mNumQueryCulledNodes ++;
34                               
35                                if(mVisualizeCulledNodes)
36                                {
37                                        mHierarchyInterface->VisualizeCulledNode(node, QUERY_CULLED);
38                                }
39                        }
40                }
41               
42                //-- PART 2: hierarchical traversal
43                if (!mHierarchyInterface->GetQueue()->empty())
44                {
45                        HierarchyNode *node = mHierarchyInterface->GetQueue()->top();
46                        mHierarchyInterface->GetQueue()->pop();
47                               
48                        bool intersects = false;
49
50                        if (!mHierarchyInterface->CheckFrustumVisible(node, intersects))
51                        {//if (mHierarchyInterface->mIsShadowPass)
52                                mNumFrustumCulledNodes ++;
53                               
54                                if(mVisualizeCulledNodes)
55                                {
56                                        mHierarchyInterface->VisualizeCulledNode(node, FRUSTUM_CULLED);
57                                }
58                        }
59                        else
60                        {
61                                // if intersects near plane => skip occlusion query because wrong results possible
62                                if (intersects)
63                                {
64                                        // update octant's visited flag
65                                        mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());
66
67                                        mHierarchyInterface->PullUpVisibility(node);                   
68                                        mHierarchyInterface->TraverseNode(node);
69
70                                        continue;
71                                }
72
73                                // identify previously visible nodes
74                                bool wasVisible = mHierarchyInterface->IsNodeVisible(node) &&
75                                        (mHierarchyInterface->LastVisited(node) == mHierarchyInterface->GetFrameId() - 1);
76                               
77                                // identify nodes that we cannot skip queries for
78                                // geometry not only in leaves => test for renderable geometry
79                                bool issueQuery = !wasVisible || mHierarchyInterface->HasGeometry(node);
80                               
81                                // reset node's visibility classification
82                                mHierarchyInterface->SetNodeVisible(node, false);
83
84                                // update node's visited flag
85                                mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());
86                       
87                                // skip testing previously visible nodes without geometry
88                                if (issueQuery)
89                                {
90                                        mNumQueriesIssued ++;
91
92                                        queryQueue.push(QueryPair(node, mHierarchyInterface->
93                                                IssueOcclusionQuery(node, wasVisible)));
94                                }
95                                       
96                                // always traverse a node if it was visible
97                                if (wasVisible)
98                                {
99                                        mHierarchyInterface->TraverseNode(node);
100                                }
101                        }
102                }
103        }
104}
105
106} // namespace GtpVisibility
Note: See TracBrowser for help on using the repository browser.