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>
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 );
72 btVector3 vec = localDirOrg * localScaling;
74 #if defined (__CELLOS_LV2__) && defined (__SPU__)
81 int numverts = numPoints;
83 for(;v<(int)numverts-4;v+=4) {
84 vec_float4 p0 = vec_dot3(points[v ].get128(),localDir.get128());
85 vec_float4 p1 = vec_dot3(points[v+1].get128(),localDir.get128());
86 vec_float4 p2 = vec_dot3(points[v+2].get128(),localDir.get128());
87 vec_float4 p3 = vec_dot3(points[v+3].get128(),localDir.get128());
94 vec_int4 imax01 = spu_sel(i1,i0,retGt01);
97 vec_int4 imax23 = spu_sel(i3,i2,retGt23);
98 vec_uint4 retGt0123 = spu_cmpgt(pmax01,pmax23);
99 vec_float4 pmax0123 = spu_sel(pmax23,pmax01,retGt0123);
100 vec_int4 imax0123 = spu_sel(imax23,imax01,retGt0123);
101 vec_uint4 retGtMax = spu_cmpgt(v_distMax,pmax0123);
102 v_distMax = spu_sel(pmax0123,v_distMax,retGtMax);
103 v_idxMax = spu_sel(imax0123,v_idxMax,retGtMax);
105 for(;v<(int)numverts;v++) {
106 vec_float4 p = vec_dot3(points[v].get128(),localDir.get128());
108 vec_uint4 retGtMax = spu_cmpgt(v_distMax,p);
109 v_distMax = spu_sel(p,v_distMax,retGtMax);
110 v_idxMax = spu_sel(i,v_idxMax,retGtMax);
112 int ptIndex = spu_extract(v_idxMax,0);
113 const btVector3& supVec= points[ptIndex] * localScaling;
118 long ptIndex = vec.
maxDot( points, numPoints, maxDot);
120 btVector3 supVec = points[ptIndex] * localScaling;
138 #if defined( __APPLE__ ) && (defined( BT_USE_SSE )||defined( BT_USE_NEON ))
139 #if defined( BT_USE_SSE )
140 return btVector3( _mm_xor_ps( _mm_and_ps( localDir.mVec128, (__m128){-0.0f, -0.0f, -0.0f, -0.0f }), halfExtents.mVec128 ));
141 #elif defined( BT_USE_NEON )
142 return btVector3( (float32x4_t) (((uint32x4_t) localDir.mVec128 & (uint32x4_t){ 0x80000000, 0x80000000, 0x80000000, 0x80000000}) ^ (uint32x4_t) halfExtents.mVec128 ));
144 #error unknown vector arch
148 btFsels(localDir.
y(), halfExtents.y(), -halfExtents.y()),
149 btFsels(localDir.
z(), halfExtents.z(), -halfExtents.z()));
155 btVector3 dir(localDir.getX(),localDir.getY(),localDir.getZ());
157 btVector3 dots = dir.
dot3(vertices[0], vertices[1], vertices[2]);
167 btVector3 v(localDir.getX(),localDir.getY(),localDir.getZ());
168 int cylinderUpAxis = cylShape->
getUpAxis();
169 int XX(1),YY(0),ZZ(2);
171 switch (cylinderUpAxis)
201 btScalar halfHeight = halfExtents[cylinderUpAxis];
211 tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
216 tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
223 btVector3 vec0(localDir.getX(),localDir.getY(),localDir.getZ());
227 int capsuleUpAxis = capsuleShape->getUpAxis();
229 btScalar radius = capsuleShape->getRadius();
248 pos[capsuleUpAxis] = halfHeight;
251 vtx = pos +vec*(radius) - vec * capsuleShape->getMarginNV();
252 newDot = vec.
dot(vtx);
263 pos[capsuleUpAxis] = -halfHeight;
266 vtx = pos +vec*(radius) - vec * capsuleShape->getMarginNV();
267 newDot = vec.
dot(vtx);
274 return btVector3(supVec.getX(),supVec.getY(),supVec.getZ());
292 return this->localGetSupportingVertexWithoutMargin (localDir);
381 aabbMin = center - extent;
382 aabbMax = center + extent;
392 halfExtents +=
btVector3(margin,margin,margin);
395 btVector3 extent = halfExtents.
dot3(abs_b[0], abs_b[1], abs_b[2]);
397 aabbMin = center - extent;
398 aabbMax = center + extent;
405 for (
int i=0;i<3;i++)
413 aabbMax[i] = tmp[i]+margin;
416 aabbMin[i] = tmp[i]-margin;
424 int m_upAxis = capsuleShape->
getUpAxis();
429 btVector3 extent = halfExtents.
dot3(abs_b[0], abs_b[1], abs_b[2]);
430 aabbMin = center - extent;
431 aabbMax = center + extent;
444 this->
getAabb (t, aabbMin, aabbMax);