source: trunk/VUT/GtpVisibilityPreprocessor/src/ViewCellBsp.h @ 444

Revision 444, 22.9 KB checked in by mattausch, 19 years ago (diff)

fixed error in ray to vssray conversion

Line 
1#ifndef _ViewCellBsp_H__
2#define _ViewCellBsp_H__
3
4#include "Mesh.h"
5#include "Containers.h"
6#include "Polygon3.h"
7#include <stack>
8#include "Statistics.h"
9
10class ViewCell;
11class BspViewCell;
12class Plane3;
13class BspTree; 
14class BspInterior;
15//class Polygon3;
16class AxisAlignedBox3;
17class Ray;
18
19class BspNodeGeometry
20{
21public:
22        BspNodeGeometry()
23        {}; 
24
25        ~BspNodeGeometry();
26
27        float GetArea() const;
28       
29        /** Computes new cell based on the old cell definition and a new split plane
30                @param side indicates which side of the halfspace
31        */
32        void SplitGeometry(BspNodeGeometry &front,
33                                           BspNodeGeometry &back,
34                                           const BspTree &tree,
35                                           const Plane3 &splitPlane) const;
36
37        Polygon3 *SplitPolygon(Polygon3 *poly, const BspTree &tree) const;
38
39        PolygonContainer mPolys;
40};
41
42/** Data structure used for optimized ray casting.
43*/
44struct BspRayTraversalData
45{
46    BspNode *mNode;
47    Vector3 mExitPoint;
48    float mMaxT;
49   
50    BspRayTraversalData() {}
51
52    BspRayTraversalData(BspNode *n, const Vector3 &extp, const float maxt):
53    mNode(n), mExitPoint(extp), mMaxT(maxt)
54        {}
55};
56
57/** Data used for passing ray data down the tree.
58*/
59struct BoundedRay
60{
61        Ray *mRay;
62        float mMinT;
63        float mMaxT;
64               
65        BoundedRay(): mMinT(0), mMaxT(1e6), mRay(NULL)
66        {}
67        BoundedRay(Ray *r, float minT, float maxT):
68        mRay(r), mMinT(minT), mMaxT(maxT)
69        {}
70};
71
72typedef vector<BoundedRay *> BoundedRayContainer;
73
74class BspTreeStatistics: public StatisticsBase
75{
76public:
77        // total number of nodes
78        int nodes;
79        // number of splits
80        int splits;
81        // totals number of rays
82        int rays;
83        // maximal reached depth
84        int maxDepth;
85        // minimal depth
86        int minDepth;
87       
88        // max depth nodes
89        int maxDepthNodes;
90        // minimum depth nodes
91        int minDepthNodes;
92        // max depth nodes
93        int minPvsNodes;
94        // nodes with minimum PVS
95        int minRaysNodes;
96        // max ray contribution nodes
97        int maxRayContribNodes;
98        // minimum area nodes
99        int minAreaNodes;
100
101        // max number of rays per node
102        int maxObjectRefs;
103        // accumulated depth (used to compute average)
104        int accumDepth;
105        // number of initial polygons
106        int polys;
107        /// samples contributing to pvs
108        int contributingSamples;
109        /// sample contributions to pvs
110        int sampleContributions;
111        /// largest pvs
112        int largestPvs;
113
114        // Constructor
115        BspTreeStatistics()
116        {
117                Reset();
118        }
119
120        int Nodes() const {return nodes;}
121        int Interior() const { return nodes / 2; }
122        int Leaves() const { return (nodes / 2) + 1; }
123       
124        // TODO: computation wrong
125        double AvgDepth() const { return accumDepth / (double)Leaves();};
126 
127        void Reset()
128        {
129                nodes = 0;
130                splits = 0;
131               
132                maxDepth = 0;
133                minDepth = 99999;
134                polys = 0;
135                accumDepth = 0;
136       
137                maxDepthNodes = 0;
138                minPvsNodes = 0;
139                minRaysNodes = 0;
140                maxRayContribNodes = 0;
141                minAreaNodes = 0;
142
143                contributingSamples = 0;
144                sampleContributions = 0;
145        }
146
147        void Print(ostream &app) const;
148
149        friend ostream &operator<<(ostream &s, const BspTreeStatistics &stat)
150        {
151                stat.Print(s);
152                return s;
153        }
154};
155
156class BspViewCellsStatistics: public StatisticsBase
157{
158public:
159
160        /// number of view cells
161        int viewCells;
162
163        /// size of the PVS
164        int pvs;
165 
166        /// largest PVS of all view cells
167        int maxPvs;
168
169        /// smallest PVS of all view cells
170        int minPvs;
171
172        /// view cells with empty PVS
173        int emptyPvs;
174
175        /// number of bsp leaves covering the view space
176        int bspLeaves;
177
178        /// largest number of leaves covered by one view cell 
179        int maxBspLeaves;
180
181    // Constructor
182        BspViewCellsStatistics()
183        {
184                Reset();
185        }
186
187        double AvgBspLeaves() const {return (double)bspLeaves / (double)viewCells;};
188        double AvgPvs() const {return (double)pvs / (double)viewCells;};
189 
190        void Reset()
191        {
192                viewCells = 0; 
193                pvs = 0; 
194                maxPvs = 0;
195
196                minPvs = 999999;
197                emptyPvs = 0;
198                bspLeaves = 0;
199                maxBspLeaves = 0;
200        }
201
202        void Print(ostream &app) const;
203
204        friend ostream &operator<<(ostream &s, const BspViewCellsStatistics &stat)
205        {
206                stat.Print(s);
207                return s;
208        } 
209};
210
211/**
212    BspNode abstract class serving for interior and leaf node implementation
213*/
214class BspNode
215{
216        friend class BspTree;
217
218public:
219        BspNode();
220        virtual ~BspNode(){};
221        BspNode(BspInterior *parent);
222
223        /** Determines whether this node is a leaf or not
224        @return true if leaf
225        */
226        virtual bool IsLeaf() const = 0;
227
228        /** Determines whether this node is a root
229        @return true if root
230        */
231        virtual bool IsRoot() const;
232
233        /** Returns parent node.
234        */
235        BspInterior *GetParent();
236
237        /** Sets parent node.
238        */
239        void SetParent(BspInterior *parent);
240
241       
242        static int sMailId;
243        int mMailbox;
244 
245        void Mail() { mMailbox = sMailId; }
246        static void NewMail() { ++ sMailId; }
247        bool Mailed() const { return mMailbox == sMailId; }
248
249protected:
250
251        /// parent of this node
252        BspInterior *mParent;
253};
254
255/** BSP interior node implementation
256*/
257class BspInterior : public BspNode
258{
259        friend class BspTree;
260public:
261        /** Standard contructor taking split plane as argument.
262        */
263        BspInterior(const Plane3 &plane);
264        ~BspInterior();
265        /** @return false since it is an interior node
266        */
267        bool IsLeaf() const;
268
269        BspNode *GetBack();
270        BspNode *GetFront();
271
272        Plane3 *GetPlane();
273
274        void ReplaceChildLink(BspNode *oldChild, BspNode *newChild);
275        void SetupChildLinks(BspNode *b, BspNode *f);
276
277        /** Splits polygons with respect to the split plane.
278                @param polys the polygons to be split. the polygons are consumed and
279                           distributed to the containers frontPolys, backPolys, coincident.
280                @param frontPolys returns the polygons in the front of the split plane
281                @param backPolys returns the polygons in the back of the split plane
282                @param coincident returns the polygons coincident to the split plane
283
284                @returns the number of splits   
285        */
286        int SplitPolygons(PolygonContainer &polys,
287                                          PolygonContainer &frontPolys,
288                                          PolygonContainer &backPolys,
289                                          PolygonContainer &coincident);
290
291        friend ostream &operator<<(ostream &s, const BspInterior &A)
292        {
293                return s << A.mPlane;
294        }
295
296protected:
297
298        /// Splitting plane corresponding to this node
299        Plane3 mPlane;
300        /// back node
301        BspNode *mBack;
302        /// front node
303        BspNode *mFront;
304};
305
306/** BSP leaf node implementation.
307*/
308class BspLeaf : public BspNode
309{
310        friend class BspTree;
311
312public:
313        BspLeaf();
314        BspLeaf(BspViewCell *viewCell);
315        BspLeaf(BspInterior *parent);
316        BspLeaf(BspInterior *parent, BspViewCell *viewCell);
317
318        /** @return true since it is an interior node
319        */
320        bool IsLeaf() const;
321       
322        /** Returns pointer of view cell.
323        */
324        BspViewCell *GetViewCell() const;
325
326        /** Sets pointer to view cell.
327        */
328        void SetViewCell(BspViewCell *viewCell);
329
330        /** Adds ray sample contributions to the PVS.
331                @param sampleContributions the number contributions of the samples
332                @param contributingSampels the number of contributing rays
333               
334        */
335        void AddToPvs(const BoundedRayContainer &rays,
336                                  int &sampleContributions,
337                                  int &contributingSamples);
338
339protected:
340
341        /// if NULL this does not correspond to feasible viewcell
342        BspViewCell *mViewCell;
343};
344
345/** Implementation of the view cell BSP tree.
346*/
347class BspTree
348{
349public:
350       
351        /** Additional data which is passed down the BSP tree during traversal.
352        */
353        struct BspTraversalData
354        { 
355                /// the current node
356                BspNode *mNode;
357                /// polygonal data for splitting
358                PolygonContainer *mPolygons;
359                /// current depth
360                int mDepth;
361                /// the view cell associated with this subdivsion
362                ViewCell *mViewCell;
363                /// rays piercing this node
364                BoundedRayContainer *mRays;
365                /// area of current node
366                float mArea;
367                /// geometry of node as induced by planes
368                BspNodeGeometry *mGeometry;
369               
370                /// pvs size
371                int mPvs;
372               
373                /** Returns average ray contribution.
374                */
375                float GetAvgRayContribution() const
376                {
377                        return (float)mPvs / ((float)mRays->size() + Limits::Small);
378                }
379
380
381                BspTraversalData():
382                mNode(NULL),
383                mPolygons(NULL),
384                mDepth(0),
385                mViewCell(NULL),
386                mRays(NULL),
387                mPvs(0),
388                mArea(0.0),
389                mGeometry(NULL)
390                {}
391               
392                BspTraversalData(BspNode *node,
393                                                 PolygonContainer *polys,
394                                                 const int depth,
395                                                 ViewCell *viewCell,
396                                                 BoundedRayContainer *rays,
397                                                 int pvs,
398                                                 float area,
399                                                 BspNodeGeometry *cell):
400                mNode(node),
401                mPolygons(polys),
402                mDepth(depth),
403                mViewCell(viewCell),
404                mRays(rays),
405                mPvs(pvs),
406                mArea(area),
407                mGeometry(cell)
408                {}
409    };
410       
411        typedef std::stack<BspTraversalData> BspTraversalStack;
412
413        /** Default constructor creating an empty tree.
414        */
415        BspTree();
416       
417        ~BspTree();
418
419       
420        const BspTreeStatistics &GetStatistics() const;
421 
422        /** Constructs tree using the given list of view cells.
423            For this type of construction we filter all view cells down the
424                tree. If there is no polygon left, the last split plane
425            decides inside or outside of the viewcell. A pointer to the
426                appropriate view cell is stored within each leaf.
427                Many leafs can point to the same viewcell.
428        */
429        void Construct(const ViewCellContainer &viewCells);
430
431        /** Constructs tree using the given list of objects.
432            @note the objects are not taken as view cells, but the view cells are
433                constructed from the subdivision: Each leaf is taken as one viewcell.
434                @param objects list of objects
435        */
436        void Construct(const ObjectContainer &objects);
437
438        void Construct(const ObjectContainer &objects,
439                                   const RayContainer &sampleRays);
440
441        /** Constructs the tree from a given set of rays.
442                @param sampleRays the set of sample rays the construction is based on
443                @param viewCells if not NULL, new view cells are
444                created in the leafs and stored in the conatainer
445        */
446        void Construct(const RayContainer &sampleRays);
447
448        /** Returns list of BSP leaves.
449        */
450        void CollectLeaves(vector<BspLeaf *> &leaves) const;
451
452        /** Returns box which bounds the whole tree.
453        */
454        AxisAlignedBox3 GetBoundingBox()const;
455
456        /** Returns root of BSP tree.
457        */
458        BspNode *GetRoot() const;
459
460        /** Exports Bsp tree to file.
461        */
462        bool Export(const string filename);
463
464        /** Collects the leaf view cells of the tree
465                @param viewCells returns the view cells
466        */
467        void CollectViewCells(ViewCellContainer &viewCells) const;
468
469        /** A ray is cast possible intersecting the tree.
470                @param the ray that is cast.
471                @returns the number of intersections with objects stored in the tree.
472        */
473        int CastRay(Ray &ray);
474
475        /// bsp tree construction types
476        enum {FROM_INPUT_VIEW_CELLS, FROM_SCENE_GEOMETRY, FROM_SAMPLES};
477
478        /** Returns statistics.
479        */
480        BspTreeStatistics &GetStat();
481
482        /** finds neighbouring leaves of this tree node.
483        */
484        int FindNeighbors(BspNode *n, vector<BspLeaf *> &neighbors,
485                                          const bool onlyUnmailed) const;
486
487        /** Constructs geometry associated with the half space intersections
488                leading to this node.
489        */
490        void ConstructGeometry(BspNode *n, PolygonContainer &cell) const;
491       
492        /** Construct geometry of view cell.
493        */
494        void ConstructGeometry(BspViewCell *vc, PolygonContainer &cell) const;
495
496        /** Constructs geometry of view cell returning a BSP node geometry type.
497        */
498        void ConstructGeometry(BspNode *n, BspNodeGeometry &cell) const;
499
500        /** Returns random leaf of BSP tree.
501                @param halfspace defines the halfspace from which the leaf is taken.
502        */
503        BspLeaf *GetRandomLeaf(const Plane3 &halfspace);
504
505        /** Returns random leaf of BSP tree.
506                @param onlyUnmailed if only unmailed leaves should be returned.
507        */
508        BspLeaf *GetRandomLeaf(const bool onlyUnmailed = false);
509
510        /** Traverses tree and counts all view cells as well as their PVS size.
511        */
512        void EvaluateViewCellsStats(BspViewCellsStatistics &stat) const;
513
514        /** Returns view cell corresponding to unbounded space.
515        */
516        BspViewCell *GetRootCell() const;
517
518        /** Parses the environment and stores the global BSP tree parameters
519        */
520        static void ParseEnvironment();
521
522
523protected:
524
525        // --------------------------------------------------------------
526        // For sorting objects
527        // --------------------------------------------------------------
528        struct SortableEntry
529        {
530                enum {POLY_MIN, POLY_MAX};
531   
532                int type;
533                float value;
534                Polygon3 *poly;
535                SortableEntry() {}
536                SortableEntry(const int t, const float v, Polygon3 *poly):
537                type(t), value(v), poly(poly) {}
538               
539                bool operator<(const SortableEntry &b) const
540                {
541                        return value < b.value;
542                } 
543        };
544
545        /** Evaluates tree stats in the BSP tree leafs.
546        */
547        void EvaluateLeafStats(const BspTraversalData &data);
548
549        /** Subdivides node with respect to the traversal data.
550            @param tStack current traversal stack
551                @param tData traversal data also holding node to be subdivided
552                @returns new root of the subtree
553        */
554        BspNode *Subdivide(BspTraversalStack &tStack, BspTraversalData &tData);
555
556        /** Constructs the tree from the given list of polygons and rays.
557                @param polys stores set of polygons on which subdivision may be based
558                @param rays storesset of rays on which subdivision may be based
559        */
560        void Construct(PolygonContainer *polys, BoundedRayContainer *rays);
561
562        /** Selects the best possible splitting plane.
563                @param leaf the leaf to be split
564                @param polys the polygon list on which the split decition is based
565                @param rays ray container on which selection may be based
566                @note the polygons can be reordered in the process
567                @returns the split plane
568        */
569        Plane3 SelectPlane(BspLeaf *leaf,
570                                           BspTraversalData &data);
571
572        /** Evaluates the contribution of the candidate split plane.
573               
574                @param candidatePlane the candidate split plane
575                @param polys the polygons the split can be based on
576                @param rays the rays the split can be based on
577
578                @returns the cost of the candidate split plane
579        */
580        float SplitPlaneCost(const Plane3 &candidatePlane,
581                                                 BspTraversalData &data) const;
582
583        /** Strategies where the effect of the split plane is tested
584            on all input rays.
585                @returns the cost of the candidate split plane
586        */
587        float SplitPlaneCost(const Plane3 &candidatePlane,
588                                                 const PolygonContainer &polys) const;
589
590        /** Strategies where the effect of the split plane is tested
591            on all input rays.
592
593                @returns the cost of the candidate split plane
594        */
595        float SplitPlaneCost(const Plane3 &candidatePlane,
596                                                 const BoundedRayContainer &rays,
597                                                 const int pvs,
598                                                 const float area,
599                                                 const BspNodeGeometry &cell) const;
600
601        /** Filters next view cell down the tree and inserts it into the appropriate leaves
602                (i.e., possibly more than one leaf).
603        */
604        void InsertViewCell(ViewCell *viewCell);
605        /** Inserts polygons down the tree. The polygons are filtered until a leaf is reached,
606                then further subdivided.
607        */
608        void InsertPolygons(PolygonContainer *polys);
609
610        /** Subdivide leaf.
611                @param leaf the leaf to be subdivided
612               
613                @param polys the polygons to be split
614                @param frontPolys returns the polygons in front of the split plane
615                @param backPolys returns the polygons in the back of the split plane
616               
617                @param rays the polygons to be filtered
618                @param frontRays returns the polygons in front of the split plane
619                @param backRays returns the polygons in the back of the split plane
620
621                @returns the root of the subdivision
622        */
623
624        BspInterior *SubdivideNode(BspTraversalData &tData,
625                                                           BspTraversalData &frontData,
626                                                           BspTraversalData &backData,
627                                                           PolygonContainer &coincident);
628
629        /** Filters polygons down the tree.
630                @param node the current BSP node
631                @param polys the polygons to be filtered
632                @param frontPolys returns the polygons in front of the split plane
633                @param backPolys returns the polygons in the back of the split plane
634        */
635        void FilterPolygons(BspInterior *node,
636                                                PolygonContainer *polys,
637                                                PolygonContainer *frontPolys,
638                                                PolygonContainer *backPolys);
639
640        /** Selects the split plane in order to construct a tree with
641                certain characteristics (e.g., balanced tree, least splits,
642                2.5d aligned)
643                @param polygons container of polygons
644                @param rays bundle of rays on which the split can be based
645        */
646        Plane3 SelectPlaneHeuristics(BspLeaf *leaf,
647                                                                 BspTraversalData &data);
648
649        /** Extracts the meshes of the objects and adds them to polygons.
650                Adds object aabb to the aabb of the tree.
651                @param maxPolys the maximal number of objects to be stored as polygons
652                @returns the number of polygons
653        */
654        int AddToPolygonSoup(const ObjectContainer &objects,
655                                                 PolygonContainer &polys,
656                                                 int maxObjects = 0);
657
658        /** Extracts the meshes of the view cells and and adds them to polygons.
659                Adds view cell aabb to the aabb of the tree.
660                @param maxPolys the maximal number of objects to be stored as polygons
661                @returns the number of polygons
662        */
663        int AddToPolygonSoup(const ViewCellContainer &viewCells,
664                                                 PolygonContainer &polys,
665                                                 int maxObjects = 0);
666
667        /** Extract polygons of this mesh and add to polygon container.
668                @param mesh the mesh that drives the polygon construction
669                @param parent the parent intersectable this polygon is constructed from
670                @returns number of polygons
671        */
672        int AddMeshToPolygons(Mesh *mesh, PolygonContainer &polys, MeshInstance *parent);
673
674        /** returns next candidate index and reorders polygons so no candidate is chosen two times
675                @param the current candidate index
676                @param max the range of candidates
677        */
678        int GetNextCandidateIdx(int currentIdx, PolygonContainer &polys);
679
680        /** Helper function which extracts a view cell on the front and the back
681                of the split plane.
682                @param backViewCell returns view cell on the back of the split plane
683                @param frontViewCell returns a view cell on the front of the split plane
684                @param coincident container of polygons coincident to the split plane
685                @param splitPlane the split plane which decides about back and front
686                @param extractBack if a back view cell is extracted
687                @param extractFront if a front view cell is extracted
688        */
689        void ExtractViewCells(BspTraversalData &frontData,
690                                                  BspTraversalData &backData,
691                                                  const PolygonContainer &coincident,
692                                                  const Plane3 &splitPlane) const;
693       
694        /** Computes best cost ratio for the suface area heuristics for axis aligned
695                splits. This heuristics minimizes the cost for ray traversal.
696                @param polys the polygons guiding the ratio computation
697                @param box the bounding box of the leaf
698                @param axis the current split axis
699                @param position returns the split position
700                @param objectsBack the number of objects in the back of the split plane
701                @param objectsFront the number of objects in the front of the split plane
702        */
703        float BestCostRatio(const PolygonContainer &polys,
704                                                const AxisAlignedBox3 &box,
705                                                const int axis,
706                                                float &position,
707                                                int &objectsBack,
708                                                int &objectsFront) const;
709       
710        /** Sorts split candidates for surface area heuristics for axis aligned splits.
711                @param polys the input for choosing split candidates
712                @param axis the current split axis
713                @param splitCandidates returns sorted list of split candidates
714        */
715        void SortSplitCandidates(const PolygonContainer &polys,
716                                                         const int axis,
717                                                         vector<SortableEntry> &splitCandidates) const;
718
719        /** Selects an axis aligned split plane.
720                Returns true if split is valied
721        */
722        bool SelectAxisAlignedPlane(Plane3 &plane, const PolygonContainer &polys) const;
723
724        /** Bounds ray and returns minT and maxT.
725                @returns true if ray hits BSP tree bounding box
726        */
727        bool BoundRay(const Ray &ray, float &minT, float &maxT) const;
728
729        /** Subdivides the rays into front and back rays according to the split plane.
730               
731                @param plane the split plane
732                @param rays contains the rays to be split. The rays are
733                           distributed into front and back rays.
734                @param frontRays returns rays on the front side of the plane
735                @param backRays returns rays on the back side of the plane
736               
737                @returns the number of splits
738        */
739        int SplitRays(const Plane3 &plane,
740                                  BoundedRayContainer &rays,
741                              BoundedRayContainer &frontRays,
742                                  BoundedRayContainer &backRays);
743
744
745        /** Extracts the split planes representing the space bounded by node n.
746        */
747        void ExtractHalfSpaces(BspNode *n, vector<Plane3> &halfSpaces) const;
748
749        /** Adds the object to the pvs of the front and back leaf with a given classification.
750
751                @param obj the object to be added
752                @param cf the ray classification regarding the split plane
753                @param frontPvs returns the PVS of the front partition
754                @param backPvs returns the PVS of the back partition
755       
756        */
757        void AddObjToPvs(Intersectable *obj, const int cf, int &frontPvs, int &backPvs) const;
758
759        /** Computes PVS size induced by the rays.
760        */
761        int ComputePvsSize(const BoundedRayContainer &rays) const;
762
763        /** Returns true if tree can be terminated.
764        */
765        inline bool TerminationCriteriaMet(const BspTraversalData &data) const;
766
767        /** Computes accumulated ray lenght of this rays.
768        */
769        float AccumulatedRayLength(BoundedRayContainer &rays) const;
770
771        /// Pointer to the root of the tree.
772        BspNode *mRoot;
773
774        /// Stores statistics during traversal.
775        BspTreeStatistics mStat;
776
777        /// Strategies for choosing next split plane.
778        enum {NO_STRATEGY = 0,
779                  RANDOM_POLYGON = 1,
780                  AXIS_ALIGNED = 2,
781                  LEAST_SPLITS = 4,
782                  BALANCED_POLYS = 8,
783                  BALANCED_VIEW_CELLS = 16,
784                  LARGEST_POLY_AREA = 32,
785                  VERTICAL_AXIS = 64,
786                  BLOCKED_RAYS = 128,
787                  LEAST_RAY_SPLITS = 256,
788                  BALANCED_RAYS = 512,
789                  PVS = 1024
790                };
791
792        /// box around the whole view domain
793        AxisAlignedBox3 mBox;
794
795        /// view cell corresponding to unbounded space
796        BspViewCell *mRootCell;
797
798        /// if view cells should be generated or the given view cells should be used.
799        bool mGenerateViewCells;
800
801        /// maximal number of polygons before subdivision termination
802        int mTermMinPolys;
803        /// maximal number of rays before subdivision termination
804        int mTermMinRays;
805        /// maximal possible depth
806        int mTermMaxDepth;
807        /// mininum area
808        float mTermMinArea;
809        /// mininum PVS
810        int mTermMinPvs;
811
812        /// minimal number of polygons for axis aligned split
813        int mTermMinPolysForAxisAligned;
814        /// minimal number of rays for axis aligned split
815        int mTermMinRaysForAxisAligned;
816        /// minimal number of objects for axis aligned split
817        int mTermMinObjectsForAxisAligned;
818        /// maximal contribution per ray
819        float mTermMaxRayContribution;
820        /// minimal accumulated ray length
821        float mTermMinAccRayLength;
822
823
824        /// strategy to get the best split plane
825        int mSplitPlaneStrategy;
826        /// number of candidates evaluated for the next split plane
827        int mMaxPolyCandidates;
828        /// number of candidates for split planes evaluated using the rays
829        int mMaxRayCandidates;
830        /// maximum tests for split plane evaluation with a single candidate
831        int mMaxTests;
832
833        float mCtDivCi;
834
835        /// axis aligned split criteria
836        float mAaCtDivCi;
837        float mSplitBorder;
838        float mMaxCostRatio;
839
840        // factors guiding the split plane heuristics
841        float mVerticalSplitsFactor;
842        float mLargestPolyAreaFactor;
843        float mBlockedRaysFactor;
844        float mLeastRaySplitsFactor;
845        float mBalancedRaysFactor;
846        float mPvsFactor;
847        float mLeastSplitsFactor;
848        float mBalancedPolysFactor;
849        float mBalancedViewCellsFactor;
850
851        /// if area or accumulated ray lenght should be used for PVS heuristics
852        bool mPvsUseArea;
853
854private:
855       
856        /** Evaluates split plane classification with respect to the plane's
857                contribution for a balanced tree.
858        */
859        static const float sLeastPolySplitsTable[4];
860        /** Evaluates split plane classification with respect to the plane's
861                contribution for a minimum number splits in the tree.
862        */
863        static const float sBalancedPolysTable[4];
864        /** Evaluates split plane classification with respect to the plane's
865                contribution for a minimum number of ray splits.
866        */
867        static const float sLeastRaySplitsTable[5];
868        /** Evaluates split plane classification with respect to the plane's
869                contribution for balanced rays.
870        */
871        static const float sBalancedRaysTable[5];
872
873        /// Generates unique ids for PVS criterium
874        static void GenerateUniqueIdsForPvs();
875
876        //-- unique ids for PVS criterium
877        static int sFrontId;
878        static int sBackId;
879        static int sFrontAndBackId;
880};
881
882#endif
Note: See TracBrowser for help on using the repository browser.