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

Revision 386, 4.1 KB checked in by bittner, 19 years ago (diff)

VssPreprocessor? updates - directional rays, x3dexporter updates - removed duplicated code for ray exports

Line 
1#ifndef __VSS_RAY_H
2#define __VSS_RAY_H
3
4#include <vector>
5using namespace std;
6#include "Vector3.h"
7
8class AxisAlignedBox3;
9class Intersectable;
10
11class VssRay {
12public:
13        // various flags
14  enum {
15    FPosDirX = 1,  // the direction of ray in X-axis is positive
16    FPosDirY = 2,  // the direction of ray in Y-axis is positive
17    FPosDirZ = 4   // the direction of ray in Z-axis is positive
18  };
19
20        static int mailID;
21  int mMailbox;
22       
23        // side of the ray - used for the ray classification
24        //  char mSide;
25       
26        // computed t
27  float mT;
28
29        // inverse of the ray size
30        float mInvSize;
31       
32        // counter of references to this ray
33  short mRefCount;
34
35        // various flags
36  char mFlags;
37       
38  Vector3 mOrigin;
39  Vector3 mTermination;
40       
41        /// Termination object for the ray
42        /// only the termination object is actually used
43        Intersectable *mOriginObject;
44        Intersectable *mTerminationObject;
45       
46        //////////////////////////////
47        VssRay(const Vector3 &origin,
48                                 const Vector3 &termination,
49                                 Intersectable *originObject,
50                                 Intersectable *terminationObject):
51                mMailbox(-1),
52    mOrigin(origin),
53    mTermination(termination),
54                mOriginObject(originObject),
55                mTerminationObject(terminationObject),
56                mRefCount(0),
57    mFlags(0)
58        {
59    Precompute();
60  }
61       
62  void Precompute() {
63    mFlags = 0;
64                Vector3 dir = GetDir();
65
66#define BIDIRECTIONAL_RAY 0
67#if BIDIRECTIONAL_RAY
68                if (dir.y < 0) {
69                        // swap objects and poits       
70                        swap(mOriginObject, mTerminationObject);
71                        swap(mOrigin, mTermination);
72                        dir = -dir;
73                }
74#endif
75                if (dir.x > 0.0f) mFlags |= FPosDirX;
76    if (dir.y > 0.0f) mFlags |= FPosDirY;
77    if (dir.z > 0.0f) mFlags |= FPosDirZ;
78
79    mInvSize = 1.0f/Magnitude(GetDir());
80  }
81
82  void Mail() { mMailbox = mailID; }
83  static void NewMail() { mailID++; }
84  bool Mailed() const { return mMailbox == mailID; }
85
86  bool Mailed(const int mail) {
87    return mMailbox >= mailID + mail;
88  }
89
90        int HitCount() const {
91#if BIDIRECTIONAL_RAY
92                if (mOriginObject && mTerminationObject)
93                        return 2;
94                if (mOriginObject || mTerminationObject)
95                        return 1;
96                return 0;
97#else
98                return (mTerminationObject) ? 1 : 0;
99#endif
100        }
101       
102        Vector3 GetOrigin() const { return mOrigin; }
103  Vector3 GetTermination() const { return mTermination; }
104  Vector3 GetDir() const { return mTermination - mOrigin; }
105  //  Vector3 GetNormalizedDir() const { return Normalize(termination - mOrigin); }
106  Vector3 GetNormalizedDir() const { return (mTermination - mOrigin)*mInvSize; }
107
108        float GetDirParametrization(const int axis) const;
109       
110        float GetInvSize() const { return  mInvSize; }
111  float GetOrigin(const int axis) const { return mOrigin[axis]; }
112  float GetTermination(const int axis) const { return mTermination[axis]; }
113  float GetDir(const int axis) const { return mTermination[axis] - mOrigin[axis]; }
114  float GetNormalizedDir(const int axis) const {
115    return (mTermination[axis] - mOrigin[axis])*mInvSize;
116  }
117       
118  bool
119  ComputeMinMaxT(const AxisAlignedBox3 &box,
120                                                                 float &tmin,
121                                                                 float &tmax) const;
122       
123  bool
124  Intersects(const AxisAlignedBox3 &box,
125                                                 float &tmin,
126                                                 float &tmax) const;
127       
128  bool
129  IntersectsSphere(const Vector3 &center,
130                                                                         const float sqrRadius,
131                                                                         Vector3 &point,
132                                                                         float &t) const;
133       
134  void
135  Translate(const Vector3 &translation) {
136    mOrigin += translation;
137    mTermination += translation;
138  }
139       
140  bool HasPosDir(const int axis) const { return mFlags & (1<<axis); }
141
142  char Flags() const { return mFlags;}
143  void SetFlags(char orFlag) { mFlags |= orFlag;}
144 
145  bool IsActive() const { return mRefCount>0; }
146       
147  // reference counting for leaf nodes
148  int RefCount() const { return mRefCount; }
149  int Ref() { return mRefCount++; }
150       
151  void ScheduleForRemoval() { if (mRefCount>0) mRefCount = -mRefCount; }
152  bool ScheduledForRemoval() const { return mRefCount<0; }
153  void Unref() {
154    if (mRefCount > 0)
155      mRefCount--;
156    else
157      if (mRefCount < 0)
158                                mRefCount++;
159      else {
160                                cerr<<"Trying to unref already deleted ray!"<<endl;
161                                exit(1);
162      }
163  }
164};
165
166
167
168typedef  vector<VssRay *> VssRayContainer;
169
170
171
172#endif
Note: See TracBrowser for help on using the repository browser.