source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/CHCTraverser.cpp @ 3251

Revision 3251, 3.1 KB checked in by mattausch, 16 years ago (diff)

played around with pvs. now using pvs without vfc or anything. using function that allows to skip tree at some point

Line 
1#include "CHCTraverser.h"
2#include "SceneEntity.h"
3
4
5namespace CHCDemoEngine
6{
7
8CHCTraverser::CHCTraverser()
9{}
10
11
12OcclusionQuery *CHCTraverser::IssueOcclusionQueryWithGeometry(BvhNode *node)
13{
14        // render out what is left in the qeue
15        if (mUseRenderQueue) ApplyRenderQueue();
16
17        OcclusionQuery *query = mQueryHandler.RequestQuery();
18        query->AddNode(node);
19
20        ++ mStats.mNumIssuedQueries;
21
22        query->BeginQuery();
23
24        RenderNode(node);
25        if (mUseRenderQueue) ApplyRenderQueue();
26
27        query->EndQuery();
28
29        return query;
30}
31
32
33void CHCTraverser::Traverse()
34{
35        //-- PART 1: process finished occlusion queries
36        while (!mDistanceQueue.empty() || !mQueryQueue.empty())
37        {
38                while (!mQueryQueue.empty() &&
39                           (mQueryQueue.front()->ResultAvailable() || mDistanceQueue.empty()))
40                {
41                        OcclusionQuery *query = mQueryQueue.front();
42                        mQueryQueue.pop();
43                       
44                        // wait until result available
45                        int visiblePixels = query->GetQueryResult();
46
47                        if (visiblePixels > mVisibilityThreshold)
48                        {
49                                BvhNode *node = query->GetFrontNode();
50                                node->SetAssumedVisibleFrameId(mFrameId + mAssumedVisibleFrames);
51
52                                node->SetVisible(true);
53                                mBvh->MakeParentsVisible(node);
54                                TraverseNode(node);
55                        }
56                        else
57                        {
58                               
59                                ++ mStats.mNumQueryCulledNodes;
60                        }
61                }       
62
63                //-- PART 2: hierarchical traversal
64                if (!mDistanceQueue.empty())
65                {
66                        BvhNode *node = mDistanceQueue.top();
67                        mDistanceQueue.pop();
68       
69                        if (mBvh->IsWithinViewFrustum(node))
70                        {
71                                // for near plane intersecting bounding box possible
72                                // wrong results => skip occlusion query
73                                if (mBvh->IntersectsNearPlane(node))
74                                {
75                                        // update node's visited flag
76                                        node->SetLastVisitedFrame(mFrameId);
77                                        node->SetVisible(true);
78                                        mBvh->MakeParentsVisible(node);
79
80                                        TraverseNode(node);
81                                }
82                                else
83                                {               
84                                        // identify previously visible nodes
85                                        const bool wasVisible = node->IsVisible() && (node->GetLastVisitedFrame() == mFrameId - 1);
86                                       
87                                        // identify nodes that we cannot skip queries for
88                                        const bool queryFeasible = (!wasVisible ||
89                                                (node->IsVirtualLeaf() && (node->GetAssumedVisibleFrameId() <= mFrameId)));
90
91                                        // update node's visited flag
92                                        node->SetLastVisitedFrame(mFrameId);
93                                       
94                                        // skip testing previously visible interior nodes
95                                        if (queryFeasible)
96                                        {
97                                                OcclusionQuery *query;
98
99                                                // if this node is a previous visible leaf:
100                                                // leaves will be rendered anyway => we can directly query the real geometry
101                                                if (wasVisible && mUseOptimization)
102                                                        query = IssueOcclusionQueryWithGeometry(node);
103                                                else
104                                                        query = IssueOcclusionQuery(node);
105
106                                                mQueryQueue.push(query);
107                                        }
108                                        else
109                                        {
110                                                if (node->IsVirtualLeaf())
111                                                {
112                                                        node->SetVisible(true);
113                                                        mBvh->MakeParentsVisible(node);
114                                                }
115                                                else // reset visibility classification
116                                                {
117                                                        node->SetVisible(false);
118                                                }
119                                        }
120
121                                        // always traverse a node if it was visible
122                                        if (wasVisible)
123                                        {
124                                                TraverseNode(node);
125                                        }
126                                }
127                        }
128                        else
129                        {
130                                // for stats
131                                ++ mStats.mNumFrustumCulledNodes;
132                        }
133                }
134        }
135}
136
137}
Note: See TracBrowser for help on using the repository browser.