static dFloat RayCastFilter (const NewtonBody* const body, const NewtonCollision* const collisionHit, const dFloat* const contact, const dFloat* const normal, dLong collisionID, void* const userData, dFloat intersetParam) { dFloat mass; dFloat Ixx; dFloat Iyy; dFloat Izz; // check if we are hitting a sub shape const NewtonCollision* const parent = NewtonCollisionGetParentInstance(collisionHit); if (parent) { // you can use this to filter sub collision shapes. dAssert (NewtonCollisionGetSubCollisionHandle (collisionHit)); } dMousePickClass* const data = (dMousePickClass*) userData; NewtonBodyGetMassMatrix (body, &mass, &Ixx, &Iyy, &Izz); if ((mass > 0.0f) || (NewtonBodyGetType(body) == NEWTON_KINEMATIC_BODY)) { data->m_body = body; } if (intersetParam < data->m_param) { data->m_param = intersetParam; data->m_normal = dVector (normal[0], normal[1], normal[2]); } return intersetParam; }
static unsigned RayPrefilter (const NewtonBody* const body, const NewtonCollision* const collision, void* const userData) { // if the collision has a parent, the this can be it si a sub shape of a compound collision const NewtonCollision* const parent = NewtonCollisionGetParentInstance(collision); if (parent) { // you can use this to filter sub collision shapes. dAssert (NewtonCollisionGetSubCollisionHandle (collision)); } return 1; }
// implement a ray cast pre-filter static unsigned RayCastPrefilter (const NewtonBody* body, const NewtonCollision* const collision, void* const userData) { // ray cannot pick trigger volumes //return NewtonCollisionIsTriggerVolume(collision) ? 0 : 1; const NewtonCollision* const parent = NewtonCollisionGetParentInstance(collision); if (parent) { // you can use this to filter sub collision shapes. dAssert (NewtonCollisionGetSubCollisionHandle (collision)); } return (NewtonBodyGetType(body) == NEWTON_DYNAMIC_BODY) ? 1 : 0; }
static dFloat RayCastPlacement (const NewtonBody* const body, const NewtonCollision* const collisionHit, const dFloat* const contact, const dFloat* const normal, dLong collisionID, void* const userData, dFloat intersetParam) { // if the collision has a parent, the this can be it si a sub shape of a compound collision const NewtonCollision* const parent = NewtonCollisionGetParentInstance(collisionHit); if (parent) { // you can use this to filter sub collision shapes. dAssert (NewtonCollisionGetSubCollisionHandle (collisionHit)); } dFloat* const paramPtr = (dFloat*)userData; if (intersetParam < paramPtr[0]) { paramPtr[0] = intersetParam; } return paramPtr[0]; }