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