Cleanup: Avoid state creation in simulation input evaluation #107795
|
@ -57,7 +57,7 @@ class LazyFunctionForSimulationInputNode final : public LazyFunction {
|
||||||
{
|
{
|
||||||
const GeoNodesLFUserData &user_data = *static_cast<const GeoNodesLFUserData *>(
|
const GeoNodesLFUserData &user_data = *static_cast<const GeoNodesLFUserData *>(
|
||||||
context.user_data);
|
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) {
|
if (modifier_data.current_simulation_state == nullptr) {
|
||||||
params.set_default_remaining_outputs();
|
params.set_default_remaining_outputs();
|
||||||
return;
|
return;
|
||||||
|
@ -71,13 +71,28 @@ class LazyFunctionForSimulationInputNode final : public LazyFunction {
|
||||||
const bke::sim::SimulationZoneID zone_id = get_simulation_zone_id(*user_data.compute_context,
|
const bke::sim::SimulationZoneID zone_id = get_simulation_zone_id(*user_data.compute_context,
|
||||||
output_node_id_);
|
output_node_id_);
|
||||||
|
|
||||||
|
Array<void *> 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 =
|
const bke::sim::SimulationZoneState *prev_zone_state =
|
||||||
modifier_data.prev_simulation_state == nullptr ?
|
modifier_data.prev_simulation_state == nullptr ?
|
||||||
nullptr :
|
nullptr :
|
||||||
modifier_data.prev_simulation_state->get_zone_state(zone_id);
|
modifier_data.prev_simulation_state->get_zone_state(zone_id);
|
||||||
|
|
||||||
std::optional<bke::sim::SimulationZoneState> initial_prev_zone_state;
|
if (prev_zone_state) {
|
||||||
if (prev_zone_state == nullptr) {
|
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<void *> input_values(simulation_items_.size(), nullptr);
|
Array<void *> input_values(simulation_items_.size(), nullptr);
|
||||||
for (const int i : simulation_items_.index_range()) {
|
for (const int i : simulation_items_.index_range()) {
|
||||||
input_values[i] = params.try_get_input_data_ptr_or_request(i);
|
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. */
|
/* Wait until all inputs are available. */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
for (const int i : input_values.index_range()) {
|
||||||
initial_prev_zone_state.emplace();
|
inputs_[i].type->move_construct(input_values[i], output_values[i]);
|
||||||
values_to_simulation_state(simulation_items_, input_values, *initial_prev_zone_state);
|
}
|
||||||
prev_zone_state = &*initial_prev_zone_state;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Array<void *> 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()) {
|
for (const int i : simulation_items_.index_range()) {
|
||||||
params.output_set(i + 1);
|
params.output_set(i + 1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Setting the inputs to unused can be done but shouldn't be necessary, because they are set to unused automatically when the node finished (all maybe-used outputs have been computed).