refactoring for object cloning

git-svn-id: svn://anubis/misc/OdeWorld@167 bd8a9e45-a331-0410-811e-c64571078777
This commit is contained in:
josh 2009-10-11 14:32:39 +00:00
parent 0496353916
commit 023e06a8d0
2 changed files with 56 additions and 1 deletions

View File

@ -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)

View File

@ -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);