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

Revision 407, 3.3 KB checked in by mattausch, 19 years ago (diff)
Line 
1#include "RenderSimulator.h"
2#include "KdTree.h"
3#include "ViewCellBsp.h"
4#include "ViewCell.h"
5
6RenderSimulator::RenderSimulator()
7{}
8
9RenderSimulator::RenderSimulator(float objRenderCost, float vcOverhead):
10mObjRenderCost(objRenderCost), mVcOverhead(vcOverhead)
11{
12}
13
14/*****************************************************
15 *     class ViewCellRenderSimulator implementation  *
16 *****************************************************/
17
18BspTreeRenderSimulator::BspTreeRenderSimulator(float objRenderCost,
19                                                                                           float vcOverhead,
20                                                                                           BspTree *bspTree):
21RenderSimulator(objRenderCost, vcOverhead), mBspTree(bspTree)
22{
23}
24
25Real BspTreeRenderSimulator::SimulateRendering()
26{
27        Real renderTime = 0;
28
29        // total area of view cells
30        float totalArea = 0;//= mKdTree->GetBox().SurfaceArea();
31
32        ViewCellContainer viewCells;
33
34        mBspTree->CollectViewCells(viewCells);
35
36        ViewCellContainer::const_iterator it, it_end = viewCells.end();
37
38        // surface area substitute for probability
39        PolygonContainer cell;
40
41        for (it = viewCells.begin(); it != it_end; ++ it)
42        {
43                mBspTree->ConstructGeometry(dynamic_cast<BspViewCell *>(*it), cell);
44                CLEAR_CONTAINER(cell);
45                float area = Polygon3::GetArea(cell);
46               
47                renderTime += area * (RenderPvs(*(*it), mObjRenderCost) + mVcOverhead);
48                totalArea += area;
49        }
50
51        renderTime /= totalArea;
52
53        //Debug << "render time without overhead: " << renderTime * 1e-3 << endl;
54        //renderTime += (float)viewCells.size() * vcOverhead;
55
56        return renderTime;
57}
58
59Real BspTreeRenderSimulator::RenderPvs(ViewCell &viewCell,
60                                                                           float objRenderTime) const
61{
62        return viewCell.GetPvs().GetSize() * objRenderTime;
63}
64
65/********************************************************
66 *     class KdLeafRenderSimulator implementation       *
67 *******************************************************/
68
69KdTreeRenderSimulator::KdTreeRenderSimulator(float objRenderCost,
70                                                                                         float vcOverhead,
71                                                                                         KdTree *kdTree):
72RenderSimulator(objRenderCost, vcOverhead), mKdTree(kdTree)
73{
74}
75
76Real KdTreeRenderSimulator::SimulateRendering()
77{
78        //mKdTree->CollectLeavesPvs();
79
80        // total render time
81        Real renderTime = 0;
82        // overhead for loading a view cell
83        float loadOverhead = 0;
84
85        // probability that view point lies in a view cell
86        float pInVcTotal = 0;//mKdTree->GetBox().GetVolume();
87
88        // total probability that a view cell border is crossed
89        float pCrossVcTotal = 0;
90
91        vector<KdLeaf *> leaves;
92        mKdTree->CollectLeaves(leaves);
93       
94        AxisAlignedBox3 box;
95
96        vector<KdLeaf *>::const_iterator it, it_end = leaves.end();
97       
98        for (it = leaves.begin(); it != it_end; ++ it)
99        {
100                box = mKdTree->GetBox(*it);
101                       
102                // volume substitute for view point probability
103                float pInVc = 0;
104               
105                if (0)
106                        pInVc = box.GetVolume();
107                else
108                        pInVc = box.SurfaceArea();
109               
110                // probability that a view cell border is crossed
111                const float pCrossVc = box.SurfaceArea();
112
113                renderTime += pInVc * RenderPvs(*it, mObjRenderCost);
114                loadOverhead += pCrossVc * mVcOverhead;
115
116                pInVcTotal += pInVc;
117                pCrossVcTotal += pCrossVc;
118        }
119
120        renderTime /= pInVcTotal;
121        loadOverhead /= pCrossVcTotal;
122
123        return renderTime + loadOverhead;
124}
125
126Real KdTreeRenderSimulator::RenderPvs(KdLeaf *leaf,
127                                                                                   float objRenderTime) const
128{
129        return leaf->mKdPvs.GetSize() * objRenderTime;
130}
Note: See TracBrowser for help on using the repository browser.