2
Bullet Continuous Collision Detection and Physics Library
3
Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
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:
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.
16
//btShapeHull was implemented by John McCutchan.
19
#include "btShapeHull.h"
20
#include "LinearMath/btConvexHull.h"
22
#define NUM_UNITSPHERE_POINTS 42
24
btShapeHull::btShapeHull (const btConvexShape* shape)
32
btShapeHull::~btShapeHull ()
39
btShapeHull::buildHull (btScalar /*margin*/)
41
int numSampleDirections = NUM_UNITSPHERE_POINTS;
43
int numPDA = m_shape->getNumPreferredPenetrationDirections();
46
for (int i=0;i<numPDA;i++)
49
m_shape->getPreferredPenetrationDirection(i,norm);
50
getUnitSpherePoints()[numSampleDirections] = norm;
51
numSampleDirections++;
56
btVector3 supportPoints[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2];
58
for (i = 0; i < numSampleDirections; i++)
60
supportPoints[i] = m_shape->localGetSupportingVertex(getUnitSpherePoints()[i]);
64
hd.mFlags = QF_TRIANGLES;
65
hd.mVcount = static_cast<unsigned int>(numSampleDirections);
67
#ifdef BT_USE_DOUBLE_PRECISION
68
hd.mVertices = &supportPoints[0];
69
hd.mVertexStride = sizeof(btVector3);
71
hd.mVertices = &supportPoints[0];
72
hd.mVertexStride = sizeof (btVector3);
77
if (hl.CreateConvexHull (hd, hr) == QE_FAIL)
82
m_vertices.resize (static_cast<int>(hr.mNumOutputVertices));
85
for (i = 0; i < static_cast<int>(hr.mNumOutputVertices); i++)
87
m_vertices[i] = hr.m_OutputVertices[i];
89
m_numIndices = hr.mNumIndices;
90
m_indices.resize(static_cast<int>(m_numIndices));
91
for (i = 0; i < static_cast<int>(m_numIndices); i++)
93
m_indices[i] = hr.m_Indices[i];
96
// free temporary hull result that we just copied
97
hl.ReleaseResult (hr);
103
btShapeHull::numTriangles () const
105
return static_cast<int>(m_numIndices / 3);
109
btShapeHull::numVertices () const
111
return m_vertices.size ();
115
btShapeHull::numIndices () const
117
return static_cast<int>(m_numIndices);
121
btVector3* btShapeHull::getUnitSpherePoints()
123
static btVector3 sUnitSpherePoints[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] =
125
btVector3(btScalar(0.000000) , btScalar(-0.000000),btScalar(-1.000000)),
126
btVector3(btScalar(0.723608) , btScalar(-0.525725),btScalar(-0.447219)),
127
btVector3(btScalar(-0.276388) , btScalar(-0.850649),btScalar(-0.447219)),
128
btVector3(btScalar(-0.894426) , btScalar(-0.000000),btScalar(-0.447216)),
129
btVector3(btScalar(-0.276388) , btScalar(0.850649),btScalar(-0.447220)),
130
btVector3(btScalar(0.723608) , btScalar(0.525725),btScalar(-0.447219)),
131
btVector3(btScalar(0.276388) , btScalar(-0.850649),btScalar(0.447220)),
132
btVector3(btScalar(-0.723608) , btScalar(-0.525725),btScalar(0.447219)),
133
btVector3(btScalar(-0.723608) , btScalar(0.525725),btScalar(0.447219)),
134
btVector3(btScalar(0.276388) , btScalar(0.850649),btScalar(0.447219)),
135
btVector3(btScalar(0.894426) , btScalar(0.000000),btScalar(0.447216)),
136
btVector3(btScalar(-0.000000) , btScalar(0.000000),btScalar(1.000000)),
137
btVector3(btScalar(0.425323) , btScalar(-0.309011),btScalar(-0.850654)),
138
btVector3(btScalar(-0.162456) , btScalar(-0.499995),btScalar(-0.850654)),
139
btVector3(btScalar(0.262869) , btScalar(-0.809012),btScalar(-0.525738)),
140
btVector3(btScalar(0.425323) , btScalar(0.309011),btScalar(-0.850654)),
141
btVector3(btScalar(0.850648) , btScalar(-0.000000),btScalar(-0.525736)),
142
btVector3(btScalar(-0.525730) , btScalar(-0.000000),btScalar(-0.850652)),
143
btVector3(btScalar(-0.688190) , btScalar(-0.499997),btScalar(-0.525736)),
144
btVector3(btScalar(-0.162456) , btScalar(0.499995),btScalar(-0.850654)),
145
btVector3(btScalar(-0.688190) , btScalar(0.499997),btScalar(-0.525736)),
146
btVector3(btScalar(0.262869) , btScalar(0.809012),btScalar(-0.525738)),
147
btVector3(btScalar(0.951058) , btScalar(0.309013),btScalar(0.000000)),
148
btVector3(btScalar(0.951058) , btScalar(-0.309013),btScalar(0.000000)),
149
btVector3(btScalar(0.587786) , btScalar(-0.809017),btScalar(0.000000)),
150
btVector3(btScalar(0.000000) , btScalar(-1.000000),btScalar(0.000000)),
151
btVector3(btScalar(-0.587786) , btScalar(-0.809017),btScalar(0.000000)),
152
btVector3(btScalar(-0.951058) , btScalar(-0.309013),btScalar(-0.000000)),
153
btVector3(btScalar(-0.951058) , btScalar(0.309013),btScalar(-0.000000)),
154
btVector3(btScalar(-0.587786) , btScalar(0.809017),btScalar(-0.000000)),
155
btVector3(btScalar(-0.000000) , btScalar(1.000000),btScalar(-0.000000)),
156
btVector3(btScalar(0.587786) , btScalar(0.809017),btScalar(-0.000000)),
157
btVector3(btScalar(0.688190) , btScalar(-0.499997),btScalar(0.525736)),
158
btVector3(btScalar(-0.262869) , btScalar(-0.809012),btScalar(0.525738)),
159
btVector3(btScalar(-0.850648) , btScalar(0.000000),btScalar(0.525736)),
160
btVector3(btScalar(-0.262869) , btScalar(0.809012),btScalar(0.525738)),
161
btVector3(btScalar(0.688190) , btScalar(0.499997),btScalar(0.525736)),
162
btVector3(btScalar(0.525730) , btScalar(0.000000),btScalar(0.850652)),
163
btVector3(btScalar(0.162456) , btScalar(-0.499995),btScalar(0.850654)),
164
btVector3(btScalar(-0.425323) , btScalar(-0.309011),btScalar(0.850654)),
165
btVector3(btScalar(-0.425323) , btScalar(0.309011),btScalar(0.850654)),
166
btVector3(btScalar(0.162456) , btScalar(0.499995),btScalar(0.850654))
168
return sUnitSpherePoints;