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

Revision 444, 5.2 KB checked in by mattausch, 19 years ago (diff)

fixed error in ray to vssray conversion

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                if (!ray.intersections.empty())
78                {
79                        mTermination = ray.Extrap(ray.intersections[0].mT);
80                        mTerminationObject = ray.intersections[0].mObject;
81                }
82                else
83                {
84                        mTermination = ray.Extrap(1e6);//TODO: should be Limits::Infinity
85                        mTerminationObject = NULL;
86                }
87
88                Precompute();
89  }
90
91  void Precompute() {
92    mFlags = 0;
93        Vector3 dir = GetDir();
94
95#define BIDIRECTIONAL_RAY 0
96#if BIDIRECTIONAL_RAY
97        if (dir.y < 0) {
98          // swap objects and poits     
99          swap(mOriginObject, mTerminationObject);
100          swap(mOrigin, mTermination);
101          dir = -dir;
102        }
103#endif
104        if (dir.x > 0.0f) mFlags |= FPosDirX;
105    if (dir.y > 0.0f) mFlags |= FPosDirY;
106    if (dir.z > 0.0f) mFlags |= FPosDirZ;
107
108    mInvSize = 1.0f/Magnitude(GetDir());
109  }
110
111  void Mail() { mMailbox = mailID; }
112  static void NewMail() { mailID++; }
113  bool Mailed() const { return mMailbox == mailID; }
114
115  bool Mailed(const int mail) {
116    return mMailbox >= mailID + mail;
117  }
118
119  int HitCount() const {
120#if BIDIRECTIONAL_RAY
121        if (mOriginObject && mTerminationObject)
122          return 2;
123        if (mOriginObject || mTerminationObject)
124          return 1;
125        return 0;
126#else
127        return (mTerminationObject) ? 1 : 0;
128#endif
129  }
130       
131  Vector3 GetOrigin() const { return mOrigin; }
132  Vector3 GetTermination() const { return mTermination; }
133  Vector3 GetDir() const { return mTermination - mOrigin; }
134  //  Vector3 GetNormalizedDir() const { return Normalize(termination - mOrigin); }
135  Vector3 GetNormalizedDir() const { return (mTermination - mOrigin)*mInvSize; }
136
137  Vector3 Extrap(const float t) const {
138        return GetOrigin() + t * GetDir();
139  }
140       
141  float GetDirParametrization(const int axis) const;
142
143  static float VssRay::GetDirParam(const int axis, const Vector3 dir);
144
145  float GetSize() const { return  1.0f/mInvSize; }
146  float GetInvSize() const { return  mInvSize; }
147  float GetOrigin(const int axis) const { return mOrigin[axis]; }
148  float GetTermination(const int axis) const { return mTermination[axis]; }
149  float GetDir(const int axis) const { return mTermination[axis] - mOrigin[axis]; }
150  float GetNormalizedDir(const int axis) const {
151    return (mTermination[axis] - mOrigin[axis])*mInvSize;
152  }
153       
154  bool
155  ComputeMinMaxT(const AxisAlignedBox3 &box,
156                                 float &tmin,
157                                 float &tmax) const;
158       
159  bool
160  Intersects(const AxisAlignedBox3 &box,
161                         float &tmin,
162                         float &tmax) const;
163       
164  bool
165  IntersectsSphere(const Vector3 &center,
166                                   const float sqrRadius,
167                                   Vector3 &point,
168                                   float &t) const;
169       
170  void
171  Translate(const Vector3 &translation) {
172    mOrigin += translation;
173    mTermination += translation;
174  }
175
176  void SetupEndPoints(const Vector3 &origin,
177                                          const Vector3 &termination)
178  {
179        mOrigin = origin;
180        mTermination = termination;
181        Precompute();
182  }
183                                                                                       
184  bool HasPosDir(const int axis) const { return mFlags & (1<<axis); }
185
186  char Flags() const { return mFlags;}
187  void SetFlags(char orFlag) { mFlags |= orFlag;}
188 
189  bool IsActive() const { return mRefCount>0; }
190       
191  // reference counting for leaf nodes
192  int RefCount() const { return mRefCount; }
193  int Ref() { return mRefCount++; }
194       
195  void ScheduleForRemoval() { if (mRefCount>0) mRefCount = -mRefCount; }
196  bool ScheduledForRemoval() const { return mRefCount<0; }
197  void Unref() {
198    if (mRefCount > 0)
199      mRefCount--;
200    else
201      if (mRefCount < 0)
202                mRefCount++;
203      else {
204                cerr<<"Trying to unref already deleted ray!"<<endl;
205                exit(1);
206      }
207  }
208
209  static Vector3
210  GetDirection(const float a, const float b) {
211        return Vector3(sin(a), sin(b), cos(a));
212  }
213
214};
215
216
217
218typedef  vector<VssRay *> VssRayContainer;
219
220
221
222#endif
Note: See TracBrowser for help on using the repository browser.