source: GTP/trunk/Lib/Vis/Preprocessing/src/ViewCellsManager.h @ 1582

Revision 1582, 31.2 KB checked in by bittner, 18 years ago (diff)

ViewcellsManager? issue solved

Line 
1#ifndef _ViewCellsManager_H__
2#define _ViewCellsManager_H__
3
4#include "Ray.h"
5#include "VssRay.h"
6#include "Containers.h"
7#include "ViewCell.h"
8#include "ViewCellBsp.h"
9
10namespace GtpVisibilityPreprocessor {
11
12class ViewCell;
13class Intersectable;
14class RenderSimulator;
15class Renderer;
16class Mesh;
17struct Triangle3;
18class SimulationStatistics;
19class BspTree;
20class KdTree;
21class VspOspTree;
22class VspBspTree;
23class KdNode;
24class KdLeaf;
25class AxisAlignedBox3;
26class BspLeaf;
27class ViewCellsStatistics;
28class Exporter;
29class Beam;
30class Preprocessor;
31class ViewCellsTree;
32class MergeCandidate;
33class BoundingBoxConverter;
34class VspTree;
35class OspTree;
36class VspNode;
37class HierarchyManager;
38class BvHierarchy;
39class ViewCellsTree;
40
41struct AxisAlignedPlane;
42struct BspRay;
43
44
45/** Probably Visible Set
46*/
47class PrVs
48{
49public:
50  /// root of view cells tree
51  ViewCell *mViewCell;
52
53  // input parameter is the render budget for the PrVs
54  float mRenderBudget;
55
56  // some characteristic values could be stored as well
57};
58
59/**     Manages different higher order operations on the view cells.
60*/
61class ViewCellsManager
62{
63public:
64        struct PvsStatistics
65        {
66                int minPvs;
67                int maxPvs;
68                float avgPvs;
69                int viewcells;
70        };
71
72        /// view cell container types
73        enum {BSP, KD, VSP_KD, VSP_BSP, VSP_OSP};
74 
75        /// render cost evaluation type
76        enum {PER_OBJECT, PER_TRIANGLE};
77
78        friend class X3dViewCellsParseHandlers;
79        /** Default constructor.
80        */
81        ViewCellsManager(ViewCellsTree *viewCellsTree);
82
83        virtual ~ViewCellsManager();
84
85        /** Constructs view cells container taking a preprocessor
86                @returns the output rays (if not null)
87        */
88        int Construct(Preprocessor *preprocessor, VssRayContainer *outRays = NULL);
89
90        /** Constructs view cell container with a given number of samples.
91        */
92        virtual int ConstructSubdivision(
93                const ObjectContainer &objects,
94                const VssRayContainer &rays) = 0;
95
96        /** Computes sample contributions of the rays to the view cells PVS.
97       
98                @param rays bundle of rays used to find intersections with view cells and
99                adding the contribution
100                @param addRays true if rays should be added to the PVSs of the viewcells they
101                intersect
102                @param storeViewCells true if view cells should be stored in the ray
103        */
104        float ComputeSampleContributions(const VssRayContainer &rays,
105                                                                         const bool addContributions,
106                                                                         const bool storeViewCells);
107
108        /** Add sample contributions to the viewcells they intersect
109        */
110        void AddSampleContributions(const VssRayContainer &rays);
111 
112
113        /** Computes sample contribution of a simgle ray to the view cells PVS.
114                @param ray finds intersections with view cells and holds the contribution
115                @param addSample if sample should be added to the pvs
116                 
117                @returns number of sample contributions
118        */
119        virtual float ComputeSampleContribution(VssRay &ray,
120                                                                                        const bool addRays,
121                                                                                        const bool storeViewCells);
122
123        virtual void AddSampleContributions(VssRay &ray);
124
125        /** Prints out statistics of the view cells.
126        */
127        virtual void PrintStatistics(ostream &s) const;
128
129        /** Post processes view cells givemŽa number of rays.
130        */
131        virtual int PostProcess(const ObjectContainer &objects,
132                                                        const VssRayContainer &rays) = 0;
133
134        /** Show visualization of the view cells.
135        */
136        virtual void Visualize(const ObjectContainer &objects,
137                                                   const VssRayContainer &sampleRays) = 0;
138
139        /** type of the view cell container.
140        */
141        virtual int GetType() const = 0;
142
143        /** Load the input viewcells. The input viewcells should be given as a collection
144                of meshes. Each mesh is assume to form a bounded polyhedron
145                defining the interior of the viewcell. The view cells manager
146                is responsible for building a hierarchy over these view cells.
147               
148                @param filename file to load
149                @return true on success
150    */
151    virtual bool LoadViewCellsGeometry(const string filename, const bool extrudeBaseTriangle);
152       
153        /** Merges two view cells.
154                @note the piercing rays of the front and back will be ordered   
155                @returns new view cell based on the merging.
156        */
157        ViewCellInterior *MergeViewCells(ViewCell *front, ViewCell *back) const;
158
159        /** Merges a container of view cells.
160                @returns new view cell based on the merging.
161        */
162        ViewCellInterior *MergeViewCells(ViewCellContainer &children) const;
163       
164        /** Generates view cell of the type specified by this manager
165        */
166        virtual ViewCell *GenerateViewCell(Mesh *mesh = NULL) const = 0;
167
168        /** Constructs view cell from base triangle.
169                The view cell is extruded along the normal vector.
170                @param the base triangle
171                @param the height of the newly created view cell
172        */
173        ViewCell *ExtrudeViewCell(const Triangle3 &baseTri, const float height) const;
174
175        /** Sets maximal number of samples used for the
176                construction of the view cells.
177        */
178        void SetVisualizationSamples(const int visSamples);
179
180        /** Sets maximal number of samples used for the construction of the view cells.
181        */
182        void SetConstructionSamples(const int constructionSamples);
183
184        /** Sets maximal number of samples used for the visualization of the view cells.
185        */
186        void SetInitialSamples(const int initialSamples);
187
188        /** Sets maximal number of samples used for the post processing of the view cells.
189        */
190        void SetPostProcessSamples(const int postProcessingSamples);
191
192        /** See set.
193        */
194        int GetVisualizationSamples() const;
195
196        /** See set.
197        */
198        int GetConstructionSamples() const;
199
200        /** See set.
201        */
202        int GetPostProcessSamples() const;
203
204        /** Returns true if view cells are already constructed.
205        */
206        virtual bool ViewCellsConstructed() const = 0;
207
208        /** cast line segment to get a list of unique viewcells which are intersected
209                by this line segment
210        */
211 
212        virtual int CastLineSegment(const Vector3 &origin,
213                                                          const Vector3 &termination,
214                                                          ViewCellContainer &viewcells
215                                                          ) = 0;
216
217        /** Returns a stats about the global pvs.
218        */
219        virtual void GetPvsStatistics(PvsStatistics &stat);
220
221        virtual void GetPrVS(const Vector3 &viewPoint, PrVs &prvs, const float filterWidth);
222 
223        /** Get a viewcell containing the specified point
224                @param active if the active or elementary view cell should be returned.
225        */
226        virtual ViewCell *GetViewCell(const Vector3 &point, const bool active = false) const = 0;
227 
228        virtual void PrintPvsStatistics(ostream &s);
229
230        /** Updates pvs of the view cell hierarchy if necessary.
231        */
232        void UpdatePvs();
233
234        /** Returns probability that view point lies in one view cell.
235        */
236        virtual float GetProbability(ViewCell *viewCell) = 0;
237
238        /** Returns render cost of a single view cell given the render cost of an object.
239        */
240        float GetRendercost(ViewCell *viewCell) const;
241
242        /** Returns reference to container of loaded / generated view cells.
243        */
244        ViewCellContainer &GetViewCells();
245
246        /** Helper function used to split ray sets uniformly
247                into one that is currently used and the other that
248                is saved for later processing.
249                @param sourceRays the input ray set
250                @param maxSize the maximal number of rays that will be used
251                @param usedRays returns the used ray set
252                @param savedRays if not null, returns the saved ray set
253        */
254        void GetRaySets(const VssRayContainer &sourceRays,
255                                        const int maxSize,
256                                        VssRayContainer &usedRays,
257                                        VssRayContainer *savedRays = NULL) const;
258       
259        /** Returns accumulated area of all view cells.
260        */
261        float GetAccVcArea();
262
263        /** Returns area of one view cell.
264        */
265        virtual float GetArea(ViewCell *viewCell) const;
266
267        /** Returns volume of view cell.
268        */
269        virtual float GetVolume(ViewCell *viewCell) const;
270
271        /** Sets the current renderer mainly for view cells statistics.
272        */
273        void SetRenderer(Renderer *renderer);
274
275        /** Computes a (random) view point in the valid view space.
276                @returns true if valid view point was found
277        */
278        virtual bool GetViewPoint(Vector3 &viewPoint) const;
279
280        /** Returns true if this view point is in the valid view space.
281        */
282        virtual bool ViewPointValid(const Vector3 &viewPoint) const;
283
284        /** Sets a view space boundary.
285        */
286        void SetViewSpaceBox(const AxisAlignedBox3 &box);
287
288        AxisAlignedBox3 GetViewSpaceBox() const;
289
290        /** Creates mesh for this view cell.
291        */
292        virtual void CreateMesh(ViewCell *vc) = NULL;
293
294        /** Writes view cells to disc.
295        */
296        virtual bool ExportViewCells(const string filename,
297                                                                 const bool exportPvs,
298                                                                 const ObjectContainer &objects);
299
300        /** Casts beam to collect view cells.
301        */
302        virtual int CastBeam(Beam &beam);
303
304        /** Checks if view cell is considered as valid.
305        */
306        virtual bool CheckValidity(ViewCell *vc,
307                                                           int minPvsSize,
308                                                           int maxPvsSize) const;
309
310       
311        /** Sets validity of view cell
312        */
313        virtual void SetValidity(ViewCell *vc,
314                                                         int minPvsSize,
315                                                         int maxPvsSize) const;
316
317        /** sets validy of all viewcells
318        */
319        virtual void SetValidity(int minPvsSize,
320                                                         int maxPvsSize) const;
321
322
323        /** set valid viewcells in the range of pvs. sorts the viewcells
324          according to the pvs and then pickups those in the ranges
325          */
326        void SetValidityPercentage(const float minValid, const float maxValid);
327
328        /** Returns number of valid view cells.
329        */
330    int CountValidViewcells() const;
331
332        /** Returns maximal allowed pvs size.
333        */
334        int GetMaxPvsSize() const;
335
336        /** Returns maximal allowed pvs size.
337        */
338        int GetMinPvsSize() const;
339        /** Returns maximal ratio. i.e., currentPVs / maxPvs,
340                where pvs is still considered valid.
341        */
342        float GetMaxPvsRatio() const;
343        /** Exports view cell geometry.
344        */
345        virtual void ExportViewCellGeometry(
346                Exporter *exporter,
347                ViewCell *vc,
348                const AxisAlignedBox3 *box,
349                const AxisAlignedPlane *clipPlane = NULL
350                ) const = 0;
351
352        /** Brings the view cells into their final state, computes meshes and volume.
353        */
354        virtual void FinalizeViewCells(const bool createMesh);
355
356        /** Evaluates statistics values on view cells.
357        */
358        void EvaluateRenderStatistics(float &totalRenderCost,
359                                                                  float &expectedRenderCost,
360                                                                  float &deviation,
361                                                                  float &variance,
362                                                                  int &totalPvs,
363                                                                  float &avgRenderCost);
364
365
366        /** Returns hierarchy of the view cells.
367        */
368        ViewCellsTree *GetViewCellsTree();
369
370        /** Collect candidates for the view cell merge.
371        */
372        virtual void CollectMergeCandidates(const VssRayContainer &rays,
373                                                                                vector<MergeCandidate> &candidates);
374
375        /** Collects n view cells and stores it as the active view cells.
376        */
377        void CollectViewCells(const int n);
378
379        /** Sets current view cells set to active, i.e., the sampling is done in this view cell set.
380        */
381        void SetViewCellsActive();
382
383        /** Evaluates render cost statistics of current view cell hierarchy.
384        */
385        virtual void EvalViewCellPartition();
386
387        /** Sets maximal size of a view cell filter.
388        */
389        void SetMaxFilterSize(const int size);
390
391        /** Returns maximal filter size.
392        */
393        int GetMaxFilterSize() const;
394
395        /** Deletes interior nodes from the tree which have negative merge cost set (local merge).
396        */ 
397        void DeleteLocalMergeTree(ViewCell *vc) const;
398 
399        /** Evaluautes histogram for a given number of view cells.
400        */
401        void EvalViewCellHistogram(const string filename, const int nViewCells);
402
403        /** Evaluautes histogram for a given number of view cells.
404        */
405        void EvalViewCellHistogramForPvsSize(const string filename, const int nViewCells);
406
407        /** Evaluates the render cost of a view cell.
408        */
409        float EvalRenderCost(Intersectable *obj) const;
410   
411        /** Sets pvs size of view cell as a scalar. Used when storing pvs only in the leaves
412                of the hierarchy.
413        */
414        void UpdateScalarPvsSize(ViewCell *vc, const int pvsSize, const int entriesInPvs) const;
415
416        /** Returns bounding box of a view cell.
417        */
418        AxisAlignedBox3 GetViewCellBox(ViewCell *vc);
419
420        /** Exports bounding boxes of objects to file.
421        */
422        bool ExportBoundingBoxes(const string filename, const ObjectContainer &objects) const;
423   
424        /** Load the bounding boxes into the container.
425        */
426        bool LoadBoundingBoxes(const string filename, IndexedBoundingBoxContainer &boxes) const;
427
428        /** Returns true if pvs should be exported together with the view cells.
429        */
430        bool GetExportPvs() const;
431
432        /////////////////////////////
433        // static members
434       
435        /** Loads view cells from file. The view cells manager is created with
436                respect to the loaded view cells.
437
438                @param filename the filename of the view cells
439                @param objects the scene objects
440                @param finalizeViewCells if the view cells should be post processed, i.e.
441                        a mesh is created representing the geometry
442                @param bconverter a conversion routine working with the similarities of bounding
443                boxes: if there is a certain similarity of overlap between bounding boxes, two tested
444                candidate objects are considered to be the same objects
445                @returns the view cells manager if loading was successful, false otherwise
446        */
447        static ViewCellsManager *LoadViewCells(const string &filename,
448                                                                                   ObjectContainer *objects,
449                                                                                   const bool finalizeViewCells,
450                                                                                   BoundingBoxConverter *bconverter = NULL);
451
452
453        ////////////////////////////////////////////////////////7
454        // visiblity filter options
455
456        // TODO: write own visibiltiy filter class
457        void ApplyFilter(KdTree *kdTree,
458                                         const float viewSpaceFilterSize,
459                                         const float spatialFilterSize);
460
461        void ApplySpatialFilter(KdTree *kdTree,
462                                                        const float spatialFilterSize,
463                                                        ObjectPvs &pvs);
464
465         void ApplyFilter(ViewCell *viewCell,
466                                          KdTree *kdTree,
467                                          const float viewSpaceFilterSize,
468                                          const float spatialFilterSize,
469                                          ObjectPvs &pvs);
470
471        float GetFilterWidth();
472
473        float GetAbsFilterWidth();
474
475        /** Returns the bounding box of filter width.
476        */
477        AxisAlignedBox3 GetFilterBBox(const Vector3 &viewPoint, const float width) const;
478
479        //////////////////////////////////////////////////////////////////
480
481
482        /** Returns true if the view cell is equivalent to a
483                node of the spatial hierarchy. This function can be used for merged
484                view cell.
485                e.g. to see if the spatial tree can be reduced on this location
486                note: not implemented
487        */
488        virtual bool EqualToSpatialNode(ViewCell *viewCell) const;
489
490        /** If true, the kd nodes are stored instead of the object pvs.
491        */
492        void SetStoreKdPvs(const bool storeKdPvs);
493
494        /** Returns true if the kd nodes are stored instead of the object pvs.
495        **/
496        bool GetStoreKdPVs() const;
497
498        /** Adds a sample to the pvs of the specified view cell.
499                @param obj the hit object
500                @param hitPoint the point where the object is hit.
501                @param vc the sanpled view cell
502                @param pdf probability of the ray
503                @param contribution the relative pvs contribution
504                @returns true if the sample gives a contribution to the pvs.
505        */
506        virtual bool AddSampleToPvs(
507                Intersectable *obj,
508                const Vector3 &hitPoint,
509                ViewCell *vc,
510                const float pdf,
511                float &contribution) const;
512
513        /** Exports single view cells for visualization.
514                @param objects the scene objects
515                @param limit the maximal number of output view cells
516                @param sortViewCells if the view cells should be sorted by pvs size
517                @param exportPvs if the pvs should also be exported
518                @param exportRays if sample rays should be exported as well
519                @param maxRays maximum number of rays to export
520                @param prefix the prefix for the output file
521                @param visRays additional rays
522        */
523        virtual
524                void ExportSingleViewCells(
525                const ObjectContainer &objects,
526                const int maxViewCells,
527                const bool sortViewCells,
528                const bool exportPvs,
529                const bool exportRays,
530                const int maxRays,
531                const string prefix,
532                VssRayContainer *visRays = NULL) = NULL;
533
534       
535        void ViewCellsManager::ResetPvs();
536 
537  Preprocessor *GetPreprocessor() const {
538        return mPreprocessor;
539  }
540
541  void SetPreprocessor(Preprocessor *p) {
542        mPreprocessor = p;
543  }
544
545protected:
546
547        /** Intersects box with the tree and returns the number of intersected boxes.
548                @returns number of view cells found
549        */
550        virtual int ComputeBoxIntersections(const AxisAlignedBox3 &box,
551                                                                                ViewCellContainer &viewCells) const;
552
553        /** Tests the visibility filter functionality.
554        */
555        virtual void TestFilter(const ObjectContainer &objects) {};
556
557        /** If the view cells tree was already constructed or not.
558        */
559        bool ViewCellsTreeConstructed() const;
560
561        /** Requests preprocessor to cast samplesPerPass samples of a specific type.
562        */
563        int CastPassSamples(const int samplesPerPass,
564                                                const int sampleType,
565                                                VssRayContainer &vssRays) const;
566
567        /** Parse the options from the environment file.
568        */
569        void ParseEnvironment();
570
571        /** Creates unique view cell ids.
572        */
573        void CreateUniqueViewCellIds();
574
575        /** Finalizes, i.e., creates mesh, volume, area etc. for the view cell.
576        */
577        virtual void Finalize(ViewCell *viewCell, const bool createMesh);
578
579        /** Recollects view cells and resets statistics.
580        */
581        void ResetViewCells();
582       
583        /** Collects the view cells in the view cell container.
584        */
585        virtual void CollectViewCells() = 0;
586       
587        /** Evaluates view cells statistics and stores it in
588                mViewCellsStatistics.
589        */
590        void EvaluateViewCellsStats();
591
592       
593        ///////////////////////
594        //-- helper functions for view cell visualization
595
596        /** Exports the view cell partition.
597        */
598        void ExportViewCellsForViz(
599                Exporter *exporter,
600                const AxisAlignedBox3 *box,
601                const AxisAlignedPlane *clipPlane = NULL,
602                const bool colorCode = 0) const;
603
604        /** Sets exporter color.
605        */
606        virtual void ExportColor(Exporter *exporter, ViewCell *vc, const bool colorCode) const;
607       
608        /** Creates meshes from the view cells.
609        */
610        void CreateViewCellMeshes();
611
612    /** Creates clip plane for visualization.
613        */
614        void CreateClipPlane();
615
616        AxisAlignedPlane *GetClipPlane();
617       
618        void ExportMergedViewCells(const ObjectContainer &objects);
619
620        ///////////////////////
621
622        /** Returns volume of the view space.
623        */
624        virtual float GetViewSpaceVolume();
625        /** Prepares the view cells for sampling after loading them from disc.
626        */
627        virtual void PrepareLoadedViewCells() {};
628        /** Constructs local view cell merge hierarchy.
629        */
630        ViewCell *ConstructLocalMergeTree(ViewCell *currentViewCell,
631                                                                          const ViewCellContainer &viewCells);
632
633        /** Constructs local view cell merge hierarchy based solely on similarity with the
634                current viewcell
635        */
636        ViewCell *ConstructLocalMergeTree2(ViewCell *currentViewCell,
637                                                                           const ViewCellContainer &viewCells);
638 
639        /** Updates pvs of all view cells for statistical evaluation after some more sampling
640        */
641        void UpdatePvsForEvaluation(ViewCell *root, ObjectPvs &pvs);
642
643
644 
645        ////////////////////////////////////////////////
646
647        Preprocessor *mPreprocessor;
648        /// if bounding boxes should be exported together with the view cells
649        bool mExportBboxesForPvs;
650        /// the clip plane for visualization
651        AxisAlignedPlane mClipPlaneForViz;
652        /// if the visualization is using the clip plane
653        bool mUseClipPlaneForViz;
654        /// Renders the view cells.
655        Renderer *mRenderer;
656        /// Loaded view cells
657        ViewCellContainer mViewCells;
658        /// the view cell hierarchy (i.e., the logical description of view cells)
659        ViewCellsTree *mViewCellsTree;
660       
661        /** if the values in the view cell leaves and the interiors are up to date
662                this is meant for lazy storing of the pvs, where only a scalar indicating
663                pvs size is stored in interiors and not the pvs itself.
664        */
665        bool mViewCellPvsIsUpdated;
666
667        /// maximum number of samples for the view cell construction
668        int mConstructionSamples;
669        int mSamplesPerPass;
670        int mInitialSamples;
671        int mPostProcessSamples;
672        int mVisualizationSamples;
673
674        float mTotalAreaValid;
675        float mTotalArea;
676
677        int mMaxPvsSize;
678        int mMinPvsSize;
679        float mMaxPvsRatio;
680
681        int mSamplingType;
682        int mEvaluationSamplingType;
683        int mNumActiveViewCells;
684        bool mCompressViewCells;
685
686        /// holds the current view cell statistics
687        ViewCellsStatistics mCurrentViewCellsStats;
688        /// the scene bounding box
689        AxisAlignedBox3 mViewSpaceBox;
690       
691        /// if view cells should be exported
692        bool mExportViewCells;
693
694        // if only valid view cells should be considered for processing
695        bool mOnlyValidViewCells;
696
697        /// if rays should be used to collect merge candidates
698        bool mUseRaysForMerge;
699
700        /// if there should be an additional merge step after the subdivision
701        bool mMergeViewCells;
702
703        /// the width of the box filter
704        float mFilterWidth;
705        /// Maximal size of the filter in terms of contributing view cells
706        int mMaxFilterSize;
707       
708        // only for debugging
709VssRayContainer storedRays;
710        //////////////////
711        //-- visualization options
712       
713        /// color code for view cells visualization
714        bool mShowVisualization;
715        int mColorCode;
716        bool mExportGeometry;
717        bool mExportRays;
718        bool mViewCellsFinished;
719        bool mEvaluateViewCells;
720        int mRenderCostEvaluationType;
721
722        /// if pvs should be exported with view cells
723        bool mExportPvs;
724
725        bool mUsePredefinedViewCells;
726};
727
728
729/** Manages different higher order operations on the view cells.
730*/
731class BspViewCellsManager: public ViewCellsManager
732{
733
734public:
735        /** Constructor taking the bsp tree and the number of samples
736                used to construct the bsp tree.
737        */
738        BspViewCellsManager(ViewCellsTree *viewCellsTree, BspTree *tree);
739
740        ~BspViewCellsManager();
741
742        int ConstructSubdivision(const ObjectContainer &objects,
743                                  const VssRayContainer &rays);
744
745        int PostProcess(const ObjectContainer &objects,
746                                        const VssRayContainer &rays);
747
748        void Visualize(const ObjectContainer &objects,
749                                   const VssRayContainer &sampleRays);
750
751        int GetType() const;
752       
753        ViewCell *GenerateViewCell(Mesh *mesh = NULL) const;
754
755        bool ViewCellsConstructed() const;
756
757        //void PrintStatistics(ostream &s) const;
758
759        int CastLineSegment(const Vector3 &origin,
760                                                const Vector3 &termination,
761                                                ViewCellContainer &viewcells);
762       
763        /** Returns the probability that the view point lies
764                in this view cells.
765        */
766        float GetProbability(ViewCell *viewCell);
767
768        /** Get a viewcell containing the specified point.
769        */
770        ViewCell *GetViewCell(const Vector3 &point, const bool active = false) const;
771
772        /** Creates mesh for this view cell.
773        */
774        void CreateMesh(ViewCell *vc);
775
776        void ExportViewCellGeometry(Exporter *exporter,
777                                                                ViewCell *vc,
778                                                                const AxisAlignedBox3 *box,
779                                                                const AxisAlignedPlane *clipPlane = NULL
780                                                                ) const;
781       
782        void CollectMergeCandidates(const VssRayContainer &rays,
783                                                                vector<MergeCandidate> &candidates);
784
785        void Finalize(ViewCell *viewCell, const bool createMesh);
786
787        bool ExportViewCells(const string filename,
788                                                 const bool exportPvs,
789                                                 const ObjectContainer &objects);
790
791        /** Constructs merge hierarchy which corresponds to the spatial hierarchy.
792        */
793        ViewCell *ConstructSpatialMergeTree(BspNode *root);
794
795        void ExportSingleViewCells(
796                const ObjectContainer &objects,
797                const int maxViewCells,
798                const bool sortViewCells,
799                const bool exportPvs,
800                const bool exportRays,
801                const int maxRays,
802                const string prefix,
803                VssRayContainer *visRays = NULL);
804
805protected:
806
807        void CollectViewCells();
808       
809        /// the BSP tree.
810        BspTree *mBspTree;
811        vector<BspRay *> mBspRays;
812
813private:
814
815        /** Constructs a spatial merge tree only 2 levels deep.
816        */
817        ViewCell *ConstructDummyMergeTree(BspNode *root);
818
819        /** Exports visualization of the BSP splits.
820        */
821        void ExportSplits(const ObjectContainer &objects);
822
823        /** test if subdivision is valid in terms of volume / area.
824        */
825        void TestSubdivision();
826};
827
828
829/**
830        Manages different higher order operations on the KD type view cells.
831*/
832class KdViewCellsManager: public ViewCellsManager
833{
834
835public:
836
837        KdViewCellsManager(ViewCellsTree *viewCellsTree, KdTree *tree);
838
839        int ConstructSubdivision(const ObjectContainer &objects,
840                                  const VssRayContainer &rays);
841
842        int CastLineSegment(const Vector3 &origin,
843                                                const Vector3 &termination,
844                                                ViewCellContainer &viewcells);
845
846        int PostProcess(const ObjectContainer &objects,
847                                        const VssRayContainer &rays);
848
849        void Visualize(const ObjectContainer &objects,
850                                   const VssRayContainer &sampleRays);
851
852        int GetType() const;
853
854        bool ViewCellsConstructed() const;
855
856        ViewCell *GenerateViewCell(Mesh *mesh) const;
857
858        /** Prints out statistics of this approach.
859        */
860        //  virtual void PrintStatistics(ostream &s) const;
861        ViewCell *GetViewCell(const Vector3 &point, const bool active = false) const
862        { return NULL; }
863
864        float GetProbability(ViewCell *viewCell);
865       
866        void CreateMesh(ViewCell *vc);
867
868        void ExportViewCellGeometry(
869                Exporter *exporter,
870                ViewCell *vc,
871                const AxisAlignedBox3 *box,
872                const AxisAlignedPlane *clipPlane = NULL
873                ) const;
874
875
876        void CollectMergeCandidates(const VssRayContainer &rays,
877                                                                vector<MergeCandidate> &candidates);
878
879        void ExportSingleViewCells(
880                const ObjectContainer &objects,
881                const int maxViewCells,
882                const bool sortViewCells,
883                const bool exportPvs,
884                const bool exportRays,
885                const int maxRays,
886                const string prefix,
887                VssRayContainer *visRays = NULL);
888
889protected:
890
891        /** Collects view cells from a hierarchy.
892        */
893        void CollectViewCells();
894
895        KdNode *GetNodeForPvs(KdLeaf *leaf);
896
897        ////////////////////////////////////////
898
899        /// the BSP tree.
900        KdTree *mKdTree;
901
902        /// depth of the KD tree nodes with represent the view cells
903        int mKdPvsDepth;
904
905
906};
907
908
909/** Manages different higher order operations on the view cells.
910*/
911class VspBspViewCellsManager: public ViewCellsManager
912{
913
914public:
915
916        VspBspViewCellsManager(ViewCellsTree *viewCellsTree, VspBspTree *tree);
917        ~VspBspViewCellsManager();
918
919        int ConstructSubdivision(const ObjectContainer &objects,
920                                  const VssRayContainer &rays);
921
922        int PostProcess(const ObjectContainer &objects,
923                                        const VssRayContainer &rays);
924
925        void Visualize(const ObjectContainer &objects,
926                                   const VssRayContainer &sampleRays);
927
928        int GetType() const;
929       
930        ViewCell *GenerateViewCell(Mesh *mesh = NULL) const;
931
932        bool ViewCellsConstructed() const;
933
934       
935        int CastLineSegment(const Vector3 &origin,
936                                                const Vector3 &termination,
937                                                ViewCellContainer &viewcells);
938
939        float GetProbability(ViewCell *viewCell);
940       
941        ViewCell *GetViewCell(const Vector3 &point, const bool active = false) const;
942
943        bool GetViewPoint(Vector3 &viewPoint) const;
944
945        bool ViewPointValid(const Vector3 &viewPoint) const;
946
947        void CreateMesh(ViewCell *vc);
948
949        bool ExportViewCells(
950                const string filename,
951                const bool exportPvs,
952                const ObjectContainer &objects);
953
954        int CastBeam(Beam &beam);
955       
956        void ExportViewCellGeometry(
957                Exporter *exporter,
958                ViewCell *vc,
959                const AxisAlignedBox3 *box,
960                const AxisAlignedPlane *clipPlane = NULL
961                ) const;
962
963
964        void Finalize(ViewCell *viewCell, const bool createMesh);
965
966        void CollectMergeCandidates(const VssRayContainer &rays, vector<MergeCandidate> &candidates);
967
968        /** Returns true if this view cell is equivavalent to a spatial node.
969        */
970        bool EqualToSpatialNode(ViewCell *viewCell) const;
971
972
973        void ExportSingleViewCells(
974                const ObjectContainer &objects,
975                const int maxViewCells,
976                const bool sortViewCells,
977                const bool exportPvs,
978                const bool exportRays,
979                const int maxRays,
980                const string prefix,
981                VssRayContainer *visRays = NULL);
982
983
984protected:
985
986        int ComputeBoxIntersections(const AxisAlignedBox3 &box, ViewCellContainer &viewCells) const;
987       
988        /** Returns node of the spatial hierarchy corresponding to the view cell
989                if such a node exists.
990        */
991        BspNode *GetSpatialNode(ViewCell *viewCell) const;
992
993        /** Merges view cells according to some criteria
994        */
995        void MergeViewCells(const VssRayContainer &rays,
996                                                const ObjectContainer &objects);
997       
998        void RefineViewCells(const VssRayContainer &rays, const ObjectContainer &objects);
999
1000        void CollectViewCells();
1001
1002        /** Returns maximal depth difference of view cell
1003                leaves in tree.
1004        */
1005        int GetMaxTreeDiff(ViewCell *vc) const;
1006
1007        /** Prepare view cells for use after loading them from disc.
1008        */
1009        void PrepareLoadedViewCells();
1010
1011        /** Constructs merge hierarchy which corresponds to the spatial hierarchy.
1012        */
1013        ViewCell *ConstructSpatialMergeTree(BspNode *root);
1014
1015        /// HACK for testing visibility filter functionality
1016        void TestFilter(const ObjectContainer &objects);
1017
1018        /** Visualization of the pvs difference to exact visubility using
1019                from point queries.
1020        */
1021        void VisualizeWithFromPointQueries();
1022
1023        /** Evaluate from point queries for the current scene.
1024        */
1025        void EvalFromPointQueries();
1026
1027        /** Exports visualization of the BSP splits.
1028        */
1029        void ExportSplits(const ObjectContainer &objects,
1030                                          const VssRayContainer &rays);
1031
1032        /// the view space partition BSP tree.
1033        VspBspTree *mVspBspTree;
1034
1035
1036private:
1037
1038        /** test if subdivision is valid in terms of volume / area.
1039        */
1040        void TestSubdivision();
1041};
1042
1043#define TEST_EVALUATION 1
1044
1045/**
1046        Manages different higher order operations on the view cells.
1047*/
1048class VspOspViewCellsManager: public ViewCellsManager
1049{
1050
1051public:
1052
1053        VspOspViewCellsManager(ViewCellsTree *vcTree, HierarchyManager *hm);
1054       
1055        ~VspOspViewCellsManager();
1056
1057        int ConstructSubdivision(const ObjectContainer &objects,
1058                                                         const VssRayContainer &rays);
1059
1060        int PostProcess(const ObjectContainer &objects,
1061                                        const VssRayContainer &rays);
1062
1063        void Visualize(const ObjectContainer &objects,
1064                                   const VssRayContainer &sampleRays);
1065
1066        int GetType() const;
1067       
1068        ViewCell *GenerateViewCell(Mesh *mesh = NULL) const;
1069
1070        bool ViewCellsConstructed() const;
1071
1072       
1073        int CastLineSegment(const Vector3 &origin,
1074                                                const Vector3 &termination,
1075                                                ViewCellContainer &viewcells);
1076
1077        float GetProbability(ViewCell *viewCell);
1078       
1079        ViewCell *GetViewCell(const Vector3 &point, const bool active = false) const;
1080
1081        bool GetViewPoint(Vector3 &viewPoint) const;
1082
1083        bool ViewPointValid(const Vector3 &viewPoint) const;
1084
1085        void CreateMesh(ViewCell *vc);
1086
1087        bool ExportViewCells(const string filename,
1088                                                 const bool exportPvs,
1089                                                 const ObjectContainer &objects);
1090
1091        int CastBeam(Beam &beam);
1092
1093        void Finalize(ViewCell *viewCell, const bool createMesh);
1094
1095        /** Stores sample contribution for kd cells or objects.
1096        */
1097        virtual float ComputeSampleContribution(VssRay &ray,
1098                                                                                        const bool addRays,
1099                                                                                        const bool storeViewCells);
1100
1101        ViewCellsManager *LoadViewCells(const string &filename,
1102                ObjectContainer *objects,
1103                const bool finalizeViewCells,
1104                BoundingBoxConverter *bconverter);
1105
1106        bool AddSampleToPvs(
1107                Intersectable *obj,
1108                const Vector3 &hitPoint,
1109                ViewCell *vc,
1110                const float pdf,
1111        float &contribution) const;
1112
1113        void ExportSingleViewCells(
1114                const ObjectContainer &objects,
1115                const int maxViewCells,
1116                const bool sortViewCells,
1117                const bool exportPvs,
1118                const bool exportRays,
1119                const int maxRays,
1120                const string prefix,
1121                VssRayContainer *visRays = NULL);
1122
1123protected:
1124
1125#if TEST_EVALUATION
1126        virtual void EvalViewCellPartition();
1127#endif
1128
1129        /** Exports view cell geometry.
1130        */
1131        void ExportViewCellGeometry(
1132                Exporter *exporter,
1133                ViewCell *vc,
1134                const AxisAlignedBox3 *box,
1135                const AxisAlignedPlane *clipPlane = NULL
1136                ) const;
1137
1138        int ComputeBoxIntersections(
1139                const AxisAlignedBox3 &box,
1140                ViewCellContainer &viewCells) const;
1141       
1142        void CollectViewCells();
1143
1144        /** Prepare view cells for use after loading them from disc.
1145        */
1146        void PrepareLoadedViewCells();
1147
1148        /** Constructs merge hierarchy which corresponds to the spatial hierarchy.
1149        */
1150        ViewCell *ConstructSpatialMergeTree(VspNode *root);
1151
1152        /** Exports visualization of the PVS.
1153        */
1154        void ExportPvs(
1155                const ObjectContainer &objects,
1156                const VssRayContainer &rays);
1157
1158
1159        /////////////////////////////////////////
1160
1161        HierarchyManager *mHierarchyManager;
1162};
1163
1164
1165}
1166
1167#endif
Note: See TracBrowser for help on using the repository browser.