source: GTP/trunk/Lib/Vis/Preprocessing/src/RayCaster.h @ 2069

Revision 2069, 3.4 KB checked in by mattausch, 17 years ago (diff)
RevLine 
[1520]1#ifndef _RayCaster_H__
2#define _RayCaster_H__
3
4#include "Containers.h"
5#include <string>
[1528]6#include "Vector3.h"
[2014]7#include "VssRay.h"
[1528]8
[1520]9using namespace std;
10
11
12namespace GtpVisibilityPreprocessor {
13
14
15class Intersectable;
16class VssRay;
17class SimpleRayContainer;
18class AxisAlignedBox3;
[1528]19//class Vector3;
[1520]20struct VssRayContainer;
21class Preprocessor;
[1528]22struct SimpleRay;
[1520]23
[1528]24
[1520]25/** This class provides an interface for ray casting.
26*/
27class RayCaster
28{
[1528]29
[1520]30public:
31       
32        enum {
33          INTERNAL_RAYCASTER = 0,
34          INTEL_RAYCASTER
35        };
36
37        RayCaster(const Preprocessor &preprocessor);
38
[1521]39        virtual ~RayCaster();
[1520]40
41        virtual int Type() const = 0;
42
[1521]43        /** Wrapper for casting single ray.
[1545]44                @returns ray or NULL if invalid
[1521]45        */
[1932]46        VssRay *CastRay(const SimpleRay &simpleRay,
[1990]47                                        const AxisAlignedBox3 &box,
[1996]48                                        const bool castDoubleRay);
[1521]49
[1932]50        virtual int CastRay(const SimpleRay &simpleRay,
51                                                VssRayContainer &vssRays,
52                                                const AxisAlignedBox3 &box,
53                                                const bool castDoubleRay,
[1996]54                                                const bool pruneInvalidRays = true) = 0;
[1520]55
[2063]56        virtual void CastRays16(SimpleRayContainer &rays,
57                                                        VssRayContainer &vssRays,
58                                                        const AxisAlignedBox3 &sbox,
59                                                        const bool castDoubleRay,
60                                                        const bool pruneInvalidRays = true) = 0;
[1974]61
[2063]62        /*virtual void CastRaysEye4(SimpleRayContainer &rays,
63                                                          VssRayContainer &vssRays,
64                                                          const AxisAlignedBox3 &sbox,
65                                                          const bool castDoubleRay,
66                                                          const bool pruneInvalidRays = true) = 0;
67*/
68        virtual void
69        SortRays(SimpleRayContainer &rays);
[1974]70
71
[1520]72
[2012]73  // pool of vss rays to be used in one pass of the sampling
74  struct VssRayPool {
[2048]75        VssRayPool():mRays(NULL), mIndex(0), mNumber(0) {}
[2014]76        ~VssRayPool() {
77          if (mRays)
78                delete mRays;
79        }
80       
[2012]81        void Reserve(const int number) {
[2014]82          if (mRays)
83                delete mRays;
[2069]84          cout << "here4" << endl;
[2014]85          mRays = new VssRay[number];
[2048]86          mNumber = number;
[2012]87        }
[2014]88       
[2012]89        void Clear() {
90          mIndex = 0;
91        }
92        VssRay *Alloc() {
[2048]93                // reset pool
94                if (mIndex == mNumber)
95                        mIndex = 0;
[2069]96          return mRays + mIndex ++;
[2012]97        }
[2014]98
99        VssRay *mRays;
[2012]100        int mIndex;
[2048]101        int mNumber;
[2012]102  };
103
104 
105  VssRayPool mVssRayPool;
106
107  void ReserveVssRayPool(const int n) {
108        mVssRayPool.Reserve(n);
109  }
110 
111  void InitPass() {
112        mVssRayPool.Clear();
113  }
114
115
[1520]116protected:
[1984]117  void _SortRays(SimpleRayContainer &rays,
118                                 const int l,
119                                 const int r,
120                                 const int depth,
121                                 float box[12]);
122       
[1974]123  struct Intersection
[2069]124  {
125          Intersection(): mObject(NULL), mFaceId(0)
126          {}
[1520]127
[2069]128          Intersection(const Vector3 &p, const Vector3 &n, Intersectable *o, const int f):
129          mPoint(p), mNormal(n), mObject(o), mFaceId(f)
130          {}
[1528]131
[2069]132          Intersection(const Vector3 &p): mPoint(p), mObject(NULL), mFaceId(0)
133          {}
134          Vector3 mPoint;
135          Vector3 mNormal;
136          Intersectable *mObject;
137          int mFaceId;
138  };
[1528]139
[1824]140
[2069]141  int ProcessRay(const SimpleRay &ray,
142          Intersection &hitA,
143          Intersection &hitB,
144          VssRayContainer &vssRays,
145          const AxisAlignedBox3 &box,
146          const bool castDoubleRay,
147          const bool pruneInvalidRays = true);
[1520]148
[2069]149  /** Checks if ray is valid.
150  I.e., the ray is in valid view space.
151  @note: clamps the ray to valid view space.
152  */
153  bool ValidateRay(const Vector3 &origin,
154          const Vector3 &direction,
155          const AxisAlignedBox3 &box,
156          Intersection &hit);
[1942]157
[2069]158  bool
159          ClipToViewSpaceBox(const Vector3 &origin,
160          const Vector3 &termination,
161          Vector3 &clippedOrigin,
162          Vector3 &clippedTermination);
[2012]163
164
165
166
[2069]167
168
[2012]169  const Preprocessor &mPreprocessor;
[1520]170};
171
172
173}
174
175#endif
Note: See TracBrowser for help on using the repository browser.