source: trunk/VUT/GtpVisibilityPreprocessor/src/RenderSimulator.cpp @ 414

Revision 414, 5.3 KB checked in by mattausch, 19 years ago (diff)
RevLine 
[406]1#include "RenderSimulator.h"
2#include "KdTree.h"
3#include "ViewCellBsp.h"
4#include "ViewCell.h"
5
[414]6void SimulationStatistics::Print(ostream &app) const
7{
8        app << "===== Simulation statistics ===============\n";
9
10        app << setprecision(4);
11
12        app << "#N_CTIME  ( Simulation time [s] )\n" << Time() << " \n";
13
14        app << "#MAX_COST ( maximal cost of a view cell )\n" << maxCost << "\n";
15
16        app << "#MIN_COST ( minimal cost of a view cell )\n" << minCost << "\n";
17
18        app << "#AVG_RENDER_TIME ( average render time )\n" << avgRenderTime << "\n";
19
20        app << "#AVG_RENDER_TIME_NO_OVERHEAD ( average render time without overhead )\n" << avgRtWithoutOverhead << "\n";
21       
22        app << "===== END OF Simulation statistics ==========\n";
23}
24
[406]25RenderSimulator::RenderSimulator()
26{}
27
[409]28RenderSimulator::RenderSimulator(float objRenderCost, float vcOverhead, float moveSpeed):
29mObjRenderCost(objRenderCost), mVcOverhead(vcOverhead), mMoveSpeed(moveSpeed)
[406]30{
31}
32
33/*****************************************************
34 *     class ViewCellRenderSimulator implementation  *
35 *****************************************************/
36
[409]37BspViewCellRenderSimulator::BspViewCellRenderSimulator(float objRenderCost,
[406]38                                                                                           float vcOverhead,
[409]39                                                                                           float moveSpeed,
[406]40                                                                                           BspTree *bspTree):
[409]41RenderSimulator(objRenderCost, vcOverhead, moveSpeed), mBspTree(bspTree)
[406]42{
43}
44
[409]45Real BspViewCellRenderSimulator::SimulateRendering()
[406]46{
[414]47        mStat.Reset();
48        mStat.Start();
49
[406]50        Real renderTime = 0;
[414]51       
[409]52        // overhead for loading the PVS of the view cells
53        float loadPvsOverhead = 0;
54        // probability that view point lies in a view cell
55        float pInVcTotal = 0;
56        // total probability that a view cell border is crossed
57        float pCrossVcTotal = 0;
58
59        // collect all view cells
[406]60        ViewCellContainer viewCells;
61        mBspTree->CollectViewCells(viewCells);
62
63        ViewCellContainer::const_iterator it, it_end = viewCells.end();
[407]64
65        // surface area substitute for probability
[409]66        PolygonContainer geom;
[407]67
[406]68        for (it = viewCells.begin(); it != it_end; ++ it)
69        {
[410]70                // compute view cell area
[409]71                mBspTree->ConstructGeometry(dynamic_cast<BspViewCell *>(*it), geom);
[410]72                const float area = Polygon3::GetArea(geom);
[409]73                CLEAR_CONTAINER(geom);
74
75                // area substitute for view point probability
76                float pInVc = area;
77                               
78                // compute render time of PVS times probability that view point is in view cell
[414]79                float vcCost = pInVc * RenderPvs(*(*it), mObjRenderCost);
[406]80               
[414]81                renderTime += vcCost;
82
83                if (vcCost > mStat.maxCost)
84                        mStat.maxCost = vcCost;
85                else if (vcCost < mStat.minCost)
86                        mStat.minCost = vcCost;
87
[409]88                // probability that a view cell border is crossed
89                float pCrossVc = area;
90
[414]91                // crossing the border of a view cell is also depending on the move speed
[409]92                loadPvsOverhead += pCrossVc * mVcOverhead * mMoveSpeed;
93
94                pInVcTotal += pInVc;
95                pCrossVcTotal += pCrossVc;
[406]96        }
97
[409]98       
99        renderTime /= pInVcTotal;
100        loadPvsOverhead /= pCrossVcTotal;
[406]101
[414]102        mStat.avgRtWithoutOverhead = renderTime;
103        mStat.avgRenderTime = renderTime + loadPvsOverhead;
[409]104       
[414]105        mStat.Stop();
106
[409]107        return renderTime + loadPvsOverhead;
[406]108}
109
[409]110Real BspViewCellRenderSimulator::RenderPvs(ViewCell &viewCell,
[407]111                                                                           float objRenderTime) const
[406]112{
113        return viewCell.GetPvs().GetSize() * objRenderTime;
114}
115
[407]116/********************************************************
117 *     class KdLeafRenderSimulator implementation       *
118 *******************************************************/
[406]119
[409]120KdViewCellRenderSimulator::KdViewCellRenderSimulator(float objRenderCost,
121                                                                                         float vcOverhead,
122                                                                                         float moveSpeed,
[406]123                                                                                         KdTree *kdTree):
[409]124RenderSimulator(objRenderCost, vcOverhead, moveSpeed), mKdTree(kdTree)
[406]125{
126}
127
[409]128Real KdViewCellRenderSimulator::SimulateRendering()
[406]129{
[407]130        //mKdTree->CollectLeavesPvs();
[414]131        mStat.Reset();
132        mStat.Start();
[407]133
134        // total render time
[406]135        Real renderTime = 0;
[407]136        // overhead for loading a view cell
[409]137        float loadPvsOverhead = 0;
[406]138
[407]139        // probability that view point lies in a view cell
140        float pInVcTotal = 0;//mKdTree->GetBox().GetVolume();
[406]141
[407]142        // total probability that a view cell border is crossed
143        float pCrossVcTotal = 0;
144
145        vector<KdLeaf *> leaves;
146        mKdTree->CollectLeaves(leaves);
147       
148        AxisAlignedBox3 box;
149
150        vector<KdLeaf *>::const_iterator it, it_end = leaves.end();
151       
152        for (it = leaves.begin(); it != it_end; ++ it)
153        {
154                box = mKdTree->GetBox(*it);
155                       
156                // volume substitute for view point probability
157                float pInVc = 0;
158               
159                if (0)
160                        pInVc = box.GetVolume();
161                else
162                        pInVc = box.SurfaceArea();
163               
164                // probability that a view cell border is crossed
165                const float pCrossVc = box.SurfaceArea();
166
[414]167                float vcCost = pInVc * RenderPvs(*it, mObjRenderCost);
168                renderTime += vcCost;
169
170                if (vcCost > mStat.maxCost)
171                        mStat.maxCost = vcCost;
172                else if (vcCost < mStat.minCost)
173                        mStat.minCost = vcCost;
174
[409]175                loadPvsOverhead += pCrossVc * mVcOverhead * mMoveSpeed;
[407]176
177                pInVcTotal += pInVc;
178                pCrossVcTotal += pCrossVc;
179        }
180
[414]181        Debug << "RT: " << renderTime << endl;
182        Debug << "pvsOverhead: " << loadPvsOverhead << endl;
183
184
[407]185        renderTime /= pInVcTotal;
[409]186        loadPvsOverhead /= pCrossVcTotal;
[407]187
[414]188    mStat.avgRtWithoutOverhead = renderTime;
189        mStat.avgRenderTime = renderTime + loadPvsOverhead;
190       
191        mStat.Stop();
192
[409]193        return renderTime + loadPvsOverhead;
[407]194}
195
[409]196Real KdViewCellRenderSimulator::RenderPvs(KdLeaf *leaf,
[407]197                                                                                   float objRenderTime) const
198{
199        return leaf->mKdPvs.GetSize() * objRenderTime;
[406]200}
Note: See TracBrowser for help on using the repository browser.