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

Revision 372, 3.6 KB checked in by bittner, 19 years ago (diff)

preparation for vss preprocessor. converted all .cpp and .h to dos new line format

Line 
1#ifndef __SIMPLE_RAY_H
2#define __SIMPLE_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        Intersectable *mOriginObject;
42        Intersectable *mTerminationObject;
43       
44        //////////////////////////////
45        VssRay(const Vector3 &origin,
46                                                                const Vector3 &termination,
47                                                                Intersectable *originObject,
48                                                                Intersectable *terminationObject):
49                mMailbox(-1),
50    mOrigin(origin),
51    mTermination(termination),
52                mOriginObject(originObject),
53                mTerminationObject(terminationObject),
54                mRefCount(0),
55    mFlags(0)
56        {
57    Precompute();
58  }
59       
60  void Precompute() {
61    mFlags = 0;
62    if (GetDir().x>0.0f) mFlags |= FPosDirX;
63    if (GetDir().y>0.0f) mFlags |= FPosDirY;
64    if (GetDir().z>0.0f) mFlags |= FPosDirZ;
65    mInvSize = 1.0f/Magnitude(GetDir());
66  }
67
68  void Mail() { mMailbox = mailID; }
69  static void NewMail() { mailID++; }
70  bool Mailed() const { return mMailbox == mailID; }
71
72  bool Mailed(const int mail) {
73    return mMailbox >= mailID + mail;
74  }
75
76       
77       
78        Vector3 GetOrigin() const { return mOrigin; }
79  Vector3 GetTermination() const { return mTermination; }
80  Vector3 GetDir() const { return mTermination - mOrigin; }
81  //  Vector3 GetNormalizedDir() const { return Normalize(termination - mOrigin); }
82  Vector3 GetNormalizedDir() const { return (mTermination - mOrigin)*mInvSize; }
83
84        float GetInvSize() const { return  mInvSize; }
85  float GetOrigin(const int axis) const { return mOrigin[axis]; }
86  float GetTermination(const int axis) const { return mTermination[axis]; }
87  float GetDir(const int axis) const { return mTermination[axis] - mOrigin[axis]; }
88  float GetNormalizedDir(const int axis) const {
89    return (mTermination[axis] - mOrigin[axis])*mInvSize;
90  }
91       
92  bool
93  ComputeMinMaxT(const AxisAlignedBox3 &box,
94                                                                 float &tmin,
95                                                                 float &tmax) const;
96       
97  bool
98  Intersects(const AxisAlignedBox3 &box,
99                                                 float &tmin,
100                                                 float &tmax) const;
101       
102  bool
103  IntersectsSphere(const Vector3 &center,
104                                                                         const float sqrRadius,
105                                                                         Vector3 &point,
106                                                                         float &t) const;
107       
108  void
109  Translate(const Vector3 &translation) {
110    mOrigin += translation;
111    mTermination += translation;
112  }
113       
114  bool HasPosDir(const int axis) const { return mFlags & (1<<axis); }
115
116  char Flags() const { return mFlags;}
117  void SetFlags(char orFlag) { mFlags |= orFlag;}
118 
119  bool IsActive() const { return mRefCount>0; }
120       
121  // reference counting for leaf nodes
122  int RefCount() const { return mRefCount; }
123  int Ref() { return mRefCount++; }
124       
125  void ScheduleForRemoval() { if (mRefCount>0) mRefCount = -mRefCount; }
126  bool ScheduledForRemoval() const { return mRefCount<0; }
127  void Unref() {
128    if (mRefCount > 0)
129      mRefCount--;
130    else
131      if (mRefCount < 0)
132                                mRefCount++;
133      else {
134                                cerr<<"Trying to unref already deleted ray!"<<endl;
135                                exit(1);
136      }
137  }
138};
139
140
141
142typedef  vector<VssRay *> VssRayContainer;
143
144
145
146#endif
Note: See TracBrowser for help on using the repository browser.