• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2009 Erwin Coumans  http://bulletphysics.org
4 
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose,
8 including commercial applications, and to alter it and redistribute it freely,
9 subject to the following restrictions:
10 
11 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.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
14 */
15 
16 #ifndef BT_COLLISION_SHAPE_H
17 #define BT_COLLISION_SHAPE_H
18 
19 #include "LinearMath/btTransform.h"
20 #include "LinearMath/btVector3.h"
21 #include "LinearMath/btMatrix3x3.h"
22 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" //for the shape types
23 class btSerializer;
24 
25 
26 ///The btCollisionShape class provides an interface for collision shapes that can be shared among btCollisionObjects.
ATTRIBUTE_ALIGNED16(class)27 ATTRIBUTE_ALIGNED16(class) btCollisionShape
28 {
29 protected:
30 	int m_shapeType;
31 	void* m_userPointer;
32 	int m_userIndex;
33 
34 public:
35 
36 	BT_DECLARE_ALIGNED_ALLOCATOR();
37 
38 	btCollisionShape() : m_shapeType (INVALID_SHAPE_PROXYTYPE), m_userPointer(0), m_userIndex(-1)
39 	{
40 	}
41 
42 	virtual ~btCollisionShape()
43 	{
44 	}
45 
46 	///getAabb returns the axis aligned bounding box in the coordinate frame of the given transform t.
47 	virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const =0;
48 
49 	virtual void	getBoundingSphere(btVector3& center,btScalar& radius) const;
50 
51 	///getAngularMotionDisc returns the maximus radius needed for Conservative Advancement to handle time-of-impact with rotations.
52 	virtual btScalar	getAngularMotionDisc() const;
53 
54 	virtual btScalar	getContactBreakingThreshold(btScalar defaultContactThresholdFactor) const;
55 
56 
57 	///calculateTemporalAabb calculates the enclosing aabb for the moving object over interval [0..timeStep)
58 	///result is conservative
59 	void calculateTemporalAabb(const btTransform& curTrans,const btVector3& linvel,const btVector3& angvel,btScalar timeStep, btVector3& temporalAabbMin,btVector3& temporalAabbMax) const;
60 
61 
62 
63 	SIMD_FORCE_INLINE bool	isPolyhedral() const
64 	{
65 		return btBroadphaseProxy::isPolyhedral(getShapeType());
66 	}
67 
68 	SIMD_FORCE_INLINE bool	isConvex2d() const
69 	{
70 		return btBroadphaseProxy::isConvex2d(getShapeType());
71 	}
72 
73 	SIMD_FORCE_INLINE bool	isConvex() const
74 	{
75 		return btBroadphaseProxy::isConvex(getShapeType());
76 	}
77 	SIMD_FORCE_INLINE bool	isNonMoving() const
78 	{
79 		return btBroadphaseProxy::isNonMoving(getShapeType());
80 	}
81 	SIMD_FORCE_INLINE bool	isConcave() const
82 	{
83 		return btBroadphaseProxy::isConcave(getShapeType());
84 	}
85 	SIMD_FORCE_INLINE bool	isCompound() const
86 	{
87 		return btBroadphaseProxy::isCompound(getShapeType());
88 	}
89 
90 	SIMD_FORCE_INLINE bool	isSoftBody() const
91 	{
92 		return btBroadphaseProxy::isSoftBody(getShapeType());
93 	}
94 
95 	///isInfinite is used to catch simulation error (aabb check)
96 	SIMD_FORCE_INLINE bool isInfinite() const
97 	{
98 		return btBroadphaseProxy::isInfinite(getShapeType());
99 	}
100 
101 #ifndef __SPU__
102 	virtual void	setLocalScaling(const btVector3& scaling) =0;
103 	virtual const btVector3& getLocalScaling() const =0;
104 	virtual void	calculateLocalInertia(btScalar mass,btVector3& inertia) const = 0;
105 
106 
107 //debugging support
108 	virtual const char*	getName()const =0 ;
109 #endif //__SPU__
110 
111 
112 	int		getShapeType() const { return m_shapeType; }
113 
114 	///the getAnisotropicRollingFrictionDirection can be used in combination with setAnisotropicFriction
115 	///See Bullet/Demos/RollingFrictionDemo for an example
116 	virtual btVector3	getAnisotropicRollingFrictionDirection() const
117 	{
118 		return btVector3(1,1,1);
119 	}
120 	virtual void	setMargin(btScalar margin) = 0;
121 	virtual btScalar	getMargin() const = 0;
122 
123 
124 	///optional user data pointer
125 	void	setUserPointer(void*  userPtr)
126 	{
127 		m_userPointer = userPtr;
128 	}
129 
130 	void*	getUserPointer() const
131 	{
132 		return m_userPointer;
133 	}
134 	void setUserIndex(int index)
135 	{
136 		m_userIndex = index;
137 	}
138 
139 	int getUserIndex() const
140 	{
141 		return m_userIndex;
142 	}
143 
144 
145 	virtual	int	calculateSerializeBufferSize() const;
146 
147 	///fills the dataBuffer and returns the struct name (and 0 on failure)
148 	virtual	const char*	serialize(void* dataBuffer, btSerializer* serializer) const;
149 
150 	virtual void	serializeSingleShape(btSerializer* serializer) const;
151 
152 };
153 
154 ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
155 struct	btCollisionShapeData
156 {
157 	char	*m_name;
158 	int		m_shapeType;
159 	char	m_padding[4];
160 };
161 
calculateSerializeBufferSize()162 SIMD_FORCE_INLINE	int	btCollisionShape::calculateSerializeBufferSize() const
163 {
164 	return sizeof(btCollisionShapeData);
165 }
166 
167 
168 
169 #endif //BT_COLLISION_SHAPE_H
170 
171