187 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			187 lines
		
	
	
		
			5.0 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. | ||
|  | */ | ||
|  | 
 | ||
|  | #ifndef BT_CONE_MINKOWSKI_H
 | ||
|  | #define BT_CONE_MINKOWSKI_H
 | ||
|  | 
 | ||
|  | #include "btConvexInternalShape.h"
 | ||
|  | #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
 | ||
|  | 
 | ||
|  | ///The btConeShape implements a cone shape primitive, centered around the origin and aligned with the Y axis. The btConeShapeX is aligned around the X axis and btConeShapeZ around the Z axis.
 | ||
|  | ATTRIBUTE_ALIGNED16(class) btConeShape : public btConvexInternalShape | ||
|  | 
 | ||
|  | { | ||
|  | 
 | ||
|  | 	btScalar m_sinAngle; | ||
|  | 	btScalar m_radius; | ||
|  | 	btScalar m_height; | ||
|  | 	int		m_coneIndices[3]; | ||
|  | 	btVector3 coneLocalSupport(const btVector3& v) const; | ||
|  | 
 | ||
|  | 
 | ||
|  | public: | ||
|  | 	BT_DECLARE_ALIGNED_ALLOCATOR(); | ||
|  | 	 | ||
|  | 	btConeShape (btScalar radius,btScalar height); | ||
|  | 	 | ||
|  | 	virtual btVector3	localGetSupportingVertex(const btVector3& vec) const; | ||
|  | 	virtual btVector3	localGetSupportingVertexWithoutMargin(const btVector3& vec) const; | ||
|  | 	virtual void	batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const; | ||
|  | 
 | ||
|  | 	btScalar getRadius() const { return m_radius;} | ||
|  | 	btScalar getHeight() const { return m_height;} | ||
|  | 
 | ||
|  | 	void setRadius(const btScalar radius) | ||
|  | 	{ | ||
|  | 		m_radius = radius; | ||
|  | 	} | ||
|  | 	void setHeight(const btScalar height) | ||
|  | 	{ | ||
|  | 		m_height = height; | ||
|  | 	} | ||
|  | 
 | ||
|  | 
 | ||
|  | 	virtual void	calculateLocalInertia(btScalar mass,btVector3& inertia) const | ||
|  | 	{ | ||
|  | 		btTransform identity; | ||
|  | 		identity.setIdentity(); | ||
|  | 		btVector3 aabbMin,aabbMax; | ||
|  | 		getAabb(identity,aabbMin,aabbMax); | ||
|  | 
 | ||
|  | 		btVector3 halfExtents = (aabbMax-aabbMin)*btScalar(0.5); | ||
|  | 
 | ||
|  | 		btScalar margin = getMargin(); | ||
|  | 
 | ||
|  | 		btScalar lx=btScalar(2.)*(halfExtents.x()+margin); | ||
|  | 		btScalar ly=btScalar(2.)*(halfExtents.y()+margin); | ||
|  | 		btScalar lz=btScalar(2.)*(halfExtents.z()+margin); | ||
|  | 		const btScalar x2 = lx*lx; | ||
|  | 		const btScalar y2 = ly*ly; | ||
|  | 		const btScalar z2 = lz*lz; | ||
|  | 		const btScalar scaledmass = mass * btScalar(0.08333333); | ||
|  | 
 | ||
|  | 		inertia = scaledmass * (btVector3(y2+z2,x2+z2,x2+y2)); | ||
|  | 
 | ||
|  | //		inertia.x() = scaledmass * (y2+z2);
 | ||
|  | //		inertia.y() = scaledmass * (x2+z2);
 | ||
|  | //		inertia.z() = scaledmass * (x2+y2);
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 
 | ||
|  | 		virtual const char*	getName()const  | ||
|  | 		{ | ||
|  | 			return "Cone"; | ||
|  | 		} | ||
|  | 		 | ||
|  | 		///choose upAxis index
 | ||
|  | 		void	setConeUpIndex(int upIndex); | ||
|  | 		 | ||
|  | 		int	getConeUpIndex() const | ||
|  | 		{ | ||
|  | 			return m_coneIndices[1]; | ||
|  | 		} | ||
|  | 
 | ||
|  | 	virtual btVector3	getAnisotropicRollingFrictionDirection() const | ||
|  | 	{ | ||
|  | 		return btVector3 (0,1,0); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	virtual void	setLocalScaling(const btVector3& scaling); | ||
|  | 	 | ||
|  | 	 | ||
|  | 	virtual	int	calculateSerializeBufferSize() const; | ||
|  | 	 | ||
|  | 	///fills the dataBuffer and returns the struct name (and 0 on failure)
 | ||
|  | 	virtual	const char*	serialize(void* dataBuffer, btSerializer* serializer) const; | ||
|  | 	 | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | ///btConeShape implements a Cone shape, around the X axis
 | ||
|  | class btConeShapeX : public btConeShape | ||
|  | { | ||
|  | 	public: | ||
|  | 		btConeShapeX(btScalar radius,btScalar height); | ||
|  | 
 | ||
|  | 	virtual btVector3	getAnisotropicRollingFrictionDirection() const | ||
|  | 	{ | ||
|  | 		return btVector3 (1,0,0); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	//debugging
 | ||
|  | 	virtual const char*	getName()const | ||
|  | 	{ | ||
|  | 		return "ConeX"; | ||
|  | 	} | ||
|  | 	 | ||
|  | 	 | ||
|  | }; | ||
|  | 
 | ||
|  | ///btConeShapeZ implements a Cone shape, around the Z axis
 | ||
|  | class btConeShapeZ : public btConeShape | ||
|  | { | ||
|  | public: | ||
|  | 	btConeShapeZ(btScalar radius,btScalar height); | ||
|  | 
 | ||
|  | 	virtual btVector3	getAnisotropicRollingFrictionDirection() const | ||
|  | 	{ | ||
|  | 		return btVector3 (0,0,1); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	//debugging
 | ||
|  | 	virtual const char*	getName()const | ||
|  | 	{ | ||
|  | 		return "ConeZ"; | ||
|  | 	} | ||
|  | 	 | ||
|  | 	 | ||
|  | }; | ||
|  | 
 | ||
|  | ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
 | ||
|  | struct	btConeShapeData | ||
|  | { | ||
|  | 	btConvexInternalShapeData	m_convexInternalShapeData; | ||
|  | 	 | ||
|  | 	int	m_upIndex; | ||
|  | 	 | ||
|  | 	char	m_padding[4]; | ||
|  | }; | ||
|  | 
 | ||
|  | SIMD_FORCE_INLINE	int	btConeShape::calculateSerializeBufferSize() const | ||
|  | { | ||
|  | 	return sizeof(btConeShapeData); | ||
|  | } | ||
|  | 
 | ||
|  | ///fills the dataBuffer and returns the struct name (and 0 on failure)
 | ||
|  | SIMD_FORCE_INLINE	const char*	btConeShape::serialize(void* dataBuffer, btSerializer* serializer) const | ||
|  | { | ||
|  | 	btConeShapeData* shapeData = (btConeShapeData*) dataBuffer; | ||
|  | 
 | ||
|  | 	btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData,serializer); | ||
|  | 
 | ||
|  | 	shapeData->m_upIndex = m_coneIndices[1]; | ||
|  | 
 | ||
|  | 	// Fill padding with zeros to appease msan.
 | ||
|  | 	shapeData->m_padding[0] = 0; | ||
|  | 	shapeData->m_padding[1] = 0; | ||
|  | 	shapeData->m_padding[2] = 0; | ||
|  | 	shapeData->m_padding[3] = 0; | ||
|  | 
 | ||
|  | 	return "btConeShapeData"; | ||
|  | } | ||
|  | 
 | ||
|  | #endif //BT_CONE_MINKOWSKI_H
 | ||
|  | 
 |