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

Revision 463, 6.0 KB checked in by bittner, 19 years ago (diff)

removed mT from vss ray

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  float Length() const { return Distance(mOrigin, mTermination); }
138
139  Vector3 Extrap(const float t) const {
140        return GetOrigin() + t * GetDir();
141  }
142       
143  float GetDirParametrization(const int axis) const;
144
145  static float VssRay::GetDirParam(const int axis, const Vector3 dir);
146
147  float GetSize() const { return  1.0f/mInvSize; }
148  float GetInvSize() const { return  mInvSize; }
149  float GetOrigin(const int axis) const { return mOrigin[axis]; }
150  float GetTermination(const int axis) const { return mTermination[axis]; }
151  float GetDir(const int axis) const { return mTermination[axis] - mOrigin[axis]; }
152  float GetNormalizedDir(const int axis) const {
153    return (mTermination[axis] - mOrigin[axis])*mInvSize;
154  }
155       
156  bool
157  ComputeMinMaxT(const AxisAlignedBox3 &box,
158                                 float &tmin,
159                                 float &tmax) const;
160       
161  bool
162  Intersects(const AxisAlignedBox3 &box,
163                         float &tmin,
164                         float &tmax) const;
165       
166  bool
167  IntersectsSphere(const Vector3 &center,
168                                   const float sqrRadius,
169                                   Vector3 &point,
170                                   float &t) const;
171       
172  void
173  Translate(const Vector3 &translation) {
174    mOrigin += translation;
175    mTermination += translation;
176  }
177
178  void SetupEndPoints(const Vector3 &origin,
179                                          const Vector3 &termination)
180  {
181        mOrigin = origin;
182        mTermination = termination;
183        Precompute();
184  }
185                                                                                       
186  bool HasPosDir(const int axis) const { return mFlags & (1<<axis); }
187
188  char Flags() const { return mFlags;}
189  void SetFlags(char orFlag) { mFlags |= orFlag;}
190 
191  bool IsActive() const { return mRefCount>0; }
192       
193  // reference counting for leaf nodes
194  int RefCount() const { return mRefCount; }
195  int Ref() { return mRefCount++; }
196       
197  void ScheduleForRemoval() { if (mRefCount>0) mRefCount = -mRefCount; }
198  bool ScheduledForRemoval() const { return mRefCount<0; }
199  void Unref() {
200    if (mRefCount > 0)
201      mRefCount--;
202    else
203      if (mRefCount < 0)
204                mRefCount++;
205      else {
206                cerr<<"Trying to unref already deleted ray!"<<endl;
207                exit(1);
208      }
209  }
210
211  static Vector3
212  GetDirection(const float a, const float b) {
213        return Vector3(sin(a), sin(b), cos(a));
214  }
215
216};
217
218void
219GenerateExtendedConvexCombinationWeights(float &w1,
220                                                                                 float &w2,
221                                                                                 float &w3,
222                                                                                 const float overlap
223                                                                                 );
224
225// --------------------------------------------------------------
226// For sorting rays
227// --------------------------------------------------------------
228struct  SortableEntry
229{
230  enum EType {
231    ERayMin,
232    ERayMax
233  };
234
235  int type;
236  float value;
237  void *data;
238 
239  SortableEntry() {}
240  SortableEntry(const int t, const float v, void *d):type(t),
241                                                                                                         value(v),
242                                                                                                         data(d) {}
243       
244  friend bool operator<(const SortableEntry &a, const SortableEntry &b) {
245    return a.value < b.value;
246  }
247};
248
249typedef  vector<VssRay *> VssRayContainer;
250
251
252
253#endif
Note: See TracBrowser for help on using the repository browser.