Blender V5.0
node_item.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include "DNA_node_types.h"
8
9#include <MaterialXCore/Node.h>
10
12
18class NodeItem {
19 public:
20 using Inputs = std::vector<std::pair<std::string, NodeItem>>;
21
22 enum class Type {
23 Any = 0,
26
27 /* Value types */
32
33 /* Arithmetic types. NOTE: Ordered by type cast */
40
41 /* Shader types. NOTE: There are only supported types */
47
48 /* Special type to retrieve opacity for <surface> */
50 };
51 enum class CompareOp { Less = 0, LessEq, Eq, GreaterEq, Greater, NotEq };
52
53 MaterialX::ValuePtr value;
54 MaterialX::NodePtr node;
55 MaterialX::InputPtr input;
56 MaterialX::OutputPtr output;
57
58 private:
59 MaterialX::GraphElement *graph_ = nullptr;
60
61 public:
62 /* NOTE: Default constructor added to allow easy work with std::map.
63 * Don't use this constructor to create NodeItem. */
64 NodeItem() = default;
65 NodeItem(MaterialX::GraphElement *graph);
66 ~NodeItem() = default;
67
68 static Type type(const std::string &type_str);
69 static std::string type(Type type);
70 static bool is_arithmetic(Type type);
71 static bool is_convertible(eNodeSocketDatatype from_type, Type to_type);
72
73 /* Operators */
74 operator bool() const;
75 NodeItem operator+(const NodeItem &other) const;
76 NodeItem operator-(const NodeItem &other) const;
77 NodeItem operator-() const;
78 NodeItem operator*(const NodeItem &other) const;
79 NodeItem operator/(const NodeItem &other) const;
80 NodeItem operator%(const NodeItem &other) const;
81 NodeItem operator^(const NodeItem &other) const;
82 NodeItem operator[](int index) const;
83 bool operator==(const NodeItem &other) const;
84 bool operator!=(const NodeItem &other) const;
85
86 /* Math functions */
87 NodeItem abs() const;
88 NodeItem floor() const;
89 NodeItem ceil() const;
90 NodeItem length() const;
91 NodeItem normalize() const;
92 NodeItem min(const NodeItem &other) const;
93 NodeItem max(const NodeItem &other) const;
94 NodeItem dotproduct(const NodeItem &other) const;
95 NodeItem mix(const NodeItem &val1, const NodeItem &val2) const;
96 NodeItem clamp(const NodeItem &min_val, const NodeItem &max_val) const;
97 NodeItem clamp(float min_val = 0.0f, float max_val = 1.0f) const;
98 NodeItem rotate(const NodeItem &angle, const NodeItem &axis); /* angle in degrees */
99 NodeItem rotate(const NodeItem &angle_xyz, bool invert = false); /* angle in degrees */
100 NodeItem sin() const;
101 NodeItem cos() const;
102 NodeItem tan() const;
103 NodeItem asin() const;
104 NodeItem acos() const;
105 NodeItem atan() const;
106 NodeItem atan2(const NodeItem &other) const;
107 NodeItem sinh() const;
108 NodeItem cosh() const;
109 NodeItem tanh() const;
110 NodeItem ln() const;
111 NodeItem sqrt() const;
112 NodeItem sign() const;
113 NodeItem exp() const;
115 NodeItem to_vector() const;
117 const NodeItem &other,
118 const NodeItem &if_val,
119 const NodeItem &else_val) const;
120
121 /* Useful functions */
122 NodeItem empty() const;
123 template<class T> NodeItem val(const T &data) const;
124 Type type() const;
125
126 /* Node functions */
127 NodeItem create_node(const std::string &category, Type type) const;
128 NodeItem create_node(const std::string &category, Type type, const Inputs &inputs) const;
129 template<class T> void set_input(const std::string &in_name, const T &value, Type in_type);
130 void set_input(const std::string &in_name, const NodeItem &item);
131 NodeItem add_output(const std::string &out_name, Type out_type);
132
133 /* Output functions */
134 NodeItem create_input(const std::string &name, const NodeItem &item) const;
135 NodeItem create_output(const std::string &name, const NodeItem &item) const;
136
137 private:
138 static Type cast_types(NodeItem &item1, NodeItem &item2);
139
140 bool is_arithmetic() const;
141 NodeItem arithmetic(const std::string &category, std::function<float(float)> func) const;
142 NodeItem arithmetic(const NodeItem &other,
143 const std::string &category,
144 std::function<float(float, float)> func,
145 Type to_type = Type::Any) const;
146};
147
148template<class T> NodeItem NodeItem::val(const T &data) const
149{
150 NodeItem res(graph_);
151 res.value = MaterialX::Value::createValue<T>(data);
152 return res;
153}
154
155template<class T>
156void NodeItem::set_input(const std::string &in_name, const T &value, Type in_type)
157{
158 node->setInputValue(in_name, value, type(in_type));
159}
160
161} // namespace blender::nodes::materialx
eNodeSocketDatatype
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Definition IK_Math.h:117
BMesh const char void * data
NodeItem operator*(const NodeItem &other) const
Definition node_item.cc:154
NodeItem operator[](int index) const
Definition node_item.cc:189
NodeItem add_output(const std::string &out_name, Type out_type)
Definition node_item.cc:922
NodeItem clamp(const NodeItem &min_val, const NodeItem &max_val) const
Definition node_item.cc:359
NodeItem dotproduct(const NodeItem &other) const
Definition node_item.cc:292
NodeItem val(const T &data) const
Definition node_item.h:148
void set_input(const std::string &in_name, const T &value, Type in_type)
Definition node_item.h:156
bool operator!=(const NodeItem &other) const
Definition node_item.cc:246
bool operator==(const NodeItem &other) const
Definition node_item.cc:222
NodeItem atan2(const NodeItem &other) const
Definition node_item.cc:437
NodeItem create_input(const std::string &name, const NodeItem &item) const
Definition node_item.cc:929
MaterialX::OutputPtr output
Definition node_item.h:56
NodeItem operator+(const NodeItem &other) const
Definition node_item.cc:126
static bool is_arithmetic(Type type)
Definition node_item.cc:116
NodeItem if_else(CompareOp op, const NodeItem &other, const NodeItem &if_val, const NodeItem &else_val) const
Definition node_item.cc:754
NodeItem rotate(const NodeItem &angle, const NodeItem &axis)
Definition node_item.cc:381
NodeItem convert(Type to_type) const
Definition node_item.cc:517
NodeItem create_output(const std::string &name, const NodeItem &item) const
Definition node_item.cc:946
NodeItem operator^(const NodeItem &other) const
Definition node_item.cc:184
static bool is_convertible(eNodeSocketDatatype from_type, Type to_type)
Definition node_item.cc:482
static Type type(const std::string &type_str)
Definition node_item.cc:16
NodeItem operator/(const NodeItem &other) const
Definition node_item.cc:173
std::vector< std::pair< std::string, NodeItem > > Inputs
Definition node_item.h:20
NodeItem operator%(const NodeItem &other) const
Definition node_item.cc:178
NodeItem create_node(const std::string &category, Type type) const
Definition node_item.cc:831
CCL_NAMESPACE_BEGIN ccl_device float invert(const float color, const float factor)
Definition invert.h:11
float[4] Vector4
#define T
static Type to_type(const GPUType type)
static blender::bke::bNodeSocketTemplate inputs[]
const char * name
#define mix
#define min(a, b)
Definition sort.cc:36
max
Definition text_draw.cc:251