summaryrefslogtreecommitdiff
path: root/thirdparty/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.cpp
blob: 23c95ad3ffcf1e20d9939c3a1a53f5dd5d588233 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#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;
}