Files
test2/source/blender/nodes/NOD_inverse_eval_params.hh
Jacques Lucke 890ab23e0d Refactor: Nodes: return pointer instead of reference from in/output_by_identifier
This makes it possible to use these methods in cases where it's not guaranteed
that the identifier exists on a node.
2025-07-31 21:58:58 +02:00

61 lines
2.0 KiB
C++

/* SPDX-FileCopyrightText: 2024 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
#include "BLI_map.hh"
#include "BKE_node_runtime.hh"
#include "BKE_node_socket_value.hh"
namespace blender::nodes::inverse_eval {
/**
* Is passed to inverse node evaluation functions to figure out how the inputs have to change
* exactly to get a specific output value. What is special here is that this gives access to
* (logged) node inputs and node output values, instead of just either inputs or outputs.
*
* This is required because sometimes certain inputs are fixed and need to be known to be able to
* figure out how another input changes. A typical example of this is the math node, where the
* second input is fixed and only the first input changes.
*/
class InverseEvalParams {
private:
const Map<const bNodeSocket *, bke::SocketValueVariant> &socket_values_;
Map<const bNodeSocket *, bke::SocketValueVariant> &updated_socket_values_;
public:
const bNode &node;
InverseEvalParams(const bNode &node,
const Map<const bNodeSocket *, bke::SocketValueVariant> &socket_values,
Map<const bNodeSocket *, bke::SocketValueVariant> &updated_socket_values);
template<typename T> T get_output(const StringRef identifier) const
{
const bNodeSocket &socket = *node.output_by_identifier(identifier);
if (const bke::SocketValueVariant *value = socket_values_.lookup_ptr(&socket)) {
return value->get<T>();
}
return T();
}
template<typename T> T get_input(const StringRef identifier) const
{
const bNodeSocket &socket = *node.input_by_identifier(identifier);
if (const bke::SocketValueVariant *value = socket_values_.lookup_ptr(&socket)) {
return value->get<T>();
}
return T();
}
template<typename T> void set_input(const StringRef identifier, T value)
{
const bNodeSocket &socket = *node.input_by_identifier(identifier);
updated_socket_values_.add(&socket, bke::SocketValueVariant(value));
}
};
} // namespace blender::nodes::inverse_eval