diff --git a/OdeWorld.cc b/OdeWorld.cc index 8df3772..fe0c5a6 100644 --- a/OdeWorld.cc +++ b/OdeWorld.cc @@ -118,6 +118,60 @@ OdeWorld::Object::Object(bool is_static, dWorldID world, dSpaceID space) m_body = 0; } +OdeWorld::Object::Object(const OdeWorld::Object & orig) +{ + m_is_static = orig.m_is_static; + m_world = orig.m_world; + m_space = orig.m_space; + /* make a copy of the ODE body */ + if (orig.m_body != 0) + { + m_body = dBodyCreate(m_world); + dMass mass; + dBodyGetMass(orig.m_body, &mass); + dBodySetMass(m_body, &mass); + const dReal * pos = dBodyGetPosition(orig.m_body); + dBodySetPosition(m_body, pos[0], pos[1], pos[2]); + const dReal * rot = dBodyGetRotation(orig.m_body); + dBodySetRotation(m_body, rot); + } + else + { + m_body = 0; + } + /* make a copy of the ODE geoms */ + for (int i = 0, sz = orig.m_geoms.size(); i < sz; i++) + { + m_geoms.push_back(cloneGeom(orig.m_geoms[i], m_body)); + } +} + +dGeomID OdeWorld::Object::cloneGeom(dGeomID geom, dBodyID body) +{ + /* TODO: clone the geom */ + switch (dGeomGetClass(geom)) + { + case dSphereClass: + break; + case dBoxClass: + break; + case dCCylinderClass: + break; + case dCylinderClass: + break; + case dPlaneClass: + break; + case dGeomTransformClass: + break; + case dRayClass: + case dTriMeshClass: + case dSimpleSpaceClass: + case dHashSpaceClass: + /* unsupported for cloning */ + break; + } +} + void OdeWorld::Object::setPosition(double x, double y, double z) { if (m_is_static) diff --git a/OdeWorld.h b/OdeWorld.h index 1a9acb3..43b3f7a 100644 --- a/OdeWorld.h +++ b/OdeWorld.h @@ -17,6 +17,7 @@ class OdeWorld { public: Object(bool is_static, dWorldID world, dSpaceID space); + Object(const Object & orig); void loadPhy(const std::string & path); void setPosition(double x, double y, double z); @@ -41,7 +42,7 @@ class OdeWorld 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);