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
 | |
| 
 |