source: GTP/trunk/Lib/Vis/Preprocessing/src/GvsPreprocessor.cpp @ 1460

Revision 1460, 3.8 KB checked in by bittner, 18 years ago (diff)

gvs template

  • Property svn:executable set to *
Line 
1#include "Environment.h"
2#include "GvsPreprocessor.h"
3#include "GlRenderer.h"
4
5namespace GtpVisibilityPreprocessor
6{
7 
8
9GvsPreprocessor::GvsPreprocessor():Preprocessor()
10{
11  environment->GetIntValue("RenderSampler.samples", mSamples);
12  cout << "number of render samples: " << mSamples << endl;
13}
14 
15
16void
17GvsPreprocessor::GenerateRandomRay(Ray &ray)
18{
19  int objId = RandomValue(0, mObjects.size());
20  Intersectable *object = objects[objId];
21  object->GetRandomSurfacePoint(point, normal);
22  direction = UniformRandomVector(normal);
23  SetupRay(ray, point, direction);
24}
25
26void
27GvsPreprocessor::HandleRay(Ray &ray)
28{
29  int sampleContributions = 0;
30 
31  mKdTree->CastRay(ray);
32 
33  if (ray.leaves.size()) {
34        sampleContributions += AddNodeSamples(object, ray, pass);
35   
36        if (ray.intersections.size()) {
37          sampleContributions += AddNodeSamples(ray.intersections[0].mObject, ray, pass);
38        }
39  }
40}
41
42void
43GvsPreprocessor::BorderSampling(Ray &ray)
44{
45 
46 
47}
48
49void
50GvsPreprocessor::Pass()
51{
52  Ray ray;
53  while (1) {
54        AvsGenerateRay(ray);
55        HandleRay(ray);
56        while ( !mRayQueue.empty() ) {
57          Ray ray = mRayQueue.pop();
58          mRayQueue.pop();
59          AdaptiveBorderSampling(ray);
60        }
61  }
62}
63
64
65bool
66GvsPreprocessor::ComputeVisibility()
67{
68  long startTime = GetTime();
69
70
71  Debug << "type: gvs" << endl;
72 
73  cout<<"Gvs Preprocessor started\n"<<flush;
74  //  cout<<"Memory/ray "<<sizeof(VssRay)+sizeof(RssTreeNode::RayInfo)<<endl;
75
76  Randomize(0);
77 
78  long startTime = GetTime();
79 
80  int totalSamples = 0;
81 
82  ConstructViewCells();
83 
84  int samples = 0;
85  int i=0;
86  while (samples < mTotalSamples) {
87        for (i=0; i < mSamplesPerPass; i++, samples++) {
88         
89          if (i%10000 == 0)
90                cout<<"+";
91         
92          Vector3 origin, direction;
93          mViewCellsManager->GetViewPoint(origin);
94          direction = UniformRandomVector();
95         
96          ViewCell *viewcell = mViewCellsManager->GetViewCell(origin);
97         
98          if (viewcell && viewcell->GetValid()) {
99                // cast rays in both directions to make the number of samples comparable
100                // with the global sampling method which also casts a "double" ray per sample
101                for (int j=0; j < 2; j++) {
102                  Intersectable *object = CastRay(origin, direction);
103                  if (object) {
104                        // if ray not outside of view space
105                        float contribution;
106                        int pvsContribution = 0;
107                        float relativePvsContribution = 0;
108                        if (object) {
109                          float pdf = 1.0f;
110                          if (viewcell->GetPvs().GetSampleContribution(object,
111                                                                                                                   pdf,
112                                                                                                                   contribution))
113                                ++pvsContribution;
114                          relativePvsContribution += contribution;
115                          viewcell->GetPvs().AddSample(object, pdf);
116                        }
117                  }
118                  direction = -direction;
119                }
120          }
121         
122          if (samples > mTotalSamples)
123                break;
124        }
125       
126        //      mVssRays.PrintStatistics(mStats);
127        mStats <<
128          "#Time\n" << TimeDiff(startTime, GetTime())*1e-3<<endl<<
129          "#TotalSamples\n" <<samples<<endl;
130
131        mViewCellsManager->PrintPvsStatistics(mStats);
132        // ComputeRenderError();
133  }
134 
135  //  HoleSamplingPass();
136        if (0) {
137          Exporter *exporter = Exporter::GetExporter("ray-density.x3d");
138          exporter->SetExportRayDensity(true);
139          exporter->ExportKdTree(*mKdTree);
140          delete exporter;
141        }
142       
143       
144        // $$JB temporary removed
145        //      mViewCellsManager->PostProcess(objects, mSampleRays);
146       
147        //-- several visualizations and statistics
148        Debug << "view cells after post processing: " << endl;
149        mViewCellsManager->PrintStatistics(Debug);
150       
151        //-- render simulation after merge
152        cout << "\nevaluating bsp view cells render time after merge ... ";
153       
154        mRenderSimulator->RenderScene();
155        SimulationStatistics ss;
156        mRenderSimulator->GetStatistics(ss);
157       
158        cout << " finished" << endl;
159        cout << ss << endl;
160        Debug << ss << endl;
161       
162        // $$JB temporary removed
163        //mViewCellsManager->Visualize(objects, mSampleRays);   
164
165  return true;
166}
167
168}
Note: See TracBrowser for help on using the repository browser.