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

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