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

Revision 111, 2.7 KB checked in by mattausch, 19 years ago (diff)
Line 
1#include "CoherentHierarchicalCullingManager.h"
2#include <OgreLogManager.h>
3
4namespace GtpVisibility {
5
6//-----------------------------------------------------------------------
7void CoherentHierarchicalCullingManager::RenderScene()
8{
9        //InitFrame();
10       
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                        {
33                                if (mHierarchyInterface->mDummy)
34                                mNumQueryCulledNodes ++;
35                        }
36                }
37               
38                //-- PART 2: hierarchical traversal
39                if (!mHierarchyInterface->GetQueue()->empty())
40                {
41                        HierarchyNode *node = mHierarchyInterface->GetQueue()->top();
42                        mHierarchyInterface->GetQueue()->pop();
43                               
44                        bool intersects = false;
45
46                        if (!mHierarchyInterface->CheckFrustumVisible(node, intersects))
47                        {       if (mHierarchyInterface->mDummy)
48                                mNumFrustumCulledNodes ++;
49                        }
50                        else
51                        {
52                                // if intersects near plane => skip occlusion query because wrong results possible
53                                if (intersects)
54                                {
55                                        // update octant's visited flag
56                                        mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());
57
58                                        mHierarchyInterface->PullUpVisibility(node);                   
59                                        mHierarchyInterface->TraverseNode(node);
60
61                                        continue;
62                                }
63
64                                // identify previously visible nodes
65                                bool wasVisible = mHierarchyInterface->IsNodeVisible(node) &&
66                                        (mHierarchyInterface->LastVisited(node) == mHierarchyInterface->GetFrameId() - 1);
67                               
68                                // identify nodes that we cannot skip queries for
69                                // geometry not only in leaves => test for renderable geometry
70                                bool issueQuery = !wasVisible || mHierarchyInterface->HasGeometry(node);
71                               
72                                // reset node's visibility classification
73                                mHierarchyInterface->SetNodeVisible(node, false);
74
75                                // update node's visited flag
76                                mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());
77                       
78                                // skip testing previously visible nodes without geometry
79                                if (issueQuery)
80                                {
81                                        mNumQueriesIssued ++;
82
83                                        queryQueue.push(QueryPair(node, mHierarchyInterface->
84                                                IssueOcclusionQuery(node, wasVisible)));
85                                }
86                                       
87                                // always traverse a node if it was visible
88                                if (wasVisible)
89                                {
90                                        mHierarchyInterface->TraverseNode(node);
91                                }
92                        }
93                }
94        }
95}
96
97} // namespace GtpVisibility
Note: See TracBrowser for help on using the repository browser.