[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