refactoring for object cloning
git-svn-id: svn://anubis/misc/OdeWorld@167 bd8a9e45-a331-0410-811e-c64571078777
This commit is contained in:
parent
0496353916
commit
023e06a8d0
54
OdeWorld.cc
54
OdeWorld.cc
@ -118,6 +118,60 @@ OdeWorld::Object::Object(bool is_static, dWorldID world, dSpaceID space)
|
|||||||
m_body = 0;
|
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)
|
void OdeWorld::Object::setPosition(double x, double y, double z)
|
||||||
{
|
{
|
||||||
if (m_is_static)
|
if (m_is_static)
|
||||||
|
@ -17,6 +17,7 @@ class OdeWorld
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Object(bool is_static, dWorldID world, dSpaceID space);
|
Object(bool is_static, dWorldID world, dSpaceID space);
|
||||||
|
Object(const Object & orig);
|
||||||
|
|
||||||
void loadPhy(const std::string & path);
|
void loadPhy(const std::string & path);
|
||||||
void setPosition(double x, double y, double z);
|
void setPosition(double x, double y, double z);
|
||||||
@ -41,7 +42,7 @@ class OdeWorld
|
|||||||
void setupGeom(dGeomID geom, dMass * mass,
|
void setupGeom(dGeomID geom, dMass * mass,
|
||||||
float locx, float locy, float locz,
|
float locx, float locy, float locz,
|
||||||
float rotx, float roty, float rotz);
|
float rotx, float roty, float rotz);
|
||||||
|
dGeomID cloneGeom(dGeomID geom, dBodyID body);
|
||||||
};
|
};
|
||||||
|
|
||||||
Object * createObject(bool is_static);
|
Object * createObject(bool is_static);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user