[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-physics / third-party / bullet3 / src / BulletCollision / CollisionShapes / btSdfCollisionShape.cpp
1 #include "btSdfCollisionShape.h"
2 #include "btMiniSDF.h"
3 #include "LinearMath/btAabbUtil2.h"
4
5 ATTRIBUTE_ALIGNED16(struct)
6 btSdfCollisionShapeInternalData
7 {
8         BT_DECLARE_ALIGNED_ALLOCATOR();
9
10         btVector3 m_localScaling;
11         btScalar m_margin;
12         btMiniSDF m_sdf;
13
14         btSdfCollisionShapeInternalData()
15                 : m_localScaling(1, 1, 1),
16                   m_margin(0)
17         {
18         }
19 };
20
21 bool btSdfCollisionShape::initializeSDF(const char* sdfData, int sizeInBytes)
22 {
23         bool valid = m_data->m_sdf.load(sdfData, sizeInBytes);
24         return valid;
25 }
26 btSdfCollisionShape::btSdfCollisionShape()
27 {
28         m_shapeType = SDF_SHAPE_PROXYTYPE;
29         m_data = new btSdfCollisionShapeInternalData();
30
31         //"E:/develop/bullet3/data/toys/ground_hole64_64_8.cdf");//ground_cube.cdf");
32         /*unsigned int field_id=0;
33         Eigen::Vector3d x (1,10,1);
34         Eigen::Vector3d gradient;
35         double dist = m_data->m_sdf.interpolate(field_id, x, &gradient);
36         printf("dist=%g\n", dist);
37         */
38 }
39 btSdfCollisionShape::~btSdfCollisionShape()
40 {
41         delete m_data;
42 }
43
44 void btSdfCollisionShape::getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
45 {
46         btAssert(m_data->m_sdf.isValid());
47         btVector3 localAabbMin = m_data->m_sdf.m_domain.m_min;
48         btVector3 localAabbMax = m_data->m_sdf.m_domain.m_max;
49         btScalar margin(0);
50         btTransformAabb(localAabbMin, localAabbMax, margin, t, aabbMin, aabbMax);
51 }
52
53 void btSdfCollisionShape::setLocalScaling(const btVector3& scaling)
54 {
55         m_data->m_localScaling = scaling;
56 }
57 const btVector3& btSdfCollisionShape::getLocalScaling() const
58 {
59         return m_data->m_localScaling;
60 }
61 void btSdfCollisionShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
62 {
63         inertia.setValue(0, 0, 0);
64 }
65 const char* btSdfCollisionShape::getName() const
66 {
67         return "btSdfCollisionShape";
68 }
69 void btSdfCollisionShape::setMargin(btScalar margin)
70 {
71         m_data->m_margin = margin;
72 }
73 btScalar btSdfCollisionShape::getMargin() const
74 {
75         return m_data->m_margin;
76 }
77
78 void btSdfCollisionShape::processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const
79 {
80         //not yet
81 }
82
83 bool btSdfCollisionShape::queryPoint(const btVector3& ptInSDF, btScalar& distOut, btVector3& normal)
84 {
85         int field = 0;
86         btVector3 grad;
87         double dist;
88         bool hasResult = m_data->m_sdf.interpolate(field, dist, ptInSDF, &grad);
89         if (hasResult)
90         {
91                 normal.setValue(grad[0], grad[1], grad[2]);
92                 distOut = dist;
93         }
94         return hasResult;
95 }