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

Revision 239, 8.5 KB checked in by mattausch, 19 years ago (diff)

removed debug stuff. viewcell insertion working

RevLine 
[221]1#ifndef _ViewCellBsp_H__
2#define _ViewCellBsp_H__
3
4#include "Mesh.h"
[224]5#include "Containers.h"
[225]6#include <queue>
[233]7#include <stack>
[224]8
[221]9class ViewCell;
10class Plane3;
11//class Mesh;
12
13//namespace GtpVisibilityPreprocessor {
[224]14class BspTree; 
[221]15class BspInterior;
[235]16class Polygon3;
[221]17
[238]18/** Container storing a soup of polygons used during BSP tree construction
[235]19*/
[238]20typedef std::vector<Polygon3 *> PolygonContainer;
[224]21
[234]22class BspTreeStatistics // TODO: should have common superclass with KdTreeStatistics
23{
24public:
25  // total number of nodes
26  int nodes;
[235]27  // number of splits
28  int splits;
[234]29  // totals number of rays
30  int rays;
[235]31  // maximal reached depth
32  int maxDepth;
[234]33  // total number of query domains
34  int queryDomains;
35  // total number of ray references
36  int rayRefs;
37  // refs in non empty leafs
38  int rayRefsNonZeroQuery;
39  // total number of query references
40  int objectRefs;
41  // nodes with zero queries
42  int zeroQueryNodes;
43  // max depth nodes
44  int maxDepthNodes;
45  // max number of rays per node
46  int maxObjectRefs;
47  // number of dynamically added ray refs
48  int addedRayRefs;
49  // number of dynamically removed ray refs
50  int removedRayRefs;
51 
52  // Constructor
53  BspTreeStatistics()
54  {
[235]55          Reset();
[234]56  }
57
58  int Nodes() const {return nodes;}
59  int Interior() const { return nodes/2; }
60  int Leaves() const { return (nodes/2) + 1; }
61
62  void Reset()
63  {
64          nodes = 0;
[235]65          splits = 0;
[234]66          rays = queryDomains = 0;
67          rayRefs = rayRefsNonZeroQuery = objectRefs = 0;
68          zeroQueryNodes = 0;
69      maxDepthNodes = 0;
70      //minCostNodes = 0;
71          maxObjectRefs = 0;
72          addedRayRefs = removedRayRefs = 0;
73  }
74
75  void
76  Print(ostream &app) const;
77
78  friend ostream &operator<<(ostream &s, const BspTreeStatistics &stat) {
79    stat.Print(s);
80    return s;
81  }
82 
83};
84
[233]85/**
86    BspNode abstract class serving for interior and leaf node implementation
87*/
88class BspNode
89{
90        friend BspTree;
[221]91
[233]92public:
[235]93        BspNode();
94        BspNode(BspInterior *parent);
95
[233]96        /** Determines whether this node is a leaf or not
97        @return true if leaf
98        */
99        virtual bool IsLeaf() const = 0;
[221]100
[233]101        /** Determines whether this node is a root
102        @return true if root
103        */
104        virtual bool IsRoot() const;
[221]105
[233]106        /** Returns parent node.
107        */
108        BspInterior *GetParent();
[235]109        /** Sets parent node.
110        */
111        void SetParent(BspInterior *parent);
112
[233]113protected:
[221]114
[233]115        /// parent of this node
116        BspInterior *mParent;
117};
[221]118
[233]119/** BSP interior node implementation
120*/
121class BspInterior : public BspNode
122{
123public:
124        /** Standard contructor taking split plane as argument.
125        */
126        BspInterior(Plane3 plane);
127        /** @return false since it is an interior node
128        */
129        bool IsLeaf() const;
[222]130
[233]131        BspNode *GetBack();
132        BspNode *GetFront();
[221]133
[233]134        Plane3 *GetPlane();
[221]135
[233]136        void ReplaceChildLink(BspNode *oldChild, BspNode *newChild);
137        void SetupChildLinks(BspNode *b, BspNode *f);
[225]138
[233]139        /** Splits polygons.
140                @param polys the polygons to be split
141                @param frontPolys returns the polygons in the front of the split plane
142                @param backPolys returns the polygons in the back of the split plane
[235]143                @param splits number of splits
[233]144        */
[238]145        void SplitPolygons(PolygonContainer *polys, PolygonContainer *frontPolys,
146                                           PolygonContainer *backPolys, int &splits);
[225]147
[237]148        friend ostream &operator<<(ostream &s, const BspInterior &A)
149        {
150                return s << A.mPlane;
151        }
152
153
[233]154protected:
155       
156        /// Splitting plane corresponding to this node
157        Plane3 mPlane;
158        /// back node
159        BspNode *mBack;
160        /// front node
161        BspNode *mFront;
162};
[225]163
[237]164/** BSP leaf node implementation.
165*/
[233]166class BspLeaf : public BspNode
167{
168public:
169        BspLeaf(ViewCell *viewCell = NULL);
[225]170
[233]171        /** @return true since it is an interior node */
172        bool IsLeaf() const;
173        ViewCell *GetViewCell();
[225]174
[233]175protected:
[225]176
[233]177        /// polygonal representation of this viewcell
178        /// if NULL this note does not correspond to feasible viewcell
179        ViewCell *mViewCell;
180};
[225]181
182
[233]183/** Implementation of the ViewCell BSP tree. */
184class BspTree
185{
186public:
187               
188        /** Additional data which is passed down the BSP tree during traversal.
189        */
190        struct BspTraversalData
191        { 
192                /// the current node
193                BspNode *mNode;
194                /// parent of current node
195                BspInterior *mParent;
196                /// polygonal data for splitting
[238]197                PolygonContainer *mPolygons;
[233]198                /// current depth
199                int mDepth;
200               
201                BspTraversalData() {}
202               
[238]203                BspTraversalData(BspNode *node, BspInterior *parent, PolygonContainer *polys, const int depth):
[235]204                mNode(node), mParent(parent), mPolygons(polys), mDepth(depth) {}
[233]205    };
206
207        typedef std::stack<BspTraversalData> BspTraversalStack;
208
[235]209        /// BSP tree construction type
210        enum {VIEWCELLS, SCENE_GEOMETRY};
211
212        /** Default constructor creating an empty tree.
[233]213        */
[235]214        BspTree();
[233]215
216        ~BspTree();
217
[235]218        const BspTreeStatistics &GetStatistics() const;
219 
220        /** Constructs tree using the given list of viewcells.
221            A pointer to the appropriate viewcell is stored within each leaf.
222                Many leafs can point to the same viewcell.
223        */
224        void Construct(const ViewCellContainer &viewCells);
225        /** Constructs tree using the given list of objects. Each leaf is taken as viewcell.
226            No objects are treated as viewcells explicitly.
227
228                @param objects list of objects
229        */
230        void Construct(const ObjectContainer &objects);
231
232
[233]233protected:
[238]234       
235        /** Evaluates plane classification with respect to the plane's
236                contribution for a balanced tree.
237        */
238        static inline int EvalForBalancedTree(const int classficiation);
239        /** Evaluates plane classification with respect to the plane's
240                contribution for a minimum number splits in the tree.
241        */
242        static inline int EvalForLeastSplits(const int classification);
243
244        /** Evaluates the contribution of the candidate split plane.
245        */
246        int EvalSplitPlane(PolygonContainer *polygons, const Plane3 &candidatePlane) const;
247
248        /** Evaluates tree stats in the BSP tree leafs.
249        */
[235]250        void EvaluateLeafStats(const BspTraversalData &data);
251
252        /** Subdivides node with respect to the traversal data.
253            @param tStack current traversal stack
254                @param tData traversal data also holding node to be subdivided
255                @param viewCell the view cell that will be represented with this part of the Bsp tree.
[239]256                @returns new root of the subtree
[233]257        */
[239]258        BspNode *Subdivide(BspTraversalStack &tStack, BspTraversalData &tData, ViewCell *viewCell = NULL);
[233]259
[235]260        /** Selects a splitting plane.
[238]261                @param polygons the polygon data on which the split decition is based
[233]262        */
[238]263        Plane3 SelectPlane(PolygonContainer *polygons) const;
[224]264
[233]265        /** Filters next viewcell down the tree and inserts it into the appropriate leaves
266                (i.e., possibly more than one leaf).
267        */
[235]268        void InsertViewCell(ViewCell *viewCell);
[233]269       
[235]270        /** Subdivide leaf.
[233]271                @param leaf the leaf to be subdivided
272                @param parent the parent node of this leaf
273                @param polys the input polygons
274                @param depth the current tree depth
275                @param frontPolys the polygons of the front child node as a result from splitting
276                @param backPolys the polygons of the back child node as a result from splitting
277        */
278        BspNode *SubdivideNode(BspLeaf *leaf, BspInterior *parent,
[238]279                                                        PolygonContainer *polys, const int depth,
[233]280                                                        ViewCell *viewCell,
[238]281                                                        PolygonContainer *frontPolys, PolygonContainer *backPolys);
[221]282
[233]283        /** Filters polygons down the tree.
284                @param node the current BSP node
285                @param polys the polygons to be filtered
286                @param frontPolys returns the polygons in front of the split plane
287                @param backPolys returns the polygons in the back of the split plane
288        */
[238]289        void FilterPolygons(BspInterior *node, PolygonContainer *polys,
290                                                PolygonContainer *frontPolys, PolygonContainer *backPolys);
[224]291
[238]292        /** Selects the split plane in order to get a balanced tree.
293                @param polygons container of polygons
294                @param maxTests the maximal number of candidate tests
295        */
296        Plane3 SelectPlaneHeuristics(PolygonContainer *polygons, int maxTests) const;
297
[235]298        /** Extracts the meshes of the objects and copies them into the mesh.
[233]299        */
[238]300        static void Copy2PolygonSoup(const ObjectContainer &objects, PolygonContainer &polys, int maxPolys);
[224]301
[235]302        /** copy this mesh into polygons.
303        */
[238]304        static void CopyMesh2Polygons(Mesh *mesh, PolygonContainer &polys);
[233]305
306        /// Pointer to the root of the tree
307        BspNode *mRoot;
[237]308
[233]309        /// Pointer to the root cell of the viewspace
310        // ViewCell *mRootCell;
[237]311               
[235]312        BspTreeStatistics mStat;
[234]313
[235]314        /// local maximal polygons (changes depending on method)
315        int mTermMaxPolygons;
316        int mTermMaxDepth;
317
[237]318        /// Strategies for choosing next split plane.
[238]319        enum {NEXT_POLYGON, LEAST_SPLITS, BALANCED_TREE, COMBINED};
[236]320
[235]321public:
322        /// Parses the environment and stores the global BSP tree parameters
323        static void ParseEnvironment();
324
325        /// maximal number of polygons where tree construction is terminated
326        static int sTermMaxPolygons;
327        /// maximal possible depth
328        static int sTermMaxDepth;
[238]329        /// strategy to get the best split plane
[236]330        static int sSplitPlaneStrategy;
[238]331        /// number of candidates evaluated for the next split plane
332        static int sMaxCandidates;
[233]333};
334
[221]335//}; // GtpVisibilityPreprocessor
336
337#endif
Note: See TracBrowser for help on using the repository browser.