16 #if defined(_WIN32) || defined(__i386__)
17 #define BT_USE_SSE_IN_API
30 #if defined(__CELLOS_LV2__) && defined(__SPU__)
31 #include <spu_intrinsics.h>
32 static inline vec_float4 vec_dot3(vec_float4 vec0, vec_float4 vec1)
35 result = spu_mul(vec0, vec1);
36 result = spu_madd(spu_rlqwbyte(vec0, 4), spu_rlqwbyte(vec1, 4),
result);
37 return spu_madd(spu_rlqwbyte(vec0, 8), spu_rlqwbyte(vec1, 8),
result);
51 btVector3 localAxis = dir * trans.getBasis();
72 btVector3 vec = localDirOrg * localScaling;
74 #if defined(__CELLOS_LV2__) && defined(__SPU__)
78 vec_float4 v_distMax = {-FLT_MAX, 0, 0, 0};
79 vec_int4 v_idxMax = {-999, 0, 0, 0};
81 int numverts = numPoints;
83 for (;
v < (int)numverts - 4;
v += 4)
85 vec_float4 p0 = vec_dot3(points[
v].get128(), localDir.get128());
86 vec_float4 p1 = vec_dot3(points[
v + 1].get128(), localDir.get128());
87 vec_float4 p2 = vec_dot3(points[
v + 2].get128(), localDir.get128());
88 vec_float4 p3 = vec_dot3(points[
v + 3].get128(), localDir.get128());
89 const vec_int4 i0 = {
v, 0, 0, 0};
90 const vec_int4
i1 = {
v + 1, 0, 0, 0};
91 const vec_int4 i2 = {
v + 2, 0, 0, 0};
92 const vec_int4 i3 = {
v + 3, 0, 0, 0};
93 vec_uint4 retGt01 = spu_cmpgt(p0, p1);
94 vec_float4 pmax01 = spu_sel(p1, p0, retGt01);
95 vec_int4 imax01 = spu_sel(
i1, i0, retGt01);
96 vec_uint4 retGt23 = spu_cmpgt(p2, p3);
97 vec_float4 pmax23 = spu_sel(p3, p2, retGt23);
98 vec_int4 imax23 = spu_sel(i3, i2, retGt23);
99 vec_uint4 retGt0123 = spu_cmpgt(pmax01, pmax23);
100 vec_float4 pmax0123 = spu_sel(pmax23, pmax01, retGt0123);
101 vec_int4 imax0123 = spu_sel(imax23, imax01, retGt0123);
102 vec_uint4 retGtMax = spu_cmpgt(v_distMax, pmax0123);
103 v_distMax = spu_sel(pmax0123, v_distMax, retGtMax);
104 v_idxMax = spu_sel(imax0123, v_idxMax, retGtMax);
106 for (;
v < (int)numverts;
v++)
108 vec_float4 p = vec_dot3(points[
v].get128(), localDir.get128());
109 const vec_int4 i = {
v, 0, 0, 0};
110 vec_uint4 retGtMax = spu_cmpgt(v_distMax, p);
111 v_distMax = spu_sel(p, v_distMax, retGtMax);
112 v_idxMax = spu_sel(i, v_idxMax, retGtMax);
114 int ptIndex = spu_extract(v_idxMax, 0);
115 const btVector3& supVec = points[ptIndex] * localScaling;
120 long ptIndex = vec.maxDot(points, numPoints,
maxDot);
126 btVector3 supVec = points[ptIndex] * localScaling;
142 const btVector3& halfExtents = convexShape->getImplicitShapeDimensions();
144 #if defined(__APPLE__) && (defined(BT_USE_SSE) || defined(BT_USE_NEON))
145 #if defined(BT_USE_SSE)
146 return btVector3(_mm_xor_ps(_mm_and_ps(localDir.mVec128, (__m128){-0.0f, -0.0f, -0.0f, -0.0f}), halfExtents.mVec128));
147 #elif defined(BT_USE_NEON)
148 return btVector3((float32x4_t)(((uint32x4_t)localDir.mVec128 & (uint32x4_t){0x80000000, 0x80000000, 0x80000000, 0x80000000}) ^ (uint32x4_t)halfExtents.mVec128));
150 #error unknown vector arch
154 btFsels(localDir.y(), halfExtents.y(), -halfExtents.y()),
155 btFsels(localDir.z(), halfExtents.z(), -halfExtents.z()));
161 btVector3 dir(localDir.getX(), localDir.getY(), localDir.getZ());
162 btVector3* vertices = &triangleShape->m_vertices1[0];
163 btVector3 dots = dir.dot3(vertices[0], vertices[1], vertices[2]);
164 btVector3 sup = vertices[dots.maxAxis()];
165 return btVector3(sup.getX(), sup.getY(), sup.getZ());
172 btVector3 halfExtents = cylShape->getImplicitShapeDimensions();
173 btVector3 v(localDir.getX(), localDir.getY(), localDir.getZ());
174 int cylinderUpAxis = cylShape->getUpAxis();
175 int XX(1), YY(0), ZZ(2);
177 switch (cylinderUpAxis)
206 btScalar halfHeight = halfExtents[cylinderUpAxis];
216 tmp[YY] =
v[YY] < 0.0 ? -halfHeight : halfHeight;
218 return btVector3(tmp.getX(), tmp.getY(), tmp.getZ());
223 tmp[YY] =
v[YY] < 0.0 ? -halfHeight : halfHeight;
225 return btVector3(tmp.getX(), tmp.getY(), tmp.getZ());
230 btVector3 vec0(localDir.getX(), localDir.getY(), localDir.getZ());
233 btScalar halfHeight = capsuleShape->getHalfHeight();
234 int capsuleUpAxis = capsuleShape->getUpAxis();
244 vec.setValue(1, 0, 0);
255 pos[capsuleUpAxis] = halfHeight;
258 newDot = vec.dot(vtx);
268 pos[capsuleUpAxis] = -halfHeight;
271 newDot = vec.dot(vtx);
278 return btVector3(supVec.getX(), supVec.getY(), supVec.getZ());
283 btVector3* points = convexPointCloudShape->getUnscaledPoints();
284 int numPoints = convexPointCloudShape->getNumPoints();
285 return convexHullSupport(localDir, points, numPoints, convexPointCloudShape->getLocalScalingNV());
290 btVector3* points = convexHullShape->getUnscaledPoints();
291 int numPoints = convexHullShape->getNumPoints();
292 return convexHullSupport(localDir, points, numPoints, convexHullShape->getLocalScalingNV());
314 localDirNorm.normalize();
327 return sphereShape->getRadius();
332 return convexShape->getMarginNV();
337 return triangleShape->getMarginNV();
342 return cylShape->getMarginNV();
347 return conShape->getMarginNV();
352 return capsuleShape->getMarginNV();
359 return convexHullShape->getMarginNV();
381 btScalar radius = sphereShape->getImplicitShapeDimensions().getX();
382 btScalar margin = radius + sphereShape->getMarginNonVirtual();
384 btVector3 extent(margin, margin, margin);
385 aabbMin =
center - extent;
386 aabbMax =
center + extent;
394 btScalar margin = convexShape->getMarginNonVirtual();
395 btVector3 halfExtents = convexShape->getImplicitShapeDimensions();
396 halfExtents +=
btVector3(margin, margin, margin);
399 btVector3 extent = halfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]);
401 aabbMin =
center - extent;
402 aabbMax =
center + extent;
408 btScalar margin = triangleShape->getMarginNonVirtual();
409 for (
int i = 0; i < 3; i++)
417 aabbMax[i] = tmp[i] + margin;
420 aabbMin[i] = tmp[i] - margin;
427 btVector3 halfExtents(capsuleShape->getRadius(), capsuleShape->getRadius(), capsuleShape->getRadius());
428 int m_upAxis = capsuleShape->getUpAxis();
429 halfExtents[
m_upAxis] = capsuleShape->getRadius() + capsuleShape->getHalfHeight();
432 btVector3 extent = halfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]);
433 aabbMin =
center - extent;
434 aabbMax =
center + extent;
441 btScalar margin = convexHullShape->getMarginNonVirtual();
447 this->
getAabb(t, aabbMin, aabbMax);
NSNotificationCenter * center
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint i1
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE btVector3 localGetSupportingVertexWithoutMargin(const btVector3 &vec) const
btConvexShape Interface
virtual btVector3 localGetSupportingVertex(const btVector3 &vec) const
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...
btBoxShape(const btVector3 &boxHalfExtents)
@ CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE
@ TRIANGLE_SHAPE_PROXYTYPE
@ CYLINDER_SHAPE_PROXYTYPE
@ CAPSULE_SHAPE_PROXYTYPE
@ CONVEX_HULL_SHAPE_PROXYTYPE
btCapsuleShape()
only used for btCapsuleShapeZ and btCapsuleShapeX subclasses.
virtual btScalar getMargin() const =0
btConeShape(btScalar radius, btScalar height)
btConvexHullShape(const btScalar *points=0, int numPoints=0, int stride=sizeof(btVector3))
btConvexPointCloudShape()
static btVector3 convexHullSupport(const btVector3 &localDirOrg, const btVector3 *points, int numPoints, const btVector3 &localScaling)
btScalar getMarginNonVirtual() const
btConvexShape()
not supported on IBM SDK, until we fix the alignment of btVector3
btVector3 localGetSupportVertexNonVirtual(const btVector3 &vec) const
void getAabbNonVirtual(const btTransform &t, btVector3 &aabbMin, btVector3 &aabbMax) const
btVector3 localGetSupportVertexWithoutMarginNonVirtual(const btVector3 &vec) const
btCylinderShape(const btVector3 &halfExtents)
btMatrix3x3
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
btPolyhedralConvexShape()
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
SIMD_FORCE_INLINE btScalar btSqrt(btScalar y)
btSphereShape(btScalar radius)
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
SIMD_FORCE_INLINE long maxDot(const btVector3 *array, long array_count, btScalar &dotOut) const
returns index of maximum dot product between this and vectors in array[]
The btPolyhedralConvexAabbCachingShape adds aabb caching to the btPolyhedralConvexShape.
void getNonvirtualAabb(const btTransform &trans, btVector3 &aabbMin, btVector3 &aabbMax, btScalar margin) const
vec_base< T, Size > project(const vec_base< T, Size > &p, const vec_base< T, Size > &v_proj)