1 /*
2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2009 Erwin Coumans  http://bulletphysics.org
4 
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose,
8 including commercial applications, and to alter it and redistribute it freely,
9 subject to the following restrictions:
10 
11 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
14 */
15 
16 //btShapeHull was implemented by John McCutchan.
17 
18 #include "btShapeHull.h"
19 #include "LinearMath/btConvexHull.h"
20 
21 #define NUM_UNITSPHERE_POINTS 42
22 #define NUM_UNITSPHERE_POINTS_HIGHRES 256
23 
btShapeHull(const btConvexShape * shape)24 btShapeHull::btShapeHull(const btConvexShape* shape)
25 {
26 	m_shape = shape;
27 	m_vertices.clear();
28 	m_indices.clear();
29 	m_numIndices = 0;
30 }
31 
~btShapeHull()32 btShapeHull::~btShapeHull()
33 {
34 	m_indices.clear();
35 	m_vertices.clear();
36 }
37 
buildHull(btScalar,int highres)38 bool btShapeHull::buildHull(btScalar /*margin*/, int highres)
39 {
40 
41 	int numSampleDirections = highres ? NUM_UNITSPHERE_POINTS_HIGHRES : NUM_UNITSPHERE_POINTS;
42 	btVector3 supportPoints[NUM_UNITSPHERE_POINTS_HIGHRES + MAX_PREFERRED_PENETRATION_DIRECTIONS * 2];
43 	int i;
44 	for (i = 0; i < numSampleDirections; i++)
45 	{
46 		supportPoints[i] = m_shape->localGetSupportingVertex(getUnitSpherePoints(highres)[i]);
47 	}
48 
49 	int numPDA = m_shape->getNumPreferredPenetrationDirections();
50 	if (numPDA)
51 	{
52 		for (int s = 0; s < numPDA; s++)
53 		{
54 			btVector3 norm;
55 			m_shape->getPreferredPenetrationDirection(s, norm);
56 			supportPoints[i++] = m_shape->localGetSupportingVertex(norm);
57 			numSampleDirections++;
58 		}
59 	}
60 	HullDesc hd;
61 	hd.mFlags = QF_TRIANGLES;
62 	hd.mVcount = static_cast<unsigned int>(numSampleDirections);
63 
64 #ifdef BT_USE_DOUBLE_PRECISION
65 	hd.mVertices = &supportPoints[0];
66 	hd.mVertexStride = sizeof(btVector3);
67 #else
68 	hd.mVertices = &supportPoints[0];
69 	hd.mVertexStride = sizeof(btVector3);
70 #endif
71 
72 	HullLibrary hl;
73 	HullResult hr;
74 	if (hl.CreateConvexHull(hd, hr) == QE_FAIL)
75 	{
76 		return false;
77 	}
78 
79 	m_vertices.resize(static_cast<int>(hr.mNumOutputVertices));
80 
81 	for (i = 0; i < static_cast<int>(hr.mNumOutputVertices); i++)
82 	{
83 		m_vertices[i] = hr.m_OutputVertices[i];
84 	}
85 	m_numIndices = hr.mNumIndices;
86 	m_indices.resize(static_cast<int>(m_numIndices));
87 	for (i = 0; i < static_cast<int>(m_numIndices); i++)
88 	{
89 		m_indices[i] = hr.m_Indices[i];
90 	}
91 
92 	// free temporary hull result that we just copied
93 	hl.ReleaseResult(hr);
94 
95 	return true;
96 }
97 
numTriangles() const98 int btShapeHull::numTriangles() const
99 {
100 	return static_cast<int>(m_numIndices / 3);
101 }
102 
numVertices() const103 int btShapeHull::numVertices() const
104 {
105 	return m_vertices.size();
106 }
107 
numIndices() const108 int btShapeHull::numIndices() const
109 {
110 	return static_cast<int>(m_numIndices);
111 }
112 
getUnitSpherePoints(int highres)113 btVector3* btShapeHull::getUnitSpherePoints(int highres)
114 {
115 	static btVector3 sUnitSpherePointsHighres[NUM_UNITSPHERE_POINTS_HIGHRES + MAX_PREFERRED_PENETRATION_DIRECTIONS * 2] =
116 		{
117 			btVector3(btScalar(0.997604), btScalar(0.067004), btScalar(0.017144)),
118 			btVector3(btScalar(0.984139), btScalar(-0.086784), btScalar(-0.154427)),
119 			btVector3(btScalar(0.971065), btScalar(0.124164), btScalar(-0.203224)),
120 			btVector3(btScalar(0.955844), btScalar(0.291173), btScalar(-0.037704)),
121 			btVector3(btScalar(0.957405), btScalar(0.212238), btScalar(0.195157)),
122 			btVector3(btScalar(0.971650), btScalar(-0.012709), btScalar(0.235561)),
123 			btVector3(btScalar(0.984920), btScalar(-0.161831), btScalar(0.059695)),
124 			btVector3(btScalar(0.946673), btScalar(-0.299288), btScalar(-0.117536)),
125 			btVector3(btScalar(0.922670), btScalar(-0.219186), btScalar(-0.317019)),
126 			btVector3(btScalar(0.928134), btScalar(-0.007265), btScalar(-0.371867)),
127 			btVector3(btScalar(0.875642), btScalar(0.198434), btScalar(-0.439988)),
128 			btVector3(btScalar(0.908035), btScalar(0.325975), btScalar(-0.262562)),
129 			btVector3(btScalar(0.864519), btScalar(0.488706), btScalar(-0.116755)),
130 			btVector3(btScalar(0.893009), btScalar(0.428046), btScalar(0.137185)),
131 			btVector3(btScalar(0.857494), btScalar(0.362137), btScalar(0.364776)),
132 			btVector3(btScalar(0.900815), btScalar(0.132524), btScalar(0.412987)),
133 			btVector3(btScalar(0.934964), btScalar(-0.241739), btScalar(0.259179)),
134 			btVector3(btScalar(0.894570), btScalar(-0.103504), btScalar(0.434263)),
135 			btVector3(btScalar(0.922085), btScalar(-0.376668), btScalar(0.086241)),
136 			btVector3(btScalar(0.862177), btScalar(-0.499154), btScalar(-0.085330)),
137 			btVector3(btScalar(0.861982), btScalar(-0.420218), btScalar(-0.282861)),
138 			btVector3(btScalar(0.818076), btScalar(-0.328256), btScalar(-0.471804)),
139 			btVector3(btScalar(0.762657), btScalar(-0.179329), btScalar(-0.621124)),
140 			btVector3(btScalar(0.826857), btScalar(0.019760), btScalar(-0.561786)),
141 			btVector3(btScalar(0.731434), btScalar(0.206599), btScalar(-0.649817)),
142 			btVector3(btScalar(0.769486), btScalar(0.379052), btScalar(-0.513770)),
143 			btVector3(btScalar(0.796806), btScalar(0.507176), btScalar(-0.328145)),
144 			btVector3(btScalar(0.679722), btScalar(0.684101), btScalar(-0.264123)),
145 			btVector3(btScalar(0.786854), btScalar(0.614886), btScalar(0.050912)),
146 			btVector3(btScalar(0.769486), btScalar(0.571141), btScalar(0.285139)),
147 			btVector3(btScalar(0.707432), btScalar(0.492789), btScalar(0.506288)),
148 			btVector3(btScalar(0.774560), btScalar(0.268037), btScalar(0.572652)),
149 			btVector3(btScalar(0.796220), btScalar(0.031230), btScalar(0.604077)),
150 			btVector3(btScalar(0.837395), btScalar(-0.320285), btScalar(0.442461)),
151 			btVector3(btScalar(0.848127), btScalar(-0.450548), btScalar(0.278307)),
152 			btVector3(btScalar(0.775536), btScalar(-0.206354), btScalar(0.596465)),
153 			btVector3(btScalar(0.816320), btScalar(-0.567007), btScalar(0.109469)),
154 			btVector3(btScalar(0.741191), btScalar(-0.668690), btScalar(-0.056832)),
155 			btVector3(btScalar(0.755632), btScalar(-0.602975), btScalar(-0.254949)),
156 			btVector3(btScalar(0.720311), btScalar(-0.521318), btScalar(-0.457165)),
157 			btVector3(btScalar(0.670746), btScalar(-0.386583), btScalar(-0.632835)),
158 			btVector3(btScalar(0.587031), btScalar(-0.219769), btScalar(-0.778836)),
159 			btVector3(btScalar(0.676015), btScalar(-0.003182), btScalar(-0.736676)),
160 			btVector3(btScalar(0.566932), btScalar(0.186963), btScalar(-0.802064)),
161 			btVector3(btScalar(0.618254), btScalar(0.398105), btScalar(-0.677533)),
162 			btVector3(btScalar(0.653964), btScalar(0.575224), btScalar(-0.490933)),
163 			btVector3(btScalar(0.525367), btScalar(0.743205), btScalar(-0.414028)),
164 			btVector3(btScalar(0.506439), btScalar(0.836528), btScalar(-0.208885)),
165 			btVector3(btScalar(0.651427), btScalar(0.756426), btScalar(-0.056247)),
166 			btVector3(btScalar(0.641670), btScalar(0.745149), btScalar(0.180908)),
167 			btVector3(btScalar(0.602643), btScalar(0.687211), btScalar(0.405180)),
168 			btVector3(btScalar(0.516586), btScalar(0.596999), btScalar(0.613447)),
169 			btVector3(btScalar(0.602252), btScalar(0.387801), btScalar(0.697573)),
170 			btVector3(btScalar(0.646549), btScalar(0.153911), btScalar(0.746956)),
171 			btVector3(btScalar(0.650842), btScalar(-0.087756), btScalar(0.753983)),
172 			btVector3(btScalar(0.740411), btScalar(-0.497404), btScalar(0.451830)),
173 			btVector3(btScalar(0.726946), btScalar(-0.619890), btScalar(0.295093)),
174 			btVector3(btScalar(0.637768), btScalar(-0.313092), btScalar(0.703624)),
175 			btVector3(btScalar(0.678942), btScalar(-0.722934), btScalar(0.126645)),
176 			btVector3(btScalar(0.489072), btScalar(-0.867195), btScalar(-0.092942)),
177 			btVector3(btScalar(0.622742), btScalar(-0.757541), btScalar(-0.194636)),
178 			btVector3(btScalar(0.596788), btScalar(-0.693576), btScalar(-0.403098)),
179 			btVector3(btScalar(0.550150), btScalar(-0.582172), btScalar(-0.598287)),
180 			btVector3(btScalar(0.474436), btScalar(-0.429745), btScalar(-0.768101)),
181 			btVector3(btScalar(0.372574), btScalar(-0.246016), btScalar(-0.894583)),
182 			btVector3(btScalar(0.480095), btScalar(-0.026513), btScalar(-0.876626)),
183 			btVector3(btScalar(0.352474), btScalar(0.177242), btScalar(-0.918787)),
184 			btVector3(btScalar(0.441848), btScalar(0.374386), btScalar(-0.814946)),
185 			btVector3(btScalar(0.492389), btScalar(0.582223), btScalar(-0.646693)),
186 			btVector3(btScalar(0.343498), btScalar(0.866080), btScalar(-0.362693)),
187 			btVector3(btScalar(0.362036), btScalar(0.745149), btScalar(-0.559639)),
188 			btVector3(btScalar(0.334131), btScalar(0.937044), btScalar(-0.099774)),
189 			btVector3(btScalar(0.486925), btScalar(0.871718), btScalar(0.052473)),
190 			btVector3(btScalar(0.452776), btScalar(0.845665), btScalar(0.281820)),
191 			btVector3(btScalar(0.399503), btScalar(0.771785), btScalar(0.494576)),
192 			btVector3(btScalar(0.296469), btScalar(0.673018), btScalar(0.677469)),
193 			btVector3(btScalar(0.392088), btScalar(0.479179), btScalar(0.785213)),
194 			btVector3(btScalar(0.452190), btScalar(0.252094), btScalar(0.855286)),
195 			btVector3(btScalar(0.478339), btScalar(0.013149), btScalar(0.877928)),
196 			btVector3(btScalar(0.481656), btScalar(-0.219380), btScalar(0.848259)),
197 			btVector3(btScalar(0.615327), btScalar(-0.494293), btScalar(0.613837)),
198 			btVector3(btScalar(0.594642), btScalar(-0.650414), btScalar(0.472325)),
199 			btVector3(btScalar(0.562249), btScalar(-0.771345), btScalar(0.297631)),
200 			btVector3(btScalar(0.467411), btScalar(-0.437133), btScalar(0.768231)),
201 			btVector3(btScalar(0.519513), btScalar(-0.847947), btScalar(0.103808)),
202 			btVector3(btScalar(0.297640), btScalar(-0.938159), btScalar(-0.176288)),
203 			btVector3(btScalar(0.446727), btScalar(-0.838615), btScalar(-0.311359)),
204 			btVector3(btScalar(0.331790), btScalar(-0.942437), btScalar(0.040762)),
205 			btVector3(btScalar(0.413358), btScalar(-0.748403), btScalar(-0.518259)),
206 			btVector3(btScalar(0.347596), btScalar(-0.621640), btScalar(-0.701737)),
207 			btVector3(btScalar(0.249831), btScalar(-0.456186), btScalar(-0.853984)),
208 			btVector3(btScalar(0.131772), btScalar(-0.262931), btScalar(-0.955678)),
209 			btVector3(btScalar(0.247099), btScalar(-0.042261), btScalar(-0.967975)),
210 			btVector3(btScalar(0.113624), btScalar(0.165965), btScalar(-0.979491)),
211 			btVector3(btScalar(0.217438), btScalar(0.374580), btScalar(-0.901220)),
212 			btVector3(btScalar(0.307983), btScalar(0.554615), btScalar(-0.772786)),
213 			btVector3(btScalar(0.166702), btScalar(0.953181), btScalar(-0.252021)),
214 			btVector3(btScalar(0.172751), btScalar(0.844499), btScalar(-0.506743)),
215 			btVector3(btScalar(0.177630), btScalar(0.711125), btScalar(-0.679876)),
216 			btVector3(btScalar(0.120064), btScalar(0.992260), btScalar(-0.030482)),
217 			btVector3(btScalar(0.289640), btScalar(0.949098), btScalar(0.122546)),
218 			btVector3(btScalar(0.239879), btScalar(0.909047), btScalar(0.340377)),
219 			btVector3(btScalar(0.181142), btScalar(0.821363), btScalar(0.540641)),
220 			btVector3(btScalar(0.066986), btScalar(0.719097), btScalar(0.691327)),
221 			btVector3(btScalar(0.156750), btScalar(0.545478), btScalar(0.823079)),
222 			btVector3(btScalar(0.236172), btScalar(0.342306), btScalar(0.909353)),
223 			btVector3(btScalar(0.277541), btScalar(0.112693), btScalar(0.953856)),
224 			btVector3(btScalar(0.295299), btScalar(-0.121974), btScalar(0.947415)),
225 			btVector3(btScalar(0.287883), btScalar(-0.349254), btScalar(0.891591)),
226 			btVector3(btScalar(0.437165), btScalar(-0.634666), btScalar(0.636869)),
227 			btVector3(btScalar(0.407113), btScalar(-0.784954), btScalar(0.466664)),
228 			btVector3(btScalar(0.375111), btScalar(-0.888193), btScalar(0.264839)),
229 			btVector3(btScalar(0.275394), btScalar(-0.560591), btScalar(0.780723)),
230 			btVector3(btScalar(0.122015), btScalar(-0.992209), btScalar(-0.024821)),
231 			btVector3(btScalar(0.087866), btScalar(-0.966156), btScalar(-0.241676)),
232 			btVector3(btScalar(0.239489), btScalar(-0.885665), btScalar(-0.397437)),
233 			btVector3(btScalar(0.167287), btScalar(-0.965184), btScalar(0.200817)),
234 			btVector3(btScalar(0.201632), btScalar(-0.776789), btScalar(-0.596335)),
235 			btVector3(btScalar(0.122015), btScalar(-0.637971), btScalar(-0.760098)),
236 			btVector3(btScalar(0.008054), btScalar(-0.464741), btScalar(-0.885214)),
237 			btVector3(btScalar(-0.116054), btScalar(-0.271096), btScalar(-0.955482)),
238 			btVector3(btScalar(-0.000727), btScalar(-0.056065), btScalar(-0.998424)),
239 			btVector3(btScalar(-0.134007), btScalar(0.152939), btScalar(-0.978905)),
240 			btVector3(btScalar(-0.025900), btScalar(0.366026), btScalar(-0.930108)),
241 			btVector3(btScalar(0.081231), btScalar(0.557337), btScalar(-0.826072)),
242 			btVector3(btScalar(-0.002874), btScalar(0.917213), btScalar(-0.398023)),
243 			btVector3(btScalar(-0.050683), btScalar(0.981761), btScalar(-0.182534)),
244 			btVector3(btScalar(-0.040536), btScalar(0.710153), btScalar(-0.702713)),
245 			btVector3(btScalar(-0.139081), btScalar(0.827973), btScalar(-0.543048)),
246 			btVector3(btScalar(-0.101029), btScalar(0.994010), btScalar(0.041152)),
247 			btVector3(btScalar(0.069328), btScalar(0.978067), btScalar(0.196133)),
248 			btVector3(btScalar(0.023860), btScalar(0.911380), btScalar(0.410645)),
249 			btVector3(btScalar(-0.153521), btScalar(0.736789), btScalar(0.658145)),
250 			btVector3(btScalar(-0.070002), btScalar(0.591750), btScalar(0.802780)),
251 			btVector3(btScalar(0.002590), btScalar(0.312948), btScalar(0.949562)),
252 			btVector3(btScalar(0.090988), btScalar(-0.020680), btScalar(0.995627)),
253 			btVector3(btScalar(0.088842), btScalar(-0.250099), btScalar(0.964006)),
254 			btVector3(btScalar(0.083378), btScalar(-0.470185), btScalar(0.878318)),
255 			btVector3(btScalar(0.240074), btScalar(-0.749764), btScalar(0.616374)),
256 			btVector3(btScalar(0.210803), btScalar(-0.885860), btScalar(0.412987)),
257 			btVector3(btScalar(0.077524), btScalar(-0.660524), btScalar(0.746565)),
258 			btVector3(btScalar(-0.096736), btScalar(-0.990070), btScalar(-0.100945)),
259 			btVector3(btScalar(-0.052634), btScalar(-0.990264), btScalar(0.127426)),
260 			btVector3(btScalar(-0.106102), btScalar(-0.938354), btScalar(-0.328340)),
261 			btVector3(btScalar(0.013323), btScalar(-0.863112), btScalar(-0.504596)),
262 			btVector3(btScalar(-0.002093), btScalar(-0.936993), btScalar(0.349161)),
263 			btVector3(btScalar(-0.106297), btScalar(-0.636610), btScalar(-0.763612)),
264 			btVector3(btScalar(-0.229430), btScalar(-0.463769), btScalar(-0.855546)),
265 			btVector3(btScalar(-0.245236), btScalar(-0.066175), btScalar(-0.966999)),
266 			btVector3(btScalar(-0.351587), btScalar(-0.270513), btScalar(-0.896145)),
267 			btVector3(btScalar(-0.370906), btScalar(0.133108), btScalar(-0.918982)),
268 			btVector3(btScalar(-0.264360), btScalar(0.346000), btScalar(-0.900049)),
269 			btVector3(btScalar(-0.151375), btScalar(0.543728), btScalar(-0.825291)),
270 			btVector3(btScalar(-0.218697), btScalar(0.912741), btScalar(-0.344346)),
271 			btVector3(btScalar(-0.274507), btScalar(0.953764), btScalar(-0.121635)),
272 			btVector3(btScalar(-0.259677), btScalar(0.692266), btScalar(-0.673044)),
273 			btVector3(btScalar(-0.350416), btScalar(0.798810), btScalar(-0.488786)),
274 			btVector3(btScalar(-0.320170), btScalar(0.941127), btScalar(0.108297)),
275 			btVector3(btScalar(-0.147667), btScalar(0.952792), btScalar(0.265034)),
276 			btVector3(btScalar(-0.188061), btScalar(0.860636), btScalar(0.472910)),
277 			btVector3(btScalar(-0.370906), btScalar(0.739900), btScalar(0.560941)),
278 			btVector3(btScalar(-0.297143), btScalar(0.585334), btScalar(0.754178)),
279 			btVector3(btScalar(-0.189622), btScalar(0.428241), btScalar(0.883393)),
280 			btVector3(btScalar(-0.091272), btScalar(0.098695), btScalar(0.990747)),
281 			btVector3(btScalar(-0.256945), btScalar(0.228375), btScalar(0.938827)),
282 			btVector3(btScalar(-0.111761), btScalar(-0.133251), btScalar(0.984696)),
283 			btVector3(btScalar(-0.118006), btScalar(-0.356253), btScalar(0.926725)),
284 			btVector3(btScalar(-0.119372), btScalar(-0.563896), btScalar(0.817029)),
285 			btVector3(btScalar(0.041228), btScalar(-0.833949), btScalar(0.550010)),
286 			btVector3(btScalar(-0.121909), btScalar(-0.736543), btScalar(0.665172)),
287 			btVector3(btScalar(-0.307681), btScalar(-0.931160), btScalar(-0.195026)),
288 			btVector3(btScalar(-0.283679), btScalar(-0.957990), btScalar(0.041348)),
289 			btVector3(btScalar(-0.227284), btScalar(-0.935243), btScalar(0.270890)),
290 			btVector3(btScalar(-0.293436), btScalar(-0.858252), btScalar(-0.420860)),
291 			btVector3(btScalar(-0.175767), btScalar(-0.780677), btScalar(-0.599262)),
292 			btVector3(btScalar(-0.170108), btScalar(-0.858835), btScalar(0.482865)),
293 			btVector3(btScalar(-0.332854), btScalar(-0.635055), btScalar(-0.696857)),
294 			btVector3(btScalar(-0.447791), btScalar(-0.445299), btScalar(-0.775128)),
295 			btVector3(btScalar(-0.470622), btScalar(-0.074146), btScalar(-0.879164)),
296 			btVector3(btScalar(-0.639417), btScalar(-0.340505), btScalar(-0.689049)),
297 			btVector3(btScalar(-0.598438), btScalar(0.104722), btScalar(-0.794256)),
298 			btVector3(btScalar(-0.488575), btScalar(0.307699), btScalar(-0.816313)),
299 			btVector3(btScalar(-0.379882), btScalar(0.513592), btScalar(-0.769077)),
300 			btVector3(btScalar(-0.425740), btScalar(0.862775), btScalar(-0.272516)),
301 			btVector3(btScalar(-0.480769), btScalar(0.875412), btScalar(-0.048439)),
302 			btVector3(btScalar(-0.467890), btScalar(0.648716), btScalar(-0.600043)),
303 			btVector3(btScalar(-0.543799), btScalar(0.730956), btScalar(-0.411881)),
304 			btVector3(btScalar(-0.516284), btScalar(0.838277), btScalar(0.174076)),
305 			btVector3(btScalar(-0.353343), btScalar(0.876384), btScalar(0.326519)),
306 			btVector3(btScalar(-0.572875), btScalar(0.614497), btScalar(0.542007)),
307 			btVector3(btScalar(-0.503600), btScalar(0.497261), btScalar(0.706161)),
308 			btVector3(btScalar(-0.530920), btScalar(0.754870), btScalar(0.384685)),
309 			btVector3(btScalar(-0.395884), btScalar(0.366414), btScalar(0.841818)),
310 			btVector3(btScalar(-0.300656), btScalar(0.001678), btScalar(0.953661)),
311 			btVector3(btScalar(-0.461060), btScalar(0.146912), btScalar(0.875000)),
312 			btVector3(btScalar(-0.315486), btScalar(-0.232212), btScalar(0.919893)),
313 			btVector3(btScalar(-0.323682), btScalar(-0.449187), btScalar(0.832644)),
314 			btVector3(btScalar(-0.318999), btScalar(-0.639527), btScalar(0.699134)),
315 			btVector3(btScalar(-0.496771), btScalar(-0.866029), btScalar(-0.055271)),
316 			btVector3(btScalar(-0.496771), btScalar(-0.816257), btScalar(-0.294377)),
317 			btVector3(btScalar(-0.456377), btScalar(-0.869528), btScalar(0.188130)),
318 			btVector3(btScalar(-0.380858), btScalar(-0.827144), btScalar(0.412792)),
319 			btVector3(btScalar(-0.449352), btScalar(-0.727405), btScalar(-0.518259)),
320 			btVector3(btScalar(-0.570533), btScalar(-0.551064), btScalar(-0.608632)),
321 			btVector3(btScalar(-0.656394), btScalar(-0.118280), btScalar(-0.744874)),
322 			btVector3(btScalar(-0.756696), btScalar(-0.438105), btScalar(-0.484882)),
323 			btVector3(btScalar(-0.801773), btScalar(-0.204798), btScalar(-0.561005)),
324 			btVector3(btScalar(-0.785186), btScalar(0.038618), btScalar(-0.617805)),
325 			btVector3(btScalar(-0.709082), btScalar(0.262399), btScalar(-0.654306)),
326 			btVector3(btScalar(-0.583412), btScalar(0.462265), btScalar(-0.667383)),
327 			btVector3(btScalar(-0.616001), btScalar(0.761286), btScalar(-0.201272)),
328 			btVector3(btScalar(-0.660687), btScalar(0.750204), btScalar(0.020072)),
329 			btVector3(btScalar(-0.744987), btScalar(0.435823), btScalar(-0.504791)),
330 			btVector3(btScalar(-0.713765), btScalar(0.605554), btScalar(-0.351373)),
331 			btVector3(btScalar(-0.686251), btScalar(0.687600), btScalar(0.236927)),
332 			btVector3(btScalar(-0.680201), btScalar(0.429407), btScalar(0.593732)),
333 			btVector3(btScalar(-0.733474), btScalar(0.546450), btScalar(0.403814)),
334 			btVector3(btScalar(-0.591023), btScalar(0.292923), btScalar(0.751445)),
335 			btVector3(btScalar(-0.500283), btScalar(-0.080757), btScalar(0.861922)),
336 			btVector3(btScalar(-0.643710), btScalar(0.070115), btScalar(0.761985)),
337 			btVector3(btScalar(-0.506332), btScalar(-0.308425), btScalar(0.805122)),
338 			btVector3(btScalar(-0.503015), btScalar(-0.509847), btScalar(0.697573)),
339 			btVector3(btScalar(-0.482525), btScalar(-0.682105), btScalar(0.549229)),
340 			btVector3(btScalar(-0.680396), btScalar(-0.716323), btScalar(-0.153451)),
341 			btVector3(btScalar(-0.658346), btScalar(-0.746264), btScalar(0.097562)),
342 			btVector3(btScalar(-0.653272), btScalar(-0.646915), btScalar(-0.392948)),
343 			btVector3(btScalar(-0.590828), btScalar(-0.732655), btScalar(0.337645)),
344 			btVector3(btScalar(-0.819140), btScalar(-0.518013), btScalar(-0.246166)),
345 			btVector3(btScalar(-0.900513), btScalar(-0.282178), btScalar(-0.330487)),
346 			btVector3(btScalar(-0.914953), btScalar(-0.028652), btScalar(-0.402122)),
347 			btVector3(btScalar(-0.859924), btScalar(0.220209), btScalar(-0.459898)),
348 			btVector3(btScalar(-0.777185), btScalar(0.613720), btScalar(-0.137836)),
349 			btVector3(btScalar(-0.805285), btScalar(0.586889), btScalar(0.082728)),
350 			btVector3(btScalar(-0.872413), btScalar(0.406077), btScalar(-0.271735)),
351 			btVector3(btScalar(-0.859339), btScalar(0.448072), btScalar(0.246101)),
352 			btVector3(btScalar(-0.757671), btScalar(0.216320), btScalar(0.615594)),
353 			btVector3(btScalar(-0.826165), btScalar(0.348139), btScalar(0.442851)),
354 			btVector3(btScalar(-0.671810), btScalar(-0.162803), btScalar(0.722557)),
355 			btVector3(btScalar(-0.796504), btScalar(-0.004543), btScalar(0.604468)),
356 			btVector3(btScalar(-0.676298), btScalar(-0.378223), btScalar(0.631794)),
357 			btVector3(btScalar(-0.668883), btScalar(-0.558258), btScalar(0.490673)),
358 			btVector3(btScalar(-0.821287), btScalar(-0.570118), btScalar(0.006994)),
359 			btVector3(btScalar(-0.767428), btScalar(-0.587810), btScalar(0.255470)),
360 			btVector3(btScalar(-0.933296), btScalar(-0.349837), btScalar(-0.079865)),
361 			btVector3(btScalar(-0.982667), btScalar(-0.100393), btScalar(-0.155208)),
362 			btVector3(btScalar(-0.961396), btScalar(0.160910), btScalar(-0.222938)),
363 			btVector3(btScalar(-0.934858), btScalar(0.354555), btScalar(-0.006864)),
364 			btVector3(btScalar(-0.941687), btScalar(0.229736), btScalar(0.245711)),
365 			btVector3(btScalar(-0.884317), btScalar(0.131552), btScalar(0.447536)),
366 			btVector3(btScalar(-0.810359), btScalar(-0.219769), btScalar(0.542788)),
367 			btVector3(btScalar(-0.915929), btScalar(-0.210048), btScalar(0.341743)),
368 			btVector3(btScalar(-0.816799), btScalar(-0.407192), btScalar(0.408303)),
369 			btVector3(btScalar(-0.903050), btScalar(-0.392416), btScalar(0.174076)),
370 			btVector3(btScalar(-0.980325), btScalar(-0.170969), btScalar(0.096586)),
371 			btVector3(btScalar(-0.995936), btScalar(0.084891), btScalar(0.029441)),
372 			btVector3(btScalar(-0.960031), btScalar(0.002650), btScalar(0.279283)),
373 		};
374 	static btVector3 sUnitSpherePoints[NUM_UNITSPHERE_POINTS + MAX_PREFERRED_PENETRATION_DIRECTIONS * 2] =
375 		{
376 			btVector3(btScalar(0.000000), btScalar(-0.000000), btScalar(-1.000000)),
377 			btVector3(btScalar(0.723608), btScalar(-0.525725), btScalar(-0.447219)),
378 			btVector3(btScalar(-0.276388), btScalar(-0.850649), btScalar(-0.447219)),
379 			btVector3(btScalar(-0.894426), btScalar(-0.000000), btScalar(-0.447216)),
380 			btVector3(btScalar(-0.276388), btScalar(0.850649), btScalar(-0.447220)),
381 			btVector3(btScalar(0.723608), btScalar(0.525725), btScalar(-0.447219)),
382 			btVector3(btScalar(0.276388), btScalar(-0.850649), btScalar(0.447220)),
383 			btVector3(btScalar(-0.723608), btScalar(-0.525725), btScalar(0.447219)),
384 			btVector3(btScalar(-0.723608), btScalar(0.525725), btScalar(0.447219)),
385 			btVector3(btScalar(0.276388), btScalar(0.850649), btScalar(0.447219)),
386 			btVector3(btScalar(0.894426), btScalar(0.000000), btScalar(0.447216)),
387 			btVector3(btScalar(-0.000000), btScalar(0.000000), btScalar(1.000000)),
388 			btVector3(btScalar(0.425323), btScalar(-0.309011), btScalar(-0.850654)),
389 			btVector3(btScalar(-0.162456), btScalar(-0.499995), btScalar(-0.850654)),
390 			btVector3(btScalar(0.262869), btScalar(-0.809012), btScalar(-0.525738)),
391 			btVector3(btScalar(0.425323), btScalar(0.309011), btScalar(-0.850654)),
392 			btVector3(btScalar(0.850648), btScalar(-0.000000), btScalar(-0.525736)),
393 			btVector3(btScalar(-0.525730), btScalar(-0.000000), btScalar(-0.850652)),
394 			btVector3(btScalar(-0.688190), btScalar(-0.499997), btScalar(-0.525736)),
395 			btVector3(btScalar(-0.162456), btScalar(0.499995), btScalar(-0.850654)),
396 			btVector3(btScalar(-0.688190), btScalar(0.499997), btScalar(-0.525736)),
397 			btVector3(btScalar(0.262869), btScalar(0.809012), btScalar(-0.525738)),
398 			btVector3(btScalar(0.951058), btScalar(0.309013), btScalar(0.000000)),
399 			btVector3(btScalar(0.951058), btScalar(-0.309013), btScalar(0.000000)),
400 			btVector3(btScalar(0.587786), btScalar(-0.809017), btScalar(0.000000)),
401 			btVector3(btScalar(0.000000), btScalar(-1.000000), btScalar(0.000000)),
402 			btVector3(btScalar(-0.587786), btScalar(-0.809017), btScalar(0.000000)),
403 			btVector3(btScalar(-0.951058), btScalar(-0.309013), btScalar(-0.000000)),
404 			btVector3(btScalar(-0.951058), btScalar(0.309013), btScalar(-0.000000)),
405 			btVector3(btScalar(-0.587786), btScalar(0.809017), btScalar(-0.000000)),
406 			btVector3(btScalar(-0.000000), btScalar(1.000000), btScalar(-0.000000)),
407 			btVector3(btScalar(0.587786), btScalar(0.809017), btScalar(-0.000000)),
408 			btVector3(btScalar(0.688190), btScalar(-0.499997), btScalar(0.525736)),
409 			btVector3(btScalar(-0.262869), btScalar(-0.809012), btScalar(0.525738)),
410 			btVector3(btScalar(-0.850648), btScalar(0.000000), btScalar(0.525736)),
411 			btVector3(btScalar(-0.262869), btScalar(0.809012), btScalar(0.525738)),
412 			btVector3(btScalar(0.688190), btScalar(0.499997), btScalar(0.525736)),
413 			btVector3(btScalar(0.525730), btScalar(0.000000), btScalar(0.850652)),
414 			btVector3(btScalar(0.162456), btScalar(-0.499995), btScalar(0.850654)),
415 			btVector3(btScalar(-0.425323), btScalar(-0.309011), btScalar(0.850654)),
416 			btVector3(btScalar(-0.425323), btScalar(0.309011), btScalar(0.850654)),
417 			btVector3(btScalar(0.162456), btScalar(0.499995), btScalar(0.850654))};
418 	if (highres)
419 		return sUnitSpherePointsHighres;
420 	return sUnitSpherePoints;
421 }
422