forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			456 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			456 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | /*
 | ||
|  | Bullet Continuous Collision Detection and Physics Library | ||
|  | Copyright (c) 2003-2009 Erwin Coumans  http://bulletphysics.org
 | ||
|  | 
 | ||
|  | This software is provided 'as-is', without any express or implied warranty. | ||
|  | In no event will the authors be held liable for any damages arising from the use of this software. | ||
|  | Permission is granted to anyone to use this software for any purpose,  | ||
|  | including commercial applications, and to alter it and redistribute it freely,  | ||
|  | subject to the following restrictions: | ||
|  | 
 | ||
|  | 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. | ||
|  | 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. | ||
|  | 3. This notice may not be removed or altered from any source distribution. | ||
|  | */ | ||
|  | 
 | ||
|  | #if defined (_WIN32) || defined (__i386__)
 | ||
|  | #define BT_USE_SSE_IN_API
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #include "btConvexShape.h"
 | ||
|  | #include "btTriangleShape.h"
 | ||
|  | #include "btSphereShape.h"
 | ||
|  | #include "btCylinderShape.h"
 | ||
|  | #include "btConeShape.h"
 | ||
|  | #include "btCapsuleShape.h"
 | ||
|  | #include "btConvexHullShape.h"
 | ||
|  | #include "btConvexPointCloudShape.h"
 | ||
|  | 
 | ||
|  | ///not supported on IBM SDK, until we fix the alignment of btVector3
 | ||
|  | #if defined (__CELLOS_LV2__) && defined (__SPU__)
 | ||
|  | #include <spu_intrinsics.h>
 | ||
|  | static inline vec_float4 vec_dot3( vec_float4 vec0, vec_float4 vec1 ) | ||
|  | { | ||
|  |     vec_float4 result; | ||
|  |     result = spu_mul( vec0, vec1 ); | ||
|  |     result = spu_madd( spu_rlqwbyte( vec0, 4 ), spu_rlqwbyte( vec1, 4 ), result ); | ||
|  |     return spu_madd( spu_rlqwbyte( vec0, 8 ), spu_rlqwbyte( vec1, 8 ), result ); | ||
|  | } | ||
|  | #endif //__SPU__
 | ||
|  | 
 | ||
|  | btConvexShape::btConvexShape () | ||
|  | { | ||
|  | } | ||
|  | 
 | ||
|  | btConvexShape::~btConvexShape() | ||
|  | { | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | void btConvexShape::project(const btTransform& trans, const btVector3& dir, btScalar& min, btScalar& max, btVector3& witnesPtMin,btVector3& witnesPtMax) const | ||
|  | { | ||
|  | 	btVector3 localAxis = dir*trans.getBasis(); | ||
|  | 	btVector3 vtx1 = trans(localGetSupportingVertex(localAxis)); | ||
|  | 	btVector3 vtx2 = trans(localGetSupportingVertex(-localAxis)); | ||
|  | 
 | ||
|  | 	min = vtx1.dot(dir); | ||
|  | 	max = vtx2.dot(dir); | ||
|  | 	witnesPtMax = vtx2; | ||
|  | 	witnesPtMin = vtx1; | ||
|  | 	 | ||
|  | 	if(min>max) | ||
|  | 	{ | ||
|  | 		btScalar tmp = min; | ||
|  | 		min = max; | ||
|  | 		max = tmp; | ||
|  | 		witnesPtMax = vtx1; | ||
|  | 		witnesPtMin = vtx2; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | static btVector3 convexHullSupport (const btVector3& localDirOrg, const btVector3* points, int numPoints, const btVector3& localScaling) | ||
|  | {	 | ||
|  | 
 | ||
|  | 	btVector3 vec = localDirOrg * localScaling; | ||
|  | 
 | ||
|  | #if defined (__CELLOS_LV2__) && defined (__SPU__)
 | ||
|  | 
 | ||
|  | 	btVector3 localDir = vec; | ||
|  | 
 | ||
|  | 	vec_float4 v_distMax = {-FLT_MAX,0,0,0}; | ||
|  | 	vec_int4 v_idxMax = {-999,0,0,0}; | ||
|  | 	int v=0; | ||
|  | 	int numverts = numPoints; | ||
|  | 
 | ||
|  | 	for(;v<(int)numverts-4;v+=4) { | ||
|  | 		vec_float4 p0 = vec_dot3(points[v  ].get128(),localDir.get128()); | ||
|  | 		vec_float4 p1 = vec_dot3(points[v+1].get128(),localDir.get128()); | ||
|  | 		vec_float4 p2 = vec_dot3(points[v+2].get128(),localDir.get128()); | ||
|  | 		vec_float4 p3 = vec_dot3(points[v+3].get128(),localDir.get128()); | ||
|  | 		const vec_int4 i0 = {v  ,0,0,0}; | ||
|  | 		const vec_int4 i1 = {v+1,0,0,0}; | ||
|  | 		const vec_int4 i2 = {v+2,0,0,0}; | ||
|  | 		const vec_int4 i3 = {v+3,0,0,0}; | ||
|  | 		vec_uint4  retGt01 = spu_cmpgt(p0,p1); | ||
|  | 		vec_float4 pmax01 = spu_sel(p1,p0,retGt01); | ||
|  | 		vec_int4   imax01 = spu_sel(i1,i0,retGt01); | ||
|  | 		vec_uint4  retGt23 = spu_cmpgt(p2,p3); | ||
|  | 		vec_float4 pmax23 = spu_sel(p3,p2,retGt23); | ||
|  | 		vec_int4   imax23 = spu_sel(i3,i2,retGt23); | ||
|  | 		vec_uint4  retGt0123 = spu_cmpgt(pmax01,pmax23); | ||
|  | 		vec_float4 pmax0123 = spu_sel(pmax23,pmax01,retGt0123); | ||
|  | 		vec_int4   imax0123 = spu_sel(imax23,imax01,retGt0123); | ||
|  | 		vec_uint4  retGtMax = spu_cmpgt(v_distMax,pmax0123); | ||
|  | 		v_distMax = spu_sel(pmax0123,v_distMax,retGtMax); | ||
|  | 		v_idxMax = spu_sel(imax0123,v_idxMax,retGtMax); | ||
|  | 	} | ||
|  | 	for(;v<(int)numverts;v++) { | ||
|  | 		vec_float4 p = vec_dot3(points[v].get128(),localDir.get128()); | ||
|  | 		const vec_int4 i = {v,0,0,0}; | ||
|  | 		vec_uint4  retGtMax = spu_cmpgt(v_distMax,p); | ||
|  | 		v_distMax = spu_sel(p,v_distMax,retGtMax); | ||
|  | 		v_idxMax = spu_sel(i,v_idxMax,retGtMax); | ||
|  | 	} | ||
|  | 	int ptIndex = spu_extract(v_idxMax,0); | ||
|  | 	const btVector3& supVec= points[ptIndex] * localScaling; | ||
|  | 	return supVec; | ||
|  | #else
 | ||
|  | 
 | ||
|  |     btScalar maxDot; | ||
|  |     long ptIndex = vec.maxDot( points, numPoints, maxDot); | ||
|  | 	btAssert(ptIndex >= 0); | ||
|  | 	btVector3 supVec = points[ptIndex] * localScaling; | ||
|  | 	return supVec; | ||
|  | #endif //__SPU__
 | ||
|  | } | ||
|  | 
 | ||
|  | btVector3 btConvexShape::localGetSupportVertexWithoutMarginNonVirtual (const btVector3& localDir) const | ||
|  | { | ||
|  | 	switch (m_shapeType) | ||
|  | 	{ | ||
|  |     case SPHERE_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		return btVector3(0,0,0); | ||
|  |     } | ||
|  | 	case BOX_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btBoxShape* convexShape = (btBoxShape*)this; | ||
|  | 		const btVector3& halfExtents = convexShape->getImplicitShapeDimensions(); | ||
|  | 
 | ||
|  | #if defined( __APPLE__ ) && (defined( BT_USE_SSE )||defined( BT_USE_NEON ))
 | ||
|  |     #if defined( BT_USE_SSE )
 | ||
|  |             return btVector3( _mm_xor_ps( _mm_and_ps( localDir.mVec128, (__m128){-0.0f, -0.0f, -0.0f, -0.0f }), halfExtents.mVec128 )); | ||
|  |     #elif defined( BT_USE_NEON )
 | ||
|  |             return btVector3( (float32x4_t) (((uint32x4_t) localDir.mVec128 & (uint32x4_t){ 0x80000000, 0x80000000, 0x80000000, 0x80000000}) ^ (uint32x4_t) halfExtents.mVec128 )); | ||
|  |     #else
 | ||
|  |         #error unknown vector arch
 | ||
|  |     #endif
 | ||
|  | #else
 | ||
|  | 		return btVector3(btFsels(localDir.x(), halfExtents.x(), -halfExtents.x()), | ||
|  | 			btFsels(localDir.y(), halfExtents.y(), -halfExtents.y()), | ||
|  | 			btFsels(localDir.z(), halfExtents.z(), -halfExtents.z())); | ||
|  | #endif
 | ||
|  | 	} | ||
|  | 	case TRIANGLE_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btTriangleShape* triangleShape = (btTriangleShape*)this; | ||
|  | 		btVector3 dir(localDir.getX(),localDir.getY(),localDir.getZ()); | ||
|  | 		btVector3* vertices = &triangleShape->m_vertices1[0]; | ||
|  |         btVector3 dots = dir.dot3(vertices[0], vertices[1], vertices[2]); | ||
|  | 		btVector3 sup = vertices[dots.maxAxis()]; | ||
|  | 		return btVector3(sup.getX(),sup.getY(),sup.getZ()); | ||
|  | 	} | ||
|  | 	case CYLINDER_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btCylinderShape* cylShape = (btCylinderShape*)this; | ||
|  | 		//mapping of halfextents/dimension onto radius/height depends on how cylinder local orientation is (upAxis)
 | ||
|  | 
 | ||
|  | 		btVector3 halfExtents = cylShape->getImplicitShapeDimensions(); | ||
|  | 		btVector3 v(localDir.getX(),localDir.getY(),localDir.getZ()); | ||
|  | 		int cylinderUpAxis = cylShape->getUpAxis(); | ||
|  | 		int XX(1),YY(0),ZZ(2); | ||
|  | 
 | ||
|  | 		switch (cylinderUpAxis) | ||
|  | 		{ | ||
|  | 		case 0: | ||
|  | 		{ | ||
|  | 			XX = 1; | ||
|  | 			YY = 0; | ||
|  | 			ZZ = 2; | ||
|  | 		} | ||
|  | 		break; | ||
|  | 		case 1: | ||
|  | 		{ | ||
|  | 			XX = 0; | ||
|  | 			YY = 1; | ||
|  | 			ZZ = 2;	 | ||
|  | 		} | ||
|  | 		break; | ||
|  | 		case 2: | ||
|  | 		{ | ||
|  | 			XX = 0; | ||
|  | 			YY = 2; | ||
|  | 			ZZ = 1; | ||
|  | 			 | ||
|  | 		} | ||
|  | 		break; | ||
|  | 		default: | ||
|  | 			btAssert(0); | ||
|  | 		break; | ||
|  | 		}; | ||
|  | 
 | ||
|  | 		btScalar radius = halfExtents[XX]; | ||
|  | 		btScalar halfHeight = halfExtents[cylinderUpAxis]; | ||
|  | 
 | ||
|  | 		btVector3 tmp; | ||
|  | 		btScalar d ; | ||
|  | 
 | ||
|  | 		btScalar s = btSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]); | ||
|  | 		if (s != btScalar(0.0)) | ||
|  | 		{ | ||
|  | 			d = radius / s;   | ||
|  | 			tmp[XX] = v[XX] * d; | ||
|  | 			tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight; | ||
|  | 			tmp[ZZ] = v[ZZ] * d; | ||
|  | 			return btVector3(tmp.getX(),tmp.getY(),tmp.getZ()); | ||
|  | 		} else { | ||
|  | 			tmp[XX] = radius; | ||
|  | 			tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight; | ||
|  | 			tmp[ZZ] = btScalar(0.0); | ||
|  | 			return btVector3(tmp.getX(),tmp.getY(),tmp.getZ()); | ||
|  | 		} | ||
|  | 	} | ||
|  | 	case CAPSULE_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btVector3 vec0(localDir.getX(),localDir.getY(),localDir.getZ()); | ||
|  | 
 | ||
|  | 		btCapsuleShape* capsuleShape = (btCapsuleShape*)this; | ||
|  | 		btScalar halfHeight = capsuleShape->getHalfHeight(); | ||
|  | 		int capsuleUpAxis = capsuleShape->getUpAxis(); | ||
|  | 
 | ||
|  | 		btVector3 supVec(0,0,0); | ||
|  | 
 | ||
|  | 		btScalar maxDot(btScalar(-BT_LARGE_FLOAT)); | ||
|  | 
 | ||
|  | 		btVector3 vec = vec0; | ||
|  | 		btScalar lenSqr = vec.length2(); | ||
|  | 		if (lenSqr < SIMD_EPSILON*SIMD_EPSILON) | ||
|  | 		{ | ||
|  | 			vec.setValue(1,0,0); | ||
|  | 		} else | ||
|  | 		{ | ||
|  | 			btScalar rlen = btScalar(1.) / btSqrt(lenSqr ); | ||
|  | 			vec *= rlen; | ||
|  | 		} | ||
|  | 		btVector3 vtx; | ||
|  | 		btScalar newDot; | ||
|  | 		{ | ||
|  | 			btVector3 pos(0,0,0); | ||
|  | 			pos[capsuleUpAxis] = halfHeight; | ||
|  | 
 | ||
|  | 			vtx = pos; | ||
|  | 			newDot = vec.dot(vtx); | ||
|  | 			 | ||
|  | 
 | ||
|  | 			if (newDot > maxDot) | ||
|  | 			{ | ||
|  | 				maxDot = newDot; | ||
|  | 				supVec = vtx; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		{ | ||
|  | 			btVector3 pos(0,0,0); | ||
|  | 			pos[capsuleUpAxis] = -halfHeight; | ||
|  | 
 | ||
|  | 			vtx = pos; | ||
|  | 			newDot = vec.dot(vtx); | ||
|  | 			if (newDot > maxDot) | ||
|  | 			{ | ||
|  | 				maxDot = newDot; | ||
|  | 				supVec = vtx; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		return btVector3(supVec.getX(),supVec.getY(),supVec.getZ());	 | ||
|  | 	} | ||
|  | 	case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btConvexPointCloudShape* convexPointCloudShape = (btConvexPointCloudShape*)this; | ||
|  | 		btVector3* points = convexPointCloudShape->getUnscaledPoints (); | ||
|  | 		int numPoints = convexPointCloudShape->getNumPoints (); | ||
|  | 		return convexHullSupport (localDir, points, numPoints,convexPointCloudShape->getLocalScalingNV()); | ||
|  | 	} | ||
|  | 	case CONVEX_HULL_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btConvexHullShape* convexHullShape = (btConvexHullShape*)this; | ||
|  | 		btVector3* points = convexHullShape->getUnscaledPoints(); | ||
|  | 		int numPoints = convexHullShape->getNumPoints (); | ||
|  | 		return convexHullSupport (localDir, points, numPoints,convexHullShape->getLocalScalingNV()); | ||
|  | 	} | ||
|  |     default: | ||
|  | #ifndef __SPU__
 | ||
|  | 		return this->localGetSupportingVertexWithoutMargin (localDir); | ||
|  | #else
 | ||
|  | 		btAssert (0); | ||
|  | #endif
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// should never reach here
 | ||
|  | 	btAssert (0); | ||
|  | 	return btVector3 (btScalar(0.0f), btScalar(0.0f), btScalar(0.0f)); | ||
|  | } | ||
|  | 
 | ||
|  | btVector3 btConvexShape::localGetSupportVertexNonVirtual (const btVector3& localDir) const | ||
|  | { | ||
|  | 	btVector3 localDirNorm = localDir; | ||
|  | 	if (localDirNorm .length2() < (SIMD_EPSILON*SIMD_EPSILON)) | ||
|  | 	{ | ||
|  | 		localDirNorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.)); | ||
|  | 	} | ||
|  | 	localDirNorm.normalize (); | ||
|  | 
 | ||
|  | 	return localGetSupportVertexWithoutMarginNonVirtual(localDirNorm)+ getMarginNonVirtual() * localDirNorm; | ||
|  | } | ||
|  | 
 | ||
|  | /* TODO: This should be bumped up to btCollisionShape () */ | ||
|  | btScalar btConvexShape::getMarginNonVirtual () const | ||
|  | { | ||
|  | 	switch (m_shapeType) | ||
|  | 	{ | ||
|  |     case SPHERE_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btSphereShape* sphereShape = (btSphereShape*)this; | ||
|  | 		return sphereShape->getRadius (); | ||
|  | 	} | ||
|  | 	case BOX_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btBoxShape* convexShape = (btBoxShape*)this; | ||
|  | 		return convexShape->getMarginNV (); | ||
|  | 	} | ||
|  | 	case TRIANGLE_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btTriangleShape* triangleShape = (btTriangleShape*)this; | ||
|  | 		return triangleShape->getMarginNV (); | ||
|  | 	} | ||
|  | 	case CYLINDER_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btCylinderShape* cylShape = (btCylinderShape*)this; | ||
|  | 		return cylShape->getMarginNV(); | ||
|  | 	} | ||
|  | 	case CONE_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btConeShape* conShape = (btConeShape*)this; | ||
|  | 		return conShape->getMarginNV(); | ||
|  | 	} | ||
|  | 	case CAPSULE_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btCapsuleShape* capsuleShape = (btCapsuleShape*)this; | ||
|  | 		return capsuleShape->getMarginNV(); | ||
|  | 	} | ||
|  | 	case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE: | ||
|  | 	/* fall through */ | ||
|  | 	case CONVEX_HULL_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btPolyhedralConvexShape* convexHullShape = (btPolyhedralConvexShape*)this; | ||
|  | 		return convexHullShape->getMarginNV(); | ||
|  | 	} | ||
|  |     default: | ||
|  | #ifndef __SPU__
 | ||
|  | 		return this->getMargin (); | ||
|  | #else
 | ||
|  | 		btAssert (0); | ||
|  | #endif
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// should never reach here
 | ||
|  | 	btAssert (0); | ||
|  | 	return btScalar(0.0f); | ||
|  | } | ||
|  | #ifndef __SPU__
 | ||
|  | void btConvexShape::getAabbNonVirtual (const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const | ||
|  | { | ||
|  | 	switch (m_shapeType) | ||
|  | 	{ | ||
|  |     case SPHERE_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btSphereShape* sphereShape = (btSphereShape*)this; | ||
|  | 		btScalar radius = sphereShape->getImplicitShapeDimensions().getX();// * convexShape->getLocalScaling().getX();
 | ||
|  | 		btScalar margin = radius + sphereShape->getMarginNonVirtual(); | ||
|  | 		const btVector3& center = t.getOrigin(); | ||
|  | 		btVector3 extent(margin,margin,margin); | ||
|  | 		aabbMin = center - extent; | ||
|  | 		aabbMax = center + extent; | ||
|  |     } | ||
|  | 	break; | ||
|  | 	case CYLINDER_SHAPE_PROXYTYPE: | ||
|  | 	/* fall through */ | ||
|  | 	case BOX_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btBoxShape* convexShape = (btBoxShape*)this; | ||
|  | 		btScalar margin=convexShape->getMarginNonVirtual(); | ||
|  | 		btVector3 halfExtents = convexShape->getImplicitShapeDimensions(); | ||
|  | 		halfExtents += btVector3(margin,margin,margin); | ||
|  | 		btMatrix3x3 abs_b = t.getBasis().absolute();   | ||
|  | 		btVector3 center = t.getOrigin(); | ||
|  |         btVector3 extent = halfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]);     | ||
|  |          | ||
|  | 		aabbMin = center - extent; | ||
|  | 		aabbMax = center + extent; | ||
|  | 		break; | ||
|  | 	} | ||
|  | 	case TRIANGLE_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btTriangleShape* triangleShape = (btTriangleShape*)this; | ||
|  | 		btScalar margin = triangleShape->getMarginNonVirtual(); | ||
|  | 		for (int i=0;i<3;i++) | ||
|  | 		{ | ||
|  | 			btVector3 vec(btScalar(0.),btScalar(0.),btScalar(0.)); | ||
|  | 			vec[i] = btScalar(1.); | ||
|  | 
 | ||
|  | 			btVector3 sv = localGetSupportVertexWithoutMarginNonVirtual(vec*t.getBasis()); | ||
|  | 
 | ||
|  | 			btVector3 tmp = t(sv); | ||
|  | 			aabbMax[i] = tmp[i]+margin; | ||
|  | 			vec[i] = btScalar(-1.); | ||
|  | 			tmp = t(localGetSupportVertexWithoutMarginNonVirtual(vec*t.getBasis())); | ||
|  | 			aabbMin[i] = tmp[i]-margin; | ||
|  | 		}	 | ||
|  | 	} | ||
|  | 	break; | ||
|  | 	case CAPSULE_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btCapsuleShape* capsuleShape = (btCapsuleShape*)this; | ||
|  | 		btVector3 halfExtents(capsuleShape->getRadius(),capsuleShape->getRadius(),capsuleShape->getRadius()); | ||
|  | 		int m_upAxis = capsuleShape->getUpAxis(); | ||
|  | 		halfExtents[m_upAxis] = capsuleShape->getRadius() + capsuleShape->getHalfHeight(); | ||
|  | 		btMatrix3x3 abs_b = t.getBasis().absolute();   | ||
|  | 		btVector3 center = t.getOrigin(); | ||
|  |         btVector3 extent = halfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]);     | ||
|  | 		aabbMin = center - extent; | ||
|  | 		aabbMax = center + extent; | ||
|  | 	} | ||
|  | 	break; | ||
|  | 	case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE: | ||
|  | 	case CONVEX_HULL_SHAPE_PROXYTYPE: | ||
|  | 	{ | ||
|  | 		btPolyhedralConvexAabbCachingShape* convexHullShape = (btPolyhedralConvexAabbCachingShape*)this; | ||
|  | 		btScalar margin = convexHullShape->getMarginNonVirtual(); | ||
|  | 		convexHullShape->getNonvirtualAabb (t, aabbMin, aabbMax, margin); | ||
|  | 	} | ||
|  | 	break; | ||
|  |     default: | ||
|  | #ifndef __SPU__
 | ||
|  | 		this->getAabb (t, aabbMin, aabbMax); | ||
|  | #else
 | ||
|  | 		btAssert (0); | ||
|  | #endif
 | ||
|  | 	break; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// should never reach here
 | ||
|  | 	btAssert (0); | ||
|  | } | ||
|  | 
 | ||
|  | #endif //__SPU__
 |