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); }