source: GTP/trunk/Lib/Vis/Preprocessing/src/VssRay.h @ 1771

Revision 1771, 8.0 KB checked in by bittner, 18 years ago (diff)

merge, preparing sampling strategy support for mixed distributions, filter changes, histogram output for preprocessor

Line 
1#ifndef __VSS_RAY_H
2#define __VSS_RAY_H
3
4#include <vector>
5using namespace std;
6#include "Vector3.h"
7#include "Ray.h"
8#include "Containers.h"
9
10namespace GtpVisibilityPreprocessor {
11
12class AxisAlignedBox3;
13class Intersectable;
14class KdNode;
15
16
17class VssRay {
18public:
19
20 // various flags
21  enum {
22    FPosDirX = 1,    // the direction of ray in X-axis is positive
23    FPosDirY = 2,    // the direction of ray in Y-axis is positive
24    FPosDirZ = 4,    // the direction of ray in Z-axis is positive
25        BorderSample = 8,// if this ray is an adaptive border ray
26        ReverseSample = 16,  // if this ray is a reverse sample
27        Valid = 32  // this ray is a valid ray
28                   //(with respect to detect empty viewspace)
29  };
30
31  static int mailID;
32  int mMailbox;
33       
34  // side of the ray - used for the ray classification
35  //  char mSide;
36       
37  // computed t
38  //  float mT;
39
40  // inverse of the ray size
41  float mInvSize;
42 
43  // counter of references to this ray
44  short mRefCount;
45 
46  // various flags
47  char mFlags;
48       
49  Vector3 mOrigin;
50  Vector3 mTermination;
51       
52  /// Termination object for the ray
53  /// only the termination object is actually used
54  Intersectable *mOriginObject;
55  Intersectable *mTerminationObject;
56
57  ViewCellContainer mViewCells;
58 
59
60  ////////////////////////
61  // members related to importance sampling
62  // sampling pass in which this ray was generated
63  short mPass;
64
65  // number of cells where this ray made a contribution to the PVS
66  short mPvsContribution;
67 
68  // sum of relative ray contributions per object
69  float mRelativePvsContribution;
70
71
72  // weighted contribution to the pvs (based on the pass the ray was casted at)
73  // computed by the prperocessor
74  float mWeightedPvsContribution;
75
76  // probability of this ray
77  float mPdf;
78 
79  //////////////////////////////
80
81 
82  /// the kd node holding the termination point
83  KdNode *mTerminationNode;
84  /// the kd node holding the origin point
85  KdNode *mOriginNode;
86
87
88  VssRay(
89                 const Vector3 &origin,
90                 const Vector3 &termination,
91                 Intersectable *originObject,
92                 Intersectable *terminationObject,
93                 const int pass = 0,
94                 const float pdf = 1.0f
95                 );
96       
97  VssRay(const Ray &ray);
98       
99 
100  void Precompute();
101
102  void Mail() { mMailbox = mailID; }
103  static void NewMail() { mailID++; }
104  bool Mailed() const { return mMailbox == mailID; }
105
106  bool Mailed(const int mail) {
107    return mMailbox >= mailID + mail;
108  }
109
110  int HitCount() const {
111#if BIDIRECTIONAL_RAY
112        if (mOriginObject && mTerminationObject)
113          return 2;
114        if (mOriginObject || mTerminationObject)
115          return 1;
116        return 0;
117#else
118        return (mTerminationObject) ? 1 : 0;
119#endif
120  }
121       
122  Vector3 GetOrigin() const { return mOrigin; }
123  Vector3 GetTermination() const { return mTermination; }
124  Vector3 GetDir() const { return mTermination - mOrigin; }
125  //  Vector3 GetNormalizedDir() const { return Normalize(termination - mOrigin); }
126  Vector3 GetNormalizedDir() const { return (mTermination - mOrigin)*mInvSize; }
127
128  float Length() const { return Distance(mOrigin, mTermination); }
129
130  Vector3 Extrap(const float t) const {
131        return GetOrigin() + t * GetDir();
132  }
133       
134  float GetDirParametrization(const int axis) const;
135  float GetOpositeDirParametrization(const int axis) const;
136
137  static float VssRay::GetDirParam(const int axis, const Vector3 dir);
138
139  float GetSize() const { return  1.0f/mInvSize; }
140  float GetInvSize() const { return  mInvSize; }
141  float GetOrigin(const int axis) const { return mOrigin[axis]; }
142  float GetTermination(const int axis) const { return mTermination[axis]; }
143  float GetDir(const int axis) const { return mTermination[axis] - mOrigin[axis]; }
144  float GetNormalizedDir(const int axis) const {
145    return (mTermination[axis] - mOrigin[axis])*mInvSize;
146  }
147       
148  bool
149  ComputeMinMaxT(const AxisAlignedBox3 &box,
150                                 float &tmin,
151                                 float &tmax) const;
152       
153  bool
154  Intersects(const AxisAlignedBox3 &box,
155                         float &tmin,
156                         float &tmax) const;
157       
158  bool
159  IntersectsSphere(const Vector3 &center,
160                                   const float sqrRadius,
161                                   Vector3 &point,
162                                   float &t) const;
163       
164  void
165  Translate(const Vector3 &translation) {
166    mOrigin += translation;
167    mTermination += translation;
168  }
169
170  void SetupEndPoints(const Vector3 &origin,
171                                          const Vector3 &termination)
172  {
173        mOrigin = origin;
174        mTermination = termination;
175        Precompute();
176  }
177                                                                                       
178  bool HasPosDir(const int axis) const { return mFlags & (1<<axis); }
179
180  char Flags() const { return mFlags;}  void SetFlags(char orFlag) { mFlags |= orFlag;}
181 
182  bool IsActive() const { return mRefCount>0; }
183       
184  // reference counting for leaf nodes
185  int RefCount() const { return mRefCount; }
186  int Ref() { return mRefCount++; }
187       
188  void ScheduleForRemoval() { if (mRefCount>0) mRefCount = -mRefCount; }
189  bool ScheduledForRemoval() const { return mRefCount<0; }
190  void Unref() {
191    if (mRefCount > 0)
192      mRefCount--;
193    else
194      if (mRefCount < 0)
195                mRefCount++;
196      else {
197                cerr<<"Trying to unref already deleted ray!"<<endl;
198                exit(1);
199      }
200  }
201
202  static Vector3
203  GetDirection(const float a, const float b) {
204        return Vector3(sin(a), sin(b), cos(a));
205  }
206
207  friend bool GreaterWeightedPvsContribution(const VssRay * a,
208                                                                                         const VssRay *b) {
209        return a->mWeightedPvsContribution > b->mWeightedPvsContribution;
210  }
211
212  float SqrDistance(const Vector3 &point) const {
213        Vector3 diff = point - mOrigin;
214        float t = DotProd(diff, GetDir());
215       
216    if ( t <= 0.0f ) {
217          t = 0.0f;
218    } else {
219          if (t >= 1.0f) {
220                t = 1.0f;
221          } else {
222        t /= SqrMagnitude(GetDir());
223          }
224          diff -= t*GetDir();
225        }
226    return SqrMagnitude(diff);
227  }
228
229  /** Returns the data sampled on either the ray origin or termination.
230  */
231  void GetSampleData(
232          const bool isTerminaton,
233          Vector3 &pt,
234          Intersectable **obj,
235          KdNode **node) const;
236
237  friend ostream& operator<< (ostream &s, const VssRay &vssRay);
238   
239};
240
241inline void VssRay::GetSampleData(const bool isTermination,
242                                                                  Vector3 &pt,
243                                                                  Intersectable **obj,
244                                                                  KdNode **node) const
245{
246        if (isTermination)
247        {
248                pt = mTermination;
249                *obj = mTerminationObject;
250                *node = mTerminationNode;
251        }
252        else
253        {
254                pt = mOrigin;
255                *obj = mOriginObject;
256                *node = mOriginNode;
257        }
258}
259
260void
261GenerateExtendedConvexCombinationWeights(float &w1,
262                                                                                 float &w2,
263                                                                                 float &w3,
264                                                                                 const float overlap
265                                                                                 );
266
267void
268GenerateExtendedConvexCombinationWeights2(float &w1,
269                                                                                  float &w2,
270                                                                                  const float overlap
271                                                                                  );
272
273// Overload << operator for C++-style output
274inline ostream&
275operator<< (ostream &s, const VssRay &vssRay)
276{
277        return s
278                << "(" << vssRay.mPass << ", " << vssRay.mOrigin << ", " << vssRay.mTermination
279                << ", " << vssRay.mOriginObject << ", " << vssRay.mTerminationObject << ", " << vssRay.mPdf << ")";
280}
281
282// --------------------------------------------------------------
283// For sorting rays
284// --------------------------------------------------------------
285struct SortableEntry
286{
287  enum EType {
288    ERayMin,
289    ERayMax
290  };
291
292  int type;
293  float value;
294  void *data;
295 
296  SortableEntry() {}
297  SortableEntry(const int t, const float v, void *d):type(t),
298                                                                                                         value(v),
299                                                                                                         data(d) {}
300       
301  friend bool operator<(const SortableEntry &a, const SortableEntry &b) {
302    return a.value < b.value;
303  }
304};
305
306struct VssRayContainer : public vector<VssRay *>
307{
308  void PrintStatistics(ostream &s);
309  int SelectRays(const int number, VssRayContainer &selected, const bool copy=false) const;
310  int
311  GetContributingRays(VssRayContainer &selected,
312                                          const int minPass
313                                          ) const;
314 
315};
316
317/*
318struct VssRayDistribution {
319  VssRayDistribution() { mContribution = -1.0f; }
320  SimpleRayContainer mRays;
321  vector<VssRayContainer> mVssRays;
322  float mContribution;
323  float mTime;
324};
325
326struct VssRayDistributionMixture {
327  VssRayDistributionMixture() {}
328 
329  vector<VssRayDistribution> distributions;
330};
331*/
332
333};
334
335#endif
Note: See TracBrowser for help on using the repository browser.