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,

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

Reply via email to