Add new broad phase collision response to Solid: this will let us hook (and potential...
[blender.git] / extern / solid / src / DT_Encounter.cpp
1 /*
2  * SOLID - Software Library for Interference Detection
3  * 
4  * Copyright (C) 2001-2003  Dtecta.  All rights reserved.
5  *
6  * This library may be distributed under the terms of the Q Public License
7  * (QPL) as defined by Trolltech AS of Norway and appearing in the file
8  * LICENSE.QPL included in the packaging of this file.
9  *
10  * This library may be distributed and/or modified under the terms of the
11  * GNU General Public License (GPL) version 2 as published by the Free Software
12  * Foundation and appearing in the file LICENSE.GPL included in the
13  * packaging of this file.
14  *
15  * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17  *
18  * Commercial use or any other use of this library not covered by either 
19  * the QPL or the GPL requires an additional license from Dtecta. 
20  * Please contact info@dtecta.com for enquiries about the terms of commercial
21  * use of this library.
22  */
23
24 #include "DT_RespTable.h"
25 #include "DT_Encounter.h"
26 #include "DT_Object.h"
27 #include "GEN_MinMax.h"
28
29 DT_Bool DT_Encounter::exactTest(const DT_RespTable *respTable, int& count) const 
30 {
31         const DT_ResponseList& responseList = respTable->find(m_obj_ptr1, m_obj_ptr2);
32
33    switch (responseList.getType()) 
34    {
35    case DT_BROAD_RESPONSE:
36            return (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2)) ?
37                            responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), 0) :   
38                            responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), 0);    
39    case DT_SIMPLE_RESPONSE: 
40            if (intersect(*m_obj_ptr1, *m_obj_ptr2, m_sep_axis)) 
41            {
42                    ++count;
43                    return (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2)) ?
44                            responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), 0) :   
45                            responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), 0);    
46  
47            }
48            break;
49    case DT_WITNESSED_RESPONSE: {
50            MT_Point3  p1, p2;
51            
52            if (common_point(*m_obj_ptr1, *m_obj_ptr2, m_sep_axis, p1, p2)) 
53            { 
54                    ++count;
55            if (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2))
56            {
57                            DT_CollData coll_data;
58                            
59                            p1.getValue(coll_data.point1);
60                            p2.getValue(coll_data.point2);
61                            
62                return responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), &coll_data);
63            }
64            else
65            {
66                            DT_CollData coll_data;
67                            
68                            p1.getValue(coll_data.point2);
69                            p2.getValue(coll_data.point1);
70                            
71                return responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), &coll_data);
72            }
73            }
74            break;
75    }
76    case DT_DEPTH_RESPONSE: {
77            MT_Point3  p1, p2;
78            
79            if (penetration_depth(*m_obj_ptr1, *m_obj_ptr2, m_sep_axis, p1, p2)) 
80            { 
81                    ++count;
82            if (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2))
83            {
84                            DT_CollData coll_data;
85                            
86                            p1.getValue(coll_data.point1);
87                            p2.getValue(coll_data.point2);       
88                (p2 - p1).getValue(coll_data.normal);
89                            
90                return responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), &coll_data);
91            }
92            else
93            {
94                            DT_CollData coll_data;
95                            
96                            p1.getValue(coll_data.point2);
97                            p2.getValue(coll_data.point1); 
98                (p1 - p2).getValue(coll_data.normal);
99                            
100                return responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), &coll_data);
101            }
102            }
103            break;
104    }
105    case DT_NO_RESPONSE:
106            break;
107    default:
108            assert(false);
109    }
110    return DT_CONTINUE;
111 }