15 #if defined (_WIN32) || defined (__i386__) 16 #define BT_USE_SSE_IN_API 76 if (shiftVerticesByMargin)
82 for (
int p=0;p<planeEquations.
size();p++)
101 #ifndef BT_RECONSTRUCT_FACES 105 for (
int p=0;p<numVertices;p++)
111 for (
int j = 0; j < conv.
faces.
size(); j++)
129 edges[numEdges++] = newEdge;
156 combinedFace.
m_plane[0] = faceNormal.getX();
157 combinedFace.
m_plane[1] = faceNormal.getY();
158 combinedFace.
m_plane[2] = faceNormal.getZ();
159 combinedFace.
m_plane[3] = -planeEq;
165 #else//BT_RECONSTRUCT_FACES 169 faceNormals.
resize(numFaces);
174 tmpFaces.
resize(numFaces);
178 for (
int p=0;p<numVertices;p++)
184 for (
int i=0;i<numFaces;i++)
186 int face = convexUtil->
faces[i];
207 edges[numEdges++] = newEdge;
210 }
while (edge!=firstEdge);
217 faceNormals[i] = edges[0].
cross(edges[1]);
218 faceNormals[i].normalize();
219 tmpFaces[i].m_plane[0] = faceNormals[i].getX();
220 tmpFaces[i].m_plane[1] = faceNormals[i].getY();
221 tmpFaces[i].m_plane[2] = faceNormals[i].getZ();
222 tmpFaces[i].m_plane[3] = planeEq;
228 faceNormals[i].setZero();
231 for (
int v=0;v<tmpFaces[i].m_indices.
size();v++)
239 tmpFaces[i].m_plane[3] = -planeEq;
246 for (
int i=0;i<tmpFaces.
size();i++)
249 while (todoFaces.
size())
252 int refFace = todoFaces[todoFaces.
size()-1];
255 btFace& faceA = tmpFaces[refFace];
259 for (
int j=todoFaces.
size()-1;j>=0;j--)
261 int i = todoFaces[j];
262 btFace& faceB = tmpFaces[i];
264 if (faceNormalA.
dot(faceNormalB)>faceWeldThreshold)
272 bool did_merge =
false;
273 if (coplanarFaceGroup.
size()>1)
280 for (
int i=0;i<coplanarFaceGroup.
size();i++)
284 btFace& face = tmpFaces[coplanarFaceGroup[i]];
286 averageFaceNormal+=faceNormal;
294 for (
int i=0;i<orgpoints.
size();i++)
297 if (orgpoints[i].m_orgIndex == orgIndex)
311 for (
int i=0;i<4;i++)
312 combinedFace.
m_plane[i] = tmpFaces[coplanarFaceGroup[0]].m_plane[i];
319 for (
int i=0;i<hull.size();i++)
322 for(
int k = 0; k < orgpoints.
size(); k++)
324 if(orgpoints[k].m_orgIndex == hull[i].m_orgIndex)
326 orgpoints[k].m_orgIndex = -1;
333 bool reject_merge =
false;
337 for(
int i = 0; i < orgpoints.
size(); i++) {
338 if(orgpoints[i].m_orgIndex == -1)
341 for(
int j = 0; j < tmpFaces.
size(); j++) {
343 btFace& face = tmpFaces[j];
345 bool is_in_current_group =
false;
346 for(
int k = 0; k < coplanarFaceGroup.
size(); k++) {
347 if(coplanarFaceGroup[k] == j) {
348 is_in_current_group =
true;
352 if(is_in_current_group)
356 if(face.
m_indices[v] == orgpoints[i].m_orgIndex) {
378 for (
int i=0;i<coplanarFaceGroup.
size();i++)
380 btFace face = tmpFaces[coplanarFaceGroup[i]];
390 #endif //BT_RECONSTRUCT_FACES 398 #define MIN(_a, _b) ((_a) < (_b) ? (_a) : (_b)) 428 for( i = 0; i < inner_count; i++ )
430 i = (int) vec.
maxDot( temp, inner_count, newDot);
452 for (i=0;i<numVectors;i++)
457 for (
int j=0;j<numVectors;j++)
465 for( i = 0; i < inner_count; i++ )
467 i = (int) vec.
maxDot( temp, inner_count, newDot);
468 if (newDot > supportVerticesOut[j][3])
470 supportVerticesOut[j] = temp[i];
471 supportVerticesOut[j][3] = newDot;
491 getAabb(ident,aabbMin,aabbMax);
502 inertia = scaledmass * (
btVector3(y2+z2,x2+z2,x2+y2));
516 m_localAabbMin(1,1,1),
517 m_localAabbMax(-1,-1,-1),
518 m_isLocalAabbValid(false)
554 for (
int i = 0; i < 3; ++i )
562 for (
int i=0;i<3;i++)
btAlignedObjectArray< btVector3 > m_vertices
void push_back(const T &_Val)
const Edge * getNextEdgeOfFace() const
void getAabb(const btTransform &t, btVector3 &aabbMin, btVector3 &aabbMax) const
getAabb's default implementation is brute force, expected derived classes to implement a fast dedicat...
btScalar m_collisionMargin
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
void getNonvirtualAabb(const btTransform &trans, btVector3 &aabbMin, btVector3 &aabbMax, btScalar margin) const
btAlignedObjectArray< Edge > edges
int getTargetVertex() const
The btConvexInternalShape is an internal base class, shared by most convex shape implementations.
virtual void setLocalScaling(const btVector3 &scaling)
btScalar btSqrt(btScalar y)
virtual void getVertex(int i, btVector3 &vtx) const =0
long maxDot(const btVector3 *array, long array_count, btScalar &dotOut) const
returns index of maximum dot product between this and vectors in array[]
int getSourceVertex() const
virtual ~btPolyhedralConvexShape()
Convex hull implementation based on Preparata and Hong See http://code.google.com/p/bullet/issues/det...
btScalar dot(const btVector3 &v) const
Return the dot product.
virtual btScalar getMargin() const
btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
const btScalar & x() const
Return the x value.
btAlignedObjectArray< int > m_indices
int size() const
return the number of elements in the array
btAlignedObjectArray< btFace > m_faces
virtual void getAabb(const btTransform &t, btVector3 &aabbMin, btVector3 &aabbMax) const
getAabb's default implementation is brute force, expected derived classes to implement a fast dedicat...
virtual bool initializePolyhedralFeatures(int shiftVerticesByMargin=0)
optional method mainly used to generate multiple contact points by clipping polyhedral features (face...
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
#define btAlignedFree(ptr)
The btPolyhedralConvexShape is an internal interface class for polyhedral convex shapes.
virtual ~btConvexPolyhedron()
virtual int getNumVertices() const =0
static void getPlaneEquationsFromVertices(btAlignedObjectArray< btVector3 > &vertices, btAlignedObjectArray< btVector3 > &planeEquationsOut)
const btScalar & y() const
Return the y value.
virtual btVector3 localGetSupportingVertex(const btVector3 &vec) const
btPolyhedralConvexAabbCachingShape()
btPolyhedralConvexShape()
btVector3 can be used to represent 3D points and vectors.
btScalar length2() const
Return the length of the vector squared.
btAlignedObjectArray< btVector3 > vertices
void remove(const T &key)
void resize(int newsize, const T &fillData=T())
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3 *vectors, btVector3 *supportVerticesOut, int numVectors) const
virtual void calculateLocalInertia(btScalar mass, btVector3 &inertia) const
T & expand(const T &fillValue=T())
btConvexPolyhedron * m_polyhedron
void GrahamScanConvexHull2D(btAlignedObjectArray< GrahamVector3 > &originalPoints, btAlignedObjectArray< GrahamVector3 > &hull, const btVector3 &normalAxis)
#define btAlignedAlloc(size, alignment)
virtual void setLocalScaling(const btVector3 &scaling)
btScalar compute(const void *coords, bool doubleCoords, int stride, int count, btScalar shrink, btScalar shrinkClamp)
static void getVerticesFromPlaneEquations(const btAlignedObjectArray< btVector3 > &planeEquations, btAlignedObjectArray< btVector3 > &verticesOut)
btAlignedObjectArray< int > faces
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3 &vec) const
virtual void setPolyhedralFeatures(btConvexPolyhedron &polyhedron)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
const btScalar & z() const
Return the z value.