tornavis/source/blender/compositor/realtime_compositor/intern/input_single_value_operatio...

67 lines
2.0 KiB
C++

/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#include "BLI_assert.h"
#include "BLI_math_vector_types.hh"
#include "COM_input_single_value_operation.hh"
#include "COM_operation.hh"
#include "COM_result.hh"
#include "COM_utilities.hh"
namespace blender::realtime_compositor {
const StringRef InputSingleValueOperation::output_identifier_ = StringRef("Output");
InputSingleValueOperation::InputSingleValueOperation(Context &context, DInputSocket input_socket)
: Operation(context), input_socket_(input_socket)
{
const ResultType result_type = get_node_socket_result_type(input_socket_.bsocket());
Result result = context.create_result(result_type);
/* The result of an input single value operation is guaranteed to have a single user. */
result.set_initial_reference_count(1);
populate_result(result);
}
void InputSingleValueOperation::execute()
{
/* Allocate a single value for the result. */
Result &result = get_result();
result.allocate_single_value();
const bNodeSocket *bsocket = input_socket_.bsocket();
/* Set the value of the result to the default value of the input socket. */
switch (result.type()) {
case ResultType::Float:
result.set_float_value(bsocket->default_value_typed<bNodeSocketValueFloat>()->value);
break;
case ResultType::Vector:
result.set_vector_value(
float4(float3(bsocket->default_value_typed<bNodeSocketValueVector>()->value), 0.0f));
break;
case ResultType::Color:
result.set_color_value(float4(bsocket->default_value_typed<bNodeSocketValueRGBA>()->value));
break;
default:
/* Other types are internal and needn't be handled by operations. */
BLI_assert_unreachable();
break;
}
}
Result &InputSingleValueOperation::get_result()
{
return Operation::get_result(output_identifier_);
}
void InputSingleValueOperation::populate_result(Result result)
{
Operation::populate_result(output_identifier_, result);
}
} // namespace blender::realtime_compositor