source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/RenderTraverser.cpp @ 2800

Revision 2800, 5.6 KB checked in by mattausch, 16 years ago (diff)

friendly culling debug version with timers, no materials

Line 
1#include "RenderTraverser.h"
2#include "glInterface.h"
3#include "Camera.h"
4#include "SceneEntity.h"
5#include "RenderState.h"
6#include "Geometry.h"
7#include "Timer/PerfTimer.h"
8
9
10using namespace std;
11
12
13namespace CHCDemoEngine
14{
15
16       
17void TraversalStatistics::Reset()
18{
19        mNumTraversedNodes = 0;
20        mNumQueryCulledNodes = 0;
21        mNumFrustumCulledNodes = 0;
22       
23        mNumRenderedGeometry = 0;
24        mNumRenderedTriangles = 0;
25        mNumRenderedNodes = 0;
26
27        mNumIssuedQueries = 0;
28        mNumStateChanges = 0;
29        mNumBatches = 0;
30
31        mRenderTime = 0;
32        mWaitTime = 0;
33        mQueryTime = 0;
34        mRestTime = 0;
35}
36
37
38
39/******************************************************/
40/*           RenderTraverser implementation           */
41/******************************************************/
42
43
44RenderTraverser::RenderTraverser(): 
45mVisibilityThreshold(0),
46mBvh(NULL),
47mUseOptimization(false),
48mFrameId(-1),
49mUseRenderQueue(false),
50mAssumedVisibleFrames(10),
51mMaxBatchSize(50),
52mUseTightBounds(false), mShowBounds(false)
53{
54}
55
56
57RenderTraverser::~RenderTraverser()
58{
59        mQueryHandler.DestroyQueries();
60}
61
62
63void RenderTraverser::EnqueueNode(BvhNode *node)
64{
65        mBvh->CalcDistance(node);
66        mDistanceQueue.push(node);
67}
68
69
70void RenderTraverser::TraverseNode(BvhNode *node)
71{
72        ++ mStats.mNumTraversedNodes;
73
74        if (node->IsVirtualLeaf())
75        {
76                RenderNode(node);
77
78                if (mShowBounds)
79                        mBvh->RenderBoundsForViz(node, mUseTightBounds);               
80        }
81        else
82        {
83                // for non leafs this renders only the bounding volume (if the flag is set)
84                BvhInterior *interior = static_cast<BvhInterior *>(node);
85
86                EnqueueNode(interior->GetFront());
87                EnqueueNode(interior->GetBack());
88        }
89}
90
91
92void RenderTraverser::RenderNode(BvhNode *node)
93{
94        if (node->GetLastRenderedFrame() != mFrameId)
95        {
96                if (mRenderState->SetState(RenderState::RENDER))
97                        ++ mStats.mNumStateChanges;
98               
99                node->SetLastRenderedFrame(mFrameId);
100
101                int geometrySize;
102                SceneEntity **entities = mBvh->GetGeometry(node, geometrySize);
103
104                mStats.mNumRenderedGeometry += geometrySize;
105                ++ mStats.mNumRenderedNodes;
106               
107                for (int i = 0; i < geometrySize; ++ i)
108                {
109                        SceneEntity *ent = entities[i];
110                        mStats.mNumRenderedTriangles += ent->GetGeometry()->GetNumTriangles();
111
112                        if (mUseRenderQueue)
113                                mRenderQueue.Enqueue(ent);
114                        else
115                                ent->Render(mRenderState);
116                }               
117        }
118}
119
120
121void RenderTraverser::SetHierarchy(Bvh *bvh)
122{
123        mBvh = bvh;
124}
125
126
127void RenderTraverser::SetRenderState(RenderState *state)
128{
129        mRenderState = state;
130        mRenderQueue.SetRenderState(state);
131}
132
133
134void RenderTraverser::RenderScene()
135{
136        PerfTimer timer;
137       
138        glFinish();
139
140        timer.Start();
141
142        glEnableClientState(GL_VERTEX_ARRAY);
143        glEnableClientState(GL_NORMAL_ARRAY);
144
145        ++ mFrameId;
146
147        mBvh->InitFrame();
148
149        mStats.Reset();
150        mQueryHandler.ResetQueries();
151       
152        EnqueueNode(mBvh->GetRoot());
153
154
155        ///////////
156        //-- the actual rendering algorithm
157
158        Traverse();
159
160        // render the contents of the render queue
161        if (mUseRenderQueue) ApplyRenderQueue();
162       
163        // reset the render state
164        mRenderState->Reset();
165
166        glDisableClientState(GL_VERTEX_ARRAY);
167        glDisableClientState(GL_NORMAL_ARRAY);
168
169        glFinish();
170
171
172        mStats.mRenderTime = timer.Elapsedms();
173       
174        //Debug << "type: " << GetType() << endl;
175        //if (mUseRenderQueue) Debug << "rq sort: " << 1e3f * mRenderQueue.sortTimer.TotalTime() << " ms" << endl;
176        /*
177        Debug << "wait time: " << 1e3f * waitTimer.TotalTime() << " ms" << endl;
178        Debug << "query time: " << 1e3f * queryTimer.TotalTime() << " ms" << endl;
179        Debug << "rest time: " << 1e3f * restTimer.TotalTime() << " ms" << endl;
180        */
181}
182
183
184void RenderTraverser::SetUseRenderQueue(bool useRenderQueue)
185{
186        mUseRenderQueue = useRenderQueue;
187        //std::cout << "using render queue: " << mUseRenderQueue << std::endl;
188}
189
190
191void RenderTraverser::SetVisibilityThreshold(int threshold)
192{
193        mVisibilityThreshold = threshold;
194}
195
196
197void RenderTraverser::SetUseOptimization(bool useOptimization)
198{
199        mUseOptimization = useOptimization;
200        //cout << "using optimization: " << mUseOptimization << endl;
201}
202
203
204void RenderTraverser::SetAssumedVisibleFrames(int assumedVisibleFrames)
205{
206        mAssumedVisibleFrames = assumedVisibleFrames;
207}
208
209
210void RenderTraverser::SetMaxBatchSize(int batchSize)
211{
212        mMaxBatchSize = batchSize;
213}
214
215
216void RenderTraverser::SetUseMultiQueries(bool useMultiQueries)
217{
218        mUseMultiQueries = useMultiQueries;
219        //cout << "using multiqueries: " << mUseMultiQueries << endl;
220}
221
222
223void RenderTraverser::SetShowBounds(bool showBounds)
224{
225        mShowBounds = showBounds;
226}
227
228
229void RenderTraverser::SetUseTightBounds(bool useTightBounds)
230{
231        mUseTightBounds = useTightBounds;
232        //cout << "using tight bounds: " << useTightBounds << endl;
233}
234
235
236OcclusionQuery *RenderTraverser::IssueOcclusionQuery(BvhNode *node)
237{
238        queryTimer.Entry();
239
240        OcclusionQuery *query = mQueryHandler.RequestQuery();
241        query->AddNode(node);
242
243        IssueOcclusionQuery(*query);
244
245        queryTimer.Exit();
246
247        return query;
248}
249
250
251void RenderTraverser::IssueOcclusionQuery(const OcclusionQuery &query)
252{
253        ++ mStats.mNumIssuedQueries;
254
255        // render pending objects before changing to query mode
256        if (mUseRenderQueue && (mRenderState->GetMode() == RenderState::RENDER))
257                ApplyRenderQueue();
258       
259
260        query.BeginQuery();
261
262        // change to query mode and render box
263        if (mRenderState->SetState(RenderState::QUERY))
264                ++ mStats.mNumStateChanges;
265
266        mBvh->RenderBounds(query.GetNodes(), mRenderState, mUseTightBounds);
267       
268        query.EndQuery();
269}
270
271
272void RenderTraverser::ApplyRenderQueue()
273{
274        if (mRenderState->SetState(RenderState::RENDER))
275                ++ mStats.mNumStateChanges;
276                 
277        if (mRenderQueue.GetSize() > 0)
278                ++ mStats.mNumBatches;
279
280        mRenderQueue.Apply();
281}
282
283
284}
Note: See TracBrowser for help on using the repository browser.