source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/RenderTraverser.h @ 2897

Revision 2897, 5.2 KB checked in by mattausch, 16 years ago (diff)

improved shadow mapping

RevLine 
[2755]1#ifndef __RENDERTRAVERSER_H
2#define __RENDERTRAVERSER_H
3
4#include <queue>
5#include "Bvh.h"
[2763]6#include "OcclusionQuery.h"
[2764]7#include "Camera.h"
[2767]8#include "RenderQueue.h"
[2800]9#include "Timer/PerfTimer.h"
[2755]10
[2767]11
12
[2776]13namespace CHCDemoEngine
[2755]14{
15
16class Camera;
17class Matrix4x4;
18
19
[2760]20
[2755]21struct TraversalStatistics
22{
23public:
24
[2764]25        void Reset();
26
[2755]27        //////////
28        //-- several statistics for a rendering pass
29
30        int mNumTraversedNodes;
31        int mNumQueryCulledNodes;
32        int mNumFrustumCulledNodes;
[2773]33       
[2755]34        int mNumRenderedGeometry;
[2764]35        int mNumRenderedTriangles;
[2773]36        int mNumRenderedNodes;
37
[2764]38        int mNumIssuedQueries;
[2770]39        int mNumStateChanges;
[2800]40        int mNumBatches;
41
42        double mWaitTime;
43        double mQueryTime;
44        double mRestTime;
[2755]45};
46
47
48/** Abstract class implementing a scene traversal for rendering.
49*/
50class RenderTraverser
51{
52public:
53
[2801]54        /** Default constructor.
55        */
[2755]56        RenderTraverser();
[2801]57        /** Virtual constructor, has to be redefined in subclasses
58        */
59        virtual ~RenderTraverser();
60        /** Abstract method that traverses and renders the scene
61        */
62        void RenderScene();
[2755]63
[2801]64        enum {CULL_FRUSTUM, STOP_AND_WAIT, CHC, CHCPLUSPLUS, NUM_TRAVERSAL_TYPES};
65        /** Returns the type of the traversal.
66            The type is one of
[2767]67                CULL_FRUSTUM: view frustum culling only
68                STOP_AND_WAIT: hierarchical stop and wait algorithm
69                CHC: coherent hierarchical algorithm
70                CHCPLUSPLUS: coherent hierarchical algorithm revisited
[2755]71        */
[2801]72        virtual int GetType() const = 0;
[2755]73        /** Sets the scene hierarchy.
74        */
75        void SetHierarchy(Bvh *bvh);
76        /** Sets the camera.
77        */
[2897]78        void SetCamera(Camera *cam) { mCamera = cam;}
[2801]79        /** Sets the render queue.
80        */
81        void SetRenderQueue(RenderQueue *rq) {mRenderQueue =rq;}
[2760]82        /** Sets the current render state
83        */
84        void SetRenderState(RenderState *state);
[2771]85        /** The traversal statistics
86        */
87        const TraversalStatistics &GetStats() const { return mStats; }
[2787]88        /** The current frame id
89        */
90        int GetCurrentFrameId() const { return mFrameId; }
[2801]91       
[2771]92        //////////////////
93        //-- options for the different rendering algorithms
94
95        /** If a render queue should be used to batch up and sort scene entities before
96                rendering.
97        */
[2767]98        void SetUseRenderQueue(bool useRenderQueue);
[2801]99        /** If depth pass should be used.
100                If true, the entities found visible in the current pass are stored
101        */
102        void SetUseDepthPass(bool storeVisibleObjects);
[2771]103        /** Sets visible pixels threshold for visibility classification
104        */
105        void SetVisibilityThreshold(int threshold);
[2760]106
[2771]107        ///////////////////
108        //-- CHC / CHC ++ related options
109
110        /** CHC optimization to query the geometry itself instead of the bounding box.
111        */
112        void SetUseOptimization(bool useOptimization);
113        /** The number of frames a previously visible node is assumed to stay visible.
114        */
115        void SetAssumedVisibleFrames(int assumedVisibleFrames);
116        /** The maximum batch size for the i-queue
117        */
118        void SetMaxBatchSize(int batchSize);
[2776]119        /** If multiqueries should be used.
120        */
121        void SetUseMultiQueries(bool useMultiQueries);
[2786]122        /** If thight bounds should be used or the bounding boxes should be tested.
123        */
124        void SetUseTightBounds(bool useTightBounds);
[2790]125        /** If bounds should be shown
126        */
127        void SetShowBounds(bool showBounds);
[2801]128        /** Returns the entities found visible in current frame
129            (only if StoreVisibleObjects is set)
130        */
131        const SceneEntityContainer &GetVisibleObjects() const { return mVisibleObjects; }
[2897]132        /** Returns the current camera.
133        */
134        Camera *GetCamera() const { return mCamera; }
[2771]135
[2897]136
[2755]137protected:
138
[2767]139        /** This is the actual rendering algorithm. It must be implemented by all
140                the subclasses.
[2755]141        */
[2767]142        virtual void Traverse() = 0;
[2755]143        /** Hierarchy traversal
144        */
145        void TraverseNode(BvhNode *node);
[2773]146        /** Issues occlusion query for a single node
[2755]147        */
[2792]148        OcclusionQuery *IssueOcclusionQuery(BvhNode *node);
[2773]149        /** Issue multiquery.
150        */
[2792]151        void IssueOcclusionQuery(const OcclusionQuery &query);
[2767]152        /** Retunrs true if the current bvh node intersects the near plane.
153        */
154        inline bool IntersectsNearPlane(BvhNode *node) const;
[2770]155        /** Enqueues a bvh node for distance traversal
[2767]156        */
[2755]157        void EnqueueNode(BvhNode *node);
[2770]158        /** Renders the bvh node.
159        */
160        void RenderNode(BvhNode *node);
[2795]161        /** Renders and clears the contents of the render queue.
162        */
163        void ApplyRenderQueue();
[2755]164
[2760]165
[2755]166        ////////////
167        //-- members
168
169        /// the current camera
170        Camera *mCamera;
171        /// the root of the scene hierarchy
172        Bvh *mBvh;
[2767]173        /// the priority queue used for front to back traversal
[2755]174        TraversalQueue mDistanceQueue;
[2767]175        /// the current frame id
[2765]176        int mFrameId;
[2771]177        /// the current render state
[2760]178        RenderState *mRenderState;
[2771]179        /// manages creation and destruction of the queries
[2763]180        QueryHandler mQueryHandler;
[2771]181        /// the statisitcs
[2764]182        TraversalStatistics mStats;
[2771]183       
[2801]184        RenderQueue *mRenderQueue;
[2767]185
[2801]186        /// the objects found visible in current frame
187        SceneEntityContainer mVisibleObjects;
[2767]188
[2801]189
[2771]190        /////////////////
191        //-- algorithm parametes
192
[2767]193        int mVisibilityThreshold;
194       
195        bool mUseOptimization;
196
197        bool mUseRenderQueue;
[2770]198
199        int mAssumedVisibleFrames;
[2771]200
201        int mMaxBatchSize;
[2776]202
203        bool mUseMultiQueries;
[2786]204
205        bool mUseTightBounds;
[2790]206
207        bool mShowBounds;
[2800]208
[2801]209        bool mUseDepthPass;
[2755]210};
211
[2767]212
213inline bool RenderTraverser::IntersectsNearPlane(BvhNode *node) const
214{
215        return mBvh->GetDistance(node) < mCamera->GetNear();
[2755]216}
217
218
[2801]219
[2767]220}
[2755]221
[2767]222
223
[2642]224#endif // RENDERTRAVERSER_H
Note: See TracBrowser for help on using the repository browser.