From d0c1e6df08b3d202291fc60f042990d3aeb75ee3 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 9 May 2023 13:53:16 -0400 Subject: [PATCH] Cleanup: Avoid state creation for first simulation input node evaluation On an evaluation of the simulation input node when there is no previous state, the node's inputs are evaluated and passed directly to the outputs. Currently this a bit confusing, since they are first converted into a simulation state and _then_ passed to the outputs. This commit simplifies the node to avoid creating a simulation state, just moving the values directly instead. The inputs are also set to unused when there is a previous state too. --- .../nodes/node_geo_simulation_input.cc | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_simulation_input.cc b/source/blender/nodes/geometry/nodes/node_geo_simulation_input.cc index 045a610f9b5..4fa74f3ef20 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_simulation_input.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_simulation_input.cc @@ -57,7 +57,7 @@ class LazyFunctionForSimulationInputNode final : public LazyFunction { { const GeoNodesLFUserData &user_data = *static_cast( context.user_data); - const GeoNodesModifierData &modifier_data = *user_data.modifier_data; + GeoNodesModifierData &modifier_data = *user_data.modifier_data; if (modifier_data.current_simulation_state == nullptr) { params.set_default_remaining_outputs(); return; @@ -71,13 +71,28 @@ class LazyFunctionForSimulationInputNode final : public LazyFunction { const bke::sim::SimulationZoneID zone_id = get_simulation_zone_id(*user_data.compute_context, output_node_id_); + Array output_values(simulation_items_.size()); + for (const int i : simulation_items_.index_range()) { + output_values[i] = params.get_output_data_ptr(i + 1); + } + const bke::sim::SimulationZoneState *prev_zone_state = modifier_data.prev_simulation_state == nullptr ? nullptr : modifier_data.prev_simulation_state->get_zone_state(zone_id); - std::optional initial_prev_zone_state; - if (prev_zone_state == nullptr) { + if (prev_zone_state) { + simulation_state_to_values(simulation_items_, + *prev_zone_state, + *modifier_data.self_object, + *user_data.compute_context, + node_, + output_values); + for (const int i : inputs_.index_range()) { + params.set_input_unused(i); + } + } + else { Array input_values(simulation_items_.size(), nullptr); for (const int i : simulation_items_.index_range()) { input_values[i] = params.try_get_input_data_ptr_or_request(i); @@ -86,22 +101,11 @@ class LazyFunctionForSimulationInputNode final : public LazyFunction { /* Wait until all inputs are available. */ return; } - - initial_prev_zone_state.emplace(); - values_to_simulation_state(simulation_items_, input_values, *initial_prev_zone_state); - prev_zone_state = &*initial_prev_zone_state; + for (const int i : input_values.index_range()) { + inputs_[i].type->move_construct(input_values[i], output_values[i]); + } } - Array output_values(simulation_items_.size()); - for (const int i : simulation_items_.index_range()) { - output_values[i] = params.get_output_data_ptr(i + 1); - } - simulation_state_to_values(simulation_items_, - *prev_zone_state, - *modifier_data.self_object, - *user_data.compute_context, - node_, - output_values); for (const int i : simulation_items_.index_range()) { params.output_set(i + 1); } -- 2.30.2