[Bf-blender-cvs] [425614558df] temp-modifiers-instancing: initial object socket support

Jacques Lucke noreply at git.blender.org
Tue Nov 10 16:39:22 CET 2020


Commit: 425614558df998a2310031583454567b52efa9ce
Author: Jacques Lucke
Date:   Tue Nov 10 16:36:01 2020 +0100
Branches: temp-modifiers-instancing
https://developer.blender.org/rB425614558df998a2310031583454567b52efa9ce

initial object socket support

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

M	source/blender/blenkernel/BKE_geometry_set.h
M	source/blender/blenkernel/intern/object_dupli.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_nodes.cc
M	source/blender/nodes/NOD_derived_node_tree.hh
M	source/blender/nodes/NOD_geometry_exec.hh
M	source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
M	source/blender/nodes/intern/derived_node_tree.cc

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

diff --git a/source/blender/blenkernel/BKE_geometry_set.h b/source/blender/blenkernel/BKE_geometry_set.h
index f2414a941cf..be36ab47f85 100644
--- a/source/blender/blenkernel/BKE_geometry_set.h
+++ b/source/blender/blenkernel/BKE_geometry_set.h
@@ -27,7 +27,6 @@ extern "C" {
 struct Object;
 
 typedef struct GeometrySetC GeometrySetC;
-typedef struct InstancesComponentC InstancesComponentC;
 
 void BKE_geometry_set_user_add(GeometrySetC *geometry_set_c);
 void BKE_geometry_set_user_remove(GeometrySetC *geometry_set_c);
diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c
index a64858287c7..4da05a39f02 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -820,6 +820,9 @@ static void make_duplis_instances_component(const DupliContext *ctx)
 
   for (int i = 0; i < amount; i++) {
     Object *object = objects[i];
+    if (object == NULL) {
+      continue;
+    }
     float mat[4][4];
     unit_m4(mat);
     copy_v3_v3(mat[3], positions[i]);
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 7386665381c..d7ad1d59002 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -2229,7 +2229,6 @@ typedef struct NodesModifierData {
   ModifierData modifier;
   struct bNodeTree *node_group;
   struct NodesModifierSettings settings;
-  struct Object *instance_object_temp;
 } NodesModifierData;
 
 typedef struct MeshToVolumeModifierData {
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 66cf1ea4782..349b6327ecb 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -6965,11 +6965,6 @@ static void rna_def_modifier_nodes(BlenderRNA *brna)
   RNA_def_property_flag(prop, PROP_NEVER_NULL);
   RNA_def_property_ui_text(prop, "Settings", "Settings that are passed into the node group");
 
-  prop = RNA_def_property(srna, "instance_object_temp", PROP_POINTER, PROP_NONE);
-  RNA_def_property_ui_text(prop, "Instance Object Temp", "Object to instance");
-  RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
-  RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
-
   RNA_define_lib_overridable(false);
 
   rna_def_modifier_nodes_settings(brna);
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 1e1bbfb55f1..3f622dee782 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -89,10 +89,6 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
   if (nmd->node_group != nullptr) {
     DEG_add_node_tree_relation(ctx->node, nmd->node_group, "Nodes Modifier");
   }
-  if (nmd->instance_object_temp) {
-    DEG_add_object_relation(
-        ctx->node, nmd->instance_object_temp, DEG_OB_COMP_GEOMETRY, "nodes modifier");
-  }
 
   /* TODO: Add relations for IDs in settings. */
 }
@@ -101,7 +97,6 @@ static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *u
 {
   NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
   walk(userData, ob, (ID **)&nmd->node_group, IDWALK_CB_USER);
-  walk(userData, ob, (ID **)&nmd->instance_object_temp, IDWALK_CB_USER);
 
   struct ForeachSettingData {
     IDWalkFunc walk;
@@ -142,14 +137,17 @@ class GeometryNodesEvaluator {
   Vector<const DInputSocket *> group_outputs_;
   MultiFunctionByNode &mf_by_node_;
   const DataTypeConversions &conversions_;
+  const PersistentDataHandleMap &handle_map_;
 
  public:
   GeometryNodesEvaluator(const Map<const DOutputSocket *, GMutablePointer> &group_input_data,
                          Vector<const DInputSocket *> group_outputs,
-                         MultiFunctionByNode &mf_by_node)
+                         MultiFunctionByNode &mf_by_node,
+                         const PersistentDataHandleMap &handle_map)
       : group_outputs_(std::move(group_outputs)),
         mf_by_node_(mf_by_node),
-        conversions_(get_implicit_type_conversions())
+        conversions_(get_implicit_type_conversions()),
+        handle_map_(handle_map)
   {
     for (auto item : group_input_data.items()) {
       this->forward_to_inputs(*item.key, item.value);
@@ -187,17 +185,11 @@ class GeometryNodesEvaluator {
 
     if (total_inputs == 0) {
       /* The input is not connected, use the value from the socket itself. */
-      bNodeSocket &bsocket = *socket_to_compute.bsocket();
-      void *buffer = allocator_.allocate(type.size(), type.alignment());
-      socket_cpp_value_get(bsocket, buffer);
-      return GMutablePointer{type, buffer};
+      return get_unlinked_input_value(socket_to_compute);
     }
     if (from_group_inputs.size() == 1) {
       /* The input gets its value from the input of a group that is not further connected. */
-      bNodeSocket &bsocket = *from_group_inputs[0]->bsocket();
-      void *buffer = allocator_.allocate(type.size(), type.alignment());
-      socket_cpp_value_get(bsocket, buffer);
-      return GMutablePointer{type, buffer};
+      return get_unlinked_input_value(socket_to_compute);
     }
 
     /* Compute the socket now. */
@@ -222,7 +214,7 @@ class GeometryNodesEvaluator {
 
     /* Execute the node. */
     GValueMap<StringRef> node_outputs_map{allocator_};
-    GeoNodeInputs node_inputs{bnode, node_inputs_map};
+    GeoNodeInputs node_inputs{bnode, node_inputs_map, handle_map_};
     GeoNodeOutputs node_outputs{bnode, node_outputs_map};
     this->execute_node(node, node_inputs, node_outputs);
 
@@ -322,6 +314,30 @@ class GeometryNodesEvaluator {
       }
     }
   }
+
+  GMutablePointer get_unlinked_input_value(const DInputSocket &socket)
+  {
+    bNodeSocket *bsocket;
+    if (socket.linked_group_inputs().size() == 0) {
+      bsocket = socket.bsocket();
+    }
+    else {
+      bsocket = socket.linked_group_inputs()[0]->bsocket();
+    }
+    const CPPType &type = *socket_cpp_type_get(*socket.typeinfo());
+    void *buffer = allocator_.allocate(type.size(), type.alignment());
+
+    if (bsocket->type == SOCK_OBJECT) {
+      Object *object = ((bNodeSocketValueObject *)bsocket->default_value)->value;
+      PersistentObjectHandle object_handle = handle_map_.lookup(object);
+      new (buffer) PersistentObjectHandle(object_handle);
+    }
+    else {
+      socket_cpp_value_get(*bsocket, buffer);
+    }
+
+    return {type, buffer};
+  }
 };
 
 /**
@@ -642,6 +658,23 @@ static void initialize_group_input(NodesModifierData &nmd,
   property_type->init_cpp_value(*property, r_value);
 }
 
+static void fill_data_handle_map(const DerivedNodeTree &tree, PersistentDataHandleMap &handle_map)
+{
+  int current_handle = 0;
+  for (const NodeTreeRef *tree_ref : tree.used_node_tree_refs()) {
+    for (const SocketRef *socket_ref : tree_ref->sockets()) {
+      const bNodeSocket *bsocket = socket_ref->bsocket();
+      if (bsocket->type == SOCK_OBJECT) {
+        Object *object = ((bNodeSocketValueObject *)bsocket->default_value)->value;
+        if (object != nullptr) {
+          handle_map.add(current_handle, object->id);
+          current_handle++;
+        }
+      }
+    }
+  }
+}
+
 /**
  * Evaluate a node group to compute the output geometry.
  * Currently, this uses a fairly basic and inefficient algorithm that might compute things more
@@ -684,7 +717,10 @@ static GeometrySetPtr compute_geometry(const DerivedNodeTree &tree,
   Vector<const DInputSocket *> group_outputs;
   group_outputs.append(&socket_to_compute);
 
-  GeometryNodesEvaluator evaluator{group_inputs, group_outputs, mf_by_node};
+  PersistentDataHandleMap handle_map;
+  fill_data_handle_map(tree, handle_map);
+
+  GeometryNodesEvaluator evaluator{group_inputs, group_outputs, mf_by_node, handle_map};
   Vector<GMutablePointer> results = evaluator.execute();
   BLI_assert(results.size() == 1);
   GMutablePointer result = results[0];
@@ -789,21 +825,8 @@ static GeometrySetC *modifyPointCloud(ModifierData *md,
                                       const ModifierEvalContext *ctx,
                                       GeometrySetC *geometry_set_c)
 {
-  NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
-
   GeometrySetPtr input_geometry_set = unwrap(geometry_set_c);
   GeometrySetPtr output_geometry_set = modifyGeometry(md, ctx, std::move(input_geometry_set));
-
-  make_geometry_set_mutable(output_geometry_set);
-  InstancesComponent &component =
-      output_geometry_set->get_component_for_write<InstancesComponent>();
-  Vector<float3> positions;
-  positions.append({1, 2, 3});
-  positions.append({-1, 2, 3});
-  positions.append({-1, -2, 3});
-  positions.append({-1, -2, -3});
-  component.replace(positions, nmd->instance_object_temp);
-
   return wrap(output_geometry_set.release());
 }
 
@@ -845,7 +868,6 @@ static void panel_draw(const bContext *UNUSED(C), Panel *panel)
   uiLayoutSetPropDecorate(layout, false);
 
   uiItemR(layout, ptr, "node_group", 0, nullptr, ICON_MESH_DATA);
-  uiItemR(layout, ptr, "instance_object_temp", 0, nullptr, ICON_NONE);
 
   if (nmd->node_group != nullptr && nmd->settings.properties != nullptr) {
     PointerRNA settings_ptr;
diff --git a/source/blender/nodes/NOD_derived_node_tree.hh b/source/blender/nodes/NOD_derived_node_tree.hh
index 1a9f223cf6c..6166df6dc61 100644
--- a/source/blender/nodes/NOD_derived_node_tree.hh
+++ b/source/blender/nodes/NOD_derived_node_tree.hh
@@ -31,6 +31,8 @@
 
 #include "NOD_node_tree_ref.hh"
 
+#include "BLI_vector_set.hh"
+
 namespace blender::nodes {
 
 class DSocket;
@@ -184,6 +186,7 @@ class DerivedNodeTree : NonCopyable, NonMovable {
   Vector<DOutputSocket *> output_sockets_;
 
   MultiValueMap<const bNodeType *, DNode *> nodes_by_type_;
+  VectorSet<const NodeTreeRef *> used_node_tree_refs_;
 
  public:
   DerivedNodeTree(bNodeTree *btree, NodeTreeRefMap &node_tree_refs);
@@ -199,6 +202,8 @@ class DerivedNodeTree : NonCopyable, NonMovable {
 
   Span<const DGroupInput *> group_inputs() const;
 
+  Span<const NodeTreeRef *> used_node_tree_refs() const;
+
   std::string to

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list