Skip to content

Commit 33684bc

Browse files
committed
Support for contraints car demo
1 parent 5e50870 commit 33684bc

File tree

9 files changed

+1528
-10
lines changed

9 files changed

+1528
-10
lines changed

bullet3.stub.php

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ class CylinderShape implements CollisionShape
3939
public function __construct(\GL\Math\Vec3 $halfExtents) {}
4040
}
4141

42-
class CylinderShapeX implements CylinderShape
42+
class CylinderShapeX implements CollisionShape
4343
{
4444
public function __construct(\GL\Math\Vec3 $halfExtents) {}
4545
}
4646

47-
class CylinderShapeZ implements CylinderShape
47+
class CylinderShapeZ implements CollisionShape
4848
{
4949
public function __construct(\GL\Math\Vec3 $halfExtents) {}
5050
}
@@ -78,6 +78,69 @@ public function __construct(
7878
\GL\Math\Vec3 $axisInA,
7979
\GL\Math\Vec3 $axisInB
8080
) {}
81+
82+
public function setLimit(float $low, float $high, float $softness = 0.9, float $biasFactor = 0.3, float $relaxationFactor = 1.0): void {}
83+
}
84+
85+
class SliderConstraint implements Constraint
86+
{
87+
public function __construct(
88+
RigidBody $bodyA,
89+
RigidBody $bodyB,
90+
\GL\Math\Mat4 $frameInA,
91+
\GL\Math\Mat4 $frameInB,
92+
bool $useLinearReferenceFrameA = true
93+
) {}
94+
}
95+
96+
class Generic6DofSpringConstraint implements Constraint
97+
{
98+
public function __construct(
99+
RigidBody $bodyA,
100+
RigidBody $bodyB,
101+
\GL\Math\Mat4 $frameInA,
102+
\GL\Math\Mat4 $frameInB,
103+
bool $useLinearReferenceFrameA = true
104+
) {}
105+
}
106+
107+
class Generic6DofSpring2Constraint implements Constraint
108+
{
109+
public function __construct(
110+
RigidBody $bodyA,
111+
RigidBody $bodyB,
112+
\GL\Math\Mat4 $frameInA,
113+
\GL\Math\Mat4 $frameInB
114+
) {}
115+
116+
117+
public function setFrames(\GL\Math\Mat4 $frameInA, \GL\Math\Mat4 $frameInB): void {}
118+
public function setLinearLowerLimit(\GL\Math\Vec3 $linearLower): void {}
119+
120+
public function setLinearUpperLimit(\GL\Math\Vec3 $linearUpper): void {}
121+
122+
public function setAngularLowerLimit(\GL\Math\Vec3 $angularLower): void {}
123+
public function setAngularLowerLimitReversed(\GL\Math\Vec3 $angularLower): void {}
124+
125+
public function setAngularUpperLimit(\GL\Math\Vec3 $angularUpper): void {}
126+
public function setAngularUpperLimitReversed(\GL\Math\Vec3 $angularUpper): void {}
127+
128+
public function setLimit(int $axis, float $lo, float $hi): void {}
129+
public function setLimitReversed(int $axis, float $lo, float $hi): void {}
130+
131+
public function setAxis(int $index, \GL\Math\Vec3 $axis): void {}
132+
133+
public function setBounce(int $index, float $bounce): void {}
134+
135+
public function enableMotor(int $index, bool $onOff): void {}
136+
public function setServo(int $index, bool $onOff): void {}
137+
public function setTargetVelocity(int $index, float $velocity): void {}
138+
public function setServoTarget(int $index, float $target): void {}
139+
public function setMaxMotorForce(int $index, float $force): void {}
140+
141+
public function enableSpring(int $index, bool $onOff): void {}
142+
public function setStiffness(int $index, float $stiffness, bool $limitIfNeeded = true): void {}
143+
public function setDamping(int $index, float $damping, bool $limitIfNeeded = true): void {}
81144
}
82145

83146
class RigidBody
@@ -93,6 +156,12 @@ public function getAngularVelocity(): \GL\Math\Vec3 {}
93156
public function getOrientation(): \GL\Math\Quat {}
94157
public function setOrientation(\GL\Math\Quat $orientation): void {}
95158
public function setMass(float $mass): void {}
159+
public function setRestitution(float $restitution): void {}
160+
public function setFriction(float $friction): void {}
161+
public function setRollingFriction(float $rollingFriction): void {}
162+
public function setSpinningFriction(float $spinningFriction): void {}
163+
public function setContactStiffnessAndDamping(float $stiffness, float $damping): void {}
164+
96165
public function getTransform(): \GL\Math\Mat4 {}
97166
public function applyForce(\GL\Math\Vec3 $force, \GL\Math\Vec3 $relPos): void {}
98167
public function applyCentralForce(\GL\Math\Vec3 $force): void {}

bullet3_arginfo.h

Lines changed: 234 additions & 5 deletions
Large diffs are not rendered by default.

bullet3_bridge.cpp

Lines changed: 163 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "bullet3_bridge.h"
22
#include "btBulletDynamicsCommon.h"
3+
#include "BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h"
34

45
struct btDynamicsWorldWrapper {
56
btDefaultCollisionConfiguration* collisionConfiguration;
@@ -29,7 +30,7 @@ struct btTypedConstraintWrapper {
2930
*
3031
* ----------------------------------------------------------------------------
3132
*/
32-
btVector3 vec3_to_btVector3(vec3 *v)
33+
btVector3 vec3_to_btVector3(const vec3 *v)
3334
{
3435
return btVector3((*v)[0], (*v)[1], (*v)[2]);
3536
}
@@ -39,6 +40,13 @@ btQuaternion quat_to_btQuaternion(quat *q)
3940
return btQuaternion((*q)[1], (*q)[2], (*q)[3], (*q)[0]);
4041
}
4142

43+
btTransform mat4x4_to_btTransform(mat4x4 *m)
44+
{
45+
btTransform transform;
46+
transform.setFromOpenGLMatrix((*m)[0]);
47+
return transform;
48+
}
49+
4250
void btVector3_to_vec3(btVector3 *v, vec3 *out)
4351
{
4452
(*out)[0] = v->getX();
@@ -209,6 +217,145 @@ btTypedConstraintWrapper *btHingeConstraint_create(btRigidBodyWrapper *bodyA, bt
209217
return wrapper;
210218
}
211219

220+
void btHingeConstraint_setLimit(btTypedConstraintWrapper *constraint, float low, float high, float softness, float biasFactor, float relaxationFactor)
221+
{
222+
btHingeConstraint *hinge = static_cast<btHingeConstraint *>(constraint->constraint);
223+
hinge->setLimit(low, high, softness, biasFactor, relaxationFactor);
224+
}
225+
226+
btTypedConstraintWrapper *btSliderConstraint_create(btRigidBodyWrapper *bodyA, btRigidBodyWrapper *bodyB, mat4x4 *frameInA, mat4x4 *frameInB, bool useLinearReferenceFrameA)
227+
{
228+
btTypedConstraintWrapper *wrapper = new btTypedConstraintWrapper;
229+
wrapper->constraint = new btSliderConstraint(*bodyA->rigidBody, *bodyB->rigidBody, mat4x4_to_btTransform(frameInA), mat4x4_to_btTransform(frameInB), useLinearReferenceFrameA);
230+
return wrapper;
231+
}
232+
233+
btTypedConstraintWrapper *btGeneric6DofSpringConstraint_create(btRigidBodyWrapper *bodyA, btRigidBodyWrapper *bodyB, mat4x4 *frameInA, mat4x4 *frameInB, bool useLinearReferenceFrameA)
234+
{
235+
btTypedConstraintWrapper *wrapper = new btTypedConstraintWrapper;
236+
wrapper->constraint = new btGeneric6DofSpringConstraint(*bodyA->rigidBody, *bodyB->rigidBody, mat4x4_to_btTransform(frameInA), mat4x4_to_btTransform(frameInB), useLinearReferenceFrameA);
237+
return wrapper;
238+
}
239+
// btRigidBody & rbA, btRigidBody & rbB, const btTransform& frameInA, const btTransform& frameInB, RotateOrder rotOrder = RO_XYZ);
240+
btTypedConstraintWrapper *btGeneric6DofSpring2Constraint_create(btRigidBodyWrapper *bodyA, btRigidBodyWrapper *bodyB, mat4x4 *frameInA, mat4x4 *frameInB)
241+
{
242+
btTypedConstraintWrapper *wrapper = new btTypedConstraintWrapper;
243+
wrapper->constraint = new btGeneric6DofSpring2Constraint(*bodyA->rigidBody, *bodyB->rigidBody, mat4x4_to_btTransform(frameInA), mat4x4_to_btTransform(frameInB), RO_XYZ);
244+
return wrapper;
245+
}
246+
247+
void btGeneric6DofSpring2Constraint_setFrames(btTypedConstraintWrapper *constraint, mat4x4 *frameInA, mat4x4 *frameInB)
248+
{
249+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
250+
g6dof->setFrames(mat4x4_to_btTransform(frameInA), mat4x4_to_btTransform(frameInB));
251+
}
252+
253+
void btGeneric6DofSpring2Constraint_setLinearLowerLimit(btTypedConstraintWrapper *constraint, const vec3 *linearLower)
254+
{
255+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
256+
g6dof->setLinearLowerLimit(vec3_to_btVector3(linearLower));
257+
}
258+
259+
void btGeneric6DofSpring2Constraint_setLinearUpperLimit(btTypedConstraintWrapper *constraint, const vec3 *linearUpper)
260+
{
261+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
262+
g6dof->setLinearUpperLimit(vec3_to_btVector3(linearUpper));
263+
}
264+
265+
void btGeneric6DofSpring2Constraint_setAngularLowerLimit(btTypedConstraintWrapper *constraint, const vec3 *angularLower)
266+
{
267+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
268+
g6dof->setAngularLowerLimit(vec3_to_btVector3(angularLower));
269+
}
270+
void btGeneric6DofSpring2Constraint_setAngularLowerLimitReversed(btTypedConstraintWrapper *constraint, const vec3 *angularLower)
271+
{
272+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
273+
g6dof->setAngularLowerLimitReversed(vec3_to_btVector3(angularLower));
274+
}
275+
276+
void btGeneric6DofSpring2Constraint_setAngularUpperLimit(btTypedConstraintWrapper *constraint, const vec3 *angularUpper)
277+
{
278+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
279+
g6dof->setAngularUpperLimit(vec3_to_btVector3(angularUpper));
280+
}
281+
void btGeneric6DofSpring2Constraint_setAngularUpperLimitReversed(btTypedConstraintWrapper *constraint, const vec3 *angularUpper)
282+
{
283+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
284+
g6dof->setAngularUpperLimitReversed(vec3_to_btVector3(angularUpper));
285+
}
286+
287+
void btGeneric6DofSpring2Constraint_setLimit(btTypedConstraintWrapper *constraint, int axis, float lo, float hi)
288+
{
289+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
290+
g6dof->setLimit(axis, lo, hi);
291+
}
292+
void btGeneric6DofSpring2Constraint_setLimitReversed(btTypedConstraintWrapper *constraint, int axis, float lo, float hi)
293+
{
294+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
295+
g6dof->setLimitReversed(axis, lo, hi);
296+
}
297+
298+
void btGeneric6DofSpring2Constraint_setAxis(btTypedConstraintWrapper *constraint, vec3 *axis1, vec3 *axis2)
299+
{
300+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
301+
g6dof->setAxis(vec3_to_btVector3(axis1), vec3_to_btVector3(axis2));
302+
}
303+
304+
void btGeneric6DofSpring2Constraint_setBounce(btTypedConstraintWrapper *constraint, int index, float bounce)
305+
{
306+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
307+
g6dof->setBounce(index, bounce);
308+
}
309+
310+
void btGeneric6DofSpring2Constraint_enableMotor(btTypedConstraintWrapper *constraint, int index, bool onOff)
311+
{
312+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
313+
g6dof->enableMotor(index, onOff);
314+
}
315+
316+
void btGeneric6DofSpring2Constraint_setServo(btTypedConstraintWrapper *constraint, int index, bool onOff)
317+
{
318+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
319+
g6dof->setServo(index, onOff);
320+
}
321+
322+
void btGeneric6DofSpring2Constraint_setTargetVelocity(btTypedConstraintWrapper *constraint, int index, float velocity)
323+
{
324+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
325+
g6dof->setTargetVelocity(index, velocity);
326+
}
327+
328+
void btGeneric6DofSpring2Constraint_setServoTarget(btTypedConstraintWrapper *constraint, int index, float target)
329+
{
330+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
331+
g6dof->setServoTarget(index, target);
332+
}
333+
334+
void btGeneric6DofSpring2Constraint_setMaxMotorForce(btTypedConstraintWrapper *constraint, int index, float force)
335+
{
336+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
337+
g6dof->setMaxMotorForce(index, force);
338+
}
339+
340+
void btGeneric6DofSpring2Constraint_enableSpring(btTypedConstraintWrapper *constraint, int index, bool onOff)
341+
{
342+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
343+
g6dof->enableSpring(index, onOff);
344+
}
345+
346+
void btGeneric6DofSpring2Constraint_setStiffness(btTypedConstraintWrapper *constraint, int index, float stiffness, bool limitIfNeeded)
347+
{
348+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
349+
g6dof->setStiffness(index, stiffness, limitIfNeeded);
350+
}
351+
352+
void btGeneric6DofSpring2Constraint_setDamping(btTypedConstraintWrapper *constraint, int index, float damping, bool limitIfNeeded)
353+
{
354+
btGeneric6DofSpring2Constraint *g6dof = static_cast<btGeneric6DofSpring2Constraint *>(constraint->constraint);
355+
g6dof->setDamping(index, damping, limitIfNeeded);
356+
}
357+
358+
212359
/**
213360
* Rigid body
214361
*
@@ -259,6 +406,21 @@ void btRigidBody_setMass(btRigidBodyWrapper *body, float mass)
259406
body->rigidBody->setMassProps(mass, localInertia);
260407
}
261408

409+
void btRigidBody_setRestitution(btRigidBodyWrapper *body, float restitution) {
410+
body->rigidBody->setRestitution(restitution);
411+
}
412+
void btRigidBody_setFriction(btRigidBodyWrapper *body, float friction) {
413+
body->rigidBody->setFriction(friction);
414+
}
415+
void btRigidBody_setRollingFriction(btRigidBodyWrapper *body, float rollingFriction) {
416+
body->rigidBody->setRollingFriction(rollingFriction);
417+
}
418+
void btRigidBody_setSpinningFriction(btRigidBodyWrapper *body, float spinningFriction) {
419+
body->rigidBody->setSpinningFriction(spinningFriction);
420+
}
421+
void btRigidBody_setContactStiffnessAndDamping(btRigidBodyWrapper *body, float stiffness, float damping) {
422+
body->rigidBody->setContactStiffnessAndDamping(stiffness, damping);
423+
}
262424

263425
void btRigidBody_getPosition(btRigidBodyWrapper *bodyWrapper, vec3 *position) {
264426
btVector3 btPosition = bodyWrapper->rigidBody->getWorldTransform().getOrigin();

bullet3_bridge.h

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,52 @@ btCollisionShapeWrapper *btCollisionShape_create_static_plane(vec3 *normal, floa
5858
*/
5959
void btTypedConstraint_destroy(btTypedConstraintWrapper *constraint);
6060

61-
// point to point
61+
// -- Point to point
6262
btTypedConstraintWrapper *btPoint2PointConstraint_create(btRigidBodyWrapper *bodyA, btRigidBodyWrapper *bodyB, vec3 *pivotA, vec3 *pivotB);
6363

64-
// hinge
64+
// -- Hinge
6565
btTypedConstraintWrapper *btHingeConstraint_create(btRigidBodyWrapper *bodyA, btRigidBodyWrapper *bodyB, vec3 *pivotA, vec3 *pivotB, vec3 *axisA, vec3 *axisB);
6666

67+
void btHingeConstraint_setLimit(btTypedConstraintWrapper *constraint, float low, float high, float softness, float biasFactor, float relaxationFactor);
68+
69+
// -- Slider
70+
btTypedConstraintWrapper *btSliderConstraint_create(btRigidBodyWrapper *bodyA, btRigidBodyWrapper *bodyB, mat4x4 *frameInA, mat4x4 *frameInB, bool useLinearReferenceFrameA);
71+
72+
// -- Generic6DofSpring
73+
btTypedConstraintWrapper *btGeneric6DofSpringConstraint_create(btRigidBodyWrapper *bodyA, btRigidBodyWrapper *bodyB, mat4x4 *frameInA, mat4x4 *frameInB, bool useLinearReferenceFrameA);
74+
75+
// -- Generic6DofSpring2
76+
btTypedConstraintWrapper *btGeneric6DofSpring2Constraint_create(btRigidBodyWrapper *bodyA, btRigidBodyWrapper *bodyB, mat4x4 *frameInA, mat4x4 *frameInB);
77+
78+
void btGeneric6DofSpring2Constraint_setFrames(btTypedConstraintWrapper *constraint, mat4x4 *frameInA, mat4x4 *frameInB);
79+
80+
void btGeneric6DofSpring2Constraint_setLinearLowerLimit(btTypedConstraintWrapper *constraint, const vec3 *linearLower);
81+
82+
void btGeneric6DofSpring2Constraint_setLinearUpperLimit(btTypedConstraintWrapper *constraint, const vec3 *linearUpper);
83+
84+
void btGeneric6DofSpring2Constraint_setAngularLowerLimit(btTypedConstraintWrapper *constraint, const vec3 *angularLower);
85+
void btGeneric6DofSpring2Constraint_setAngularLowerLimitReversed(btTypedConstraintWrapper *constraint, const vec3 *angularLower);
86+
87+
void btGeneric6DofSpring2Constraint_setAngularUpperLimit(btTypedConstraintWrapper *constraint, const vec3 *angularUpper);
88+
void btGeneric6DofSpring2Constraint_setAngularUpperLimitReversed(btTypedConstraintWrapper *constraint, const vec3 *angularUpper);
89+
90+
void btGeneric6DofSpring2Constraint_setLimit(btTypedConstraintWrapper *constraint, int axis, float lo, float hi);
91+
void btGeneric6DofSpring2Constraint_setLimitReversed(btTypedConstraintWrapper *constraint, int axis, float lo, float hi);
92+
93+
void btGeneric6DofSpring2Constraint_setAxis(btTypedConstraintWrapper *constraint, vec3 *axis1, vec3 *axis2);
94+
95+
void btGeneric6DofSpring2Constraint_setBounce(btTypedConstraintWrapper *constraint, int index, float bounce);
96+
97+
void btGeneric6DofSpring2Constraint_enableMotor(btTypedConstraintWrapper *constraint, int index, bool onOff);
98+
void btGeneric6DofSpring2Constraint_setServo(btTypedConstraintWrapper *constraint, int index, bool onOff);
99+
void btGeneric6DofSpring2Constraint_setTargetVelocity(btTypedConstraintWrapper *constraint, int index, float velocity);
100+
void btGeneric6DofSpring2Constraint_setServoTarget(btTypedConstraintWrapper *constraint, int index, float target);
101+
void btGeneric6DofSpring2Constraint_setMaxMotorForce(btTypedConstraintWrapper *constraint, int index, float force);
102+
103+
void btGeneric6DofSpring2Constraint_enableSpring(btTypedConstraintWrapper *constraint, int index, bool onOff);
104+
void btGeneric6DofSpring2Constraint_setStiffness(btTypedConstraintWrapper *constraint, int index, float stiffness, bool limitIfNeeded);
105+
void btGeneric6DofSpring2Constraint_setDamping(btTypedConstraintWrapper *constraint, int index, float damping, bool limitIfNeeded);
106+
67107
/**
68108
* Rigid body
69109
*
@@ -76,6 +116,11 @@ void btRigidBody_destroy(btRigidBodyWrapper *body);
76116
void btRigidBody_setPosition(btRigidBodyWrapper *body, vec3 *position);
77117
void btRigidBody_setQuaternion(btRigidBodyWrapper *body, quat *quaternion);
78118
void btRigidBody_setMass(btRigidBodyWrapper *body, float mass);
119+
void btRigidBody_setRestitution(btRigidBodyWrapper *body, float restitution);
120+
void btRigidBody_setFriction(btRigidBodyWrapper *body, float friction);
121+
void btRigidBody_setRollingFriction(btRigidBodyWrapper *body, float friction);
122+
void btRigidBody_setSpinningFriction(btRigidBodyWrapper *body, float friction);
123+
void btRigidBody_setContactStiffnessAndDamping(btRigidBodyWrapper *body, float stiffness, float damping);
79124

80125
void btRigidBody_getPosition(btRigidBodyWrapper *bodyWrapper, vec3 *position);
81126
void btRigidBody_getLinearVelocity(btRigidBodyWrapper *bodyWrapper, vec3 *velocity);

0 commit comments

Comments
 (0)