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

Revision 1608, 30.6 KB checked in by bittner, 18 years ago (diff)

vsp osp tests

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