Added the Solid 3.5 sources to the blender source tree.
[blender.git] / extern / solid / src / broad / BP_Proxy.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 <new>
25
26 #include "BP_Proxy.h"
27 #include "BP_Scene.h"
28
29 BP_Proxy::BP_Proxy(void *object, 
30                                    BP_Scene& scene) 
31   :     m_object(object),
32         m_scene(scene)
33 {
34         int i;
35         for (i = 0; i < 3; ++i) 
36         {
37                 new (&m_interval[i]) BP_Interval(this);
38         }
39 }
40
41 void BP_Proxy::add(const DT_Vector3 min,
42                                    const DT_Vector3 max,
43                                    BP_ProxyList& proxies) 
44 {
45         int i;
46         for (i = 0; i < 3; ++i) 
47         {
48                 m_scene.getList(i).addInterval(
49                         BP_Endpoint(min[i], BP_Endpoint::MINIMUM, &m_interval[i].m_min), 
50                         BP_Endpoint(max[i], BP_Endpoint::MAXIMUM, &m_interval[i].m_max), 
51                         proxies);
52         }
53 }
54
55 void BP_Proxy::remove(BP_ProxyList& proxies) 
56 {
57         int i;
58         for (i = 0; i < 3; ++i) 
59         {
60                 m_scene.getList(i).removeInterval(
61                         m_interval[i].m_min.m_index,
62                         m_interval[i].m_max.m_index,
63                         proxies);
64         }
65 }
66
67 DT_Scalar BP_Proxy::getMin(int i) const 
68
69         return m_scene.getList(i)[m_interval[i].m_min.m_index].getPos(); 
70 }
71
72 DT_Scalar BP_Proxy::getMax(int i) const 
73
74         return m_scene.getList(i)[m_interval[i].m_max.m_index].getPos(); 
75 }
76
77 bool overlapXY(const BP_Proxy& a, const BP_Proxy& b)
78 {
79         return a.getMin(0) <= b.getMax(0) && b.getMin(0) <= a.getMax(0) && 
80                    a.getMin(1) <= b.getMax(1) && b.getMin(1) <= a.getMax(1);
81 }
82
83 bool overlapXZ(const BP_Proxy& a, const BP_Proxy& b)
84 {
85         return a.getMin(0) <= b.getMax(0) && b.getMin(0) <= a.getMax(0) && 
86                    a.getMin(2) <= b.getMax(2) && b.getMin(2) <= a.getMax(2); 
87 }
88
89 bool overlapYZ(const BP_Proxy& a, const BP_Proxy& b)
90 {
91         return a.getMin(1) <= b.getMax(1) && b.getMin(1) <= a.getMax(1) && 
92                    a.getMin(2) <= b.getMax(2) && b.getMin(2) <= a.getMax(2); 
93 }
94
95 void BP_Proxy::setBBox(const DT_Vector3 min, const DT_Vector3 max)
96 {       
97         static T_Overlap overlap[3] = { overlapYZ, overlapXZ, overlapXY };
98
99         int i;
100         for (i = 0; i < 3; ++i) 
101         {
102                 if (min[i] > getMax(i)) 
103                 {
104                         m_scene.getList(i).move(m_interval[i].m_max.m_index, max[i], 
105                                                                         BP_Endpoint::MAXIMUM, m_scene, overlap[i]);
106                         m_scene.getList(i).move(m_interval[i].m_min.m_index, min[i], 
107                                                                         BP_Endpoint::MINIMUM, m_scene, overlap[i]);
108                 }
109                 else 
110                 {
111                         m_scene.getList(i).move(m_interval[i].m_min.m_index, min[i], 
112                                                                         BP_Endpoint::MINIMUM, m_scene, overlap[i]);
113                         m_scene.getList(i).move(m_interval[i].m_max.m_index, max[i], 
114                                                                         BP_Endpoint::MAXIMUM, m_scene, overlap[i]);
115                 }
116         }
117 }
118
119
120