16 #if defined (_WIN32) || defined (__i386__)
17 #define BT_USE_SSE_IN_API
29 #if defined (__CELLOS_LV2__) && defined (__SPU__)
30 #include <spu_intrinsics.h>
34 result = spu_mul( vec0, vec1 );
35 result = spu_madd( spu_rlqwbyte( vec0, 4 ), spu_rlqwbyte( vec1, 4 ), result );
36 return spu_madd( spu_rlqwbyte( vec0, 8 ), spu_rlqwbyte( vec1, 8 ), result );
71 btVector3 vec = localDirOrg * localScaling;
73 #if defined (__CELLOS_LV2__) && defined (__SPU__)
80 int numverts = numPoints;
82 for(;v<(int)numverts-4;v+=4) {
83 vec_float4 p0 = vec_dot3(points[v ].get128(),localDir.get128());
84 vec_float4 p1 = vec_dot3(points[v+1].get128(),localDir.get128());
85 vec_float4 p2 = vec_dot3(points[v+2].get128(),localDir.get128());
86 vec_float4 p3 = vec_dot3(points[v+3].get128(),localDir.get128());
93 vec_int4 imax01 = spu_sel(i1,i0,retGt01);
96 vec_int4 imax23 = spu_sel(i3,i2,retGt23);
97 vec_uint4 retGt0123 = spu_cmpgt(pmax01,pmax23);
98 vec_float4 pmax0123 = spu_sel(pmax23,pmax01,retGt0123);
99 vec_int4 imax0123 = spu_sel(imax23,imax01,retGt0123);
100 vec_uint4 retGtMax = spu_cmpgt(v_distMax,pmax0123);
101 v_distMax = spu_sel(pmax0123,v_distMax,retGtMax);
102 v_idxMax = spu_sel(imax0123,v_idxMax,retGtMax);
104 for(;v<(int)numverts;v++) {
105 vec_float4 p = vec_dot3(points[v].get128(),localDir.get128());
107 vec_uint4 retGtMax = spu_cmpgt(v_distMax,p);
108 v_distMax = spu_sel(p,v_distMax,retGtMax);
109 v_idxMax = spu_sel(i,v_idxMax,retGtMax);
111 int ptIndex = spu_extract(v_idxMax,0);
112 const btVector3& supVec= points[ptIndex] * localScaling;
117 long ptIndex = vec.
maxDot( points, numPoints, maxDot);
119 btVector3 supVec = points[ptIndex] * localScaling;
137 #if defined( __APPLE__ ) && (defined( BT_USE_SSE )||defined( BT_USE_NEON ))
138 #if defined( BT_USE_SSE )
139 return btVector3( _mm_xor_ps( _mm_and_ps( localDir.mVec128, (__m128){-0.0f, -0.0f, -0.0f, -0.0f }), halfExtents.mVec128 ));
140 #elif defined( BT_USE_NEON )
141 return btVector3( (float32x4_t) (((uint32x4_t) localDir.mVec128 & (uint32x4_t){ 0x80000000, 0x80000000, 0x80000000, 0x80000000}) ^ (uint32x4_t) halfExtents.mVec128 ));
143 #error unknown vector arch
147 btFsels(localDir.
y(), halfExtents.y(), -halfExtents.y()),
148 btFsels(localDir.
z(), halfExtents.z(), -halfExtents.z()));
154 btVector3 dir(localDir.getX(),localDir.getY(),localDir.getZ());
156 btVector3 dots = dir.
dot3(vertices[0], vertices[1], vertices[2]);
166 btVector3 v(localDir.getX(),localDir.getY(),localDir.getZ());
167 int cylinderUpAxis = cylShape->
getUpAxis();
168 int XX(1),YY(0),ZZ(2);
170 switch (cylinderUpAxis)
200 btScalar halfHeight = halfExtents[cylinderUpAxis];
210 tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
215 tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
222 btVector3 vec0(localDir.getX(),localDir.getY(),localDir.getZ());
226 int capsuleUpAxis = capsuleShape->getUpAxis();
228 btScalar radius = capsuleShape->getRadius();
247 pos[capsuleUpAxis] = halfHeight;
250 vtx = pos +vec*(radius) - vec * capsuleShape->getMarginNV();
251 newDot = vec.
dot(vtx);
262 pos[capsuleUpAxis] = -halfHeight;
265 vtx = pos +vec*(radius) - vec * capsuleShape->getMarginNV();
266 newDot = vec.
dot(vtx);
273 return btVector3(supVec.getX(),supVec.getY(),supVec.getZ());
291 return this->localGetSupportingVertexWithoutMargin (localDir);
375 aabbMin = center - extent;
376 aabbMax = center + extent;
386 halfExtents +=
btVector3(margin,margin,margin);
389 btVector3 extent = halfExtents.
dot3(abs_b[0], abs_b[1], abs_b[2]);
391 aabbMin = center - extent;
392 aabbMax = center + extent;
399 for (
int i=0;i<3;i++)
407 aabbMax[i] = tmp[i]+margin;
410 aabbMin[i] = tmp[i]-margin;
418 int m_upAxis = capsuleShape->
getUpAxis();
423 btVector3 extent = halfExtents.
dot3(abs_b[0], abs_b[1], abs_b[2]);
424 aabbMin = center - extent;
425 aabbMax = center + extent;
438 this->
getAabb (t, aabbMin, aabbMax);