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();
202 world->
dynamicsWorld->stepSimulation(timeStep, maxSubSteps, timeSubStep);
210 int maxSerializeBufferSize = 1024 * 1024 * 5;
215 FILE *file = fopen(filename,
"wb");
221 fprintf(stderr,
"RB_dworld_export: %s\n", strerror(errno));
233 object->col_groups = col_groups;
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]));
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);
384 value = 1.0f / value;
398 shape->calculateLocalInertia(value, localInertia);
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;
758 for (
int i = 0;
i < num_verts;
i++) {
759 float *vert = (
float *)(((
char *)vertices +
i * vert_stride));
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();
911 shape->
cshape->setMargin(value);
923 world->
dynamicsWorld->addConstraint(constraint, disable_collisions);
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);
1123 constraint->getRigidBodyA().removeConstraintRef(constraint);
1124 constraint->getRigidBodyB().removeConstraintRef(constraint);
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();
1255 constraint->setOverrideNumSolverIterations(num_solver_iterations);
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 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
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()
btTypedConstraint(btTypedConstraintType type, btRigidBody &rbA)
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
virtual btOverlappingPairCache * getOverlappingPairCache()=0
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
virtual void setOverlapFilterCallback(btOverlapFilterCallback *callback)=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)
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