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

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

orthocam not working yet

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),
[2947]53mRenderQueue(NULL),
[3102]54mMaxVisibleDistance(.0f),
55mRenderDynamicObjects(true)
[2642]56{
57}
58
59
60RenderTraverser::~RenderTraverser()
61{
[2764]62        mQueryHandler.DestroyQueries();
[2642]63}
64
65
[2755]66void RenderTraverser::EnqueueNode(BvhNode *node)
[2642]67{
[2954]68        mBvh->UpdateDistance(node);
[2755]69        mDistanceQueue.push(node);
70}
71
72
73void RenderTraverser::TraverseNode(BvhNode *node)
74{
[2764]75        ++ mStats.mNumTraversedNodes;
[2762]76
77        if (node->IsVirtualLeaf())
[2755]78        {
[2770]79                RenderNode(node);
[2790]80
81                if (mShowBounds)
[2947]82                        mBvh->RenderBoundsForViz(node, mRenderState, mUseTightBounds);
[2755]83        }
[2642]84        else
85        {
[2755]86                BvhInterior *interior = static_cast<BvhInterior *>(node);
87
88                EnqueueNode(interior->GetFront());
89                EnqueueNode(interior->GetBack());
[2642]90        }
91}
92
[2760]93
[2770]94void RenderTraverser::RenderNode(BvhNode *node)
95{
[2947]96        // test if node was already rendered in this frame
[2771]97        if (node->GetLastRenderedFrame() != mFrameId)
[2770]98        {
[3031]99                if (mRenderState->SetMode(RenderState::RENDER))
[2776]100                        ++ mStats.mNumStateChanges;
101               
[2771]102                node->SetLastRenderedFrame(mFrameId);
[2770]103
[2773]104                int geometrySize;
105                SceneEntity **entities = mBvh->GetGeometry(node, geometrySize);
106
107                mStats.mNumRenderedGeometry += geometrySize;
108                ++ mStats.mNumRenderedNodes;
109               
110                for (int i = 0; i < geometrySize; ++ i)
[2771]111                {
[2773]112                        SceneEntity *ent = entities[i];
[2847]113               
[2842]114                        mStats.mNumRenderedTriangles += ent->CountNumTriangles();
115
[2773]116                        if (mUseRenderQueue)
[2801]117                                mRenderQueue->Enqueue(ent);
[2773]118                        else
119                                ent->Render(mRenderState);
[2801]120
121                        // store the visible entities for rendering in the second pass
[2951]122                        if (mUseDepthPass) mVisibleObjects.push_back(ent);
[2947]123                }
124
125                // store the max distance in the scene for later use
126                float maxDist = mBvh->CalcMaxDistance(node);
127
128                if (maxDist > mMaxVisibleDistance)
129                        mMaxVisibleDistance = maxDist;
[2771]130        }
[2770]131}
132
133
[2760]134void RenderTraverser::SetHierarchy(Bvh *bvh)
135{
136        mBvh = bvh;
137}
138
139
140void RenderTraverser::SetRenderState(RenderState *state)
141{
142        mRenderState = state;
143}
144
145
[2767]146void RenderTraverser::RenderScene()
[2762]147{
[2801]148        mVisibleObjects.clear();
[2951]149        mMaxVisibleDistance = .0f;
[2800]150
[2767]151        ++ mFrameId;
[2762]152
[3074]153        mBvh->InitFrame(mCamera, mRenderState);
[2762]154
[2767]155        mStats.Reset();
156        mQueryHandler.ResetQueries();
[2953]157
[2951]158        // add root node to queue
[3102]159        if (mRenderDynamicObjects)
160                EnqueueNode(mBvh->GetRoot());
161        else
162                EnqueueNode(mBvh->GetStaticRoot());
163
[3072]164       
[2762]165
[2767]166        ///////////
167        //-- the actual rendering algorithm
[2762]168
[2767]169        Traverse();
[2762]170
[2795]171        // render the contents of the render queue
172        if (mUseRenderQueue) ApplyRenderQueue();
[2800]173       
174        // reset the render state
[2770]175        mRenderState->Reset();
[2767]176}
[2762]177
178
[2767]179void RenderTraverser::SetUseRenderQueue(bool useRenderQueue)
180{
181        mUseRenderQueue = useRenderQueue;
[2792]182        //std::cout << "using render queue: " << mUseRenderQueue << std::endl;
[2762]183}
184
[2771]185
[2801]186void RenderTraverser::SetUseDepthPass(bool b)
187{
188        mUseDepthPass = b;
189}
190
191
[2771]192void RenderTraverser::SetVisibilityThreshold(int threshold)
193{
194        mVisibilityThreshold = threshold;
[2762]195}
[2771]196
197
198void RenderTraverser::SetUseOptimization(bool useOptimization)
199{
200        mUseOptimization = useOptimization;
[2798]201        //cout << "using optimization: " << mUseOptimization << endl;
[2771]202}
203
204
[2776]205void RenderTraverser::SetAssumedVisibleFrames(int assumedVisibleFrames)
[2774]206{
[2776]207        mAssumedVisibleFrames = assumedVisibleFrames;
208}
[2773]209
210
[2776]211void RenderTraverser::SetMaxBatchSize(int batchSize)
212{
213        mMaxBatchSize = batchSize;
[2774]214}
215
216
[2776]217void RenderTraverser::SetUseMultiQueries(bool useMultiQueries)
[2773]218{
[2776]219        mUseMultiQueries = useMultiQueries;
[2786]220        //cout << "using multiqueries: " << mUseMultiQueries << endl;
[2776]221}
[2774]222
223
[2790]224void RenderTraverser::SetShowBounds(bool showBounds)
225{
226        mShowBounds = showBounds;
227}
228
229
[2786]230void RenderTraverser::SetUseTightBounds(bool useTightBounds)
231{
232        mUseTightBounds = useTightBounds;
[2790]233        //cout << "using tight bounds: " << useTightBounds << endl;
[2786]234}
[2774]235
[2786]236
[2792]237OcclusionQuery *RenderTraverser::IssueOcclusionQuery(BvhNode *node)
[2776]238{
239        OcclusionQuery *query = mQueryHandler.RequestQuery();
[2773]240        query->AddNode(node);
241
[2792]242        IssueOcclusionQuery(*query);
[2773]243
244        return query;
[2771]245}
[2773]246
[2776]247
[2792]248void RenderTraverser::IssueOcclusionQuery(const OcclusionQuery &query)
[2773]249{
250        ++ mStats.mNumIssuedQueries;
251
[2795]252        // render pending objects before changing to query mode
[2773]253        if (mUseRenderQueue && (mRenderState->GetMode() == RenderState::RENDER))
[3038]254        {
[2795]255                ApplyRenderQueue();
[3038]256        }
[2773]257
258        query.BeginQuery();
259
[2792]260        // change to query mode and render box
[3031]261        if (mRenderState->SetMode(RenderState::QUERY))
[3038]262        {
[2792]263                ++ mStats.mNumStateChanges;
[3038]264        }
[2773]265
[2792]266        mBvh->RenderBounds(query.GetNodes(), mRenderState, mUseTightBounds);
267       
[2773]268        query.EndQuery();
269}
270
271
[2795]272void RenderTraverser::ApplyRenderQueue()
273{
[3031]274        if (mRenderState->SetMode(RenderState::RENDER))
[2795]275                ++ mStats.mNumStateChanges;
276                 
[2801]277        if (mRenderQueue->GetSize() > 0)
[2848]278        {
[2800]279                ++ mStats.mNumBatches;
[2848]280                mRenderQueue->Apply();
281        }
[2773]282}
[2795]283
284
[3102]285void RenderTraverser::SetRenderDynamicObjects(bool dynamic)
286{
287        mRenderDynamicObjects = dynamic;
[2795]288}
[3102]289
290}
Note: See TracBrowser for help on using the repository browser.