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

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