diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/physics/physics_intern.h | 1 | ||||
-rw-r--r-- | source/blender/editors/physics/physics_ops.c | 1 | ||||
-rw-r--r-- | source/blender/editors/physics/rigidbody_constraint.c | 64 | ||||
-rw-r--r-- | source/blender/editors/physics/rigidbody_object.c | 34 |
4 files changed, 38 insertions, 62 deletions
diff --git a/source/blender/editors/physics/physics_intern.h b/source/blender/editors/physics/physics_intern.h index 4b4855c9922..77ce5a334e6 100644 --- a/source/blender/editors/physics/physics_intern.h +++ b/source/blender/editors/physics/physics_intern.h @@ -117,7 +117,6 @@ void RIGIDBODY_OT_mass_calculate(struct wmOperatorType *ot); /* rigidbody_constraint.c */ void RIGIDBODY_OT_constraint_add(struct wmOperatorType *ot); -void RIGIDBODY_OT_constraint_group_add(struct wmOperatorType *ot); void RIGIDBODY_OT_constraint_remove(struct wmOperatorType *ot); /*rigidbody_world.c */ diff --git a/source/blender/editors/physics/physics_ops.c b/source/blender/editors/physics/physics_ops.c index fc6a0e58752..51a66886c6e 100644 --- a/source/blender/editors/physics/physics_ops.c +++ b/source/blender/editors/physics/physics_ops.c @@ -97,7 +97,6 @@ static void operatortypes_particle(void) WM_operatortype_append(RIGIDBODY_OT_mass_calculate); WM_operatortype_append(RIGIDBODY_OT_constraint_add); - WM_operatortype_append(RIGIDBODY_OT_constraint_group_add); WM_operatortype_append(RIGIDBODY_OT_constraint_remove); WM_operatortype_append(RIGIDBODY_OT_world_add); diff --git a/source/blender/editors/physics/rigidbody_constraint.c b/source/blender/editors/physics/rigidbody_constraint.c index e4db1c91c2b..fac835a414a 100644 --- a/source/blender/editors/physics/rigidbody_constraint.c +++ b/source/blender/editors/physics/rigidbody_constraint.c @@ -78,20 +78,33 @@ static int ED_operator_rigidbody_con_active_poll(bContext *C) void ED_rigidbody_con_add(wmOperator *op, Scene *scene, Object *ob, int type) { + RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene); + /* check that object doesn't already have a constraint */ if (ob->rigidbody_constraint) { BKE_reportf(op->reports, RPT_INFO, "Object '%s' already has a Rigid Body Constraint", ob->id.name + 2); return; } - + /* create constraint group if it doesn't already exits */ + if (rbw->constraints == NULL) { + rbw->constraints = add_group("RigidBodyConstraints"); + } /* make rigidbody constraint settings */ ob->rigidbody_constraint = BKE_rigidbody_create_constraint(scene, ob, type); ob->rigidbody_constraint->flag |= RBC_FLAG_NEEDS_VALIDATE; + + /* add constraint to rigid body constraint group */ + add_to_group(rbw->constraints, ob, scene, NULL); } void ED_rigidbody_con_remove(Scene *scene, Object *ob) { + RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene); + BKE_rigidbody_remove_constraint(scene, ob); + if (rbw) + rem_from_group(rbw->constraints, ob, scene, NULL); + DAG_id_tag_update(&ob->id, OB_RECALC_OB); } @@ -103,43 +116,6 @@ void ED_rigidbody_con_remove(Scene *scene, Object *ob) static int rigidbody_con_add_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); - Object *ob = (scene) ? OBACT : NULL; - int type = RNA_enum_get(op->ptr, "type"); - - /* apply to active object */ - ED_rigidbody_con_add(op, scene, ob, type); - - /* send updates */ - DAG_ids_flush_update(CTX_data_main(C), 0); - - WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL); - WM_event_add_notifier(C, NC_GROUP | NA_EDITED, NULL); - - /* done */ - return OPERATOR_FINISHED; -} - -void RIGIDBODY_OT_constraint_add(wmOperatorType *ot) -{ - /* identifiers */ - ot->idname = "RIGIDBODY_OT_constraint_add"; - ot->name = "Add Rigid Body Constraint"; - ot->description = "Add Rigid Body Constraint to active object"; - - /* callbacks */ - ot->exec = rigidbody_con_add_exec; - ot->poll = ED_operator_object_active_editable; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - /* properties */ - ot->prop = RNA_def_enum(ot->srna, "type", rigidbody_con_type_items, RBC_TYPE_FIXED, "Rigid Body Constraint Type", ""); -} - -static int rigidbody_con_group_add_exec(bContext *C, wmOperator *op) -{ - Scene *scene = CTX_data_scene(C); RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene); Object *ob = (scene) ? OBACT : NULL; int type = RNA_enum_get(op->ptr, "type"); @@ -149,12 +125,8 @@ static int rigidbody_con_group_add_exec(bContext *C, wmOperator *op) BKE_report(op->reports, RPT_ERROR, "No Rigid Body World to add Rigid Body Constraint to"); return OPERATOR_CANCELLED; } - if (rbw->constraints == NULL) { - rbw->constraints = add_group("RigidBodyConstraints"); - } /* apply to active object */ ED_rigidbody_con_add(op, scene, ob, type); - add_to_group(rbw->constraints, ob, scene, NULL); /* send updates */ DAG_ids_flush_update(CTX_data_main(C), 0); @@ -166,15 +138,15 @@ static int rigidbody_con_group_add_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void RIGIDBODY_OT_constraint_group_add(wmOperatorType *ot) +void RIGIDBODY_OT_constraint_add(wmOperatorType *ot) { /* identifiers */ - ot->idname = "RIGIDBODY_OT_constraint_group_add"; + ot->idname = "RIGIDBODY_OT_constraint_add"; ot->name = "Add Rigid Body Constraint"; - ot->description = "Add Rigid Body Constraint to active object and world's group"; + ot->description = "Add Rigid Body Constraint to active object"; /* callbacks */ - ot->exec = rigidbody_con_group_add_exec; + ot->exec = rigidbody_con_add_exec; ot->poll = ED_operator_object_active_editable; /* flags */ diff --git a/source/blender/editors/physics/rigidbody_object.c b/source/blender/editors/physics/rigidbody_object.c index c61d4c33866..fc1e24840a4 100644 --- a/source/blender/editors/physics/rigidbody_object.c +++ b/source/blender/editors/physics/rigidbody_object.c @@ -90,6 +90,8 @@ static int ED_operator_rigidbody_add_poll(bContext *C) void ED_rigidbody_ob_add(wmOperator *op, Scene *scene, Object *ob, int type) { + RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene); + /* check that object doesn't already belong to the current simulation */ if (ob->rigidbody_object) { BKE_reportf(op->reports, RPT_INFO, "Object '%s' already has a Rigid Body", ob->id.name + 2); @@ -104,14 +106,32 @@ void ED_rigidbody_ob_add(wmOperator *op, Scene *scene, Object *ob, int type) return; } + /* Add rigid body world and group if they don't exist for convenience */ + if (rbw == NULL) { + rbw = BKE_rigidbody_create_world(scene); + BKE_rigidbody_validate_sim_world(scene, rbw, false); + scene->rigidbody_world = rbw; + } + if (rbw->group == NULL) { + rbw->group = add_group("RigidBodyWorld"); + } + /* make rigidbody object settings */ ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, type); ob->rigidbody_object->flag |= RBO_FLAG_NEEDS_VALIDATE; + + /* add object to rigid body group */ + add_to_group(rbw->group, ob, scene, NULL); } void ED_rigidbody_ob_remove(Scene *scene, Object *ob) { + RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene); + BKE_rigidbody_remove_object(scene, ob); + if (rbw) + rem_from_group(rbw->group, ob, scene, NULL); + DAG_id_tag_update(&ob->id, OB_RECALC_OB); } @@ -209,7 +229,6 @@ void RIGIDBODY_OT_object_remove(wmOperatorType *ot) static int rigidbody_obs_add_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); - RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene); int type = RNA_enum_get(op->ptr, "type"); /* sanity check */ @@ -217,19 +236,9 @@ static int rigidbody_obs_add_exec(bContext *C, wmOperator *op) BKE_report(op->reports, RPT_ERROR, "No Scene to add Rigid Bodies to"); return OPERATOR_CANCELLED; } - /* Add rigid body world and group if they don't exist for convenience */ - if (rbw == NULL) { - rbw = BKE_rigidbody_create_world(scene); - BKE_rigidbody_validate_sim_world(scene, rbw, false); - scene->rigidbody_world = rbw; - } - if (rbw->group == NULL) { - rbw->group = add_group("RigidBodyWorld"); - } /* create rigid body objects and add them to the world's group */ CTX_DATA_BEGIN(C, Object *, ob, selected_objects) { ED_rigidbody_ob_add(op, scene, ob, type); - add_to_group(rbw->group, ob, scene, NULL); } CTX_DATA_END; @@ -266,7 +275,6 @@ void RIGIDBODY_OT_objects_add(wmOperatorType *ot) static int rigidbody_obs_remove_exec(bContext *C, wmOperator *UNUSED(op)) { Scene *scene = CTX_data_scene(C); - RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene); /* sanity checks */ if (scene == NULL) @@ -277,8 +285,6 @@ static int rigidbody_obs_remove_exec(bContext *C, wmOperator *UNUSED(op)) { if (ob->rigidbody_object) { ED_rigidbody_ob_remove(scene, ob); - if (rbw) - rem_from_group(rbw->group, ob, scene, NULL); } } CTX_DATA_END; |