[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-physics / third-party / bullet3 / src / BulletCollision / CollisionShapes / btConvexInternalShape.h
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_CONVEX_INTERNAL_SHAPE_H
17 #define BT_CONVEX_INTERNAL_SHAPE_H
18
19 #include "btConvexShape.h"
20 #include "LinearMath/btAabbUtil2.h"
21
22 ///The btConvexInternalShape is an internal base class, shared by most convex shape implementations.
23 ///The btConvexInternalShape uses a default collision margin set to CONVEX_DISTANCE_MARGIN.
24 ///This collision margin used by Gjk and some other algorithms, see also btCollisionMargin.h
25 ///Note that when creating small shapes (derived from btConvexInternalShape),
26 ///you need to make sure to set a smaller collision margin, using the 'setMargin' API
27 ///There is a automatic mechanism 'setSafeMargin' used by btBoxShape and btCylinderShape
28 ATTRIBUTE_ALIGNED16(class)
29 btConvexInternalShape : public btConvexShape
30 {
31 protected:
32         //local scaling. collisionMargin is not scaled !
33         btVector3 m_localScaling;
34
35         btVector3 m_implicitShapeDimensions;
36
37         btScalar m_collisionMargin;
38
39         btScalar m_padding;
40
41         btConvexInternalShape();
42
43 public:
44         BT_DECLARE_ALIGNED_ALLOCATOR();
45
46         virtual ~btConvexInternalShape()
47         {
48         }
49
50         virtual btVector3 localGetSupportingVertex(const btVector3& vec) const;
51
52         const btVector3& getImplicitShapeDimensions() const
53         {
54                 return m_implicitShapeDimensions;
55         }
56
57         ///warning: use setImplicitShapeDimensions with care
58         ///changing a collision shape while the body is in the world is not recommended,
59         ///it is best to remove the body from the world, then make the change, and re-add it
60         ///alternatively flush the contact points, see documentation for 'cleanProxyFromPairs'
61         void setImplicitShapeDimensions(const btVector3& dimensions)
62         {
63                 m_implicitShapeDimensions = dimensions;
64         }
65
66         void setSafeMargin(btScalar minDimension, btScalar defaultMarginMultiplier = 0.1f)
67         {
68                 btScalar safeMargin = defaultMarginMultiplier * minDimension;
69                 if (safeMargin < getMargin())
70                 {
71                         setMargin(safeMargin);
72                 }
73         }
74         void setSafeMargin(const btVector3& halfExtents, btScalar defaultMarginMultiplier = 0.1f)
75         {
76                 //see http://code.google.com/p/bullet/issues/detail?id=349
77                 //this margin check could could be added to other collision shapes too,
78                 //or add some assert/warning somewhere
79                 btScalar minDimension = halfExtents[halfExtents.minAxis()];
80                 setSafeMargin(minDimension, defaultMarginMultiplier);
81         }
82
83         ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
84         void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
85         {
86                 getAabbSlow(t, aabbMin, aabbMax);
87         }
88
89         virtual void getAabbSlow(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
90
91         virtual void setLocalScaling(const btVector3& scaling);
92         virtual const btVector3& getLocalScaling() const
93         {
94                 return m_localScaling;
95         }
96
97         const btVector3& getLocalScalingNV() const
98         {
99                 return m_localScaling;
100         }
101
102         virtual void setMargin(btScalar margin)
103         {
104                 m_collisionMargin = margin;
105         }
106         virtual btScalar getMargin() const
107         {
108                 return m_collisionMargin;
109         }
110
111         btScalar getMarginNV() const
112         {
113                 return m_collisionMargin;
114         }
115
116         virtual int getNumPreferredPenetrationDirections() const
117         {
118                 return 0;
119         }
120
121         virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
122         {
123                 (void)penetrationVector;
124                 (void)index;
125                 btAssert(0);
126         }
127
128         virtual int calculateSerializeBufferSize() const;
129
130         ///fills the dataBuffer and returns the struct name (and 0 on failure)
131         virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
132 };
133
134 ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
135 struct btConvexInternalShapeData
136 {
137         btCollisionShapeData m_collisionShapeData;
138
139         btVector3FloatData m_localScaling;
140
141         btVector3FloatData m_implicitShapeDimensions;
142
143         float m_collisionMargin;
144
145         int m_padding;
146 };
147
148 SIMD_FORCE_INLINE int btConvexInternalShape::calculateSerializeBufferSize() const
149 {
150         return sizeof(btConvexInternalShapeData);
151 }
152
153 ///fills the dataBuffer and returns the struct name (and 0 on failure)
154 SIMD_FORCE_INLINE const char* btConvexInternalShape::serialize(void* dataBuffer, btSerializer* serializer) const
155 {
156         btConvexInternalShapeData* shapeData = (btConvexInternalShapeData*)dataBuffer;
157         btCollisionShape::serialize(&shapeData->m_collisionShapeData, serializer);
158
159         m_implicitShapeDimensions.serializeFloat(shapeData->m_implicitShapeDimensions);
160         m_localScaling.serializeFloat(shapeData->m_localScaling);
161         shapeData->m_collisionMargin = float(m_collisionMargin);
162
163         // Fill padding with zeros to appease msan.
164         shapeData->m_padding = 0;
165
166         return "btConvexInternalShapeData";
167 }
168
169 ///btConvexInternalAabbCachingShape adds local aabb caching for convex shapes, to avoid expensive bounding box calculations
170 class btConvexInternalAabbCachingShape : public btConvexInternalShape
171 {
172         btVector3 m_localAabbMin;
173         btVector3 m_localAabbMax;
174         bool m_isLocalAabbValid;
175
176 protected:
177         btConvexInternalAabbCachingShape();
178
179         void setCachedLocalAabb(const btVector3& aabbMin, const btVector3& aabbMax)
180         {
181                 m_isLocalAabbValid = true;
182                 m_localAabbMin = aabbMin;
183                 m_localAabbMax = aabbMax;
184         }
185
186         inline void getCachedLocalAabb(btVector3& aabbMin, btVector3& aabbMax) const
187         {
188                 btAssert(m_isLocalAabbValid);
189                 aabbMin = m_localAabbMin;
190                 aabbMax = m_localAabbMax;
191         }
192
193         inline void getNonvirtualAabb(const btTransform& trans, btVector3& aabbMin, btVector3& aabbMax, btScalar margin) const
194         {
195                 //lazy evaluation of local aabb
196                 btAssert(m_isLocalAabbValid);
197                 btTransformAabb(m_localAabbMin, m_localAabbMax, margin, trans, aabbMin, aabbMax);
198         }
199
200 public:
201         virtual void setLocalScaling(const btVector3& scaling);
202
203         virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
204
205         void recalcLocalAabb();
206 };
207
208 #endif  //BT_CONVEX_INTERNAL_SHAPE_H