93 scene->rigidbody_world =
nullptr;
105 if (object->rigidbody_constraint) {
152 if (rbo ==
nullptr) {
169 for (
Scene *scene =
static_cast<Scene *
>(
G_MAIN->scenes.first); scene !=
nullptr;
170 scene =
static_cast<Scene *
>(scene->id.next))
202 if (rbc ==
nullptr) {
301 if (rigidbody_world !=
nullptr) {
302 bool need_objects_update =
false;
303 bool need_constraints_update =
false;
308 need_objects_update =
true;
314 need_constraints_update =
true;
319 (need_objects_update || need_constraints_update))
324 if (need_objects_update) {
327 if (need_constraints_update) {
340static const Mesh *rigidbody_get_mesh(
Object *ob)
368 const Mesh *mesh =
nullptr;
369 const float(*positions)[3] =
nullptr;
373 mesh = rigidbody_get_mesh(ob);
374 positions = (
mesh) ?
reinterpret_cast<const float(*)[3]
>(mesh->vert_positions().data()) :
376 totvert = (
mesh) ? mesh->verts_num : 0;
379 CLOG_ERROR(&
LOG,
"cannot make Convex Hull collision shape for non-Mesh object");
384 (
float *)positions,
sizeof(
float[3]), totvert, margin, can_embed);
387 CLOG_ERROR(&
LOG,
"no vertices to define Convex Hull collision shape with");
401 const Mesh *mesh = rigidbody_get_mesh(ob);
402 if (mesh ==
nullptr) {
407 const int totvert = mesh->verts_num;
409 const int tottri = corner_tris.
size();
413 if ((totvert == 0) || (tottri == 0)) {
415 &
LOG,
"no geometry data converted for Mesh Collision Shape (ob = %s)", ob->
id.
name + 2);
429 if (positions.data()) {
430 for (i = 0; i < tottri; i++) {
435 vtri[0] = corner_verts[tri[0]];
436 vtri[1] = corner_verts[tri[1]];
437 vtri[2] = corner_verts[tri[2]];
463 CLOG_ERROR(&
LOG,
"cannot make Triangular Mesh collision shape for non-Mesh object");
476 float size[3] = {1.0f, 1.0f, 1.0f};
479 float capsule_height;
480 float hull_margin = 0.0f;
481 bool can_embed =
true;
485 if (rbo ==
nullptr) {
503 radius = std::max(size[0], size[1]);
508 radius = std::max({size[0], size[1], size[2]});
512 switch (rbo->
shape) {
522 capsule_height = (height - radius) * 2.0f;
534 has_volume = (std::min({size[0], size[1], size[2]}) > 0.0f);
539 new_shape = rigidbody_get_shape_convexhull_from_mesh(ob, hull_margin, &can_embed);
541 rbo->
margin = (can_embed && has_volume) ?
547 new_shape = rigidbody_get_shape_trimesh_from_mesh(ob);
552 float loc[3],
rot[4];
556 if (childObject->parent == ob) {
557 childShape = rigidbody_validate_sim_shape_helper(rbw, childObject);
570 if (new_shape ==
nullptr) {
589 if (rbo ==
nullptr) {
605 new_shape = rigidbody_validate_sim_shape_helper(rbw, ob);
622 float size[3] = {1.0f, 1.0f, 1.0f};
639 radius = std::max(size[0], size[1]) * 0.5f;
644 radius =
max_fff(size[0], size[1], size[2]) * 0.5f;
648 switch (rbo->
shape) {
650 volume = size[0] * size[1] * size[2];
654 volume = 4.0f / 3.0f *
float(
M_PI) * radius * radius * radius;
660 volume =
float(
M_PI) * radius * radius * height;
664 volume =
float(
M_PI) / 3.0f * radius * radius * height;
670 const Mesh *mesh = rigidbody_get_mesh(ob);
671 if (mesh ==
nullptr) {
679 if (!positions.is_empty() && !corner_tris.
is_empty()) {
688 volume *=
fabsf(volume_scale);
694 volume = size[0] * size[1] * size[2];
710 float size[3] = {1.0f, 1.0f, 1.0f};
725 switch (rbo->
shape) {
738 r_center[2] = -0.25f * height;
744 const Mesh *mesh = rigidbody_get_mesh(ob);
745 if (mesh ==
nullptr) {
752 if (!positions.is_empty() && !corner_tris.
is_empty()) {
757 mesh->corner_verts().data(),
783 if (rbo ==
nullptr) {
791 rigidbody_validate_sim_shape(rbw, ob,
true);
858static void rigidbody_constraint_init_spring(
RigidBodyCon *rbc,
921static void rigidbody_constraint_set_limits(
RigidBodyCon *rbc,
1004 if (rbc ==
nullptr) {
1037 switch (rbc->
type) {
1096 rigidbody_constraint_init_spring(rbc,
1109 rigidbody_constraint_init_spring(rbc,
1184 if (rbw ==
nullptr) {
1214 if (scene ==
nullptr) {
1268 rigidbody_update_ob_array(rbw_copy);
1304 if (ob ==
nullptr) {
1429 if (rbw->
group !=
nullptr) {
1431 if (object->type !=
OB_MESH || object->rigidbody_object !=
nullptr) {
1446 if (object->rigidbody_constraint !=
nullptr) {
1459 scene =
static_cast<Scene *
>(scene->id.next))
1463 if (rbw ==
nullptr) {
1467 if (rbw->
group == collection && object->type ==
OB_MESH && object->rigidbody_object ==
nullptr)
1471 if (rbw->
constraints == collection && object->rigidbody_constraint ==
nullptr) {
1484 if (scene ==
nullptr) {
1488 return scene->rigidbody_world;
1491static bool rigidbody_add_object_to_scene(
Main *bmain,
Scene *scene,
Object *ob)
1495 if (rbw ==
nullptr) {
1497 if (rbw ==
nullptr) {
1502 scene->rigidbody_world = rbw;
1505 if (rbw->
group ==
nullptr) {
1520static bool rigidbody_add_constraint_to_scene(
Main *bmain,
Scene *scene,
Object *ob)
1524 if (rbw ==
nullptr) {
1526 if (rbw ==
nullptr) {
1531 scene->rigidbody_world = rbw;
1554 scene =
static_cast<Scene *
>(scene->id.next))
1557 rigidbody_add_object_to_scene(bmain, scene, ob);
1564 scene =
static_cast<Scene *
>(scene->id.next))
1567 rigidbody_add_constraint_to_scene(bmain, scene, ob);
1581 if (!rigidbody_add_object_to_scene(bmain, scene, ob)) {
1620 if (obt && obt->rigidbody_constraint) {
1621 rbc = obt->rigidbody_constraint;
1622 if (rbc->
ob1 == ob) {
1626 if (rbc->
ob2 == ob) {
1669 if (rbw !=
nullptr) {
1696 if (rbw->
group ==
nullptr) {
1706 if (object->parent ==
nullptr || object->parent->rigidbody_object ==
nullptr ||
1723 if (object->parent ==
nullptr || object->parent->rigidbody_object ==
nullptr ||
1735 float adj_gravity[3];
1739 copy_v3_v3(adj_gravity, scene->physics_settings.gravity);
1751 rigidbody_update_ob_array(rbw);
1770 const float(*positions)[3] =
reinterpret_cast<const float(*)[3]
>(
1771 mesh->vert_positions().data());
1772 int totvert = mesh->verts_num;
1786 float new_scale[3], old_scale[3];
1797 std::min({new_scale[0], new_scale[1], new_scale[2]}));
1819static void rigidbody_update_simulation(Depsgraph *
depsgraph,
1833 rigidbody_update_sim_world(scene, rbw);
1862 if (rbo ==
nullptr) {
1864 "Evaluated object part of RBW object collection without RB object data, "
1865 "should not happen.\n");
1871 rigidbody_validate_sim_object(rbw, ob,
true);
1884 rigidbody_validate_sim_object(rbw, ob,
true);
1887 rigidbody_validate_sim_object(rbw, ob,
false);
1892 rigidbody_validate_sim_shape(rbw, ob,
true);
1906 rigidbody_update_sim_ob(
depsgraph, ob, rbo);
1922 if (rbc ==
nullptr) {
1925 "Evaluated object part of RBW constraints collection without RB constraint data, "
1926 "should not happen.\n");
1931 rigidbody_validate_sim_constraint(rbw, ob,
true);
1939 rigidbody_validate_sim_constraint(rbw, ob,
true);
1942 rigidbody_validate_sim_constraint(rbw, ob,
false);
1945 rbc->
flag &= ~RBC_FLAG_NEEDS_VALIDATE;
1950struct KinematicSubstepData {
1964 ListBase substep_targets = {
nullptr,
nullptr};
1974 float loc[3],
rot[4], scale[3];
1976 KinematicSubstepData *data =
static_cast<KinematicSubstepData *
>(
1977 MEM_callocN(
sizeof(KinematicSubstepData),
"RigidBody Substep data"));
1995 data->scale_changed = !
compare_size_v3v3(data->old_scale, data->new_scale, 0.001f);
2003 return substep_targets;
2006static void rigidbody_update_kinematic_obj_substep(
ListBase *substep_targets,
float interp_fac)
2009 KinematicSubstepData *data =
static_cast<KinematicSubstepData *
>(link->data);
2012 float loc[3],
rot[4];
2020 if (!data->scale_changed) {
2027 interp_v3_v3v3(scale, data->old_scale, data->new_scale, interp_fac);
2039static void rigidbody_update_external_forces(Depsgraph *
depsgraph,
2062 float eff_force[3] = {0.0f, 0.0f, 0.0f};
2063 float eff_loc[3], eff_vel[3];
2079 effectors,
nullptr, effector_weights, &epoint, eff_force,
nullptr,
nullptr);
2081 printf(
"\tapplying force (%f,%f,%f) to '%s'\n",
2095 printf(
"\tno forces to apply to '%s'\n", ob->
id.
name + 2);
2106static void rigidbody_free_substep_data(
ListBase *substep_targets)
2109 KinematicSubstepData *data =
static_cast<KinematicSubstepData *
>(link->data);
2158 float mat[4][4], size_mat[4][4], size[3];
2177 Object *ob,
float loc[3],
float rot[3],
float quat[4],
float rotAxis[3],
float rotAngle)
2186 if (correct_delta) {
2194 if (correct_delta) {
2210 if (correct_delta) {
2224 if (correct_delta) {
2260 int startframe, endframe;
2272 if (object->parent ==
nullptr || object->parent->rigidbody_object ==
nullptr ||
2284 if (ctime == startframe + 1 && rbw->
ltime == startframe) {
2287 rigidbody_update_simulation(
depsgraph, scene, rbw,
true);
2290 cache->
flag &= ~PTCACHE_REDO_NEEDED;
2300 int startframe, endframe;
2306 if (ctime <= startframe) {
2307 rbw->
ltime = startframe;
2311 if (ctime > endframe) {
2319 if (rbw->
objects ==
nullptr) {
2320 rigidbody_update_ob_array(rbw);
2346 const float frame_diff = ctime - rbw->
ltime;
2352 ListBase kinematic_substep_targets = rigidbody_create_substep_data(rbw);
2355 float cur_interp_val = interp_step;
2358 rigidbody_update_simulation(
depsgraph, scene, rbw,
false);
2361 rigidbody_update_external_forces(
depsgraph, scene, rbw);
2362 rigidbody_update_kinematic_obj_substep(&kinematic_substep_targets, cur_interp_val);
2365 cur_interp_val += interp_step;
2367 rigidbody_free_substep_data(&kinematic_substep_targets);
2369 rigidbody_update_simulation_post_step(
depsgraph, rbw);
2383# if defined(__GNUC__) || defined(__clang__)
2384# pragma GCC diagnostic push
2385# pragma GCC diagnostic ignored "-Wunused-parameter"
2386# elif defined(_MSC_VER)
2388# pragma warning(disable : 4100)
2441 Object *ob,
float loc[3],
float rot[3],
float quat[4],
float rotAxis[3],
float rotAngle)
2457# if defined(__GNUC__) || defined(__clang__)
2458# pragma GCC diagnostic pop
bool BKE_collection_object_remove(Main *bmain, Collection *collection, Object *ob, bool free_us)
#define FOREACH_COLLECTION_OBJECT_RECURSIVE_END
Collection * BKE_collection_add(Main *bmain, Collection *collection_parent, const char *name_custom)
bool BKE_collection_has_object(Collection *collection, const Object *ob)
#define FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(_collection, _object)
bool BKE_collection_object_add(Main *bmain, Collection *collection, Object *ob)
struct EffectorWeights * BKE_effector_add_weights(struct Collection *collection)
void BKE_effectors_free(struct ListBase *lb)
void BKE_effectors_apply(struct ListBase *effectors, struct ListBase *colliders, struct EffectorWeights *weights, struct EffectedPoint *point, float *force, float *wind_force, float *impulse)
struct ListBase * BKE_effectors_create(struct Depsgraph *depsgraph, struct Object *ob_src, struct ParticleSystem *psys_src, struct EffectorWeights *weights, bool use_rotation)
void pd_point_from_loc(struct Scene *scene, float *loc, float *vel, int index, struct EffectedPoint *point)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Base * BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
@ LIB_ID_COPY_SET_COPIED_ON_WRITE
@ LIB_ID_CREATE_NO_USER_REFCOUNT
@ LIB_ID_CREATE_NO_DEG_TAG
@ LIB_ID_COPY_RIGID_BODY_NO_COLLECTION_HANDLING
void BKE_mesh_calc_volume(const float(*vert_positions)[3], int mverts_num, const blender::int3 *corner_tris, int corner_tris_num, const int *corner_verts, float *r_volume, float r_center[3])
General operations, lookup, etc. for blender objects.
void BKE_object_matrix_local_get(Object *ob, float r_mat[4][4])
void BKE_object_dimensions_get(Object *ob, float r_vec[3])
Mesh * BKE_object_get_evaluated_mesh(const Object *object_eval)
const Mesh * BKE_object_get_mesh_deform_eval(const Object *object)
std::optional< blender::Bounds< blender::float3 > > BKE_object_boundbox_get(const Object *ob)
struct PointCache * BKE_ptcache_copy_list(struct ListBase *ptcaches_new, const struct ListBase *ptcaches_old, int flag)
void BKE_ptcache_id_time(PTCacheID *pid, struct Scene *scene, float cfra, int *startframe, int *endframe, float *timescale)
void BKE_ptcache_id_from_rigidbody(PTCacheID *pid, struct Object *ob, struct RigidBodyWorld *rbw)
void BKE_ptcache_validate(struct PointCache *cache, int framenr)
struct PointCache * BKE_ptcache_add(struct ListBase *ptcaches)
int BKE_ptcache_read(PTCacheID *pid, float cfra, bool no_extrapolate_old)
int BKE_ptcache_write(PTCacheID *pid, unsigned int cfra)
void BKE_ptcache_free_list(struct ListBase *ptcaches)
#define PTCACHE_RESET_OUTDATED
int BKE_ptcache_id_reset(struct Scene *scene, PTCacheID *pid, int mode)
#define PTCACHE_READ_EXACT
void BKE_report(ReportList *reports, eReportType type, const char *message)
API for Blender-side Rigid Body stuff.
#define RBO_GET_MASS(rbo)
#define RBO_GET_MARGIN(rbo)
void(* RigidbodyWorldIDFunc)(struct RigidBodyWorld *rbw, struct ID **idpoin, void *userdata, int cb_flag)
bool BKE_scene_check_rigidbody_active(const Scene *scene)
bool BKE_scene_object_find(Scene *scene, Object *ob)
#define BLI_assert_msg(a, msg)
void BLI_kdtree_nd_ free(KDTree *tree)
#define LISTBASE_FOREACH(type, var, list)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
struct LinkData * BLI_genericNodeN(void *data)
MINLINE float max_fff(float a, float b, float c)
MINLINE int compare_ff_relative(float a, float b, float max_diff, int max_ulps)
float mat4_to_volume_scale(const float mat[4][4])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mat4_decompose(float loc[3], float quat[4], float size[3], const float wmat[4][4])
void size_to_mat4(float R[4][4], const float size[3])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void mat4_to_loc_quat(float loc[3], float quat[4], const float wmat[4][4])
void mat4_to_size(float size[3], const float M[4][4])
void interp_qt_qtqt(float q[4], const float a[4], const float b[4], float t)
void axis_angle_to_quat(float r[4], const float axis[3], float angle)
float normalize_qt(float q[4])
void quat_to_mat4(float m[4][4], const float q[4])
void eulO_to_quat(float q[4], const float e[3], short order)
void mul_qt_qtqt(float q[4], const float a[4], const float b[4])
void copy_qt_qt(float q[4], const float a[4])
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
MINLINE bool is_zero_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE bool compare_size_v3v3(const float v1[3], const float v2[3], float limit) ATTR_WARN_UNUSED_RESULT
#define CLOG_ERROR(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_debug_print_eval_time(Depsgraph *depsgraph, const char *function_name, const char *object_name, const void *object_address, float time)
bool DEG_is_active(const Depsgraph *depsgraph)
void DEG_relations_tag_update(Main *bmain)
float DEG_get_ctime(const Depsgraph *graph)
ViewLayer * DEG_get_input_view_layer(const Depsgraph *graph)
Scene * DEG_get_input_scene(const Depsgraph *graph)
ID and Library types, which are fundamental for SDNA.
#define ID_REAL_USERS(id)
Object groups, one object can be in many groups at once.
Object is a sort of wrapper for general info.
Types and defines for representing Rigid Body entities.
@ RBW_FLAG_USE_SPLIT_IMPULSE
@ RBO_FLAG_START_DEACTIVATED
@ RBO_FLAG_NEEDS_VALIDATE
@ RBO_FLAG_USE_DEACTIVATION
@ RBC_FLAG_NEEDS_VALIDATE
@ RBC_FLAG_USE_SPRING_ANG_Y
@ RBC_FLAG_USE_SPRING_ANG_X
@ RBC_FLAG_USE_LIMIT_ANG_X
@ RBC_FLAG_USE_LIMIT_LIN_Y
@ RBC_FLAG_USE_LIMIT_ANG_Y
@ RBC_FLAG_DISABLE_COLLISIONS
@ RBC_FLAG_OVERRIDE_SOLVER_ITERATIONS
@ RBC_FLAG_USE_LIMIT_LIN_X
@ RBC_FLAG_USE_SPRING_ANG_Z
@ RBC_FLAG_USE_LIMIT_LIN_Z
@ RBC_FLAG_USE_LIMIT_ANG_Z
#define BASE_SELECTED(v3d, base)
Read Guarded memory(de)allocation.
Rigid Body API for interfacing with external Physics Engines.
struct rbConstraint rbConstraint
static btDbvtVolume bounds(btDbvtNode **leaves, int count)
constexpr const T * data() const
constexpr int64_t size() const
constexpr bool is_empty() const
const Depsgraph * depsgraph
draw_view in_light_buf[] float
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_dupallocN)(const void *vmemh)
void RB_constraint_set_max_impulse_motor(rbConstraint *con, float max_impulse_lin, float max_impulse_ang)
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_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)
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_constraint_set_stiffness_6dof_spring2(rbConstraint *con, int axis, float stiffness)
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_constraint_set_breaking_threshold(rbConstraint *con, float threshold)
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_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)
void RB_constraint_set_solver_iterations(rbConstraint *con, int num_solver_iterations)
rbCollisionShape * RB_shape_new_cylinder(float radius, float height)
void RB_constraint_set_damping_6dof_spring2(rbConstraint *con, int axis, float damping)
void RB_body_set_collision_shape(rbRigidBody *object, rbCollisionShape *shape)
void RB_body_set_scale(rbRigidBody *object, const float scale[3])
void RB_body_set_damping(rbRigidBody *object, float linear, float angular)
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)
rbRigidBody * RB_body_new(rbCollisionShape *shape, const float loc[3], const float rot[4])
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)
rbConstraint * RB_constraint_new_point(const float pivot[3], rbRigidBody *rb1, rbRigidBody *rb2)
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)
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)
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)
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)
RigidBodyWorld * BKE_rigidbody_world_copy(RigidBodyWorld *rbw, const int flag)
void BKE_rigidbody_free_world(Scene *scene)
void BKE_rigidbody_validate_sim_world(Scene *scene, RigidBodyWorld *rbw, bool rebuild)
void BKE_rigidbody_object_sync_transforms(Depsgraph *depsgraph, Scene *scene, Object *ob)
void BKE_rigidbody_objects_collection_validate(Main *bmain, Scene *scene, RigidBodyWorld *rbw)
void BKE_rigidbody_remove_constraint(Main *bmain, Scene *scene, Object *ob, const bool free_us)
void BKE_rigidbody_world_id_loop(RigidBodyWorld *rbw, RigidbodyWorldIDFunc func, void *userdata)
void BKE_rigidbody_main_collection_object_add(Main *bmain, Collection *collection, Object *object)
static void RB_dworld_remove_body(void *, void *)
void BKE_rigidbody_object_copy(Main *bmain, Object *ob_dst, const Object *ob_src, const int flag)
void BKE_rigidbody_sync_transforms(RigidBodyWorld *rbw, Object *ob, float ctime)
void BKE_rigidbody_cache_reset(RigidBodyWorld *rbw)
void BKE_rigidbody_free_constraint(Object *ob)
void BKE_rigidbody_calc_center_of_mass(Object *ob, float r_center[3])
void BKE_rigidbody_rebuild_world(Depsgraph *depsgraph, Scene *scene, float ctime)
static void RB_dworld_remove_constraint(void *, void *)
static void RB_body_delete(void *)
bool BKE_rigidbody_add_object(Main *bmain, Scene *scene, Object *ob, int type, ReportList *reports)
void BKE_rigidbody_eval_simulation(Depsgraph *depsgraph, Scene *scene)
RigidBodyWorld * BKE_rigidbody_create_world(Scene *scene)
RigidBodyOb * BKE_rigidbody_create_object(Scene *scene, Object *ob, short type)
bool BKE_rigidbody_is_affected_by_simulation(Object *ob)
void BKE_rigidbody_ensure_local_object(Main *bmain, Object *ob)
void BKE_rigidbody_remove_object(Main *bmain, Scene *scene, Object *ob, const bool free_us)
bool BKE_rigidbody_check_sim_running(RigidBodyWorld *rbw, float ctime)
static void RB_dworld_delete(void *)
static void RB_shape_delete(void *)
RigidBodyWorld * BKE_rigidbody_get_world(Scene *scene)
void BKE_rigidbody_free_object(Object *ob, RigidBodyWorld *rbw)
void BKE_rigidbody_rebuild_sim(Depsgraph *depsgraph, Scene *scene)
RigidBodyCon * BKE_rigidbody_create_constraint(Scene *scene, Object *ob, short type)
void BKE_rigidbody_do_simulation(Depsgraph *depsgraph, Scene *scene, float ctime)
void BKE_rigidbody_calc_volume(Object *ob, float *r_vol)
void BKE_rigidbody_constraints_collection_validate(Scene *scene, RigidBodyWorld *rbw)
static void RB_constraint_delete(void *)
void BKE_rigidbody_aftertrans_update(Object *ob, float loc[3], float rot[3], float quat[4], float rotAxis[3], float rotAngle)
void BKE_rigidbody_world_groups_relink(RigidBodyWorld *rbw)
struct Collection * group
ObjectRuntimeHandle * runtime
struct RigidBodyOb * rigidbody_object
struct RigidBodyCon * rigidbody_constraint
float motor_lin_target_velocity
float motor_ang_max_impulse
float spring_stiffness_ang_z
float motor_ang_target_velocity
short num_solver_iterations
float spring_damping_ang_z
float spring_damping_ang_y
float motor_lin_max_impulse
float spring_damping_ang_x
float spring_stiffness_ang_y
void * physics_constraint
float spring_stiffness_ang_x
struct RigidBodyOb_Shared * shared
struct PointCache * pointcache
struct Collection * constraints
short num_solver_iterations
struct Collection * group
struct RigidBodyWorld_Shared * shared
struct EffectorWeights * effector_weights