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

Revision 426, 4.6 KB checked in by mattausch, 19 years ago (diff)

fixed ray bug in vspkdtree
added visualizations

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