source: GTP/trunk/Lib/Vis/Preprocessing/src/FilterBasedDistribution.cpp @ 2598

Revision 2598, 2.3 KB checked in by mattausch, 16 years ago (diff)
Line 
1
2#include "Mesh.h"
3#include "FilterBasedDistribution.h"
4#include "Vector3.h"
5#include "Preprocessor.h"
6#include "ViewCellsManager.h"
7
8namespace GtpVisibilityPreprocessor {
9
10bool
11FilterBasedDistribution::GenerateSample(SimpleRay &ray)
12{
13  int tries = 0;
14  const int maxTries = 10;
15 
16  while (mViewCell == NULL || samplesGenerated >= samplesToGenerate
17                 ) {
18        // find a new viewcell to cast the sample from
19        if (tries++ > maxTries)
20          return false;
21
22        Vector3 point;
23
24       
25        float r[3];
26        r[0] = RandomValue(0.0f,1.0f);
27        r[1] = RandomValue(0.0f,1.0f);
28        r[2] = RandomValue(0.0f,1.0f);
29        //      static HaltonSequence sHalton;
30        //      sHalton.GetNext(3, r);
31       
32        mPreprocessor.mViewCellsManager->GetViewPoint(point, Vector3(r[0],
33                                                                                                                                 r[1],
34                                                                                                                                 r[2]));
35
36       
37        mViewCell = mPreprocessor.mViewCellsManager->GetViewCell(point);
38       
39        if (mViewCell && mViewCell->GetPvs().GetSize()) {
40
41          //      cout<<mViewCell<<endl;
42
43         
44         
45          // apply spatial filter
46          mFilteredPvs.Clear();
47          PvsFilterStatistics fstat = mPreprocessor.mViewCellsManager->
48                ApplyFilter2(mViewCell,
49                                         false,
50                                         mPreprocessor.mViewCellsManager->GetFilterWidth(),
51                                         mFilteredPvs,
52                                         NULL,
53                                         true);
54         
55          //      cout<<mViewCell->GetPvs().GetSize()<<" "<<mFilteredPvs.GetSize()<<endl;
56
57          if (mFilteredPvs.GetSize()) {
58                samplesGenerated = 0;
59                samplesToGenerate = Max(100, Min(1000, mFilteredPvs.GetSize()));
60          } else
61                mViewCell = NULL; // try another viewcell
62        }
63  }
64
65  Vector3 origin, normal;
66 
67  mViewCell->GetRandomSurfacePoint(origin, normal);
68 
69  // pickup random object from the filtered pvs
70  int id = (int)RandomValue(0, (Real)((float)mFilteredPvs.GetSize() - 0.5f));
71 
72  ObjectPvsIterator pit = mFilteredPvs.GetIterator();
73
74  Intersectable *object;
75 
76  for (; id>=0; --id)
77        object = pit.Next();
78
79 
80  Vector3 point;
81  object->GetRandomSurfacePoint(point, normal);
82  Vector3 direction = point - origin;
83
84  const float c = Magnitude(direction);
85 
86  if (c <= Limits::Small)
87        return false;
88 
89  direction *= 1.0f / c;
90
91  // $$ jb the pdf is yet not correct for all sampling methods!
92  const float pdf = 1.0f;
93 
94  ray = SimpleRay(origin, direction, FILTER_BASED_DISTRIBUTION, pdf);
95 
96  //cout << "ray: " << ray.mOrigin << " " << ray.mDirection << endl;
97 
98  samplesGenerated++;
99 
100  return true;
101}
102
103}
Note: See TracBrowser for help on using the repository browser.