[Bf-blender-cvs] [ed3d693cb18] blender2.8: Dependency graph fixes for RigidBodyWorld

Sybren A. Stüvel noreply at git.blender.org
Fri Jun 15 17:21:09 CEST 2018


Commit: ed3d693cb181c21c8d00b6d2aa734e25c2d65cda
Author: Sybren A. Stüvel
Date:   Fri Jun 15 17:14:48 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBed3d693cb181c21c8d00b6d2aa734e25c2d65cda

Dependency graph fixes for RigidBodyWorld

- rbw->group added to the depsgraph.
- Mesh evaluation added when necessary.
- Prevent of double-free by freeing the scene before objects.

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

M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/depsgraph.cc
M	source/blender/depsgraph/intern/depsgraph.h
M	source/blender/depsgraph/intern/nodes/deg_node_id.cc

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

diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index ba34d24d9d5..d4a115cfb8b 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -897,6 +897,8 @@ void DepsgraphNodeBuilder::build_rigidbody(Scene *scene)
 
 	/* objects - simulation participants */
 	if (rbw->group) {
+		build_collection(DEG_COLLECTION_OWNER_OBJECT, rbw->group);
+
 		FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(rbw->group, object)
 		{
 			if (object->type != OB_MESH)
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 5312c7adac8..bc8528f6738 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -1426,6 +1426,8 @@ void DepsgraphRelationBuilder::build_rigidbody(Scene *scene)
 
 	/* objects - simulation participants */
 	if (rbw->group) {
+		build_collection(DEG_COLLECTION_OWNER_OBJECT, NULL, rbw->group);
+
 		FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(rbw->group, object)
 		{
 			if (object->type != OB_MESH) {
@@ -1447,6 +1449,13 @@ void DepsgraphRelationBuilder::build_rigidbody(Scene *scene)
 
 			add_relation(sim_key, rbo_key, "Rigidbody Sim Eval -> RBO Sync");
 
+			/* Geometry must be known to create the rigid body. RBO_MESH_BASE uses the non-evaluated
+			 * mesh, so then the evaluation is unnecessary. */
+			if (object->rigidbody_object->mesh_source != RBO_MESH_BASE) {
+				ComponentKey geom_key(&object->id, DEG_NODE_TYPE_GEOMETRY);
+				add_relation(geom_key, init_key, "Object Geom Eval -> Rigidbody Rebuild");
+			}
+
 			/* if constraints exist, those depend on the result of the rigidbody sim
 			 * - This allows constraints to modify the result of the sim (i.e. clamping)
 			 *   while still allowing the sim to depend on some changes to the objects.
diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc
index 26a23cff372..16427d3eb59 100644
--- a/source/blender/depsgraph/intern/depsgraph.cc
+++ b/source/blender/depsgraph/intern/depsgraph.cc
@@ -327,27 +327,33 @@ IDDepsNode *Depsgraph::add_id_node(ID *id, ID *id_cow_hint)
 	return id_node;
 }
 
-void Depsgraph::clear_id_nodes()
+void Depsgraph::clear_id_nodes_conditional(const std::function <bool (ID_Type id_type)>& filter)
 {
-	/* Free memory used by ID nodes. */
-	{
-		/* Stupid workaround to ensure we free IDs in a proper order. */
-		foreach (IDDepsNode *id_node, id_nodes) {
-			if (id_node->id_cow == NULL) {
-				/* This means builder "stole" ownership of the copy-on-written
-				 * datablock for her own dirty needs.
-				 */
-				continue;
-			}
-			if (!deg_copy_on_write_is_expanded(id_node->id_cow)) {
-				continue;
-			}
-			const ID_Type id_type = GS(id_node->id_cow->name);
-			if (id_type != ID_PA) {
-				id_node->destroy();
-			}
+	foreach (IDDepsNode *id_node, id_nodes) {
+		if (id_node->id_cow == NULL) {
+			/* This means builder "stole" ownership of the copy-on-written
+			 * datablock for her own dirty needs.
+			 */
+			continue;
+		}
+		if (!deg_copy_on_write_is_expanded(id_node->id_cow)) {
+			continue;
+		}
+		const ID_Type id_type = GS(id_node->id_cow->name);
+		if (filter(id_type)) {
+			id_node->destroy();
 		}
 	}
+}
+
+void Depsgraph::clear_id_nodes()
+{
+	/* Free memory used by ID nodes. */
+
+	/* Stupid workaround to ensure we free IDs in a proper order. */
+	clear_id_nodes_conditional([](ID_Type id_type) { return id_type == ID_SCE; });
+	clear_id_nodes_conditional([](ID_Type id_type) { return id_type != ID_PA; });
+
 	foreach (IDDepsNode *id_node, id_nodes) {
 		OBJECT_GUARDED_DELETE(id_node, IDDepsNode);
 	}
diff --git a/source/blender/depsgraph/intern/depsgraph.h b/source/blender/depsgraph/intern/depsgraph.h
index 3c1233cd5bb..a69be39c50b 100644
--- a/source/blender/depsgraph/intern/depsgraph.h
+++ b/source/blender/depsgraph/intern/depsgraph.h
@@ -38,6 +38,8 @@
 
 #include <stdlib.h>
 
+#include "DNA_ID.h" /* for ID_Type */
+
 #include "BKE_library.h" /* for MAX_LIBARRAY */
 
 #include "BLI_threads.h"  /* for SpinLock */
@@ -128,6 +130,7 @@ struct Depsgraph {
 	IDDepsNode *find_id_node(const ID *id) const;
 	IDDepsNode *add_id_node(ID *id, ID *id_cow_hint = NULL);
 	void clear_id_nodes();
+	void clear_id_nodes_conditional(const std::function <bool (ID_Type id_type)>& filter);
 
 	/* Add new relationship between two nodes. */
 	DepsRelation *add_new_relation(OperationDepsNode *from,
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_id.cc b/source/blender/depsgraph/intern/nodes/deg_node_id.cc
index 956c23978ab..3a164a50692 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_id.cc
+++ b/source/blender/depsgraph/intern/nodes/deg_node_id.cc
@@ -156,6 +156,7 @@ void IDDepsNode::destroy()
 	if (id_cow != id_orig && id_cow != NULL) {
 		deg_free_copy_on_write_datablock(id_cow);
 		MEM_freeN(id_cow);
+		id_cow = NULL;
 		DEG_COW_PRINT("Destroy CoW for %s: id_orig=%p id_cow=%p\n",
 		              id_orig->name, id_orig, id_cow);
 	}



More information about the Bf-blender-cvs mailing list