source: trunk/VUT/GtpVisibilityPreprocessor/src/ViewCell.h @ 580

Revision 580, 10.5 KB checked in by mattausch, 18 years ago (diff)

implemented variance
started implementing merge history

Line 
1#ifndef _ViewCell_H__
2#define _ViewCell_H__
3
4#include "Mesh.h"
5#include "Containers.h"
6#include "Ray.h"
7#include "Statistics.h"
8//namespace GtpVisibilityPreprocessor {
9
10struct Triangle3;
11
12class BspInterior;
13class BspPvs;
14class BspLeaf;
15class VspKdTree;
16class VspKdLeaf;
17class KdLeaf;
18class ViewCellInterior;
19class MergeCandidate;
20class ViewCellsManager;
21
22/** Statistics for a view cell partition.
23*/
24
25class ViewCellsStatistics: public StatisticsBase
26{
27public:
28
29        /// number of view cells
30        int viewCells;
31
32        /// size of the PVS
33        int pvs;
34
35        /// largest PVS of all view cells
36        int maxPvs;
37
38        /// smallest PVS of all view cells
39        int minPvs;
40
41        /// view cells with empty PVS
42        int emptyPvs;
43
44        /// number of leaves covering the view space
45        int leaves;
46
47        /// largest number of leaves covered by one view cell
48        int maxLeaves;
49
50        int invalid;
51
52    // Constructor
53        ViewCellsStatistics()
54        {
55                Reset();
56        }
57
58        double AvgLeaves() const {return (double)leaves / (double)viewCells;};
59        double AvgPvs() const {return (double)pvs / (double)viewCells;};
60
61        void Reset()
62        {
63                viewCells = 0;
64                pvs = 0;
65                maxPvs = 0;
66
67                minPvs = 999999;
68                emptyPvs = 0;
69                leaves = 0;
70                maxLeaves = 0;
71                invalid = 0;
72        }
73
74        void Print(ostream &app) const;
75
76        friend ostream &operator<<(ostream &s, const ViewCellsStatistics &stat)
77        {
78                stat.Print(s);
79                return s;
80        }
81};
82
83
84/**
85        View cell with an optional mesh representation
86*/
87
88
89class ViewCell: public MeshInstance
90{
91public:
92        ViewCell();
93
94        /** Constructor taking a mesh representing the shape of the viewcell.
95        */
96        ViewCell(Mesh *mesh);
97
98        /** Default destructor.
99        */
100        virtual ~ViewCell() {}
101
102        /** Returns Pvs.
103        */
104        const ObjectPvs &GetPvs() const;
105        ObjectPvs &GetPvs();
106
107        int Type() const;
108
109        void SetParent(ViewCellInterior *parent);
110
111        /** Adds a passing ray to the passing ray container.
112        */
113        void AddPassingRay(const Ray &ray, const int contributions);
114
115        /** Returns volume of the view cell.
116        */
117        float GetVolume() const;
118
119        /** Returns area of the view cell.
120        */
121        float GetArea() const;
122
123        /** Sets the volume of the view cell.
124        */
125        void SetVolume(float volume);
126       
127        /** Sets the area of the view cell.
128        */
129        void SetArea(float area);
130
131        /** Updates the view cell statstics for this particular view cell.
132        */
133        virtual void UpdateViewCellsStats(ViewCellsStatistics &vcStat);
134
135        /** if this view cell is the root of a view cell hierarchy
136        */
137        bool IsRoot() const;
138
139        /** Returns parent view cell.
140        */
141        ViewCellInterior *GetParent() const;
142
143       
144        /** Sets the mesh for this view cell.
145        */
146        void SetMesh(Mesh *mesh);
147
148        void SetValid(const bool valid);
149        bool GetValid() const;
150
151
152
153
154        /// parent view cell in the view cell hierarchy
155        ViewCellInterior *mParent;
156
157        /// Rays piercing this view cell.
158        RayContainer mPiercingRays;
159
160
161        /** if this is a view cell correspending to a leaf in a hierarchy.
162        */
163        virtual bool IsLeaf() const = 0;
164
165  static bool SmallerPvs(const ViewCell *a,
166                                                 const ViewCell *b) {
167        return a->GetPvs().GetSize() < b->GetPvs().GetSize();
168  }
169
170
171        void SetTimeStamp(const int timeStamp);
172        int GetTimeStamp() const;
173        static void NewMail(const int reserve = 1) {
174                sMailId += sReservedMailboxes;
175                sReservedMailboxes = reserve;
176        }
177        void Mail() { mMailbox = sMailId; }
178        bool Mailed() const { return mMailbox == sMailId; }
179
180        void Mail(const int mailbox) { mMailbox = sMailId + mailbox; }
181        bool Mailed(const int mailbox) const { return mMailbox == sMailId + mailbox; }
182
183        int IncMail() { return ++mMailbox - sMailId; }
184
185
186                                                 
187        // last mail id -> warning not thread safe!
188        // both mailId and mailbox should be unique for each thread!!!
189        static int sMailId;
190        static int sReservedMailboxes;
191       
192
193protected:
194
195        /// the potentially visible objects
196        ObjectPvs mPvs;
197
198        float mVolume;
199        float mArea;
200
201        int mTimeStamp;
202
203        bool mValid;
204};
205
206
207class ViewCellInterior: public ViewCell
208{
209public:
210        ViewCellInterior();
211        ~ViewCellInterior();
212
213        ViewCellInterior(Mesh *mesh);
214       
215
216        /** Sets pointer from parent to child and vice versa.
217        */
218        void SetupChildLink(ViewCell *l);
219        bool IsLeaf() const;
220
221        ViewCellContainer mChildren;
222
223};
224
225/**
226        View cell belonging to a hierarchy.
227*/
228template<typename T>
229class ViewCellLeaf: public ViewCell
230{
231public:
232
233        ViewCellLeaf<T>(): mLeaf(NULL) {}
234        ViewCellLeaf<T>(Mesh *mesh):
235                ViewCell(mesh), mLeaf(NULL) {}
236
237        void UpdateViewCellsStats(ViewCellsStatistics &vcStat)
238        {
239                ViewCell::UpdateViewCellsStats(vcStat);
240
241                //if ((int)mLeaves.size() > vcStat.maxLeaves)
242                //      vcStat.maxLeaves = (int)mLeaves.size();
243                //vcStat.leaves += (int)mLeaves.size();
244        }
245
246        bool IsLeaf() const
247        {
248                return true;
249        }
250
251        /// Leaf of some hierarchy which is part of this view cell.
252        T mLeaf;
253};
254
255
256typedef ViewCellLeaf<BspLeaf *> BspViewCell;
257typedef ViewCellLeaf<KdLeaf *> KdViewCell;
258typedef ViewCellLeaf<VspKdLeaf *> VspKdViewCell;
259
260
261
262class ViewCellsTree
263{
264public:
265        ViewCellsTree(ViewCellsManager *vcm);
266        ~ViewCellsTree();
267
268        /** Returns number of leaves this view cell consists of.
269        */
270        int GetSize(ViewCell *vc) const;
271
272        /** Collects leaves corresponding to a view cell.
273        */
274        void CollectLeaves(ViewCell *vc, ViewCellContainer &leaves) const;
275
276        /** Merges view cells according to some cost heuristics.
277        */
278        int ConstructMergeTree(const VssRayContainer &rays, const ObjectContainer &objects);
279       
280        /** Refines view cells using shuffling, i.e., border leaves
281                of two view cells are exchanged if the resulting view cells
282                are tested to be "better" than the old ones.
283                @returns number of refined view cells
284        */
285        int RefineViewCells(const VssRayContainer &rays, const ObjectContainer &objects);
286
287        /** Compresses the pvs of the view cells.
288        */
289        void CompressViewCellsPvs();
290
291        /** Returns optimal set of view cells for a given number of view cells.
292        */
293        void CollectBestViewCellSet(ViewCellContainer &viewCells, const int numViewCells);
294
295protected:
296
297
298        //////////////////////////////////////////////////////////////
299        //                 merge options                            //
300        //////////////////////////////////////////////////////////////
301       
302
303        /** Returns cost of this leaf according to current heuristics.
304        */
305        float GetCostHeuristics(ViewCell *vc) const;
306
307        /** Returns cost of leaf.
308        */
309        float GetRenderCost(ViewCell *vc) const;
310
311        /** Evaluates the merge cost of this merge candidate pair.
312        */
313        void EvalMergeCost(MergeCandidate &mc) const;
314
315        /** Variance of leaf.
316        */
317        float GetVariance(ViewCell *vc) const;
318
319        /** Standard deviation of leaf.
320        */
321        float GetDeviation(ViewCell *vc) const;
322
323        /** Recalculates this merge candidate and sets valid.
324        */
325        void SetMergeCandidateValid(MergeCandidate &mc) const;
326
327        /** Merge view cells of leaves l1 and l2.
328                @returns difference in pvs size
329        */
330        ViewCellInterior *MergeViewCells(ViewCell *l, ViewCell *r, int &pvsDiff); //const;
331
332        /** Shuffles, i.e. takes border leaf from view cell 1 and adds it
333                to view cell 2.
334        */
335        void ShuffleLeaf(ViewCell *leaf, ViewCell *vc1, ViewCell *vc2) const;   
336               
337        /** Shuffles the leaves, i.e., tests if exchanging
338                the leaves helps in improving the view cells.
339        */
340        bool ShuffleLeaves(ViewCell *l, ViewCell *r) const;
341
342        /** Calculates cost for merge of view cell 1 and 2.
343        */
344        float EvalShuffleCost(ViewCell *leaf, ViewCell *vc1, ViewCell *vc2) const;
345
346        /** Exports a snapshot of the merged view cells to disc.
347        */
348        void ExportMergedViewCells(ViewCellContainer &viewCells,
349                                                           const ObjectContainer &objects,
350                                                           const int numNewViewCells);
351
352
353
354        /** merge queue must be reset after some time because expected value
355                may not be valid.
356        */
357        void ResetMergeQueue();
358
359        /** Updates the current top level of view cells.
360        */
361        int UpdateMergedViewCells(ViewCellContainer &viewCells);
362
363
364
365        ViewCellsManager *mViewCellsManager;
366        ViewCell *mRoot;
367
368        /// if merge visualization should be shown
369        bool mExportMergedViewCells;
370
371       
372               
373        ViewCellContainer mInactiveViewCells;
374        ViewCellContainer mActiveViewCells;
375
376        /// weights between variance and render cost increase (must be between zero and one)
377        float mRenderCostWeight;
378
379        /// overall cost used to normalize cost ratio
380        float mOverallCost;
381        float mExpectedCost;
382    float mDeviation;
383        float mAvgRenderCost;
384
385        int mUseAreaForPvs;
386
387        int mNumViewCells;
388
389        /// minimal number of view cells
390        int mMergeMinViewCells;
391        /// maximal cost ratio for the merge
392        float mMergeMaxCostRatio;
393
394        ofstream mStats;
395
396        typedef priority_queue<MergeCandidate> MergeQueue;
397
398        MergeQueue mMergeQueue;
399
400       
401
402};
403
404
405/**
406        Candidate for leaf merging based on priority.
407*/
408class MergeCandidate
409
410        friend class ViewCellsTree;
411
412public:
413
414        MergeCandidate(ViewCell *l, ViewCell *r);
415
416        /** If this merge pair is still valid.
417        */
418        bool IsValid() const;
419
420       
421        friend bool operator<(const MergeCandidate &leafa, const MergeCandidate &leafb)
422        {
423                return leafb.GetMergeCost() < leafa.GetMergeCost();
424        }
425
426        void SetLeftViewCell(ViewCell *l);
427        void SetRightViewCell(ViewCell *l);
428
429        ViewCell *GetLeftViewCell() const;
430        ViewCell *GetRightViewCell() const;
431
432        ViewCell *GetInitialLeftViewCell() const;
433        ViewCell *GetInitialRightViewCell() const;
434
435        /** Returns the increase of the standard deviation of this merge candidate.
436        */
437        float GetDeviationIncr() const;
438
439        /** Merge cost of this candidate pair.
440        */
441        float GetMergeCost() const;
442
443        /** Render cost of this candidate.
444        */
445        float GetRenderCost() const;
446       
447        static float sRenderCostWeight;
448
449protected:
450
451        /// render cost increase by this merge
452        float mRenderCost;
453        /// increase / decrease of standard deviation
454        float mDeviationIncr;
455
456        ViewCell *mLeftViewCell;
457        ViewCell *mRightViewCell;
458
459        ViewCell *mInitialLeftViewCell;
460        ViewCell *mInitialRightViewCell;
461};
462
463
464class MergeStatistics: public StatisticsBase
465{
466public:
467       
468        int merged;
469        int siblings;
470        int candidates;
471        int nodes;
472
473        int accTreeDist;
474        int maxTreeDist;
475       
476        Real collectTime;
477        Real mergeTime;
478
479        Real overallCost;
480
481        Real expectedRenderCost;
482        Real deviation;
483        Real heuristics;
484
485        // Constructor
486        MergeStatistics()
487        {
488                Reset();
489        }
490       
491        double AvgTreeDist() const {return (double)accTreeDist / (double)merged;};
492
493        void Reset()
494        {
495                nodes = 0;
496                merged = 0;
497                siblings = 0;
498                candidates = 0;
499       
500                accTreeDist = 0;
501                maxTreeDist = 0;
502
503                collectTime = 0;
504                mergeTime = 0;
505                overallCost = 0;
506
507                expectedRenderCost = 0;
508                deviation = 0;
509                heuristics = 0;
510
511        }
512
513        void Print(ostream &app) const;
514
515        friend ostream &operator<<(ostream &s, const MergeStatistics &stat)
516        {
517                stat.Print(s);
518                return s;
519        }
520};
521
522#endif
Note: See TracBrowser for help on using the repository browser.