From ac2707ef40b43cfc6a53855efb3223249ee5ddc1 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Mon, 28 Aug 2023 18:58:17 +0300 Subject: [PATCH 01/15] MaterialX: added support for Environment texture node Also fixed typo in comment for Image texture node --- source/blender/nodes/shader/CMakeLists.txt | 2 ++ .../shader/materialx/nodes/node_parser.cc | 4 +++ .../shader/materialx/nodes/tex_environment.cc | 34 +++++++++++++++++++ .../shader/materialx/nodes/tex_environment.h | 17 ++++++++++ .../nodes/shader/materialx/nodes/tex_image.cc | 2 +- 5 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 source/blender/nodes/shader/materialx/nodes/tex_environment.cc create mode 100644 source/blender/nodes/shader/materialx/nodes/tex_environment.h diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index 1888021af16c..65a9ea6cf061 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -152,12 +152,14 @@ if(WITH_MATERIALX) materialx/nodes/node_parser.cc materialx/nodes/output_material.cc materialx/nodes/tex_image.cc + materialx/nodes/tex_environment.cc materialx/material.h materialx/nodes/bsdf_principled.h materialx/nodes/node_parser.h materialx/nodes/output_material.h materialx/nodes/tex_image.h + materialx/nodes/tex_environment.h ) endif() diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index 11da5c8158a7..87f106f48f6b 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -6,6 +6,7 @@ #include "bsdf_principled.h" #include "tex_image.h" +#include "tex_environment.h" #include @@ -154,6 +155,9 @@ NodeItem NodeParser::get_input_link(const std::string &name) case SH_NODE_TEX_IMAGE: parser = std::make_unique(graph, depsgraph, material, in_node); break; + case SH_NODE_TEX_ENVIRONMENT: + parser = std::make_unique(graph, depsgraph, material, in_node); + break; default: // TODO: warning log return res; diff --git a/source/blender/nodes/shader/materialx/nodes/tex_environment.cc b/source/blender/nodes/shader/materialx/nodes/tex_environment.cc new file mode 100644 index 000000000000..db382d8f7655 --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/tex_environment.cc @@ -0,0 +1,34 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "tex_environment.h" +#include "node_parser.h" + +#include "hydra/image.h" + +#include "DEG_depsgraph_query.h" + +namespace blender::nodes::materialx { + +NodeItem TexEnvironmentNodeParser::compute() +{ + Image *image = (Image *)node->id; + NodeTexEnvironment *tex = static_cast(node->storage); + Scene *scene = DEG_get_input_scene(depsgraph); + Main *bmain = DEG_get_bmain(depsgraph); + std::string image_path; + /* TODO: What if Blender built without Hydra? Also io::hydra::cache_or_get_image_file contains + * pretty general code, so could be moved from bf_usd project. */ +#ifdef WITH_HYDRA + image_path = io::hydra::cache_or_get_image_file(bmain, scene, image, &tex->iuser); +#endif + + NodeItem texcoord = create_node("texcoord", "vector2", true); + NodeItem res = create_node("image", "color3"); + res.set_input("file", image_path, "filename"); + res.set_input("texcoord", texcoord); + return res; +} + +} // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/tex_environment.h b/source/blender/nodes/shader/materialx/nodes/tex_environment.h new file mode 100644 index 000000000000..53a6ba709f34 --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/tex_environment.h @@ -0,0 +1,17 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "node_parser.h" + +namespace blender::nodes::materialx { + +class TexEnvironmentNodeParser : public NodeParser { + public: + using NodeParser::NodeParser; + NodeItem compute() override; +}; + +} // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/tex_image.cc b/source/blender/nodes/shader/materialx/nodes/tex_image.cc index 3d1a0423c9fa..7be1dafe616a 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_image.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_image.cc @@ -18,7 +18,7 @@ NodeItem TexImageNodeParser::compute() Scene *scene = DEG_get_input_scene(depsgraph); Main *bmain = DEG_get_bmain(depsgraph); std::string image_path; - /* TODO: What if Blender built without Hydra? Also io::hydra::cache_or_get_image_file contain + /* TODO: What if Blender built without Hydra? Also io::hydra::cache_or_get_image_file contains * pretty general code, so could be moved from bf_usd project. */ #ifdef WITH_HYDRA image_path = io::hydra::cache_or_get_image_file(bmain, scene, image, &tex->iuser); -- 2.30.2 From da004e2111cb48c5942888eb2773cfa086d485cf Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Tue, 29 Aug 2023 12:20:04 +0300 Subject: [PATCH 02/15] MaterialX: removed unnecessary header --- .../shader/materialx/nodes/tex_environment.h | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 source/blender/nodes/shader/materialx/nodes/tex_environment.h diff --git a/source/blender/nodes/shader/materialx/nodes/tex_environment.h b/source/blender/nodes/shader/materialx/nodes/tex_environment.h deleted file mode 100644 index 53a6ba709f34..000000000000 --- a/source/blender/nodes/shader/materialx/nodes/tex_environment.h +++ /dev/null @@ -1,17 +0,0 @@ -/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "node_parser.h" - -namespace blender::nodes::materialx { - -class TexEnvironmentNodeParser : public NodeParser { - public: - using NodeParser::NodeParser; - NodeItem compute() override; -}; - -} // namespace blender::nodes::materialx -- 2.30.2 From 5baa0be7700d1676f11428862d07f38fd250f159 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Tue, 29 Aug 2023 17:50:27 +0300 Subject: [PATCH 03/15] MaterialX: added support for Noise Texture node --- .../shader/materialx/nodes/node_parser.cc | 14 +++++++- .../shader/materialx/nodes/node_parser.h | 1 + .../nodes/shader/materialx/nodes/tex_noise.cc | 33 +++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 source/blender/nodes/shader/materialx/nodes/tex_noise.cc diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index edbe45d8ab6d..4764a4df1efb 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -28,7 +28,10 @@ void NodeItem::set_input(const std::string &name, const NodeItem &item) void NodeItem::set_input(const std::string &name, const MaterialX::ValuePtr value) { std::string mx_type = value->getTypeString(); - if (value->isA()) { + if (value->isA()) { + set_input(name, value->asA(), mx_type); + } + else if (value->isA()) { set_input(name, value->asA(), mx_type); } else if (value->isA()) { @@ -350,6 +353,12 @@ NodeItem NodeParser::get_input_default(const std::string &name) NodeItem res = empty_value(); const bNodeSocket &socket = node->input_by_identifier(name); + /* Explicit check for Detail socket of Noise Texture node since MaterialX expects integer for octaves. */ + if (node->typeinfo->type == SH_NODE_TEX_NOISE && STREQ(socket.name, "Detail")) { + int v = socket.default_value_typed()->value; + res.value = MaterialX::Value::createValue(v); + return res; + } switch (socket.type) { case SOCK_FLOAT: { float v = socket.default_value_typed()->value; @@ -413,6 +422,9 @@ NodeItem NodeParser::get_input_link(const std::string &name) case SH_NODE_TEX_ENVIRONMENT: parser = std::make_unique(graph, depsgraph, material, in_node); break; + case SH_NODE_TEX_NOISE: + parser = std::make_unique(graph, depsgraph, material, in_node); + break; default: // TODO: warning log 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 6b61c10a8ee5..05b757699c0e 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -109,5 +109,6 @@ DECLARE_PARSER(MixRGBNodeParser) DECLARE_PARSER(OutputMaterialNodeParser) DECLARE_PARSER(TexImageNodeParser) DECLARE_PARSER(TexEnvironmentNodeParser) +DECLARE_PARSER(TexNoiseNodeParser) } // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc new file mode 100644 index 000000000000..b7e8ea63e452 --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc @@ -0,0 +1,33 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" + +#include "hydra/image.h" + +#include "DEG_depsgraph_query.h" + +namespace blender::nodes::materialx { + +NodeItem TexNoiseNodeParser::compute() +{ + Image *image = (Image *)node->id; + NodeTexNoise *tex = static_cast(node->storage); + Scene *scene = DEG_get_input_scene(depsgraph); + Main *bmain = DEG_get_bmain(depsgraph); + + NodeItem texcoord = create_node("position", "vector3", true); + NodeItem scale = get_input_value("Scale"); + NodeItem position = texcoord * scale; + NodeItem detail = get_input_value("Detail"); + NodeItem lacunarity = get_input_value("Lacunarity"); + + NodeItem res = create_node("fractal3d", "color3", true); + res.set_input("position", position); + res.set_input("octaves", detail); + res.set_input("lacunarity", lacunarity); + return res; +} + +} // namespace blender::nodes::materialx -- 2.30.2 From 72a3fd0d68ecaa09b0eeafd680fd7d180d982055 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Tue, 29 Aug 2023 17:53:29 +0300 Subject: [PATCH 04/15] MaterialX: small code improvements --- source/blender/nodes/shader/materialx/nodes/node_parser.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index 4764a4df1efb..7760543e6ce2 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -169,7 +169,7 @@ NodeItem NodeItem::arithmetic(const std::string &mx_category, return empty(); } - std::string t = value ? value->getTypeString() : node->getType(); + std::string t = type(); NodeItem res(graph_); if (value) { if (t == "float") { @@ -403,7 +403,7 @@ NodeItem NodeParser::get_input_link(const std::string &name) /* Getting required NodeParser object */ std::unique_ptr parser; - switch (in_node->type) { + switch (in_node->typeinfo->type) { case SH_NODE_BSDF_PRINCIPLED: parser = std::make_unique(graph, depsgraph, material, in_node); break; -- 2.30.2 From c9029f00aae7d0d017b12dffc3ff0853379a381b Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Tue, 29 Aug 2023 19:31:31 +0300 Subject: [PATCH 05/15] MaterialX: added Noise Texture to CMakeLists.txt --- source/blender/nodes/shader/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index 91a478f5accd..95611c0af3ed 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -156,6 +156,7 @@ if(WITH_MATERIALX) materialx/nodes/output_material.cc materialx/nodes/tex_image.cc materialx/nodes/tex_environment.cc + materialx/nodes/tex_noise.cc materialx/material.h materialx/nodes/node_parser.h -- 2.30.2 From 5c3d7a17b6ce8a7eace42d45e96e5a504cfb3d07 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Wed, 30 Aug 2023 16:54:25 +0300 Subject: [PATCH 06/15] MaterialX: added Checker Texture node --- source/blender/nodes/shader/CMakeLists.txt | 1 + .../shader/materialx/nodes/node_parser.cc | 10 +++ .../shader/materialx/nodes/node_parser.h | 1 + .../shader/materialx/nodes/tex_checker.cc | 86 +++++++++++++++++++ 4 files changed, 98 insertions(+) create mode 100644 source/blender/nodes/shader/materialx/nodes/tex_checker.cc diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index 95611c0af3ed..55790c3f58a9 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -157,6 +157,7 @@ if(WITH_MATERIALX) materialx/nodes/tex_image.cc materialx/nodes/tex_environment.cc materialx/nodes/tex_noise.cc + materialx/nodes/tex_checker.cc materialx/material.h materialx/nodes/node_parser.h diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index 7760543e6ce2..d37d56fce022 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -359,6 +359,13 @@ NodeItem NodeParser::get_input_default(const std::string &name) res.value = MaterialX::Value::createValue(v); return res; } + /* Explicit check for Scale socket of Checker Texture node since MaterialX has scales for X and Y axes + * and Blender only single. */ + if (node->typeinfo->type == SH_NODE_TEX_CHECKER && STREQ(socket.name, "Scale")) { + float v = socket.default_value_typed()->value; + res.value = MaterialX::Value::createValue({v, v}); + return res; + } switch (socket.type) { case SOCK_FLOAT: { float v = socket.default_value_typed()->value; @@ -425,6 +432,9 @@ NodeItem NodeParser::get_input_link(const std::string &name) case SH_NODE_TEX_NOISE: parser = std::make_unique(graph, depsgraph, material, in_node); break; + case SH_NODE_TEX_CHECKER: + parser = std::make_unique(graph, depsgraph, material, in_node); + break; default: // TODO: warning log 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 05b757699c0e..b46f9b7481aa 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -110,5 +110,6 @@ DECLARE_PARSER(OutputMaterialNodeParser) DECLARE_PARSER(TexImageNodeParser) DECLARE_PARSER(TexEnvironmentNodeParser) DECLARE_PARSER(TexNoiseNodeParser) +DECLARE_PARSER(TexCheckerNodeParser) } // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc new file mode 100644 index 000000000000..ee863bd0293d --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc @@ -0,0 +1,86 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" + +#include "hydra/image.h" + +#include "DEG_depsgraph_query.h" +#include +namespace blender::nodes::materialx { + +/* For some reason validator complains about 'octaves' input of 'fractal3d' node (which doesn't even exist here) + * and 'in1' input of 'modulo' node, perhaps implementation is fully correct and similar to standart MaterialX + * Checkerboard node (added in 1.38.8). Also seems like USD due to lack of support doesn't render this material, + * but MaterialX Viewer and GraphEditor do. */ + +NodeItem TexCheckerNodeParser::compute() +{ + Image *image = (Image *)node->id; + NodeTexChecker *tex = static_cast(node->storage); + Scene *scene = DEG_get_input_scene(depsgraph); + Main *bmain = DEG_get_bmain(depsgraph); + + NodeItem texcoord = create_node("texcoord", "vector2", true); + NodeItem frequency = create_node("constant", "vector2", true); + NodeItem scale = get_input_value("Scale"); + + /* Modifier to follow Cycles result. */ + NodeItem scale_fitter(graph); + scale_fitter.value = MaterialX::Value::createValue(4.0f); + frequency.set_input("value", scale * scale_fitter); + + NodeItem mult = create_node("multiply", "vector2", true); + mult.set_input("in1", texcoord); + mult.set_input("in2", frequency); + + NodeItem offset = create_node("constant", "vector2", true); + offset.set_input("value", MaterialX::Value::createValue({0.0f, 0.0f})); + + NodeItem place2d = create_node("place2d", "vector2", true); + place2d.set_input("texcoord", mult); + place2d.set_input("offset", offset); + + NodeItem separate = create_node("separate2", "multioutput", true); + separate.set_input("in", place2d); + separate.node->addOutput("outx", "float"); + separate.node->addOutput("outy", "float"); + + NodeItem modulo_x = create_node("modulo", "float", true); + modulo_x.set_input("in1", separate); + modulo_x.set_input("in2", MaterialX::Value::createValue(2.0f)); + modulo_x.node->setConnectedOutput("in1", separate.node->getOutput("outx")); + + NodeItem floor_x = create_node("floor", "float", true); + floor_x.set_input("in", modulo_x); + + NodeItem modulo_y = create_node("modulo", "float", true); + modulo_y.set_input("in1", separate); + modulo_y.set_input("in2", MaterialX::Value::createValue(2.0f)); + modulo_y.node->setConnectedOutput("in1", separate.node->getOutput("outy")); + + NodeItem floor_y = create_node("floor", "float", true); + floor_y.set_input("in", modulo_y); + + NodeItem add = create_node("add", "float", true); + add.set_input("in1", floor_x); + add.set_input("in2", floor_y); + + NodeItem ifequal = create_node("ifequal", "float", true); + ifequal.set_input("value1", add); + ifequal.set_input("value2", MaterialX::Value::createValue(1.0f)); + ifequal.set_input("in1", MaterialX::Value::createValue(1.0f)); + ifequal.set_input("in2", MaterialX::Value::createValue(0.0f)); + + NodeItem mix = create_node("mix", "color3", true); + NodeItem color1 = get_input_value("Color1"); + NodeItem color2 = get_input_value("Color2"); + mix.set_input("fg", color1.to_color3()); + mix.set_input("bg", color2.to_color3()); + mix.set_input("mix", ifequal); + + return mix; +} + +} // namespace blender::nodes::materialx -- 2.30.2 From 7511e1fcbc683a5dd60ccc307295de34034a2c67 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Wed, 30 Aug 2023 19:07:01 +0300 Subject: [PATCH 07/15] MaterialX: make format --- .../shader/materialx/nodes/node_parser.cc | 7 ++++--- .../shader/materialx/nodes/tex_checker.cc | 18 +++++++++--------- .../nodes/shader/materialx/nodes/tex_noise.cc | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index d37d56fce022..c320bae693d5 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -353,14 +353,15 @@ NodeItem NodeParser::get_input_default(const std::string &name) NodeItem res = empty_value(); const bNodeSocket &socket = node->input_by_identifier(name); - /* Explicit check for Detail socket of Noise Texture node since MaterialX expects integer for octaves. */ + /* Explicit check for Detail socket of Noise Texture node since MaterialX expects integer for + * octaves. */ if (node->typeinfo->type == SH_NODE_TEX_NOISE && STREQ(socket.name, "Detail")) { int v = socket.default_value_typed()->value; res.value = MaterialX::Value::createValue(v); return res; } - /* Explicit check for Scale socket of Checker Texture node since MaterialX has scales for X and Y axes - * and Blender only single. */ + /* Explicit check for Scale socket of Checker Texture node since MaterialX has scales for X and Y + * axes and Blender only single. */ if (node->typeinfo->type == SH_NODE_TEX_CHECKER && STREQ(socket.name, "Scale")) { float v = socket.default_value_typed()->value; res.value = MaterialX::Value::createValue({v, v}); diff --git a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc index ee863bd0293d..7757e9722589 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc @@ -10,10 +10,10 @@ #include namespace blender::nodes::materialx { -/* For some reason validator complains about 'octaves' input of 'fractal3d' node (which doesn't even exist here) - * and 'in1' input of 'modulo' node, perhaps implementation is fully correct and similar to standart MaterialX - * Checkerboard node (added in 1.38.8). Also seems like USD due to lack of support doesn't render this material, - * but MaterialX Viewer and GraphEditor do. */ +/* For some reason validator complains about 'octaves' input of 'fractal3d' node (which doesn't + * even exist here) and 'in1' input of 'modulo' node, perhaps implementation is fully correct and + * similar to standart MaterialX Checkerboard node (added in 1.38.8). Also seems like USD due to + * lack of support doesn't render this material, but MaterialX Viewer and GraphEditor do. */ NodeItem TexCheckerNodeParser::compute() { @@ -73,14 +73,14 @@ NodeItem TexCheckerNodeParser::compute() ifequal.set_input("in1", MaterialX::Value::createValue(1.0f)); ifequal.set_input("in2", MaterialX::Value::createValue(0.0f)); - NodeItem mix = create_node("mix", "color3", true); + NodeItem res = create_node("mix", "color3", true); NodeItem color1 = get_input_value("Color1"); NodeItem color2 = get_input_value("Color2"); - mix.set_input("fg", color1.to_color3()); - mix.set_input("bg", color2.to_color3()); - mix.set_input("mix", ifequal); + res.set_input("fg", color1.to_color3()); + res.set_input("bg", color2.to_color3()); + res.set_input("mix", ifequal); - return mix; + return res; } } // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc index b7e8ea63e452..255f9eb1b983 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc @@ -22,7 +22,7 @@ NodeItem TexNoiseNodeParser::compute() NodeItem position = texcoord * scale; NodeItem detail = get_input_value("Detail"); NodeItem lacunarity = get_input_value("Lacunarity"); - + NodeItem res = create_node("fractal3d", "color3", true); res.set_input("position", position); res.set_input("octaves", detail); -- 2.30.2 From ff15a96c4f4e45e565ab6dde91edc01319894755 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Wed, 30 Aug 2023 19:35:34 +0300 Subject: [PATCH 08/15] MaterialX: removed comment --- source/blender/nodes/shader/materialx/nodes/tex_checker.cc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc index 7757e9722589..bc11dee230b5 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc @@ -10,11 +10,6 @@ #include namespace blender::nodes::materialx { -/* For some reason validator complains about 'octaves' input of 'fractal3d' node (which doesn't - * even exist here) and 'in1' input of 'modulo' node, perhaps implementation is fully correct and - * similar to standart MaterialX Checkerboard node (added in 1.38.8). Also seems like USD due to - * lack of support doesn't render this material, but MaterialX Viewer and GraphEditor do. */ - NodeItem TexCheckerNodeParser::compute() { Image *image = (Image *)node->id; -- 2.30.2 From 08715e9eb5b86cc14cadde24a74dc3ae676f493e Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Wed, 30 Aug 2023 19:40:32 +0300 Subject: [PATCH 09/15] MaterialX: removed redundant code --- source/blender/nodes/shader/materialx/nodes/tex_checker.cc | 7 ------- source/blender/nodes/shader/materialx/nodes/tex_noise.cc | 7 ------- 2 files changed, 14 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc index bc11dee230b5..fc3d8bbfd59b 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc @@ -6,17 +6,10 @@ #include "hydra/image.h" -#include "DEG_depsgraph_query.h" -#include namespace blender::nodes::materialx { NodeItem TexCheckerNodeParser::compute() { - Image *image = (Image *)node->id; - NodeTexChecker *tex = static_cast(node->storage); - Scene *scene = DEG_get_input_scene(depsgraph); - Main *bmain = DEG_get_bmain(depsgraph); - NodeItem texcoord = create_node("texcoord", "vector2", true); NodeItem frequency = create_node("constant", "vector2", true); NodeItem scale = get_input_value("Scale"); diff --git a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc index 255f9eb1b983..30b8e213eac1 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc @@ -6,17 +6,10 @@ #include "hydra/image.h" -#include "DEG_depsgraph_query.h" - namespace blender::nodes::materialx { NodeItem TexNoiseNodeParser::compute() { - Image *image = (Image *)node->id; - NodeTexNoise *tex = static_cast(node->storage); - Scene *scene = DEG_get_input_scene(depsgraph); - Main *bmain = DEG_get_bmain(depsgraph); - NodeItem texcoord = create_node("position", "vector3", true); NodeItem scale = get_input_value("Scale"); NodeItem position = texcoord * scale; -- 2.30.2 From fb203b045e01787ff46c698f78fa9bfc863051d5 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Thu, 31 Aug 2023 16:14:18 +0300 Subject: [PATCH 10/15] MaterialX: overrided get_input_default for TexCheckerNodeParser and TexNoiseNodeParser --- .../shader/materialx/nodes/node_parser.h | 23 ++++++++++++++++--- .../shader/materialx/nodes/tex_checker.cc | 18 +++++++++++++-- .../nodes/shader/materialx/nodes/tex_noise.cc | 14 +++++++++++ 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.h b/source/blender/nodes/shader/materialx/nodes/node_parser.h index a28cdb2efa2d..774fb258b133 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -41,8 +41,9 @@ class NodeParser { NodeItem empty() const; template NodeItem value(const T &data) const; + virtual NodeItem get_input_default(const bNodeSocket &socket); + private: - NodeItem get_input_default(const bNodeSocket &socket); NodeItem get_input_link(const bNodeSocket &socket); NodeItem get_input_value(const bNodeSocket &socket); }; @@ -66,7 +67,23 @@ DECLARE_PARSER(MixRGBNodeParser) DECLARE_PARSER(OutputMaterialNodeParser) DECLARE_PARSER(TexImageNodeParser) DECLARE_PARSER(TexEnvironmentNodeParser) -DECLARE_PARSER(TexNoiseNodeParser) -DECLARE_PARSER(TexCheckerNodeParser) + +class TexNoiseNodeParser : public NodeParser { + public: + using NodeParser::NodeParser; + NodeItem compute() override; + + protected: + NodeItem get_input_default(const bNodeSocket &socket) override; +}; + +class TexCheckerNodeParser : public NodeParser { + public: + using NodeParser::NodeParser; + NodeItem compute() override; + + protected: + NodeItem get_input_default(const bNodeSocket &socket) override; +}; } // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc index fc3d8bbfd59b..3b91b4325fa6 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc @@ -8,6 +8,20 @@ namespace blender::nodes::materialx { +NodeItem TexCheckerNodeParser::get_input_default(const bNodeSocket &socket) +{ + /* Explicit check for Scale socket since MaterialX has scales for X and Y + * axes and Blender only single. */ + if (UNLIKELY(STREQ(socket.name, "Scale"))) { + NodeItem res = empty(); + float v = socket.default_value_typed()->value; + res.value = MaterialX::Value::createValue({v, v}); + return res; + } + + return NodeParser::get_input_default(socket); +} + NodeItem TexCheckerNodeParser::compute() { NodeItem texcoord = create_node("texcoord", "vector2", true); @@ -58,8 +72,8 @@ NodeItem TexCheckerNodeParser::compute() NodeItem ifequal = create_node("ifequal", "float", true); ifequal.set_input("value1", add); ifequal.set_input("value2", MaterialX::Value::createValue(1.0f)); - ifequal.set_input("in1", MaterialX::Value::createValue(1.0f)); - ifequal.set_input("in2", MaterialX::Value::createValue(0.0f)); + ifequal.set_input("in1", MaterialX::Value::createValue(0.0f)); + ifequal.set_input("in2", MaterialX::Value::createValue(1.0f)); NodeItem res = create_node("mix", "color3", true); NodeItem color1 = get_input_value("Color1"); diff --git a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc index 30b8e213eac1..28b98a00ea0e 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc @@ -8,6 +8,20 @@ namespace blender::nodes::materialx { +NodeItem TexNoiseNodeParser::get_input_default(const bNodeSocket &socket) +{ + /* Explicit check for Detail socket since MaterialX expects integer for + * octaves. */ + if (UNLIKELY(STREQ(socket.name, "Detail"))) { + NodeItem res = empty(); + int v = socket.default_value_typed()->value; + res.value = MaterialX::Value::createValue(v); + return res; + } + + return NodeParser::get_input_default(socket); +} + NodeItem TexNoiseNodeParser::compute() { NodeItem texcoord = create_node("position", "vector3", true); -- 2.30.2 From 8855b34ab16d382a0f47f20a00a34771815764a4 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Thu, 31 Aug 2023 18:09:39 +0300 Subject: [PATCH 11/15] MaterialX: code improvements, rewritten TexCheckerNodeParser --- .../shader/materialx/nodes/node_parser.h | 29 +++++++------------ .../shader/materialx/nodes/tex_checker.cc | 23 ++------------- 2 files changed, 14 insertions(+), 38 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.h b/source/blender/nodes/shader/materialx/nodes/node_parser.h index 774fb258b133..7048f6cc909b 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -60,6 +60,15 @@ template NodeItem NodeParser::value(const T &data) const NodeItem compute() override; \ }; +#define DECLARE_PARSER_OVERRIDE(T) \ + class T : public NodeParser { \ + public: \ + using NodeParser::NodeParser; \ + NodeItem compute() override; \ + protected: \ + NodeItem get_input_default(const bNodeSocket &socket) override; \ + }; + DECLARE_PARSER(BSDFPrincipledNodeParser) DECLARE_PARSER(InvertNodeParser) DECLARE_PARSER(MathNodeParser) @@ -67,23 +76,7 @@ DECLARE_PARSER(MixRGBNodeParser) DECLARE_PARSER(OutputMaterialNodeParser) DECLARE_PARSER(TexImageNodeParser) DECLARE_PARSER(TexEnvironmentNodeParser) - -class TexNoiseNodeParser : public NodeParser { - public: - using NodeParser::NodeParser; - NodeItem compute() override; - - protected: - NodeItem get_input_default(const bNodeSocket &socket) override; -}; - -class TexCheckerNodeParser : public NodeParser { - public: - using NodeParser::NodeParser; - NodeItem compute() override; - - protected: - NodeItem get_input_default(const bNodeSocket &socket) override; -}; +DECLARE_PARSER_OVERRIDE(TexNoiseNodeParser) +DECLARE_PARSER_OVERRIDE(TexCheckerNodeParser) } // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc index 3b91b4325fa6..a2027cb59662 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc @@ -33,15 +33,11 @@ NodeItem TexCheckerNodeParser::compute() scale_fitter.value = MaterialX::Value::createValue(4.0f); frequency.set_input("value", scale * scale_fitter); - NodeItem mult = create_node("multiply", "vector2", true); - mult.set_input("in1", texcoord); - mult.set_input("in2", frequency); - NodeItem offset = create_node("constant", "vector2", true); offset.set_input("value", MaterialX::Value::createValue({0.0f, 0.0f})); NodeItem place2d = create_node("place2d", "vector2", true); - place2d.set_input("texcoord", mult); + place2d.set_input("texcoord", texcoord * frequency); place2d.set_input("offset", offset); NodeItem separate = create_node("separate2", "multioutput", true); @@ -54,26 +50,13 @@ NodeItem TexCheckerNodeParser::compute() modulo_x.set_input("in2", MaterialX::Value::createValue(2.0f)); modulo_x.node->setConnectedOutput("in1", separate.node->getOutput("outx")); - NodeItem floor_x = create_node("floor", "float", true); - floor_x.set_input("in", modulo_x); - NodeItem modulo_y = create_node("modulo", "float", true); modulo_y.set_input("in1", separate); modulo_y.set_input("in2", MaterialX::Value::createValue(2.0f)); modulo_y.node->setConnectedOutput("in1", separate.node->getOutput("outy")); - NodeItem floor_y = create_node("floor", "float", true); - floor_y.set_input("in", modulo_y); - - NodeItem add = create_node("add", "float", true); - add.set_input("in1", floor_x); - add.set_input("in2", floor_y); - - NodeItem ifequal = create_node("ifequal", "float", true); - ifequal.set_input("value1", add); - ifequal.set_input("value2", MaterialX::Value::createValue(1.0f)); - ifequal.set_input("in1", MaterialX::Value::createValue(0.0f)); - ifequal.set_input("in2", MaterialX::Value::createValue(1.0f)); + NodeItem ifequal = (modulo_x.floor() + modulo_y.floor()) + .if_else("==", empty().val(1.0f), empty().val(0.0f), empty().val(1.0f)); NodeItem res = create_node("mix", "color3", true); NodeItem color1 = get_input_value("Color1"); -- 2.30.2 From e80f6cabb52f8b3b7ce299d67f2561d0aaf7729c Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Thu, 31 Aug 2023 18:23:22 +0300 Subject: [PATCH 12/15] MaterialX: rearranging code --- .../nodes/shader/materialx/nodes/tex_checker.cc | 16 ++++++++-------- .../nodes/shader/materialx/nodes/tex_noise.cc | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc index a2027cb59662..a982d1f3a522 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc @@ -24,17 +24,20 @@ NodeItem TexCheckerNodeParser::get_input_default(const bNodeSocket &socket) NodeItem TexCheckerNodeParser::compute() { + NodeItem scale = get_input_value("Scale"); + NodeItem color1 = get_input_value("Color1"); + NodeItem color2 = get_input_value("Color2"); + NodeItem texcoord = create_node("texcoord", "vector2", true); NodeItem frequency = create_node("constant", "vector2", true); - NodeItem scale = get_input_value("Scale"); /* Modifier to follow Cycles result. */ NodeItem scale_fitter(graph); scale_fitter.value = MaterialX::Value::createValue(4.0f); frequency.set_input("value", scale * scale_fitter); - + NodeItem offset = create_node("constant", "vector2", true); - offset.set_input("value", MaterialX::Value::createValue({0.0f, 0.0f})); + offset.set_input("value", empty().val(MaterialX::Vector2({0.0f, 0.0f}))); NodeItem place2d = create_node("place2d", "vector2", true); place2d.set_input("texcoord", texcoord * frequency); @@ -47,24 +50,21 @@ NodeItem TexCheckerNodeParser::compute() NodeItem modulo_x = create_node("modulo", "float", true); modulo_x.set_input("in1", separate); - modulo_x.set_input("in2", MaterialX::Value::createValue(2.0f)); + modulo_x.set_input("in2", empty().val(2.0f)); modulo_x.node->setConnectedOutput("in1", separate.node->getOutput("outx")); NodeItem modulo_y = create_node("modulo", "float", true); modulo_y.set_input("in1", separate); - modulo_y.set_input("in2", MaterialX::Value::createValue(2.0f)); + modulo_y.set_input("in2", empty().val(2.0f)); modulo_y.node->setConnectedOutput("in1", separate.node->getOutput("outy")); NodeItem ifequal = (modulo_x.floor() + modulo_y.floor()) .if_else("==", empty().val(1.0f), empty().val(0.0f), empty().val(1.0f)); NodeItem res = create_node("mix", "color3", true); - NodeItem color1 = get_input_value("Color1"); - NodeItem color2 = get_input_value("Color2"); res.set_input("fg", color1.to_color3()); res.set_input("bg", color2.to_color3()); res.set_input("mix", ifequal); - return res; } diff --git a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc index 28b98a00ea0e..cafe4100f6b2 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc @@ -24,14 +24,14 @@ NodeItem TexNoiseNodeParser::get_input_default(const bNodeSocket &socket) NodeItem TexNoiseNodeParser::compute() { - NodeItem texcoord = create_node("position", "vector3", true); NodeItem scale = get_input_value("Scale"); - NodeItem position = texcoord * scale; NodeItem detail = get_input_value("Detail"); NodeItem lacunarity = get_input_value("Lacunarity"); + NodeItem texcoord = create_node("position", "vector3", true); + NodeItem res = create_node("fractal3d", "color3", true); - res.set_input("position", position); + res.set_input("position", texcoord * scale); res.set_input("octaves", detail); res.set_input("lacunarity", lacunarity); return res; -- 2.30.2 From 09756925a2d5588691c759edc2d805ed122c64e8 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Thu, 31 Aug 2023 18:31:27 +0300 Subject: [PATCH 13/15] MaterialX: changed signature of NodeParser::create_node --- .../shader/materialx/nodes/bsdf_principled.cc | 2 +- .../nodes/shader/materialx/nodes/node_item.cc | 4 +++- .../nodes/shader/materialx/nodes/node_item.h | 4 +++- .../shader/materialx/nodes/node_parser.cc | 6 +++--- .../nodes/shader/materialx/nodes/node_parser.h | 3 ++- .../shader/materialx/nodes/output_material.cc | 2 +- .../shader/materialx/nodes/tex_checker.cc | 18 +++++++++--------- .../shader/materialx/nodes/tex_environment.cc | 4 ++-- .../nodes/shader/materialx/nodes/tex_image.cc | 4 ++-- .../nodes/shader/materialx/nodes/tex_noise.cc | 4 ++-- 10 files changed, 28 insertions(+), 23 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/bsdf_principled.cc b/source/blender/nodes/shader/materialx/nodes/bsdf_principled.cc index 3da7211f7ddf..a87a0782881b 100644 --- a/source/blender/nodes/shader/materialx/nodes/bsdf_principled.cc +++ b/source/blender/nodes/shader/materialx/nodes/bsdf_principled.cc @@ -68,7 +68,7 @@ NodeItem BSDFPrincipledNodeParser::compute() NodeItem tangent = get_input_link("Tangent"); /* Creating standard_surface */ - NodeItem res = create_node("standard_surface", "surfaceshader"); + NodeItem res = create_node("standard_surface", "surfaceshader", false); res.set_input("base", 1.0, "float"); res.set_input("base_color", base_color.to_color3()); res.set_input("diffuse_roughness", roughness); diff --git a/source/blender/nodes/shader/materialx/nodes/node_item.cc b/source/blender/nodes/shader/materialx/nodes/node_item.cc index 8a65fe155a2b..7dc85e131ce1 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_item.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_item.cc @@ -550,7 +550,9 @@ MaterialX::ValuePtr NodeItem::float_to_type(float v, std::string mx_type) return nullptr; } -bool NodeItem::adjust_types(MaterialX::ValuePtr &val1, MaterialX::ValuePtr &val2, std::string &mx_type) +bool NodeItem::adjust_types(MaterialX::ValuePtr &val1, + MaterialX::ValuePtr &val2, + std::string &mx_type) { std::string t1 = val1->getTypeString(); std::string t2 = val2->getTypeString(); diff --git a/source/blender/nodes/shader/materialx/nodes/node_item.h b/source/blender/nodes/shader/materialx/nodes/node_item.h index 26d3f58b02f9..da1ef918bed9 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_item.h +++ b/source/blender/nodes/shader/materialx/nodes/node_item.h @@ -79,7 +79,9 @@ class NodeItem { std::function func) const; static MaterialX::ValuePtr float_to_type(float v, std::string mx_type); /* Functions for adjusting values to make equal types */ - static bool adjust_types(MaterialX::ValuePtr &val1, MaterialX::ValuePtr &val2, std::string &mx_type); + static bool adjust_types(MaterialX::ValuePtr &val1, + MaterialX::ValuePtr &val2, + std::string &mx_type); static bool adjust_types(NodeItem &val1, NodeItem &val2, std::string &mx_type); }; diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index f78b77e70ccb..edbdffd6f09d 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -18,12 +18,12 @@ NodeParser::NodeParser(MaterialX::GraphElement *graph, NodeItem NodeParser::create_node(const std::string &mx_category, const std::string &mx_type, - bool accessory) + bool noname) { NodeItem res = empty(); res.node = graph->addNode(mx_category, - accessory ? MaterialX::EMPTY_STRING : - MaterialX::createValidName(node->name), + noname ? MaterialX::EMPTY_STRING : + MaterialX::createValidName(node->name), mx_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 7048f6cc909b..29b9fc6fd515 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -31,7 +31,7 @@ class NodeParser { protected: NodeItem create_node(const std::string &mx_category, const std::string &mx_type, - bool accessory = false); + bool noname = true); NodeItem get_input_default(const std::string &name); NodeItem get_input_default(int index); NodeItem get_input_link(const std::string &name); @@ -65,6 +65,7 @@ template NodeItem NodeParser::value(const T &data) const public: \ using NodeParser::NodeParser; \ NodeItem compute() override; \ +\ protected: \ NodeItem get_input_default(const bNodeSocket &socket) override; \ }; diff --git a/source/blender/nodes/shader/materialx/nodes/output_material.cc b/source/blender/nodes/shader/materialx/nodes/output_material.cc index 94a106c40c03..81d00737027d 100644 --- a/source/blender/nodes/shader/materialx/nodes/output_material.cc +++ b/source/blender/nodes/shader/materialx/nodes/output_material.cc @@ -11,7 +11,7 @@ NodeItem OutputMaterialNodeParser::compute() NodeItem node = empty(); NodeItem surface = get_input_link("Surface"); if (surface) { - node = create_node("surfacematerial", "material"); + node = create_node("surfacematerial", "material", false); node.set_input("surfaceshader", surface); } return node; diff --git a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc index a982d1f3a522..d8096348f861 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc @@ -28,32 +28,32 @@ NodeItem TexCheckerNodeParser::compute() NodeItem color1 = get_input_value("Color1"); NodeItem color2 = get_input_value("Color2"); - NodeItem texcoord = create_node("texcoord", "vector2", true); - NodeItem frequency = create_node("constant", "vector2", true); + NodeItem texcoord = create_node("texcoord", "vector2"); + NodeItem frequency = create_node("constant", "vector2"); /* Modifier to follow Cycles result. */ NodeItem scale_fitter(graph); scale_fitter.value = MaterialX::Value::createValue(4.0f); frequency.set_input("value", scale * scale_fitter); - - NodeItem offset = create_node("constant", "vector2", true); + + NodeItem offset = create_node("constant", "vector2"); offset.set_input("value", empty().val(MaterialX::Vector2({0.0f, 0.0f}))); - NodeItem place2d = create_node("place2d", "vector2", true); + NodeItem place2d = create_node("place2d", "vector2"); place2d.set_input("texcoord", texcoord * frequency); place2d.set_input("offset", offset); - NodeItem separate = create_node("separate2", "multioutput", true); + NodeItem separate = create_node("separate2", "multioutput"); separate.set_input("in", place2d); separate.node->addOutput("outx", "float"); separate.node->addOutput("outy", "float"); - NodeItem modulo_x = create_node("modulo", "float", true); + NodeItem modulo_x = create_node("modulo", "float"); modulo_x.set_input("in1", separate); modulo_x.set_input("in2", empty().val(2.0f)); modulo_x.node->setConnectedOutput("in1", separate.node->getOutput("outx")); - NodeItem modulo_y = create_node("modulo", "float", true); + NodeItem modulo_y = create_node("modulo", "float"); modulo_y.set_input("in1", separate); modulo_y.set_input("in2", empty().val(2.0f)); modulo_y.node->setConnectedOutput("in1", separate.node->getOutput("outy")); @@ -61,7 +61,7 @@ NodeItem TexCheckerNodeParser::compute() NodeItem ifequal = (modulo_x.floor() + modulo_y.floor()) .if_else("==", empty().val(1.0f), empty().val(0.0f), empty().val(1.0f)); - NodeItem res = create_node("mix", "color3", true); + NodeItem res = create_node("mix", "color3", false); res.set_input("fg", color1.to_color3()); res.set_input("bg", color2.to_color3()); res.set_input("mix", ifequal); diff --git a/source/blender/nodes/shader/materialx/nodes/tex_environment.cc b/source/blender/nodes/shader/materialx/nodes/tex_environment.cc index b8f4b3058aa2..a6048db0412c 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_environment.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_environment.cc @@ -23,8 +23,8 @@ NodeItem TexEnvironmentNodeParser::compute() image_path = io::hydra::cache_or_get_image_file(bmain, scene, image, &tex->iuser); #endif - NodeItem texcoord = create_node("texcoord", "vector2", true); - NodeItem res = create_node("image", "color3"); + NodeItem texcoord = create_node("texcoord", "vector2"); + NodeItem res = create_node("image", "color3", false); res.set_input("file", image_path, "filename"); res.set_input("texcoord", texcoord); return res; diff --git a/source/blender/nodes/shader/materialx/nodes/tex_image.cc b/source/blender/nodes/shader/materialx/nodes/tex_image.cc index b7f97d432587..9d0d3d033195 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_image.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_image.cc @@ -23,8 +23,8 @@ NodeItem TexImageNodeParser::compute() image_path = io::hydra::cache_or_get_image_file(bmain, scene, image, &tex->iuser); #endif - NodeItem texcoord = create_node("texcoord", "vector2", true); - NodeItem res = create_node("image", "color3"); + NodeItem texcoord = create_node("texcoord", "vector2"); + NodeItem res = create_node("image", "color3", false); res.set_input("file", image_path, "filename"); res.set_input("texcoord", texcoord); return res; diff --git a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc index cafe4100f6b2..c42eb788221f 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc @@ -28,9 +28,9 @@ NodeItem TexNoiseNodeParser::compute() NodeItem detail = get_input_value("Detail"); NodeItem lacunarity = get_input_value("Lacunarity"); - NodeItem texcoord = create_node("position", "vector3", true); + NodeItem texcoord = create_node("position", "vector3"); - NodeItem res = create_node("fractal3d", "color3", true); + NodeItem res = create_node("fractal3d", "color3", false); res.set_input("position", texcoord * scale); res.set_input("octaves", detail); res.set_input("lacunarity", lacunarity); -- 2.30.2 From 9fde492d4641da9097133efdee55724cb223ea7e Mon Sep 17 00:00:00 2001 From: Bogdan Nagirniak Date: Thu, 31 Aug 2023 20:14:44 +0300 Subject: [PATCH 14/15] Simplified tex_checker.cc, tex_noise.cc. Reverted back NodeParser. --- .../shader/materialx/nodes/node_parser.h | 19 ++-------- .../shader/materialx/nodes/tex_checker.cc | 37 +++++++------------ .../nodes/shader/materialx/nodes/tex_noise.cc | 17 ++------- 3 files changed, 20 insertions(+), 53 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.h b/source/blender/nodes/shader/materialx/nodes/node_parser.h index 29b9fc6fd515..86d1935e41fd 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -41,9 +41,8 @@ class NodeParser { NodeItem empty() const; template NodeItem value(const T &data) const; - virtual NodeItem get_input_default(const bNodeSocket &socket); - private: + NodeItem get_input_default(const bNodeSocket &socket); NodeItem get_input_link(const bNodeSocket &socket); NodeItem get_input_value(const bNodeSocket &socket); }; @@ -60,24 +59,14 @@ template NodeItem NodeParser::value(const T &data) const NodeItem compute() override; \ }; -#define DECLARE_PARSER_OVERRIDE(T) \ - class T : public NodeParser { \ - public: \ - using NodeParser::NodeParser; \ - NodeItem compute() override; \ -\ - protected: \ - NodeItem get_input_default(const bNodeSocket &socket) override; \ - }; - DECLARE_PARSER(BSDFPrincipledNodeParser) DECLARE_PARSER(InvertNodeParser) DECLARE_PARSER(MathNodeParser) DECLARE_PARSER(MixRGBNodeParser) DECLARE_PARSER(OutputMaterialNodeParser) -DECLARE_PARSER(TexImageNodeParser) +DECLARE_PARSER(TexCheckerNodeParser) DECLARE_PARSER(TexEnvironmentNodeParser) -DECLARE_PARSER_OVERRIDE(TexNoiseNodeParser) -DECLARE_PARSER_OVERRIDE(TexCheckerNodeParser) +DECLARE_PARSER(TexImageNodeParser) +DECLARE_PARSER(TexNoiseNodeParser) } // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc index d8096348f861..efe7fb63d2b2 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc @@ -8,23 +8,13 @@ namespace blender::nodes::materialx { -NodeItem TexCheckerNodeParser::get_input_default(const bNodeSocket &socket) -{ - /* Explicit check for Scale socket since MaterialX has scales for X and Y - * axes and Blender only single. */ - if (UNLIKELY(STREQ(socket.name, "Scale"))) { - NodeItem res = empty(); - float v = socket.default_value_typed()->value; - res.value = MaterialX::Value::createValue({v, v}); - return res; - } - - return NodeParser::get_input_default(socket); -} - NodeItem TexCheckerNodeParser::compute() { NodeItem scale = get_input_value("Scale"); + if (scale.value && scale.type() == "float") { + float v = scale.value->asA(); + scale = value(MaterialX::Vector2(v, v)); + } NodeItem color1 = get_input_value("Color1"); NodeItem color2 = get_input_value("Color2"); @@ -32,16 +22,15 @@ NodeItem TexCheckerNodeParser::compute() NodeItem frequency = create_node("constant", "vector2"); /* Modifier to follow Cycles result. */ - NodeItem scale_fitter(graph); - scale_fitter.value = MaterialX::Value::createValue(4.0f); - frequency.set_input("value", scale * scale_fitter); + scale = scale * value(4.0f); + frequency.set_input("value", scale); - NodeItem offset = create_node("constant", "vector2"); - offset.set_input("value", empty().val(MaterialX::Vector2({0.0f, 0.0f}))); + //NodeItem offset = create_node("constant", "vector2"); + //offset.set_input("value", value(MaterialX::Vector2(0.0f, 0.0f))); NodeItem place2d = create_node("place2d", "vector2"); place2d.set_input("texcoord", texcoord * frequency); - place2d.set_input("offset", offset); + //place2d.set_input("offset", offset); NodeItem separate = create_node("separate2", "multioutput"); separate.set_input("in", place2d); @@ -50,16 +39,16 @@ NodeItem TexCheckerNodeParser::compute() NodeItem modulo_x = create_node("modulo", "float"); modulo_x.set_input("in1", separate); - modulo_x.set_input("in2", empty().val(2.0f)); + modulo_x.set_input("in2", value(2.0f)); modulo_x.node->setConnectedOutput("in1", separate.node->getOutput("outx")); NodeItem modulo_y = create_node("modulo", "float"); modulo_y.set_input("in1", separate); - modulo_y.set_input("in2", empty().val(2.0f)); + modulo_y.set_input("in2", value(2.0f)); modulo_y.node->setConnectedOutput("in1", separate.node->getOutput("outy")); - NodeItem ifequal = (modulo_x.floor() + modulo_y.floor()) - .if_else("==", empty().val(1.0f), empty().val(0.0f), empty().val(1.0f)); + NodeItem ifequal = + (modulo_x.floor() + modulo_y.floor()).if_else("==", value(1.0f), value(0.0f), value(1.0f)); NodeItem res = create_node("mix", "color3", false); res.set_input("fg", color1.to_color3()); diff --git a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc index c42eb788221f..cc941c264553 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc @@ -8,24 +8,13 @@ namespace blender::nodes::materialx { -NodeItem TexNoiseNodeParser::get_input_default(const bNodeSocket &socket) -{ - /* Explicit check for Detail socket since MaterialX expects integer for - * octaves. */ - if (UNLIKELY(STREQ(socket.name, "Detail"))) { - NodeItem res = empty(); - int v = socket.default_value_typed()->value; - res.value = MaterialX::Value::createValue(v); - return res; - } - - return NodeParser::get_input_default(socket); -} - NodeItem TexNoiseNodeParser::compute() { NodeItem scale = get_input_value("Scale"); NodeItem detail = get_input_value("Detail"); + if (detail.value && detail.type() == "float") { + detail = value(int(detail.value->asA())); + } NodeItem lacunarity = get_input_value("Lacunarity"); NodeItem texcoord = create_node("position", "vector3"); -- 2.30.2 From 700ed91013be3c23ead1e5d4c181d439fbaffa9e Mon Sep 17 00:00:00 2001 From: Bogdan Nagirniak Date: Thu, 31 Aug 2023 20:41:35 +0300 Subject: [PATCH 15/15] Code improvements: extended NodeItem::set_input() by adding output_name. Added NodeItem::add_output() --- .../nodes/shader/materialx/nodes/node_item.cc | 18 ++++++++-- .../nodes/shader/materialx/nodes/node_item.h | 9 +++-- .../shader/materialx/nodes/tex_checker.cc | 34 +++++++------------ .../nodes/shader/materialx/nodes/tex_noise.cc | 5 ++- 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/source/blender/nodes/shader/materialx/nodes/node_item.cc b/source/blender/nodes/shader/materialx/nodes/node_item.cc index 7dc85e131ce1..b5b85fb6eeac 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_item.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_item.cc @@ -16,13 +16,15 @@ NodeItem NodeItem::empty() const return NodeItem(graph_); } -void NodeItem::set_input(const std::string &name, const NodeItem &item) +void NodeItem::set_input(const std::string &name, + const NodeItem &item, + const std::string &output_name) { if (item.value) { set_input(name, item.value); } else if (item.node) { - set_input(name, item.node); + set_input(name, item.node, output_name); } } @@ -58,9 +60,19 @@ void NodeItem::set_input(const std::string &name, const MaterialX::ValuePtr valu } } -void NodeItem::set_input(const std::string &name, const MaterialX::NodePtr node) +void NodeItem::set_input(const std::string &name, + const MaterialX::NodePtr node, + const std::string &output_name) { this->node->setConnectedNode(name, node); + if (output_name != "") { + this->node->setConnectedOutput("in1", node->getOutput(output_name)); + } +} + +void NodeItem::add_output(const std::string &name, const std::string &mx_type) +{ + node->addOutput(name, mx_type); } NodeItem::operator bool() const diff --git a/source/blender/nodes/shader/materialx/nodes/node_item.h b/source/blender/nodes/shader/materialx/nodes/node_item.h index da1ef918bed9..2f746cda36b7 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_item.h +++ b/source/blender/nodes/shader/materialx/nodes/node_item.h @@ -25,9 +25,14 @@ class NodeItem { template void set_input(const std::string &name, const T &value, const std::string &mx_type); - void set_input(const std::string &name, const NodeItem &item); + void set_input(const std::string &name, + const NodeItem &item, + const std::string &output_name = ""); void set_input(const std::string &name, const MaterialX::ValuePtr value); - void set_input(const std::string &name, const MaterialX::NodePtr node); + void set_input(const std::string &name, + const MaterialX::NodePtr node, + const std::string &output_name = ""); + void add_output(const std::string &name, const std::string &mx_type); operator bool() const; NodeItem operator+(const NodeItem &other) const; diff --git a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc index efe7fb63d2b2..f04f8ed2c457 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_checker.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_checker.cc @@ -4,48 +4,40 @@ #include "node_parser.h" -#include "hydra/image.h" - namespace blender::nodes::materialx { NodeItem TexCheckerNodeParser::compute() { NodeItem scale = get_input_value("Scale"); + NodeItem color1 = get_input_value("Color1"); + NodeItem color2 = get_input_value("Color2"); + if (scale.value && scale.type() == "float") { float v = scale.value->asA(); scale = value(MaterialX::Vector2(v, v)); } - NodeItem color1 = get_input_value("Color1"); - NodeItem color2 = get_input_value("Color2"); + /* Modifier to follow Cycles result */ + scale = scale * value(4.0f); NodeItem texcoord = create_node("texcoord", "vector2"); - NodeItem frequency = create_node("constant", "vector2"); - - /* Modifier to follow Cycles result. */ - scale = scale * value(4.0f); - frequency.set_input("value", scale); - - //NodeItem offset = create_node("constant", "vector2"); - //offset.set_input("value", value(MaterialX::Vector2(0.0f, 0.0f))); - NodeItem place2d = create_node("place2d", "vector2"); - place2d.set_input("texcoord", texcoord * frequency); - //place2d.set_input("offset", offset); + place2d.set_input("texcoord", texcoord * scale); + + /* TODO: fix offset: + * place2d.set_input("offset", offset); */ NodeItem separate = create_node("separate2", "multioutput"); separate.set_input("in", place2d); - separate.node->addOutput("outx", "float"); - separate.node->addOutput("outy", "float"); + separate.add_output("outx", "float"); + separate.add_output("outy", "float"); NodeItem modulo_x = create_node("modulo", "float"); - modulo_x.set_input("in1", separate); + modulo_x.set_input("in1", separate, "outx"); modulo_x.set_input("in2", value(2.0f)); - modulo_x.node->setConnectedOutput("in1", separate.node->getOutput("outx")); NodeItem modulo_y = create_node("modulo", "float"); - modulo_y.set_input("in1", separate); + modulo_y.set_input("in1", separate, "outy"); modulo_y.set_input("in2", value(2.0f)); - modulo_y.node->setConnectedOutput("in1", separate.node->getOutput("outy")); NodeItem ifequal = (modulo_x.floor() + modulo_y.floor()).if_else("==", value(1.0f), value(0.0f), value(1.0f)); diff --git a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc index cc941c264553..63268d1fd8c6 100644 --- a/source/blender/nodes/shader/materialx/nodes/tex_noise.cc +++ b/source/blender/nodes/shader/materialx/nodes/tex_noise.cc @@ -4,18 +4,17 @@ #include "node_parser.h" -#include "hydra/image.h" - namespace blender::nodes::materialx { NodeItem TexNoiseNodeParser::compute() { NodeItem scale = get_input_value("Scale"); NodeItem detail = get_input_value("Detail"); + NodeItem lacunarity = get_input_value("Lacunarity"); + if (detail.value && detail.type() == "float") { detail = value(int(detail.value->asA())); } - NodeItem lacunarity = get_input_value("Lacunarity"); NodeItem texcoord = create_node("position", "vector3"); -- 2.30.2