godot/thirdparty/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.cpp
Rémi Verschelde b7901c773c
bullet: Sync with upstream 3.17
Stop include Bullet headers using `-isystem` for GCC/Clang as it misleads
SCons into not properly rebuilding all files when headers change.

This means we also need to make sure Bullet builds without warning, and
current version fares fairly well, there were just a couple to fix (patch
included).

Increase minimum version for distro packages to 2.90 (this was never released
as the "next" version after 2.89 was 3.05... but that covers it too).
2021-09-29 16:30:34 +02:00

96 lines
2.3 KiB
C++

#include "btSdfCollisionShape.h"
#include "btMiniSDF.h"
#include "LinearMath/btAabbUtil2.h"
ATTRIBUTE_ALIGNED16(struct)
btSdfCollisionShapeInternalData
{
BT_DECLARE_ALIGNED_ALLOCATOR();
btVector3 m_localScaling;
btScalar m_margin;
btMiniSDF m_sdf;
btSdfCollisionShapeInternalData()
: m_localScaling(1, 1, 1),
m_margin(0)
{
}
};
bool btSdfCollisionShape::initializeSDF(const char* sdfData, int sizeInBytes)
{
bool valid = m_data->m_sdf.load(sdfData, sizeInBytes);
return valid;
}
btSdfCollisionShape::btSdfCollisionShape()
{
m_shapeType = SDF_SHAPE_PROXYTYPE;
m_data = new btSdfCollisionShapeInternalData();
//"E:/develop/bullet3/data/toys/ground_hole64_64_8.cdf");//ground_cube.cdf");
/*unsigned int field_id=0;
Eigen::Vector3d x (1,10,1);
Eigen::Vector3d gradient;
double dist = m_data->m_sdf.interpolate(field_id, x, &gradient);
printf("dist=%g\n", dist);
*/
}
btSdfCollisionShape::~btSdfCollisionShape()
{
delete m_data;
}
void btSdfCollisionShape::getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
btAssert(m_data->m_sdf.isValid());
btVector3 localAabbMin = m_data->m_sdf.m_domain.m_min;
btVector3 localAabbMax = m_data->m_sdf.m_domain.m_max;
btScalar margin(0);
btTransformAabb(localAabbMin, localAabbMax, margin, t, aabbMin, aabbMax);
}
void btSdfCollisionShape::setLocalScaling(const btVector3& scaling)
{
m_data->m_localScaling = scaling;
}
const btVector3& btSdfCollisionShape::getLocalScaling() const
{
return m_data->m_localScaling;
}
void btSdfCollisionShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
inertia.setValue(0, 0, 0);
}
const char* btSdfCollisionShape::getName() const
{
return "btSdfCollisionShape";
}
void btSdfCollisionShape::setMargin(btScalar margin)
{
m_data->m_margin = margin;
}
btScalar btSdfCollisionShape::getMargin() const
{
return m_data->m_margin;
}
void btSdfCollisionShape::processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const
{
//not yet
}
bool btSdfCollisionShape::queryPoint(const btVector3& ptInSDF, btScalar& distOut, btVector3& normal)
{
int field = 0;
btVector3 grad;
double dist;
bool hasResult = m_data->m_sdf.interpolate(field, dist, ptInSDF, &grad);
if (hasResult)
{
normal.setValue(grad[0], grad[1], grad[2]);
distOut = dist;
}
return hasResult;
}