#ifndef ODEWORLD_H #define ODEWORLD_H #include #include #include #include #include "refptr/refptr.h" class OdeWorld { public: enum GeomType { BOX, SPHERE, PLANE, CYLINDER, CAPSULE }; OdeWorld(); ~OdeWorld(); class Object { public: Object(bool is_static, OdeWorld * ode_world, dWorldID world, dSpaceID space, float scale = 1.0f); Object(const Object & orig); ~Object(); void setPosition(double x, double y, double z); void getPosition(double * x, double * y, double * z); void setRotation(dReal x, dReal y, dReal z); const dReal * getPosition(); const dReal * getRotation(); bool addBox(refptr< std::vector > args); bool addSphere(refptr< std::vector > args); bool addCylinder(refptr< std::vector > args); bool addCapsule(refptr< std::vector > args); bool addPlane(refptr< std::vector > args); void addForce(dReal fx, dReal fy, dReal fz); void addForceRel(dReal fx, dReal fy, dReal fz); void addTorque(dReal fx, dReal fy, dReal fz); void addTorqueRel(dReal fx, dReal fy, dReal fz); void finalize(); dReal getMass() { return m_mass.mass; } void setMass(dReal newmass); void enableBody(); dBodyID getBody() { return m_body; } protected: bool m_is_static; dBodyID m_body; dMass m_mass; dWorldID m_world; dSpaceID m_space; std::vector m_geoms; float m_scale; dReal m_position[3]; dReal m_rotation[12]; OdeWorld * m_ode_world; void setupGeom(dGeomID geom, dMass * mass, float locx, float locy, float locz, float rotx, float roty, float rotz); dGeomID cloneGeom(dGeomID geom, dBodyID body); }; Object * createObject(bool is_static, float scale = 1.0f); void setGravity(float x, float y, float z) { dWorldSetGravity(m_world, x, y, z); enableAllBodies(); } void step(); void enableAllBodies(); dWorldID getWorldID() { return m_world; } dJointID createAMotor(dBodyID b1, dBodyID b2); void setAMotorNumAxes(dJointID j, int num_axes) { dJointSetAMotorNumAxes(j, num_axes); } void setAMotorAxis(dJointID j, int anum, int rel, dReal x, dReal y, dReal z) { dJointSetAMotorAxis(j, anum, rel, x, y, z); } void setAMotorLoStop(dJointID j, dReal val) { dJointSetAMotorParam(j, dParamLoStop, val); } void setAMotorHiStop(dJointID j, dReal val) { dJointSetAMotorParam(j, dParamHiStop, val); } void setAMotorVel(dJointID j, dReal val) { dJointSetAMotorParam(j, dParamVel, val); } void setAMotorFMax(dJointID j, dReal val) { dJointSetAMotorParam(j, dParamFMax, val); } void setAMotorBounce(dJointID j, dReal val) { dJointSetAMotorParam(j, dParamBounce, val); } friend void OdeWorld_collide_callback(void * data, dGeomID o1, dGeomID o2); static void pushTransform(const dReal * pos, const dReal * R); protected: dBodyID createBody(); void destroyBody(dBodyID body); dWorldID m_world; dSpaceID m_space; dJointGroupID m_contactJointGroup; std::map m_bodies; }; #endif