source: GTP/trunk/Lib/Vis/Preprocessing/src/VspBspTree.h @ 1084

Revision 1084, 25.3 KB checked in by mattausch, 18 years ago (diff)
Line 
1#ifndef _VspBspTree_H__
2#define _VspBspTree_H__
3
4#include "Mesh.h"
5#include "Containers.h"
6#include "Polygon3.h"
7#include <stack>
8#include "Statistics.h"
9#include "VssRay.h"
10#include "RayInfo.h"
11#include "ViewCellBsp.h"
12
13
14
15namespace GtpVisibilityPreprocessor {
16
17class ViewCellLeaf;
18//class BspViewCell;
19class Plane3;
20class VspBspTree; 
21class BspInterior;
22class BspNode;
23class AxisAlignedBox3;
24class Ray;
25class ViewCellsStatistics;
26class ViewCellsManager;
27class MergeCandidate;
28class Beam;
29class ViewCellsTree;
30//class Environment;
31
32/**
33        This is a view space partitioning specialised BSPtree. 
34        There are no polygon splits, but we split the sample rays.
35        The candidates for the next split plane are evaluated only
36        by checking the sampled visibility information.
37        The polygons are employed merely as candidates for the next split planes.
38*/
39class VspBspTree
40{
41        friend class ViewCellsParseHandlers;
42        friend class VspBspViewCellsManager;
43public:
44       
45        /** Additional data which is passed down the BSP tree during traversal.
46        */
47        class VspBspTraversalData
48        { 
49        public:
50                /// the current node
51                BspNode *mNode;
52                /// polygonal data for splitting
53                PolygonContainer *mPolygons;
54                /// current depth
55                int mDepth;
56                /// rays piercing this node
57                RayInfoContainer *mRays;
58                /// the probability that this node contains view point
59                float mProbability;
60                /// geometry of node as induced by planes
61                BspNodeGeometry *mGeometry;
62                /// pvs size
63                int mPvs;
64                /// how often this branch has missed the max-cost ratio
65                int mMaxCostMisses;
66                /// if this node is a kd-node (i.e., boundaries are axis aligned
67                bool mIsKdNode;
68                // current axis
69                int mAxis;
70                // current priority
71                float mPriority;
72
73               
74                /** Returns average ray contribution.
75                */
76                float GetAvgRayContribution() const
77                {
78                        return (float)mPvs / ((float)mRays->size() + Limits::Small);
79                }
80
81
82                VspBspTraversalData():
83                mNode(NULL),
84                mPolygons(NULL),
85                mDepth(0),
86                mRays(NULL),
87                mPvs(0),
88                mProbability(0.0),
89                mGeometry(NULL),
90                mMaxCostMisses(0),
91                mIsKdNode(false),
92                mPriority(0),
93                mAxis(0)
94                {}
95               
96                VspBspTraversalData(BspNode *node,
97                                                        PolygonContainer *polys,
98                                                        const int depth,
99                                                        RayInfoContainer *rays,
100                                                        const int pvs,
101                                                        const float p,
102                                                        BspNodeGeometry *geom):
103                mNode(node),
104                mPolygons(polys),
105                mDepth(depth),
106                mRays(rays),
107                mPvs(pvs),
108                mProbability(p),
109                mGeometry(geom),
110                mMaxCostMisses(0),
111                mIsKdNode(false),
112                mPriority(0),
113                mAxis(0)
114                {}
115
116                VspBspTraversalData(PolygonContainer *polys,
117                                                        const int depth,
118                                                        RayInfoContainer *rays,
119                                                        BspNodeGeometry *geom):
120                mNode(NULL),
121                mPolygons(polys),
122                mDepth(depth),
123                mRays(rays),
124                mPvs(0),
125                mProbability(0),
126                mGeometry(geom),
127                mMaxCostMisses(0),
128                mIsKdNode(false),
129                mAxis(0)
130                {}
131
132                /** Returns priority of the traversal data.
133                */
134                float GetCost() const
135                {
136                        //cout << mPriority << endl;
137                        return mPriority;
138                }
139
140                // deletes contents and sets them to NULL
141                void Clear()
142                {
143                        DEL_PTR(mPolygons);
144                        DEL_PTR(mRays);
145                        DEL_PTR(mGeometry);
146                }
147
148                friend bool operator<(const VspBspTraversalData &a, const VspBspTraversalData &b)
149                {
150                        return a.GetCost() < b.GetCost();
151                }
152    };
153       
154
155        typedef std::priority_queue<VspBspTraversalData> VspBspTraversalQueue;
156       
157       
158        struct VspBspSplitCandidate
159        { 
160                /// the current split plane
161                Plane3 mSplitPlane;
162                /// split axis of this plane (0, 1, 2, or 3 if non-axis-aligned)
163                int mSplitAxis;
164                /// the number of misses of max cost ratio until this split
165                int mMaxCostMisses;
166
167                // parent data
168                VspBspTraversalData mParentData;
169                // prioriry of this split
170                float mPriority;
171
172                VspBspSplitCandidate(): mPriority(0)
173                {};
174
175                VspBspSplitCandidate(const Plane3 &plane, const VspBspTraversalData &tData):
176                mSplitPlane(plane), mParentData(tData), mPriority(0)
177                {}
178
179                /** Returns cost of the traversal data.
180                */
181                float GetPriority() const
182                {
183#if 1
184                        return mPriority;
185#else
186                        return (float) (-mDepth); // for kd tree
187#endif
188                }
189
190                friend bool operator<(const VspBspSplitCandidate &a, const VspBspSplitCandidate &b)
191                {
192                        return a.GetPriority() < b.GetPriority();
193                }
194    };
195
196        typedef std::priority_queue<VspBspSplitCandidate> VspBspSplitQueue;
197
198        /** Default constructor creating an empty tree.
199        */
200        VspBspTree();
201
202        /** Default destructor.
203        */
204        ~VspBspTree();
205
206        /** Returns BSP Tree statistics.
207        */
208        const BspTreeStatistics &GetStatistics() const;
209 
210
211        /** Constructs the tree from a given set of rays.
212                @param sampleRays the set of sample rays the construction is based on
213                @param forcedBoundingBox overwrites the view space box
214        */
215        void Construct(const VssRayContainer &sampleRays,
216                                   AxisAlignedBox3 *forcedBoundingBox);
217
218        /** Returns list of BSP leaves with pvs smaller than
219                a certain threshold.
220                @param onlyUnmailed if only the unmailed leaves should be considered
221                @param maxPvs the maximal pvs of a leaf to be added (-1 means unlimited)
222        */
223        void CollectLeaves(vector<BspLeaf *> &leaves,
224                                           const bool onlyUnmailed = false,
225                                           const int maxPvs = -1) const;
226
227        /** Returns box which bounds the whole tree.
228        */
229        AxisAlignedBox3 GetBoundingBox() const;
230
231        /** Returns root of BSP tree.
232        */
233        BspNode *GetRoot() const;
234
235        /** Collects the leaf view cells of the tree
236                @param viewCells returns the view cells
237        */
238        void CollectViewCells(ViewCellContainer &viewCells, bool onlyValid) const;
239
240        /** A ray is cast possible intersecting the tree.
241                @param the ray that is cast.
242                @returns the number of intersections with objects stored in the tree.
243        */
244        int CastRay(Ray &ray);
245
246        /// bsp tree construction types
247        enum {FROM_INPUT_VIEW_CELLS, FROM_SCENE_GEOMETRY, FROM_SAMPLES};
248
249        /** finds neighbouring leaves of this tree node.
250        */
251        int FindNeighbors(BspNode *n,
252                                          vector<BspLeaf *> &neighbors,
253                                          const bool onlyUnmailed) const;
254
255        /** Constructs geometry associated with the half space intersections
256                leading to this node.
257        */
258        void ConstructGeometry(BspNode *n, BspNodeGeometry &geom) const;
259       
260        /** Construct geometry of view cell.
261        */
262        void ConstructGeometry(ViewCell *vc, BspNodeGeometry &geom) const;
263
264        /** Returns random leaf of BSP tree.
265                @param halfspace defines the halfspace from which the leaf is taken.
266        */
267        BspLeaf *GetRandomLeaf(const Plane3 &halfspace);
268
269        /** Returns random leaf of BSP tree.
270                @param onlyUnmailed if only unmailed leaves should be returned.
271        */
272        BspLeaf *GetRandomLeaf(const bool onlyUnmailed = false);
273
274        /** Returns epsilon of this tree.
275        */
276        float GetEpsilon() const;
277
278        /** Casts line segment into the tree.
279                @param origin the origin of the line segment
280                @param termination the end point of the line segment
281                @returns view cells intersecting the line segment.
282        */
283    int CastLineSegment(const Vector3 &origin,
284                                                const Vector3 &termination,
285                                                ViewCellContainer &viewcells);
286
287               
288        /** Sets pointer to view cells manager.
289        */
290        void SetViewCellsManager(ViewCellsManager *vcm);
291
292        /** Returns distance from node 1 to node 2.
293        */
294        int TreeDistance(BspNode *n1, BspNode *n2) const;
295
296        /** Collapses the tree with respect to the view cell partition.
297                @returns number of collapsed nodes
298        */
299        int CollapseTree();
300
301        /** Returns view cell the current point is located in.
302                @param point the current view point
303                @param active if currently active view cells should be returned or
304                elementary view cell
305        */
306        ViewCell *GetViewCell(const Vector3 &point, const bool active = false);
307
308
309        /** Returns true if this view point is in a valid view space,
310                false otherwise.
311        */
312        bool ViewPointValid(const Vector3 &viewPoint) const;
313
314        /** Returns view cell corresponding to
315                the invalid view space.
316        */
317        BspViewCell *GetOutOfBoundsCell();
318
319        /** Writes tree to output stream
320        */
321#if ZIPPED_VIEWCELLS
322        bool Export(ogzstream &stream);
323#else
324        bool Export(ofstream &stream);
325#endif
326
327        /** Casts beam, i.e. a 5D frustum of rays, into tree.
328                Tests conservative using the bounding box of the nodes.
329                @returns number of view cells it intersected
330        */
331        int CastBeam(Beam &beam);
332
333        /** Finds approximate neighbours, i.e., finds correct neighbors
334                in most cases but sometimes more.
335        */
336        int FindApproximateNeighbors(BspNode *n,
337                                                             vector<BspLeaf *> &neighbors,
338                                                                 const bool onlyUnmailed) const;
339
340        /** Checks if tree validity-flags are right
341                with respect to view cell valitiy.
342                If not, marks subtree as invalid.
343        */
344        void ValidateTree();
345
346        /** Invalid view cells are added to the unbounded space
347        */
348        void CollapseViewCells();
349
350        /** Collects rays stored in the leaves.
351        */
352        void CollectRays(VssRayContainer &rays);
353
354        /** Intersects box with the tree and returns the number of intersected boxes.
355                @returns number of view cells found
356        */
357        int ComputeBoxIntersections(const AxisAlignedBox3 &box, ViewCellContainer &viewCells) const;
358
359        /// pointer to the hierarchy of view cells
360        ViewCellsTree *mViewCellsTree;
361
362
363protected:
364
365        // --------------------------------------------------------------
366        // For sorting objects
367        // --------------------------------------------------------------
368        struct SortableEntry
369        {
370                enum EType
371                {
372                        ERayMin,
373                        ERayMax
374                };
375
376                int type;
377                float value;
378                VssRay *ray;
379 
380                SortableEntry() {}
381                SortableEntry(const int t, const float v, VssRay *r):type(t),
382                                          value(v), ray(r)
383                {
384                }
385               
386                friend bool operator<(const SortableEntry &a, const SortableEntry &b)
387                {
388                        return a.value < b.value;
389                }
390        };
391
392        void ComputeBoundingBox(const VssRayContainer &sampleRays,
393                                                        AxisAlignedBox3 *forcedBoundingBox);
394
395        /** faster evaluation of split plane cost for kd axis aligned cells.
396        */
397        float EvalAxisAlignedSplitCost(const VspBspTraversalData &data,
398                                                                   const AxisAlignedBox3 &box,
399                                                                   const int axis,
400                                                                   const float &position,
401                                                                   float &pFront,
402                                                                   float &pBack) const;
403
404        /** Evaluates candidate for splitting.
405        */
406        void EvalSplitCandidate(VspBspTraversalData &tData, VspBspSplitCandidate &splitData);
407
408        /** Computes priority of the traversal data and stores it in tData.
409        */
410        void EvalPriority(VspBspTraversalData &tData) const;
411
412        /** Evaluates render cost decrease of next split.
413        */
414        float EvalRenderCostDecrease(const Plane3 &candidatePlane,
415                                                                 const VspBspTraversalData &data) const;
416
417        /** Constructs tree using the split priority queue.
418        */
419        void ConstructWithSplitQueue(const PolygonContainer &polys, RayInfoContainer *rays);
420
421        /** Collects view cells in the subtree under root.
422        */
423        void CollectViewCells(BspNode *root,
424                                                  bool onlyValid,
425                                                  ViewCellContainer &viewCells,
426                                                  bool onlyUnmailed = false) const;
427
428        /** Returns view cell corresponding to
429                the invalid view space. If it does not exist, it is created.
430        */
431        BspViewCell *GetOrCreateOutOfBoundsCell();
432
433        /** Collapses the tree with respect to the view cell partition,
434                i.e. leaves having the same view cell are collapsed.
435                @param node the root of the subtree to be collapsed
436                @param collapsed returns the number of collapsed nodes
437                @returns node of type leaf if the node could be collapsed,
438                this node otherwise
439        */
440        BspNode *CollapseTree(BspNode *node, int &collapsed);
441
442        /** Helper function revalidating the view cell leaf list after merge.
443        */
444        void RepairViewCellsLeafLists();
445
446        /** Evaluates tree stats in the BSP tree leafs.
447        */
448        void EvaluateLeafStats(const VspBspTraversalData &data);
449
450        /** Subdivides node with respect to the traversal data.
451            @param tStack current traversal stack
452                @param tData traversal data also holding node to be subdivided
453                @returns new root of the subtree
454        */
455        BspNode *Subdivide(VspBspTraversalQueue &tStack,
456                                           VspBspTraversalData &tData);
457
458        /** Subdivides node using a best split priority queue.
459            @param tQueue the best split priority queue
460                @param splitCandidate the candidate for the next split
461                @returns new root of the subtree
462        */
463        BspNode *Subdivide(VspBspSplitQueue &tQueue,
464                                           VspBspSplitCandidate &splitCandidate);
465
466        /** Constructs the tree from the given traversal data.
467                @param polys stores set of polygons on which subdivision may be based
468                @param rays stores set of rays on which subdivision may be based
469        */
470        void Construct(const PolygonContainer &polys, RayInfoContainer *rays);
471
472        /** Selects the best possible splitting plane.
473                @param plane returns the split plane
474                @param leaf the leaf to be split
475                @param data the traversal data holding the polygons and rays which the split decision is based
476                @param frontData the front node traversal data (which may be updated to avoid repcomputations
477                @param backData the front node traversal data (which may be updated to avoid repcomputations
478                @param splitAxis 0 - 2 if axis aligned split, 3 if polygon-aligned split
479
480                @note the polygons can be reordered in the process
481               
482                @returns true if the cost of the split is under maxCostRatio
483
484        */
485        bool SelectPlane(Plane3 &plane,
486                                         BspLeaf *leaf,
487                                         VspBspTraversalData &data,
488                                         VspBspTraversalData &frontData,
489                                         VspBspTraversalData &backData,
490                                         int &splitAxis);
491       
492        /** Strategies where the effect of the split plane is tested
493            on all input rays.
494
495                @returns the cost of the candidate split plane
496        */
497        float EvalSplitPlaneCost(const Plane3 &candidatePlane,
498                                                         const VspBspTraversalData &data,
499                                                         BspNodeGeometry &geomFront,
500                                                         BspNodeGeometry &geomBack,
501                                                         float &pFront,
502                                                         float &pBack) const;
503
504        /** Subdivides leaf.
505                       
506                @param tData data object holding, e.g., a pointer to the leaf
507                @param frontData returns the data (e.g.,  pointer to the leaf) in front of the split plane
508                @param backData returns the data (e.g.,  pointer to the leaf) in the back of the split plane
509               
510                @param rays the polygons to be filtered
511                @param frontRays returns the polygons in front of the split plane
512                @param coincident returns the polygons which are coincident to the plane and thus discarded
513                for traversal
514
515                @returns the root of the subdivision
516        */
517
518        BspInterior *SubdivideNode(const Plane3 &splitPlane,
519                                                           VspBspTraversalData &tData,
520                                                           VspBspTraversalData &frontData,
521                               VspBspTraversalData &backData,
522                                                           PolygonContainer &coincident);
523
524        /** Extracts the meshes of the objects and adds them to polygons.
525                Adds object aabb to the aabb of the tree.
526                @param maxPolys the maximal number of objects to be stored as polygons
527                @returns the number of polygons
528        */
529        int AddToPolygonSoup(const ObjectContainer &objects,
530                                                 PolygonContainer &polys,
531                                                 int maxObjects = 0);
532
533        /** Extracts the meshes of the view cells and and adds them to polygons.
534                Adds view cell aabb to the aabb of the tree.
535                @param maxPolys the maximal number of objects to be stored as polygons
536                @returns the number of polygons
537        */
538        int AddToPolygonSoup(const ViewCellContainer &viewCells,
539                                                 PolygonContainer &polys,
540                                                 int maxObjects = 0);
541
542        /** Extract polygons of this mesh and add to polygon container.
543                @param mesh the mesh that drives the polygon construction
544                @param parent the parent intersectable this polygon is constructed from
545                @returns number of polygons
546        */
547        int AddMeshToPolygons(Mesh *mesh, PolygonContainer &polys, MeshInstance *parent);
548
549        /** Selects an axis aligned for the next split.
550                @returns cost for this split
551        */
552        float SelectAxisAlignedPlane(Plane3 &plane,
553                                                                 const VspBspTraversalData &tData,
554                                                                 int &axis,
555                                                                 BspNodeGeometry **frontGeom,
556                                                                 BspNodeGeometry **backGeom,
557                                                                 float &pFront,
558                                                                 float &pBack,
559                                                                 const bool useKdSplit);
560
561        /** Sorts split candidates for cost heuristics using axis aligned splits.
562                @param polys the input for choosing split candidates
563                @param axis the current split axis
564                @param splitCandidates returns sorted list of split candidates
565        */
566        void SortSplitCandidates(const RayInfoContainer &rays,
567                                                         const int axis,
568                                                         float minBand,
569                                                         float maxBand);
570
571        /** Computes best cost for axis aligned planes.
572        */
573        float BestCostRatioHeuristics(const RayInfoContainer &rays,
574                                                                  const AxisAlignedBox3 &box,
575                                                                  const int pvsSize,
576                                                                  const int axis,
577                                                                  float &position);
578
579        /** Subdivides the rays into front and back rays according to the split plane.
580               
581                @param plane the split plane
582                @param rays contains the rays to be split. The rays are
583                           distributed into front and back rays.
584                @param frontRays returns rays on the front side of the plane
585                @param backRays returns rays on the back side of the plane
586               
587                @returns the number of splits
588        */
589        int SplitRays(const Plane3 &plane,
590                                  RayInfoContainer &rays,
591                              RayInfoContainer &frontRays,
592                                  RayInfoContainer &backRays) const;
593
594
595        /** Extracts the split planes representing the space bounded by node n.
596        */
597        void ExtractHalfSpaces(BspNode *n, vector<Plane3> &halfSpaces) const;
598
599        /** Adds the object to the pvs of the front and back leaf with a given classification.
600
601                @param obj the object to be added
602                @param cf the ray classification regarding the split plane
603                @param frontPvs returns the PVS of the front partition
604                @param backPvs returns the PVS of the back partition
605       
606        */
607        void AddObjToPvs(Intersectable *obj,
608                                         const int cf,
609                                         float &frontPvs,
610                                         float &backPvs,
611                                         float &totalPvs) const;
612       
613        /** Computes PVS size induced by the rays.
614        */
615        int ComputePvsSize(const RayInfoContainer &rays) const;
616
617        /** Returns true if tree can be terminated.
618        */
619        inline bool LocalTerminationCriteriaMet(const VspBspTraversalData &data) const;
620
621        /** Returns true if global tree can be terminated.
622        */
623        inline bool GlobalTerminationCriteriaMet(const VspBspTraversalData &data) const;
624
625        /** Computes accumulated ray lenght of this rays.
626        */
627        float AccumulatedRayLength(const RayInfoContainer &rays) const;
628
629        /** Splits polygons with respect to the split plane.
630
631                @param plane the split plane
632                @param polys the polygons to be split. the polygons are consumed and
633                           distributed to the containers frontPolys, backPolys, coincident.
634                @param frontPolys returns the polygons in the front of the split plane
635                @param backPolys returns the polygons in the back of the split plane
636                @param coincident returns the polygons coincident to the split plane
637
638                @returns the number of splits   
639        */
640        int SplitPolygons(const Plane3 &plane,
641                                          PolygonContainer &polys,
642                                          PolygonContainer &frontPolys,
643                                          PolygonContainer &backPolys,
644                                          PolygonContainer &coincident) const;
645
646        /** Adds ray sample contributions to the PVS.
647                @param sampleContributions the number contributions of the samples
648                @param contributingSampels the number of contributing rays
649               
650        */
651        void AddToPvs(BspLeaf *leaf,
652                                  const RayInfoContainer &rays,
653                                  float &sampleContributions,
654                                  int &contributingSamples);
655
656       
657        /** Take 3 ray endpoints, where two are minimum and one a maximum
658                point or the other way round.
659        */
660        Plane3 ChooseCandidatePlane(const RayInfoContainer &rays) const;
661
662        /** Take plane normal as plane normal and the midpoint of the ray.
663                PROBLEM: does not resemble any point where visibility is
664                likely to change
665        */
666        Plane3 ChooseCandidatePlane2(const RayInfoContainer &rays) const;
667
668        /** Fit the plane between the two lines so that the plane
669                has equal shortest distance to both lines.
670        */
671        Plane3 ChooseCandidatePlane3(const RayInfoContainer &rays) const;
672 
673        /** Collects candidates for merging.
674                @param leaves the leaves to be merged
675                @returns number of leaves in queue
676        */
677        int CollectMergeCandidates(const vector<BspLeaf *> leaves, vector<MergeCandidate> &candidates);
678
679        /** Collects candidates for the merge in the merge queue.
680                @returns number of leaves in queue
681        */
682        int CollectMergeCandidates(const VssRayContainer &rays, vector<MergeCandidate> &candidates);
683       
684        /** Preprocesses polygons and throws out all polygons which are coincident to
685                the view space box faces (they can be problematic).
686        */
687        void PreprocessPolygons(PolygonContainer &polys);
688       
689        /** Propagates valid flag up the tree.
690        */
691        void PropagateUpValidity(BspNode *node);
692
693        /** Writes the node to disk
694                @note: should be implemented as visitor.
695        */
696#if ZIPPED_VIEWCELLS
697        void ExportNode(BspNode *node, ogzstream &stream);
698#else
699        void ExportNode(BspNode *node, ofstream &stream);
700#endif
701
702        /** Returns estimated memory usage of tree.
703        */
704        float GetMemUsage() const;
705        //float GetMemUsage(const VspBspTraversalQueue &tstack) const;
706
707
708        /** Adds stats to subdivision log file.
709        */
710        void AddSubdivisionStats(const int viewCells,
711                                                         const float renderCostDecr,
712                                                         const float splitCandidateCost,
713                                                         const float totalRenderCost,
714                                                         const float avgRenderCost);
715
716        ///////////////////////////////////////////////////////////
717protected:
718       
719        /// Pointer to the root of the tree
720        BspNode *mRoot;
721       
722        /// the pointer to the view cells manager
723        ViewCellsManager *mViewCellsManager;
724       
725        /// View cell corresponding to the space outside the valid view space
726        BspViewCell *mOutOfBoundsCell;
727
728        /// the bsp tree statistics
729        BspTreeStatistics mBspStats;
730
731        /// sorted split candidates used for sweep-heuristics
732        vector<SortableEntry> *mLocalSplitCandidates;
733
734        /// box around the whole view domain
735        AxisAlignedBox3 mBox;
736
737       
738        //-- termination critera
739
740        /// minimal number of rays before subdivision termination
741        int mTermMinRays;
742        /// maximal possible depth
743        int mTermMaxDepth;
744        /// mininum probability
745        float mTermMinProbability;
746        /// mininum PVS
747        int mTermMinPvs;
748        /// maximal contribution per ray
749        float mTermMaxRayContribution;
750        /// minimal accumulated ray length
751        float mTermMinAccRayLength;
752        /// maximal acceptable cost ratio
753        float mTermMaxCostRatio;
754        /// tolerance value indicating how often the max cost ratio can be failed
755        int mTermMissTolerance;
756
757
758        //-- termination criteria for
759        //-- hybrid stategy where only axis aligned split are used until
760        //-- a certain point and then also polygon aligned split are taken
761         
762        /// minimal number of rays where axis aligned split is taken
763        int mTermMinRaysForAxisAligned;
764        /// max ray contribution
765        float mTermMaxRayContriForAxisAligned;
766        /// weight for heuristics evaluation
767        float mAxisAlignedCtDivCi;
768        /// spezifies the split border of the axis aligned split
769        float mAxisAlignedSplitBorder;
770
771
772        //-- global terminatino criteria
773
774        float mTermMinGlobalCostRatio;
775        int mTermGlobalCostMissTolerance;
776        int mGlobalCostMisses;
777
778        /// maximal number of view cells
779        int mMaxViewCells;
780        /// maximal tree memory
781        float mMaxMemory;
782        /// the tree is out of memory
783        bool mOutOfMemory;
784
785
786        /// number of candidates evaluated for the next split plane
787        int mMaxPolyCandidates;
788        /// number of candidates for split planes evaluated using the rays
789        int mMaxRayCandidates;
790       
791
792
793        //-- axis aligned split criteria
794
795        /// if only driving axis should be used for choosing the axis-aligned split
796        bool mOnlyDrivingAxis;
797        /// if heuristics should be used to place the split plane of an axis-aligned split
798        bool mUseCostHeuristics;
799        /// if driving axis should taken if max cost is exceeded for
800        /// all evaluated axis aligned split plane candidates
801        bool mUseDrivingAxisIfMaxCostViolated;
802        /// minimal relative position where the split axis can be placed
803        float mMinBand;
804        /// maximal relative position where the split axis can be placed
805        float mMaxBand;
806        /// balancing factor for PVS criterium
807        float mCtDivCi;
808        /// if random split axis should be used
809        bool mUseRandomAxis;
810        /// if vsp bsp tree should simulate octree
811        bool mCirculatingAxis;
812
813
814       
815        /// priority queue strategy
816        enum {BREATH_FIRST, DEPTH_FIRST, COST_BASED};
817        /// if we should use breath first priority for the splits
818        int mNodePriorityQueueType;
819        /// if split cost queue should be used to compute next best split
820        bool mUseSplitCostQueue;
821       
822
823       
824        /// Strategies for choosing next split plane.
825        enum {NO_STRATEGY = 0,
826                  RANDOM_POLYGON = 1,
827                  AXIS_ALIGNED = 2,
828                  LEAST_RAY_SPLITS = 256,
829                  BALANCED_RAYS = 512,
830                  PVS = 1024
831                };
832
833        /// strategy to get the best split plane
834        int mSplitPlaneStrategy;
835
836        //-- factors guiding the split plane heuristics
837
838        float mLeastRaySplitsFactor;
839        float mBalancedRaysFactor;
840        float mPvsFactor;
841
842
843        /// if area or volume should be used for PVS heuristics
844        bool mUseAreaForPvs;
845        /// tolerance for polygon split
846        float mEpsilon;
847        /// maximal number of test rays used to evaluate candidate split plane
848        int mMaxTests;
849        /// normalizes different bsp split plane criteria
850        float mCostNormalizer;
851        // if rays should be stored in leaves
852        bool mStoreRays;
853        /// weight between  render cost (expected value) and variance
854        float mRenderCostWeight;
855        /// weight between  render cost decrease and node render cost
856        float mRenderCostDecreaseWeight;
857
858        //-- subdivision statistics
859
860        /// subdivision stats output file
861        ofstream mSubdivisionStats;
862        float mTotalCost;
863        int mTotalPvsSize;
864
865
866        /// use polygon split whenever there are polys left
867        bool mUsePolygonSplitIfAvailable;
868        /// current time stamp (used for keeping split history)
869        int mTimeStamp;
870        /// number of currenly generated view cells
871        int mCreatedViewCells;
872
873
874private:
875
876        /// Generates unique ids for PVS criterium
877        static void GenerateUniqueIdsForPvs();
878
879        //-- unique ids for PVS criterium
880        static int sFrontId;
881        static int sBackId;
882        static int sFrontAndBackId;
883};
884
885}
886
887
888#endif
Note: See TracBrowser for help on using the repository browser.