Blender V4.3
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 <map>
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,
24 Empty,
26
27 /* Value types */
28 String,
30 Boolean,
31 Integer,
32
33 /* Arithmetic types. NOTE: Ordered by type cast */
34 Float,
35 Vector2,
36 Vector3,
37 Color3,
38 Vector4,
39 Color4,
40
41 /* Shader types. NOTE: There are only supported types */
42 BSDF,
43 EDF,
47
48 /* Special type to retrieve opacity for <surface> */
50 };
51 enum class CompareOp { Less = 0, LessEq, Eq, GreaterEq, Greater, NotEq };
52
53 public:
54 MaterialX::ValuePtr value;
55 MaterialX::NodePtr node;
56 MaterialX::InputPtr input;
57 MaterialX::OutputPtr output;
58
59 private:
60 MaterialX::GraphElement *graph_ = nullptr;
61
62 public:
63 /* NOTE: Default constructor added to allow easy work with std::map.
64 * Don't use this constructor to create NodeItem. */
65 NodeItem() = default;
66 NodeItem(MaterialX::GraphElement *graph);
67 ~NodeItem() = default;
68
69 static Type type(const std::string &type_str);
70 static std::string type(Type type);
71 static bool is_arithmetic(Type 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
NodeItem operator*(const NodeItem &other) const
Definition node_item.cc:153
NodeItem operator[](int index) const
Definition node_item.cc:188
NodeItem add_output(const std::string &out_name, Type out_type)
Definition node_item.cc:856
NodeItem clamp(const NodeItem &min_val, const NodeItem &max_val) const
Definition node_item.cc:358
NodeItem dotproduct(const NodeItem &other) const
Definition node_item.cc:291
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:245
bool operator==(const NodeItem &other) const
Definition node_item.cc:221
NodeItem atan2(const NodeItem &other) const
Definition node_item.cc:436
NodeItem create_input(const std::string &name, const NodeItem &item) const
Definition node_item.cc:863
MaterialX::OutputPtr output
Definition node_item.h:57
NodeItem operator+(const NodeItem &other) const
Definition node_item.cc:125
static bool is_arithmetic(Type type)
Definition node_item.cc:115
NodeItem if_else(CompareOp op, const NodeItem &other, const NodeItem &if_val, const NodeItem &else_val) const
Definition node_item.cc:685
NodeItem rotate(const NodeItem &angle, const NodeItem &axis)
Definition node_item.cc:380
NodeItem convert(Type to_type) const
Definition node_item.cc:481
NodeItem create_output(const std::string &name, const NodeItem &item) const
Definition node_item.cc:880
NodeItem operator^(const NodeItem &other) const
Definition node_item.cc:183
NodeItem operator/(const NodeItem &other) const
Definition node_item.cc:172
std::vector< std::pair< std::string, NodeItem > > Inputs
Definition node_item.h:20
NodeItem operator%(const NodeItem &other) const
Definition node_item.cc:177
NodeItem create_node(const std::string &category, Type type) const
Definition node_item.cc:762
#define mix(a, b, c)
Definition hash.h:36
CCL_NAMESPACE_BEGIN ccl_device float invert(float color, float factor)
Definition invert.h:9
static Type to_type(const eGPUType type)
#define min(a, b)
Definition sort.c:32
float max