/* Create physics sim representation of object given RigidBody settings * < rebuild: even if an instance already exists, replace it */ static void rigidbody_validate_sim_object(RigidBodyWorld *rbw, Object *ob, bool rebuild) { RigidBodyOb *rbo = (ob) ? ob->rigidbody_object : NULL; float loc[3]; float rot[4]; /* sanity checks: * - object doesn't have RigidBody info already: then why is it here? */ if (rbo == NULL) return; /* make sure collision shape exists */ /* FIXME we shouldn't always have to rebuild collision shapes when rebuilding objects, but it's needed for constraints to update correctly */ if (rbo->physics_shape == NULL || rebuild) rigidbody_validate_sim_shape(ob, true); if (rbo->physics_object && rebuild == false) { RB_dworld_remove_body(rbw->physics_world, rbo->physics_object); } if (!rbo->physics_object || rebuild) { /* remove rigid body if it already exists before creating a new one */ if (rbo->physics_object) { RB_body_delete(rbo->physics_object); } mat4_to_loc_quat(loc, rot, ob->obmat); rbo->physics_object = RB_body_new(rbo->physics_shape, loc, rot); RB_body_set_friction(rbo->physics_object, rbo->friction); RB_body_set_restitution(rbo->physics_object, rbo->restitution); RB_body_set_damping(rbo->physics_object, rbo->lin_damping, rbo->ang_damping); RB_body_set_sleep_thresh(rbo->physics_object, rbo->lin_sleep_thresh, rbo->ang_sleep_thresh); RB_body_set_activation_state(rbo->physics_object, rbo->flag & RBO_FLAG_USE_DEACTIVATION); if (rbo->type == RBO_TYPE_PASSIVE || rbo->flag & RBO_FLAG_START_DEACTIVATED) RB_body_deactivate(rbo->physics_object); RB_body_set_linear_factor(rbo->physics_object, (ob->protectflag & OB_LOCK_LOCX) == 0, (ob->protectflag & OB_LOCK_LOCY) == 0, (ob->protectflag & OB_LOCK_LOCZ) == 0); RB_body_set_angular_factor(rbo->physics_object, (ob->protectflag & OB_LOCK_ROTX) == 0, (ob->protectflag & OB_LOCK_ROTY) == 0, (ob->protectflag & OB_LOCK_ROTZ) == 0); RB_body_set_mass(rbo->physics_object, RBO_GET_MASS(rbo)); RB_body_set_kinematic_state(rbo->physics_object, rbo->flag & RBO_FLAG_KINEMATIC || rbo->flag & RBO_FLAG_DISABLED); } if (rbw && rbw->physics_world) RB_dworld_add_body(rbw->physics_world, rbo->physics_object, rbo->col_groups); }
static void rna_RigidBodyOb_restitution_set(PointerRNA *ptr, float value) { RigidBodyOb *rbo = (RigidBodyOb *)ptr->data; rbo->restitution = value; #ifdef WITH_BULLET if (rbo->physics_object) { RB_body_set_restitution(rbo->physics_object, value); } #endif }