Add new broad phase collision response to Solid: this will let us hook (and potential...
authorKester Maddock <Christopher.Maddock.1@uni.massey.ac.nz>
Sat, 6 Nov 2004 04:56:05 +0000 (04:56 +0000)
committerKester Maddock <Christopher.Maddock.1@uni.massey.ac.nz>
Sat, 6 Nov 2004 04:56:05 +0000 (04:56 +0000)
extern/solid/SOLID/SOLID.h
extern/solid/include/SOLID.h
extern/solid/src/DT_C-api.cpp
extern/solid/src/DT_Encounter.cpp

index 906be729ba06151fbe7a6bde86d351addebfda75..37d74340f8caf6bedeb9df6998dd22cc724a4b2c 100644 (file)
@@ -40,7 +40,8 @@ extern "C" {
        typedef unsigned int DT_ResponseClass;
 
        typedef enum DT_ResponseType { 
-               DT_NO_RESPONSE,                  /* No response (obsolete) */              
+               DT_NO_RESPONSE,                  /* No response (obsolete) */        
+               DT_BROAD_RESPONSE,      
                DT_SIMPLE_RESPONSE,              /* No collision data */
                DT_WITNESSED_RESPONSE,           /* A point common to both objects
                                                                                        is returned as collision data
@@ -146,6 +147,8 @@ extern "C" {
        extern DECLSPEC void DT_GetBBox(DT_ObjectHandle object, DT_Vector3 min, DT_Vector3 max);
 
 
+       extern DECLSPEC DT_Bool  DT_GetIntersect(DT_ObjectHandle object1, DT_ObjectHandle object2,
+                                                                                               DT_Vector3 v);
 /* This next command returns the distance between the objects. De returned
    closest points are given in world coordinates.
 */
index 906be729ba06151fbe7a6bde86d351addebfda75..96d40f1ea6b462b92cc0a70145f5da31e42b507d 100755 (executable)
@@ -40,7 +40,8 @@ extern "C" {
        typedef unsigned int DT_ResponseClass;
 
        typedef enum DT_ResponseType { 
-               DT_NO_RESPONSE,                  /* No response (obsolete) */              
+               DT_NO_RESPONSE,                  /* No response (obsolete) */
+               DT_BROAD_RESPONSE,               /* Broad phase response is returned. */
                DT_SIMPLE_RESPONSE,              /* No collision data */
                DT_WITNESSED_RESPONSE,           /* A point common to both objects
                                                                                        is returned as collision data
@@ -145,7 +146,9 @@ extern "C" {
 
        extern DECLSPEC void DT_GetBBox(DT_ObjectHandle object, DT_Vector3 min, DT_Vector3 max);
 
-
+       
+       extern DECLSPEC DT_Bool  DT_GetIntersect(DT_ObjectHandle object1, DT_ObjectHandle object2,
+                                                                                               DT_Vector3 v);
 /* This next command returns the distance between the objects. De returned
    closest points are given in world coordinates.
 */
index c07a3bb7ccc397d3cf1ebf30d03b141fe8e4147e..ac16deda87dc5269889e5a13342b37fe62e9fbe8 100755 (executable)
@@ -372,6 +372,14 @@ void DT_GetBBox(DT_ObjectHandle object, DT_Vector3 min, DT_Vector3 max)
        bbox.getMax().getValue(max);
 }
 
+DT_Bool DT_GetIntersect(DT_ObjectHandle object1, DT_ObjectHandle object2, DT_Vector3 vec)
+{
+       MT_Vector3 v;
+       DT_Bool result = intersect(*(DT_Object*)object1, *(DT_Object*)object2, v);
+       v.getValue(vec);
+       return result;
+}
+
 DT_Scalar DT_GetClosestPair(DT_ObjectHandle object1, DT_ObjectHandle object2,
                                                        DT_Vector3 point1, DT_Vector3 point2) 
 {
index 49cc4bf37649aa9df928a2354653b17cd3068a09..36de33154a3470b1212c3e4e30fcc428e62a85ac 100755 (executable)
@@ -32,6 +32,10 @@ DT_Bool DT_Encounter::exactTest(const DT_RespTable *respTable, int& count) const
 
    switch (responseList.getType()) 
    {
+   case DT_BROAD_RESPONSE:
+          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);    
    case DT_SIMPLE_RESPONSE: 
           if (intersect(*m_obj_ptr1, *m_obj_ptr2, m_sep_axis)) 
           {