Example #1
0
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);
}
Example #2
0
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;
}
Example #3
0
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);
}
Example #4
0
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);
}
Example #5
0
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;
}