2017-08-01 14:30:58 +02:00
/*
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"
2019-01-03 14:26:51 +01:00
# include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
2017-08-01 14:30:58 +02:00
///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.
2019-01-03 14:26:51 +01:00
ATTRIBUTE_ALIGNED16 ( class )
btConeShape : public btConvexInternalShape
2017-08-01 14:30:58 +02:00
{
btScalar m_sinAngle ;
btScalar m_radius ;
btScalar m_height ;
2019-01-03 14:26:51 +01:00
int m_coneIndices [ 3 ] ;
2017-08-01 14:30:58 +02:00
btVector3 coneLocalSupport ( const btVector3 & v ) const ;
public :
BT_DECLARE_ALIGNED_ALLOCATOR ( ) ;
2019-01-03 14:26:51 +01:00
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 ; }
2017-08-01 14:30:58 +02:00
void setRadius ( const btScalar radius )
{
m_radius = radius ;
}
void setHeight ( const btScalar height )
{
m_height = height ;
}
2019-01-03 14:26:51 +01:00
virtual void calculateLocalInertia ( btScalar mass , btVector3 & inertia ) const
2017-08-01 14:30:58 +02:00
{
btTransform identity ;
identity . setIdentity ( ) ;
2019-01-03 14:26:51 +01:00
btVector3 aabbMin , aabbMax ;
getAabb ( identity , aabbMin , aabbMax ) ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
btVector3 halfExtents = ( aabbMax - aabbMin ) * btScalar ( 0.5 ) ;
2017-08-01 14:30:58 +02:00
btScalar margin = getMargin ( ) ;
2019-01-03 14:26:51 +01:00
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 ;
2017-08-01 14:30:58 +02:00
const btScalar scaledmass = mass * btScalar ( 0.08333333 ) ;
2019-01-03 14:26:51 +01:00
inertia = scaledmass * ( btVector3 ( y2 + z2 , x2 + z2 , x2 + y2 ) ) ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
// inertia.x() = scaledmass * (y2+z2);
// inertia.y() = scaledmass * (x2+z2);
// inertia.z() = scaledmass * (x2+y2);
2017-08-01 14:30:58 +02:00
}
2019-01-03 14:26:51 +01:00
virtual const char * getName ( ) const
{
return " Cone " ;
}
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
///choose upAxis index
void setConeUpIndex ( int upIndex ) ;
int getConeUpIndex ( ) const
2017-08-01 14:30:58 +02:00
{
2019-01-03 14:26:51 +01:00
return m_coneIndices [ 1 ] ;
2017-08-01 14:30:58 +02:00
}
2019-01-03 14:26:51 +01:00
virtual btVector3 getAnisotropicRollingFrictionDirection ( ) const
{
return btVector3 ( 0 , 1 , 0 ) ;
}
virtual void setLocalScaling ( const btVector3 & scaling ) ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
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 ;
2017-08-01 14:30:58 +02:00
} ;
///btConeShape implements a Cone shape, around the X axis
class btConeShapeX : public btConeShape
{
2019-01-03 14:26:51 +01:00
public :
btConeShapeX ( btScalar radius , btScalar height ) ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual btVector3 getAnisotropicRollingFrictionDirection ( ) const
2017-08-01 14:30:58 +02:00
{
2019-01-03 14:26:51 +01:00
return btVector3 ( 1 , 0 , 0 ) ;
2017-08-01 14:30:58 +02:00
}
//debugging
2019-01-03 14:26:51 +01:00
virtual const char * getName ( ) const
2017-08-01 14:30:58 +02:00
{
return " ConeX " ;
}
} ;
///btConeShapeZ implements a Cone shape, around the Z axis
class btConeShapeZ : public btConeShape
{
public :
2019-01-03 14:26:51 +01:00
btConeShapeZ ( btScalar radius , btScalar height ) ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
virtual btVector3 getAnisotropicRollingFrictionDirection ( ) const
2017-08-01 14:30:58 +02:00
{
2019-01-03 14:26:51 +01:00
return btVector3 ( 0 , 0 , 1 ) ;
2017-08-01 14:30:58 +02:00
}
//debugging
2019-01-03 14:26:51 +01:00
virtual const char * getName ( ) const
2017-08-01 14:30:58 +02:00
{
return " ConeZ " ;
}
} ;
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
2019-01-03 14:26:51 +01:00
struct btConeShapeData
2017-08-01 14:30:58 +02:00
{
2019-01-03 14:26:51 +01:00
btConvexInternalShapeData m_convexInternalShapeData ;
int m_upIndex ;
char m_padding [ 4 ] ;
2017-08-01 14:30:58 +02:00
} ;
2019-01-03 14:26:51 +01:00
SIMD_FORCE_INLINE int btConeShape : : calculateSerializeBufferSize ( ) const
2017-08-01 14:30:58 +02:00
{
return sizeof ( btConeShapeData ) ;
}
///fills the dataBuffer and returns the struct name (and 0 on failure)
2019-01-03 14:26:51 +01:00
SIMD_FORCE_INLINE const char * btConeShape : : serialize ( void * dataBuffer , btSerializer * serializer ) const
2017-08-01 14:30:58 +02:00
{
2019-01-03 14:26:51 +01:00
btConeShapeData * shapeData = ( btConeShapeData * ) dataBuffer ;
2017-08-01 14:30:58 +02:00
2019-01-03 14:26:51 +01:00
btConvexInternalShape : : serialize ( & shapeData - > m_convexInternalShapeData , serializer ) ;
2017-08-01 14:30:58 +02:00
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 " ;
}
2019-01-03 14:26:51 +01:00
# endif //BT_CONE_MINKOWSKI_H