00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef PHY_ABSTRACT_GEOM_H
00028 #define PHY_ABSTRACT_GEOM_H
00029
00030
00031 #ifndef ENABLE_PHYSICS_BASIC_WRAPPING
00032
00033 #endif
00034 #ifndef ENABLE_PHYSICS_EXTRA_WRAPPING
00035
00036 #endif
00037
00038 #include <PVLE/Config.h>
00039 #include <PVLE/Export.h>
00040 #include <PVLE/Util/Util.h>
00041 #include <boost/operators.hpp>
00042 #include <ode/ode.h>
00043 #include <PVLE/Physics/Converters.h>
00044
00045 #include <osg/Referenced>
00046 #include <osg/ref_ptr>
00047 #include <osg/BoundingBox>
00048
00049 #include <map>
00050
00051 class IGeomCollisionContainer;
00052
00053 namespace Physics {
00054
00055
00056 class World;
00057 class Body;
00058 class Space;
00059 class Geom;
00060 class Visitor;
00061
00062 typedef std::map<const Body *, Body *> TDuplicatedBodiesMap;
00063 typedef std::pair<const Body *, Body *> TDuplicatedBody;
00064
00065
00069 class PVLE_EXPORT AbstractGeom : public osg::Referenced, public boost::totally_ordered<AbstractGeom> {
00070 public:
00071 AbstractGeom() : id(0) {}
00072
00074 enum ECopyOpts {
00075 COPY_BODIES = 0x1,
00076 COPY_CHILDREN = 0x2,
00077 COPY_ALL = 0xffffffff
00078 };
00079
00090 static AbstractGeom * clone(const AbstractGeom & v, UINT opts = COPY_ALL, IGeomCollisionContainer * pGeomsContainer = NULL, TDuplicatedBodiesMap * pDuplicatedBodies = NULL);
00091
00092 #ifdef ENABLE_PHYSICS_EXTRA_WRAPPING
00093
00095 void enable() { dGeomEnable(id); }
00097 void disable() { dGeomDisable(id); }
00099 bool isEnabled() const { return dGeomIsEnabled(id) != 0; }
00100 #endif
00101
00102 osg::BoundingBox getAABB() const { dReal bb[6]; dGeomGetAABB(id, bb); return toGraphBB(bb); }
00103
00104 bool isSpace() const { return dGeomIsSpace(id)!=0; }
00105 virtual Space * asSpace() { return NULL; }
00106 virtual Geom * asGeom() { return NULL; }
00107 virtual const Space * asSpace() const { return NULL; }
00108 virtual const Geom * asGeom() const { return NULL; }
00109
00112 virtual void accept(Visitor & v);
00113 virtual void traverse(Visitor & v) {}
00114
00115
00118 Space * getParentSpace() {
00119 dSpaceID spaceId = dGeomGetSpace(id);
00120 return spaceId ? static_cast<Space *>(dGeomGetData(reinterpret_cast<dGeomID>(spaceId))) : NULL;
00121 }
00122
00124 const Space * getParentSpace() const {
00125 dSpaceID spaceId = dGeomGetSpace(id);
00126 return spaceId ? (Space *)dGeomGetData((dGeomID)spaceId) : NULL;
00127 }
00128
00129 bool operator<(const AbstractGeom & g) const { return id < g.id; }
00130 bool operator==(const AbstractGeom & g) const { return id == g.id; }
00131
00132 protected:
00133 friend class Geom;
00134 friend class Space;
00135 friend class World;
00136 #ifdef PVLE_PHYSICS_KEEP_DEPRECATED_TRANSFORMS
00137 friend class Transform;
00138 #endif
00139
00140 mutable dGeomID id;
00141 dSpaceID asSpaceId() { ASSERT(isSpace()); return (dSpaceID)id; }
00142
00145 virtual ~AbstractGeom() {
00146 if (id) {
00147
00148
00149 dSpaceID parentSpaceID = dGeomGetSpace(id);
00150 if (parentSpaceID) dSpaceRemove(parentSpaceID, id);
00151 dGeomDestroy(id);
00152 }
00153 }
00154 };
00155
00156
00157 }
00158
00159 #endif // PHY_ABSTRACT_GEOM_H