forked from blender/blender
Implement export of Shader BSDF nodes #13
@ -54,7 +54,7 @@ NodeItem::Type NodeItem::type(const std::string &type_str)
|
|||||||
return Type::Material;
|
return Type::Material;
|
||||||
}
|
}
|
||||||
BLI_assert_unreachable();
|
BLI_assert_unreachable();
|
||||||
return Type::None;
|
return Type::Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string NodeItem::type(Type type)
|
std::string NodeItem::type(Type type)
|
||||||
@ -151,7 +151,7 @@ bool NodeItem::operator==(const NodeItem &other) const
|
|||||||
NodeItem item1 = *this;
|
NodeItem item1 = *this;
|
||||||
NodeItem item2 = other;
|
NodeItem item2 = other;
|
||||||
Type to_type = adjust_types(item1, item2);
|
Type to_type = adjust_types(item1, item2);
|
||||||
if (to_type == Type::None) {
|
if (to_type == Type::Empty) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return item1.value->getValueString() == item2.value->getValueString();
|
return item1.value->getValueString() == item2.value->getValueString();
|
||||||
@ -529,7 +529,7 @@ NodeItem NodeItem::if_else(CompareOp op,
|
|||||||
auto item1 = if_val;
|
auto item1 = if_val;
|
||||||
auto item2 = else_val;
|
auto item2 = else_val;
|
||||||
Type to_type = adjust_types(item1, item2);
|
Type to_type = adjust_types(item1, item2);
|
||||||
if (to_type == Type::None) {
|
if (to_type == Type::Empty) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -579,7 +579,7 @@ NodeItem::Type NodeItem::type() const
|
|||||||
if (node) {
|
if (node) {
|
||||||
return type(node->getType());
|
return type(node->getType());
|
||||||
}
|
}
|
||||||
return Type::None;
|
return Type::Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeItem::set_input(const std::string &name,
|
void NodeItem::set_input(const std::string &name,
|
||||||
@ -647,7 +647,7 @@ NodeItem::Type NodeItem::adjust_types(NodeItem &item1, NodeItem &item2)
|
|||||||
return t1;
|
return t1;
|
||||||
}
|
}
|
||||||
if (!is_arithmetic(t1) || !is_arithmetic(t2)) {
|
if (!is_arithmetic(t1) || !is_arithmetic(t2)) {
|
||||||
return Type::None;
|
return Type::Empty;
|
||||||
}
|
}
|
||||||
if (t1 < t2) {
|
if (t1 < t2) {
|
||||||
item1 = item1.convert(t2);
|
item1 = item1.convert(t2);
|
||||||
@ -728,7 +728,7 @@ NodeItem NodeItem::arithmetic(const NodeItem &other,
|
|||||||
NodeItem item1 = *this;
|
NodeItem item1 = *this;
|
||||||
NodeItem item2 = other;
|
NodeItem item2 = other;
|
||||||
Type to_type = adjust_types(item1, item2);
|
Type to_type = adjust_types(item1, item2);
|
||||||
if (to_type == Type::None) {
|
if (to_type == Type::Empty) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,8 @@ namespace blender::nodes::materialx {
|
|||||||
class NodeItem {
|
class NodeItem {
|
||||||
public:
|
public:
|
||||||
enum class Type {
|
enum class Type {
|
||||||
None = 0,
|
Empty = 0,
|
||||||
|
Any,
|
||||||
|
|
||||||
/* Value types */
|
/* Value types */
|
||||||
String,
|
String,
|
||||||
@ -30,7 +31,6 @@ class NodeItem {
|
|||||||
EDF,
|
EDF,
|
||||||
SurfaceShader,
|
SurfaceShader,
|
||||||
Material,
|
Material,
|
||||||
|
|
||||||
};
|
};
|
||||||
enum class CompareOp { Less = 0, LessEq, Eq, GreaterEq, Greater, NotEq };
|
enum class CompareOp { Less = 0, LessEq, Eq, GreaterEq, Greater, NotEq };
|
||||||
|
|
||||||
|
@ -129,22 +129,17 @@ NodeItem NodeParser::get_input_link(const bNodeSocket &socket)
|
|||||||
from_node = link->fromnode;
|
from_node = link->fromnode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Checking if node was already computed */
|
/* Creating required NodeParser object */
|
||||||
res.node = graph_->getNode(node_name());
|
std::unique_ptr<NodeParser> parser;
|
||||||
if (res.node) {
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Computing from_node with required NodeParser object */
|
|
||||||
#define CASE_NODE_TYPE(type, T) \
|
#define CASE_NODE_TYPE(type, T) \
|
||||||
case type: \
|
case type: \
|
||||||
res = \
|
parser = \
|
||||||
T(graph_, depsgraph_, material_, from_node, link->fromsock).compute_full(); \
|
std::make_unique<T>(graph_, depsgraph_, material_, from_node, link->fromsock); \
|
||||||
break;
|
break;
|
||||||
|
|
||||||
switch (from_node->typeinfo->type) {
|
switch (from_node->typeinfo->type) {
|
||||||
CASE_NODE_TYPE(SH_NODE_BRIGHTCONTRAST, BrightContrastNodeParser)
|
CASE_NODE_TYPE(SH_NODE_BRIGHTCONTRAST, BrightContrastNodeParser)
|
||||||
//CASE_NODE_TYPE(SH_NODE_BSDF_PRINCIPLED, BSDFPrincipledNodeParser)
|
|
||||||
CASE_NODE_TYPE(SH_NODE_COMBINE_COLOR, CombineColorNodeParser)
|
CASE_NODE_TYPE(SH_NODE_COMBINE_COLOR, CombineColorNodeParser)
|
||||||
CASE_NODE_TYPE(SH_NODE_COMBXYZ, CombineXYZNodeParser)
|
CASE_NODE_TYPE(SH_NODE_COMBXYZ, CombineXYZNodeParser)
|
||||||
CASE_NODE_TYPE(SH_NODE_HUE_SAT, HueSatValNodeParser)
|
CASE_NODE_TYPE(SH_NODE_HUE_SAT, HueSatValNodeParser)
|
||||||
@ -167,6 +162,14 @@ NodeItem NodeParser::get_input_link(const bNodeSocket &socket)
|
|||||||
from_node->typeinfo->type);
|
from_node->typeinfo->type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Checking if node was already computed */
|
||||||
|
res.node = graph_->getNode(parser->node_name());
|
||||||
|
if (res.node) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Computing */
|
||||||
|
res = parser->compute_full();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,16 +246,13 @@ NodeItem ShaderNodeParser::get_input_shader(const bNodeSocket &socket, NodeItem:
|
|||||||
from_node = link->fromnode;
|
from_node = link->fromnode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Checking if node was already computed */
|
/* Creating required ShaderNodeParser object */
|
||||||
res.node = graph_->getNode(node_name());
|
std::unique_ptr<ShaderNodeParser> parser;
|
||||||
if (res.node) {
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Computing from_node with required NodeParser object */
|
|
||||||
#define CASE_SHADER_NODE_TYPE(type, T) \
|
#define CASE_SHADER_NODE_TYPE(type, T) \
|
||||||
case type: \
|
case type: \
|
||||||
res = T(graph_, depsgraph_, material_, from_node, link->fromsock, shader_type).compute_full(); \
|
parser = std::make_unique<T>( \
|
||||||
|
graph_, depsgraph_, material_, from_node, link->fromsock, shader_type); \
|
||||||
break;
|
break;
|
||||||
|
|
||||||
switch (from_node->typeinfo->type) {
|
switch (from_node->typeinfo->type) {
|
||||||
@ -265,6 +265,14 @@ NodeItem ShaderNodeParser::get_input_shader(const bNodeSocket &socket, NodeItem:
|
|||||||
from_node->typeinfo->type);
|
from_node->typeinfo->type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Checking if node was already computed */
|
||||||
|
res.node = graph_->getNode(parser->node_name());
|
||||||
|
if (res.node) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Computing */
|
||||||
|
res = parser->compute_full();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ NodeItem OutputMaterialNodeParser::compute_default()
|
|||||||
|
|
||||||
std::string OutputMaterialNodeParser::node_name()
|
std::string OutputMaterialNodeParser::node_name()
|
||||||
{
|
{
|
||||||
return node_->name;
|
return NodeParser::node_name();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace blender::nodes::materialx
|
} // namespace blender::nodes::materialx
|
||||||
|
@ -20,8 +20,8 @@ NodeItem TexCheckerNodeParser::compute()
|
|||||||
NodeItem mix = (vector.extract(0).floor() + vector.extract(1).floor())
|
NodeItem mix = (vector.extract(0).floor() + vector.extract(1).floor())
|
||||||
.if_else(NodeItem::CompareOp::Eq, value(1.0f), value(1.0f), value(0.0f));
|
.if_else(NodeItem::CompareOp::Eq, value(1.0f), value(1.0f), value(0.0f));
|
||||||
NodeItem res = create_node("mix", "color3");
|
NodeItem res = create_node("mix", "color3");
|
||||||
res.set_input("fg", color1, NodeItem::Type::Color3);
|
res.set_input("fg", color1);
|
||||||
res.set_input("bg", color2, NodeItem::Type::Color3);
|
res.set_input("bg", color2);
|
||||||
res.set_input("mix", mix);
|
res.set_input("mix", mix);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user