Added the Solid 3.5 sources to the blender source tree.
[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_SIMPLE_RESPONSE: 
36            if (intersect(*m_obj_ptr1, *m_obj_ptr2, m_sep_axis)) 
37            {
38                    ++count;
39                    return (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2)) ?
40                            responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), 0) :   
41                            responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), 0);    
42  
43            }
44            break;
45    case DT_WITNESSED_RESPONSE: {
46            MT_Point3  p1, p2;
47            
48            if (common_point(*m_obj_ptr1, *m_obj_ptr2, m_sep_axis, p1, p2)) 
49            { 
50                    ++count;
51            if (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2))
52            {
53                            DT_CollData coll_data;
54                            
55                            p1.getValue(coll_data.point1);
56                            p2.getValue(coll_data.point2);
57                            
58                return responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), &coll_data);
59            }
60            else
61            {
62                            DT_CollData coll_data;
63                            
64                            p1.getValue(coll_data.point2);
65                            p2.getValue(coll_data.point1);
66                            
67                return responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), &coll_data);
68            }
69            }
70            break;
71    }
72    case DT_DEPTH_RESPONSE: {
73            MT_Point3  p1, p2;
74            
75            if (penetration_depth(*m_obj_ptr1, *m_obj_ptr2, m_sep_axis, p1, p2)) 
76            { 
77                    ++count;
78            if (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2))
79            {
80                            DT_CollData coll_data;
81                            
82                            p1.getValue(coll_data.point1);
83                            p2.getValue(coll_data.point2);       
84                (p2 - p1).getValue(coll_data.normal);
85                            
86                return responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), &coll_data);
87            }
88            else
89            {
90                            DT_CollData coll_data;
91                            
92                            p1.getValue(coll_data.point2);
93                            p2.getValue(coll_data.point1); 
94                (p1 - p2).getValue(coll_data.normal);
95                            
96                return responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), &coll_data);
97            }
98            }
99            break;
100    }
101    case DT_NO_RESPONSE:
102            break;
103    default:
104            assert(false);
105    }
106    return DT_CONTINUE;
107 }