From dbd0e4492b9ff8d5bd2e99686790db5e4d13d7e4 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Fri, 1 Sep 2023 17:11:32 +0300 Subject: [PATCH 01/15] MaterialX: added Hue/Saturation/Value node --- source/blender/nodes/shader/CMakeLists.txt | 1 + .../nodes/shader/materialx/nodes/hueSatVal.cc | 32 +++++++++++++++++++ .../shader/materialx/nodes/node_parser.cc | 3 ++ .../shader/materialx/nodes/node_parser.h | 1 + 4 files changed, 37 insertions(+) create mode 100644 source/blender/nodes/shader/materialx/nodes/hueSatVal.cc diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index 1dec91b8b3ad..8bc76c4d0ae3 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -158,6 +158,7 @@ if(WITH_MATERIALX) materialx/nodes/tex_environment.cc materialx/nodes/tex_noise.cc materialx/nodes/tex_checker.cc + materialx/nodes/hueSatVal.cc materialx/material.h materialx/nodes/node_item.h diff --git a/source/blender/nodes/shader/materialx/nodes/hueSatVal.cc b/source/blender/nodes/shader/materialx/nodes/hueSatVal.cc new file mode 100644 index 000000000000..7edd72c35bc1 --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/hueSatVal.cc @@ -0,0 +1,32 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" + +namespace blender::nodes::materialx { + +NodeItem HueSatValNodeParser::compute() +{ + /* TODO: implement fac, see do_hue_sat_fac in source\blender\nodes\texture\nodes\node_texture_hueSatVal.cc */ + NodeItem hue = get_input_value("Hue"); + NodeItem saturation = get_input_value("Saturation"); + NodeItem val = get_input_value("Value"); + NodeItem fac = get_input_value("Fac"); + NodeItem color = get_input_value("Color"); + + /* Modifier to follow Cycles result */ + hue = hue - value(0.5f); + + NodeItem combine = create_node("combine3", "vector3"); + combine.set_input("in1", hue); + combine.set_input("in2", saturation); + combine.set_input("in3", val); + + NodeItem res = create_node("hsvadjust", "color3", false); + res.set_input("in", color.to_color3()); + res.set_input("amount", combine); + return res; +} + +} // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index 2c8974406d9b..1dbcd9836e20 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -136,6 +136,9 @@ NodeItem NodeParser::get_input_link(const bNodeSocket &socket) case SH_NODE_TEX_CHECKER: parser = std::make_unique(graph, depsgraph, material, in_node); break; + case SH_NODE_HUE_SAT: + parser = std::make_unique(graph, depsgraph, material, in_node); + break; default: CLOG_WARN(LOG_MATERIALX_SHADER, "Unsupported node: %s (%d)", in_node->name, in_node->type); return res; diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.h b/source/blender/nodes/shader/materialx/nodes/node_parser.h index 86d1935e41fd..d55a729112d7 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -68,5 +68,6 @@ DECLARE_PARSER(TexCheckerNodeParser) DECLARE_PARSER(TexEnvironmentNodeParser) DECLARE_PARSER(TexImageNodeParser) DECLARE_PARSER(TexNoiseNodeParser) +DECLARE_PARSER(HueSatValNodeParser) } // namespace blender::nodes::materialx -- 2.30.2 From a8505529beee97600ddc221b03872c11f200127a Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Fri, 1 Sep 2023 18:11:40 +0300 Subject: [PATCH 02/15] MaterialX: added NormalMapNode Also added NodeItem::to_vector3() --- source/blender/nodes/shader/CMakeLists.txt | 5 ++- .../nodes/shader/materialx/nodes/node_item.cc | 40 +++++++++++++++++++ .../nodes/shader/materialx/nodes/node_item.h | 1 + .../shader/materialx/nodes/node_parser.cc | 9 +++-- .../shader/materialx/nodes/node_parser.h | 3 +- .../shader/materialx/nodes/normal_map.cc | 39 ++++++++++++++++++ 6 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 source/blender/nodes/shader/materialx/nodes/normal_map.cc diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index 8bc76c4d0ae3..8d73553fee0c 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -149,17 +149,18 @@ if(WITH_MATERIALX) materialx/material.cc materialx/nodes/bsdf_principled.cc materialx/nodes/invert.cc + materialx/nodes/hueSatVal.cc materialx/nodes/math.cc materialx/nodes/mix_rgb.cc materialx/nodes/node_item.cc materialx/nodes/node_parser.cc + materialx/nodes/normal_map.cc materialx/nodes/output_material.cc materialx/nodes/tex_image.cc materialx/nodes/tex_environment.cc materialx/nodes/tex_noise.cc materialx/nodes/tex_checker.cc - materialx/nodes/hueSatVal.cc - + materialx/material.h materialx/nodes/node_item.h materialx/nodes/node_parser.h diff --git a/source/blender/nodes/shader/materialx/nodes/node_item.cc b/source/blender/nodes/shader/materialx/nodes/node_item.cc index f3cf3779058c..458f51ac9aa7 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_item.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_item.cc @@ -414,6 +414,46 @@ NodeItem NodeItem::to_color3() const return res; } +NodeItem NodeItem::to_vector3() const +{ + std::string mx_type = type(); + NodeItem res = empty(); + if (value) { + MaterialX::Vector3 c; + if (mx_type == "float") { + float v = value->asA(); + c = {v, v, v}; + } + else if (mx_type == "color3") { + auto v = value->asA(); + c = {v[0], v[1], v[2]}; + } + else if (mx_type == "color4") { + auto v = value->asA(); + c = {v[0], v[1], v[2]}; + } + else if (mx_type == "vector3") { + auto v = value->asA(); + c = {v[0], v[1], v[2]}; + } + else if (mx_type == "vector4") { + auto v = value->asA(); + c = {v[0], v[1], v[2]}; + } + else { + return res; + } + res.value = MaterialX::Value::createValue(c); + } + else if (node) { + if (mx_type != "vector3") { + return res; + } + res.node = node; + } + return res; +} + bool NodeItem::is_numeric() const { std::string t = type(); diff --git a/source/blender/nodes/shader/materialx/nodes/node_item.h b/source/blender/nodes/shader/materialx/nodes/node_item.h index 2f746cda36b7..690178111273 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_item.h +++ b/source/blender/nodes/shader/materialx/nodes/node_item.h @@ -74,6 +74,7 @@ class NodeItem { NodeItem exp() const; NodeItem to_color3() const; + NodeItem to_vector3() const; bool is_numeric() const; std::string type() const; diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index 1dbcd9836e20..f40b85655db0 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -118,12 +118,18 @@ NodeItem NodeParser::get_input_link(const bNodeSocket &socket) case SH_NODE_INVERT: parser = std::make_unique(graph, depsgraph, material, in_node); break; + case SH_NODE_HUE_SAT: + parser = std::make_unique(graph, depsgraph, material, in_node); + break; case SH_NODE_MATH: parser = std::make_unique(graph, depsgraph, material, in_node); break; case SH_NODE_MIX_RGB_LEGACY: parser = std::make_unique(graph, depsgraph, material, in_node); break; + case SH_NODE_NORMAL_MAP: + parser = std::make_unique(graph, depsgraph, material, in_node); + break; case SH_NODE_TEX_IMAGE: parser = std::make_unique(graph, depsgraph, material, in_node); break; @@ -136,9 +142,6 @@ NodeItem NodeParser::get_input_link(const bNodeSocket &socket) case SH_NODE_TEX_CHECKER: parser = std::make_unique(graph, depsgraph, material, in_node); break; - case SH_NODE_HUE_SAT: - parser = std::make_unique(graph, depsgraph, material, in_node); - break; default: CLOG_WARN(LOG_MATERIALX_SHADER, "Unsupported node: %s (%d)", in_node->name, in_node->type); return res; diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.h b/source/blender/nodes/shader/materialx/nodes/node_parser.h index d55a729112d7..dddfc073a81d 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -60,14 +60,15 @@ template NodeItem NodeParser::value(const T &data) const }; DECLARE_PARSER(BSDFPrincipledNodeParser) +DECLARE_PARSER(HueSatValNodeParser) DECLARE_PARSER(InvertNodeParser) DECLARE_PARSER(MathNodeParser) DECLARE_PARSER(MixRGBNodeParser) +DECLARE_PARSER(NormalMapNodeParser) DECLARE_PARSER(OutputMaterialNodeParser) DECLARE_PARSER(TexCheckerNodeParser) DECLARE_PARSER(TexEnvironmentNodeParser) DECLARE_PARSER(TexImageNodeParser) DECLARE_PARSER(TexNoiseNodeParser) -DECLARE_PARSER(HueSatValNodeParser) } // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/normal_map.cc b/source/blender/nodes/shader/materialx/nodes/normal_map.cc new file mode 100644 index 000000000000..3953c0ba913e --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/normal_map.cc @@ -0,0 +1,39 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" + +namespace blender::nodes::materialx { + +NodeItem NormalMapNodeParser::compute() +{ + std::string default_space = "object"; + NodeShaderNormalMap *normal_map_node = static_cast(node->storage); + NodeItem color = get_input_value("Color"); + NodeItem strength = get_input_value("Strength"); + + NodeItem res = create_node("normalmap", "vector3", false); + res.set_input("in", color.to_vector3()); + res.set_input("scale", strength); + + switch (normal_map_node->space) { + case SHD_SPACE_TANGENT: + res.set_input("space", value(std::string("tangent"))); + break; + case SHD_SPACE_OBJECT: + res.set_input("space", value(std::string("tangent"))); + break; + default: + res.set_input("space", value(default_space)); + CLOG_WARN(LOG_MATERIALX_SHADER, + "Ignoring unsupported Space: %d %s (%d), %s will be used", + normal_map_node->space, + node->name, + node->type, + default_space); + } + return res; +} + +} // namespace blender::nodes::materialx -- 2.30.2 From 7cdf99e7cb0253b25209e322d03621d62e609b5e Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Fri, 1 Sep 2023 19:06:56 +0300 Subject: [PATCH 03/15] MaterialX: added VectorMath Node --- source/blender/nodes/shader/CMakeLists.txt | 1 + .../shader/materialx/nodes/node_parser.cc | 3 + .../shader/materialx/nodes/node_parser.h | 1 + .../shader/materialx/nodes/vector_math.cc | 122 ++++++++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 source/blender/nodes/shader/materialx/nodes/vector_math.cc diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index 8d73553fee0c..99926267bd87 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -160,6 +160,7 @@ if(WITH_MATERIALX) materialx/nodes/tex_environment.cc materialx/nodes/tex_noise.cc materialx/nodes/tex_checker.cc + materialx/nodes/vector_math.cc materialx/material.h materialx/nodes/node_item.h diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index f40b85655db0..9096538c6083 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -142,6 +142,9 @@ NodeItem NodeParser::get_input_link(const bNodeSocket &socket) case SH_NODE_TEX_CHECKER: parser = std::make_unique(graph, depsgraph, material, in_node); break; + case SH_NODE_VECTOR_MATH: + parser = std::make_unique(graph, depsgraph, material, in_node); + break; default: CLOG_WARN(LOG_MATERIALX_SHADER, "Unsupported node: %s (%d)", in_node->name, in_node->type); return res; diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.h b/source/blender/nodes/shader/materialx/nodes/node_parser.h index dddfc073a81d..1fba917091ba 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -70,5 +70,6 @@ DECLARE_PARSER(TexCheckerNodeParser) DECLARE_PARSER(TexEnvironmentNodeParser) DECLARE_PARSER(TexImageNodeParser) DECLARE_PARSER(TexNoiseNodeParser) +DECLARE_PARSER(VectorMathNodeParser) } // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/vector_math.cc b/source/blender/nodes/shader/materialx/nodes/vector_math.cc new file mode 100644 index 000000000000..9d39a228b430 --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/vector_math.cc @@ -0,0 +1,122 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" +#include "../material.h" + +namespace blender::nodes::materialx { + +NodeItem VectorMathNodeParser::compute() +{ + /* TODO: finish some math operations */ + auto op = node->custom1; + NodeItem res = empty(); + + /* Single operand operations */ + NodeItem x = get_input_value(0); + switch (op) { + case NODE_VECTOR_MATH_SINE: + res = x.sin(); + break; + case NODE_VECTOR_MATH_COSINE: + res = x.cos(); + break; + case NODE_VECTOR_MATH_TANGENT: + res = x.tan(); + break; + case NODE_VECTOR_MATH_ABSOLUTE: + res = x.abs(); + break; + case NODE_VECTOR_MATH_FLOOR: + res = x.floor(); + break; + case NODE_VECTOR_MATH_CEIL: + res = x.ceil(); + break; + case NODE_VECTOR_MATH_FRACTION: + res = x % value(1.0f); + break; + case NODE_VECTOR_MATH_LENGTH: + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented math operation %d", op); + break; + case NODE_VECTOR_MATH_NORMALIZE: + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented math operation %d", op); + break; + + default: { + /* 2-operand operations */ + NodeItem y = get_input_value(1); + switch (op) { + case NODE_VECTOR_MATH_ADD: + res = x + y; + break; + case NODE_VECTOR_MATH_SUBTRACT: + res = x - y; + break; + case NODE_VECTOR_MATH_MULTIPLY: + res = x * y; + break; + case NODE_VECTOR_MATH_DIVIDE: + res = x / y; + break; + case NODE_VECTOR_MATH_MINIMUM: + res = x.min(y); + break; + case NODE_VECTOR_MATH_MAXIMUM: + res = x.max(y); + break; + case NODE_VECTOR_MATH_MODULO: + res = x % y; + break; + case NODE_VECTOR_MATH_SNAP: + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented math operation %d", op); + break; + case NODE_VECTOR_MATH_CROSS_PRODUCT: + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented math operation %d", op); + break; + case NODE_VECTOR_MATH_DOT_PRODUCT: + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented math operation %d", op); + break; + case NODE_VECTOR_MATH_PROJECT: + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented math operation %d", op); + break; + case NODE_VECTOR_MATH_REFLECT: + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented math operation %d", op); + break; + case NODE_VECTOR_MATH_DISTANCE: + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented math operation %d", op); + break; + case NODE_VECTOR_MATH_SCALE: + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented math operation %d", op); + break; + + default: { + /* 3-operand operations */ + NodeItem z = get_input_value(2); + switch (op) { + case NODE_VECTOR_MATH_MULTIPLY_ADD: + res = x * y + z; + break; + case NODE_VECTOR_MATH_REFRACT: + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented math operation %d", op); + break; + case NODE_VECTOR_MATH_FACEFORWARD: + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented math operation %d", op); + break; + case NODE_VECTOR_MATH_WRAP: + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented math operation %d", op); + break; + + default: + BLI_assert_unreachable(); + } + } + } + } + } + + return res; +} + +} // namespace blender::nodes::materialx -- 2.30.2 From 88e6acb54a952050b91c25cafbc9860ddb50cc33 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Mon, 4 Sep 2023 16:45:46 +0300 Subject: [PATCH 04/15] MaterialX: added support for separate operation and Separate XYZ node --- source/blender/nodes/shader/CMakeLists.txt | 9 +-- .../nodes/shader/materialx/nodes/node_item.cc | 69 +++++++++++++++++++ .../nodes/shader/materialx/nodes/node_item.h | 1 + .../shader/materialx/nodes/node_parser.cc | 1 + .../shader/materialx/nodes/node_parser.h | 1 + 5 files changed, 77 insertions(+), 4 deletions(-) diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index 30772d717716..226193523a34 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -148,18 +148,19 @@ if(WITH_MATERIALX) list(APPEND SRC materialx/material.cc materialx/nodes/bsdf_principled.cc - materialx/nodes/invert.cc materialx/nodes/hueSatVal.cc + materialx/nodes/invert.cc materialx/nodes/math.cc materialx/nodes/mix_rgb.cc materialx/nodes/node_item.cc materialx/nodes/node_parser.cc materialx/nodes/normal_map.cc materialx/nodes/output_material.cc - materialx/nodes/tex_image.cc - materialx/nodes/tex_environment.cc - materialx/nodes/tex_noise.cc + materialx/nodes/sepcomb_xyz.cc materialx/nodes/tex_checker.cc + materialx/nodes/tex_environment.cc + materialx/nodes/tex_image.cc + materialx/nodes/tex_noise.cc materialx/nodes/vector_math.cc materialx/material.h diff --git a/source/blender/nodes/shader/materialx/nodes/node_item.cc b/source/blender/nodes/shader/materialx/nodes/node_item.cc index 458f51ac9aa7..822bbff002ca 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_item.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_item.cc @@ -374,6 +374,75 @@ NodeItem NodeItem::exp() const return arithmetic("exp", [](float a) { return std::expf(a); }); } +NodeItem NodeItem::separate(int index) const +{ + NodeItem res = empty(); + std::string mx_type = type(); + if (value) { + float v; + if (mx_type == "float") { + v = value->asA(); + } + else if (mx_type == "color3") { + v = value->asA()[index]; + } + else if (mx_type == "color4") { + v = value->asA()[index]; + } + else if (mx_type == "vector2") { + v = value->asA()[index]; + } + else if (mx_type == "vector3") { + v = value->asA()[index]; + } + else if (mx_type == "vector4") { + v = value->asA()[index]; + } + else { + BLI_assert_unreachable(); + } + res = val(v); + } + else { + std::string node_name; + if (mx_type == "float") { + res = *this; + } + else if (mx_type == "vector2") { + node_name = "separate2"; + } + else if (mx_type == "vector3" || mx_type == "color3") { + node_name = "separate3"; + } + else if (mx_type == "vector4" || mx_type == "color4") { + node_name = "separate4"; + } + else { + BLI_assert_unreachable(); + } + res.node = graph_->addNode(node_name, MaterialX::EMPTY_STRING, "multioutput"); + bool is_color = STRPREFIX(mx_type.c_str(), "color"); + switch (index) { + case 0: + res.add_output(is_color ? "outr" : "outx", "float"); + break; + case 1: + res.add_output(is_color ? "outg" : "outy", "float"); + break; + case 2: + res.add_output(is_color ? "outb" : "outz", "float"); + break; + case 3: + res.add_output(is_color ? "outa" : "outw", "float"); + break; + default: + BLI_assert_unreachable(); + } + res.set_input("in", *this); + } + return res; +} + NodeItem NodeItem::to_color3() const { std::string mx_type = type(); diff --git a/source/blender/nodes/shader/materialx/nodes/node_item.h b/source/blender/nodes/shader/materialx/nodes/node_item.h index 690178111273..e815a4dad710 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_item.h +++ b/source/blender/nodes/shader/materialx/nodes/node_item.h @@ -72,6 +72,7 @@ class NodeItem { NodeItem sqrt() const; NodeItem sign() const; NodeItem exp() const; + NodeItem separate(int index) const; NodeItem to_color3() const; NodeItem to_vector3() const; diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index f1d418aa894d..dbabc21cfd26 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -131,6 +131,7 @@ NodeItem NodeParser::get_input_link(const bNodeSocket &socket) CASE_NODE_TYPE(SH_NODE_MATH, MathNodeParser) CASE_NODE_TYPE(SH_NODE_MIX_RGB_LEGACY, MixRGBNodeParser) CASE_NODE_TYPE(SH_NODE_NORMAL_MAP, NormalMapNodeParser) + CASE_NODE_TYPE(SH_NODE_SEPXYZ, SeparateXYZNodeParser) CASE_NODE_TYPE(SH_NODE_TEX_CHECKER, TexCheckerNodeParser) CASE_NODE_TYPE(SH_NODE_TEX_ENVIRONMENT, TexEnvironmentNodeParser) CASE_NODE_TYPE(SH_NODE_TEX_IMAGE, TexImageNodeParser) diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.h b/source/blender/nodes/shader/materialx/nodes/node_parser.h index 78e3c2968b54..5a12f8754c2e 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -67,6 +67,7 @@ DECLARE_PARSER(InvertNodeParser) DECLARE_PARSER(MathNodeParser) DECLARE_PARSER(MixRGBNodeParser) DECLARE_PARSER(NormalMapNodeParser) +DECLARE_PARSER(SeparateXYZNodeParser) DECLARE_PARSER(TexCheckerNodeParser) DECLARE_PARSER(TexEnvironmentNodeParser) DECLARE_PARSER(TexImageNodeParser) -- 2.30.2 From fde60b146e54cca9a77541ed93ca6af065d7b62f Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Mon, 4 Sep 2023 17:23:01 +0300 Subject: [PATCH 05/15] MaterialX: added support for Combine XYZ Node, also added file --- .../shader/materialx/nodes/node_parser.cc | 1 + .../shader/materialx/nodes/node_parser.h | 1 + .../shader/materialx/nodes/sepcomb_xyz.cc | 28 +++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 source/blender/nodes/shader/materialx/nodes/sepcomb_xyz.cc diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index dbabc21cfd26..97baab5b9a81 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -126,6 +126,7 @@ NodeItem NodeParser::get_input_link(const bNodeSocket &socket) switch (from_node->typeinfo->type) { CASE_NODE_TYPE(SH_NODE_BSDF_PRINCIPLED, BSDFPrincipledNodeParser) + CASE_NODE_TYPE(SH_NODE_COMBXYZ, CombineXYZNodeParser) CASE_NODE_TYPE(SH_NODE_HUE_SAT, HueSatValNodeParser) CASE_NODE_TYPE(SH_NODE_INVERT, InvertNodeParser) CASE_NODE_TYPE(SH_NODE_MATH, MathNodeParser) diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.h b/source/blender/nodes/shader/materialx/nodes/node_parser.h index 5a12f8754c2e..4d00dd3b6c38 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -62,6 +62,7 @@ template NodeItem NodeParser::value(const T &data) const }; DECLARE_PARSER(BSDFPrincipledNodeParser) +DECLARE_PARSER(CombineXYZNodeParser) DECLARE_PARSER(HueSatValNodeParser) DECLARE_PARSER(InvertNodeParser) DECLARE_PARSER(MathNodeParser) diff --git a/source/blender/nodes/shader/materialx/nodes/sepcomb_xyz.cc b/source/blender/nodes/shader/materialx/nodes/sepcomb_xyz.cc new file mode 100644 index 000000000000..d15fe85f6e31 --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/sepcomb_xyz.cc @@ -0,0 +1,28 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" + +namespace blender::nodes::materialx { + +NodeItem SeparateXYZNodeParser::compute() +{ + NodeItem vector = get_input_value("Vector"); + int index = STREQ(socket_out_->name, "X") ? 0 : STREQ(socket_out_->name, "Y") ? 1 : 2; + return vector.separate(index); +} + +NodeItem CombineXYZNodeParser::compute() +{ + NodeItem x = get_input_value("X"); + NodeItem y = get_input_value("Y"); + NodeItem z = get_input_value("Z"); + NodeItem res = create_node("combine3", "vector3"); + res.set_input("in1", x); + res.set_input("in2", y); + res.set_input("in3", z); + return res; +} + +} // namespace blender::nodes::materialx -- 2.30.2 From 8c037503677f214e1e6458cc6373ba3373cec85f Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Mon, 4 Sep 2023 18:03:07 +0300 Subject: [PATCH 06/15] MaterialX: remove hiding inputs for BSDFPrincipledNodeParser --- .../shader/materialx/nodes/bsdf_principled.cc | 129 ++++++------------ 1 file changed, 41 insertions(+), 88 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/bsdf_principled.cc b/source/blender/nodes/shader/materialx/nodes/bsdf_principled.cc index 43a046cc9292..793169cd4476 100644 --- a/source/blender/nodes/shader/materialx/nodes/bsdf_principled.cc +++ b/source/blender/nodes/shader/materialx/nodes/bsdf_principled.cc @@ -8,54 +8,34 @@ namespace blender::nodes::materialx { NodeItem BSDFPrincipledNodeParser::compute() { - NodeItem zero = value(0.0f); - /* Getting required inputs * Note: if some inputs are not needed they won't be taken */ NodeItem base_color = get_input_value("Base Color"); NodeItem subsurface = get_input_value("Subsurface"); - NodeItem subsurface_radius = empty(); - NodeItem subsurface_color = empty(); - if (subsurface != zero) { - subsurface_radius = get_input_value("Subsurface Radius"); - subsurface_color = get_input_value("Subsurface Color"); - } - + NodeItem subsurface_radius = get_input_value("Subsurface Radius"); + NodeItem subsurface_color = get_input_value("Subsurface Color"); + NodeItem metallic = get_input_value("Metallic"); NodeItem specular = get_input_value("Specular"); // NodeItem specular_tint = get_input_value("Specular Tint"); NodeItem roughness = get_input_value("Roughness"); - NodeItem anisotropic = empty(); - NodeItem anisotropic_rotation = empty(); - if (metallic != zero) { - /* TODO: use Specular Tint input */ - anisotropic = get_input_value("Anisotropic"); - if (anisotropic != zero) { - anisotropic_rotation = get_input_value("Anisotropic Rotation"); - // anisotropic_rotation = 0.5 - (anisotropic_rotation % 1.0) - } - } + /* TODO: use Specular Tint input */ + NodeItem anisotropic = get_input_value("Anisotropic"); + NodeItem anisotropic_rotation = get_input_value("Anisotropic Rotation"); + // anisotropic_rotation = 0.5 - (anisotropic_rotation % 1.0) NodeItem sheen = get_input_value("Sheen"); - // sheen_tint = empty(); - // if enabled(sheen): - // sheen_tint = get_input_value("Sheen Tint"); + // sheen_tint = get_input_value("Sheen Tint"); NodeItem clearcoat = get_input_value("Clearcoat"); - NodeItem clearcoat_roughness = empty(); - if (clearcoat != zero) { - clearcoat_roughness = get_input_value("Clearcoat Roughness"); - } + NodeItem clearcoat_roughness = get_input_value("Clearcoat Roughness"); NodeItem ior = get_input_value("IOR"); NodeItem transmission = get_input_value("Transmission"); - NodeItem transmission_roughness = empty(); - if (transmission != zero) { - transmission_roughness = get_input_value("Transmission Roughness"); - } + NodeItem transmission_roughness = get_input_value("Transmission Roughness"); NodeItem emission = get_input_value("Emission"); NodeItem emission_strength = get_input_value("Emission Strength"); @@ -72,68 +52,41 @@ NodeItem BSDFPrincipledNodeParser::compute() res.set_input("base", 1.0, "float"); res.set_input("base_color", base_color.to_color3()); res.set_input("diffuse_roughness", roughness); - if (normal) { - res.set_input("normal", normal); - } - if (tangent) { - res.set_input("tangent", tangent); - } + res.set_input("normal", normal); + res.set_input("tangent", tangent); + res.set_input("metalness", metallic); - if (metallic != zero) { - res.set_input("metalness", metallic); - } + res.set_input("specular", specular); + res.set_input("specular_color", base_color.to_color3()); + res.set_input("specular_roughness", roughness); + res.set_input("specular_IOR", ior); + res.set_input("specular_anisotropy", anisotropic); + res.set_input("specular_rotation", anisotropic_rotation); - if (specular != zero) { - res.set_input("specular", specular); - res.set_input("specular_color", base_color.to_color3()); - res.set_input("specular_roughness", roughness); - res.set_input("specular_IOR", ior); - if (anisotropic) { - res.set_input("specular_anisotropy", anisotropic); - if (anisotropic_rotation) { - res.set_input("specular_rotation", anisotropic_rotation); - } - } - } + res.set_input("transmission", transmission); + res.set_input("transmission_color", base_color.to_color3()); + res.set_input("transmission_extra_roughness", transmission_roughness); + + res.set_input("subsurface", subsurface); + res.set_input("subsurface_color", subsurface_color); + res.set_input("subsurface_radius", subsurface_radius); + res.set_input("subsurface_anisotropy", anisotropic); - if (transmission != zero) { - res.set_input("transmission", transmission); - res.set_input("transmission_color", base_color.to_color3()); - res.set_input("transmission_extra_roughness", transmission_roughness); - } - - if (subsurface != zero) { - res.set_input("subsurface", subsurface); - res.set_input("subsurface_color", subsurface_color); - res.set_input("subsurface_radius", subsurface_radius); - if (anisotropic) { - res.set_input("subsurface_anisotropy", anisotropic); - } - } - - if (sheen != zero) { - res.set_input("sheen", sheen); - res.set_input("sheen_color", base_color.to_color3()); - res.set_input("sheen_roughness", roughness); - } - - if (clearcoat != zero) { - res.set_input("coat", clearcoat); - res.set_input("coat_color", base_color.to_color3()); - res.set_input("coat_roughness", clearcoat_roughness); - res.set_input("coat_IOR", ior); - if (anisotropic) { - res.set_input("coat_anisotropy", anisotropic); - res.set_input("coat_rotation", anisotropic_rotation); - } - res.set_input("coat_normal", clearcoat_normal); - } - - if (emission != zero) { - res.set_input("emission", emission_strength); - res.set_input("emission_color", emission); - } + res.set_input("sheen", sheen); + res.set_input("sheen_color", base_color.to_color3()); + res.set_input("sheen_roughness", roughness); + + res.set_input("coat", clearcoat); + res.set_input("coat_color", base_color.to_color3()); + res.set_input("coat_roughness", clearcoat_roughness); + res.set_input("coat_IOR", ior); + res.set_input("coat_anisotropy", anisotropic); + res.set_input("coat_rotation", anisotropic_rotation); + res.set_input("coat_normal", clearcoat_normal); + res.set_input("emission", emission_strength); + res.set_input("emission_color", emission); + return res; } -- 2.30.2 From 8f57f4b5150816470294c314ac66ed5920617e4e Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Mon, 4 Sep 2023 18:29:51 +0300 Subject: [PATCH 07/15] MaterialX: fixes for BSDFPrincipledNodeParser Removed Transmission Roughness and added checks for some inputs --- .../shader/materialx/nodes/bsdf_principled.cc | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/bsdf_principled.cc b/source/blender/nodes/shader/materialx/nodes/bsdf_principled.cc index 793169cd4476..b6af2e29d807 100644 --- a/source/blender/nodes/shader/materialx/nodes/bsdf_principled.cc +++ b/source/blender/nodes/shader/materialx/nodes/bsdf_principled.cc @@ -35,7 +35,6 @@ NodeItem BSDFPrincipledNodeParser::compute() NodeItem ior = get_input_value("IOR"); NodeItem transmission = get_input_value("Transmission"); - NodeItem transmission_roughness = get_input_value("Transmission Roughness"); NodeItem emission = get_input_value("Emission"); NodeItem emission_strength = get_input_value("Emission Strength"); @@ -52,8 +51,12 @@ NodeItem BSDFPrincipledNodeParser::compute() res.set_input("base", 1.0, "float"); res.set_input("base_color", base_color.to_color3()); res.set_input("diffuse_roughness", roughness); - res.set_input("normal", normal); - res.set_input("tangent", tangent); + if (normal) { + res.set_input("normal", normal); + } + if (tangent) { + res.set_input("tangent", tangent); + } res.set_input("metalness", metallic); res.set_input("specular", specular); @@ -65,10 +68,10 @@ NodeItem BSDFPrincipledNodeParser::compute() res.set_input("transmission", transmission); res.set_input("transmission_color", base_color.to_color3()); - res.set_input("transmission_extra_roughness", transmission_roughness); + res.set_input("transmission_extra_roughness", roughness); res.set_input("subsurface", subsurface); - res.set_input("subsurface_color", subsurface_color); + res.set_input("subsurface_color", subsurface_color.to_color3()); res.set_input("subsurface_radius", subsurface_radius); res.set_input("subsurface_anisotropy", anisotropic); @@ -82,10 +85,12 @@ NodeItem BSDFPrincipledNodeParser::compute() res.set_input("coat_IOR", ior); res.set_input("coat_anisotropy", anisotropic); res.set_input("coat_rotation", anisotropic_rotation); - res.set_input("coat_normal", clearcoat_normal); + if (clearcoat_normal) { + res.set_input("coat_normal", clearcoat_normal); + } res.set_input("emission", emission_strength); - res.set_input("emission_color", emission); + res.set_input("emission_color", emission.to_color3()); return res; } -- 2.30.2 From f319e437ff99d872efa44c157e7db3eca3b489d7 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Tue, 5 Sep 2023 10:42:23 +0300 Subject: [PATCH 08/15] MaterialX: Added support for Separate Color Node --- source/blender/nodes/shader/CMakeLists.txt | 1 + .../nodes/shader/materialx/nodes/node_item.cc | 2 +- .../nodes/shader/materialx/nodes/node_item.h | 3 +- .../shader/materialx/nodes/node_parser.cc | 2 + .../shader/materialx/nodes/node_parser.h | 2 + .../shader/materialx/nodes/sepcomb_color.cc | 47 +++++++++++++++++++ 6 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 source/blender/nodes/shader/materialx/nodes/sepcomb_color.cc diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index 226193523a34..85b342d1dfc7 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -156,6 +156,7 @@ if(WITH_MATERIALX) materialx/nodes/node_parser.cc materialx/nodes/normal_map.cc materialx/nodes/output_material.cc + materialx/nodes/sepcomb_color.cc materialx/nodes/sepcomb_xyz.cc materialx/nodes/tex_checker.cc materialx/nodes/tex_environment.cc diff --git a/source/blender/nodes/shader/materialx/nodes/node_item.cc b/source/blender/nodes/shader/materialx/nodes/node_item.cc index 822bbff002ca..7e9383c255c3 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_item.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_item.cc @@ -374,7 +374,7 @@ NodeItem NodeItem::exp() const return arithmetic("exp", [](float a) { return std::expf(a); }); } -NodeItem NodeItem::separate(int index) const +NodeItem NodeItem::separate(const int index) const { NodeItem res = empty(); std::string mx_type = type(); diff --git a/source/blender/nodes/shader/materialx/nodes/node_item.h b/source/blender/nodes/shader/materialx/nodes/node_item.h index e815a4dad710..a9958d40fc43 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_item.h +++ b/source/blender/nodes/shader/materialx/nodes/node_item.h @@ -72,7 +72,8 @@ class NodeItem { NodeItem sqrt() const; NodeItem sign() const; NodeItem exp() const; - NodeItem separate(int index) const; + NodeItem separate(const int index) const; + NodeItem separate_color(const int index) const; NodeItem to_color3() const; NodeItem to_vector3() const; diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index 97baab5b9a81..5ec3846682d6 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -126,12 +126,14 @@ NodeItem NodeParser::get_input_link(const bNodeSocket &socket) switch (from_node->typeinfo->type) { CASE_NODE_TYPE(SH_NODE_BSDF_PRINCIPLED, BSDFPrincipledNodeParser) + CASE_NODE_TYPE(SH_NODE_COMBINE_COLOR, CombineColorNodeParser) CASE_NODE_TYPE(SH_NODE_COMBXYZ, CombineXYZNodeParser) CASE_NODE_TYPE(SH_NODE_HUE_SAT, HueSatValNodeParser) CASE_NODE_TYPE(SH_NODE_INVERT, InvertNodeParser) CASE_NODE_TYPE(SH_NODE_MATH, MathNodeParser) CASE_NODE_TYPE(SH_NODE_MIX_RGB_LEGACY, MixRGBNodeParser) CASE_NODE_TYPE(SH_NODE_NORMAL_MAP, NormalMapNodeParser) + CASE_NODE_TYPE(SH_NODE_SEPARATE_COLOR, SeparateColorNodeParser) CASE_NODE_TYPE(SH_NODE_SEPXYZ, SeparateXYZNodeParser) CASE_NODE_TYPE(SH_NODE_TEX_CHECKER, TexCheckerNodeParser) CASE_NODE_TYPE(SH_NODE_TEX_ENVIRONMENT, TexEnvironmentNodeParser) diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.h b/source/blender/nodes/shader/materialx/nodes/node_parser.h index 4d00dd3b6c38..2558d157bc9c 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -62,12 +62,14 @@ template NodeItem NodeParser::value(const T &data) const }; DECLARE_PARSER(BSDFPrincipledNodeParser) +DECLARE_PARSER(CombineColorNodeParser) DECLARE_PARSER(CombineXYZNodeParser) DECLARE_PARSER(HueSatValNodeParser) DECLARE_PARSER(InvertNodeParser) DECLARE_PARSER(MathNodeParser) DECLARE_PARSER(MixRGBNodeParser) DECLARE_PARSER(NormalMapNodeParser) +DECLARE_PARSER(SeparateColorNodeParser) DECLARE_PARSER(SeparateXYZNodeParser) DECLARE_PARSER(TexCheckerNodeParser) DECLARE_PARSER(TexEnvironmentNodeParser) diff --git a/source/blender/nodes/shader/materialx/nodes/sepcomb_color.cc b/source/blender/nodes/shader/materialx/nodes/sepcomb_color.cc new file mode 100644 index 000000000000..de631e6e3585 --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/sepcomb_color.cc @@ -0,0 +1,47 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" + +namespace blender::nodes::materialx { + +NodeItem SeparateColorNodeParser::compute() +{ + int mode = static_cast(node_->storage)->mode; + NodeItem color = get_input_value("Color"); + std::string channel_1; + std::string channel_2; + + NodeItem convert = empty(); + + switch (mode) { + case NODE_COMBSEP_COLOR_RGB: + channel_1 = "Red"; + channel_2 = "Green"; + break; + case NODE_COMBSEP_COLOR_HSV: + case NODE_COMBSEP_COLOR_HSL: + channel_1 = "Hue"; + channel_2 = "Saturation"; + convert = create_node("rgbtohsv", "color3"); + convert.set_input("in", color.to_color3()); + break; + default: + BLI_assert_unreachable(); + } + + int index = STREQ(socket_out_->name, channel_1.c_str()) ? 0 : + STREQ(socket_out_->name, channel_2.c_str()) ? 1 : + 2; + + NodeItem res = convert ? convert : color; + return res.separate(index); +} + +NodeItem CombineColorNodeParser::compute() +{ + /* TODO: implement. */ +} + +} // namespace blender::nodes::materialx -- 2.30.2 From 2c6da32ae0bef4c2f25f3000fc3277178987af10 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Tue, 5 Sep 2023 17:41:21 +0300 Subject: [PATCH 09/15] MaterialX: added fixes to SeparateColorNodeParser --- .../nodes/shader/materialx/nodes/sepcomb_color.cc | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/sepcomb_color.cc b/source/blender/nodes/shader/materialx/nodes/sepcomb_color.cc index a21857798113..8f79f962cd21 100644 --- a/source/blender/nodes/shader/materialx/nodes/sepcomb_color.cc +++ b/source/blender/nodes/shader/materialx/nodes/sepcomb_color.cc @@ -2,6 +2,7 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "../material.h" #include "node_parser.h" namespace blender::nodes::materialx { @@ -10,20 +11,18 @@ NodeItem SeparateColorNodeParser::compute() { int mode = static_cast(node_->storage)->mode; NodeItem color = get_input_value("Color"); - std::string channel_1; - std::string channel_2; NodeItem convert = empty(); switch (mode) { case NODE_COMBSEP_COLOR_RGB: - channel_1 = "Red"; - channel_2 = "Green"; break; case NODE_COMBSEP_COLOR_HSV: + convert = create_node("rgbtohsv", "color3"); + convert.set_input("in", color, NodeItem::Type::Color3); + break; case NODE_COMBSEP_COLOR_HSL: - channel_1 = "Hue"; - channel_2 = "Saturation"; + CLOG_WARN(LOG_MATERIALX_SHADER, "Unsupported color model, using HSV instead: %d", mode); convert = create_node("rgbtohsv", "color3"); convert.set_input("in", color, NodeItem::Type::Color3); break; @@ -31,9 +30,7 @@ NodeItem SeparateColorNodeParser::compute() BLI_assert_unreachable(); } - int index = STREQ(socket_out_->name, channel_1.c_str()) ? 0 : - STREQ(socket_out_->name, channel_2.c_str()) ? 1 : - 2; + int index = STREQ(socket_out_->name, "Red") ? 0 : STREQ(socket_out_->name, "Green") ? 1 : 2; NodeItem res = convert ? convert : color; return res.extract(index); -- 2.30.2 From b220d429d7eab6634641e6c18e58602cc65aedd4 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Tue, 5 Sep 2023 18:00:12 +0300 Subject: [PATCH 10/15] MaterialX: added support for CombineColor Node --- .../shader/materialx/nodes/sepcomb_color.cc | 35 ++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/sepcomb_color.cc b/source/blender/nodes/shader/materialx/nodes/sepcomb_color.cc index 8f79f962cd21..02f7d60e1bf9 100644 --- a/source/blender/nodes/shader/materialx/nodes/sepcomb_color.cc +++ b/source/blender/nodes/shader/materialx/nodes/sepcomb_color.cc @@ -19,12 +19,12 @@ NodeItem SeparateColorNodeParser::compute() break; case NODE_COMBSEP_COLOR_HSV: convert = create_node("rgbtohsv", "color3"); - convert.set_input("in", color, NodeItem::Type::Color3); + convert.set_input("in", color); break; case NODE_COMBSEP_COLOR_HSL: CLOG_WARN(LOG_MATERIALX_SHADER, "Unsupported color model, using HSV instead: %d", mode); convert = create_node("rgbtohsv", "color3"); - convert.set_input("in", color, NodeItem::Type::Color3); + convert.set_input("in", color); break; default: BLI_assert_unreachable(); @@ -38,8 +38,35 @@ NodeItem SeparateColorNodeParser::compute() NodeItem CombineColorNodeParser::compute() { - /* TODO: implement. */ - return empty(); + int mode = static_cast(node_->storage)->mode; + NodeItem red = get_input_value("Red"); + NodeItem green = get_input_value("Green"); + NodeItem blue = get_input_value("Blue"); + + NodeItem convert = empty(); + NodeItem combine = create_node("combine3", "color3"); + combine.set_input("in1", red); + combine.set_input("in2", green); + combine.set_input("in3", blue); + + switch (mode) { + case NODE_COMBSEP_COLOR_RGB: + break; + case NODE_COMBSEP_COLOR_HSV: + convert = create_node("hsvtorgb", "color3"); + convert.set_input("in", combine); + break; + case NODE_COMBSEP_COLOR_HSL: + CLOG_WARN(LOG_MATERIALX_SHADER, "Unsupported color model, using HSV instead: %d", mode); + convert = create_node("hsvtorgb", "color3"); + convert.set_input("in", combine); + break; + default: + BLI_assert_unreachable(); + } + + NodeItem res = convert ? convert : combine; + return res; } } // namespace blender::nodes::materialx -- 2.30.2 From 1595cb26abf50701aa902f1f8cd9b48333b7ae04 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Tue, 5 Sep 2023 18:00:54 +0300 Subject: [PATCH 11/15] MaterialX: make format --- source/blender/nodes/shader/materialx/nodes/hueSatVal.cc | 3 ++- source/blender/nodes/shader/materialx/nodes/vector_math.cc | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/hueSatVal.cc b/source/blender/nodes/shader/materialx/nodes/hueSatVal.cc index 98380200849e..8d3af670a299 100644 --- a/source/blender/nodes/shader/materialx/nodes/hueSatVal.cc +++ b/source/blender/nodes/shader/materialx/nodes/hueSatVal.cc @@ -8,7 +8,8 @@ namespace blender::nodes::materialx { NodeItem HueSatValNodeParser::compute() { - /* TODO: implement fac, see do_hue_sat_fac in source\blender\nodes\texture\nodes\node_texture_hueSatVal.cc */ + /* TODO: implement fac, see do_hue_sat_fac in + * source\blender\nodes\texture\nodes\node_texture_hueSatVal.cc */ NodeItem hue = get_input_value("Hue"); NodeItem saturation = get_input_value("Saturation"); NodeItem val = get_input_value("Value"); diff --git a/source/blender/nodes/shader/materialx/nodes/vector_math.cc b/source/blender/nodes/shader/materialx/nodes/vector_math.cc index d4fc12e2470b..db8a165a6269 100644 --- a/source/blender/nodes/shader/materialx/nodes/vector_math.cc +++ b/source/blender/nodes/shader/materialx/nodes/vector_math.cc @@ -2,8 +2,8 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#include "node_parser.h" #include "../material.h" +#include "node_parser.h" namespace blender::nodes::materialx { -- 2.30.2 From 2296bb1b11da992e62143b8cfc72fe42e2eeaf90 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Wed, 6 Sep 2023 02:56:01 +0300 Subject: [PATCH 12/15] MaterialX: removed redundant code --- source/blender/nodes/shader/materialx/nodes/node_item.h | 1 - 1 file changed, 1 deletion(-) diff --git a/source/blender/nodes/shader/materialx/nodes/node_item.h b/source/blender/nodes/shader/materialx/nodes/node_item.h index 92edb5bcb066..6e9e011ad2f2 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_item.h +++ b/source/blender/nodes/shader/materialx/nodes/node_item.h @@ -77,7 +77,6 @@ class NodeItem { const NodeItem &if_val, const NodeItem &else_val) const; NodeItem extract(const int index) const; - NodeItem separate_color(const int index) const; /* Useful functions */ NodeItem empty() const; -- 2.30.2 From 11096b4107f6ea0f7dfe119895403f28c06b060c Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Wed, 6 Sep 2023 10:08:32 +0300 Subject: [PATCH 13/15] MaterialX: rename file huesatval.cc --- source/blender/nodes/shader/CMakeLists.txt | 2 +- .../nodes/shader/materialx/nodes/{hueSatVal.cc => huesatval.cc} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename source/blender/nodes/shader/materialx/nodes/{hueSatVal.cc => huesatval.cc} (100%) diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index 85b342d1dfc7..bd5cfab78e89 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -148,7 +148,7 @@ if(WITH_MATERIALX) list(APPEND SRC materialx/material.cc materialx/nodes/bsdf_principled.cc - materialx/nodes/hueSatVal.cc + materialx/nodes/huesatval.cc materialx/nodes/invert.cc materialx/nodes/math.cc materialx/nodes/mix_rgb.cc diff --git a/source/blender/nodes/shader/materialx/nodes/hueSatVal.cc b/source/blender/nodes/shader/materialx/nodes/huesatval.cc similarity index 100% rename from source/blender/nodes/shader/materialx/nodes/hueSatVal.cc rename to source/blender/nodes/shader/materialx/nodes/huesatval.cc -- 2.30.2 From 0324fc4b33d665dfe2bff771f7229dc1d17e4e70 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Wed, 6 Sep 2023 11:15:38 +0300 Subject: [PATCH 14/15] MaterialX: added node BrightContrast --- source/blender/nodes/shader/CMakeLists.txt | 1 + .../nodes/shader/materialx/nodes/brightness.cc | 18 ++++++++++++++++++ .../shader/materialx/nodes/node_parser.cc | 1 + .../nodes/shader/materialx/nodes/node_parser.h | 1 + 4 files changed, 21 insertions(+) create mode 100644 source/blender/nodes/shader/materialx/nodes/brightness.cc diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index bd5cfab78e89..9a3b77502fbf 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -147,6 +147,7 @@ set(LIB if(WITH_MATERIALX) list(APPEND SRC materialx/material.cc + materialx/nodes/brightness.cc materialx/nodes/bsdf_principled.cc materialx/nodes/huesatval.cc materialx/nodes/invert.cc diff --git a/source/blender/nodes/shader/materialx/nodes/brightness.cc b/source/blender/nodes/shader/materialx/nodes/brightness.cc new file mode 100644 index 000000000000..b1ddfc102cad --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/brightness.cc @@ -0,0 +1,18 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" + +namespace blender::nodes::materialx { + +NodeItem BrightContrastNodeParser::compute() +{ + NodeItem color = get_input_value("Color"); + NodeItem bright = get_input_value("Bright"); + NodeItem contrast = get_input_value("Contrast"); + + return (bright + color * (contrast + value(1.0f)) - contrast * value(0.5f)).max(value(0.0f)); +} + +} // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index d40d3edd5147..f3fa66be0ac5 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -132,6 +132,7 @@ NodeItem NodeParser::get_input_link(const bNodeSocket &socket) break; switch (from_node->typeinfo->type) { + 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_COMBXYZ, CombineXYZNodeParser) diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.h b/source/blender/nodes/shader/materialx/nodes/node_parser.h index 2558d157bc9c..ebd9ec05c7d7 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -61,6 +61,7 @@ template NodeItem NodeParser::value(const T &data) const NodeItem compute() override; \ }; +DECLARE_PARSER(BrightContrastNodeParser) DECLARE_PARSER(BSDFPrincipledNodeParser) DECLARE_PARSER(CombineColorNodeParser) DECLARE_PARSER(CombineXYZNodeParser) -- 2.30.2 From f73e5939d654dfa67fa6b89f273296dc2a68e8a0 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Wed, 6 Sep 2023 11:35:12 +0300 Subject: [PATCH 15/15] MaterialX: added comment to node BrightContrast --- source/blender/nodes/shader/materialx/nodes/brightness.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/nodes/shader/materialx/nodes/brightness.cc b/source/blender/nodes/shader/materialx/nodes/brightness.cc index b1ddfc102cad..026621ea4271 100644 --- a/source/blender/nodes/shader/materialx/nodes/brightness.cc +++ b/source/blender/nodes/shader/materialx/nodes/brightness.cc @@ -12,6 +12,7 @@ NodeItem BrightContrastNodeParser::compute() NodeItem bright = get_input_value("Bright"); NodeItem contrast = get_input_value("Contrast"); + /* This formula was given from OSL shader code in Cycles. */ return (bright + color * (contrast + value(1.0f)) - contrast * value(0.5f)).max(value(0.0f)); } -- 2.30.2