diff options
author | dan miller | 2007-10-19 05:20:48 +0000 |
---|---|---|
committer | dan miller | 2007-10-19 05:20:48 +0000 |
commit | d48ea5bb797037069d641da41da0f195f0124491 (patch) | |
tree | 40ff433d94859d629aac933d5ec73b382f62ba1a /libraries/ode-0.9/OPCODE/OPC_TreeBuilders.cpp | |
parent | dont ask (diff) | |
download | opensim-SC-d48ea5bb797037069d641da41da0f195f0124491.zip opensim-SC-d48ea5bb797037069d641da41da0f195f0124491.tar.gz opensim-SC-d48ea5bb797037069d641da41da0f195f0124491.tar.bz2 opensim-SC-d48ea5bb797037069d641da41da0f195f0124491.tar.xz |
one more for the gipper
Diffstat (limited to 'libraries/ode-0.9/OPCODE/OPC_TreeBuilders.cpp')
-rw-r--r-- | libraries/ode-0.9/OPCODE/OPC_TreeBuilders.cpp | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/libraries/ode-0.9/OPCODE/OPC_TreeBuilders.cpp b/libraries/ode-0.9/OPCODE/OPC_TreeBuilders.cpp new file mode 100644 index 0000000..d2359a0 --- /dev/null +++ b/libraries/ode-0.9/OPCODE/OPC_TreeBuilders.cpp | |||
@@ -0,0 +1,255 @@ | |||
1 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
2 | /* | ||
3 | * OPCODE - Optimized Collision Detection | ||
4 | * Copyright (C) 2001 Pierre Terdiman | ||
5 | * Homepage: http://www.codercorner.com/Opcode.htm | ||
6 | */ | ||
7 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
8 | |||
9 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
10 | /** | ||
11 | * Contains code for tree builders. | ||
12 | * \file OPC_TreeBuilders.cpp | ||
13 | * \author Pierre Terdiman | ||
14 | * \date March, 20, 2001 | ||
15 | */ | ||
16 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
17 | |||
18 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
19 | /** | ||
20 | * A builder for AABB-trees of vertices. | ||
21 | * | ||
22 | * \class AABBTreeOfVerticesBuilder | ||
23 | * \author Pierre Terdiman | ||
24 | * \version 1.3 | ||
25 | * \date March, 20, 2001 | ||
26 | */ | ||
27 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
28 | |||
29 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
30 | /** | ||
31 | * A builder for AABB-trees of AABBs. | ||
32 | * | ||
33 | * \class AABBTreeOfAABBsBuilder | ||
34 | * \author Pierre Terdiman | ||
35 | * \version 1.3 | ||
36 | * \date March, 20, 2001 | ||
37 | */ | ||
38 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
39 | |||
40 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
41 | /** | ||
42 | * A builder for AABB-trees of triangles. | ||
43 | * | ||
44 | * \class AABBTreeOfTrianglesBuilder | ||
45 | * \author Pierre Terdiman | ||
46 | * \version 1.3 | ||
47 | * \date March, 20, 2001 | ||
48 | */ | ||
49 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
50 | |||
51 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
52 | // Precompiled Header | ||
53 | #include "Stdafx.h" | ||
54 | |||
55 | using namespace Opcode; | ||
56 | |||
57 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
58 | /** | ||
59 | * Computes the AABB of a set of primitives. | ||
60 | * \param primitives [in] list of indices of primitives | ||
61 | * \param nb_prims [in] number of indices | ||
62 | * \param global_box [out] global AABB enclosing the set of input primitives | ||
63 | * \return true if success | ||
64 | */ | ||
65 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
66 | bool AABBTreeOfAABBsBuilder::ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const | ||
67 | { | ||
68 | // Checkings | ||
69 | if(!primitives || !nb_prims) return false; | ||
70 | |||
71 | // Initialize global box | ||
72 | global_box = mAABBArray[primitives[0]]; | ||
73 | |||
74 | // Loop through boxes | ||
75 | for(udword i=1;i<nb_prims;i++) | ||
76 | { | ||
77 | // Update global box | ||
78 | global_box.Add(mAABBArray[primitives[i]]); | ||
79 | } | ||
80 | return true; | ||
81 | } | ||
82 | |||
83 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
84 | /** | ||
85 | * Computes the splitting value along a given axis for a given primitive. | ||
86 | * \param index [in] index of the primitive to split | ||
87 | * \param axis [in] axis index (0,1,2) | ||
88 | * \return splitting value | ||
89 | */ | ||
90 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
91 | float AABBTreeOfAABBsBuilder::GetSplittingValue(udword index, udword axis) const | ||
92 | { | ||
93 | // For an AABB, the splitting value is the middle of the given axis, | ||
94 | // i.e. the corresponding component of the center point | ||
95 | return mAABBArray[index].GetCenter(axis); | ||
96 | } | ||
97 | |||
98 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
99 | /** | ||
100 | * Computes the AABB of a set of primitives. | ||
101 | * \param primitives [in] list of indices of primitives | ||
102 | * \param nb_prims [in] number of indices | ||
103 | * \param global_box [out] global AABB enclosing the set of input primitives | ||
104 | * \return true if success | ||
105 | */ | ||
106 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
107 | bool AABBTreeOfTrianglesBuilder::ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const | ||
108 | { | ||
109 | // Checkings | ||
110 | if(!primitives || !nb_prims) return false; | ||
111 | |||
112 | // Initialize global box | ||
113 | Point Min(MAX_FLOAT, MAX_FLOAT, MAX_FLOAT); | ||
114 | Point Max(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); | ||
115 | |||
116 | // Loop through triangles | ||
117 | VertexPointers VP; | ||
118 | while(nb_prims--) | ||
119 | { | ||
120 | // Get current triangle-vertices | ||
121 | mIMesh->GetTriangle(VP, *primitives++); | ||
122 | // Update global box | ||
123 | Min.Min(*VP.Vertex[0]).Min(*VP.Vertex[1]).Min(*VP.Vertex[2]); | ||
124 | Max.Max(*VP.Vertex[0]).Max(*VP.Vertex[1]).Max(*VP.Vertex[2]); | ||
125 | } | ||
126 | global_box.SetMinMax(Min, Max); | ||
127 | return true; | ||
128 | } | ||
129 | |||
130 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
131 | /** | ||
132 | * Computes the splitting value along a given axis for a given primitive. | ||
133 | * \param index [in] index of the primitive to split | ||
134 | * \param axis [in] axis index (0,1,2) | ||
135 | * \return splitting value | ||
136 | */ | ||
137 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
138 | float AABBTreeOfTrianglesBuilder::GetSplittingValue(udword index, udword axis) const | ||
139 | { | ||
140 | /* // Compute center of triangle | ||
141 | Point Center; | ||
142 | mTriList[index].Center(mVerts, Center); | ||
143 | // Return value | ||
144 | return Center[axis];*/ | ||
145 | |||
146 | // Compute correct component from center of triangle | ||
147 | // return (mVerts[mTriList[index].mVRef[0]][axis] | ||
148 | // +mVerts[mTriList[index].mVRef[1]][axis] | ||
149 | // +mVerts[mTriList[index].mVRef[2]][axis])*INV3; | ||
150 | |||
151 | VertexPointers VP; | ||
152 | mIMesh->GetTriangle(VP, index); | ||
153 | |||
154 | // Compute correct component from center of triangle | ||
155 | return ((*VP.Vertex[0])[axis] | ||
156 | +(*VP.Vertex[1])[axis] | ||
157 | +(*VP.Vertex[2])[axis])*INV3; | ||
158 | } | ||
159 | |||
160 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
161 | /** | ||
162 | * Computes the splitting value along a given axis for a given node. | ||
163 | * \param primitives [in] list of indices of primitives | ||
164 | * \param nb_prims [in] number of indices | ||
165 | * \param global_box [in] global AABB enclosing the set of input primitives | ||
166 | * \param axis [in] axis index (0,1,2) | ||
167 | * \return splitting value | ||
168 | */ | ||
169 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
170 | float AABBTreeOfTrianglesBuilder::GetSplittingValue(const udword* primitives, udword nb_prims, const AABB& global_box, udword axis) const | ||
171 | { | ||
172 | if(mSettings.mRules&SPLIT_GEOM_CENTER) | ||
173 | { | ||
174 | // Loop through triangles | ||
175 | float SplitValue = 0.0f; | ||
176 | VertexPointers VP; | ||
177 | for(udword i=0;i<nb_prims;i++) | ||
178 | { | ||
179 | // Get current triangle-vertices | ||
180 | mIMesh->GetTriangle(VP, primitives[i]); | ||
181 | // Update split value | ||
182 | SplitValue += (*VP.Vertex[0])[axis]; | ||
183 | SplitValue += (*VP.Vertex[1])[axis]; | ||
184 | SplitValue += (*VP.Vertex[2])[axis]; | ||
185 | } | ||
186 | return SplitValue / float(nb_prims*3); | ||
187 | } | ||
188 | else return AABBTreeBuilder::GetSplittingValue(primitives, nb_prims, global_box, axis); | ||
189 | } | ||
190 | |||
191 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
192 | /** | ||
193 | * Computes the AABB of a set of primitives. | ||
194 | * \param primitives [in] list of indices of primitives | ||
195 | * \param nb_prims [in] number of indices | ||
196 | * \param global_box [out] global AABB enclosing the set of input primitives | ||
197 | * \return true if success | ||
198 | */ | ||
199 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
200 | bool AABBTreeOfVerticesBuilder::ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const | ||
201 | { | ||
202 | // Checkings | ||
203 | if(!primitives || !nb_prims) return false; | ||
204 | |||
205 | // Initialize global box | ||
206 | global_box.SetEmpty(); | ||
207 | |||
208 | // Loop through vertices | ||
209 | for(udword i=0;i<nb_prims;i++) | ||
210 | { | ||
211 | // Update global box | ||
212 | global_box.Extend(mVertexArray[primitives[i]]); | ||
213 | } | ||
214 | return true; | ||
215 | } | ||
216 | |||
217 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
218 | /** | ||
219 | * Computes the splitting value along a given axis for a given primitive. | ||
220 | * \param index [in] index of the primitive to split | ||
221 | * \param axis [in] axis index (0,1,2) | ||
222 | * \return splitting value | ||
223 | */ | ||
224 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
225 | float AABBTreeOfVerticesBuilder::GetSplittingValue(udword index, udword axis) const | ||
226 | { | ||
227 | // For a vertex, the splitting value is simply the vertex coordinate. | ||
228 | return mVertexArray[index][axis]; | ||
229 | } | ||
230 | |||
231 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
232 | /** | ||
233 | * Computes the splitting value along a given axis for a given node. | ||
234 | * \param primitives [in] list of indices of primitives | ||
235 | * \param nb_prims [in] number of indices | ||
236 | * \param global_box [in] global AABB enclosing the set of input primitives | ||
237 | * \param axis [in] axis index (0,1,2) | ||
238 | * \return splitting value | ||
239 | */ | ||
240 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
241 | float AABBTreeOfVerticesBuilder::GetSplittingValue(const udword* primitives, udword nb_prims, const AABB& global_box, udword axis) const | ||
242 | { | ||
243 | if(mSettings.mRules&SPLIT_GEOM_CENTER) | ||
244 | { | ||
245 | // Loop through vertices | ||
246 | float SplitValue = 0.0f; | ||
247 | for(udword i=0;i<nb_prims;i++) | ||
248 | { | ||
249 | // Update split value | ||
250 | SplitValue += mVertexArray[primitives[i]][axis]; | ||
251 | } | ||
252 | return SplitValue / float(nb_prims); | ||
253 | } | ||
254 | else return AABBTreeBuilder::GetSplittingValue(primitives, nb_prims, global_box, axis); | ||
255 | } | ||