migrating some Engine::Object functionality to OdeWorld::Object

git-svn-id: svn://anubis/misc/OdeWorld@160 bd8a9e45-a331-0410-811e-c64571078777
This commit is contained in:
josh 2009-10-08 02:38:32 +00:00
parent 09b50cb3e8
commit 71b14157d0
2 changed files with 94 additions and 38 deletions

View File

@ -81,7 +81,7 @@ void OdeWorld::step()
} }
vector<dGeomID> OdeWorld::loadPhy(const std::string & path, vector<dGeomID> OdeWorld::loadPhy(const std::string & path,
dBodyID * body, bool static_data) dBodyID * body, bool is_static)
{ {
vector<dGeomID> ret; vector<dGeomID> ret;
@ -123,19 +123,19 @@ vector<dGeomID> OdeWorld::loadPhy(const std::string & path,
} }
if (type == "cube") if (type == "cube")
{ {
ret.push_back(addCube(name, static_data, body, args)); ret.push_back(addCube(name, is_static, body, args));
} }
else if (type == "sphere") else if (type == "sphere")
{ {
ret.push_back(addSphere(name, static_data, body, args)); ret.push_back(addSphere(name, is_static, body, args));
} }
else if (type == "cylinder") else if (type == "cylinder")
{ {
ret.push_back(addCylinder(name, static_data, body, args)); ret.push_back(addCylinder(name, is_static, body, args));
} }
else if (type == "plane") else if (type == "plane")
{ {
ret.push_back(addPlane(name, static_data, body, args)); ret.push_back(addPlane(name, is_static, body, args));
} }
} }
} }
@ -143,63 +143,63 @@ vector<dGeomID> OdeWorld::loadPhy(const std::string & path,
return ret; return ret;
} }
dGeomID OdeWorld::addCube(const string & name, bool static_data, dGeomID OdeWorld::addCube(const string & name, bool is_static,
dBodyID * body, const vector<float> args) dBodyID * body, const vector<float> args)
{ {
if (args.size() != 9) if (args.size() != 9)
return 0; return 0;
dGeomID id = dCreateBox(m_space, args[0], args[1], args[2]); dGeomID id = dCreateBox(0, args[0], args[1], args[2]);
dMass mass; dMass mass;
dMassSetBox(&mass, 1.0, args[0], args[1], args[2]); dMassSetBox(&mass, 1.0, args[0], args[1], args[2]);
setupGeom(name, static_data, body, id, &mass, setupGeom(name, is_static, body, id, &mass,
args[3], args[4], args[5], args[3], args[4], args[5],
args[6], args[7], args[8]); args[6], args[7], args[8]);
return id; return id;
} }
dGeomID OdeWorld::addSphere(const string & name, bool static_data, dGeomID OdeWorld::addSphere(const string & name, bool is_static,
dBodyID * body, const vector<float> args) dBodyID * body, const vector<float> args)
{ {
if (args.size() != 4) if (args.size() != 4)
return 0; return 0;
dGeomID id = dCreateSphere(m_space, args[0]); dGeomID id = dCreateSphere(0, args[0]);
dMass mass; dMass mass;
dMassSetSphere(&mass, 1.0, args[0]); dMassSetSphere(&mass, 1.0, args[0]);
setupGeom(name, static_data, body, id, &mass, setupGeom(name, is_static, body, id, &mass,
args[1], args[2], args[3], args[1], args[2], args[3],
0.0, 0.0, 0.0); 0.0, 0.0, 0.0);
return id; return id;
} }
dGeomID OdeWorld::addCylinder(const string & name, bool static_data, dGeomID OdeWorld::addCylinder(const string & name, bool is_static,
dBodyID * body, const vector<float> args) dBodyID * body, const vector<float> args)
{ {
if (args.size() != 8) if (args.size() != 8)
return 0; return 0;
dGeomID id = dCreateCylinder(m_space, args[0], args[1]); dGeomID id = dCreateCylinder(0, args[0], args[1]);
dMass mass; dMass mass;
dMassSetCylinder(&mass, 1.0, 3, args[0], args[1]); dMassSetCylinder(&mass, 1.0, 3, args[0], args[1]);
setupGeom(name, static_data, body, id, &mass, setupGeom(name, is_static, body, id, &mass,
args[2], args[3], args[4], args[2], args[3], args[4],
args[5], args[6], args[7]); args[5], args[6], args[7]);
return id; return id;
} }
dGeomID OdeWorld::addCCylinder(const string & name, bool static_data, dGeomID OdeWorld::addCCylinder(const string & name, bool is_static,
dBodyID * body, const vector<float> args) dBodyID * body, const vector<float> args)
{ {
if (args.size() != 8) if (args.size() != 8)
return 0; return 0;
dGeomID id = dCreateCCylinder(m_space, args[0], args[1]); dGeomID id = dCreateCCylinder(0, args[0], args[1]);
dMass mass; dMass mass;
dMassSetCappedCylinder(&mass, 1.0, 3, args[0], args[1]); dMassSetCappedCylinder(&mass, 1.0, 3, args[0], args[1]);
setupGeom(name, static_data, body, id, &mass, setupGeom(name, is_static, body, id, &mass,
args[2], args[3], args[4], args[2], args[3], args[4],
args[5], args[6], args[7]); args[5], args[6], args[7]);
return id; return id;
} }
dGeomID OdeWorld::addPlane(const string & name, bool static_data, dGeomID OdeWorld::addPlane(const string & name, bool is_static,
dBodyID * body, const vector<float> args) dBodyID * body, const vector<float> args)
{ {
if (args.size() != 6) if (args.size() != 6)
@ -220,21 +220,27 @@ dGeomID OdeWorld::addPlane(const string & name, bool static_data,
return id; return id;
} }
void OdeWorld::setupGeom(const std::string & name, bool static_data, void OdeWorld::setupGeom(const std::string & name, bool is_static,
dBodyID * body, dGeomID geom, dMass * mass, dBodyID * body, 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)
{ {
if (!static_data)
{
if (*body == 0)
*body = dBodyCreate(m_world);
dGeomSetBody(geom, *body);
dMatrix3 rot; dMatrix3 rot;
dRFromEulerAngles(rot, rotx, roty, rotz); dRFromEulerAngles(rot, rotx, roty, rotz);
dGeomSetRotation(geom, rot); dGeomSetRotation(geom, rot);
dGeomSetPosition(geom, locx, locy, locz);
if (!is_static)
{
/* attach the geometry to the body */
if (*body == 0)
*body = dBodyCreate(m_world);
dGeomId transform = dCreateGeomTransform(m_space);
dGeomTransformSetGeom(transform, geom);
dGeomTransformSetCleanup(transform, 1);
dGeomSetBody(transform, *body);
dMassRotate(mass, rot); dMassRotate(mass, rot);
dMassTranslate(mass, locx, locy, locz); dMassTranslate(mass, locx, locy, locz);
@ -243,13 +249,6 @@ void OdeWorld::setupGeom(const std::string & name, bool static_data,
dMassAdd(&origmass, mass); dMassAdd(&origmass, mass);
dBodySetMass(*body, &origmass); dBodySetMass(*body, &origmass);
} }
else
{
dMatrix3 rot;
dRFromEulerAngles(rot, rotx, roty, rotz);
dGeomSetRotation(geom, rot);
dGeomSetPosition(geom, locx, locy, locz);
}
} }
/* push an OpenGL matrix onto the matrix stack for a given /* push an OpenGL matrix onto the matrix stack for a given
@ -276,3 +275,44 @@ void OdeWorld::pushTransform(const float pos[3], const float R[12])
glPushMatrix(); glPushMatrix();
glMultMatrixf(matrix); glMultMatrixf(matrix);
} }
OdeWorld::Object::Object(bool is_static)
{
m_is_static = is_static;
}
void OdeWorld::Object::setPosition(double x, double y, double z)
{
if (m_is_static)
{
for (int i = 0, sz = m_geoms.size(); i < sz; i++)
dGeomSetPosition(m_geoms[i], x, y, z);
}
else
{
if (m_body != 0)
dBodySetPosition(m_body, x, y, z);
}
}
void OdeWorld::Object::getPosition(double * x, double * y, double * z)
{
const dReal * pos = NULL;
if (m_is_static)
{
if (m_geoms.size() > 0)
pos = dGeomGetPosition(m_geoms[0]);
}
else
{
if (m_body != 0)
pos = dBodyGetPosition(body);
}
if (pos != NULL)
{
*x = pos[0];
*y = pos[1];
*z = pos[2];
}
}

View File

@ -12,22 +12,38 @@ class OdeWorld
public: public:
OdeWorld(); OdeWorld();
~OdeWorld(); ~OdeWorld();
class Object
{
public:
Object(bool is_static);
void loadPhy(const std::string & path);
void setPosition(double x, double y, double z);
void getPosition(double * x, double * y, double * z);
protected:
bool m_is_static;
dBodyID m_body;
std::vector<dGeomID> m_geoms;
};
void setGravity(float x, float y, float z) void setGravity(float x, float y, float z)
{ {
dWorldSetGravity(m_world, x, y, z); dWorldSetGravity(m_world, x, y, z);
} }
void step(); void step();
std::vector<dGeomID> loadPhy(const std::string & path, std::vector<dGeomID> loadPhy(const std::string & path,
dBodyID * body, bool static_data = false); dBodyID * body, bool is_static = false);
dGeomID addCube(const std::string & name, bool static_data, dGeomID addCube(const std::string & name, bool is_static,
dBodyID * body, const std::vector<float> args); dBodyID * body, const std::vector<float> args);
dGeomID addSphere(const std::string & name, bool static_data, dGeomID addSphere(const std::string & name, bool is_static,
dBodyID * body, const std::vector<float> args); dBodyID * body, const std::vector<float> args);
dGeomID addCylinder(const std::string & name, bool static_data, dGeomID addCylinder(const std::string & name, bool is_static,
dBodyID * body, const std::vector<float> args); dBodyID * body, const std::vector<float> args);
dGeomID addCCylinder(const std::string & name, bool static_data, dGeomID addCCylinder(const std::string & name, bool is_static,
dBodyID * body, const std::vector<float> args); dBodyID * body, const std::vector<float> args);
dGeomID addPlane(const std::string & name, bool static_data, dGeomID addPlane(const std::string & name, bool is_static,
dBodyID * body, const std::vector<float> args); dBodyID * body, const std::vector<float> args);
friend void OdeWorld_collide_callback(void * data, friend void OdeWorld_collide_callback(void * data,
@ -41,7 +57,7 @@ class OdeWorld
dJointGroupID m_contactJointGroup; dJointGroupID m_contactJointGroup;
std::map<std::string, dGeomID> m_objects; std::map<std::string, dGeomID> m_objects;
void setupGeom(const std::string & name, bool static_data, void setupGeom(const std::string & name, bool is_static,
dBodyID * body, dGeomID geom, dMass * mass, dBodyID * body, 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);