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

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