source: GTP/trunk/Lib/Vis/Preprocessing/src/CombinedPreprocessor.cpp @ 2680

Revision 2680, 4.7 KB checked in by mattausch, 16 years ago (diff)

started working on dyn objects

  • Property svn:executable set to *
Line 
1#include "SceneGraph.h"
2#include "KdTree.h"
3#include "X3dExporter.h"
4#include "Environment.h"
5#include "Polygon3.h"
6#include "VssRay.h"
7#include "RssTree.h"
8#include "ViewCellsManager.h"
9#include "RenderSimulator.h"
10#include "GlRenderer.h"
11#include "SamplingStrategy.h"
12#include "PreprocessorThread.h"
13#include "CombinedPreprocessor.h"
14#include "RayCaster.h"
15
16
17
18namespace GtpVisibilityPreprocessor {
19
20
21const bool pruneInvalidRays = true;
22
23 
24  CombinedPreprocessor::CombinedPreprocessor():
25        Preprocessor()
26  {
27        // this should increase coherence of the samples
28//      Environment::GetSingleton()->GetIntValue("RssPreprocessor.vssSamples", mTotalSamples);
29//      Environment::GetSingleton()->GetIntValue("RssPreprocessor.samplesPerPass", mSamplesPerPass);
30//      Environment::GetSingleton()->GetIntValue("RssPreprocessor.vssSamplesPerPass",
31//                                                                                       mSamplesPerEvaluation);
32       
33       
34  }
35
36
37
38bool
39CombinedPreprocessor::ComputeVisibility()
40{
41 
42  Debug << "Preprocessor type: combined" << endl;
43  cout<<"Combined Preprocessor started\n"<<flush;
44 
45  // if not already loaded, construct view cells from file
46  if (!mLoadViewCells) {
47        // construct view cells using it's own set of samples
48        mViewCellsManager->Construct(this);
49       
50        //-- several visualizations and statistics
51        Debug << "view cells construction finished: " << endl;
52        mViewCellsManager->PrintStatistics(Debug);
53  }
54 
55 
56  // now decode distribution string
57  char buff[1024];
58  Environment::GetSingleton()->GetStringValue("RssPreprocessor.distributions",
59                                                                                          buff);
60 
61 
62  mMixtureDistribution = new MixtureDistribution(*this);
63  mMixtureDistribution->Construct(buff);
64 
65  SimpleRayContainer rays;
66  VssRayContainer vssRays;
67
68  int lastEvaluation = 0;
69 
70  mPass = 0;
71 
72  vector<VssRayContainer> rayBuffer;
73  rays.reserve(mSamplesPerPass);
74  rayBuffer.reserve(2*mSamplesPerPass);
75 
76  long startTime = GetTime();
77
78  mCurrentSamples = 0;
79
80  for (mCurrentSamples =0; mCurrentSamples < mTotalSamples; mCurrentSamples += mSamplesPerPass, mPass++) {
81        mRayCaster->InitPass();
82       
83        cout<<"Progress :"<<mCurrentSamples/1e6f<<"M rays, "<<(100.0f*mCurrentSamples)/mTotalSamples<<"%"<<endl;
84       
85        rays.clear();
86        vssRays.clear();
87       
88       
89        mMixtureDistribution->GenerateSamples(mSamplesPerPass, rays);
90
91        cerr<<"Casting rays..."<<endl;
92       
93        bool doubleRays = true;
94        CastRays(rays, vssRays, doubleRays, pruneInvalidRays);
95        mTotalRaysCast += (int)vssRays.size();
96
97        cerr<<"Done..."<<endl;
98
99        cerr<<"Computing ray contributions..."<<endl;
100        mMixtureDistribution->ComputeContributions(vssRays);
101        cerr<<"Done..."<<endl;
102
103
104        if (mExportRays) {
105          Debug<<"Exporting rays..."<<endl<<flush;
106          char filename[256];
107
108          VssRayContainer contributingRays;
109          vssRays.GetContributingRays(contributingRays, 0);
110          sprintf(filename, "rss-crays-%04d.x3d", mPass);
111          ExportRays(filename, contributingRays, mExportNumRays);
112
113          sprintf(filename, "rss-rays-i%04d.x3d", mPass);
114          ExportRays(filename, vssRays, mExportNumRays);
115
116
117          if (mExportAnimation) {
118                rayBuffer.push_back(VssRayContainer());
119                vssRays.SelectRays(mExportNumRays, rayBuffer[rayBuffer.size()-1], true);
120          }
121
122          Debug<<"done."<<endl<<flush;
123        }
124       
125        mMixtureDistribution->UpdateDistributions(vssRays);
126       
127        if (mCurrentSamples - lastEvaluation >= mSamplesPerEvaluation) {
128          Real time = TimeDiff(startTime, GetTime());
129          mViewCellsManager->PrintPvsStatistics(mStats);
130          mStats <<
131                "#Pass\n" <<mPass<<endl<<
132                "#Time\n" << time <<endl<<
133                "#TotalSamples\n" << mCurrentSamples <<endl<<
134                "#RssSamples\n" <<mTotalRaysCast<<endl;
135
136          float last = 0.0f;
137          for (int k=0; k < 6; k++) {
138                float ratio = 0.0f;
139                if (k < mMixtureDistribution->mDistributions.size()) {
140                  ratio = mMixtureDistribution->mDistributions[k]->mRatio-last;
141                  last = mMixtureDistribution->mDistributions[k]->mRatio;;
142                }
143                mStats <<
144                  "#Distribution"<<k<<endl<<
145                  ratio<<endl;
146          }
147         
148          lastEvaluation = mCurrentSamples;
149         
150          if (renderer) {
151                cout<<"Evaluating render error"<<endl;
152                ComputeRenderError();
153                cout<<"finished evaluating error"<<endl;
154          }
155        }
156       
157       
158        Real time = TimeDiff(startTime, GetTime());
159        if (mTotalTime!= -1 && time/1000 > mTotalTime)
160          break;
161
162#if 0
163        cerr<<"deleting rays"<<endl;
164        //clear all unreferenced rays
165        for (int j=0; j < vssRays.size(); j++) {
166          if (vssRays[j]->RefCount() == 0)
167                delete vssRays[j];
168        }
169        cerr<<"done."<<endl;
170#endif 
171       
172        //      if (!mMixtureDistribution->RequiresRays())
173        //        CLEAR_CONTAINER(vssRays);
174
175       
176  }
177 
178  EvalViewCellHistogram();
179
180  if (mExportAnimation && mExportRays) {
181        char filename[64];
182        sprintf(filename, "rss-rays-i.x3d");
183        //rayBuffer.resize(mPass);
184        ExportRayAnimation(filename, rayBuffer);
185  }
186
187  return true;
188}
189
190}
Note: See TracBrowser for help on using the repository browser.