source: GTP/trunk/Lib/Vis/Preprocessing/src/HierarchyManager.h @ 1614

Revision 1614, 10.5 KB checked in by mattausch, 18 years ago (diff)
RevLine 
[1237]1#ifndef _HierarchyManager_H__
2#define _HierarchyManager_H__
3
4#include <stack>
5
6#include "Mesh.h"
7#include "Containers.h"
8#include "Statistics.h"
9#include "VssRay.h"
10#include "RayInfo.h"
11#include "gzstream.h"
[1239]12#include "SubdivisionCandidate.h"
[1237]13
14
15
16namespace GtpVisibilityPreprocessor {
17
18class ViewCellLeaf;
19class OspTree;
20class VspTree;
21class Plane3;
22class AxisAlignedBox3;
23class Ray;
24class ViewCellsStatistics;
25class ViewCellsManager;
26class MergeCandidate;
27class Beam;
28class ViewCellsTree;
29class Environment;
30class VspInterior;
31class VspLeaf;
32class VspNode;
33class KdNode;
34class KdInterior;
35class KdLeaf;
36class OspTree;
37class KdIntersectable;
38class KdTree;
39class VspTree;
40class KdTreeStatistics;
[1259]41class BvHierarchy;
[1287]42class Exporter;
[1237]43
44
45
[1551]46/** View space / object space hierarchy statistics.
[1288]47*/
48class HierarchyStatistics: public StatisticsBase
49{
50public:
[1576]51        /// total number of entries in the pvs
52        int pvsEntries;
53        /// storage cost
54        int memory;
[1288]55        /// total number of nodes
56        int nodes;
57        /// maximal reached depth
58        int maxDepth;
59        /// accumulated depth
60        int accumDepth;
[1449]61        /// time spent for queue repair
[1313]62        float repairTime;
[1449]63        // global cost ratio violations
64        int mGlobalCostMisses;
[1313]65
[1288]66        // Constructor
67        HierarchyStatistics()
68        {
69                Reset();
70        }
71
72        int Nodes() const {return nodes;}
73        int Interior() const { return nodes / 2; }
74        int Leaves() const { return (nodes / 2) + 1; }
75       
76        // TODO: computation wrong
77        double AvgDepth() const { return accumDepth / (double)Leaves();}
78
[1449]79        void Reset()
[1288]80        {
[1449]81                mGlobalCostMisses = 0;
[1288]82                nodes = 0;
83                maxDepth = 0;
84                accumDepth = 0;
[1313]85                repairTime = 0;
[1576]86                memory = 0;
87                pvsEntries = 0;
[1288]88        }
89
90        void Print(ostream &app) const;
91
92        friend ostream &operator<<(ostream &s, const HierarchyStatistics &stat)
93        {
94                stat.Print(s);
95                return s;
96        }
97};
98
99
[1237]100typedef FlexibleHeap<SubdivisionCandidate *> SplitQueue;
101
102/** This class implements a structure holding two different hierarchies,
103        one for object space partitioning and one for view space partitioning.
104
105        The object space and the view space are subdivided using a cost heuristics.
106        If an object space split or a view space split is chosen is also evaluated
107        based on the heuristics.
108       
109        The view space heuristics is evaluated by weighting and adding the pvss of the back and
110        front node of each specific split. unlike for the standalone method vspbsp tree,
111        the pvs of an object would not be the pvs of single object but that of all objects
112        which are contained in the same leaf of the object subdivision. This could be done
113        by storing the pointer to the object space partition parent, which would allow access to all children.
114        Another possibility is to include traced kd-cells in the ray casing process.
115
116        Accordingly, the object space heuristics is evaluated by storing a pvs of view cells with each object.
117        the contribution to an object to the pvs is the number of view cells it can be seen from.
118
119        @note
120        There is a potential efficiency problem involved in a sense that once a certain type
121        of split is chosen for view space / object space, the candidates for the next split of
122        object space / view space must be reevaluated.
123*/
124class HierarchyManager
125{
[1259]126        friend VspTree;
127        friend OspTree;
128        friend BvHierarchy;
[1279]129        friend ViewCellsParseHandlers;
[1259]130
[1237]131public:
[1421]132        /** Constructor with the view space partition tree and
133                the object space hierarchy type as argument.
[1237]134        */
[1421]135        HierarchyManager(const int objectSpaceHierarchyType);
[1279]136        /** Hack: OspTree will copy the content from this kd tree.
137                Only view space hierarchy will be constructed.
138        */
[1421]139        HierarchyManager(KdTree *kdTree);
[1237]140
[1421]141        /** Deletes space partition and view space partition.
142        */
[1286]143        ~HierarchyManager();
144
[1237]145        /** Constructs the view space and object space subdivision from a given set of rays
146                and a set of objects.
147                @param sampleRays the set of sample rays the construction is based on
148                @param objects the set of objects
149        */
[1308]150        void Construct(
[1293]151                const VssRayContainer &sampleRays,
152                const ObjectContainer &objects,
153                AxisAlignedBox3 *forcedViewSpace);
[1237]154
[1259]155        enum
156        {
157                NO_OBJ_SUBDIV,
158                KD_BASED_OBJ_SUBDIV,
159                BV_BASED_OBJ_SUBDIV
160        };
[1237]161
[1370]162        enum
163        {
164                NO_VIEWSPACE_SUBDIV,
165                KD_BASED_VIEWSPACE_SUBDIV
166        };
167
[1259]168        /** The type of object space subdivison
169        */
[1370]170        int GetObjectSpaceSubdivisionType() const;     
171        /** The type of view space space subdivison
172        */
173        int GetViewSpaceSubdivisionType() const;
174        /** Sets a pointer to the view cells manager.
175        */             
[1279]176        void SetViewCellsManager(ViewCellsManager *vcm);
[1370]177        /** Sets a pointer to the view cells tree.
178        */
[1279]179        void SetViewCellsTree(ViewCellsTree *vcTree);
[1370]180        /** Exports the object hierarchy to disc.
181        */
[1279]182        void ExportObjectSpaceHierarchy(OUT_STREAM &stream);
[1370]183        /** Adds a sample to the pvs of the specified view cell.
184        */
[1279]185        bool AddSampleToPvs(
186                Intersectable *obj,
187                const Vector3 &hitPoint,
188                ViewCell *vc,
189                const float pdf,
190                float &contribution) const;
191
[1421]192        /** Print out statistics.
193        */
194        void PrintHierarchyStatistics(ostream &stream) const;
[1279]195
[1421]196        /** Returns the view space partition tree.
197        */
[1379]198        VspTree *GetVspTree();
[1279]199
[1421]200        /** Returns view space bounding box.
201        */
[1563]202        //AxisAlignedBox3 GetViewSpaceBox() const;
[1421]203        /** Returns object space bounding box.
204        */
[1416]205        AxisAlignedBox3 GetObjectSpaceBox() const;
[1379]206
[1421]207        /** Exports object space hierarchy for visualization.
208        */
[1287]209        void ExportObjectSpaceHierarchy(
210                Exporter *exporter,
[1416]211                const ObjectContainer &objects,
[1418]212                const AxisAlignedBox3 *bbox,
213                const bool exportBounds = true) const;
[1279]214
[1421]215        /** Returns intersectable pierced by this ray.
216        */
[1418]217        Intersectable *GetIntersectable(
218                const VssRay &ray,
219                const bool isTermination) const;
220
[1419]221        friend ostream &operator<<(ostream &s, const HierarchyManager &hm)
222        {
[1421]223                hm.PrintHierarchyStatistics(s);
[1419]224                return s;
225        }
226
[1614]227        void ExportBoundingBoxes(OUT_STREAM &stream, const ObjectContainer &objects);
[1421]228
[1614]229
[1237]230protected:
231
232        bool GlobalTerminationCriteriaMet(SubdivisionCandidate *candidate) const;
233
234        /** Prepare construction of the hierarchies, set parameters, compute
235                first split candidates.
236        */
[1308]237        void PrepareObjectSpaceSubdivision(
[1237]238                const VssRayContainer &sampleRays,
[1308]239                const ObjectContainer &objects);
[1237]240
[1311]241        void RunConstruction(
[1449]242                const bool repairQueue,
[1311]243                const VssRayContainer &sampleRays,
244                const ObjectContainer &objects,
245                AxisAlignedBox3 *forcedViewSpace);
[1449]246       
247        void RunConstruction(const bool repairQueue);
248               
[1580]249        /** Evaluates the subdivision candidate and executes the split.
250        */
251        bool ApplySubdivisionCandidate(SubdivisionCandidate *sc, const bool repairQueue);
[1237]252
253        bool FinishedConstruction() const;
254
255        SubdivisionCandidate *NextSubdivisionCandidate();
256
[1580]257        /** Repairs the dirty entries of the candidate queue.
258        */
[1237]259        void RepairQueue();
260
[1580]261        /** Collect the list of dirty candidates after the current subdivision candidate
262                split.
263        */
[1237]264        void CollectDirtyCandidates(vector<SubdivisionCandidate *> &dirtyList);
265
[1580]266        /** Evaluate subdivision stats for log.
267        */
268        void EvalSubdivisionStats(const float renderCostDecr);
[1237]269
[1259]270        void AddSubdivisionStats(
271                const int splits,
[1237]272                const float renderCostDecr,
[1576]273                const float totalRenderCost,
274                const int totalPvsEntries);
[1237]275
[1259]276        void CollectObjectSpaceDirtyList();
277        void CollectViewSpaceDirtyList();
[1237]278
[1259]279        bool AddSampleToPvs(Intersectable *obj,
280                                                const float pdf,
281                                                float &contribution) const;
282
283        void CollectViewSpaceDirtyList(SubdivisionCandidateContainer &dirtyList);
284        void CollectObjectSpaceDirtyList(SubdivisionCandidateContainer &dirtyList);
285               
[1287]286        void ExportOspTree(Exporter *exporter, const ObjectContainer &objects) const;
[1259]287
[1418]288        void ParseEnvironment();
[1415]289
[1418]290        bool StartObjectSpaceSubdivision() const;
291        bool StartViewSpaceSubdivision() const;
292
[1308]293        void PrepareBvHierarchy(
[1286]294                const VssRayContainer &sampleRays,
[1287]295                const ObjectContainer &objects);
[1286]296
[1308]297        void PrepareOspTree(
[1286]298                const VssRayContainer &sampleRays,
[1287]299                const ObjectContainer &objects);
[1286]300
[1311]301        void PrepareViewSpaceSubdivision(
302                const VssRayContainer &sampleRays,
[1379]303                const ObjectContainer &objects);
[1308]304
[1313]305        bool ObjectSpaceSubdivisionConstructed() const;
[1329]306        bool ViewSpaceSubdivisionConstructed() const;
[1311]307
[1313]308    void ResetQueue();
309
[1418]310        void FinishObjectSpaceSubdivision(const ObjectContainer &objects) const;
[1313]311
[1370]312        int GetObjectSpaceSubdivisionDepth() const;
313
[1449]314        void ConstructInterleaved(
315                const VssRayContainer &sampleRays,
316                const ObjectContainer &objects,
317                AxisAlignedBox3 *forcedViewSpace);
318
[1548]319        /** Use iteration to construct the object space hierarchy.
320        */
[1449]321        void ConstructMultiLevel(
322                const VssRayContainer &sampleRays,
323                const ObjectContainer &objects,
324                AxisAlignedBox3 *forcedViewSpace);
325
[1548]326        /** Reset the object space subdivision.
327                E.g., deletes hierarchy and resets stats.
328                so construction can be restarted.
329        */
330        void ResetObjectSpaceSubdivision(
331                const VssRayContainer &rays,
332                const ObjectContainer &objects);
[1449]333
[1557]334        void HierarchyManager::ResetViewSpaceSubdivision(
335                const VssRayContainer &rays,
336                const ObjectContainer &objects);
337
[1614]338
[1237]339protected:
340
[1323]341        enum {SEQUENTIAL, INTERLEAVED};
[1580]342        /// type of hierarchy construction
343        int mConstructionType;
344
345        /// Type of object space partition
[1308]346        int mObjectSpaceSubdivisionType;
[1580]347        /// Type of view space partition
[1329]348    int mViewSpaceSubdivisionType;
349
[1589]350        /// the traversal queue
351        SplitQueue mTQueue;
352       
[1580]353        ////////////
354        //-- helper variables
355       
356        // the original osp type
[1323]357        int mSavedObjectSpaceSubdivisionType;
[1580]358        // the original vsp type
[1329]359        int mSavedViewSpaceSubdivisionType;
[1580]360        /// the current subdivision candidate
361        SubdivisionCandidate *mCurrentCandidate;
[1323]362
[1259]363
[1580]364        ///////////////////
365        // Hierarchies
366
367        /// view space hierarchy
[1259]368        VspTree *mVspTree;
[1580]369        /// object space partition kd tree
[1259]370        OspTree *mOspTree;
[1589]371        public:
[1580]372        /// bounding volume hierarchy
[1259]373        BvHierarchy *mBvHierarchy;
[1580]374       
[1589]375protected:
[1237]376
377
[1580]378        //////////
[1576]379        //-- global termination criteria
380
[1580]381        /// the mininal acceptable cost ratio for a split
[1237]382        float mTermMinGlobalCostRatio;
[1580]383        /// the threshold for global cost miss tolerance
[1237]384        int mTermGlobalCostMissTolerance;
[1580]385        /// maximum number of leaves
386        int mTermMaxLeaves;
387
[1576]388        ////////////////////
389
[1237]390        /// keeps track of cost during subdivision
391        float mTotalCost;
[1580]392        /// statistics about the hierarchy
[1288]393        HierarchyStatistics mHierarchyStats;
394
[1308]395        int mMinDepthForObjectSpaceSubdivion;
[1370]396        int mMinDepthForViewSpaceSubdivion;
[1580]397       
[1237]398        ofstream mSubdivisionStats;
[1314]399
[1580]400        /// if the queue should be repaired after a subdivision steps
[1314]401        bool mRepairQueue;
[1370]402
403        bool mStartWithObjectSpace;
[1580]404        /** if multi level construction method should be used
405                where we iterate over both hierarchies until we
406                converge to the optimum.
407        */
[1449]408        bool mUseMultiLevelConstruction;
[1580]409        /// number of iteration steps for multilevel approach   
410        int mNumMultiLevels;
[1237]411};
412
413}
414
415#endif
Note: See TracBrowser for help on using the repository browser.