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

Revision 434, 5.1 KB checked in by bittner, 19 years ago (diff)

vssbsp merge, tab change

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        float GetInvSize() const { return  mInvSize; }
145  float GetOrigin(const int axis) const { return mOrigin[axis]; }
146  float GetTermination(const int axis) const { return mTermination[axis]; }
147  float GetDir(const int axis) const { return mTermination[axis] - mOrigin[axis]; }
148  float GetNormalizedDir(const int axis) const {
149    return (mTermination[axis] - mOrigin[axis])*mInvSize;
150  }
151       
152  bool
153  ComputeMinMaxT(const AxisAlignedBox3 &box,
154                                                                 float &tmin,
155                                                                 float &tmax) const;
156       
157  bool
158  Intersects(const AxisAlignedBox3 &box,
159                                                 float &tmin,
160                                                 float &tmax) const;
161       
162  bool
163  IntersectsSphere(const Vector3 &center,
164                                                                         const float sqrRadius,
165                                                                         Vector3 &point,
166                                                                         float &t) const;
167       
168  void
169  Translate(const Vector3 &translation) {
170    mOrigin += translation;
171    mTermination += translation;
172  }
173
174        void SetupEndPoints(const Vector3 &origin,
175                                                                                        const Vector3 &termination)
176        {
177                mOrigin = origin;
178                mTermination = termination;
179                Precompute();
180        }
181                                                                                       
182  bool HasPosDir(const int axis) const { return mFlags & (1<<axis); }
183
184  char Flags() const { return mFlags;}
185  void SetFlags(char orFlag) { mFlags |= orFlag;}
186 
187  bool IsActive() const { return mRefCount>0; }
188       
189  // reference counting for leaf nodes
190  int RefCount() const { return mRefCount; }
191  int Ref() { return mRefCount++; }
192       
193  void ScheduleForRemoval() { if (mRefCount>0) mRefCount = -mRefCount; }
194  bool ScheduledForRemoval() const { return mRefCount<0; }
195  void Unref() {
196    if (mRefCount > 0)
197      mRefCount--;
198    else
199      if (mRefCount < 0)
200                                mRefCount++;
201      else {
202                                cerr<<"Trying to unref already deleted ray!"<<endl;
203                                exit(1);
204      }
205  }
206
207        static Vector3
208        GetDirection(const float a, const float b) {
209                return Vector3(sin(a), sin(b), cos(a));
210        }
211
212};
213
214
215
216typedef  vector<VssRay *> VssRayContainer;
217
218
219
220#endif
Note: See TracBrowser for help on using the repository browser.