[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-physics / third-party / bullet3 / src / BulletCollision / Gimpact / btCompoundFromGimpact.h
1 #ifndef BT_COMPOUND_FROM_GIMPACT
2 #define BT_COMPOUND_FROM_GIMPACT
3
4 #include "BulletCollision/CollisionShapes/btCompoundShape.h"
5 #include "btGImpactShape.h"
6 #include "BulletCollision/NarrowPhaseCollision/btRaycastCallback.h"
7
8 ATTRIBUTE_ALIGNED16(class)
9 btCompoundFromGimpactShape : public btCompoundShape
10 {
11 public:
12         BT_DECLARE_ALIGNED_ALLOCATOR();
13
14         virtual ~btCompoundFromGimpactShape()
15         {
16                 /*delete all the btBU_Simplex1to4 ChildShapes*/
17                 for (int i = 0; i < m_children.size(); i++)
18                 {
19                         delete m_children[i].m_childShape;
20                 }
21         }
22 };
23
24 struct MyCallback : public btTriangleRaycastCallback
25 {
26         int m_ignorePart;
27         int m_ignoreTriangleIndex;
28
29         MyCallback(const btVector3& from, const btVector3& to, int ignorePart, int ignoreTriangleIndex)
30                 : btTriangleRaycastCallback(from, to),
31                   m_ignorePart(ignorePart),
32                   m_ignoreTriangleIndex(ignoreTriangleIndex)
33         {
34         }
35         virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex)
36         {
37                 if (partId != m_ignorePart || triangleIndex != m_ignoreTriangleIndex)
38                 {
39                         if (hitFraction < m_hitFraction)
40                                 return hitFraction;
41                 }
42
43                 return m_hitFraction;
44         }
45 };
46 struct MyInternalTriangleIndexCallback : public btInternalTriangleIndexCallback
47 {
48         const btGImpactMeshShape* m_gimpactShape;
49         btCompoundShape* m_colShape;
50         btScalar m_depth;
51
52         MyInternalTriangleIndexCallback(btCompoundShape* colShape, const btGImpactMeshShape* meshShape, btScalar depth)
53                 : m_colShape(colShape),
54                   m_gimpactShape(meshShape),
55                   m_depth(depth)
56         {
57         }
58
59         virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex)
60         {
61                 btVector3 scale = m_gimpactShape->getLocalScaling();
62                 btVector3 v0 = triangle[0] * scale;
63                 btVector3 v1 = triangle[1] * scale;
64                 btVector3 v2 = triangle[2] * scale;
65
66                 btVector3 centroid = (v0 + v1 + v2) / 3;
67                 btVector3 normal = (v1 - v0).cross(v2 - v0);
68                 normal.normalize();
69                 btVector3 rayFrom = centroid;
70                 btVector3 rayTo = centroid - normal * m_depth;
71
72                 MyCallback cb(rayFrom, rayTo, partId, triangleIndex);
73
74                 m_gimpactShape->processAllTrianglesRay(&cb, rayFrom, rayTo);
75                 if (cb.m_hitFraction < 1)
76                 {
77                         rayTo.setInterpolate3(cb.m_from, cb.m_to, cb.m_hitFraction);
78                         //rayTo = cb.m_from;
79                         //rayTo = rayTo.lerp(cb.m_to,cb.m_hitFraction);
80                         //gDebugDraw.drawLine(tr(centroid),tr(centroid+normal),btVector3(1,0,0));
81                 }
82
83                 btBU_Simplex1to4* tet = new btBU_Simplex1to4(v0, v1, v2, rayTo);
84                 btTransform ident;
85                 ident.setIdentity();
86                 m_colShape->addChildShape(ident, tet);
87         }
88 };
89
90 btCompoundShape* btCreateCompoundFromGimpactShape(const btGImpactMeshShape* gimpactMesh, btScalar depth)
91 {
92         btCompoundShape* colShape = new btCompoundFromGimpactShape();
93
94         btTransform tr;
95         tr.setIdentity();
96
97         MyInternalTriangleIndexCallback cb(colShape, gimpactMesh, depth);
98         btVector3 aabbMin, aabbMax;
99         gimpactMesh->getAabb(tr, aabbMin, aabbMax);
100         gimpactMesh->getMeshInterface()->InternalProcessAllTriangles(&cb, aabbMin, aabbMax);
101
102         return colShape;
103 }
104
105 #endif  //BT_COMPOUND_FROM_GIMPACT