[Bf-blender-cvs] [7cea4dc6f5e] temp-geometry-nodes-viewer-node: compute viewed sockets even when it is not required for the output

Jacques Lucke noreply at git.blender.org
Mon May 31 13:49:55 CEST 2021


Commit: 7cea4dc6f5eea1110369488d858accdc4d8ff4a6
Author: Jacques Lucke
Date:   Mon May 31 13:35:29 2021 +0200
Branches: temp-geometry-nodes-viewer-node
https://developer.blender.org/rB7cea4dc6f5eea1110369488d858accdc4d8ff4a6

compute viewed sockets even when it is not required for the output

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

M	source/blender/modifiers/intern/MOD_nodes.cc
M	source/blender/modifiers/intern/MOD_nodes_evaluator.cc
M	source/blender/modifiers/intern/MOD_nodes_evaluator.hh

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

diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 30e7c0901e5..8af109be231 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -969,6 +969,8 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree,
   blender::modifiers::geometry_nodes::GeometryNodesEvaluationParams eval_params;
   eval_params.input_values = group_inputs;
   eval_params.output_sockets = group_outputs;
+  eval_params.force_compute_sockets.extend(preview_sockets.keys().begin(),
+                                           preview_sockets.keys().end());
   eval_params.mf_by_node = &mf_by_node;
   eval_params.modifier_ = nmd;
   eval_params.depsgraph = ctx->depsgraph;
diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
index 10ef2f4d8eb..56ee275b15f 100644
--- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
+++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
@@ -404,6 +404,9 @@ class GeometryNodesEvaluator {
     for (const DInputSocket &socket : params_.output_sockets) {
       nodes_to_check.push(socket.node());
     }
+    for (const DSocket &socket : params_.force_compute_sockets) {
+      nodes_to_check.push(socket.node());
+    }
     /* Use the local allocator because the states do not need to outlive the evaluator. */
     LinearAllocator<> &allocator = local_allocators_.local();
     while (!nodes_to_check.is_empty()) {
@@ -500,7 +503,8 @@ class GeometryNodesEvaluator {
           },
           {});
       if (output_state.potential_users == 0) {
-        /* If it does not have any potential users, it is unused. */
+        /* If it does not have any potential users, it is unused. It might become required again if
+         * the output itself is needed. */
         output_state.output_usage = ValueUsage::Unused;
       }
     }
@@ -573,6 +577,21 @@ class GeometryNodesEvaluator {
       /* Setting an input as required will schedule any linked node. */
       this->set_input_required(locked_node, socket);
     }
+    for (const DSocket socket : params_.force_compute_sockets) {
+      const DNode node = socket.node();
+      NodeState &node_state = this->get_node_state(node);
+      LockedNode locked_node{*this, node, node_state};
+      if (socket->is_input()) {
+        this->set_input_required(locked_node, DInputSocket(socket));
+      }
+      else {
+        OutputState &output_state = node_state.outputs[socket->index()];
+        output_state.output_usage = ValueUsage::Required;
+        /* Add a fake user for this output. */
+        output_state.potential_users += 1;
+        this->schedule_node(locked_node);
+      }
+    }
   }
 
   void schedule_node(LockedNode &locked_node)
diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.hh b/source/blender/modifiers/intern/MOD_nodes_evaluator.hh
index 84249e4244e..a85624a28d5 100644
--- a/source/blender/modifiers/intern/MOD_nodes_evaluator.hh
+++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.hh
@@ -38,6 +38,7 @@ struct GeometryNodesEvaluationParams {
 
   Map<DOutputSocket, GMutablePointer> input_values;
   Vector<DInputSocket> output_sockets;
+  Vector<DSocket> force_compute_sockets;
   nodes::MultiFunctionByNode *mf_by_node;
   const NodesModifierData *modifier_;
   Depsgraph *depsgraph;



More information about the Bf-blender-cvs mailing list