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

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

vss updates

RevLine 
[376]1#ifndef __VSS_RAY_H
2#define __VSS_RAY_H
[372]3
4#include <vector>
5using namespace std;
6#include "Vector3.h"
[410]7#include "Ray.h"
[372]8
9class AxisAlignedBox3;
10class Intersectable;
11
12class VssRay {
13public:
[438]14  // various flags
[372]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
[438]21  static int mailID;
[372]22  int mMailbox;
23       
[438]24  // side of the ray - used for the ray classification
25  //  char mSide;
[372]26       
[438]27  // computed t
[372]28  float mT;
29
[438]30  // inverse of the ray size
31  float mInvSize;
32 
33  // counter of references to this ray
[372]34  short mRefCount;
[438]35 
36  // various flags
[372]37  char mFlags;
38       
39  Vector3 mOrigin;
40  Vector3 mTermination;
41       
[438]42  /// Termination object for the ray
43  /// only the termination object is actually used
44  Intersectable *mOriginObject;
45  Intersectable *mTerminationObject;
[372]46       
[438]47  //////////////////////////////
48  VssRay(const Vector3 &origin,
49                 const Vector3 &termination,
50                 Intersectable *originObject,
51                 Intersectable *terminationObject):
52        mMailbox(-1),
[372]53    mOrigin(origin),
54    mTermination(termination),
[438]55        mOriginObject(originObject),
56        mTerminationObject(terminationObject),
57        mRefCount(0),
[431]58    mFlags(0),
59        mT(1.0f)
[438]60  {
[372]61    Precompute();
62  }
63       
[438]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();
[426]75
[438]76        //Debug << "origin: " << mOrigin << endl;
[428]77
[438]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          }
[426]88
[438]89        Precompute();
90  }
[411]91
[372]92  void Precompute() {
93    mFlags = 0;
[438]94        Vector3 dir = GetDir();
[376]95
[386]96#define BIDIRECTIONAL_RAY 0
97#if BIDIRECTIONAL_RAY
[438]98        if (dir.y < 0) {
99          // swap objects and poits     
100          swap(mOriginObject, mTerminationObject);
101          swap(mOrigin, mTermination);
102          dir = -dir;
103        }
[386]104#endif
[438]105        if (dir.x > 0.0f) mFlags |= FPosDirX;
[376]106    if (dir.y > 0.0f) mFlags |= FPosDirY;
107    if (dir.z > 0.0f) mFlags |= FPosDirZ;
108
[372]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
[438]120  int HitCount() const {
[386]121#if BIDIRECTIONAL_RAY
[438]122        if (mOriginObject && mTerminationObject)
123          return 2;
124        if (mOriginObject || mTerminationObject)
125          return 1;
126        return 0;
[386]127#else
[438]128        return (mTerminationObject) ? 1 : 0;
[386]129#endif
[438]130  }
[372]131       
[438]132  Vector3 GetOrigin() const { return mOrigin; }
[372]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
[438]138  Vector3 Extrap(const float t) const {
139        return GetOrigin() + t * GetDir();
140  }
[434]141       
[438]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; }
[372]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,
[438]157                                 float &tmin,
158                                 float &tmax) const;
[372]159       
160  bool
161  Intersects(const AxisAlignedBox3 &box,
[438]162                         float &tmin,
163                         float &tmax) const;
[372]164       
165  bool
166  IntersectsSphere(const Vector3 &center,
[438]167                                   const float sqrRadius,
168                                   Vector3 &point,
169                                   float &t) const;
[372]170       
171  void
172  Translate(const Vector3 &translation) {
173    mOrigin += translation;
174    mTermination += translation;
175  }
[427]176
[438]177  void SetupEndPoints(const Vector3 &origin,
178                                          const Vector3 &termination)
179  {
180        mOrigin = origin;
181        mTermination = termination;
182        Precompute();
183  }
[427]184                                                                                       
[372]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)
[438]203                mRefCount++;
[372]204      else {
[438]205                cerr<<"Trying to unref already deleted ray!"<<endl;
206                exit(1);
[372]207      }
208  }
[434]209
[438]210  static Vector3
211  GetDirection(const float a, const float b) {
212        return Vector3(sin(a), sin(b), cos(a));
213  }
[434]214
[372]215};
216
217
218
219typedef  vector<VssRay *> VssRayContainer;
220
221
222
223#endif
Note: See TracBrowser for help on using the repository browser.