source: trunk/VUT/GtpVisibilityPreprocessor/src/ViewCellsManager.h @ 463

Revision 463, 9.8 KB checked in by bittner, 19 years ago (diff)

removed mT from vss ray

Line 
1#ifndef _ViewCellsManager_H__
2#define _ViewCellsManager_H__
3
4#include "Ray.h"
5#include "VssRay.h"
6#include "Containers.h"
7
8class ViewCell;
9class Intersectable;
10class RenderSimulator;
11class Mesh;
12struct Triangle3;
13class SimulationStatistics;
14class BspTree;
15class KdTree;
16class VspKdTree;
17class VspBspTree;
18class KdNode;
19class KdLeaf;
20class VspKdTree;
21class AxisAlignedBox3;
22class BspLeaf;
23
24/**
25        Manages different higher order operations on the view cells.
26*/
27class ViewCellsManager
28{
29
30public:
31       
32        /// view cell container types
33        enum {BSP, KD, VSP_KD, VSP_BSP};
34
35        /** Constructor taking the maximal number of samples used for construction
36        */
37        ViewCellsManager(const int constructionSamples);
38
39        ViewCellsManager();
40
41        virtual ~ViewCellsManager();
42
43        /** Constructs view cell container with a given number of samples.
44        */
45        virtual int Construct(const ObjectContainer &objects,
46                                                  const VssRayContainer &rays,
47                                                  AxisAlignedBox3 *sceneBbox = NULL) = 0;
48
49        /** Computes sample contributions of the rays to the view cells PVS.
50       
51                @param rays bundle of rays used to find intersections with view cells and
52                adding the contribution
53                @param castRays true if ray should be cast to gain the information, false if rays
54                already hold the view cells intersection information and need not be recast.
55                @param sampleContributions returns the number of sample contributions
56                @param contributingSamples returns the number of contributingSamples
57        */
58        void  ComputeSampleContributions(const RayContainer &rays,
59                                                                         int &sampleContributions,
60                                                                         int &contributingSamples,
61                                                                         const bool castRays = true);
62
63
64        /** Computes sample contribution of a simgle ray to the view cells PVS.
65                @param ray finds intersections with view cells and holds the contribution
66                @param castRay true if ray should be cast to gain the information, false if ray
67                is already holding the information and need not be recast.
68
69                @returns number of sample contributions
70        */
71        virtual int ComputeSampleContributions(Ray &ray, const bool castRay = true) = 0;
72
73        /** Prints out statistics of the view cells.
74        */
75        virtual void PrintStatistics(ostream &s) const = 0;
76
77        /** Post processes view cells givemŽa number of rays.
78        */
79        virtual int PostProcess(const ObjectContainer &objects,
80                                                        const RayContainer &rays) = 0;
81
82        /** Show visualization of the view cells.
83        */
84        virtual void Visualize(const ObjectContainer &objects,
85                                                   const RayContainer &sampleRays) = 0;
86
87        /** type of the view cell container.
88        */
89        virtual int GetType() const = 0;
90
91        /** Simulates rendering with the given view cell partition.
92                @returns render time statistics
93        */
94        SimulationStatistics SimulateRendering() const;
95
96        /** Load the input viewcells. The input viewcells should be given as a collection
97                of meshes. Each mesh is assume to form a bounded polyhedron defining the interior of
98                the viewcell. The method then builds a BSP tree of these view cells.
99               
100                @param filename file to load
101                @return true on success
102    */
103    bool LoadViewCells(const string filename);
104
105        /** Constructs view cell from base triangle. The ViewCell is extruded along the normal vector.
106                @param the base triangle
107                @param the height of the newly created view cell
108        */
109        ViewCell *ExtrudeViewCell(const Triangle3 &baseTri, const float height) const;
110
111        /** Merges two view cells.
112                @note the piercing rays of the front and back will be ordered   
113                @returns new view cell based on the merging.
114        */
115        ViewCell *MergeViewCells(ViewCell &front, ViewCell &back) const;
116       
117        /** Generates view cell of type specified by this manager
118        */
119        virtual ViewCell *GenerateViewCell(Mesh *mesh = NULL) const;
120
121        /** Adds a new view cell to the list of predefined view cells.
122        */
123        void AddViewCell(ViewCell *viewCell);
124
125        /** Derive view cells from objects.
126        */
127        void DeriveViewCells(const ObjectContainer &objects,
128                                                 ViewCellContainer &viewCells,
129                                                 const int maxViewCells) const;
130
131        /** Sets maximal number of samples used for the
132                construction of the view cells.
133        */
134        void SetVisualizationSamples(const int visSamples);
135
136        /** Sets maximal number of samples used for the visualization of the view cells.
137        */
138        void SetConstructionSamples(const int constructionSamples);
139
140        /** Sets maximal number of samples used for the post processing of the view cells.
141        */
142        void SetPostProcessSamples(const int postProcessingSamples);
143
144        /** See set.
145        */
146        int GetVisualizationSamples() const;
147
148        /** See set.
149        */
150        int GetConstructionSamples() const;
151
152        /** See set.
153        */
154        int GetPostProcessSamples() const;
155
156        /** Returns true if view cells wer already constructed.
157        */
158        virtual bool ViewCellsConstructed() const = 0;
159               
160
161protected:
162       
163       
164
165        /** Initialises the render time simulator.
166        */
167        void InitRenderSimulator();
168        /////////////////////
169
170       
171        /// the view cell corresponding to unbounded space
172        ViewCell *mUnbounded;
173
174        /// Simulates rendering
175        RenderSimulator *mRenderSimulator;
176
177        /// Loaded view cells
178        ViewCellContainer mViewCells;
179
180        /// maximum number of samples taken for construction of the view cells
181        int mConstructionSamples;
182        int mPostProcessSamples;
183        int mVisualizationSamples;
184
185        //-- thresholds used for view cells merge
186        int mMinPvsDif;
187        int mMinPvs;
188        int mMaxPvs;
189};
190
191
192
193/**
194        Manages different higher order operations on the view cells.
195*/
196class BspViewCellsManager: public ViewCellsManager
197{
198
199public:
200
201        BspViewCellsManager(BspTree *tree, int constructionSamples);
202
203        int Construct(const ObjectContainer &objects,
204                                  const VssRayContainer &rays,
205                                  AxisAlignedBox3 *sceneBbox);
206
207        int ComputeSampleContributions(Ray &ray, const bool castRay = false);
208
209        int PostProcess(const ObjectContainer &objects,
210                                        const RayContainer &rays);
211
212        void Visualize(const ObjectContainer &objects,
213                                   const RayContainer &sampleRays);
214
215        int GetType() const;
216       
217        ViewCell *GenerateViewCell(Mesh *mesh = NULL) const;
218
219        bool ViewCellsConstructed() const;
220
221        void PrintStatistics(ostream &s) const;
222
223        ~BspViewCellsManager();
224protected:
225
226        /** Merges view cells front and back leaf view cell.
227        */
228        bool MergeBspLeafViewCells(BspLeaf *front, BspLeaf *back) const;
229
230        /** Returns true if front and back leaf should be merged.
231        */
232        bool ShouldMerge(BspLeaf *front, BspLeaf *back) const;
233
234        /// the BSP tree.
235        BspTree *mBspTree;
236
237
238private:
239
240
241        /** Exports visualization of the BSP splits.
242        */
243        void ExportSplits(const ObjectContainer &objects, const RayContainer &sampleRays);
244
245        /** Exports visualization of the BSP PVS.
246        */
247        void ExportBspPvs(const ObjectContainer &objects, const RayContainer &sampleRays);
248
249};
250
251/**
252        Manages different higher order operations on the KD type view cells.
253*/
254class KdViewCellsManager: public ViewCellsManager
255{
256
257public:
258
259        KdViewCellsManager(KdTree *tree);
260
261        int Construct(const ObjectContainer &objects,
262                                  const VssRayContainer &rays,
263                                  AxisAlignedBox3 *sceneBbox);
264
265        int CastRay(const Ray &ray);
266
267        int PostProcess(const ObjectContainer &objects,
268                                        const RayContainer &rays);
269
270        void Visualize(const ObjectContainer &objects,
271                                   const RayContainer &sampleRays);
272
273        int GetType() const;
274
275        bool ViewCellsConstructed() const;
276
277
278        /** Prints out statistics of this approach.
279        */
280        virtual void PrintStatistics(ostream &s) const;
281
282protected:
283
284         KdNode *GetNodeForPvs(KdLeaf *leaf);
285
286         int ComputeSampleContributions(Ray &ray, const bool castRay = true);
287
288         /// the BSP tree.
289         KdTree *mKdTree;
290
291         /// depth of the KD tree nodes with represent the view cells
292         int mKdPvsDepth;
293};
294
295/**
296        Manages different higher order operations on the view cells
297        for vsp kd tree view cells.
298*/
299class VspKdViewCellsManager: public ViewCellsManager
300{
301
302public:
303
304        VspKdViewCellsManager(VspKdTree *vspKdTree, int constructionSamples);
305
306        ~VspKdViewCellsManager();
307
308        int Construct(const ObjectContainer &objects,
309                                  const VssRayContainer &rays,
310                                  AxisAlignedBox3 *sceneBbox);
311
312        int ComputeSampleContributions(Ray &ray, const bool castRay = true);
313
314        int PostProcess(const ObjectContainer &objects,
315                                        const RayContainer &rays);
316
317        void Visualize(const ObjectContainer &objects,
318                                   const RayContainer &sampleRays);
319
320        int GetType() const;
321       
322        bool ViewCellsConstructed() const;
323
324        virtual void PrintStatistics(ostream &s) const;
325
326        ViewCell *GenerateViewCell(Mesh *mesh) const;
327
328protected:
329
330        /// the BSP tree.
331        VspKdTree *mVspKdTree;
332};
333
334
335
336/**
337        Manages different higher order operations on the view cells.
338*/
339class VspBspViewCellsManager: public ViewCellsManager
340{
341
342public:
343
344        VspBspViewCellsManager(VspBspTree *tree, int constructionSamples);
345
346        ~VspBspViewCellsManager();
347
348        int Construct(const ObjectContainer &objects,
349                                  const VssRayContainer &rays,
350                                  AxisAlignedBox3 *sceneBbox);
351
352        int ComputeSampleContributions(Ray &ray, const bool castRay = false);
353
354        int PostProcess(const ObjectContainer &objects,
355                                        const RayContainer &rays);
356
357        void Visualize(const ObjectContainer &objects,
358                                   const RayContainer &sampleRays);
359
360        int GetType() const;
361       
362        ViewCell *GenerateViewCell(Mesh *mesh = NULL) const;
363
364        bool ViewCellsConstructed() const;
365
366        void PrintStatistics(ostream &s) const;
367
368protected:
369
370        /** Merges view cells front and back leaf view cell.
371        */
372        bool MergeVspBspLeafViewCells(BspLeaf *front, BspLeaf *back) const;
373
374        /** Returns true if front and back leaf should be merged.
375        */
376        bool ShouldMerge(BspLeaf *front, BspLeaf *back) const;
377
378        /// the view space partition BSP tree.
379        VspBspTree *mVspBspTree;
380
381
382private:
383
384
385        /** Exports visualization of the BSP splits.
386        */
387        void ExportSplits(const ObjectContainer &objects, const RayContainer &sampleRays);
388
389        /** Exports visualization of the BSP PVS.
390        */
391        void ExportBspPvs(const ObjectContainer &objects, const RayContainer &sampleRays);
392
393};
394
395#endif
Note: See TracBrowser for help on using the repository browser.