added OdeWorld::pickOne()
git-svn-id: svn://anubis/misc/OdeWorld@241 bd8a9e45-a331-0410-811e-c64571078777
This commit is contained in:
parent
95045f6470
commit
7c1b38c98f
29
OdeWorld.cc
29
OdeWorld.cc
@ -157,9 +157,38 @@ refptr< vector< OdeWorld::PickedObjectRef > > OdeWorld::pickObjects(
|
|||||||
this, OdeWorld_pick_collide_callback);
|
this, OdeWorld_pick_collide_callback);
|
||||||
std::sort(m_pick_points.begin(), m_pick_points.end(),
|
std::sort(m_pick_points.begin(), m_pick_points.end(),
|
||||||
RPPickedObjectComparator);
|
RPPickedObjectComparator);
|
||||||
|
dGeomDestroy(m_pick_ray);
|
||||||
return new vector<OdeWorld::PickedObjectRef>(m_pick_points);
|
return new vector<OdeWorld::PickedObjectRef>(m_pick_points);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OdeWorld::PickedObjectRef OdeWorld::pickOne(
|
||||||
|
float start_x, float start_y, float start_z,
|
||||||
|
float dir_x, float dir_y, float dir_z,
|
||||||
|
OdeWorld::Object * o)
|
||||||
|
{
|
||||||
|
dGeomID pick_ray = dCreateRay(0, dInfinity);
|
||||||
|
dGeomRaySet(pick_ray, start_x, start_y, start_z, dir_x, dir_y, dir_z);
|
||||||
|
|
||||||
|
PickedObjectRef por;
|
||||||
|
bool found_one = false;
|
||||||
|
|
||||||
|
dContactGeom contact_geom;
|
||||||
|
for (vector<dGeomID>::iterator it = o->getGeoms().begin();
|
||||||
|
it != o->getGeoms().end();
|
||||||
|
it++)
|
||||||
|
{
|
||||||
|
dGeomID g = *it;
|
||||||
|
int num = dCollide(pick_ray, g, 1, &contact_geom, sizeof(contact_geom));
|
||||||
|
if (num > 0 && (!found_one || contact_geom.depth < por->dist))
|
||||||
|
{
|
||||||
|
por = new OdeWorld::PickedObject(g, contact_geom);
|
||||||
|
found_one = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dGeomDestroy(pick_ray);
|
||||||
|
return por;
|
||||||
|
}
|
||||||
|
|
||||||
void OdeWorld::destroyBody(dBodyID body)
|
void OdeWorld::destroyBody(dBodyID body)
|
||||||
{
|
{
|
||||||
m_bodies.erase(body);
|
m_bodies.erase(body);
|
||||||
|
@ -56,6 +56,7 @@ class OdeWorld
|
|||||||
m_user_data = user_data;
|
m_user_data = user_data;
|
||||||
}
|
}
|
||||||
void * getUserData() { return m_user_data; }
|
void * getUserData() { return m_user_data; }
|
||||||
|
std::vector<dGeomID> & getGeoms() { return m_geoms; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool m_is_static;
|
bool m_is_static;
|
||||||
@ -175,6 +176,10 @@ class OdeWorld
|
|||||||
refptr< std::vector<PickedObjectRef> > pickObjects(
|
refptr< std::vector<PickedObjectRef> > pickObjects(
|
||||||
float start_x, float start_y, float start_z,
|
float start_x, float start_y, float start_z,
|
||||||
float dir_x, float dir_y, float dir_z);
|
float dir_x, float dir_y, float dir_z);
|
||||||
|
PickedObjectRef pickOne(
|
||||||
|
float start_x, float start_y, float start_z,
|
||||||
|
float dir_x, float dir_y, float dir_z,
|
||||||
|
Object * o);
|
||||||
|
|
||||||
friend void OdeWorld_collide_callback(void * data,
|
friend void OdeWorld_collide_callback(void * data,
|
||||||
dGeomID o1, dGeomID o2);
|
dGeomID o1, dGeomID o2);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user