diff --git a/panda/src/ode/odeBody.I b/panda/src/ode/odeBody.I index 76dc5088d5..6bd9d3bf43 100755 --- a/panda/src/ode/odeBody.I +++ b/panda/src/ode/odeBody.I @@ -91,6 +91,11 @@ set_position(dReal x, dReal y, dReal z) { dBodySetPosition(_id, x, y, z); } +INLINE void OdeBody:: +set_position(const LVecBase3f &pos) { + set_position(pos[0], pos[1], pos[2]); +} + INLINE void OdeBody:: set_rotation(const LMatrix3f r) { dMatrix3 mat3 = {r._m.data[0], r._m.data[1], r._m.data[2], 0, @@ -114,11 +119,21 @@ set_linear_vel(dReal x, dReal y, dReal z) { dBodySetLinearVel(_id, x, y, z); } +INLINE void OdeBody:: +set_linear_vel(const LVecBase3f &vel) { + set_linear_vel(vel[0], vel[1], vel[2]); +} + INLINE void OdeBody:: set_angular_vel(dReal x, dReal y, dReal z) { dBodySetAngularVel(_id, x, y, z); } +INLINE void OdeBody:: +set_angular_vel(const LVecBase3f &vel) { + set_angular_vel(vel[0], vel[1], vel[2]); +} + INLINE LVecBase3f OdeBody:: get_position() const { const dReal *res = dBodyGetPosition(_id); @@ -166,51 +181,101 @@ add_force(dReal fx, dReal fy, dReal fz) { dBodyAddForce(_id, fx, fy, fz); } +INLINE void OdeBody:: +add_force(const LVecBase3f &f) { + add_force(f[0], f[1], f[2]); +} + INLINE void OdeBody:: add_torque(dReal fx, dReal fy, dReal fz) { dBodyAddTorque(_id, fx, fy, fz); } +INLINE void OdeBody:: +add_torque(const LVecBase3f &f) { + add_torque(f[0], f[1], f[2]); +} + INLINE void OdeBody:: add_rel_force(dReal fx, dReal fy, dReal fz) { dBodyAddRelForce(_id, fx, fy, fz); } +INLINE void OdeBody:: +add_rel_force(const LVecBase3f &f) { + add_rel_force(f[0], f[1], f[2]); +} + INLINE void OdeBody:: add_rel_torque(dReal fx, dReal fy, dReal fz) { dBodyAddRelTorque(_id, fx, fy, fz); } +INLINE void OdeBody:: +add_rel_torque(const LVecBase3f &f) { + add_rel_torque(f[0], f[1], f[2]); +} + INLINE void OdeBody:: add_force_at_pos(dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz) { dBodyAddForceAtPos(_id, fx, fy, fz, px, py, pz); } +INLINE void OdeBody:: +add_force_at_pos(const LVecBase3f &f, const LVecBase3f &pos) { + add_force_at_pos(f[0], f[1], f[2], pos[0], pos[1], pos[2]); +} + INLINE void OdeBody:: add_force_at_rel_pos(dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz) { dBodyAddForceAtRelPos(_id, fx, fy, fz, px, py, pz); } +INLINE void OdeBody:: +add_force_at_rel_pos(const LVecBase3f &f, const LVecBase3f &pos) { + add_force_at_rel_pos(f[0], f[1], f[2], pos[0], pos[1], pos[2]); +} + INLINE void OdeBody:: add_rel_force_at_pos(dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz) { dBodyAddRelForceAtPos(_id, fx, fy, fz, px, py, pz); } +INLINE void OdeBody:: +add_rel_force_at_pos(const LVecBase3f &f, const LVecBase3f &pos) { + add_rel_force_at_pos(f[0], f[1], f[2], pos[0], pos[1], pos[2]); +} + INLINE void OdeBody:: add_rel_force_at_rel_pos(dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz) { dBodyAddRelForceAtRelPos(_id, fx, fy, fz, px, py, pz); } +INLINE void OdeBody:: +add_rel_force_at_rel_pos(const LVecBase3f &f, const LVecBase3f &pos) { + add_rel_force_at_rel_pos(f[0], f[1], f[2], pos[0], pos[1], pos[2]); +} + INLINE void OdeBody:: set_force(dReal x, dReal y, dReal z) { dBodySetForce(_id, x, y, z); } +INLINE void OdeBody:: +set_force(const LVecBase3f &f) { + set_force(f[0], f[1], f[2]); +} + INLINE void OdeBody:: set_torque(dReal x, dReal y, dReal z) { dBodySetTorque(_id, x, y, z); } +INLINE void OdeBody:: +set_torque(const LVecBase3f &f) { + set_torque(f[0], f[1], f[2]); +} + INLINE LPoint3f OdeBody:: get_rel_point_pos(dReal px, dReal py, dReal pz) const { dVector3 result; @@ -218,6 +283,11 @@ get_rel_point_pos(dReal px, dReal py, dReal pz) const { return LPoint3f(result[0], result[1], result[2]); } +INLINE LPoint3f OdeBody:: +get_rel_point_pos(const LVecBase3f &pos) const { + return get_rel_point_pos(pos[0], pos[1], pos[2]); +} + INLINE LPoint3f OdeBody:: get_rel_point_vel(dReal px, dReal py, dReal pz) const { dVector3 result; @@ -225,6 +295,11 @@ get_rel_point_vel(dReal px, dReal py, dReal pz) const { return LPoint3f(result[0], result[1], result[2]); } +INLINE LPoint3f OdeBody:: +get_rel_point_vel(const LVecBase3f &pos) const { + return get_rel_point_vel(pos[0], pos[1], pos[2]); +} + INLINE LPoint3f OdeBody:: get_point_vel(dReal px, dReal py, dReal pz) const { dVector3 result; @@ -232,6 +307,11 @@ get_point_vel(dReal px, dReal py, dReal pz) const { return LPoint3f(result[0], result[1], result[2]); } +INLINE LPoint3f OdeBody:: +get_point_vel(const LVecBase3f &pos) const { + return get_point_vel(pos[0], pos[1], pos[2]); +} + INLINE LPoint3f OdeBody:: get_pos_rel_point(dReal px, dReal py, dReal pz) const { dVector3 result; @@ -239,6 +319,11 @@ get_pos_rel_point(dReal px, dReal py, dReal pz) const { return LPoint3f(result[0], result[1], result[2]); } +INLINE LPoint3f OdeBody:: +get_pos_rel_point(const LVecBase3f &pos) const { + return get_pos_rel_point(pos[0], pos[1], pos[2]); +} + INLINE LVecBase3f OdeBody:: vector_to_world(dReal px, dReal py, dReal pz) const { dVector3 result; @@ -246,6 +331,11 @@ vector_to_world(dReal px, dReal py, dReal pz) const { return LVecBase3f(result[0], result[1], result[2]); } +INLINE LVecBase3f OdeBody:: +vector_to_world(const LVecBase3f &pos) const { + return vector_to_world(pos[0], pos[1], pos[2]); +} + INLINE LVecBase3f OdeBody:: vector_from_world(dReal px, dReal py, dReal pz) const { dVector3 result; @@ -253,6 +343,11 @@ vector_from_world(dReal px, dReal py, dReal pz) const { return LVecBase3f(result[0], result[1], result[2]); } +INLINE LVecBase3f OdeBody:: +vector_from_world(const LVecBase3f &pos) const { + return vector_from_world(pos[0], pos[1], pos[2]); +} + INLINE void OdeBody:: set_finite_rotation_mode(int mode) { dBodySetFiniteRotationMode(_id, mode); @@ -263,6 +358,11 @@ set_finite_rotation_axis(dReal x, dReal y, dReal z) { dBodySetFiniteRotationAxis(_id, x, y, z); } +INLINE void OdeBody:: +set_finite_rotation_axis(const LVecBase3f &axis) { + set_finite_rotation_axis(axis[0], axis[1], axis[2]); +} + INLINE int OdeBody:: get_finite_rotation_mode() const { return dBodyGetFiniteRotationMode(_id); diff --git a/panda/src/ode/odeBody.cxx b/panda/src/ode/odeBody.cxx index 32d2eced3b..5408386932 100755 --- a/panda/src/ode/odeBody.cxx +++ b/panda/src/ode/odeBody.cxx @@ -21,11 +21,6 @@ TypeHandle OdeBody::_type_handle; -OdeBody:: -OdeBody() : - _id(0) { -} - OdeBody:: OdeBody(dBodyID id) : _id(id) { @@ -42,6 +37,7 @@ OdeBody:: void OdeBody:: destroy() { + nassertv(_id); dBodyDestroy(_id); } diff --git a/panda/src/ode/odeBody.h b/panda/src/ode/odeBody.h index 63f14c019a..cf108ea6ab 100755 --- a/panda/src/ode/odeBody.h +++ b/panda/src/ode/odeBody.h @@ -41,7 +41,6 @@ protected: OdeBody(dBodyID id); PUBLISHED: - OdeBody(); OdeBody(OdeWorld &world); virtual ~OdeBody(); void destroy(); @@ -55,10 +54,13 @@ PUBLISHED: INLINE void set_data(void *data); INLINE void set_position(dReal x, dReal y, dReal z); + INLINE void set_position(const LVecBase3f &pos); INLINE void set_rotation(const LMatrix3f r); INLINE void set_quaternion(const LQuaternionf q); INLINE void set_linear_vel(dReal x, dReal y, dReal z); + INLINE void set_linear_vel(const LVecBase3f &vel); INLINE void set_angular_vel(dReal x, dReal y, dReal z); + INLINE void set_angular_vel(const LVecBase3f &vel); INLINE void set_mass(OdeMass &mass); @@ -77,29 +79,50 @@ PUBLISHED: INLINE OdeMass get_mass() const; INLINE void add_force(dReal fx, dReal fy, dReal fz); + INLINE void add_force(const LVecBase3f &f); INLINE void add_torque(dReal fx, dReal fy, dReal fz); + INLINE void add_torque(const LVecBase3f &f); INLINE void add_rel_force(dReal fx, dReal fy, dReal fz); + INLINE void add_rel_force(const LVecBase3f &f); INLINE void add_rel_torque(dReal fx, dReal fy, dReal fz); + INLINE void add_rel_torque(const LVecBase3f &f); INLINE void add_force_at_pos(dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); + INLINE void add_force_at_pos(const LVecBase3f &f, + const LVecBase3f &pos); INLINE void add_force_at_rel_pos(dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); + INLINE void add_force_at_rel_pos(const LVecBase3f &f, + const LVecBase3f &pos); INLINE void add_rel_force_at_pos(dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); + INLINE void add_rel_force_at_pos(const LVecBase3f &f, + const LVecBase3f &pos); INLINE void add_rel_force_at_rel_pos(dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); + INLINE void add_rel_force_at_rel_pos(const LVecBase3f &f, + const LVecBase3f &pos); INLINE void set_force(dReal x, dReal y, dReal z); + INLINE void set_force(const LVecBase3f &f); INLINE void set_torque(dReal x, dReal y, dReal z); + INLINE void set_torque(const LVecBase3f &f); INLINE LPoint3f get_rel_point_pos(dReal px, dReal py, dReal pz) const; + INLINE LPoint3f get_rel_point_pos(const LVecBase3f &pos) const; INLINE LPoint3f get_rel_point_vel(dReal px, dReal py, dReal pz) const; + INLINE LPoint3f get_rel_point_vel(const LVecBase3f &pos) const; INLINE LPoint3f get_point_vel(dReal px, dReal py, dReal pz) const; + INLINE LPoint3f get_point_vel(const LVecBase3f &pos) const; INLINE LPoint3f get_pos_rel_point(dReal px, dReal py, dReal pz) const; + INLINE LPoint3f get_pos_rel_point(const LVecBase3f &pos) const; INLINE LVecBase3f vector_to_world(dReal px, dReal py, dReal pz) const; + INLINE LVecBase3f vector_to_world(const LVecBase3f &pos) const; INLINE LVecBase3f vector_from_world(dReal px, dReal py, dReal pz) const; + INLINE LVecBase3f vector_from_world(const LVecBase3f &pos) const; INLINE void set_finite_rotation_mode(int mode); INLINE void set_finite_rotation_axis(dReal x, dReal y, dReal z); + INLINE void set_finite_rotation_axis(const LVecBase3f &axis); INLINE int get_finite_rotation_mode() const; INLINE LVecBase3f get_finite_rotation_axis() const; diff --git a/panda/src/ode/odeBoxGeom.I b/panda/src/ode/odeBoxGeom.I index 0b060db7a8..6f9067aeca 100755 --- a/panda/src/ode/odeBoxGeom.I +++ b/panda/src/ode/odeBoxGeom.I @@ -21,6 +21,11 @@ set_lengths(dReal lx, dReal ly, dReal lz) { dGeomBoxSetLengths(_id, lx, ly, lz); } +INLINE void OdeBoxGeom:: +set_lengths(const LVecBase3f &size) { + set_lengths(size[0], size[1], size[2]); +} + INLINE LVecBase3f OdeBoxGeom:: get_lengths() { dVector3 res; @@ -33,3 +38,8 @@ get_point_depth(dReal x, dReal y, dReal z) { return dGeomBoxPointDepth(_id, x, y, z); } +INLINE dReal OdeBoxGeom:: +get_point_depth(const LPoint3f &p) { + return get_point_depth(p[0], p[1], p[2]); +} + diff --git a/panda/src/ode/odeBoxGeom.cxx b/panda/src/ode/odeBoxGeom.cxx index 32c504ec51..5c19f8f988 100644 --- a/panda/src/ode/odeBoxGeom.cxx +++ b/panda/src/ode/odeBoxGeom.cxx @@ -31,6 +31,11 @@ OdeBoxGeom(OdeSpace &space, dReal lx, dReal ly, dReal lz) : OdeGeom(dCreateBox(space.get_id(), lx, ly, lz)) { } +OdeBoxGeom:: +OdeBoxGeom(OdeSpace &space, const LVecBase3f &size) : + OdeGeom(dCreateBox(space.get_id(), size[0], size[1], size[2])) { +} + OdeBoxGeom:: ~OdeBoxGeom() { } diff --git a/panda/src/ode/odeBoxGeom.h b/panda/src/ode/odeBoxGeom.h index fd13237861..d13101c3af 100644 --- a/panda/src/ode/odeBoxGeom.h +++ b/panda/src/ode/odeBoxGeom.h @@ -34,11 +34,14 @@ class EXPCL_PANDAODE OdeBoxGeom : public OdeGeom { PUBLISHED: OdeBoxGeom(dReal lx, dReal ly, dReal lz); OdeBoxGeom(OdeSpace &space, dReal lx, dReal ly, dReal lz); + OdeBoxGeom(OdeSpace &space, const LVecBase3f &size); virtual ~OdeBoxGeom(); INLINE void set_lengths(dReal lx, dReal ly, dReal lz); + INLINE void set_lengths(const LVecBase3f &size); INLINE LVecBase3f get_lengths(); INLINE dReal get_point_depth(dReal x, dReal y, dReal z); + INLINE dReal get_point_depth(const LPoint3f &p); public: INLINE static int get_geom_class() { return dBoxClass; }; diff --git a/panda/src/ode/odeCappedCylinderGeom.I b/panda/src/ode/odeCappedCylinderGeom.I index 49e3fd7592..65d6b4cbdf 100755 --- a/panda/src/ode/odeCappedCylinderGeom.I +++ b/panda/src/ode/odeCappedCylinderGeom.I @@ -44,3 +44,8 @@ INLINE dReal OdeCappedCylinderGeom:: get_point_depth(dReal x, dReal y, dReal z) const { return dGeomCapsulePointDepth(_id, x, y, z); } + +INLINE dReal OdeCappedCylinderGeom:: +get_point_depth(const LPoint3f &p) const { + return get_point_depth(p[0], p[1], p[2]); +} diff --git a/panda/src/ode/odeCappedCylinderGeom.h b/panda/src/ode/odeCappedCylinderGeom.h index 070d02c6d9..344663e71a 100755 --- a/panda/src/ode/odeCappedCylinderGeom.h +++ b/panda/src/ode/odeCappedCylinderGeom.h @@ -41,6 +41,7 @@ PUBLISHED: INLINE dReal get_radius() const; INLINE dReal get_length() const; INLINE dReal get_point_depth(dReal x, dReal y, dReal z) const; + INLINE dReal get_point_depth(const LPoint3f &p) const; public: INLINE static int get_geom_class() { return dCapsuleClass; }; diff --git a/panda/src/ode/odeContactGeom.cxx b/panda/src/ode/odeContactGeom.cxx index fa738a43e2..f2ebb2dfa4 100755 --- a/panda/src/ode/odeContactGeom.cxx +++ b/panda/src/ode/odeContactGeom.cxx @@ -29,33 +29,13 @@ OdeContactGeom() : OdeContactGeom:: OdeContactGeom(const OdeContactGeom ©) : _contact_geom() { - _contact_geom.pos[0] = copy._contact_geom.pos[0]; - _contact_geom.pos[1] = copy._contact_geom.pos[1]; - _contact_geom.pos[2] = copy._contact_geom.pos[2]; - _contact_geom.normal[0] = copy._contact_geom.normal[0]; - _contact_geom.normal[1] = copy._contact_geom.normal[1]; - _contact_geom.normal[2] = copy._contact_geom.normal[2]; - _contact_geom.depth = copy._contact_geom.depth; - _contact_geom.g1 = copy._contact_geom.g1; - _contact_geom.g2 = copy._contact_geom.g2; - _contact_geom.side1 = copy._contact_geom.side1; - _contact_geom.side2 = copy._contact_geom.side2; + *this = copy._contact_geom; } OdeContactGeom:: -OdeContactGeom(const dContactGeom &contact_geom) : +OdeContactGeom(const dContactGeom ©) : _contact_geom() { - _contact_geom.pos[0] = contact_geom.pos[0]; - _contact_geom.pos[1] = contact_geom.pos[1]; - _contact_geom.pos[2] = contact_geom.pos[2]; - _contact_geom.normal[0] = contact_geom.normal[0]; - _contact_geom.normal[1] = contact_geom.normal[1]; - _contact_geom.normal[2] = contact_geom.normal[2]; - _contact_geom.depth = contact_geom.depth; - _contact_geom.g1 = contact_geom.g1; - _contact_geom.g2 = contact_geom.g2; - _contact_geom.side1 = contact_geom.side1; - _contact_geom.side2 = contact_geom.side2; + *this = _contact_geom; } OdeContactGeom:: @@ -69,16 +49,21 @@ get_contact_geom_ptr() const { void OdeContactGeom:: operator = (const OdeContactGeom ©) { - _contact_geom.pos[0] = copy._contact_geom.pos[0]; - _contact_geom.pos[1] = copy._contact_geom.pos[1]; - _contact_geom.pos[2] = copy._contact_geom.pos[2]; - _contact_geom.normal[0] = copy._contact_geom.normal[0]; - _contact_geom.normal[1] = copy._contact_geom.normal[1]; - _contact_geom.normal[2] = copy._contact_geom.normal[2]; - _contact_geom.depth = copy._contact_geom.depth; - _contact_geom.g1 = copy._contact_geom.g1; - _contact_geom.g2 = copy._contact_geom.g2; - _contact_geom.side1 = copy._contact_geom.side1; - _contact_geom.side2 = copy._contact_geom.side2; + *this = copy._contact_geom; +} + +void OdeContactGeom:: +operator = (const dContactGeom &contact_geom) { + _contact_geom.pos[0] = contact_geom.pos[0]; + _contact_geom.pos[1] = contact_geom.pos[1]; + _contact_geom.pos[2] = contact_geom.pos[2]; + _contact_geom.normal[0] = contact_geom.normal[0]; + _contact_geom.normal[1] = contact_geom.normal[1]; + _contact_geom.normal[2] = contact_geom.normal[2]; + _contact_geom.depth = contact_geom.depth; + _contact_geom.g1 = contact_geom.g1; + _contact_geom.g2 = contact_geom.g2; + _contact_geom.side1 = contact_geom.side1; + _contact_geom.side2 = contact_geom.side2; } diff --git a/panda/src/ode/odeContactGeom.h b/panda/src/ode/odeContactGeom.h index 52752885c6..37ae0664fa 100755 --- a/panda/src/ode/odeContactGeom.h +++ b/panda/src/ode/odeContactGeom.h @@ -34,7 +34,7 @@ class EXPCL_PANDAODE OdeContactGeom : public TypedReferenceCount { friend class OdeContact; protected: - OdeContactGeom(const dContactGeom &contact_geom); + OdeContactGeom(const dContactGeom ©); PUBLISHED: OdeContactGeom(); @@ -60,6 +60,7 @@ public: private: void operator = (const OdeContactGeom ©); + void operator = (const dContactGeom ©); dContactGeom _contact_geom; public: diff --git a/panda/src/ode/odeGeom.I b/panda/src/ode/odeGeom.I index a83202dcbf..79c7b41770 100755 --- a/panda/src/ode/odeGeom.I +++ b/panda/src/ode/odeGeom.I @@ -43,6 +43,11 @@ set_position(dReal x, dReal y, dReal z) { dGeomSetPosition(_id, x, y, z); } +INLINE void OdeGeom:: +set_position(const LVecBase3f &pos) { + set_position(pos[0], pos[1], pos[2]); +} + INLINE void OdeGeom:: set_rotation(const LMatrix3f &r) { dMatrix3 rot = { r._m.data[0], r._m.data[1], r._m.data[2], 0, @@ -96,13 +101,23 @@ get_class() const { } INLINE void OdeGeom:: -set_category_bits(unsigned long bits) { - dGeomSetCategoryBits(_id, bits); +set_category_bits(const BitMask32 &bits) { + dGeomSetCategoryBits(_id, bits.get_word()); } INLINE void OdeGeom:: -set_collide_bits(unsigned long bits) { - dGeomSetCollideBits(_id, bits); +set_collide_bits(const BitMask32 &bits) { + dGeomSetCollideBits(_id, bits.get_word()); +} + +INLINE BitMask32 OdeGeom:: +get_category_bits() { + return BitMask32(dGeomGetCategoryBits(_id)); +} + +INLINE BitMask32 OdeGeom:: +get_collide_bits() { + return BitMask32(dGeomGetCollideBits(_id)); } INLINE void OdeGeom:: @@ -125,6 +140,11 @@ set_offset_position(dReal x, dReal y, dReal z) { dGeomSetOffsetPosition(_id, x, y, z); } +INLINE void OdeGeom:: +set_offset_position(const LVecBase3f &pos) { + set_offset_position(pos[0], pos[1], pos[2]); +} + INLINE void OdeGeom:: set_offset_rotation(const LMatrix3f &r) { dMatrix3 rot = { r._m.data[0], r._m.data[1], r._m.data[2], 0, @@ -144,6 +164,11 @@ set_offset_world_position(dReal x, dReal y, dReal z) { dGeomSetOffsetWorldPosition(_id, x, y, z); } +INLINE void OdeGeom:: +set_offset_world_position(const LVecBase3f &pos) { + set_offset_world_position(pos[0], pos[1], pos[2]); +} + INLINE void OdeGeom:: set_offset_world_rotation(const LMatrix3f &r) { dMatrix3 rot = { r._m.data[0], r._m.data[1], r._m.data[2], 0, diff --git a/panda/src/ode/odeGeom.cxx b/panda/src/ode/odeGeom.cxx index 960c0326e0..04f6f80554 100755 --- a/panda/src/ode/odeGeom.cxx +++ b/panda/src/ode/odeGeom.cxx @@ -21,12 +21,6 @@ TypeHandle OdeGeom::_type_handle; -OdeGeom:: -OdeGeom() : - _id(0) { - odegeom_cat.debug() << get_type() << "(" << _id << ")\n"; -} - OdeGeom:: OdeGeom(dGeomID id) : _id(id) { diff --git a/panda/src/ode/odeGeom.h b/panda/src/ode/odeGeom.h index d0c0e66e2b..e3e815a51c 100755 --- a/panda/src/ode/odeGeom.h +++ b/panda/src/ode/odeGeom.h @@ -22,6 +22,7 @@ #include "pandabase.h" #include "typedObject.h" #include "luse.h" +#include "bitMask.h" #include "ode_includes.h" #include "odeSpace.h" // Needed for derived classes @@ -41,7 +42,6 @@ protected: OdeGeom(dGeomID id); PUBLISHED: - OdeGeom(); virtual ~OdeGeom(); void destroy(); @@ -49,6 +49,7 @@ PUBLISHED: INLINE void set_body(OdeBody &body); INLINE OdeBody get_body() const; INLINE void set_position(dReal x, dReal y, dReal z); + INLINE void set_position(const LVecBase3f &pos); INLINE void set_rotation(const LMatrix3f &r); INLINE void set_quaternion(const LQuaternionf &q); INLINE LPoint3f get_position() const; @@ -57,15 +58,19 @@ PUBLISHED: //INLINE void get_aabb(dReal aabb[6]) const; INLINE int is_space(); INLINE int get_class() const; - INLINE void set_category_bits(unsigned long bits); - INLINE void set_collide_bits(unsigned long bits); + INLINE void set_category_bits(const BitMask32 &bits); + INLINE void set_collide_bits(const BitMask32 &bits); + INLINE BitMask32 get_category_bits(); + INLINE BitMask32 get_collide_bits(); INLINE void enable(); INLINE void disable(); INLINE int is_enabled(); INLINE void set_offset_position(dReal x, dReal y, dReal z); + INLINE void set_offset_position(const LVecBase3f &pos); INLINE void set_offset_rotation(const LMatrix3f &r); INLINE void set_offset_quaternion(const LQuaternionf &q); INLINE void set_offset_world_position(dReal x, dReal y, dReal z); + INLINE void set_offset_world_position(const LVecBase3f &pos); INLINE void set_offset_world_rotation(const LMatrix3f &r); INLINE void set_offset_world_quaternion(const LQuaternionf &q); INLINE void clear_offset(); @@ -75,7 +80,9 @@ PUBLISHED: INLINE LQuaternionf get_offset_quaternion() const; void get_space(OdeSpace &space) const; + virtual void write(ostream &out = cout, unsigned int indent=0) const; + public: INLINE dGeomID get_id() const; diff --git a/panda/src/ode/odeHeightFieldGeom.h b/panda/src/ode/odeHeightFieldGeom.h index 78acca414e..05acd405f5 100644 --- a/panda/src/ode/odeHeightFieldGeom.h +++ b/panda/src/ode/odeHeightFieldGeom.h @@ -1,4 +1,4 @@ -// Filename: odeBoxGeom.h +// Filename: odeHeightfieldGeom.h // Created by: joswilso (27Dec06) // //////////////////////////////////////////////////////////////////// @@ -16,8 +16,8 @@ // //////////////////////////////////////////////////////////////////// -#ifndef ODEBOXGEOM_H -#define ODEBOXGEOM_H +#ifndef ODEHEIGHTFIELDGEOM_H +#define ODEHEIGHTFIELDGEOM_H #include "pandabase.h" #include "typedObject.h" @@ -27,13 +27,13 @@ #include "odeGeom.h" //////////////////////////////////////////////////////////////////// -// Class : OdeBoxGeom +// Class : OdeHeightfieldGeom // Description : //////////////////////////////////////////////////////////////////// -class EXPCL_PANDAODE OdeBoxGeom : public OdeGeom { +class EXPCL_PANDAODE OdeHeightfieldGeom : public OdeGeom { PUBLISHED: - OdeBoxGeom(); - virtual ~OdeBoxGeom(); + OdeHeightfieldGeom(); + virtual ~OdeHeightfieldGeom(); INLINE dHeightfieldDataID heightfield_data_create(); INLINE void heightfield_data_destroy(dHeightfieldDataID d); @@ -51,7 +51,7 @@ public: } static void init_type() { OdeGeom::init_type(); - register_type(_type_handle, "OdeBoxGeom", + register_type(_type_handle, "OdeHeightfieldGeom", OdeGeom::get_class_type()); } virtual TypeHandle get_type() const { @@ -63,6 +63,6 @@ private: static TypeHandle _type_handle; }; -#include "odeBoxGeom.I" +#include "odeHeightfieldGeom.I" #endif diff --git a/panda/src/ode/odeJoint.I b/panda/src/ode/odeJoint.I index 9a165b57ab..559ed064ee 100755 --- a/panda/src/ode/odeJoint.I +++ b/panda/src/ode/odeJoint.I @@ -21,6 +21,7 @@ get_id() const { return _id; } +/* INLINE void OdeJoint:: set_data(void *data) { dJointSetData(_id, data); @@ -30,12 +31,14 @@ INLINE void *OdeJoint:: get_data() { return dJointGetData(_id); } +*/ INLINE int OdeJoint:: get_joint_type() const { return dJointGetType(_id); } +/* INLINE void OdeJoint:: set_feedback(dJointFeedback *feedback) { dJointSetFeedback(_id, feedback); @@ -45,3 +48,4 @@ INLINE dJointFeedback *OdeJoint:: get_feedback() { return dJointGetFeedback(_id); } +*/ \ No newline at end of file diff --git a/panda/src/ode/odeJoint.cxx b/panda/src/ode/odeJoint.cxx index 4b21110d8c..2dd1f6e445 100755 --- a/panda/src/ode/odeJoint.cxx +++ b/panda/src/ode/odeJoint.cxx @@ -38,12 +38,14 @@ destroy() { } void OdeJoint:: -attach(const OdeBody &body1, const OdeBody &body2) { +attachBodies(const OdeBody &body1, const OdeBody &body2) { + nassertv(body1.get_id() != 0 && body2.get_id() != 0); dJointAttach(_id, body1.get_id(), body2.get_id()); } void OdeJoint:: -attach(const OdeBody &body, int index) { +attachBody(const OdeBody &body, int index) { + nassertv(body.get_id() != 0); if (index == 0) { dJointAttach(_id, body.get_id(), 0); } else { @@ -56,9 +58,10 @@ detach() { dJointAttach(_id, 0, 0); } -void OdeJoint:: -get_body(int index, OdeBody &body) const { - body._id = dJointGetBody(_id, index); +OdeBody OdeJoint:: +get_body(int index) const { + nassertr(index == 0 || index == 1, OdeBody(0)); + return OdeBody(dJointGetBody(_id, index)); } void OdeJoint:: @@ -67,8 +70,7 @@ write(ostream &out, unsigned int indent) const { out.width(indent); out << "" << get_type() \ << "(id = " << _id \ << ", body1 = "; - OdeBody body; - get_body(0, body); + OdeBody body = get_body(0); if (body.get_id() != 0) { body.write(out); } @@ -76,7 +78,7 @@ write(ostream &out, unsigned int indent) const { out << "0"; } out << ", body2 = "; - get_body(1, body); + body = get_body(1); if (body.get_id() != 0) { body.write(out); } @@ -87,3 +89,8 @@ write(ostream &out, unsigned int indent) const { #endif //] NDEBUG } + +bool OdeJoint:: +operator==(const OdeJoint &other) { + return _id == other._id; +} diff --git a/panda/src/ode/odeJoint.h b/panda/src/ode/odeJoint.h index cbd61e70f4..b1d07da2c4 100755 --- a/panda/src/ode/odeJoint.h +++ b/panda/src/ode/odeJoint.h @@ -27,8 +27,8 @@ #include "odeWorld.h" // Needed for derived classes #include "odeJointGroup.h" - -class OdeBody; +// Strange, we should be forced to include this by get_body() +class OdeBody; //////////////////////////////////////////////////////////////////// @@ -45,19 +45,20 @@ protected: PUBLISHED: virtual ~OdeJoint(); void destroy(); - - INLINE void set_data(void *data); - INLINE void *get_data(); + + // INLINE void set_data(void *data); + // INLINE void *get_data(); INLINE int get_joint_type() const; - void get_body(int index, OdeBody &body) const; - INLINE void set_feedback(dJointFeedback *); - INLINE dJointFeedback *get_feedback(); + OdeBody get_body(int index) const; + // INLINE void set_feedback(dJointFeedback *); + // INLINE dJointFeedback *get_feedback(); - void attach(const OdeBody &body1, const OdeBody &body2); - void attach(const OdeBody &body, int index); + void attachBodies(const OdeBody &body1, const OdeBody &body2); + void attachBody(const OdeBody &body, int index); void detach(); virtual void write(ostream &out = cout, unsigned int indent=0) const; + bool operator==(const OdeJoint &other); public: INLINE dJointID get_id() const; diff --git a/panda/src/ode/odeMass.I b/panda/src/ode/odeMass.I index 161c60b10c..583455116e 100755 --- a/panda/src/ode/odeMass.I +++ b/panda/src/ode/odeMass.I @@ -37,6 +37,16 @@ set_parameters(dReal themass, I12, I13, I23); } +INLINE void OdeMass:: +set_parameters(dReal themass, + const LVecBase3f ¢er, + const LMatrix3f &i) { + set_parameters(themass, + center[0], center[1], center[2], + i._m.data[0], i._m.data[4], i._m.data[8], + i._m.data[1], i._m.data[2], i._m.data[5]); +} + INLINE void OdeMass:: set_sphere(dReal density, dReal radius) { _mass.setSphere(density, radius); @@ -81,7 +91,22 @@ INLINE void OdeMass:: set_box(dReal density, dReal lx, dReal ly, dReal lz) { _mass.setBox(density, - lx, ly, lz); + lx, ly, lz); +} + +INLINE void OdeMass:: +set_box(dReal density, + const LVecBase3f &size) { + _mass.setBox(density, + size[0], size[1], size[2]); +} + +INLINE void OdeMass:: +set_box_total(dReal total_mass, + const LVecBase3f &size) { + dMassSetBoxTotal(&_mass, + total_mass, + size[0], size[1], size[2]); } INLINE void OdeMass:: @@ -103,8 +128,16 @@ translate(dReal x, dReal y, dReal z) { } INLINE void OdeMass:: -rotate(const dMatrix3 R) { - _mass.rotate(R); +translate(const LVecBase3f &pos) { + translate(pos[0], pos[1], pos[2]); +} + +INLINE void OdeMass:: +rotate(const LMatrix3f &r) { + dMatrix3 rot = { r._m.data[0], r._m.data[1], r._m.data[2], 0, + r._m.data[3], r._m.data[4], r._m.data[5], 0, + r._m.data[6], r._m.data[7], r._m.data[8], 0 }; + _mass.rotate(rot); } INLINE void OdeMass:: @@ -123,7 +156,7 @@ get_center() const { } INLINE LMatrix3f OdeMass:: -get_inertia() const { +get_inertial_tensor() const { return LMatrix3f(_mass.I[0], _mass.I[1], _mass.I[2] , _mass.I[4], _mass.I[5], _mass.I[6] , _mass.I[8], _mass.I[9], _mass.I[10]); diff --git a/panda/src/ode/odeMass.cxx b/panda/src/ode/odeMass.cxx index 72f9a2b34c..889c77e748 100755 --- a/panda/src/ode/odeMass.cxx +++ b/panda/src/ode/odeMass.cxx @@ -61,7 +61,7 @@ write(ostream &out, unsigned int indent) const { out << get_type() \ << "(mag = " << get_magnitude() \ << ", center = " << get_center() \ - << ", inertia = " << get_inertia() \ + << ", inertia = " << get_inertial_tensor() \ << ")"; #endif //] NDEBUG } diff --git a/panda/src/ode/odeMass.h b/panda/src/ode/odeMass.h index 060beee2a5..df450e4cf6 100755 --- a/panda/src/ode/odeMass.h +++ b/panda/src/ode/odeMass.h @@ -41,6 +41,9 @@ PUBLISHED: dReal cgx, dReal cgy, dReal cgz, dReal I11, dReal I22, dReal I33, dReal I12, dReal I13, dReal I23); + INLINE void set_parameters(dReal themass, + const LVecBase3f ¢er, + const LMatrix3f &r); INLINE void set_sphere(dReal density, dReal radius); INLINE void set_sphere_total(dReal total_mass, dReal radius); INLINE void set_capsule(dReal density, int direction, @@ -53,16 +56,21 @@ PUBLISHED: dReal radius, dReal length); INLINE void set_box(dReal density, dReal lx, dReal ly, dReal lz); + INLINE void set_box(dReal density, + const LVecBase3f &size); INLINE void set_box_total(dReal total_mass, dReal lx, dReal ly, dReal lz); + INLINE void set_box_total(dReal total_mass, + const LVecBase3f &size); INLINE void adjust(dReal newmass); INLINE void translate(dReal x, dReal y, dReal z); - INLINE void rotate(const dMatrix3 R); + INLINE void translate(const LVecBase3f &pos); + INLINE void rotate(const LMatrix3f &r); INLINE void add(OdeMass &other); INLINE dReal get_magnitude() const; INLINE LPoint3f get_center() const; - INLINE LMatrix3f get_inertia() const; + INLINE LMatrix3f get_inertial_tensor() const; virtual void write(ostream &out = cout, unsigned int indent=0) const; diff --git a/panda/src/ode/odePlaneGeom.I b/panda/src/ode/odePlaneGeom.I index 2f4ff37ee0..9a1423e5ef 100755 --- a/panda/src/ode/odePlaneGeom.I +++ b/panda/src/ode/odePlaneGeom.I @@ -21,6 +21,11 @@ set_params(dReal a, dReal b, dReal c, dReal d) { dGeomPlaneSetParams(_id, a, b, c, d); } +INLINE void OdePlaneGeom:: +set_params(const LVecBase4f ¶ms) { + set_params(params[0], params[1], params[2], params[3]); +} + INLINE LVecBase4f OdePlaneGeom:: get_params() const { dVector4 res; @@ -32,3 +37,8 @@ INLINE dReal OdePlaneGeom:: get_point_depth(dReal x, dReal y, dReal z) const { return dGeomPlanePointDepth(_id, x, y, z); } + +INLINE dReal OdePlaneGeom:: +get_point_depth(const LPoint3f &p) const { + return get_point_depth(p[0], p[1], p[2]); +} diff --git a/panda/src/ode/odePlaneGeom.cxx b/panda/src/ode/odePlaneGeom.cxx index 0b5a1fa4d7..da3d84e9fb 100644 --- a/panda/src/ode/odePlaneGeom.cxx +++ b/panda/src/ode/odePlaneGeom.cxx @@ -26,11 +26,21 @@ OdePlaneGeom(dReal a, dReal b, dReal c, dReal d) : OdeGeom(dCreatePlane(0, a, b, c, d)) { } +OdePlaneGeom:: +OdePlaneGeom(const LVecBase4f ¶ms) : + OdeGeom(dCreatePlane(0, params[0], params[1], params[2], params[3])) { +} + OdePlaneGeom:: OdePlaneGeom(OdeSpace &space, dReal a, dReal b, dReal c, dReal d) : OdeGeom(dCreatePlane(space.get_id(), a, b, c, d)) { } +OdePlaneGeom:: +OdePlaneGeom(OdeSpace &space, const LVecBase4f ¶ms) : + OdeGeom(dCreatePlane(space.get_id(), params[0], params[1], params[2], params[3])) { +} + OdePlaneGeom:: ~OdePlaneGeom() { } diff --git a/panda/src/ode/odePlaneGeom.h b/panda/src/ode/odePlaneGeom.h index 04d0bbc254..d6bfe8c654 100755 --- a/panda/src/ode/odePlaneGeom.h +++ b/panda/src/ode/odePlaneGeom.h @@ -32,12 +32,16 @@ class EXPCL_PANDAODE OdePlaneGeom : public OdeGeom { PUBLISHED: OdePlaneGeom(dReal a, dReal b, dReal c, dReal d); + OdePlaneGeom(const LVecBase4f ¶ms); OdePlaneGeom(OdeSpace &space, dReal a, dReal b, dReal c, dReal d); + OdePlaneGeom(OdeSpace &space, const LVecBase4f ¶ms); virtual ~OdePlaneGeom(); INLINE void set_params(dReal a, dReal b, dReal c, dReal d); + INLINE void set_params(const LVecBase4f ¶ms); INLINE LVecBase4f get_params() const; INLINE dReal get_point_depth(dReal x, dReal y, dReal z) const; + INLINE dReal get_point_depth(const LPoint3f &p) const; public: INLINE static int get_geom_class() { return dPlaneClass; }; diff --git a/panda/src/ode/odeQuadTreeSpace.cxx b/panda/src/ode/odeQuadTreeSpace.cxx index b8ac6a7cba..04c55aa64d 100755 --- a/panda/src/ode/odeQuadTreeSpace.cxx +++ b/panda/src/ode/odeQuadTreeSpace.cxx @@ -23,7 +23,7 @@ TypeHandle OdeQuadTreeSpace::_type_handle; typedef struct { dVector4 vec; } sdVector4; -sdVector4 LVec3TodVector4(const LVecBase3f& vec) { +sdVector4 LVec3_to_sdVector4(const LVecBase3f& vec) { sdVector4 sdVec4; sdVec4.vec[0] = vec[0]; @@ -39,8 +39,8 @@ OdeQuadTreeSpace(const LPoint3f ¢er, const LVecBase3f &extents, const int depth) : OdeSpace(dQuadTreeSpaceCreate(0, - LVec3TodVector4(center).vec, - LVec3TodVector4(extents).vec, + LVec3_to_sdVector4(center).vec, + LVec3_to_sdVector4(extents).vec, depth)) { } @@ -50,8 +50,8 @@ OdeQuadTreeSpace(OdeSpace &space, const LVecBase3f &extents, const int depth) : OdeSpace(dQuadTreeSpaceCreate(space.get_id(), - LVec3TodVector4(center).vec, - LVec3TodVector4(extents).vec, + LVec3_to_sdVector4(center).vec, + LVec3_to_sdVector4(extents).vec, depth)) { } diff --git a/panda/src/ode/odeRayGeom.I b/panda/src/ode/odeRayGeom.I index 996a8b0ca4..4f84b5c32a 100755 --- a/panda/src/ode/odeRayGeom.I +++ b/panda/src/ode/odeRayGeom.I @@ -30,6 +30,10 @@ set(dReal px, dReal py, dReal pz, dReal dx, dReal dy, dReal dz) { dGeomRaySet(_id, px, py, pz, dx, dy, dz); } +INLINE void OdeRayGeom:: +set(const LVecBase3f &start, const LVecBase3f &dir) { + set(start[0], start[1], start[2], dir[0], dir[1], dir[2]); +} INLINE void OdeRayGeom:: get(LVecBase3f &start, LVecBase3f &dir) const { diff --git a/panda/src/ode/odeRayGeom.h b/panda/src/ode/odeRayGeom.h index bf89a1ec5d..96a48c2859 100755 --- a/panda/src/ode/odeRayGeom.h +++ b/panda/src/ode/odeRayGeom.h @@ -38,6 +38,7 @@ PUBLISHED: INLINE void set_length(dReal length); INLINE dReal get_length(); INLINE void set(dReal px, dReal py, dReal pz, dReal dx, dReal dy, dReal dz); + INLINE void set(const LVecBase3f &start, const LVecBase3f &dir); INLINE void get(LVecBase3f &start, LVecBase3f &dir) const; INLINE LVecBase3f get_start() const; INLINE LVecBase3f get_direction() const; diff --git a/panda/src/ode/odeSpace.I b/panda/src/ode/odeSpace.I index 7bb22a36fa..f1a713789e 100755 --- a/panda/src/ode/odeSpace.I +++ b/panda/src/ode/odeSpace.I @@ -60,13 +60,23 @@ get_class() const { } INLINE void OdeSpace:: -set_category_bits(unsigned long bits) { - dGeomSetCategoryBits((dGeomID)_id, bits); +set_category_bits(const BitMask32 &bits) { + dGeomSetCategoryBits((dGeomID)_id, bits.get_word()); } INLINE void OdeSpace:: -set_collide_bits(unsigned long bits) { - dGeomSetCollideBits((dGeomID)_id, bits); +set_collide_bits(const BitMask32 &bits) { + dGeomSetCollideBits((dGeomID)_id, bits.get_word()); +} + +INLINE BitMask32 OdeSpace:: +get_category_bits() { + return BitMask32(dGeomGetCategoryBits((dGeomID)_id)); +} + +INLINE BitMask32 OdeSpace:: +get_collide_bits() { + return BitMask32(dGeomGetCollideBits((dGeomID)_id)); } INLINE void OdeSpace:: diff --git a/panda/src/ode/odeSpace.cxx b/panda/src/ode/odeSpace.cxx index 70cc18ad31..24c598decf 100755 --- a/panda/src/ode/odeSpace.cxx +++ b/panda/src/ode/odeSpace.cxx @@ -33,9 +33,8 @@ OdeSpace:: void OdeSpace:: destroy() { if (get_cleanup()) { - OdeGeom geom; for (int i = 0; i < get_num_geoms(); ++i) { - get_geom(i, geom); + OdeGeom geom(get_geom(i)); if (geom.get_class() == OdeTriMeshGeom::get_geom_class()) { OdeTriMeshGeom::unlink_data(geom.get_id()); } @@ -79,9 +78,9 @@ clean() { dSpaceClean(_id); } -void OdeSpace:: -get_geom(int i, OdeGeom &geom) { - geom._id = dSpaceGetGeom(_id, i); +OdeGeom OdeSpace:: +get_geom(int i) { + return OdeGeom(dSpaceGetGeom(_id, i)); } void OdeSpace:: diff --git a/panda/src/ode/odeSpace.h b/panda/src/ode/odeSpace.h index 17e1e11e66..8b7450190a 100755 --- a/panda/src/ode/odeSpace.h +++ b/panda/src/ode/odeSpace.h @@ -22,6 +22,7 @@ #include "pandabase.h" #include "typedObject.h" #include "luse.h" +#include "bitMask.h" #include "ode_includes.h" @@ -50,8 +51,10 @@ PUBLISHED: // INLINE void get_aabb() const; INLINE int is_space(); INLINE int get_class() const; - INLINE void set_category_bits(unsigned long bits); - INLINE void set_collide_bits(unsigned long bits); + INLINE void set_category_bits(const BitMask32 &bits); + INLINE void set_collide_bits(const BitMask32 &bits); + INLINE BitMask32 get_category_bits(); + INLINE BitMask32 get_collide_bits(); INLINE void enable(); INLINE void disable(); INLINE int is_enabled(); @@ -61,7 +64,7 @@ PUBLISHED: void remove(OdeGeom& geom); void remove(OdeSpace& space); void clean(); - void get_geom(int i, OdeGeom &geom); + OdeGeom get_geom(int i); // Not INLINE because of forward declaration INLINE OdeSpace get_space() const; diff --git a/panda/src/ode/odeSphereGeom.I b/panda/src/ode/odeSphereGeom.I index 389c2b6a45..d4779be454 100755 --- a/panda/src/ode/odeSphereGeom.I +++ b/panda/src/ode/odeSphereGeom.I @@ -31,3 +31,8 @@ get_point_depth(dReal x, dReal y, dReal z) const { return dGeomSpherePointDepth(_id, x, y, z); } +INLINE dReal OdeSphereGeom:: +get_point_depth(const LPoint3f &p) const { + return get_point_depth(p[0], p[1], p[2]); +} + diff --git a/panda/src/ode/odeSphereGeom.h b/panda/src/ode/odeSphereGeom.h index 68dca3fc98..e488d1ed07 100755 --- a/panda/src/ode/odeSphereGeom.h +++ b/panda/src/ode/odeSphereGeom.h @@ -39,6 +39,7 @@ PUBLISHED: INLINE void set_radius(dReal radius); INLINE dReal get_radius() const; INLINE dReal get_point_depth(dReal x, dReal y, dReal z) const; + INLINE dReal get_point_depth(const LPoint3f &p) const; public: INLINE static int get_geom_class() { return dSphereClass; };