Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc35
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.h6
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h21
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,