00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "btShapeHull.h"
00020 #include "LinearMath/btConvexHull.h"
00021
00022 #define NUM_UNITSPHERE_POINTS 42
00023
00024 btShapeHull::btShapeHull (const btConvexShape* shape)
00025 {
00026 m_shape = shape;
00027 m_vertices.clear ();
00028 m_indices.clear();
00029 m_numIndices = 0;
00030 }
00031
00032 btShapeHull::~btShapeHull ()
00033 {
00034 m_indices.clear();
00035 m_vertices.clear ();
00036 }
00037
00038 bool
00039 btShapeHull::buildHull (btScalar )
00040 {
00041 int numSampleDirections = NUM_UNITSPHERE_POINTS;
00042 {
00043 int numPDA = m_shape->getNumPreferredPenetrationDirections();
00044 if (numPDA)
00045 {
00046 for (int i=0;i<numPDA;i++)
00047 {
00048 btVector3 norm;
00049 m_shape->getPreferredPenetrationDirection(i,norm);
00050 getUnitSpherePoints()[numSampleDirections] = norm;
00051 numSampleDirections++;
00052 }
00053 }
00054 }
00055
00056 btVector3 supportPoints[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2];
00057 int i;
00058 for (i = 0; i < numSampleDirections; i++)
00059 {
00060 supportPoints[i] = m_shape->localGetSupportingVertex(getUnitSpherePoints()[i]);
00061 }
00062
00063 HullDesc hd;
00064 hd.mFlags = QF_TRIANGLES;
00065 hd.mVcount = static_cast<unsigned int>(numSampleDirections);
00066
00067 #ifdef BT_USE_DOUBLE_PRECISION
00068 hd.mVertices = &supportPoints[0];
00069 hd.mVertexStride = sizeof(btVector3);
00070 #else
00071 hd.mVertices = &supportPoints[0];
00072 hd.mVertexStride = sizeof (btVector3);
00073 #endif
00074
00075 HullLibrary hl;
00076 HullResult hr;
00077 if (hl.CreateConvexHull (hd, hr) == QE_FAIL)
00078 {
00079 return false;
00080 }
00081
00082 m_vertices.resize (static_cast<int>(hr.mNumOutputVertices));
00083
00084
00085 for (i = 0; i < static_cast<int>(hr.mNumOutputVertices); i++)
00086 {
00087 m_vertices[i] = hr.m_OutputVertices[i];
00088 }
00089 m_numIndices = hr.mNumIndices;
00090 m_indices.resize(static_cast<int>(m_numIndices));
00091 for (i = 0; i < static_cast<int>(m_numIndices); i++)
00092 {
00093 m_indices[i] = hr.m_Indices[i];
00094 }
00095
00096
00097 hl.ReleaseResult (hr);
00098
00099 return true;
00100 }
00101
00102 int
00103 btShapeHull::numTriangles () const
00104 {
00105 return static_cast<int>(m_numIndices / 3);
00106 }
00107
00108 int
00109 btShapeHull::numVertices () const
00110 {
00111 return m_vertices.size ();
00112 }
00113
00114 int
00115 btShapeHull::numIndices () const
00116 {
00117 return static_cast<int>(m_numIndices);
00118 }
00119
00120
00121 btVector3* btShapeHull::getUnitSpherePoints()
00122 {
00123 static btVector3 sUnitSpherePoints[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] =
00124 {
00125 btVector3(btScalar(0.000000) , btScalar(-0.000000),btScalar(-1.000000)),
00126 btVector3(btScalar(0.723608) , btScalar(-0.525725),btScalar(-0.447219)),
00127 btVector3(btScalar(-0.276388) , btScalar(-0.850649),btScalar(-0.447219)),
00128 btVector3(btScalar(-0.894426) , btScalar(-0.000000),btScalar(-0.447216)),
00129 btVector3(btScalar(-0.276388) , btScalar(0.850649),btScalar(-0.447220)),
00130 btVector3(btScalar(0.723608) , btScalar(0.525725),btScalar(-0.447219)),
00131 btVector3(btScalar(0.276388) , btScalar(-0.850649),btScalar(0.447220)),
00132 btVector3(btScalar(-0.723608) , btScalar(-0.525725),btScalar(0.447219)),
00133 btVector3(btScalar(-0.723608) , btScalar(0.525725),btScalar(0.447219)),
00134 btVector3(btScalar(0.276388) , btScalar(0.850649),btScalar(0.447219)),
00135 btVector3(btScalar(0.894426) , btScalar(0.000000),btScalar(0.447216)),
00136 btVector3(btScalar(-0.000000) , btScalar(0.000000),btScalar(1.000000)),
00137 btVector3(btScalar(0.425323) , btScalar(-0.309011),btScalar(-0.850654)),
00138 btVector3(btScalar(-0.162456) , btScalar(-0.499995),btScalar(-0.850654)),
00139 btVector3(btScalar(0.262869) , btScalar(-0.809012),btScalar(-0.525738)),
00140 btVector3(btScalar(0.425323) , btScalar(0.309011),btScalar(-0.850654)),
00141 btVector3(btScalar(0.850648) , btScalar(-0.000000),btScalar(-0.525736)),
00142 btVector3(btScalar(-0.525730) , btScalar(-0.000000),btScalar(-0.850652)),
00143 btVector3(btScalar(-0.688190) , btScalar(-0.499997),btScalar(-0.525736)),
00144 btVector3(btScalar(-0.162456) , btScalar(0.499995),btScalar(-0.850654)),
00145 btVector3(btScalar(-0.688190) , btScalar(0.499997),btScalar(-0.525736)),
00146 btVector3(btScalar(0.262869) , btScalar(0.809012),btScalar(-0.525738)),
00147 btVector3(btScalar(0.951058) , btScalar(0.309013),btScalar(0.000000)),
00148 btVector3(btScalar(0.951058) , btScalar(-0.309013),btScalar(0.000000)),
00149 btVector3(btScalar(0.587786) , btScalar(-0.809017),btScalar(0.000000)),
00150 btVector3(btScalar(0.000000) , btScalar(-1.000000),btScalar(0.000000)),
00151 btVector3(btScalar(-0.587786) , btScalar(-0.809017),btScalar(0.000000)),
00152 btVector3(btScalar(-0.951058) , btScalar(-0.309013),btScalar(-0.000000)),
00153 btVector3(btScalar(-0.951058) , btScalar(0.309013),btScalar(-0.000000)),
00154 btVector3(btScalar(-0.587786) , btScalar(0.809017),btScalar(-0.000000)),
00155 btVector3(btScalar(-0.000000) , btScalar(1.000000),btScalar(-0.000000)),
00156 btVector3(btScalar(0.587786) , btScalar(0.809017),btScalar(-0.000000)),
00157 btVector3(btScalar(0.688190) , btScalar(-0.499997),btScalar(0.525736)),
00158 btVector3(btScalar(-0.262869) , btScalar(-0.809012),btScalar(0.525738)),
00159 btVector3(btScalar(-0.850648) , btScalar(0.000000),btScalar(0.525736)),
00160 btVector3(btScalar(-0.262869) , btScalar(0.809012),btScalar(0.525738)),
00161 btVector3(btScalar(0.688190) , btScalar(0.499997),btScalar(0.525736)),
00162 btVector3(btScalar(0.525730) , btScalar(0.000000),btScalar(0.850652)),
00163 btVector3(btScalar(0.162456) , btScalar(-0.499995),btScalar(0.850654)),
00164 btVector3(btScalar(-0.425323) , btScalar(-0.309011),btScalar(0.850654)),
00165 btVector3(btScalar(-0.425323) , btScalar(0.309011),btScalar(0.850654)),
00166 btVector3(btScalar(0.162456) , btScalar(0.499995),btScalar(0.850654))
00167 };
00168 return sUnitSpherePoints;
00169 }
00170