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

Revision 1576, 9.3 KB checked in by mattausch, 18 years ago (diff)

added measurement for pvs entries size decrease during subdivision

Line 
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"
12#include "SubdivisionCandidate.h"
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;
41class BvHierarchy;
42class Exporter;
43
44
45
46/** View space / object space hierarchy statistics.
47*/
48class HierarchyStatistics: public StatisticsBase
49{
50public:
51        /// total number of entries in the pvs
52        int pvsEntries;
53        /// storage cost
54        int memory;
55        /// total number of nodes
56        int nodes;
57        /// maximal reached depth
58        int maxDepth;
59        /// accumulated depth
60        int accumDepth;
61        /// time spent for queue repair
62        float repairTime;
63        // global cost ratio violations
64        int mGlobalCostMisses;
65
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
79        void Reset()
80        {
81                mGlobalCostMisses = 0;
82                nodes = 0;
83                maxDepth = 0;
84                accumDepth = 0;
85                repairTime = 0;
86                memory = 0;
87                pvsEntries = 0;
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
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{
126        friend VspTree;
127        friend OspTree;
128        friend BvHierarchy;
129        friend ViewCellsParseHandlers;
130
131public:
132        /** Constructor with the view space partition tree and
133                the object space hierarchy type as argument.
134        */
135        HierarchyManager(const int objectSpaceHierarchyType);
136        /** Hack: OspTree will copy the content from this kd tree.
137                Only view space hierarchy will be constructed.
138        */
139        HierarchyManager(KdTree *kdTree);
140
141        /** Deletes space partition and view space partition.
142        */
143        ~HierarchyManager();
144
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        */
150        void Construct(
151                const VssRayContainer &sampleRays,
152                const ObjectContainer &objects,
153                AxisAlignedBox3 *forcedViewSpace);
154
155        enum
156        {
157                NO_OBJ_SUBDIV,
158                KD_BASED_OBJ_SUBDIV,
159                BV_BASED_OBJ_SUBDIV
160        };
161
162        enum
163        {
164                NO_VIEWSPACE_SUBDIV,
165                KD_BASED_VIEWSPACE_SUBDIV
166        };
167
168        /** The type of object space subdivison
169        */
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        */             
176        void SetViewCellsManager(ViewCellsManager *vcm);
177        /** Sets a pointer to the view cells tree.
178        */
179        void SetViewCellsTree(ViewCellsTree *vcTree);
180        /** Exports the object hierarchy to disc.
181        */
182        void ExportObjectSpaceHierarchy(OUT_STREAM &stream);
183        /** Adds a sample to the pvs of the specified view cell.
184        */
185        bool AddSampleToPvs(
186                Intersectable *obj,
187                const Vector3 &hitPoint,
188                ViewCell *vc,
189                const float pdf,
190                float &contribution) const;
191
192        /** Print out statistics.
193        */
194        void PrintHierarchyStatistics(ostream &stream) const;
195
196        /** Returns the view space partition tree.
197        */
198        VspTree *GetVspTree();
199
200        /** Returns view space bounding box.
201        */
202        //AxisAlignedBox3 GetViewSpaceBox() const;
203        /** Returns object space bounding box.
204        */
205        AxisAlignedBox3 GetObjectSpaceBox() const;
206
207        /** Exports object space hierarchy for visualization.
208        */
209        void ExportObjectSpaceHierarchy(
210                Exporter *exporter,
211                const ObjectContainer &objects,
212                const AxisAlignedBox3 *bbox,
213                const bool exportBounds = true) const;
214
215        /** Returns intersectable pierced by this ray.
216        */
217        Intersectable *GetIntersectable(
218                const VssRay &ray,
219                const bool isTermination) const;
220
221        friend ostream &operator<<(ostream &s, const HierarchyManager &hm)
222        {
223                hm.PrintHierarchyStatistics(s);
224                return s;
225        }
226
227
228protected:
229
230        bool GlobalTerminationCriteriaMet(SubdivisionCandidate *candidate) const;
231
232        /** Prepare construction of the hierarchies, set parameters, compute
233                first split candidates.
234        */
235        void PrepareObjectSpaceSubdivision(
236                const VssRayContainer &sampleRays,
237                const ObjectContainer &objects);
238
239        void RunConstruction(
240                const bool repairQueue,
241                const VssRayContainer &sampleRays,
242                const ObjectContainer &objects,
243                AxisAlignedBox3 *forcedViewSpace);
244       
245        void RunConstruction(const bool repairQueue);
246               
247        bool ApplySubdivisionCandidate(SubdivisionCandidate *sc);
248
249        bool FinishedConstruction() const;
250
251        SubdivisionCandidate *NextSubdivisionCandidate();
252
253        void RepairQueue();
254
255        void CollectDirtyCandidates(vector<SubdivisionCandidate *> &dirtyList);
256
257        void EvalSubdivisionStats(const SubdivisionCandidate &tData);
258
259        void AddSubdivisionStats(
260                const int splits,
261                const float renderCostDecr,
262                const float totalRenderCost,
263                const int totalPvsEntries);
264
265        void CollectObjectSpaceDirtyList();
266        void CollectViewSpaceDirtyList();
267
268        bool AddSampleToPvs(Intersectable *obj,
269                                                const float pdf,
270                                                float &contribution) const;
271
272        void CollectViewSpaceDirtyList(SubdivisionCandidateContainer &dirtyList);
273        void CollectObjectSpaceDirtyList(SubdivisionCandidateContainer &dirtyList);
274               
275        void ExportOspTree(Exporter *exporter, const ObjectContainer &objects) const;
276
277        void ParseEnvironment();
278
279        bool StartObjectSpaceSubdivision() const;
280        bool StartViewSpaceSubdivision() const;
281
282        void PrepareBvHierarchy(
283                const VssRayContainer &sampleRays,
284                const ObjectContainer &objects);
285
286        void PrepareOspTree(
287                const VssRayContainer &sampleRays,
288                const ObjectContainer &objects);
289
290        void PrepareViewSpaceSubdivision(
291                const VssRayContainer &sampleRays,
292                const ObjectContainer &objects);
293
294        bool ObjectSpaceSubdivisionConstructed() const;
295        bool ViewSpaceSubdivisionConstructed() const;
296
297    void ResetQueue();
298
299        void FinishObjectSpaceSubdivision(const ObjectContainer &objects) const;
300
301        int GetObjectSpaceSubdivisionDepth() const;
302
303        void ConstructInterleaved(
304                const VssRayContainer &sampleRays,
305                const ObjectContainer &objects,
306                AxisAlignedBox3 *forcedViewSpace);
307
308        /** Use iteration to construct the object space hierarchy.
309        */
310        void ConstructMultiLevel(
311                const VssRayContainer &sampleRays,
312                const ObjectContainer &objects,
313                AxisAlignedBox3 *forcedViewSpace);
314
315        /** Reset the object space subdivision.
316                E.g., deletes hierarchy and resets stats.
317                so construction can be restarted.
318        */
319        void ResetObjectSpaceSubdivision(
320                const VssRayContainer &rays,
321                const ObjectContainer &objects);
322
323        void HierarchyManager::ResetViewSpaceSubdivision(
324                const VssRayContainer &rays,
325                const ObjectContainer &objects);
326
327protected:
328
329        enum {SEQUENTIAL, INTERLEAVED};
330       
331        int mObjectSpaceSubdivisionType;
332    int mViewSpaceSubdivisionType;
333
334        /// the original osp type
335        int mSavedObjectSpaceSubdivisionType;
336        int mSavedViewSpaceSubdivisionType;
337
338        int mConstructionType;
339
340        VspTree *mVspTree;
341        OspTree *mOspTree;
342        BvHierarchy *mBvHierarchy;
343
344        AxisAlignedBox3 mBoundingBox;
345
346        SplitQueue mTQueue;
347
348        SubdivisionCandidate *mCurrentCandidate;
349
350        ////////
351        //-- global termination criteria
352
353        float mTermMinGlobalCostRatio;
354        int mTermGlobalCostMissTolerance;
355       
356        ////////////////////
357
358        /// keeps track of cost during subdivision
359        float mTotalCost;
360
361        int mTotalPvsEntries;
362        HierarchyStatistics mHierarchyStats;
363
364        int mMinDepthForObjectSpaceSubdivion;
365        int mMinDepthForViewSpaceSubdivion;
366
367        int mTermMaxLeaves;
368        ofstream mSubdivisionStats;
369
370        bool mRepairQueue;
371
372        bool mStartWithObjectSpace;
373
374        bool mUseMultiLevelConstruction;
375};
376
377}
378
379#endif
Note: See TracBrowser for help on using the repository browser.