[Bf-blender-cvs] [3508ffc34c1] master: Fix T59449: Particle system creates error in rigid body

Sergey Sharybin noreply at git.blender.org
Wed Mar 20 15:18:51 CET 2019


Commit: 3508ffc34c1f742e6a798814b80075ccbe1baa22
Author: Sergey Sharybin
Date:   Wed Mar 20 15:14:27 2019 +0100
Branches: master
https://developer.blender.org/rB3508ffc34c1f742e6a798814b80075ccbe1baa22

Fix T59449: Particle system creates error in rigid body

Is a dependency cycle problem. Fix is similar to what is done in 024f5ba2bdb.

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

M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.h
M	source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h

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

diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 3c70cdd5bfd..b10736c98f5 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -284,29 +284,11 @@ void DepsgraphRelationBuilder::add_modifier_to_transform_relation(
         const DepsNodeHandle *handle,
         const char *description)
 {
-	/* Geometry operation, this is where relation will be wired to. */
-	OperationNode *geometry_operation_node =
-	        handle->node->get_entry_operation();
-	ComponentNode *geometry_component = geometry_operation_node->owner;
-	BLI_assert(geometry_component->type == NodeType::GEOMETRY);
-	IDNode *id_node = geometry_component->owner;
-	/* Transform operation, the source of the relation. */
-	ComponentNode *transform_component =
-	        id_node->find_component(NodeType::TRANSFORM);
-	ID *id = geometry_operation_node->owner->owner->id_orig;
-	BLI_assert(GS(id->name) == ID_OB);
-	Object *object = reinterpret_cast<Object *>(id);
-	OperationNode *transform_operation_node = NULL;
-	if (object->rigidbody_object == NULL) {
-		transform_operation_node = transform_component->get_exit_operation();
-	}
-	else {
-		transform_operation_node = transform_component->get_operation(
-		        OperationCode::TRANSFORM_EVAL);
-	}
+	IDNode *id_node = handle->node->owner->owner;
+	ID *id = id_node->id_orig;
+	ComponentKey geometry_key(id, NodeType::GEOMETRY);
 	/* Wire up the actual relation. */
-	add_operation_relation(
-	        transform_operation_node, geometry_operation_node, description);
+	add_depends_on_transform_relation(id, geometry_key, description);
 }
 
 void DepsgraphRelationBuilder::add_customdata_mask(
@@ -1945,12 +1927,9 @@ void DepsgraphRelationBuilder::build_particle_systems(Object *object)
 		}
 	}
 	/* Particle depends on the object transform, so that channel is to be ready
-	 * first.
-	 *
-	 * TODO(sergey): This relation should be altered once real granular update
-	 * is implemented. */
-	ComponentKey transform_key(&object->id, NodeType::TRANSFORM);
-	add_relation(transform_key, obdata_ubereval_key, "Particle Eval");
+	 * first. */
+	add_depends_on_transform_relation(
+	        &object->id, obdata_ubereval_key, "Particle Eval");
 }
 
 void DepsgraphRelationBuilder::build_particle_settings(ParticleSettings *part)
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
index 250593eeda0..aa94e05dc28 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
@@ -198,6 +198,12 @@ public:
 	                                   const char *description,
 	                                   int flags = 0);
 
+	template <typename KeyTo>
+	Relation *add_depends_on_transform_relation(ID *id,
+	                                            const KeyTo& key_to,
+	                                            const char *description,
+	                                            int flags = 0);
+
 	/* Adds relation from proper transformation opertation to the modifier.
 	 * Takes care of checking for possible physics solvers modifying position
 	 * of this object. */
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h b/source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h
index 613e8f86baf..86a17ae4a47 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h
@@ -27,6 +27,7 @@
 
 extern "C" {
 #include "DNA_ID.h"
+#include "DNA_object_types.h"
 }
 
 namespace DEG {
@@ -117,6 +118,26 @@ Relation *DepsgraphRelationBuilder::add_node_handle_relation(
 	return NULL;
 }
 
+template <typename KeyTo>
+Relation *DepsgraphRelationBuilder::add_depends_on_transform_relation(
+        ID *id,
+        const KeyTo& key_to,
+        const char *description,
+        int flags)
+{
+	if (GS(id->name) == ID_OB) {
+		Object *object = reinterpret_cast<Object *>(id);
+		if (object->rigidbody_object != NULL) {
+			OperationKey transform_key(&object->id,
+			                           NodeType::TRANSFORM,
+			                           OperationCode::TRANSFORM_EVAL);
+			return add_relation(transform_key, key_to, description, flags);
+		}
+	}
+	ComponentKey transform_key(id, NodeType::TRANSFORM);
+	return add_relation(transform_key, key_to, description, flags);
+}
+
 template <typename KeyType>
 DepsNodeHandle DepsgraphRelationBuilder::create_node_handle(
         const KeyType &key,



More information about the Bf-blender-cvs mailing list