void BKE_rigidbody_remove_object(Scene *scene, Object *ob) { RigidBodyWorld *rbw = scene->rigidbody_world; RigidBodyOb *rbo = ob->rigidbody_object; RigidBodyCon *rbc; GroupObject *go; int i; if (rbw) { /* remove from rigidbody world, free object won't do this */ if (rbw->physics_world && rbo->physics_object) RB_dworld_remove_body(rbw->physics_world, rbo->physics_object); /* remove object from array */ if (rbw && rbw->objects) { for (i = 0; i < rbw->numbodies; i++) { if (rbw->objects[i] == ob) { rbw->objects[i] = NULL; break; } } } /* remove object from rigid body constraints */ if (rbw->constraints) { for (go = rbw->constraints->gobject.first; go; go = go->next) { Object *obt = go->ob; if (obt && obt->rigidbody_constraint) { rbc = obt->rigidbody_constraint; if (rbc->ob1 == ob) { BKE_rigidbody_remove_constraint(scene, obt); } if (rbc->ob2 == ob) { BKE_rigidbody_remove_constraint(scene, obt); } } } } } /* remove object's settings */ BKE_rigidbody_free_object(ob); /* flag cache as outdated */ BKE_rigidbody_cache_reset(rbw); }
void ED_rigidbody_constraint_remove(Scene *scene, Object *ob) { RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene); BKE_rigidbody_remove_constraint(scene, ob); if (rbw) BKE_group_object_unlink(rbw->constraints, ob, scene, NULL); DAG_id_tag_update(&ob->id, OB_RECALC_OB); }
void BKE_scene_base_unlink(Scene *sce, Base *base) { /* remove rigid body constraint from world before removing object */ if (base->object->rigidbody_constraint) BKE_rigidbody_remove_constraint(sce, base->object); /* remove rigid body object from world before removing object */ if (base->object->rigidbody_object) BKE_rigidbody_remove_object(sce, base->object); BLI_remlink(&sce->base, base); }