source: GTP/trunk/App/Demos/Vis/CHC_revisited/CHCTraverser.cpp @ 2764

Revision 2764, 2.4 KB checked in by mattausch, 16 years ago (diff)
Line 
1#include "CHCTraverser.h"
2#include "SceneEntity.h"
3
4
5namespace CHCDemo
6{
7
8CHCTraverser::CHCTraverser(): RenderTraverser()
9{
10}
11
12
13CHCTraverser::~CHCTraverser()
14{
15        //DelQueries();
16}
17
18
19void CHCTraverser::Render()
20{
21        mStats.Reset();
22        mRenderState->mTexturesEnabled = false;
23        EnqueueNode(mBvh->GetRoot());
24
25        QueryQueue queryQueue;
26
27        //-- PART 1: process finished occlusion queries
28        while (!mDistanceQueue.empty() || !queryQueue.empty())
29        {
30                while (!queryQueue.empty() &&
31                           (queryQueue.front()->ResultAvailable() || mDistanceQueue.empty()))
32                {
33                        OcclusionQuery *query = queryQueue.front();
34                        queryQueue.pop();
35                       
36                        // wait until result available
37                        int visiblePixels = query->GetQueryResult();
38
39                        if (visiblePixels > mVisibilityThreshold)
40                        {
41                                BvhNode *node = query->GetFrontNode();
42
43                                mBvh->MakeParentsVisible(node);
44                                TraverseNode(node);
45                        }
46                        else
47                        {
48                                ++ mStats.mNumQueryCulledNodes;
49                        }
50                }       
51
52                //-- PART 2: hierarchical traversal
53                if (!mDistanceQueue.empty())
54                {
55                        BvhNode *node = mDistanceQueue.top();
56                        mDistanceQueue.pop();
57       
58                        if (mBvh->IsWithinViewFrustum(node))
59                        {
60                                // for near plane intersecting bounding box possible
61                                // wrong results => skip occlusion query
62                                if (IntersectsNearPlane(node))
63                                {
64                                        // update node's visited flag
65                                        node->SetLastVisitedFrame(mFrameID);
66                                        node->SetVisible(true);
67                                        mBvh->MakeParentsVisible(node);
68
69                                        TraverseNode(node);
70                                }
71                                else
72                                {               
73                                        // identify previously visible nodes
74                                        const bool wasVisible = node->IsVisible() && (node->GetLastVisitedFrame() == mFrameID - 1);
75                                       
76                                        // identify nodes that we cannot skip queries for
77                                        const bool leafOrWasInvisible =
78                                                (node->GetLastVisitedFrame() != mFrameID) && (!wasVisible || node->IsVirtualLeaf());
79
80                                        // reset node's visibility classification
81                                        node->SetVisible(false);
82
83                                        // update node's visited flag
84                                        node->SetLastVisitedFrame(mFrameID);
85                                       
86                                        // skip testing previously visible interior nodes
87                                        if (leafOrWasInvisible)
88                                        {
89                                                OcclusionQuery *query = IssueOcclusionQuery(node, wasVisible);
90                                                queryQueue.push(query);
91                                        }
92                                       
93                                        // always traverse a node if it was visible
94                                        if (wasVisible)
95                                                TraverseNode(node);
96                                }
97                        }
98                        else
99                        {
100                                // for stats
101                                ++ mStats.mNumFrustumCulledNodes;
102                        }
103                }
104        }
105}
106
107}
Note: See TracBrowser for help on using the repository browser.