bool common_point(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, const DT_Convex& b, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) { DT_Pack<const DT_Convex *, MT_Scalar> pack(DT_ObjectData<const DT_Convex *, MT_Scalar>(a.m_nodes, a.m_leaves, a2w, a_margin), b); return common_point(DT_BBoxTree(a.m_cbox + pack.m_a.m_added, 0, a.m_type), pack, v, pb, pa); }
bool object_test(Encounter& e) { static Point p1, p2; const Response& resp = respTable.find(e.obj1->ref, e.obj2->ref); switch (resp.type) { case DT_SIMPLE_RESPONSE: if (intersect(*e.obj1, *e.obj2, e.sep_axis)) { resp(e.obj1->ref, e.obj2->ref); return true; } break; case DT_SMART_RESPONSE: if (prev_closest_points(*e.obj1, *e.obj2, e.sep_axis, p1, p2)) { Vector v = e.obj1->prev(p1) - e.obj2->prev(p2); resp(e.obj1->ref, e.obj2->ref, p1, p2, v); return true; } break; case DT_WITNESSED_RESPONSE: if (common_point(*e.obj1, *e.obj2, e.sep_axis, p1, p2)) { resp(e.obj1->ref, e.obj2->ref, p1, p2, Vector(0, 0, 0)); return true; } break; // Eric Espie: warning case DT_NO_RESPONSE: break; } return false; }
bool common_point(const Complex& a, const Convex& b, const Transform& a2w, const Transform& b2w, Vector& v, Point& pa, Point& pb) { Transform b2a; b2a.multInverseLeft(a2w, b2w); BBox bb = b.bbox(b2a); return common_point(a.root, b, bb, b2a, v, pb, pa); }
bool common_point(const Complex& a, const Complex& b, const Transform& a2w, const Transform& b2w, Vector& v, Point& pa, Point& pb) { Transform b2a, a2b; b2a.multInverseLeft(a2w, b2w); a2b.invert(b2a); Matrix abs_b2a = absolute(b2a.getBasis()); Matrix abs_a2b = absolute(a2b.getBasis()); return common_point(a.root, b.root, b2a, abs_b2a, a2b, abs_a2b, v, pa, pb); }
DT_Bool DT_Encounter::exactTest(const DT_RespTable *respTable, int& count) const { const DT_ResponseList& responseList = respTable->find(m_obj_ptr1, m_obj_ptr2); switch (responseList.getType()) { case DT_SIMPLE_RESPONSE: if (intersect(*m_obj_ptr1, *m_obj_ptr2, m_sep_axis)) { ++count; return (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2)) ? responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), 0) : responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), 0); } break; case DT_WITNESSED_RESPONSE: { MT_Point3 p1, p2; if (common_point(*m_obj_ptr1, *m_obj_ptr2, m_sep_axis, p1, p2)) { ++count; if (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2)) { DT_CollData coll_data; p1.getValue(coll_data.point1); p2.getValue(coll_data.point2); return responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), &coll_data); } else { DT_CollData coll_data; p1.getValue(coll_data.point2); p2.getValue(coll_data.point1); return responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), &coll_data); } } break; } case DT_DEPTH_RESPONSE: { MT_Point3 p1, p2; if (penetration_depth(*m_obj_ptr1, *m_obj_ptr2, m_sep_axis, p1, p2)) { ++count; if (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2)) { DT_CollData coll_data; p1.getValue(coll_data.point1); p2.getValue(coll_data.point2); (p2 - p1).getValue(coll_data.normal); return responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), &coll_data); } else { DT_CollData coll_data; p1.getValue(coll_data.point2); p2.getValue(coll_data.point1); (p1 - p2).getValue(coll_data.normal); return responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), &coll_data); } } break; } case DT_NO_RESPONSE: break; default: assert(false); } return DT_CONTINUE; }