97 collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0;
98 collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
107 vec[0] = (float)btvec[0];
108 vec[1] = (float)btvec[1];
109 vec[2] = (float)btvec[2];
113 quat[0] = btquat.
getW();
114 quat[1] = btquat.getX();
115 quat[2] = btquat.getY();
116 quat[3] = btquat.getZ();
137 world->pairCache->getOverlappingPairCache()->setOverlapFilterCallback(
world->filterCallback);
154 delete world->dynamicsWorld;
155 delete world->constraintSolver;
156 delete world->pairCache;
157 delete world->dispatcher;
158 delete world->collisionConfiguration;
159 delete world->filterCallback;
174 world->dynamicsWorld->setGravity(
btVector3(g_in[0], g_in[1], g_in[2]));
183 info.m_numIterations = num_solver_iterations;
192 info.m_splitImpulse = split_impulse;
202 world->dynamicsWorld->stepSimulation(timeStep, maxSubSteps, timeSubStep);
210 int maxSerializeBufferSize = 1024 * 1024 * 5;
213 world->dynamicsWorld->serialize(serializer);
215 FILE *
file = fopen(filename,
"wb");
221 fprintf(stderr,
"RB_dworld_export: %s\n", strerror(errno));
233 object->col_groups = col_groups;
235 world->dynamicsWorld->addRigidBody(body);
242 world->dynamicsWorld->removeRigidBody(body);
249 const float loc_start[3],
250 const float loc_end[3],
259 if (collisionShape->isConvex()) {
261 btVector3(loc_start[0], loc_start[1], loc_start[2]),
262 btVector3(loc_end[0], loc_end[1], loc_end[2]));
264 btQuaternion obRot = body->getWorldTransform().getRotation();
267 rayFromTrans.setIdentity();
268 rayFromTrans.setRotation(obRot);
269 rayFromTrans.setOrigin(
btVector3(loc_start[0], loc_start[1], loc_start[2]));
272 rayToTrans.setIdentity();
273 rayToTrans.setRotation(obRot);
274 rayToTrans.setOrigin(
btVector3(loc_end[0], loc_end[1], loc_end[2]));
276 world->dynamicsWorld->convexSweepTest(
282 v_location[0] =
result.m_convexFromWorld[0] +
283 (
result.m_convexToWorld[0] -
result.m_convexFromWorld[0]) *
284 result.m_closestHitFraction;
285 v_location[1] =
result.m_convexFromWorld[1] +
286 (
result.m_convexToWorld[1] -
result.m_convexFromWorld[1]) *
287 result.m_closestHitFraction;
288 v_location[2] =
result.m_convexFromWorld[2] +
289 (
result.m_convexToWorld[2] -
result.m_convexFromWorld[2]) *
290 result.m_closestHitFraction;
292 v_hitpoint[0] =
result.m_hitPointWorld[0];
293 v_hitpoint[1] =
result.m_hitPointWorld[1];
294 v_hitpoint[2] =
result.m_hitPointWorld[2];
296 v_normal[0] =
result.m_hitNormalWorld[0];
297 v_normal[1] =
result.m_hitNormalWorld[1];
298 v_normal[2] =
result.m_hitNormalWorld[2];
318 trans.setOrigin(
btVector3(loc[0], loc[1], loc[2]));
329 object->body->setUserPointer(
object);
366 body->setCollisionShape(shape->
cshape);
393 btVector3 localInertia(0, 0, 0);
398 shape->calculateLocalInertia(
value, localInertia);
401 btVector3 minAabb, maxAabb;
412 return body->getFriction();
418 body->setFriction(
value);
424 return body->getRestitution();
430 body->setRestitution(
value);
537 body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
540 body->setCollisionFlags(body->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT);
549 if (use_deactivation) {
583 trans.getOpenGLMatrix((
btScalar *)m_out);
594 trans.setOrigin(
btVector3(loc[0], loc[1], loc[2]));
607 cshape->setLocalScaling(
btVector3(scale[0], scale[1], scale[2]));
662 shape->
mesh =
nullptr;
672 shape->
mesh =
nullptr;
682 shape->
mesh =
nullptr;
692 shape->
mesh =
nullptr;
702 shape->
mesh =
nullptr;
711 const float *
verts,
int stride,
int count,
float margin,
bool *can_embed)
716 if (hull_computer.compute(
verts, stride,
count, margin, 0.0f) < 0.0f) {
717 hull_computer.compute(
verts, stride,
count, 0.0f, 0.0f);
725 shape->
cshape = hull_shape;
726 shape->
mesh =
nullptr;
742 mesh->num_vertices = num_verts;
750 delete mesh->index_array;
751 delete[]
mesh->vertices;
752 delete[]
mesh->triangles;
758 for (
int i = 0; i < num_verts; i++) {
759 float *vert = (
float *)(((
char *)vertices + i * vert_stride));
760 mesh->vertices[i].x = vert[0];
761 mesh->vertices[i].y = vert[1];
762 mesh->vertices[i].z = vert[2];
767 mesh->triangles[
num].v0 = index0;
768 mesh->triangles[
num].v1 = index1;
769 mesh->triangles[
num].v2 = index2;
775 (
int *)
mesh->triangles,
789 mesh->index_array,
true,
true);
799 const float *vertices,
809 for (
int i = 0; i < num_verts; i++) {
810 float *vert = (
float *)(((
char *)vertices + i * vert_stride));
834 shape->
cshape = gimpactShape;
848 shape->
cshape = compoundShape;
849 shape->
mesh =
nullptr;
863 trans.setOrigin(
btVector3(loc[0], loc[1], loc[2]));
867 compoundShape->addChildShape(trans, shape->
cshape);
906 return shape->
cshape->getMargin();
921 btTypedConstraint *constraint =
reinterpret_cast<btTypedConstraint *
>(con);
923 world->dynamicsWorld->addConstraint(constraint, disable_collisions);
928 btTypedConstraint *constraint =
reinterpret_cast<btTypedConstraint *
>(con);
930 world->dynamicsWorld->removeConstraint(constraint);
939 const float pivot[3],
943 pivot_transform.setIdentity();
944 pivot_transform.setOrigin(
btVector3(pivot[0], pivot[1], pivot[2]));
945 pivot_transform.setRotation(
btQuaternion(orn[1], orn[2], orn[3], orn[0]));
947 transform1 = body1->getWorldTransform().inverse() * pivot_transform;
948 transform2 = body2->getWorldTransform().inverse() * pivot_transform;
956 btVector3 pivot1 = body1->getWorldTransform().inverse() *
958 btVector3 pivot2 = body2->getWorldTransform().inverse() *
978 btFixedConstraint *con =
new btFixedConstraint(*body1, *body2, transform1, transform2);
1030 con->setUpperAngLimit(-1.0f);
1048 *body1, *body2, transform1, transform2,
true);
1066 *body1, *body2, transform1, transform2,
true);
1084 *body1, *body2, transform1, transform2);
1102 *body1, *body2, transform1, transform2,
true);
1105 for (
int i = 0; i < 6; i++) {
1106 con->setLimit(i, 0.0f, -1.0f);
1109 con->getTranslationalLimitMotor()->m_upperLimit.setValue(-1.0f, -1.0f, -1.0f);
1118 btTypedConstraint *constraint =
reinterpret_cast<btTypedConstraint *
>(con);
1123 constraint->getRigidBodyA().removeConstraintRef(constraint);
1124 constraint->getRigidBodyB().removeConstraintRef(constraint);
1133 btTypedConstraint *constraint =
reinterpret_cast<btTypedConstraint *
>(con);
1135 constraint->setEnabled(
enabled);
1143 float softness = 0.9f;
1144 float bias_factor = 0.3f;
1145 float relaxation_factor = 1.0f;
1147 constraint->setLimit(lower, upper, softness, bias_factor, relaxation_factor);
1154 constraint->setLowerLinLimit(lower);
1155 constraint->setUpperLinLimit(upper);
1159 rbConstraint *con,
float lin_lower,
float lin_upper,
float ang_lower,
float ang_upper)
1163 constraint->setLowerLinLimit(lin_lower);
1164 constraint->setUpperLinLimit(lin_upper);
1165 constraint->setLowerAngLimit(ang_lower);
1166 constraint->setUpperAngLimit(ang_upper);
1173 constraint->setLimit(axis, lower, upper);
1181 constraint->setLimit(axis, lower, upper);
1189 constraint->setStiffness(axis, stiffness);
1198 damping = (damping > 1.0f) ? 0.0f : 1.0f - damping;
1200 constraint->setDamping(axis, damping);
1208 constraint->enableSpring(axis, enable);
1216 constraint->setEquilibriumPoint();
1224 constraint->setStiffness(axis, stiffness);
1232 constraint->setDamping(axis, damping);
1240 constraint->enableSpring(axis, enable);
1248 constraint->setEquilibriumPoint();
1253 btTypedConstraint *constraint =
reinterpret_cast<btTypedConstraint *
>(con);
1255 constraint->setOverrideNumSolverIterations(num_solver_iterations);
1260 btTypedConstraint *constraint =
reinterpret_cast<btTypedConstraint *
>(con);
1262 constraint->setBreakingImpulseThreshold(threshold);
1269 constraint->getTranslationalLimitMotor()->m_enableMotor[0] = enable_lin;
1270 constraint->getRotationalLimitMotor(0)->m_enableMotor = enable_ang;
1274 float max_impulse_lin,
1275 float max_impulse_ang)
1279 constraint->getTranslationalLimitMotor()->m_maxMotorForce.setX(max_impulse_lin);
1280 constraint->getRotationalLimitMotor(0)->m_maxMotorForce = max_impulse_ang;
1289 constraint->getTranslationalLimitMotor()->m_targetVelocity.setX(velocity_lin);
1290 constraint->getRotationalLimitMotor(0)->m_targetVelocity = velocity_ang;
void BLI_kdtree_nd_ free(KDTree *tree)
ATTR_WARN_UNUSED_RESULT const size_t num
Rigid Body API for interfacing with external Physics Engines.
struct rbCollisionShape rbCollisionShape
struct rbMeshData rbMeshData
struct rbRigidBody rbRigidBody
struct rbDynamicsWorld rbDynamicsWorld
struct rbConstraint rbConstraint
btBoxShape(const btVector3 &boxHalfExtents)
@ GIMPACT_SHAPE_PROXYTYPE
Used for GIMPACT Trimesh integration.
@ SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE
btBvhTriangleMeshShape(btStridingMeshInterface *meshInterface, bool useQuantizedAabbCompression, bool buildBvh=true)
#define DISABLE_DEACTIVATION
void * getUserPointer() const
users can point to their objects, userPointer is not used by Bullet
btCollisionShape
The btCollisionShape class provides an interface for collision shapes that can be shared among btColl...
btCompoundShape(bool enableDynamicAabbTree=true, const int initialChildCapacity=0)
btConvexHullShape(const btScalar *points=0, int numPoints=0, int stride=sizeof(btVector3))
btConvexShape()
not supported on IBM SDK, until we fix the alignment of btVector3
btDefaultMotionState(const btTransform &startTrans=btTransform::getIdentity(), const btTransform ¢erOfMassOffset=btTransform::getIdentity())
btDiscreteDynamicsWorld(btDispatcher *dispatcher, btBroadphaseInterface *pairCache, btConstraintSolver *constraintSolver, btCollisionConfiguration *collisionConfiguration)
this btDiscreteDynamicsWorld constructor gets created objects from the user, and will not delete thos...
btGeneric6DofConstraint(btRigidBody &rbA, btRigidBody &rbB, const btTransform &frameInA, const btTransform &frameInB, bool useLinearReferenceFrameA)
btGeneric6DofSpring2Constraint(btRigidBody &rbA, btRigidBody &rbB, const btTransform &frameInA, const btTransform &frameInB, RotateOrder rotOrder=RO_XYZ)
btGeneric6DofSpringConstraint(btRigidBody &rbA, btRigidBody &rbB, const btTransform &frameInA, const btTransform &frameInB, bool useLinearReferenceFrameA)
btHingeConstraint(btRigidBody &rbA, btRigidBody &rbB, const btVector3 &pivotInA, const btVector3 &pivotInB, const btVector3 &axisInA, const btVector3 &axisInB, bool useReferenceFrameA=false)
btPoint2PointConstraint(btRigidBody &rbA, btRigidBody &rbB, const btVector3 &pivotInA, const btVector3 &pivotInB)
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScaledBvhTriangleMeshShape(btBvhTriangleMeshShape *childShape, const btVector3 &localScaling)
btSequentialImpulseConstraintSolver()
btSliderConstraint(btRigidBody &rbA, btRigidBody &rbB, const btTransform &frameInA, const btTransform &frameInB, bool useLinearReferenceFrameA)
btSphereShape(btScalar radius)
btTriangleIndexVertexArray()
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
btConeShapeZ implements a Cone shape, around the Z axis
btAlignedObjectArray< btVector3 > vertices
virtual int getCurrentBufferSize() const
virtual const unsigned char * getBufferPointer() const
static void registerAlgorithm(btCollisionDispatcher *dispatcher)
Use this function for register the algorithm externally.
This class manages a mesh supplied by the btStridingMeshInterface interface.
SIMD_FORCE_INLINE void updateBound()
performs refit operation
virtual void getWorldTransform(btTransform &worldTrans) const =0
virtual void setWorldTransform(const btTransform &worldTrans)=0
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
SIMD_FORCE_INLINE const btScalar & getW() const
void setLinearFactor(const btVector3 &linearFactor)
btScalar getLinearSleepingThreshold() const
void applyCentralForce(const btVector3 &force)
btScalar getInvMass() const
btScalar getAngularDamping() const
const btVector3 & getAngularVelocity() const
btMotionState * getMotionState()
int getNumConstraintRefs() const
void removeConstraintRef(btTypedConstraint *c)
void setSleepingThresholds(btScalar linear, btScalar angular)
void setMassProps(btScalar mass, const btVector3 &inertia)
btScalar getAngularSleepingThreshold() const
void setAngularFactor(const btVector3 &angFac)
SIMD_FORCE_INLINE const btCollisionShape * getCollisionShape() const
btScalar getLinearDamping() const
btTypedConstraint * getConstraintRef(int index)
void setAngularVelocity(const btVector3 &ang_vel)
void setDamping(btScalar lin_damping, btScalar ang_damping)
void setLinearVelocity(const btVector3 &lin_vel)
void updateInertiaTensor()
const btVector3 & getLinearVelocity() const
void RB_constraint_set_max_impulse_motor(rbConstraint *con, float max_impulse_lin, float max_impulse_ang)
float RB_body_get_angular_damping(rbRigidBody *object)
float RB_body_get_linear_damping(rbRigidBody *object)
void RB_dworld_set_solver_iterations(rbDynamicsWorld *world, int num_solver_iterations)
void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *object, int col_groups)
void RB_dworld_set_split_impulse(rbDynamicsWorld *world, int split_impulse)
rbCollisionShape * RB_shape_new_compound()
void RB_dworld_delete(rbDynamicsWorld *world)
void RB_constraint_set_stiffness_6dof_spring(rbConstraint *con, int axis, float stiffness)
void RB_body_set_restitution(rbRigidBody *object, float value)
rbCollisionShape * RB_shape_new_box(float x, float y, float z)
void RB_body_set_friction(rbRigidBody *object, float value)
void RB_body_set_mass(rbRigidBody *object, float value)
rbConstraint * RB_constraint_new_fixed(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
void RB_body_set_activation_state(rbRigidBody *object, int use_deactivation)
rbConstraint * RB_constraint_new_6dof_spring(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
void RB_dworld_add_constraint(rbDynamicsWorld *world, rbConstraint *con, int disable_collisions)
void RB_constraint_set_damping_6dof_spring(rbConstraint *con, int axis, float damping)
rbCollisionShape * RB_shape_new_gimpact_mesh(rbMeshData *mesh)
void RB_shape_delete(rbCollisionShape *shape)
void RB_body_delete(rbRigidBody *object)
rbCollisionShape * RB_shape_new_trimesh(rbMeshData *mesh)
rbConstraint * RB_constraint_new_slider(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
void RB_body_get_linear_velocity(rbRigidBody *object, float v_out[3])
void RB_constraint_set_enabled(rbConstraint *con, int enabled)
void RB_body_set_angular_sleep_thresh(rbRigidBody *object, float value)
void RB_constraint_set_stiffness_6dof_spring2(rbConstraint *con, int axis, float stiffness)
static void RB_trimesh_data_delete(rbMeshData *mesh)
void RB_constraint_set_equilibrium_6dof_spring(rbConstraint *con)
void RB_body_apply_central_force(rbRigidBody *object, const float v_in[3])
void RB_constraint_set_limits_slider(rbConstraint *con, float lower, float upper)
rbConstraint * RB_constraint_new_piston(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
void RB_body_set_angular_damping(rbRigidBody *object, float value)
void RB_constraint_set_breaking_threshold(rbConstraint *con, float threshold)
void RB_dworld_remove_constraint(rbDynamicsWorld *world, rbConstraint *con)
void RB_dworld_remove_body(rbDynamicsWorld *world, rbRigidBody *object)
void RB_world_convex_sweep_test(rbDynamicsWorld *world, rbRigidBody *object, const float loc_start[3], const float loc_end[3], float v_location[3], float v_hitpoint[3], float v_normal[3], int *r_hit)
void RB_constraint_set_enable_motor(rbConstraint *con, int enable_lin, int enable_ang)
void RB_body_get_orientation(rbRigidBody *object, float v_out[4])
void RB_body_set_linear_damping(rbRigidBody *object, float value)
void RB_dworld_set_gravity(rbDynamicsWorld *world, const float g_in[3])
void RB_compound_add_child_shape(rbCollisionShape *parentShape, rbCollisionShape *shape, const float loc[3], const float rot[4])
rbDynamicsWorld * RB_dworld_new(const float gravity[3])
void RB_trimesh_add_triangle_indices(rbMeshData *mesh, int num, int index0, int index1, int index2)
rbMeshData * RB_trimesh_data_new(int num_tris, int num_verts)
void RB_trimesh_add_vertices(rbMeshData *mesh, float *vertices, int num_verts, int vert_stride)
void RB_constraint_set_limits_6dof_spring2(rbConstraint *con, int axis, float lower, float upper)
rbConstraint * RB_constraint_new_6dof(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
float RB_body_get_mass(rbRigidBody *object)
void RB_constraint_set_solver_iterations(rbConstraint *con, int num_solver_iterations)
rbCollisionShape * RB_shape_new_cylinder(float radius, float height)
static void make_constraint_transforms(btTransform &transform1, btTransform &transform2, btRigidBody *body1, btRigidBody *body2, const float pivot[3], const float orn[4])
void RB_constraint_set_damping_6dof_spring2(rbConstraint *con, int axis, float damping)
void RB_constraint_delete(rbConstraint *con)
void RB_body_set_collision_shape(rbRigidBody *object, rbCollisionShape *shape)
static void copy_quat_btquat(float quat[4], const btQuaternion &btquat)
void RB_body_set_scale(rbRigidBody *object, const float scale[3])
void RB_body_set_damping(rbRigidBody *object, float linear, float angular)
void RB_body_get_angular_velocity(rbRigidBody *object, float v_out[3])
void RB_shape_trimesh_update(rbCollisionShape *shape, const float *vertices, int num_verts, int vert_stride, const float min[3], const float max[3])
void RB_constraint_set_spring_6dof_spring(rbConstraint *con, int axis, int enable)
void RB_shape_set_margin(rbCollisionShape *shape, float value)
void RB_body_set_linear_sleep_thresh(rbRigidBody *object, float value)
rbRigidBody * RB_body_new(rbCollisionShape *shape, const float loc[3], const float rot[4])
void RB_body_set_linear_velocity(rbRigidBody *object, const float v_in[3])
void RB_body_deactivate(rbRigidBody *object)
void RB_body_set_kinematic_state(rbRigidBody *object, int kinematic)
rbConstraint * RB_constraint_new_6dof_spring2(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
rbConstraint * RB_constraint_new_hinge(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
void RB_trimesh_finish(rbMeshData *mesh)
void RB_body_get_position(rbRigidBody *object, float v_out[3])
rbCollisionShape * RB_shape_new_convex_hull(const float *verts, int stride, int count, float margin, bool *can_embed)
void RB_dworld_export(rbDynamicsWorld *world, const char *filename)
rbConstraint * RB_constraint_new_point(const float pivot[3], rbRigidBody *rb1, rbRigidBody *rb2)
float RB_shape_get_margin(rbCollisionShape *shape)
rbCollisionShape * RB_shape_new_cone(float radius, float height)
void RB_constraint_set_limits_piston(rbConstraint *con, float lin_lower, float lin_upper, float ang_lower, float ang_upper)
static void copy_v3_btvec3(float vec[3], const btVector3 &btvec)
void RB_dworld_get_gravity(rbDynamicsWorld *world, float g_out[3])
void RB_body_get_transform_matrix(rbRigidBody *object, float m_out[4][4])
void RB_constraint_set_limits_6dof(rbConstraint *con, int axis, float lower, float upper)
void RB_body_set_loc_rot(rbRigidBody *object, const float loc[3], const float rot[4])
void RB_constraint_set_limits_hinge(rbConstraint *con, float lower, float upper)
void RB_constraint_set_target_velocity_motor(rbConstraint *con, float velocity_lin, float velocity_ang)
float RB_body_get_friction(rbRigidBody *object)
void RB_body_set_angular_velocity(rbRigidBody *object, const float v_in[3])
rbCollisionShape * RB_shape_new_sphere(float radius)
void RB_body_activate(rbRigidBody *object)
void RB_body_set_linear_factor(rbRigidBody *object, float x, float y, float z)
void RB_body_set_sleep_thresh(rbRigidBody *object, float linear, float angular)
void RB_dworld_step_simulation(rbDynamicsWorld *world, float timeStep, int maxSubSteps, float timeSubStep)
void RB_constraint_set_equilibrium_6dof_spring2(rbConstraint *con)
rbCollisionShape * RB_shape_new_capsule(float radius, float height)
float RB_body_get_linear_sleep_thresh(rbRigidBody *object)
rbConstraint * RB_constraint_new_motor(float pivot[3], float orn[4], rbRigidBody *rb1, rbRigidBody *rb2)
void RB_body_get_scale(rbRigidBody *object, float v_out[3])
void RB_constraint_set_spring_6dof_spring2(rbConstraint *con, int axis, int enable)
void RB_body_set_angular_factor(rbRigidBody *object, float x, float y, float z)
float RB_body_get_angular_sleep_thresh(rbRigidBody *object)
float RB_body_get_restitution(rbRigidBody *object)
size_t num_triangles() const
rbCollisionShape ** compoundChildShapes
btCollisionShape * cshape
btBroadphaseInterface * pairCache
btConstraintSolver * constraintSolver
btDefaultCollisionConfiguration * collisionConfiguration
btDiscreteDynamicsWorld * dynamicsWorld
btOverlapFilterCallback * filterCallback
btDispatcher * dispatcher
bool needBroadphaseCollision(btBroadphaseProxy *proxy0, btBroadphaseProxy *proxy1) const override
btTriangleIndexVertexArray * index_array