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

Revision 94, 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        Ogre::LogManager::getSingleton().logMessage("**** CHCULL ****\n");
11
12        QueryQueue queryQueue;
13        unsigned int visiblePixels = 0;
14        bool isAvailable = false;
15       
16        //-- PART 1: process finished occlusion queries
17        while (!mHierarchyInterface->GetQueue()->empty() || !queryQueue.empty())
18        {
19                while (!queryQueue.empty() &&
20                           queryQueue.front().second->GetQueryResult(visiblePixels,
21                                                                        mHierarchyInterface->GetQueue()->empty()))
22                {
23                HierarchyNode *node = queryQueue.front().first;
24                                               
25                        queryQueue.pop();
26
27                        if (visiblePixels > mVisibilityThreshold)
28                        {
29                                mHierarchyInterface->PullUpVisibility(node);
30                                mHierarchyInterface->TraverseNode(node);
31                        }
32                        else
33                        {
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                        {
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                                        //mHierarchyInterface->IsLeaf(node);
72
73                                // reset node's visibility classification
74                                mHierarchyInterface->SetNodeVisible(node, false);
75
76                                // update node's visited flag
77                                mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());
78                       
79                                // skip testing previously visible nodes without geometry
80                                if (issueQuery)
81                                {
82                                        mNumQueriesIssued ++;
83
84                                        queryQueue.push(QueryPair(node, mHierarchyInterface->
85                                                IssueOcclusionQuery(node, wasVisible)));
86                                }
87                                       
88                                // always traverse a node if it was visible
89                                if (wasVisible)
90                                {
91                                        mHierarchyInterface->TraverseNode(node);
92                                }
93                        }
94                }
95        }
96}
97
98} // namespace GtpVisibility
Note: See TracBrowser for help on using the repository browser.