[Bf-blender-cvs] [634585aa687] master: Simulation: add depsgraph relations for ids referenced by node tree

Jacques Lucke noreply at git.blender.org
Thu Jul 23 12:18:59 CEST 2020


Commit: 634585aa6875f9e6e8a2e43e283f9d530764a094
Author: Jacques Lucke
Date:   Thu Jul 23 12:09:28 2020 +0200
Branches: master
https://developer.blender.org/rB634585aa6875f9e6e8a2e43e283f9d530764a094

Simulation: add depsgraph relations for ids referenced by node tree

I'll really have to refactor `ntreeUpdateTree` soon to avoid scanning
all node trees multiple times.

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

M	source/blender/blenkernel/BKE_simulation.h
M	source/blender/blenkernel/intern/node.c
M	source/blender/blenkernel/intern/simulation.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/makesdna/DNA_simulation_types.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/CMakeLists.txt
A	source/blender/nodes/NOD_node_tree_dependencies.hh
A	source/blender/nodes/intern/node_tree_dependencies.cc
M	source/blender/simulation/SIM_simulation_update.hh
M	source/blender/simulation/intern/simulation_collect_influences.cc
M	source/blender/simulation/intern/simulation_collect_influences.hh
M	source/blender/simulation/intern/simulation_update.cc

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

diff --git a/source/blender/blenkernel/BKE_simulation.h b/source/blender/blenkernel/BKE_simulation.h
index 5aa71b6381d..6cbe77e8de3 100644
--- a/source/blender/blenkernel/BKE_simulation.h
+++ b/source/blender/blenkernel/BKE_simulation.h
@@ -32,6 +32,7 @@ void *BKE_simulation_add(struct Main *bmain, const char *name);
 void BKE_simulation_data_update(struct Depsgraph *depsgraph,
                                 struct Scene *scene,
                                 struct Simulation *simulation);
+void BKE_simulation_update_dependencies(struct Simulation *simulation, struct Main *bmain);
 
 SimulationState *BKE_simulation_state_add(Simulation *simulation,
                                           const char *type,
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 7dbf38657a1..ca1354e9fea 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -61,6 +61,7 @@
 #include "BKE_lib_query.h"
 #include "BKE_main.h"
 #include "BKE_node.h"
+#include "BKE_simulation.h"
 
 #include "BLI_ghash.h"
 #include "BLI_threads.h"
@@ -3638,6 +3639,16 @@ void ntreeUpdateAllUsers(Main *main, ID *ngroup)
   FOREACH_NODETREE_END;
 }
 
+static void ntreeUpdateSimulationDependencies(Main *main, bNodeTree *simulation_ntree)
+{
+  FOREACH_NODETREE_BEGIN (main, ntree, owner_id) {
+    if (GS(owner_id->name) == ID_SIM && ntree == simulation_ntree) {
+      BKE_simulation_update_dependencies((Simulation *)owner_id, main);
+    }
+  }
+  FOREACH_NODETREE_END;
+}
+
 void ntreeUpdateTree(Main *bmain, bNodeTree *ntree)
 {
   bNode *node;
@@ -3695,6 +3706,11 @@ void ntreeUpdateTree(Main *bmain, bNodeTree *ntree)
     ntree_validate_links(ntree);
   }
 
+  if (bmain != NULL && ntree->typeinfo == ntreeType_Simulation &&
+      (ntree->id.flag & LIB_EMBEDDED_DATA)) {
+    ntreeUpdateSimulationDependencies(bmain, ntree);
+  }
+
   /* clear update flags */
   for (node = ntree->nodes.first; node; node = node->next) {
     node->update = 0;
diff --git a/source/blender/blenkernel/intern/simulation.cc b/source/blender/blenkernel/intern/simulation.cc
index ac9c13e157c..b1c7f50a2af 100644
--- a/source/blender/blenkernel/intern/simulation.cc
+++ b/source/blender/blenkernel/intern/simulation.cc
@@ -285,6 +285,14 @@ void BKE_simulation_data_update(Depsgraph *depsgraph, Scene *scene, Simulation *
   blender::sim::update_simulation_in_depsgraph(depsgraph, scene, simulation);
 }
 
+void BKE_simulation_update_dependencies(Simulation *simulation, Main *bmain)
+{
+  bool dependencies_changed = blender::sim::update_simulation_dependencies(simulation);
+  if (dependencies_changed) {
+    DEG_relations_tag_update(bmain);
+  }
+}
+
 using StateTypeMap = blender::Map<std::string, std::unique_ptr<SimulationStateType>>;
 
 template<typename T>
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 2fb67010bb0..e0e35c88af2 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -2634,6 +2634,25 @@ void DepsgraphRelationBuilder::build_simulation(Simulation *simulation)
   OperationKey nodetree_key(
       &simulation->nodetree->id, NodeType::PARAMETERS, OperationCode::PARAMETERS_EXIT);
   add_relation(nodetree_key, simulation_eval_key, "NodeTree -> Simulation", 0);
+
+  LISTBASE_FOREACH (
+      PersistentDataHandleItem *, handle_item, &simulation->persistent_data_handles) {
+    if (handle_item->id == nullptr) {
+      continue;
+    }
+    build_id(handle_item->id);
+    if (GS(handle_item->id->name) == ID_OB) {
+      Object *object = (Object *)handle_item->id;
+      if (handle_item->flag & SIM_HANDLE_DEPENDS_ON_TRANSFORM) {
+        ComponentKey object_transform_key(&object->id, NodeType::TRANSFORM);
+        add_relation(object_transform_key, simulation_eval_key, "Object Transform -> Simulation");
+      }
+      if (handle_item->flag & SIM_HANDLE_DEPENDS_ON_GEOMETRY) {
+        ComponentKey object_geometry_key(&object->id, NodeType::GEOMETRY);
+        add_relation(object_geometry_key, simulation_eval_key, "Object Geometry -> Simulation");
+      }
+    }
+  }
 }
 
 void DepsgraphRelationBuilder::build_scene_sequencer(Scene *scene)
diff --git a/source/blender/makesdna/DNA_simulation_types.h b/source/blender/makesdna/DNA_simulation_types.h
index 5bb0e50e089..c0be66dcb30 100644
--- a/source/blender/makesdna/DNA_simulation_types.h
+++ b/source/blender/makesdna/DNA_simulation_types.h
@@ -72,7 +72,7 @@ typedef struct PersistentDataHandleItem {
   struct PersistentDataHandleItem *prev;
   struct ID *id;
   int handle;
-  char _pad[4];
+  int flag;
 } PersistentDataHandleItem;
 
 /* Simulation.flag */
@@ -80,6 +80,12 @@ enum {
   SIM_DS_EXPAND = (1 << 0),
 };
 
+/* PersistentDataHandleItem.flag */
+enum {
+  SIM_HANDLE_DEPENDS_ON_TRANSFORM = (1 << 0),
+  SIM_HANDLE_DEPENDS_ON_GEOMETRY = (1 << 1),
+};
+
 #define SIM_TYPE_NAME_PARTICLE_SIMULATION "Particle Simulation"
 #define SIM_TYPE_NAME_PARTICLE_MESH_EMITTER "Particle Mesh Emitter"
 
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 6f0192bb810..0359b2ed959 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -38,6 +38,7 @@
 #include "BKE_animsys.h"
 #include "BKE_image.h"
 #include "BKE_node.h"
+#include "BKE_simulation.h"
 #include "BKE_texture.h"
 
 #include "RNA_access.h"
@@ -2848,6 +2849,14 @@ static void rna_NodeSocketStandard_value_update(struct bContext *C, PointerRNA *
   }
 }
 
+static void rna_NodeSocketStandard_value_and_relation_update(struct bContext *C, PointerRNA *ptr)
+{
+  rna_NodeSocketStandard_value_update(C, ptr);
+  bNodeTree *ntree = (bNodeTree *)ptr->owner_id;
+  Main *bmain = CTX_data_main(C);
+  ntreeUpdateTree(bmain, ntree);
+}
+
 /* ******** Node Types ******** */
 
 static void rna_NodeInternalSocketTemplate_name_get(PointerRNA *ptr, char *value)
@@ -8862,7 +8871,8 @@ static void rna_def_node_socket_object(BlenderRNA *brna,
   RNA_def_property_pointer_sdna(prop, NULL, "value");
   RNA_def_property_struct_type(prop, "Object");
   RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
-  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketStandard_value_update");
+  RNA_def_property_update(
+      prop, NC_NODE | NA_EDITED, "rna_NodeSocketStandard_value_and_relation_update");
   RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT | PROP_CONTEXT_UPDATE);
 
   /* socket interface */
@@ -8896,7 +8906,8 @@ static void rna_def_node_socket_image(BlenderRNA *brna,
   RNA_def_property_pointer_sdna(prop, NULL, "value");
   RNA_def_property_struct_type(prop, "Image");
   RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
-  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketStandard_value_update");
+  RNA_def_property_update(
+      prop, NC_NODE | NA_EDITED, "rna_NodeSocketStandard_value_and_relation_update");
   RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT | PROP_CONTEXT_UPDATE);
 
   /* socket interface */
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 80720f5206a..bb2aaf35e52 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -278,6 +278,7 @@ set(SRC
   intern/node_common.c
   intern/node_exec.c
   intern/node_socket.cc
+  intern/node_tree_dependencies.cc
   intern/node_tree_multi_function.cc
   intern/node_tree_ref.cc
   intern/node_util.c
@@ -292,6 +293,7 @@ set(SRC
   NOD_composite.h
   NOD_derived_node_tree.hh
   NOD_function.h
+  NOD_node_tree_dependencies.hh
   NOD_node_tree_multi_function.hh
   NOD_node_tree_ref.hh
   NOD_shader.h
diff --git a/source/blender/nodes/NOD_node_tree_dependencies.hh b/source/blender/nodes/NOD_node_tree_dependencies.hh
new file mode 100644
index 00000000000..ca7059caa5f
--- /dev/null
+++ b/source/blender/nodes/NOD_node_tree_dependencies.hh
@@ -0,0 +1,79 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __NOD_NODE_TREE_DEPENDENCIES_H__
+#define __NOD_NODE_TREE_DEPENDENCIES_H__
+
+#include "BLI_vector_set.hh"
+
+#include "DNA_ID.h"
+#include "DNA_object_types.h"
+
+struct bNodeTree;
+
+namespace blender::nodes {
+
+class NodeTreeDependencies {
+ private:
+  VectorSet<Object *> transform_deps_;
+  VectorSet<Object *> geometry_deps_;
+  VectorSet<ID *> id_deps_;
+
+ public:
+  void add_transform_dependency(Object *object)
+  {
+    if (object == nullptr) {
+      return;
+    }
+    transform_deps_.add(object);
+    id_deps_.add(&object->id);
+  }
+
+  void add_geometry_dependency(Object *object)
+  {
+    if (object == nullptr) {
+      return;
+    }
+    geometry_deps_.add(object);
+    id_deps_.add(&object->id);
+  }
+
+  bool depends_on(ID *id) const
+  {
+    return id_deps_.contains(id);
+  }
+
+  Span<Object *> transform_dependencies()
+  {
+    return transform_deps_;
+  }
+
+  Span<Object *> geometry_dependencies()
+  {
+    return geometry_deps_;
+  }
+
+  Span<ID *> id_dependencies()
+  {
+    return id_deps_;
+  }
+};
+
+NodeTreeDependencies find_node_tree_dependencies(bNodeTree &ntree);
+
+}  // namespace blender::nodes
+
+#endif /* __NOD_NODE_TREE_DEPENDENCIES_H__ */
diff --git a/source/blender/nodes/intern/node_tree_dependencies.cc b/source/blender/nodes/intern/node_tree_dependenc

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list