• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
19 #include "btShapeHull.h"
20 #include "LinearMath/btConvexHull.h"
21 
22 #define NUM_UNITSPHERE_POINTS 42
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 
38 bool
buildHull(btScalar)39 btShapeHull::buildHull (btScalar /*margin*/)
40 {
41 	int numSampleDirections = NUM_UNITSPHERE_POINTS;
42 	{
43 		int numPDA = m_shape->getNumPreferredPenetrationDirections();
44 		if (numPDA)
45 		{
46 			for (int i=0;i<numPDA;i++)
47 			{
48 				btVector3 norm;
49 				m_shape->getPreferredPenetrationDirection(i,norm);
50 				getUnitSpherePoints()[numSampleDirections] = norm;
51 				numSampleDirections++;
52 			}
53 		}
54 	}
55 
56 	btVector3 supportPoints[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2];
57 	int i;
58 	for (i = 0; i < numSampleDirections; i++)
59 	{
60 		supportPoints[i] = m_shape->localGetSupportingVertex(getUnitSpherePoints()[i]);
61 	}
62 
63 	HullDesc hd;
64 	hd.mFlags = QF_TRIANGLES;
65 	hd.mVcount = static_cast<unsigned int>(numSampleDirections);
66 
67 #ifdef BT_USE_DOUBLE_PRECISION
68 	hd.mVertices = &supportPoints[0];
69 	hd.mVertexStride = sizeof(btVector3);
70 #else
71 	hd.mVertices = &supportPoints[0];
72 	hd.mVertexStride = sizeof (btVector3);
73 #endif
74 
75 	HullLibrary hl;
76 	HullResult hr;
77 	if (hl.CreateConvexHull (hd, hr) == QE_FAIL)
78 	{
79 		return false;
80 	}
81 
82 	m_vertices.resize (static_cast<int>(hr.mNumOutputVertices));
83 
84 
85 	for (i = 0; i < static_cast<int>(hr.mNumOutputVertices); i++)
86 	{
87 		m_vertices[i] = hr.m_OutputVertices[i];
88 	}
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++)
92 	{
93 		m_indices[i] = hr.m_Indices[i];
94 	}
95 
96 	// free temporary hull result that we just copied
97 	hl.ReleaseResult (hr);
98 
99 	return true;
100 }
101 
102 int
numTriangles() const103 btShapeHull::numTriangles () const
104 {
105 	return static_cast<int>(m_numIndices / 3);
106 }
107 
108 int
numVertices() const109 btShapeHull::numVertices () const
110 {
111 	return m_vertices.size ();
112 }
113 
114 int
numIndices() const115 btShapeHull::numIndices () const
116 {
117 	return static_cast<int>(m_numIndices);
118 }
119 
120 
getUnitSpherePoints()121 btVector3* btShapeHull::getUnitSpherePoints()
122 {
123 	static btVector3 sUnitSpherePoints[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] =
124 	{
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))
167 	};
168 	return sUnitSpherePoints;
169 }
170 
171