setting user data in OdeWorld objects to Engine::Object pointer; added ID parameter to Engine::Objects to keep track of their integer ID; finished Engine::pickObjects() which now returns a list of Object IDs

git-svn-id: svn://anubis/anaglym/trunk@253 99a6e188-d820-4881-8870-2d33a10e2619
This commit is contained in:
Josh Holtrop 2010-02-21 17:25:05 +00:00
parent f9d1fde72a
commit 09c46c6799
2 changed files with 16 additions and 1 deletions

View File

@ -283,6 +283,7 @@ int Engine::addObject(WFObj * obj, bool is_static, bool is_reference,
{ {
int id = m_next_object_index++; int id = m_next_object_index++;
Object * o = new Object(is_static, is_reference, m_world, obj, scale); Object * o = new Object(is_static, is_reference, m_world, obj, scale);
o->setID(id);
m_objects[id] = o; m_objects[id] = o;
return id; return id;
} }
@ -292,6 +293,7 @@ int Engine::addObject(bool is_static, bool is_reference,
{ {
int id = m_next_object_index++; int id = m_next_object_index++;
Object * o = new Object(is_static, is_reference, m_world, geom_type, args); Object * o = new Object(is_static, is_reference, m_world, geom_type, args);
o->setID(id);
m_objects[id] = o; m_objects[id] = o;
return id; return id;
} }
@ -407,6 +409,7 @@ int Engine::cloneObject(const Engine::Object * obj)
{ {
int id = m_next_object_index++; int id = m_next_object_index++;
Object * o = new Object(*obj); Object * o = new Object(*obj);
o->setID(id);
m_objects[id] = o; m_objects[id] = o;
return id; return id;
} }
@ -660,7 +663,13 @@ refptr< vector<int> > Engine::pickObjects(int x, int y)
rotated_direction[0], rotated_direction[1], rotated_direction[2]); rotated_direction[0], rotated_direction[1], rotated_direction[2]);
refptr< vector<int> > ret = new vector<int>(); refptr< vector<int> > ret = new vector<int>();
/* TODO: finish */ for (vector<OdeWorld::Object *>::const_iterator it = objects->begin();
it != objects->end();
it++)
{
Object * o = (Object *) (*it)->getUserData();
ret->push_back(o->getID());
}
return ret; return ret;
} }
@ -1130,6 +1139,7 @@ Engine::Object::Object(bool is_static, bool is_reference,
else else
{ {
m_ode_object = world.createObject(is_static, scale); m_ode_object = world.createObject(is_static, scale);
m_ode_object->setUserData(this);
} }
m_is_static = is_static; m_is_static = is_static;
m_display_list = obj->render(); m_display_list = obj->render();
@ -1167,6 +1177,7 @@ Engine::Object::Object(bool is_static, bool is_reference, OdeWorld & world,
else else
{ {
m_ode_object = world.createObject(m_is_static, m_scale); m_ode_object = world.createObject(m_is_static, m_scale);
m_ode_object->setUserData(this);
} }
m_is_managed = true; m_is_managed = true;
m_geom_type = geom_type; m_geom_type = geom_type;
@ -1215,6 +1226,7 @@ Engine::Object::Object(const Engine::Object & orig)
{ {
m_ode_object = new OdeWorld::Object(*orig.m_ode_object); m_ode_object = new OdeWorld::Object(*orig.m_ode_object);
} }
m_ode_object->setUserData(this);
if (m_is_managed) if (m_is_managed)
{ {
createManagedObject(); createManagedObject();

View File

@ -89,6 +89,8 @@ class Engine
if (m_ode_object != NULL) if (m_ode_object != NULL)
m_ode_object->setGravityMode(enabled); m_ode_object->setGravityMode(enabled);
} }
void setID(int id) { m_id = id; }
int getID() { return m_id; }
protected: protected:
void createManagedObject(); void createManagedObject();
@ -108,6 +110,7 @@ class Engine
dReal m_mass; dReal m_mass;
bool m_mass_is_set; bool m_mass_is_set;
bool m_gravity_mode; bool m_gravity_mode;
int m_id;
/* for "pre-loaded" objects */ /* for "pre-loaded" objects */
int * m_display_list_refcnt; int * m_display_list_refcnt;