diff options
3 files changed, 34 insertions, 28 deletions
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, |