1 #include "btSdfCollisionShape.h"
3 #include "LinearMath/btAabbUtil2.h"
5 ATTRIBUTE_ALIGNED16(struct)
6 btSdfCollisionShapeInternalData
8 BT_DECLARE_ALIGNED_ALLOCATOR();
10 btVector3 m_localScaling;
14 btSdfCollisionShapeInternalData()
15 : m_localScaling(1, 1, 1),
21 bool btSdfCollisionShape::initializeSDF(const char* sdfData, int sizeInBytes)
23 bool valid = m_data->m_sdf.load(sdfData, sizeInBytes);
26 btSdfCollisionShape::btSdfCollisionShape()
28 m_shapeType = SDF_SHAPE_PROXYTYPE;
29 m_data = new btSdfCollisionShapeInternalData();
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);
39 btSdfCollisionShape::~btSdfCollisionShape()
44 void btSdfCollisionShape::getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
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;
50 btTransformAabb(localAabbMin, localAabbMax, margin, t, aabbMin, aabbMax);
53 void btSdfCollisionShape::setLocalScaling(const btVector3& scaling)
55 m_data->m_localScaling = scaling;
57 const btVector3& btSdfCollisionShape::getLocalScaling() const
59 return m_data->m_localScaling;
61 void btSdfCollisionShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
63 inertia.setValue(0, 0, 0);
65 const char* btSdfCollisionShape::getName() const
67 return "btSdfCollisionShape";
69 void btSdfCollisionShape::setMargin(btScalar margin)
71 m_data->m_margin = margin;
73 btScalar btSdfCollisionShape::getMargin() const
75 return m_data->m_margin;
78 void btSdfCollisionShape::processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const
83 bool btSdfCollisionShape::queryPoint(const btVector3& ptInSDF, btScalar& distOut, btVector3& normal)
88 bool hasResult = m_data->m_sdf.interpolate(field, dist, ptInSDF, &grad);
91 normal.setValue(grad[0], grad[1], grad[2]);