source: trunk/VUT/GtpVisibilityPreprocessor/src/VssRay.h @ 438

Revision 438, 5.2 KB checked in by bittner, 19 years ago (diff)

vss updates

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
9class AxisAlignedBox3;
10class Intersectable;
11
12class VssRay {
13public:
14  // various flags
15  enum {
16    FPosDirX = 1,  // the direction of ray in X-axis is positive
17    FPosDirY = 2,  // the direction of ray in Y-axis is positive
18    FPosDirZ = 4   // the direction of ray in Z-axis is positive
19  };
20
21  static int mailID;
22  int mMailbox;
23       
24  // side of the ray - used for the ray classification
25  //  char mSide;
26       
27  // computed t
28  float mT;
29
30  // inverse of the ray size
31  float mInvSize;
32 
33  // counter of references to this ray
34  short mRefCount;
35 
36  // various flags
37  char mFlags;
38       
39  Vector3 mOrigin;
40  Vector3 mTermination;
41       
42  /// Termination object for the ray
43  /// only the termination object is actually used
44  Intersectable *mOriginObject;
45  Intersectable *mTerminationObject;
46       
47  //////////////////////////////
48  VssRay(const Vector3 &origin,
49                 const Vector3 &termination,
50                 Intersectable *originObject,
51                 Intersectable *terminationObject):
52        mMailbox(-1),
53    mOrigin(origin),
54    mTermination(termination),
55        mOriginObject(originObject),
56        mTerminationObject(terminationObject),
57        mRefCount(0),
58    mFlags(0),
59        mT(1.0f)
60  {
61    Precompute();
62  }
63       
64  VssRay(const Ray &ray):
65        mRefCount(0),
66        mFlags(0),
67        mMailbox(-1),
68        mOriginObject(ray.sourceObject.mObject),
69        mT(1.0f)
70  {
71        if (ray.sourceObject.mObject)
72          mOrigin = ray.Extrap(ray.sourceObject.mT);
73        else
74          mOrigin = ray.GetLoc();
75
76        //Debug << "origin: " << mOrigin << endl;
77
78        if (!ray.intersections.empty())
79          {
80                mTermination = ray.Extrap(ray.intersections[0].mT);
81                mTerminationObject = ray.intersections[0].mObject;
82          }
83        else
84          {
85                mTermination = ray.Extrap(1e6);//TODO: should be Limits::Infinity
86                mTerminationObject = NULL;
87          }
88
89        Precompute();
90  }
91
92  void Precompute() {
93    mFlags = 0;
94        Vector3 dir = GetDir();
95
96#define BIDIRECTIONAL_RAY 0
97#if BIDIRECTIONAL_RAY
98        if (dir.y < 0) {
99          // swap objects and poits     
100          swap(mOriginObject, mTerminationObject);
101          swap(mOrigin, mTermination);
102          dir = -dir;
103        }
104#endif
105        if (dir.x > 0.0f) mFlags |= FPosDirX;
106    if (dir.y > 0.0f) mFlags |= FPosDirY;
107    if (dir.z > 0.0f) mFlags |= FPosDirZ;
108
109    mInvSize = 1.0f/Magnitude(GetDir());
110  }
111
112  void Mail() { mMailbox = mailID; }
113  static void NewMail() { mailID++; }
114  bool Mailed() const { return mMailbox == mailID; }
115
116  bool Mailed(const int mail) {
117    return mMailbox >= mailID + mail;
118  }
119
120  int HitCount() const {
121#if BIDIRECTIONAL_RAY
122        if (mOriginObject && mTerminationObject)
123          return 2;
124        if (mOriginObject || mTerminationObject)
125          return 1;
126        return 0;
127#else
128        return (mTerminationObject) ? 1 : 0;
129#endif
130  }
131       
132  Vector3 GetOrigin() const { return mOrigin; }
133  Vector3 GetTermination() const { return mTermination; }
134  Vector3 GetDir() const { return mTermination - mOrigin; }
135  //  Vector3 GetNormalizedDir() const { return Normalize(termination - mOrigin); }
136  Vector3 GetNormalizedDir() const { return (mTermination - mOrigin)*mInvSize; }
137
138  Vector3 Extrap(const float t) const {
139        return GetOrigin() + t * GetDir();
140  }
141       
142  float GetDirParametrization(const int axis) const;
143
144  static float VssRay::GetDirParam(const int axis, const Vector3 dir);
145
146  float GetSize() const { return  1.0f/mInvSize; }
147  float GetInvSize() const { return  mInvSize; }
148  float GetOrigin(const int axis) const { return mOrigin[axis]; }
149  float GetTermination(const int axis) const { return mTermination[axis]; }
150  float GetDir(const int axis) const { return mTermination[axis] - mOrigin[axis]; }
151  float GetNormalizedDir(const int axis) const {
152    return (mTermination[axis] - mOrigin[axis])*mInvSize;
153  }
154       
155  bool
156  ComputeMinMaxT(const AxisAlignedBox3 &box,
157                                 float &tmin,
158                                 float &tmax) const;
159       
160  bool
161  Intersects(const AxisAlignedBox3 &box,
162                         float &tmin,
163                         float &tmax) const;
164       
165  bool
166  IntersectsSphere(const Vector3 &center,
167                                   const float sqrRadius,
168                                   Vector3 &point,
169                                   float &t) const;
170       
171  void
172  Translate(const Vector3 &translation) {
173    mOrigin += translation;
174    mTermination += translation;
175  }
176
177  void SetupEndPoints(const Vector3 &origin,
178                                          const Vector3 &termination)
179  {
180        mOrigin = origin;
181        mTermination = termination;
182        Precompute();
183  }
184                                                                                       
185  bool HasPosDir(const int axis) const { return mFlags & (1<<axis); }
186
187  char Flags() const { return mFlags;}
188  void SetFlags(char orFlag) { mFlags |= orFlag;}
189 
190  bool IsActive() const { return mRefCount>0; }
191       
192  // reference counting for leaf nodes
193  int RefCount() const { return mRefCount; }
194  int Ref() { return mRefCount++; }
195       
196  void ScheduleForRemoval() { if (mRefCount>0) mRefCount = -mRefCount; }
197  bool ScheduledForRemoval() const { return mRefCount<0; }
198  void Unref() {
199    if (mRefCount > 0)
200      mRefCount--;
201    else
202      if (mRefCount < 0)
203                mRefCount++;
204      else {
205                cerr<<"Trying to unref already deleted ray!"<<endl;
206                exit(1);
207      }
208  }
209
210  static Vector3
211  GetDirection(const float a, const float b) {
212        return Vector3(sin(a), sin(b), cos(a));
213  }
214
215};
216
217
218
219typedef  vector<VssRay *> VssRayContainer;
220
221
222
223#endif
Note: See TracBrowser for help on using the repository browser.