source: GTP/trunk/Lib/Vis/Preprocessing/src/GlRenderer.h @ 2743

Revision 2743, 9.3 KB checked in by mattausch, 16 years ago (diff)
  • Property svn:executable set to *
Line 
1#ifndef __GLRENDERER_H
2#define __GLRENDERER_H
3
4#include "ObjectPvs.h"
5#include "Vector3.h"
6#include "Containers.h"
7#include "Halton.h"
8#include "Renderer.h"
9#include "Beam.h"
10#include <vector>
11#include "Material.h"
12
13
14
15namespace GtpVisibilityPreprocessor {
16
17class SceneGraph;
18class ViewCellsManager;
19class Mesh;
20class MeshInstance;
21class Intersectable;
22class Material;
23class Beam;
24class KdTree;
25class GlRendererBuffer;
26class BeamSampleStatistics;
27class OcclusionQuery;
28class TransformedMeshInstance;
29class TriangleIntersectable;
30class BvhNode;
31class SimpleRayContainer;
32class SceneGraphLeaf;
33class Preprocessor;
34
35struct VssRayContainer;
36struct GLUquadric;
37
38
39struct PvsRenderStatistics
40{
41  float maxError;
42  float sumError;
43  int sumPvsSize;
44  int frames;
45  int errorFreeFrames;
46  int currentPass;
47
48  PvsRenderStatistics(): currentPass(0) { Reset(); }
49 
50  void Reset()
51  {
52        maxError = 0.0f;
53        sumError = 0.0f;
54        frames = 0;
55        errorFreeFrames = 0;
56        sumPvsSize = 0;
57        //cuurentPass = 0;
58  }
59
60  float GetMaxError() { return maxError; }
61  float GetAvgError() { return sumError/frames; }
62  float GetErrorFreeFrames() { return errorFreeFrames/(float)frames; }
63  float GetAvgPvs() { return sumPvsSize/(float)frames; }
64 
65};
66
67
68struct PvsCache
69{
70        PvsCache():mViewCell(NULL), mUnfilteredPvsSize(0) {}
71
72        void Reset()
73        {
74                mViewCell = NULL;
75                mPvs.Clear(false);
76                filteredBoxes.clear();
77                mUnfilteredPvsSize = 0;
78        }
79
80        ViewCell *mViewCell;
81        ObjectPvs mPvs;
82        int mUnfilteredPvsSize;
83        vector<AxisAlignedBox3> filteredBoxes;
84};
85
86
87struct RenderCostSample {
88
89  RenderCostSample() {}
90
91  void Reset() {
92        mVisibleObjects = 0;
93        mVisiblePixels = 0;
94  }
95 
96  Vector3 mPosition;
97
98  // visible object from the given point
99  int mVisibleObjects;
100
101  // visible pixels
102  int mVisiblePixels;
103
104  ObjectPvs mPvs;
105 
106};
107
108/** Class encapsulating gl rendering for the scene.
109        There is no gl context binding so the binding is performed in the
110        derived classes
111*/
112class GlRenderer: public Renderer
113{
114friend class GlobalLinesRenderer;
115friend class ViewCellsManager;
116
117public:
118
119  GlRenderer(SceneGraph *sceneGraph,
120                         ViewCellsManager *viewcells,
121                         KdTree *tree);
122 
123  GlRenderer() {}
124
125  virtual ~GlRenderer();
126
127
128  virtual void RandomViewPoint();
129
130  void SetupFalseColor(const unsigned int id);
131  void RenderIntersectable(Intersectable *);
132  void RenderViewCell(ViewCell *vc);
133  void RenderMeshInstance(MeshInstance *mi);
134  void RenderTransformedMeshInstance(TransformedMeshInstance *mi);
135  void RenderMesh(Mesh *m);
136  void SetupMaterial(Material *m);
137  virtual void SetupCamera();
138
139  void
140  RenderRays(const VssRayContainer &rays, int colorType = 0, int showDistribution = 15, int maxAge = 9999999);
141
142  void
143  RenderTriangle(TriangleIntersectable *object);
144
145  void
146  RenderBox(const AxisAlignedBox3 &box);
147
148  void
149  RenderBvhNode(BvhNode *node);
150
151  void
152  RenderKdNode(KdNode *node);
153
154  bool
155  RenderScene();
156
157  void
158  _RenderScene();
159
160  void
161  _RenderSceneTriangles();
162
163  void _RenderSceneTrianglesWithDrawArrays();
164
165  void
166  RenderViewPoint();
167
168  void _RenderDynamicObject(SceneGraphLeaf *leaf);
169
170  virtual void
171  SetupProjection(const int w, const int h, const float angle = 70.0f);
172
173  virtual bool ValidViewPoint();
174 
175  /** Gets the pixel error of the current view point.
176        returns the size of the pvs for the current view point. pass returns the
177        current pass of the evaluation.
178  */
179  virtual float GetPixelError(int &pvsSize, int pass);
180 
181  virtual void EvalPvsStat();
182
183  /** Prepare the pvs for rendering.
184  */
185  virtual void PreparePvs(const ObjectPvs &pvs);
186  /** Helper function that recursively prepares the indices for VBO renderin.
187  */
188  void _UpdatePvsIndices(KdNode *node, int &indexBufferSize);
189
190       
191  virtual void EvalPvsStat(const SimpleRayContainer &viewPoints);
192
193  virtual void InitGL();
194
195  virtual int GetWidth() const {return 0;}
196  virtual int GetHeight() const {return 0;}
197
198  unsigned int GetId(const unsigned char r,
199                                         const unsigned char g,
200                                         const unsigned char b) const;
201
202  inline const bool GetSnapErrorFrames() { return mSnapErrorFrames; }
203  inline const std::string GetSnapPrefix() { return mSnapPrefix; }
204
205  inline void SetSnapErrorFrames(bool snapframes) { mSnapErrorFrames = snapframes; }
206  inline void SetSnapPrefix(const std::string &pref) { mSnapPrefix = pref; }
207
208  virtual void ClearErrorBuffer();
209 
210  virtual float GetAvgPixelError() {
211        return mPvsStat.GetAvgError()*GetWidth()*GetHeight();
212  }
213
214  virtual float GetMaxPixelError() {
215          return mPvsStat.GetMaxError()*GetWidth()*GetHeight();
216  }
217
218  void SetViewPoint(const Vector3 &vp) { mViewPoint = vp; }
219  void SetViewDirection(const Vector3 &vd) { mViewDirection = vd; }
220
221  Vector3 GetViewPoint() const { return mViewPoint; }
222
223  bool GetUseVbos() const { return mUseVbos; }
224
225  /** Render pvs using false colors.
226  */
227  void _RenderColoredPvs(const ObjectPvs &pvs);
228
229public:
230
231        int mCurrentFrame;
232        int mFrame;
233        bool mWireFrame;
234
235        PvsRenderStatistics mPvsStat;
236
237        unsigned int mIndexBufferSize;
238
239        int mPvsStatFrames;
240        struct PvsErrorEntry {
241                PvsErrorEntry() {}
242                float mError;
243                int mPvsSize;
244                Vector3 mPosition;
245                Vector3 mDirection;
246        };
247
248        Preprocessor *GetPreprocessor();
249        /** quick hack in order to be able to render gvs based triangle pvs.
250        */
251        void RenderTrianglePvs();
252
253        void RenderVisTriangles();
254
255
256        ///////////////////
257
258        vector<PvsErrorEntry> mPvsErrorBuffer;
259
260        bool mComputeGVS;
261
262protected:
263
264        void CreateVertexArrays(SceneGraphLeaf *leaf);
265        void DeleteVbos();
266        void EnableDrawArrays();
267        void DisableDrawArrays();
268
269        void RenderKdLeaf(KdLeaf *leaf);
270
271       
272        //////////////////
273
274        PvsCache mPvsCache;
275
276        unsigned int mVboId;
277        vector<OcclusionQuery *> mOcclusionQueries;
278
279        ObjectContainer mObjects;
280
281        Vector3 mViewPoint;
282        Vector3 mViewDirection;
283
284        int timerId;
285        bool mUseFalseColors;
286        bool mUseForcedColors;
287
288        HaltonSequence halton;
289
290
291        bool mDetectEmptyViewSpace;
292        bool mSnapErrorFrames;
293
294        bool mRenderBoxes;
295
296        bool mUseGlLists;
297
298        std::string mSnapPrefix;
299
300        GLUquadric *mSphere;
301
302        KdTree *mKdTree;
303
304        Vector3 *mData;
305        unsigned int *mIndices;
306
307        bool mUseVbos;
308
309        int mRenderedNodes;
310
311        std::vector<RgbColor> mColors;
312};
313
314
315/* Class implementing an OpenGl render buffer.
316*/
317class GlRendererBuffer: public GlRenderer
318{
319
320public:
321
322        GlRendererBuffer(SceneGraph *sceneGraph,
323                                         ViewCellsManager *viewcells,
324                                         KdTree *tree);
325
326        virtual ~GlRendererBuffer();
327
328        /** Evaluates render cost of a point sample.
329        @param sample the render cost sample to be evaluated
330        @param useOcclusionQueries if occlusion queries should be used or item buffer
331        @param threshold number of pixels / samples from where an object is considered visible.
332        */
333        virtual void EvalRenderCostSample(RenderCostSample &sample,
334                const bool useOcclusionQueries,
335                const int threshold);
336
337        /** Evaluates render cost of a number of point samples. The point samples
338        are distributed uniformly over the defined view space.
339
340        @param numSamples the number of point samples taken
341        @param samples stores the taken point samples in a container
342        @param useOcclusionQueries if occlusion queries should be used or item buffer
343        @param threshold number of pixels / samples from where an object is considered visible.
344        */
345        virtual void SampleRenderCost(const int numSamples,
346                                                                  vector<RenderCostSample> &samples,
347                                                                  const bool useOcclusionQueries,
348                                                                  const int threshold = 0);
349        /** Implerment in subclasses.
350        */
351        virtual void EvalPvsStat();
352
353        virtual void EvalPvsStat(const SimpleRayContainer &viewPoints);
354
355        virtual int GetWidth() const = 0;
356        virtual int GetHeight() const  = 0;
357
358        virtual void MakeLive() = 0;
359        virtual void DoneLive() = 0;
360
361        virtual bool ValidViewPoint();
362
363        virtual void SampleBeamContributions(
364                                                                                 Intersectable *sourceObject,
365                                                                                 Beam &beam,
366                                                                                 const int samples,
367                                                                                 BeamSampleStatistics &stat
368                                                                                 );
369
370        virtual void SampleViewpointContributions(
371                                                                                          Intersectable *sourceObject,
372                                                                                          const Vector3 viewPoint,
373                                                                                          Beam &beam,
374                                                                                          const int desiredSamples,
375                                                                                          BeamSampleStatistics &stat
376                                                                                          );
377
378        virtual void InitGL();
379        /** Computes rays from information gained with hw sampling-
380        */
381        virtual void ComputeRays(Intersectable *sourceObj, VssRayContainer &rays);
382
383        virtual int ComputePvs() const = 0;
384
385        virtual int ComputePvs(ObjectContainer &objects, ObjectContainer &pvs) const = 0;
386
387
388protected:
389
390        unsigned int *mPixelBuffer;
391
392        static void GenQueries(int numQueries);
393
394        virtual void SetupProjectionForViewPoint(const Vector3 &viewPoint,
395                                                                                         const Beam &beam,
396                                                                                         Intersectable *sourceObject);
397        /** Evaluates query for one direction using item buffer.
398        */
399        virtual void EvalQueryWithItemBuffer();
400        /** Evaluates query for one direction using occlusion queries.
401        */
402        virtual void EvalQueryWithOcclusionQueries();
403};
404
405
406/** Abstract class for implmenenting a gl render widget.
407*/
408class GlRendererWidget: public GlRenderer
409{
410public:
411
412        GlRendererWidget(SceneGraph *sceneGraph, ViewCellsManager *vcm, KdTree *kdTree):
413          GlRenderer(sceneGraph, vcm, kdTree)
414          {}
415
416          GlRendererWidget() {}
417
418          virtual ~GlRendererWidget() {}
419         
420          virtual void Show() {}
421};
422
423
424};
425
426#endif
Note: See TracBrowser for help on using the repository browser.