source: GTP/trunk/Lib/Vis/Preprocessing/src/Intersectable.h @ 1579

Revision 1579, 3.7 KB checked in by bittner, 18 years ago (diff)

merge

Line 
1#ifndef __INTERSECTABLE_H
2#define __INTERSECTABLE_H
3
4#include "AxisAlignedBox3.h"
5#include "Pvs.h"
6#include <set>
7#include "VssRay.h"
8
9namespace GtpVisibilityPreprocessor {
10
11struct VssRayContainer;
12class KdLeaf;
13class BvhLeaf;
14
15class Intersectable;
16struct Face;
17
18
19struct FaceParentInfo {
20        /// intersectable
21        Intersectable *mObject;
22        /// face index
23        int mFaceIndex;
24
25        FaceParentInfo(Intersectable *obj, const int fi):
26        mObject(obj), mFaceIndex(fi)
27        {}
28};
29
30
31class Intersectable {
32public:
33  // last mail id -> warning not thread safe!
34  // both mailId and mailbox should be unique for each thread!!!
35  static int sMailId;
36  static int sReservedMailboxes;
37
38  /// Mailbox used for traversals
39  int mMailbox;
40 
41  /// unique object Id
42  int mId;
43
44  /// universal counter
45  int mCounter;
46
47  /// pointer to the container bvh leaf
48  BvhLeaf *mBvhLeaf;
49
50  /// some rays piercing this intersectable
51  VssRayContainer mVssRays;
52
53  /// # of references to this instance
54  int mReferences;
55
56  //////////////////
57  // note matt: delete these, they are only taking memory+
58
59
60  /// object based pvs
61  KdPvs mKdPvs;
62
63  /// view cell based pvs per object
64  ViewCellPvs mViewCellPvs;
65       
66  ///////////////////////
67
68  enum { MESH_INSTANCE,
69                 TRANSFORMED_MESH_INSTANCE,
70                 SPHERE,
71                 VIEW_CELL,
72                 OGRE_MESH_INSTANCE,
73                 KD_INTERSECTABLE,
74                 BVH_INTERSECTABLE,
75                 TRIANGLE_INTERSECTABLE
76                };
77 
78  Intersectable(): mMailbox(0), mReferences(0), mBvhLeaf(0) {}
79
80  void SetId(const int id) { mId = id; }
81  int GetId() { return mId; }
82 
83  ////////////////////////////////////////////////
84  //    Mailing stuff
85 
86  static void NewMail(const int reserve = 1) {
87        sMailId += sReservedMailboxes;
88        sReservedMailboxes = reserve;
89  }
90       
91  void Mail() { mMailbox = sMailId; }
92  bool Mailed() const { return mMailbox == sMailId; }
93 
94  void Mail(const int mailbox) { mMailbox = sMailId + mailbox; }
95  bool Mailed(const int mailbox) const { return mMailbox == sMailId + mailbox; }
96 
97  int IncMail() { return ++ mMailbox - sMailId; }
98
99  ////////////////////////////////////////////////////
100  virtual AxisAlignedBox3 GetBox() const = 0;
101  virtual int CastRay(GtpVisibilityPreprocessor::Ray &ray) = 0;
102 
103  virtual bool IsConvex() const = 0;
104  virtual bool IsWatertight() const = 0;
105  virtual float IntersectionComplexity() = 0;
106 
107  virtual int NumberOfFaces() const = 0;
108  virtual int Type() const = 0;
109 
110  virtual int GetRandomSurfacePoint(Vector3 &point, Vector3 &normal) = 0;
111 
112        virtual int GetRandomVisibleSurfacePoint(Vector3 &point,
113                                                                                         Vector3 &normal,
114                                                                                         const Vector3 &viewpoint,
115                                                                                         const int maxTries) = 0;
116 
117        virtual ostream &Describe(ostream &s) = 0;
118       
119        virtual int GenerateSilhouetteRays(const int nrays,
120                                                                           const AxisAlignedBox3 &originBox,
121                                                                           const AxisAlignedBox3 &directionBox, VssRayContainer &rays)
122        {
123                return 0;
124        }
125
126        static bool GreaterCounter(const Intersectable *a,
127                                                         const Intersectable *b)
128        {
129                return a->mCounter > b->mCounter;
130        }
131
132        static string GetTypeName(Intersectable *obj)
133        {
134                switch(obj->Type())
135                {
136                case MESH_INSTANCE:
137                        return "mesh_instance\n";
138               
139                case TRANSFORMED_MESH_INSTANCE:
140                        return "transformed_mesh_instance\n";
141                       
142                case SPHERE:
143                        return "sphere\n";
144
145                case VIEW_CELL:
146                        return "view cell\n";
147               
148                case OGRE_MESH_INSTANCE:
149                        return "ogre_mesh_instance\n";
150
151                case KD_INTERSECTABLE:
152                        return "kd_intersectable\n";
153
154                default:
155                        return "unknown\n";
156                }
157        }
158
159        /** returns normal from the face with the specified index.
160                PROBLEM: Does not fit to all intersectable types (e.g., spheres)
161        */
162        virtual Vector3 GetNormal(const int idx) const { return Vector3(0, 0, 0); }
163};
164
165
166}
167
168#endif
Note: See TracBrowser for help on using the repository browser.