Blender V4.3
value_elem.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6
8
9std::optional<ElemVariant> get_elem_variant_for_socket_type(const eNodeSocketDatatype type)
10{
11 switch (type) {
12 case SOCK_FLOAT:
13 return {{FloatElem()}};
14 case SOCK_INT:
15 return {{IntElem()}};
16 case SOCK_BOOLEAN:
17 return {{BoolElem()}};
18 case SOCK_VECTOR:
19 return {{VectorElem()}};
20 case SOCK_ROTATION:
21 return {{RotationElem()}};
22 case SOCK_MATRIX:
23 return {{MatrixElem()}};
24 default:
25 return std::nullopt;
26 }
27}
28
29std::optional<ElemVariant> convert_socket_elem(const bNodeSocket &old_socket,
30 const bNodeSocket &new_socket,
31 const ElemVariant &old_elem)
32{
33 const eNodeSocketDatatype old_type = eNodeSocketDatatype(old_socket.type);
34 const eNodeSocketDatatype new_type = eNodeSocketDatatype(new_socket.type);
35 if (old_type == new_type) {
36 return old_elem;
37 }
38 if (ELEM(old_type, SOCK_INT, SOCK_FLOAT, SOCK_BOOLEAN) &&
40 {
41 std::optional<ElemVariant> new_elem = get_elem_variant_for_socket_type(new_type);
42 if (old_elem) {
43 new_elem->set_all();
44 }
45 return new_elem;
46 }
47 switch (old_type) {
48 case SOCK_MATRIX: {
49 const MatrixElem &transform_elem = std::get<MatrixElem>(old_elem.elem);
50 if (new_type == SOCK_ROTATION) {
51 return ElemVariant{transform_elem.rotation};
52 }
53 break;
54 }
55 case SOCK_ROTATION: {
56 const RotationElem &rotation_elem = std::get<RotationElem>(old_elem.elem);
57 if (new_type == SOCK_MATRIX) {
58 MatrixElem matrix_elem;
59 matrix_elem.rotation = rotation_elem;
60 return ElemVariant{matrix_elem};
61 }
62 if (new_type == SOCK_VECTOR) {
63 return ElemVariant{rotation_elem.euler};
64 }
65 break;
66 }
67 case SOCK_VECTOR: {
68 const VectorElem &vector_elem = std::get<VectorElem>(old_elem.elem);
69 if (new_type == SOCK_ROTATION) {
70 RotationElem rotation_elem;
71 rotation_elem.euler = vector_elem;
72 if (rotation_elem) {
73 rotation_elem.angle = FloatElem::all();
74 rotation_elem.axis = VectorElem::all();
75 }
76 return ElemVariant{rotation_elem};
77 }
78 }
79 default:
80 break;
81 }
82 return std::nullopt;
83}
84
86 const Map<const bNodeSocket *, ElemVariant> &elem_by_socket,
87 Vector<SocketElem> &output_elems)
88 : elem_by_socket_(elem_by_socket), output_elems_(output_elems), node(node)
89{
90}
91
93 const bNode &node,
94 const Map<const bNodeSocket *, ElemVariant> &elem_by_socket,
95 Vector<SocketElem> &input_elems)
96 : elem_by_socket_(elem_by_socket), input_elems_(input_elems), node(node)
97{
98}
99
100} // namespace blender::nodes::value_elem
#define ELEM(...)
eNodeSocketDatatype
@ SOCK_INT
@ SOCK_VECTOR
@ SOCK_BOOLEAN
@ SOCK_MATRIX
@ SOCK_FLOAT
@ SOCK_ROTATION
ElemEvalParams(const bNode &node, const Map< const bNodeSocket *, ElemVariant > &elem_by_socket, Vector< SocketElem > &output_elems)
Definition value_elem.cc:85
InverseElemEvalParams(const bNode &node, const Map< const bNodeSocket *, ElemVariant > &elem_by_socket, Vector< SocketElem > &input_elems)
Definition value_elem.cc:92
std::optional< ElemVariant > get_elem_variant_for_socket_type(const eNodeSocketDatatype type)
Definition value_elem.cc:9
std::optional< ElemVariant > convert_socket_elem(const bNodeSocket &old_socket, const bNodeSocket &new_socket, const ElemVariant &old_elem)
Definition value_elem.cc:29
std::variant< BoolElem, FloatElem, IntElem, VectorElem, RotationElem, MatrixElem > elem