Commit: 122c59fba49e212717e8c7302ee01d6126dff427
Author: Sergey Sharybin
Date:   Mon Jun 6 14:37:15 2016 +0200
Branches: master
https://developer.blender.org/rB122c59fba49e212717e8c7302ee01d6126dff427

Fix T48582: Rigidbody simulation issue with new depsgraph

Being granular means we need to re-build depsgraph a bit more often..

The issue was caused by rigidbody requiring some special nodes to
handle physics which were not created with just tagging object for
update.

===================================================================

M       source/blender/editors/include/ED_physics.h
M       source/blender/editors/object/object_add.c
M       source/blender/editors/physics/rigidbody_constraint.c
M       source/blender/editors/physics/rigidbody_object.c

===================================================================

diff --git a/source/blender/editors/include/ED_physics.h 
b/source/blender/editors/include/ED_physics.h
index 584e9a9..fed842c 100644
--- a/source/blender/editors/include/ED_physics.h
+++ b/source/blender/editors/include/ED_physics.h
@@ -45,12 +45,12 @@ int PE_hair_poll(struct bContext *C);
 int PE_poll_view3d(struct bContext *C);
 
 /* rigidbody_object.c */
-bool ED_rigidbody_object_add(struct Scene *scene, struct Object *ob, int type, 
struct ReportList *reports);
-void ED_rigidbody_object_remove(struct Scene *scene, struct Object *ob);
+bool ED_rigidbody_object_add(struct Main *bmain, struct Scene *scene, struct 
Object *ob, int type, struct ReportList *reports);
+void ED_rigidbody_object_remove(struct Main *bmain, struct Scene *scene, 
struct Object *ob);
 
 /* rigidbody_constraint.c */
-bool ED_rigidbody_constraint_add(struct Scene *scene, struct Object *ob, int 
type, struct ReportList *reports);
-void ED_rigidbody_constraint_remove(struct Scene *scene, struct Object *ob);
+bool ED_rigidbody_constraint_add(struct Main *bmain, struct Scene *scene, 
struct Object *ob, int type, struct ReportList *reports);
+void ED_rigidbody_constraint_remove(struct Main *bmain, struct Scene *scene, 
struct Object *ob);
 
 /* operators */
 void ED_operatortypes_physics(void);
diff --git a/source/blender/editors/object/object_add.c 
b/source/blender/editors/object/object_add.c
index 88ab345..09c9442 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -1601,7 +1601,7 @@ static int convert_exec(bContext *C, wmOperator *op)
 
                        if (newob->type == OB_CURVE) {
                                BKE_object_free_modifiers(newob);   /* after 
derivedmesh calls! */
-                               ED_rigidbody_object_remove(scene, newob);
+                               ED_rigidbody_object_remove(bmain, scene, newob);
                        }
                }
                else if (ob->type == OB_MESH && ob->modifiers.first) { /* 
converting a mesh with no modifiers causes a segfault */
diff --git a/source/blender/editors/physics/rigidbody_constraint.c 
b/source/blender/editors/physics/rigidbody_constraint.c
index f955995..1bfc162 100644
--- a/source/blender/editors/physics/rigidbody_constraint.c
+++ b/source/blender/editors/physics/rigidbody_constraint.c
@@ -41,6 +41,7 @@
 #include "BKE_depsgraph.h"
 #include "BKE_global.h"
 #include "BKE_group.h"
+#include "BKE_main.h"
 #include "BKE_report.h"
 #include "BKE_rigidbody.h"
 
@@ -70,7 +71,7 @@ static int ED_operator_rigidbody_con_active_poll(bContext *C)
 }
 
 
-bool ED_rigidbody_constraint_add(Scene *scene, Object *ob, int type, 
ReportList *reports)
+bool ED_rigidbody_constraint_add(Main *bmain, Scene *scene, Object *ob, int 
type, ReportList *reports)
 {
        RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene);
 
@@ -81,7 +82,7 @@ bool ED_rigidbody_constraint_add(Scene *scene, Object *ob, 
int type, ReportList
        }
        /* create constraint group if it doesn't already exits */
        if (rbw->constraints == NULL) {
-               rbw->constraints = BKE_group_add(G.main, 
"RigidBodyConstraints");
+               rbw->constraints = BKE_group_add(bmain, "RigidBodyConstraints");
        }
        /* make rigidbody constraint settings */
        ob->rigidbody_constraint = BKE_rigidbody_create_constraint(scene, ob, 
type);
@@ -90,11 +91,12 @@ bool ED_rigidbody_constraint_add(Scene *scene, Object *ob, 
int type, ReportList
        /* add constraint to rigid body constraint group */
        BKE_group_object_add(rbw->constraints, ob, scene, NULL);
 
+       DAG_relations_tag_update(bmain);
        DAG_id_tag_update(&ob->id, OB_RECALC_OB);
        return true;
 }
 
-void ED_rigidbody_constraint_remove(Scene *scene, Object *ob)
+void ED_rigidbody_constraint_remove(Main *bmain, Scene *scene, Object *ob)
 {
        RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene);
 
@@ -102,6 +104,7 @@ void ED_rigidbody_constraint_remove(Scene *scene, Object 
*ob)
        if (rbw)
                BKE_group_object_unlink(rbw->constraints, ob, scene, NULL);
 
+       DAG_relations_tag_update(bmain);
        DAG_id_tag_update(&ob->id, OB_RECALC_OB);
 }
 
@@ -112,6 +115,7 @@ void ED_rigidbody_constraint_remove(Scene *scene, Object 
*ob)
 
 static int rigidbody_con_add_exec(bContext *C, wmOperator *op)
 {
+       Main *bmain = CTX_data_main(C);
        Scene *scene = CTX_data_scene(C);
        RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene);
        Object *ob = (scene) ? OBACT : NULL;
@@ -124,7 +128,7 @@ static int rigidbody_con_add_exec(bContext *C, wmOperator 
*op)
                return OPERATOR_CANCELLED;
        }
        /* apply to active object */
-       changed = ED_rigidbody_constraint_add(scene, ob, type, op->reports);
+       changed = ED_rigidbody_constraint_add(bmain, scene, ob, type, 
op->reports);
 
        if (changed) {
                /* send updates */
@@ -160,6 +164,7 @@ void RIGIDBODY_OT_constraint_add(wmOperatorType *ot)
 
 static int rigidbody_con_remove_exec(bContext *C, wmOperator *op)
 {
+       Main *bmain = CTX_data_main(C);
        Scene *scene = CTX_data_scene(C);
        Object *ob = (scene) ? OBACT : NULL;
 
@@ -173,7 +178,7 @@ static int rigidbody_con_remove_exec(bContext *C, 
wmOperator *op)
                return OPERATOR_CANCELLED;
        }
        else {
-               ED_rigidbody_constraint_remove(scene, ob);
+               ED_rigidbody_constraint_remove(bmain, scene, ob);
        }
 
        /* send updates */
diff --git a/source/blender/editors/physics/rigidbody_object.c 
b/source/blender/editors/physics/rigidbody_object.c
index 26d8af8..30597d9 100644
--- a/source/blender/editors/physics/rigidbody_object.c
+++ b/source/blender/editors/physics/rigidbody_object.c
@@ -46,6 +46,7 @@
 #include "BKE_depsgraph.h"
 #include "BKE_global.h"
 #include "BKE_group.h"
+#include "BKE_main.h"
 #include "BKE_report.h"
 #include "BKE_rigidbody.h"
 
@@ -87,7 +88,7 @@ static int ED_operator_rigidbody_add_poll(bContext *C)
 
 /* ----------------- */
 
-bool ED_rigidbody_object_add(Scene *scene, Object *ob, int type, ReportList 
*reports)
+bool ED_rigidbody_object_add(Main *bmain, Scene *scene, Object *ob, int type, 
ReportList *reports)
 {
        RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene);
 
@@ -107,7 +108,7 @@ bool ED_rigidbody_object_add(Scene *scene, Object *ob, int 
type, ReportList *rep
                scene->rigidbody_world = rbw;
        }
        if (rbw->group == NULL) {
-               rbw->group = BKE_group_add(G.main, "RigidBodyWorld");
+               rbw->group = BKE_group_add(bmain, "RigidBodyWorld");
        }
 
        /* make rigidbody object settings */
@@ -120,12 +121,13 @@ bool ED_rigidbody_object_add(Scene *scene, Object *ob, 
int type, ReportList *rep
        /* add object to rigid body group */
        BKE_group_object_add(rbw->group, ob, scene, NULL);
 
+       DAG_relations_tag_update(bmain);
        DAG_id_tag_update(&ob->id, OB_RECALC_OB);
 
        return true;
 }
 
-void ED_rigidbody_object_remove(Scene *scene, Object *ob)
+void ED_rigidbody_object_remove(Main *bmain, Scene *scene, Object *ob)
 {
        RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene);
 
@@ -133,6 +135,7 @@ void ED_rigidbody_object_remove(Scene *scene, Object *ob)
        if (rbw)
                BKE_group_object_unlink(rbw->group, ob, scene, NULL);
 
+       DAG_relations_tag_update(bmain);
        DAG_id_tag_update(&ob->id, OB_RECALC_OB);
 }
 
@@ -143,13 +146,14 @@ void ED_rigidbody_object_remove(Scene *scene, Object *ob)
 
 static int rigidbody_object_add_exec(bContext *C, wmOperator *op)
 {
+       Main *bmain = CTX_data_main(C);
        Scene *scene = CTX_data_scene(C);
        Object *ob = ED_object_active_context(C);
        int type = RNA_enum_get(op->ptr, "type");
        bool changed;
 
        /* apply to active object */
-       changed = ED_rigidbody_object_add(scene, ob, type, op->reports);
+       changed = ED_rigidbody_object_add(bmain, scene, ob, type, op->reports);
 
        if (changed) {
                /* send updates */
@@ -186,13 +190,14 @@ void RIGIDBODY_OT_object_add(wmOperatorType *ot)
 
 static int rigidbody_object_remove_exec(bContext *C, wmOperator *op)
 {
+       Main *bmain = CTX_data_main(C);
        Scene *scene = CTX_data_scene(C);
        Object *ob = ED_object_active_context(C);
        bool changed = false;
 
        /* apply to active object */
        if (!ELEM(NULL, ob, ob->rigidbody_object)) {
-               ED_rigidbody_object_remove(scene, ob);
+               ED_rigidbody_object_remove(bmain, scene, ob);
                changed = true;
        }
 
@@ -232,13 +237,14 @@ void RIGIDBODY_OT_object_remove(wmOperatorType *ot)
 
 static int rigidbody_objects_add_exec(bContext *C, wmOperator *op)
 {
+       Main *bmain = CTX_data_main(C);
        Scene *scene = CTX_data_scene(C);
        int type = RNA_enum_get(op->ptr, "type");
        bool changed = false;
 
        /* create rigid body objects and add them to the world's group */
        CTX_DATA_BEGIN(C, Object *, ob, selected_objects) {
-               changed |= ED_rigidbody_object_add(scene, ob, type, 
op->reports);
+               changed |= ED_rigidbody_object_add(bmain, scene, ob, type, 
op->reports);
        }
        CTX_DATA_END;
 
@@ -277,6 +283,7 @@ void RIGIDBODY_OT_objects_add(wmOperatorType *ot)
 
 static int rigidbody_objects_remove_exec(bContext *C, wmOperator *UNUSED(op))
 {
+       Main *bmain = CTX_data_main(C);
        Scene *scene = CTX_data_scene(C);
        bool changed = false;
 
@@ -284,7 +291,7 @@ static int rigidbody_objects_remove_exec(bContext *C, 
wmOperator *UNUSED(op))
        CTX_DATA_BEGIN(C, Object *, ob, selected_objects)
        {
                if (ob->rigidbody_object) {
-                       ED_rigidbody_object_remove(scene, ob);
+                       ED_rigidbody_object_remove(bmain, scene, ob);
                        changed = true;
                }
        }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to