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

Revision 1603, 30.6 KB checked in by mattausch, 18 years ago (diff)
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        /** If true, the kd nodes are stored instead of the object pvs.
482        */
483        void SetStoreKdPvs(const bool storeKdPvs);
484
485        /** Returns true if the kd nodes are stored instead of the object pvs.
486        **/
487        bool GetStoreKdPVs() const;
488
489        /** Adds a sample to the pvs of the specified view cell.
490                @param obj the hit object
491                @param hitPoint the point where the object is hit.
492                @param vc the sanpled view cell
493                @param pdf probability of the ray
494                @param contribution the relative pvs contribution
495                @returns true if the sample gives a contribution to the pvs.
496        */
497        virtual bool AddSampleToPvs(
498                Intersectable *obj,
499                const Vector3 &hitPoint,
500                ViewCell *vc,
501                const float pdf,
502                float &contribution) const;
503
504        /** Exports single view cells for visualization.
505                @param objects the scene objects
506                @param limit the maximal number of output view cells
507                @param sortViewCells if the view cells should be sorted by pvs size
508                @param exportPvs if the pvs should also be exported
509                @param exportRays if sample rays should be exported as well
510                @param maxRays maximum number of rays to export
511                @param prefix the prefix for the output file
512                @param visRays additional rays
513        */
514        virtual
515                void ExportSingleViewCells(
516                const ObjectContainer &objects,
517                const int maxViewCells,
518                const bool sortViewCells,
519                const bool exportPvs,
520                const bool exportRays,
521                const int maxRays,
522                const string prefix,
523                VssRayContainer *visRays = NULL) = NULL;
524
525       
526        void ViewCellsManager::ResetPvs();
527 
528  Preprocessor *GetPreprocessor() const {
529        return mPreprocessor;
530  }
531
532  void SetPreprocessor(Preprocessor *p) {
533        mPreprocessor = p;
534  }
535
536protected:
537
538        /** Intersects box with the tree and returns the number of intersected boxes.
539                @returns number of view cells found
540        */
541        virtual int ComputeBoxIntersections(const AxisAlignedBox3 &box,
542                                                                                ViewCellContainer &viewCells) const;
543
544        /** Tests the visibility filter functionality.
545        */
546        virtual void TestFilter(const ObjectContainer &objects) {};
547
548        /** If the view cells tree was already constructed or not.
549        */
550        bool ViewCellsTreeConstructed() const;
551
552        /** Requests preprocessor to cast samplesPerPass samples of a specific type.
553        */
554        int CastPassSamples(const int samplesPerPass,
555                                                const int sampleType,
556                                                VssRayContainer &vssRays) const;
557
558        /** Parse the options from the environment file.
559        */
560        void ParseEnvironment();
561
562        /** Creates unique view cell ids.
563        */
564        void CreateUniqueViewCellIds();
565
566        /** Finalizes, i.e., creates mesh, volume, area etc. for the view cell.
567        */
568        virtual void Finalize(ViewCell *viewCell, const bool createMesh);
569
570        /** Recollects view cells and resets statistics.
571        */
572        void ResetViewCells();
573       
574        /** Collects the view cells in the view cell container.
575        */
576        virtual void CollectViewCells() = 0;
577       
578        /** Evaluates view cells statistics and stores it in
579                mViewCellsStatistics.
580        */
581        void EvaluateViewCellsStats();
582
583       
584        ///////////////////////
585        //-- helper functions for view cell visualization
586
587        /** Exports the view cell partition.
588        */
589        void ExportViewCellsForViz(
590                Exporter *exporter,
591                const AxisAlignedBox3 *box,
592                const AxisAlignedPlane *clipPlane = NULL,
593                const bool colorCode = 0) const;
594
595        /** Sets exporter color.
596        */
597        virtual void ExportColor(Exporter *exporter, ViewCell *vc, const bool colorCode) const;
598       
599        /** Creates meshes from the view cells.
600        */
601        void CreateViewCellMeshes();
602
603    /** Creates clip plane for visualization.
604        */
605        void CreateClipPlane();
606
607        AxisAlignedPlane *GetClipPlane();
608       
609        void ExportMergedViewCells(const ObjectContainer &objects);
610
611        ///////////////////////
612
613        /** Returns volume of the view space.
614        */
615        virtual float GetViewSpaceVolume();
616        /** Prepares the view cells for sampling after loading them from disc.
617        */
618        virtual void PrepareLoadedViewCells() {};
619        /** Constructs local view cell merge hierarchy.
620        */
621        ViewCell *ConstructLocalMergeTree(ViewCell *currentViewCell,
622                                                                          const ViewCellContainer &viewCells);
623
624        /** Constructs local view cell merge hierarchy based solely on similarity with the
625                current viewcell
626        */
627        ViewCell *ConstructLocalMergeTree2(ViewCell *currentViewCell,
628                                                                           const ViewCellContainer &viewCells);
629 
630        /** Updates pvs of all view cells for statistical evaluation after some more sampling
631        */
632        void UpdatePvsForEvaluation(ViewCell *root, ObjectPvs &pvs);
633
634
635 
636        ////////////////////////////////////////////////
637
638        Preprocessor *mPreprocessor;
639        /// if bounding boxes should be exported together with the view cells
640        bool mExportBboxesForPvs;
641        /// the clip plane for visualization
642        AxisAlignedPlane mClipPlaneForViz;
643        /// if the visualization is using the clip plane
644        bool mUseClipPlaneForViz;
645        /// Renders the view cells.
646        Renderer *mRenderer;
647        /// Loaded view cells
648        ViewCellContainer mViewCells;
649        /// the view cell hierarchy (i.e., the logical description of view cells)
650        ViewCellsTree *mViewCellsTree;
651       
652        /** if the values in the view cell leaves and the interiors are up to date
653                this is meant for lazy storing of the pvs, where only a scalar indicating
654                pvs size is stored in interiors and not the pvs itself.
655        */
656        bool mViewCellPvsIsUpdated;
657
658        /// maximum number of samples for the view cell construction
659        int mConstructionSamples;
660        int mSamplesPerPass;
661        int mInitialSamples;
662        int mPostProcessSamples;
663        int mVisualizationSamples;
664
665        float mTotalAreaValid;
666        float mTotalArea;
667
668        int mMaxPvsSize;
669        int mMinPvsSize;
670        float mMaxPvsRatio;
671
672        int mSamplingType;
673        int mEvaluationSamplingType;
674        int mNumActiveViewCells;
675        bool mCompressViewCells;
676
677        /// holds the current view cell statistics
678        ViewCellsStatistics mCurrentViewCellsStats;
679        /// the scene bounding box
680        AxisAlignedBox3 mViewSpaceBox;
681       
682        /// if view cells should be exported
683        bool mExportViewCells;
684
685        // if only valid view cells should be considered for processing
686        bool mOnlyValidViewCells;
687
688        /// if rays should be used to collect merge candidates
689        bool mUseRaysForMerge;
690
691        /// if there should be an additional merge step after the subdivision
692        bool mMergeViewCells;
693
694        /// the width of the box filter
695        float mFilterWidth;
696        /// Maximal size of the filter in terms of contributing view cells
697        int mMaxFilterSize;
698       
699        // only for debugging
700VssRayContainer storedRays;
701        //////////////////
702        //-- visualization options
703       
704        /// color code for view cells visualization
705        bool mShowVisualization;
706        int mColorCode;
707        bool mExportGeometry;
708        bool mExportRays;
709        bool mViewCellsFinished;
710        bool mEvaluateViewCells;
711        int mRenderCostEvaluationType;
712
713        /// if pvs should be exported with view cells
714        bool mExportPvs;
715
716        bool mUsePredefinedViewCells;
717};
718
719
720/** Manages different higher order operations on the view cells.
721*/
722class BspViewCellsManager: public ViewCellsManager
723{
724
725public:
726        /** Constructor taking the bsp tree and the number of samples
727                used to construct the bsp tree.
728        */
729        BspViewCellsManager(ViewCellsTree *viewCellsTree, BspTree *tree);
730
731        ~BspViewCellsManager();
732
733        int ConstructSubdivision(const ObjectContainer &objects,
734                                  const VssRayContainer &rays);
735
736        int PostProcess(const ObjectContainer &objects,
737                                        const VssRayContainer &rays);
738
739        void Visualize(const ObjectContainer &objects,
740                                   const VssRayContainer &sampleRays);
741
742        int GetType() const;
743       
744        ViewCell *GenerateViewCell(Mesh *mesh = NULL) const;
745
746        bool ViewCellsConstructed() const;
747
748        //void PrintStatistics(ostream &s) const;
749
750        int CastLineSegment(const Vector3 &origin,
751                                                const Vector3 &termination,
752                                                ViewCellContainer &viewcells);
753       
754        /** Returns the probability that the view point lies
755                in this view cells.
756        */
757        float GetProbability(ViewCell *viewCell);
758
759        /** Get a viewcell containing the specified point.
760        */
761        ViewCell *GetViewCell(const Vector3 &point, const bool active = false) const;
762
763        /** Creates mesh for this view cell.
764        */
765        void CreateMesh(ViewCell *vc);
766
767        void ExportViewCellGeometry(Exporter *exporter,
768                                                                ViewCell *vc,
769                                                                const AxisAlignedBox3 *box,
770                                                                const AxisAlignedPlane *clipPlane = NULL
771                                                                ) const;
772       
773        void CollectMergeCandidates(const VssRayContainer &rays,
774                                                                vector<MergeCandidate> &candidates);
775
776        void Finalize(ViewCell *viewCell, const bool createMesh);
777
778        bool ExportViewCells(const string filename,
779                                                 const bool exportPvs,
780                                                 const ObjectContainer &objects);
781
782        /** Constructs merge hierarchy which corresponds to the spatial hierarchy.
783        */
784        ViewCell *ConstructSpatialMergeTree(BspNode *root);
785
786        void ExportSingleViewCells(
787                const ObjectContainer &objects,
788                const int maxViewCells,
789                const bool sortViewCells,
790                const bool exportPvs,
791                const bool exportRays,
792                const int maxRays,
793                const string prefix,
794                VssRayContainer *visRays = NULL);
795
796protected:
797
798        void CollectViewCells();
799       
800        /// the BSP tree.
801        BspTree *mBspTree;
802        vector<BspRay *> mBspRays;
803
804private:
805
806        /** Constructs a spatial merge tree only 2 levels deep.
807        */
808        ViewCell *ConstructDummyMergeTree(BspNode *root);
809
810        /** Exports visualization of the BSP splits.
811        */
812        void ExportSplits(const ObjectContainer &objects);
813
814        /** test if subdivision is valid in terms of volume / area.
815        */
816        void TestSubdivision();
817};
818
819
820/**
821        Manages different higher order operations on the KD type view cells.
822*/
823class KdViewCellsManager: public ViewCellsManager
824{
825
826public:
827
828        KdViewCellsManager(ViewCellsTree *viewCellsTree, KdTree *tree);
829
830        int ConstructSubdivision(const ObjectContainer &objects,
831                                  const VssRayContainer &rays);
832
833        int CastLineSegment(const Vector3 &origin,
834                                                const Vector3 &termination,
835                                                ViewCellContainer &viewcells);
836
837        int PostProcess(const ObjectContainer &objects,
838                                        const VssRayContainer &rays);
839
840        void Visualize(const ObjectContainer &objects,
841                                   const VssRayContainer &sampleRays);
842
843        int GetType() const;
844
845        bool ViewCellsConstructed() const;
846
847        ViewCell *GenerateViewCell(Mesh *mesh) const;
848
849        /** Prints out statistics of this approach.
850        */
851        //  virtual void PrintStatistics(ostream &s) const;
852        ViewCell *GetViewCell(const Vector3 &point, const bool active = false) const
853        { return NULL; }
854
855        float GetProbability(ViewCell *viewCell);
856       
857        void CreateMesh(ViewCell *vc);
858
859        void ExportViewCellGeometry(
860                Exporter *exporter,
861                ViewCell *vc,
862                const AxisAlignedBox3 *box,
863                const AxisAlignedPlane *clipPlane = NULL
864                ) const;
865
866
867        void CollectMergeCandidates(const VssRayContainer &rays,
868                                                                vector<MergeCandidate> &candidates);
869
870        void ExportSingleViewCells(
871                const ObjectContainer &objects,
872                const int maxViewCells,
873                const bool sortViewCells,
874                const bool exportPvs,
875                const bool exportRays,
876                const int maxRays,
877                const string prefix,
878                VssRayContainer *visRays = NULL);
879
880protected:
881
882        /** Collects view cells from a hierarchy.
883        */
884        void CollectViewCells();
885
886        KdNode *GetNodeForPvs(KdLeaf *leaf);
887
888        ////////////////////////////////////////
889
890        /// the BSP tree.
891        KdTree *mKdTree;
892
893        /// depth of the KD tree nodes with represent the view cells
894        int mKdPvsDepth;
895
896
897};
898
899
900/** Manages different higher order operations on the view cells.
901*/
902class VspBspViewCellsManager: public ViewCellsManager
903{
904
905public:
906
907        VspBspViewCellsManager(ViewCellsTree *viewCellsTree, VspBspTree *tree);
908        ~VspBspViewCellsManager();
909
910        int ConstructSubdivision(const ObjectContainer &objects,
911                                  const VssRayContainer &rays);
912
913        int PostProcess(const ObjectContainer &objects,
914                                        const VssRayContainer &rays);
915
916        void Visualize(const ObjectContainer &objects,
917                                   const VssRayContainer &sampleRays);
918
919        int GetType() const;
920       
921        ViewCell *GenerateViewCell(Mesh *mesh = NULL) const;
922
923        bool ViewCellsConstructed() const;
924
925       
926        int CastLineSegment(const Vector3 &origin,
927                                                const Vector3 &termination,
928                                                ViewCellContainer &viewcells);
929
930        float GetProbability(ViewCell *viewCell);
931       
932        ViewCell *GetViewCell(const Vector3 &point, const bool active = false) const;
933
934        bool GetViewPoint(Vector3 &viewPoint) const;
935
936        bool ViewPointValid(const Vector3 &viewPoint) const;
937
938        void CreateMesh(ViewCell *vc);
939
940        bool ExportViewCells(
941                const string filename,
942                const bool exportPvs,
943                const ObjectContainer &objects);
944
945        int CastBeam(Beam &beam);
946       
947        void ExportViewCellGeometry(
948                Exporter *exporter,
949                ViewCell *vc,
950                const AxisAlignedBox3 *box,
951                const AxisAlignedPlane *clipPlane = NULL
952                ) const;
953
954
955        void Finalize(ViewCell *viewCell, const bool createMesh);
956
957        void CollectMergeCandidates(const VssRayContainer &rays, vector<MergeCandidate> &candidates);
958
959        void ExportSingleViewCells(
960                const ObjectContainer &objects,
961                const int maxViewCells,
962                const bool sortViewCells,
963                const bool exportPvs,
964                const bool exportRays,
965                const int maxRays,
966                const string prefix,
967                VssRayContainer *visRays = NULL);
968
969
970protected:
971
972        int ComputeBoxIntersections(const AxisAlignedBox3 &box, ViewCellContainer &viewCells) const;
973       
974        /** Merges view cells according to some criteria
975        */
976        void MergeViewCells(const VssRayContainer &rays,
977                                                const ObjectContainer &objects);
978       
979        void RefineViewCells(const VssRayContainer &rays, const ObjectContainer &objects);
980
981        void CollectViewCells();
982
983        /** Returns maximal depth difference of view cell
984                leaves in tree.
985        */
986        int GetMaxTreeDiff(ViewCell *vc) const;
987
988        /** Prepare view cells for use after loading them from disc.
989        */
990        void PrepareLoadedViewCells();
991
992        /** Constructs merge hierarchy which corresponds to the spatial hierarchy.
993        */
994        ViewCell *ConstructSpatialMergeTree(BspNode *root);
995
996        /// HACK for testing visibility filter functionality
997        void TestFilter(const ObjectContainer &objects);
998
999        /** Visualization of the pvs difference to exact visubility using
1000                from point queries.
1001        */
1002        void VisualizeWithFromPointQueries();
1003
1004        /** Evaluate from point queries for the current scene.
1005        */
1006        void EvalFromPointQueries();
1007
1008        /** Exports visualization of the BSP splits.
1009        */
1010        void ExportSplits(const ObjectContainer &objects,
1011                                          const VssRayContainer &rays);
1012
1013        /// the view space partition BSP tree.
1014        VspBspTree *mVspBspTree;
1015
1016
1017private:
1018
1019        /** test if subdivision is valid in terms of volume / area.
1020        */
1021        void TestSubdivision();
1022};
1023
1024#define TEST_EVALUATION 1
1025
1026/**
1027        Manages different higher order operations on the view cells.
1028*/
1029class VspOspViewCellsManager: public ViewCellsManager
1030{
1031
1032public:
1033
1034        VspOspViewCellsManager(ViewCellsTree *vcTree, HierarchyManager *hm);
1035       
1036        ~VspOspViewCellsManager();
1037
1038        int ConstructSubdivision(const ObjectContainer &objects,
1039                                                         const VssRayContainer &rays);
1040
1041        int PostProcess(const ObjectContainer &objects,
1042                                        const VssRayContainer &rays);
1043
1044        void Visualize(const ObjectContainer &objects,
1045                                   const VssRayContainer &sampleRays);
1046
1047        int GetType() const;
1048       
1049        ViewCell *GenerateViewCell(Mesh *mesh = NULL) const;
1050
1051        bool ViewCellsConstructed() const;
1052
1053       
1054        int CastLineSegment(const Vector3 &origin,
1055                                                const Vector3 &termination,
1056                                                ViewCellContainer &viewcells);
1057
1058        float GetProbability(ViewCell *viewCell);
1059       
1060        ViewCell *GetViewCell(const Vector3 &point, const bool active = false) const;
1061
1062        bool GetViewPoint(Vector3 &viewPoint) const;
1063
1064        bool ViewPointValid(const Vector3 &viewPoint) const;
1065
1066        void CreateMesh(ViewCell *vc);
1067
1068        bool ExportViewCells(const string filename,
1069                                                 const bool exportPvs,
1070                                                 const ObjectContainer &objects);
1071
1072        int CastBeam(Beam &beam);
1073
1074        void Finalize(ViewCell *viewCell, const bool createMesh);
1075
1076        /** Stores sample contribution for kd cells or objects.
1077        */
1078        virtual float ComputeSampleContribution(VssRay &ray,
1079                                                                                        const bool addRays,
1080                                                                                        const bool storeViewCells);
1081
1082        ViewCellsManager *LoadViewCells(const string &filename,
1083                ObjectContainer *objects,
1084                const bool finalizeViewCells,
1085                BoundingBoxConverter *bconverter);
1086
1087        bool AddSampleToPvs(
1088                Intersectable *obj,
1089                const Vector3 &hitPoint,
1090                ViewCell *vc,
1091                const float pdf,
1092        float &contribution) const;
1093
1094        void ExportSingleViewCells(
1095                const ObjectContainer &objects,
1096                const int maxViewCells,
1097                const bool sortViewCells,
1098                const bool exportPvs,
1099                const bool exportRays,
1100                const int maxRays,
1101                const string prefix,
1102                VssRayContainer *visRays = NULL);
1103
1104protected:
1105
1106#if TEST_EVALUATION
1107        virtual void EvalViewCellPartition();
1108#endif
1109
1110        /** Exports view cell geometry.
1111        */
1112        void ExportViewCellGeometry(
1113                Exporter *exporter,
1114                ViewCell *vc,
1115                const AxisAlignedBox3 *box,
1116                const AxisAlignedPlane *clipPlane = NULL
1117                ) const;
1118
1119        int ComputeBoxIntersections(
1120                const AxisAlignedBox3 &box,
1121                ViewCellContainer &viewCells) const;
1122       
1123        void CollectViewCells();
1124
1125        /** Prepare view cells for use after loading them from disc.
1126        */
1127        void PrepareLoadedViewCells();
1128
1129        /** Constructs merge hierarchy which corresponds to the spatial hierarchy.
1130        */
1131        ViewCell *ConstructSpatialMergeTree(VspNode *root);
1132
1133        /** Exports visualization of the PVS.
1134        */
1135        void ExportPvs(
1136                const ObjectContainer &objects,
1137                const VssRayContainer &rays);
1138
1139
1140        /////////////////////////////////////////
1141
1142        HierarchyManager *mHierarchyManager;
1143};
1144
1145
1146}
1147
1148#endif
Note: See TracBrowser for help on using the repository browser.