00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef ODESPACE_H
00016 #define ODESPACE_H
00017
00018 #include "pandabase.h"
00019 #include "typedObject.h"
00020 #include "luse.h"
00021 #include "bitMask.h"
00022
00023
00024 #include "odeWorld.h"
00025 #include "odeJointGroup.h"
00026
00027 #include "ode_includes.h"
00028
00029 #ifdef HAVE_PYTHON
00030 #include "py_panda.h"
00031 #include "Python.h"
00032 #endif
00033
00034 class OdeGeom;
00035 class OdeTriMeshGeom;
00036 class OdeSimpleSpace;
00037 class OdeHashSpace;
00038 class OdeQuadTreeSpace;
00039
00040
00041
00042
00043
00044 class EXPCL_PANDAODE OdeSpace : public TypedObject {
00045 friend class OdeGeom;
00046 static const int MAX_CONTACTS;
00047
00048 protected:
00049 OdeSpace(dSpaceID id);
00050
00051 PUBLISHED:
00052 virtual ~OdeSpace();
00053 void destroy();
00054 INLINE bool is_empty() const;
00055
00056 INLINE void set_cleanup(int mode);
00057 INLINE int get_cleanup() const;
00058 int query(const OdeGeom& geom) const;
00059 int query(const OdeSpace& space) const;
00060 INLINE int get_num_geoms() const;
00061 INLINE void get_AABB(LVecBase3f &min, LVecBase3f &max) const;
00062 INLINE int is_space();
00063 INLINE int get_class() const;
00064 INLINE void set_category_bits(const BitMask32 &bits);
00065 INLINE void set_collide_bits(const BitMask32 &bits);
00066 INLINE BitMask32 get_category_bits();
00067 INLINE BitMask32 get_collide_bits();
00068 INLINE void enable();
00069 INLINE void disable();
00070 INLINE int is_enabled();
00071 void set_auto_collide_world(OdeWorld&);
00072 void set_auto_collide_joint_group(OdeJointGroup&);
00073
00074 void add(OdeGeom& geom);
00075 void add(OdeSpace& space);
00076 void remove(OdeGeom& geom);
00077 void remove(OdeSpace& space);
00078 void clean();
00079 OdeGeom get_geom(int i);
00080
00081
00082 INLINE OdeSpace get_space() const;
00083
00084 virtual void write(ostream &out = cout, unsigned int indent=0) const;
00085 operator bool () const;
00086
00087 OdeSimpleSpace convert_to_simple_space() const;
00088 OdeHashSpace convert_to_hash_space() const;
00089 OdeQuadTreeSpace convert_to_quad_tree_space() const;
00090
00091 int auto_collide();
00092 #ifdef HAVE_PYTHON
00093 int collide(PyObject* arg, PyObject* near_callback);
00094 #endif
00095 static double get_contact_data(int data_index);
00096 int get_contact_id(int data_index, int first = 0);
00097 int set_collide_id(int collide_id, dGeomID id);
00098 int set_collide_id(OdeGeom& geom, int collide_id);
00099 void set_surface_type( int surface_type, dGeomID id);
00100 void set_surface_type(OdeGeom& geom, int surface_type);
00101 int get_surface_type(dGeomID o1);
00102 int get_surface_type(OdeGeom& geom);
00103 int get_collide_id(dGeomID o1);
00104 int get_collide_id(OdeGeom& geom);
00105
00106 INLINE void set_collision_event(const string &event_name);
00107 INLINE string get_collision_event();
00108
00109 public:
00110 static void auto_callback(void*, dGeomID, dGeomID);
00111 #ifdef HAVE_PYTHON
00112 static void near_callback(void*, dGeomID, dGeomID);
00113 #endif
00114
00115 INLINE dSpaceID get_id() const;
00116 static OdeWorld* _collide_world;
00117 static OdeSpace* _collide_space;
00118 static dJointGroupID _collide_joint_group;
00119 #ifdef HAVE_PYTHON
00120 static PyObject* _python_callback;
00121 #endif
00122 static int contactCount;
00123 string _collision_event;
00124
00125 static double contact_data[192];
00126 static int contact_ids[128];
00127
00128 protected:
00129 dSpaceID _id;
00130 int _g;
00131 OdeWorld* my_world;
00132
00133 public:
00134 static TypeHandle get_class_type() {
00135 return _type_handle;
00136 }
00137 static void init_type() {
00138 TypedObject::init_type();
00139 register_type(_type_handle, "OdeSpace",
00140 TypedObject::get_class_type());
00141 }
00142 virtual TypeHandle get_type() const {
00143 return get_class_type();
00144 }
00145 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00146
00147 private:
00148 static TypeHandle _type_handle;
00149
00150 typedef pmap<dGeomID, int> GeomSurfaceMap;
00151 GeomSurfaceMap _geom_surface_map;
00152
00153 typedef pmap<dGeomID, int> GeomCollideIdMap;
00154 GeomCollideIdMap _geom_collide_id_map;
00155
00156 };
00157
00158 #include "odeSpace.I"
00159
00160 #endif
00161