From cf191c8add85e61afc1b7af8beea365eda215e14 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:36:48 +0300 Subject: [PATCH 01/24] Node Ambient Occlusion. --- .../nodes/node_shader_ambient_occlusion.cc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc index 7b14d937acc..d2ccdb2ac73 100644 --- a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc +++ b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc @@ -55,6 +55,23 @@ static void node_shader_init_ambient_occlusion(bNodeTree * /*ntree*/, bNode *nod node->custom2 = 0; } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: observed crash while rendering MaterialX_v1_38_6::ExceptionShaderGenError */ + /* + * NodeItem maxdistance = get_input_value("Distance", NodeItem::Type::Float); + * NodeItem res = create_node("ambientocclusion", NodeItem::Type::Float); + * res.set_input("coneangle", val(90.0f)); + * res.set_input("maxdistance", maxdistance); + */ + NodeItem res = val(MaterialX::Color4(1.0f, 0.0f, 1.0f, 1.0f)); + if (STREQ(socket_out_->name, "AO")) { + res = res.extract(3); + } + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_ambient_occlusion_cc /* node type definition */ @@ -69,6 +86,7 @@ void register_node_type_sh_ambient_occlusion() ntype.draw_buttons = file_ns::node_shader_buts_ambient_occlusion; ntype.initfunc = file_ns::node_shader_init_ambient_occlusion; ntype.gpu_fn = file_ns::node_shader_gpu_ambient_occlusion; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 4d97098a4cc1cc345c504b85c29adf444082054a Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:37:20 +0300 Subject: [PATCH 02/24] Node Attribute. --- .../shader/nodes/node_shader_attribute.cc | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_attribute.cc b/source/blender/nodes/shader/nodes/node_shader_attribute.cc index 3225af64925..b93ad93538a 100644 --- a/source/blender/nodes/shader/nodes/node_shader_attribute.cc +++ b/source/blender/nodes/shader/nodes/node_shader_attribute.cc @@ -77,6 +77,25 @@ static int node_shader_gpu_attribute(GPUMaterial *mat, return 1; } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: some outputs expected be implemented within the next iteration (see nodedef + * ) */ + NodeItem res = val(MaterialX::Color4(1.0f, 0.0f, 1.0f, 1.0f)); + if (STREQ(socket_out_->name, "Vector")) { + res = val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); + } + if (STREQ(socket_out_->name, "Factor")) { + res = res.extract(3); + } + if (STREQ(socket_out_->name, "Alpha")) { + res = res.extract(3); + } + + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_attribute_cc /* node type definition */ @@ -93,6 +112,7 @@ void register_node_type_sh_attribute() node_type_storage( &ntype, "NodeShaderAttribute", node_free_standard_storage, node_copy_standard_storage); ntype.gpu_fn = file_ns::node_shader_gpu_attribute; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 15a0580add1fdb128edd379ea04de6fe2f06e016 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:37:52 +0300 Subject: [PATCH 03/24] Node Bevel. --- source/blender/nodes/shader/nodes/node_shader_bevel.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_bevel.cc b/source/blender/nodes/shader/nodes/node_shader_bevel.cc index 7692dcc932f..cd92fe5b0bf 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bevel.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bevel.cc @@ -39,6 +39,14 @@ static int gpu_shader_bevel(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_bevel", in, out); } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ + return val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); + ; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_bevel_cc /* node type definition */ @@ -53,6 +61,7 @@ void register_node_type_sh_bevel() ntype.draw_buttons = file_ns::node_shader_buts_bevel; ntype.initfunc = file_ns::node_shader_init_bevel; ntype.gpu_fn = file_ns::gpu_shader_bevel; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 78bae37417b8e555e6205c55eaf5f890925022ae Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:38:29 +0300 Subject: [PATCH 04/24] Node Camera Data. --- .../nodes/shader/nodes/node_shader_camera.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_camera.cc b/source/blender/nodes/shader/nodes/node_shader_camera.cc index 27ce37f60eb..d8cfdee4158 100644 --- a/source/blender/nodes/shader/nodes/node_shader_camera.cc +++ b/source/blender/nodes/shader/nodes/node_shader_camera.cc @@ -26,6 +26,20 @@ static int gpu_shader_camera(GPUMaterial *mat, return GPU_stack_link(mat, node, "camera", in, out); } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ + NodeItem res = val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); + if (STREQ(socket_out_->name, "View Z Depth")) { + res = res.extract(2); + } + if (STREQ(socket_out_->name, "View Distance")) { + res = res.extract(2); + } + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_camera_cc void register_node_type_sh_camera() @@ -37,6 +51,7 @@ void register_node_type_sh_camera() sh_node_type_base(&ntype, SH_NODE_CAMERA, "Camera Data", NODE_CLASS_INPUT); ntype.declare = file_ns::node_declare; ntype.gpu_fn = file_ns::gpu_shader_camera; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 06a0de713ffc122cc34f5bd6262a9970c4fcd470 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:39:03 +0300 Subject: [PATCH 05/24] Node Fresnel. --- source/blender/nodes/shader/nodes/node_shader_fresnel.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_fresnel.cc b/source/blender/nodes/shader/nodes/node_shader_fresnel.cc index 4a17c0ee343..1f09679d946 100644 --- a/source/blender/nodes/shader/nodes/node_shader_fresnel.cc +++ b/source/blender/nodes/shader/nodes/node_shader_fresnel.cc @@ -26,6 +26,14 @@ static int node_shader_gpu_fresnel(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_fresnel", in, out); } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: some outputs expected be implemented within the next iteration (see nodedef + * ) */ + return get_input_value("IOR", NodeItem::Type::Float); +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_fresnel_cc /* node type definition */ @@ -38,6 +46,7 @@ void register_node_type_sh_fresnel() sh_node_type_base(&ntype, SH_NODE_FRESNEL, "Fresnel", NODE_CLASS_INPUT); ntype.declare = file_ns::node_declare; ntype.gpu_fn = file_ns::node_shader_gpu_fresnel; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 4c8004b49b28c77eee918416853919e4015ebb60 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:39:28 +0300 Subject: [PATCH 06/24] Node Geometry. --- .../shader/nodes/node_shader_geometry.cc | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_geometry.cc b/source/blender/nodes/shader/nodes/node_shader_geometry.cc index 6f04416f6fd..c29e659c528 100644 --- a/source/blender/nodes/shader/nodes/node_shader_geometry.cc +++ b/source/blender/nodes/shader/nodes/node_shader_geometry.cc @@ -58,6 +58,33 @@ static int node_shader_gpu_geometry(GPUMaterial *mat, return success; } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: Partially implemented, some nodes don't have an implementation in MaterialX 1.38.6.*/ + CLG_LogRef *LOG_MATERIALX_SHADER = materialx::LOG_MATERIALX_SHADER; + + NodeItem res = empty(); + const char *output_name = socket_out_->name; + + if (STREQ(output_name, "Position")) { + res = create_node("position", NodeItem::Type::Vector3); + res.set_input("space", val(std::string("world"))); + } + if (STREQ(output_name, "Normal")) { + res = create_node("normal", NodeItem::Type::Vector3); + res.set_input("space", val(std::string("world"))); + } + if (STREQ(output_name, "Tangent")) { + res = create_node("tangent", NodeItem::Type::Vector3); + res.set_input("space", val(std::string("world"))); + } + else { + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented output %s", output_name); + } + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_geometry_cc /* node type definition */ @@ -70,6 +97,7 @@ void register_node_type_sh_geometry() sh_node_type_base(&ntype, SH_NODE_NEW_GEOMETRY, "Geometry", NODE_CLASS_INPUT); ntype.declare = file_ns::node_declare; ntype.gpu_fn = file_ns::node_shader_gpu_geometry; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From cef33859c3fbe720f8d7c52c89e72ce0f56ddebf Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:40:10 +0300 Subject: [PATCH 07/24] Node Curves Info. --- .../nodes/shader/nodes/node_shader_hair_info.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_hair_info.cc b/source/blender/nodes/shader/nodes/node_shader_hair_info.cc index 36f97dcb06b..317ae1b91f4 100644 --- a/source/blender/nodes/shader/nodes/node_shader_hair_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_hair_info.cc @@ -29,6 +29,17 @@ static int node_shader_gpu_hair_info(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_hair_info", in, out, length_link); } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ + NodeItem res = val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); + if (!STREQ(socket_out_->name, "Tangent Normal")) { + res = res.extract(2); + } + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_hair_info_cc /* node type definition */ @@ -41,6 +52,7 @@ void register_node_type_sh_hair_info() sh_node_type_base(&ntype, SH_NODE_HAIR_INFO, "Curves Info", NODE_CLASS_INPUT); ntype.declare = file_ns::node_declare; ntype.gpu_fn = file_ns::node_shader_gpu_hair_info; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From cf81887a2e7a675576c67d79f81d5fc002c8dd1e Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:40:38 +0300 Subject: [PATCH 08/24] Node Layer Weight. --- .../nodes/shader/nodes/node_shader_layer_weight.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc b/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc index f92dff8cae9..c2f12c0ac97 100644 --- a/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc +++ b/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc @@ -27,6 +27,14 @@ static int node_shader_gpu_layer_weight(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_layer_weight", in, out); } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: some outputs expected be implemented partially within the next iteration (see nodedef + * ) */ + return val(1.0f); +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_layer_weight_cc /* node type definition */ @@ -39,6 +47,7 @@ void register_node_type_sh_layer_weight() sh_node_type_base(&ntype, SH_NODE_LAYER_WEIGHT, "Layer Weight", NODE_CLASS_INPUT); ntype.declare = file_ns::node_declare; ntype.gpu_fn = file_ns::node_shader_gpu_layer_weight; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 1cc08461736204c197d3e0e79c2bc9fed2843b38 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:41:02 +0300 Subject: [PATCH 09/24] Node Object Info. --- .../shader/nodes/node_shader_object_info.cc | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_object_info.cc b/source/blender/nodes/shader/nodes/node_shader_object_info.cc index 57ab75feb28..6e2128feb6f 100644 --- a/source/blender/nodes/shader/nodes/node_shader_object_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_object_info.cc @@ -30,6 +30,36 @@ static int node_shader_gpu_object_info(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_object_info", in, out, GPU_constant(&index)); } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: Partially implemented, some nodes don't have an implementation in MaterialX 1.38.6. + * some outputs expected be implemented within the next iteration*/ + + CLG_LogRef *LOG_MATERIALX_SHADER = materialx::LOG_MATERIALX_SHADER; + + NodeItem res = empty(); + const char *output_name = socket_out_->name; + + if (STREQ(output_name, "Location")) { + res = create_node("position", NodeItem::Type::Vector3); + res.set_input("space", val(std::string("world"))); + } + /* TODO: This node doesn't have an implementation in MaterialX 1.38.6. + * It's added in MaterialX 1.38.8. Uncomment this code after switching to 1.38.8. + * if (STREQ(output_name, "Random")) { + * res = create_node("randomfloat", NodeItem::Type::Float); + * res.set_input("in", val(0.0)); + * res.set_input("min", val(0.0)); + * res.set_input("max", val(1.0)); + * res.set_input("seed", val(0)); + *}*/ + else { + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented output %s", output_name); + } + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_object_info_cc void register_node_type_sh_object_info() @@ -41,6 +71,7 @@ void register_node_type_sh_object_info() sh_node_type_base(&ntype, SH_NODE_OBJECT_INFO, "Object Info", NODE_CLASS_INPUT); ntype.declare = file_ns::node_declare; ntype.gpu_fn = file_ns::node_shader_gpu_object_info; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 4f55b2282518bffb6ebee02f17d6c34f722ae826 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:41:26 +0300 Subject: [PATCH 10/24] Node Particle Info. --- .../shader/nodes/node_shader_particle_info.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_particle_info.cc b/source/blender/nodes/shader/nodes/node_shader_particle_info.cc index c188c0f10f3..ff35f962590 100644 --- a/source/blender/nodes/shader/nodes/node_shader_particle_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_particle_info.cc @@ -34,6 +34,20 @@ static int gpu_shader_particle_info(GPUMaterial *mat, return GPU_stack_link(mat, node, "particle_info", in, out); } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ + NodeItem res = val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); + if (STREQ(socket_out_->name, "Index") || STREQ(socket_out_->name, "Random") || + STREQ(socket_out_->name, "Age") || STREQ(socket_out_->name, "Lifetime") || + STREQ(socket_out_->name, "Size")) + { + res = res.extract(2); + } + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_particle_info_cc /* node type definition */ @@ -46,6 +60,7 @@ void register_node_type_sh_particle_info() sh_node_type_base(&ntype, SH_NODE_PARTICLE_INFO, "Particle Info", NODE_CLASS_INPUT); ntype.declare = file_ns::node_declare; ntype.gpu_fn = file_ns::gpu_shader_particle_info; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 6eb75647bbb1bd9b89d406214c819bace41ca945 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:41:50 +0300 Subject: [PATCH 11/24] Node Point Info. --- .../nodes/shader/nodes/node_shader_point_info.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_point_info.cc b/source/blender/nodes/shader/nodes/node_shader_point_info.cc index 4482e3cbca2..ed1962deb53 100644 --- a/source/blender/nodes/shader/nodes/node_shader_point_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_point_info.cc @@ -22,6 +22,17 @@ static int node_shader_gpu_point_info(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_point_info", in, out); } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ + NodeItem res = val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); + if (STREQ(socket_out_->name, "Radius") || STREQ(socket_out_->name, "Random")) { + res = res.extract(2); + } + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_point_info_cc /* node type definition */ @@ -34,6 +45,7 @@ void register_node_type_sh_point_info() sh_node_type_base(&ntype, SH_NODE_POINT_INFO, "Point Info", NODE_CLASS_INPUT); ntype.declare = file_ns::node_declare; ntype.gpu_fn = file_ns::node_shader_gpu_point_info; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 70324222ab1223d60daf280f8d051b1daddd3356 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:42:12 +0300 Subject: [PATCH 12/24] Node RGB. --- source/blender/nodes/shader/nodes/node_shader_rgb.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_rgb.cc b/source/blender/nodes/shader/nodes/node_shader_rgb.cc index 4d268e74b41..171d49deda3 100644 --- a/source/blender/nodes/shader/nodes/node_shader_rgb.cc +++ b/source/blender/nodes/shader/nodes/node_shader_rgb.cc @@ -26,6 +26,14 @@ static int gpu_shader_rgb(GPUMaterial *mat, return GPU_link(mat, "set_rgba", GPU_uniform(value), &out->link); } +NODE_SHADER_MATERIALX_BEGIN +{ + NodeItem res = create_node("constant", NodeItem::Type::Color4); + res.set_input("value", get_output_default("Color")); + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_rgb_cc void register_node_type_sh_rgb() @@ -37,6 +45,7 @@ void register_node_type_sh_rgb() sh_node_type_base(&ntype, SH_NODE_RGB, "RGB", NODE_CLASS_INPUT); ntype.declare = file_ns::node_declare; ntype.gpu_fn = file_ns::gpu_shader_rgb; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From b70011f50a4b1128fea916dee8ae29fe0e7394ef Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:42:38 +0300 Subject: [PATCH 13/24] Node Tangent. --- source/blender/nodes/shader/nodes/node_shader_tangent.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_tangent.cc b/source/blender/nodes/shader/nodes/node_shader_tangent.cc index 644c7fb8754..543d4be39d0 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tangent.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tangent.cc @@ -86,6 +86,13 @@ static int node_shader_gpu_tangent(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_tangent", in, out, orco); } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ + return val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_tangent_cc /* node type definition */ @@ -103,6 +110,7 @@ void register_node_type_sh_tangent() ntype.gpu_fn = file_ns::node_shader_gpu_tangent; node_type_storage( &ntype, "NodeShaderTangent", node_free_standard_storage, node_copy_standard_storage); + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 6acf520cf122c3882671d20090dff665df4b22d9 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:43:20 +0300 Subject: [PATCH 14/24] Node Texture Coordinate. --- .../shader/nodes/node_shader_tex_coord.cc | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc b/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc index 875fcf74607..fb445cc0d13 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc @@ -71,6 +71,27 @@ static int node_shader_gpu_tex_coord(GPUMaterial *mat, return 1; } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: Partially implemented, some nodes don't have an implementation in MaterialX 1.38.6. + * some outputs expected be implemented within the next iteration*/ + + CLG_LogRef *LOG_MATERIALX_SHADER = materialx::LOG_MATERIALX_SHADER; + + NodeItem res = val(MaterialX::Vector2(1.0f, 1.0f)); + const char *output_name = socket_out_->name; + + if (STREQ(output_name, "UV")) { + res = texcoord_node(); + } + else { + CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented output %s", output_name); + } + + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_tex_coord_cc /* node type definition */ @@ -84,6 +105,7 @@ void register_node_type_sh_tex_coord() ntype.declare = file_ns::node_declare; ntype.draw_buttons = file_ns::node_shader_buts_tex_coord; ntype.gpu_fn = file_ns::node_shader_gpu_tex_coord; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From fc2a155e2bb99d7a99ea0c2a7058366b1ad333fa Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:43:45 +0300 Subject: [PATCH 15/24] Node UVMap. --- source/blender/nodes/shader/nodes/node_shader_uvmap.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_uvmap.cc b/source/blender/nodes/shader/nodes/node_shader_uvmap.cc index 543400d8e28..ab4c79376f5 100644 --- a/source/blender/nodes/shader/nodes/node_shader_uvmap.cc +++ b/source/blender/nodes/shader/nodes/node_shader_uvmap.cc @@ -67,6 +67,13 @@ static int node_shader_gpu_uvmap(GPUMaterial *mat, return 1; } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: Partially implemented*/ + return texcoord_node(); +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_uvmap_cc /* node type definition */ @@ -84,6 +91,7 @@ void register_node_type_sh_uvmap() node_type_storage( &ntype, "NodeShaderUVMap", node_free_standard_storage, node_copy_standard_storage); ntype.gpu_fn = file_ns::node_shader_gpu_uvmap; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 178fe3d3acac82a51495b5ff6a81c16798da92e0 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:44:15 +0300 Subject: [PATCH 16/24] Node Value. --- source/blender/nodes/shader/nodes/node_shader_value.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_value.cc b/source/blender/nodes/shader/nodes/node_shader_value.cc index 072fdc2d917..75f568c3eee 100644 --- a/source/blender/nodes/shader/nodes/node_shader_value.cc +++ b/source/blender/nodes/shader/nodes/node_shader_value.cc @@ -38,6 +38,14 @@ static void sh_node_value_build_multi_function(NodeMultiFunctionBuilder &builder builder.construct_and_set_matching_fn>(value->value); } +NODE_SHADER_MATERIALX_BEGIN +{ + NodeItem res = create_node("constant", NodeItem::Type::Float); + res.set_input("value", get_output_default("Value")); + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_value_cc void register_node_type_sh_value() @@ -50,6 +58,7 @@ void register_node_type_sh_value() ntype.declare = file_ns::sh_node_value_declare; ntype.gpu_fn = file_ns::gpu_shader_value; ntype.build_multi_function = file_ns::sh_node_value_build_multi_function; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 1b8215f48ecc462f71899bd7e92444007cd8aeb9 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:45:31 +0300 Subject: [PATCH 17/24] Node Color Attribute. --- .../nodes/shader/nodes/node_shader_vertex_color.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc b/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc index 83b64c504e1..71f491e26f0 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc @@ -67,6 +67,19 @@ static int node_shader_gpu_vertex_color(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_vertex_color", in, out, vertexColorLink); } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: some output expected be implemented within the next iteration (see nodedef + * )*/ + NodeItem res = val(MaterialX::Color4(1.0f, 0.0f, 1.0f, 1.0f)); + if (STREQ(socket_out_->name, "Alpha")) { + res = res.extract(3); + } + + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_vertex_color_cc void register_node_type_sh_vertex_color() @@ -82,6 +95,7 @@ void register_node_type_sh_vertex_color() node_type_storage( &ntype, "NodeShaderVertexColor", node_free_standard_storage, node_copy_standard_storage); ntype.gpu_fn = file_ns::node_shader_gpu_vertex_color; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From b934a39fb3d7e1fedbbe078e09cc25c6660756d8 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:46:18 +0300 Subject: [PATCH 18/24] Node Wireframe. --- .../blender/nodes/shader/nodes/node_shader_wireframe.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_wireframe.cc b/source/blender/nodes/shader/nodes/node_shader_wireframe.cc index 221beb777f0..677c7dcc1d3 100644 --- a/source/blender/nodes/shader/nodes/node_shader_wireframe.cc +++ b/source/blender/nodes/shader/nodes/node_shader_wireframe.cc @@ -40,6 +40,13 @@ static int node_shader_gpu_wireframe(GPUMaterial *mat, } } +NODE_SHADER_MATERIALX_BEGIN +{ + /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ + return val(1.0f); +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_wireframe_cc /* node type definition */ @@ -53,6 +60,7 @@ void register_node_type_sh_wireframe() ntype.declare = file_ns::node_declare; ntype.draw_buttons = file_ns::node_shader_buts_wireframe; ntype.gpu_fn = file_ns::node_shader_gpu_wireframe; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 891c3c0966fb622918717497eca01d2760852c38 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 13 Sep 2023 15:52:55 +0300 Subject: [PATCH 19/24] Implemented get_value_default, get_output_default. Fixed type conversion issue. Now type is converted even if node is already in graph. --- .../nodes/shader/materialx/node_parser.cc | 25 +++++++++++++++++-- .../nodes/shader/materialx/node_parser.h | 4 +++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/source/blender/nodes/shader/materialx/node_parser.cc b/source/blender/nodes/shader/materialx/node_parser.cc index 357a27cacbb..29326d3d3e7 100644 --- a/source/blender/nodes/shader/materialx/node_parser.cc +++ b/source/blender/nodes/shader/materialx/node_parser.cc @@ -34,7 +34,7 @@ NodeItem NodeParser::compute_full() /* Checking if node was already computed */ res.node = graph_->getNode(node_name()); if (res.node) { - return res; + return res.convert(to_type_); } CLOG_INFO(LOG_MATERIALX_SHADER, @@ -101,6 +101,16 @@ NodeItem NodeParser::get_input_value(int index, NodeItem::Type to_type) return get_input_value(node_->input_socket(index), to_type); } +NodeItem NodeParser::get_output_default(const std::string &name) +{ + return get_output_default(node_->output_by_identifier(name)); +} + +NodeItem NodeParser::get_output_default(int index) +{ + return get_output_default(node_->output_socket(index)); +} + NodeItem NodeParser::empty() const { return NodeItem(graph_); @@ -118,6 +128,17 @@ NodeItem NodeParser::texcoord_node() } NodeItem NodeParser::get_input_default(const bNodeSocket &socket, NodeItem::Type to_type) +{ + NodeItem res = get_value_default(socket); + return res.convert(to_type); +} + +NodeItem NodeParser::get_output_default(const bNodeSocket &socket) +{ + return get_value_default(socket); +} + +NodeItem NodeParser::get_value_default(const bNodeSocket &socket) { NodeItem res = empty(); switch (socket.type) { @@ -142,7 +163,7 @@ NodeItem NodeParser::get_input_default(const bNodeSocket &socket, NodeItem::Type CLOG_WARN(LOG_MATERIALX_SHADER, "Unsupported socket type: %d", socket.type); } } - return res.convert(to_type); + return res; } NodeItem NodeParser::get_input_link(const bNodeSocket &socket, NodeItem::Type to_type) diff --git a/source/blender/nodes/shader/materialx/node_parser.h b/source/blender/nodes/shader/materialx/node_parser.h index c0e6d6952f0..0dd1ecf6913 100644 --- a/source/blender/nodes/shader/materialx/node_parser.h +++ b/source/blender/nodes/shader/materialx/node_parser.h @@ -42,6 +42,8 @@ class NodeParser { NodeItem create_node(const std::string &category, NodeItem::Type type); NodeItem get_input_default(const std::string &name, NodeItem::Type to_type); NodeItem get_input_default(int index, NodeItem::Type to_type); + NodeItem get_output_default(const std::string &name); + NodeItem get_output_default(int index); NodeItem get_input_link(const std::string &name, NodeItem::Type to_type); NodeItem get_input_link(int index, NodeItem::Type to_type); NodeItem get_input_value(const std::string &name, NodeItem::Type to_type); @@ -52,6 +54,8 @@ class NodeParser { private: NodeItem get_input_default(const bNodeSocket &socket, NodeItem::Type to_type); + NodeItem get_output_default(const bNodeSocket &socket); + NodeItem get_value_default(const bNodeSocket &socket); NodeItem get_input_link(const bNodeSocket &socket, NodeItem::Type to_type); NodeItem get_input_value(const bNodeSocket &socket, NodeItem::Type to_type); }; -- 2.30.2 From b06e2e9da506deaaedb0b524bbff5facd88f3b2d Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Fri, 15 Sep 2023 10:38:39 +0300 Subject: [PATCH 20/24] Review comments. --- .../nodes/shader/materialx/node_item.cc | 12 ++++++ .../nodes/shader/materialx/node_parser.cc | 38 +++++++------------ .../nodes/shader/materialx/node_parser.h | 10 ++--- .../nodes/node_shader_ambient_occlusion.cc | 8 ++-- .../shader/nodes/node_shader_attribute.cc | 14 ++----- .../nodes/shader/nodes/node_shader_bevel.cc | 7 ++-- .../nodes/shader/nodes/node_shader_camera.cc | 13 ++----- .../nodes/shader/nodes/node_shader_fresnel.cc | 2 + .../shader/nodes/node_shader_geometry.cc | 16 ++++---- .../shader/nodes/node_shader_hair_info.cc | 10 ++--- .../shader/nodes/node_shader_layer_weight.cc | 4 +- .../shader/nodes/node_shader_object_info.cc | 18 ++++----- .../shader/nodes/node_shader_particle_info.cc | 13 ++----- .../shader/nodes/node_shader_point_info.cc | 10 ++--- .../nodes/shader/nodes/node_shader_rgb.cc | 4 +- .../nodes/shader/nodes/node_shader_tangent.cc | 6 ++- .../shader/nodes/node_shader_tex_coord.cc | 26 ++++++++----- .../nodes/shader/nodes/node_shader_uvmap.cc | 8 +++- .../nodes/shader/nodes/node_shader_value.cc | 4 +- .../shader/nodes/node_shader_vertex_color.cc | 9 ++--- .../shader/nodes/node_shader_wireframe.cc | 6 ++- 21 files changed, 116 insertions(+), 122 deletions(-) diff --git a/source/blender/nodes/shader/materialx/node_item.cc b/source/blender/nodes/shader/materialx/node_item.cc index af3d6af54f6..08ce206b373 100644 --- a/source/blender/nodes/shader/materialx/node_item.cc +++ b/source/blender/nodes/shader/materialx/node_item.cc @@ -376,6 +376,8 @@ NodeItem NodeItem::convert(Type to_type) const switch (to_type) { case Type::Vector4: return convert(Type::Vector3).convert(Type::Vector4); + case Type::Vector3: + return convert(Type::Vector3); case Type::Color3: return convert(Type::Vector3).convert(Type::Color3); case Type::Color4: @@ -388,12 +390,20 @@ NodeItem NodeItem::convert(Type to_type) const switch (to_type) { case Type::Color4: return convert(Type::Color3).convert(Type::Color4); + case Type::Color3: + return convert(Type::Color3); + case Type::Vector4: + return convert(Type::Vector4); + case Type::Vector2: + return convert(Type::Vector2); default: break; } break; case Type::Vector4: switch (to_type) { + case Type::Vector3: + return convert(Type::Vector3); case Type::Vector2: return convert(Type::Vector3).convert(Type::Vector2); case Type::Color3: @@ -408,6 +418,8 @@ NodeItem NodeItem::convert(Type to_type) const return convert(Type::Vector3).convert(Type::Vector2); case Type::Vector4: return convert(Type::Vector3).convert(Type::Vector4); + case Type::Vector3: + return convert(Type::Vector3); default: break; } diff --git a/source/blender/nodes/shader/materialx/node_parser.cc b/source/blender/nodes/shader/materialx/node_parser.cc index 29326d3d3e7..60ea0c8cde4 100644 --- a/source/blender/nodes/shader/materialx/node_parser.cc +++ b/source/blender/nodes/shader/materialx/node_parser.cc @@ -73,12 +73,12 @@ NodeItem NodeParser::create_node(const std::string &category, NodeItem::Type typ NodeItem NodeParser::get_input_default(const std::string &name, NodeItem::Type to_type) { - return get_input_default(node_->input_by_identifier(name), to_type); + return get_default(node_->input_by_identifier(name), to_type); } NodeItem NodeParser::get_input_default(int index, NodeItem::Type to_type) { - return get_input_default(node_->input_socket(index), to_type); + return get_default(node_->input_socket(index), to_type); } NodeItem NodeParser::get_input_link(const std::string &name, NodeItem::Type to_type) @@ -101,14 +101,14 @@ NodeItem NodeParser::get_input_value(int index, NodeItem::Type to_type) return get_input_value(node_->input_socket(index), to_type); } -NodeItem NodeParser::get_output_default(const std::string &name) +NodeItem NodeParser::get_output_default(const std::string &name, NodeItem::Type to_type) { - return get_output_default(node_->output_by_identifier(name)); + return get_default(node_->output_by_identifier(name), to_type); } -NodeItem NodeParser::get_output_default(int index) +NodeItem NodeParser::get_output_default(int index, NodeItem::Type to_type) { - return get_output_default(node_->output_socket(index)); + return get_default(node_->output_socket(index), to_type); } NodeItem NodeParser::empty() const @@ -116,29 +116,19 @@ NodeItem NodeParser::empty() const return NodeItem(graph_); } -NodeItem NodeParser::texcoord_node() +NodeItem NodeParser::texcoord_node(NodeItem::Type data_type) { NodeItem res = empty(); - res.node = graph_->getNode(TEXCOORD_NODE_NAME); + std::string name = TEXCOORD_NODE_NAME + "_" + NodeItem::type(data_type); + res.node = graph_->getNode(name); if (!res.node) { - res = create_node("texcoord", NodeItem::Type::Vector2); - res.node->setName(TEXCOORD_NODE_NAME); + res = create_node("texcoord", data_type); + res.node->setName(name); } return res; } -NodeItem NodeParser::get_input_default(const bNodeSocket &socket, NodeItem::Type to_type) -{ - NodeItem res = get_value_default(socket); - return res.convert(to_type); -} - -NodeItem NodeParser::get_output_default(const bNodeSocket &socket) -{ - return get_value_default(socket); -} - -NodeItem NodeParser::get_value_default(const bNodeSocket &socket) +NodeItem NodeParser::get_default(const bNodeSocket &socket, NodeItem::Type to_type) { NodeItem res = empty(); switch (socket.type) { @@ -163,7 +153,7 @@ NodeItem NodeParser::get_value_default(const bNodeSocket &socket) CLOG_WARN(LOG_MATERIALX_SHADER, "Unsupported socket type: %d", socket.type); } } - return res; + return res.convert(to_type); } NodeItem NodeParser::get_input_link(const bNodeSocket &socket, NodeItem::Type to_type) @@ -201,7 +191,7 @@ NodeItem NodeParser::get_input_value(const bNodeSocket &socket, NodeItem::Type t { NodeItem res = get_input_link(socket, to_type); if (!res) { - res = get_input_default(socket, to_type); + res = get_default(socket, to_type); } return res; } diff --git a/source/blender/nodes/shader/materialx/node_parser.h b/source/blender/nodes/shader/materialx/node_parser.h index 0dd1ecf6913..5b96c3e8203 100644 --- a/source/blender/nodes/shader/materialx/node_parser.h +++ b/source/blender/nodes/shader/materialx/node_parser.h @@ -42,20 +42,18 @@ class NodeParser { NodeItem create_node(const std::string &category, NodeItem::Type type); NodeItem get_input_default(const std::string &name, NodeItem::Type to_type); NodeItem get_input_default(int index, NodeItem::Type to_type); - NodeItem get_output_default(const std::string &name); - NodeItem get_output_default(int index); + NodeItem get_output_default(const std::string &name, NodeItem::Type to_type); + NodeItem get_output_default(int index, NodeItem::Type to_type); NodeItem get_input_link(const std::string &name, NodeItem::Type to_type); NodeItem get_input_link(int index, NodeItem::Type to_type); NodeItem get_input_value(const std::string &name, NodeItem::Type to_type); NodeItem get_input_value(int index, NodeItem::Type to_type); NodeItem empty() const; template NodeItem val(const T &data) const; - NodeItem texcoord_node(); + NodeItem texcoord_node(NodeItem::Type data_type = NodeItem::Type::Vector2); private: - NodeItem get_input_default(const bNodeSocket &socket, NodeItem::Type to_type); - NodeItem get_output_default(const bNodeSocket &socket); - NodeItem get_value_default(const bNodeSocket &socket); + NodeItem get_default(const bNodeSocket &socket, NodeItem::Type to_type); NodeItem get_input_link(const bNodeSocket &socket, NodeItem::Type to_type); NodeItem get_input_value(const bNodeSocket &socket, NodeItem::Type to_type); }; diff --git a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc index d2ccdb2ac73..cfb12be235d 100644 --- a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc +++ b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc @@ -56,6 +56,7 @@ static void node_shader_init_ambient_occlusion(bNodeTree * /*ntree*/, bNode *nod } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { /* TODO: observed crash while rendering MaterialX_v1_38_6::ExceptionShaderGenError */ /* @@ -64,12 +65,9 @@ NODE_SHADER_MATERIALX_BEGIN * res.set_input("coneangle", val(90.0f)); * res.set_input("maxdistance", maxdistance); */ - NodeItem res = val(MaterialX::Color4(1.0f, 0.0f, 1.0f, 1.0f)); - if (STREQ(socket_out_->name, "AO")) { - res = res.extract(3); - } - return res; + return get_output_default(socket_out_->name, NodeItem::Type::Any); } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_ambient_occlusion_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_attribute.cc b/source/blender/nodes/shader/nodes/node_shader_attribute.cc index b93ad93538a..7c5ef505405 100644 --- a/source/blender/nodes/shader/nodes/node_shader_attribute.cc +++ b/source/blender/nodes/shader/nodes/node_shader_attribute.cc @@ -78,22 +78,14 @@ static int node_shader_gpu_attribute(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { /* TODO: some outputs expected be implemented within the next iteration (see nodedef * ) */ - NodeItem res = val(MaterialX::Color4(1.0f, 0.0f, 1.0f, 1.0f)); - if (STREQ(socket_out_->name, "Vector")) { - res = val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); - } - if (STREQ(socket_out_->name, "Factor")) { - res = res.extract(3); - } - if (STREQ(socket_out_->name, "Alpha")) { - res = res.extract(3); - } - return res; + return get_output_default(socket_out_->name, NodeItem::Type::Any); } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_attribute_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_bevel.cc b/source/blender/nodes/shader/nodes/node_shader_bevel.cc index cd92fe5b0bf..b17495bcb58 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bevel.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bevel.cc @@ -40,11 +40,12 @@ static int gpu_shader_bevel(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { - /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ - return val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); - ; + /* NOTE: This node doesn't have an implementation in MaterialX.*/ + return get_input_link("Normal", NodeItem::Type::Vector3); } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_bevel_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_camera.cc b/source/blender/nodes/shader/nodes/node_shader_camera.cc index d8cfdee4158..65496d1fd54 100644 --- a/source/blender/nodes/shader/nodes/node_shader_camera.cc +++ b/source/blender/nodes/shader/nodes/node_shader_camera.cc @@ -27,17 +27,12 @@ static int gpu_shader_camera(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { - /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ - NodeItem res = val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); - if (STREQ(socket_out_->name, "View Z Depth")) { - res = res.extract(2); - } - if (STREQ(socket_out_->name, "View Distance")) { - res = res.extract(2); - } - return res; + /* NOTE: This node doesn't have an implementation in MaterialX.*/ + return get_output_default(socket_out_->name, NodeItem::Type::Any); } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_camera_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_fresnel.cc b/source/blender/nodes/shader/nodes/node_shader_fresnel.cc index 1f09679d946..cfd73b30f09 100644 --- a/source/blender/nodes/shader/nodes/node_shader_fresnel.cc +++ b/source/blender/nodes/shader/nodes/node_shader_fresnel.cc @@ -27,11 +27,13 @@ static int node_shader_gpu_fresnel(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { /* TODO: some outputs expected be implemented within the next iteration (see nodedef * ) */ return get_input_value("IOR", NodeItem::Type::Float); } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_fresnel_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_geometry.cc b/source/blender/nodes/shader/nodes/node_shader_geometry.cc index c29e659c528..13b84842275 100644 --- a/source/blender/nodes/shader/nodes/node_shader_geometry.cc +++ b/source/blender/nodes/shader/nodes/node_shader_geometry.cc @@ -59,30 +59,30 @@ static int node_shader_gpu_geometry(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { - /* TODO: Partially implemented, some nodes don't have an implementation in MaterialX 1.38.6.*/ - CLG_LogRef *LOG_MATERIALX_SHADER = materialx::LOG_MATERIALX_SHADER; - + /* NOTE: Some outputs don't have an implementation in MaterialX.*/ NodeItem res = empty(); - const char *output_name = socket_out_->name; + std::string name = socket_out_->name; - if (STREQ(output_name, "Position")) { + if (name == "Position"){ res = create_node("position", NodeItem::Type::Vector3); res.set_input("space", val(std::string("world"))); } - if (STREQ(output_name, "Normal")) { + else if (name =="Normal"){ res = create_node("normal", NodeItem::Type::Vector3); res.set_input("space", val(std::string("world"))); } - if (STREQ(output_name, "Tangent")) { + else if (ELEM(name, "Tangent", "True Normal")) { res = create_node("tangent", NodeItem::Type::Vector3); res.set_input("space", val(std::string("world"))); } else { - CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented output %s", output_name); + res = get_output_default(name, NodeItem::Type::Any); } return res; } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_geometry_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_hair_info.cc b/source/blender/nodes/shader/nodes/node_shader_hair_info.cc index 317ae1b91f4..fe4f9b21b08 100644 --- a/source/blender/nodes/shader/nodes/node_shader_hair_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_hair_info.cc @@ -30,14 +30,12 @@ static int node_shader_gpu_hair_info(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { - /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ - NodeItem res = val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); - if (!STREQ(socket_out_->name, "Tangent Normal")) { - res = res.extract(2); - } - return res; + /* NOTE: This node doesn't have an implementation in MaterialX.*/ + return get_output_default(socket_out_->name, NodeItem::Type::Any); } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_hair_info_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc b/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc index c2f12c0ac97..c39832f6e4e 100644 --- a/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc +++ b/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc @@ -28,11 +28,13 @@ static int node_shader_gpu_layer_weight(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { /* TODO: some outputs expected be implemented partially within the next iteration (see nodedef * ) */ - return val(1.0f); + return get_input_link("Blend", NodeItem::Type::Float); } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_layer_weight_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_object_info.cc b/source/blender/nodes/shader/nodes/node_shader_object_info.cc index 6e2128feb6f..44d6286085a 100644 --- a/source/blender/nodes/shader/nodes/node_shader_object_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_object_info.cc @@ -31,22 +31,19 @@ static int node_shader_gpu_object_info(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { - /* TODO: Partially implemented, some nodes don't have an implementation in MaterialX 1.38.6. - * some outputs expected be implemented within the next iteration*/ - - CLG_LogRef *LOG_MATERIALX_SHADER = materialx::LOG_MATERIALX_SHADER; - + /* NOTE: Some outputs don't have an implementation in MaterialX.*/ NodeItem res = empty(); - const char *output_name = socket_out_->name; + std::string name = socket_out_->name; - if (STREQ(output_name, "Location")) { + if (name == "Location") { res = create_node("position", NodeItem::Type::Vector3); res.set_input("space", val(std::string("world"))); } - /* TODO: This node doesn't have an implementation in MaterialX 1.38.6. + /* TODO: This node doesn't have an implementation in MaterialX. * It's added in MaterialX 1.38.8. Uncomment this code after switching to 1.38.8. - * if (STREQ(output_name, "Random")) { + * if (name=="Random") { * res = create_node("randomfloat", NodeItem::Type::Float); * res.set_input("in", val(0.0)); * res.set_input("min", val(0.0)); @@ -54,10 +51,11 @@ NODE_SHADER_MATERIALX_BEGIN * res.set_input("seed", val(0)); *}*/ else { - CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented output %s", output_name); + res = get_output_default(name, NodeItem::Type::Any); } return res; } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_object_info_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_particle_info.cc b/source/blender/nodes/shader/nodes/node_shader_particle_info.cc index ff35f962590..d194fb56769 100644 --- a/source/blender/nodes/shader/nodes/node_shader_particle_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_particle_info.cc @@ -35,17 +35,12 @@ static int gpu_shader_particle_info(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { - /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ - NodeItem res = val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); - if (STREQ(socket_out_->name, "Index") || STREQ(socket_out_->name, "Random") || - STREQ(socket_out_->name, "Age") || STREQ(socket_out_->name, "Lifetime") || - STREQ(socket_out_->name, "Size")) - { - res = res.extract(2); - } - return res; + /* NOTE: This node doesn't have an implementation in MaterialX.*/ + return get_output_default(socket_out_->name, NodeItem::Type::Any); } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_particle_info_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_point_info.cc b/source/blender/nodes/shader/nodes/node_shader_point_info.cc index ed1962deb53..69ce2c94006 100644 --- a/source/blender/nodes/shader/nodes/node_shader_point_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_point_info.cc @@ -23,14 +23,12 @@ static int node_shader_gpu_point_info(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { - /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ - NodeItem res = val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); - if (STREQ(socket_out_->name, "Radius") || STREQ(socket_out_->name, "Random")) { - res = res.extract(2); - } - return res; + /* NOTE: This node doesn't have an implementation in MaterialX.*/ + return get_output_default(socket_out_->name, NodeItem::Type::Any); } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_point_info_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_rgb.cc b/source/blender/nodes/shader/nodes/node_shader_rgb.cc index 171d49deda3..1899c56a90a 100644 --- a/source/blender/nodes/shader/nodes/node_shader_rgb.cc +++ b/source/blender/nodes/shader/nodes/node_shader_rgb.cc @@ -27,11 +27,13 @@ static int gpu_shader_rgb(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { NodeItem res = create_node("constant", NodeItem::Type::Color4); - res.set_input("value", get_output_default("Color")); + res.set_input("value", get_output_default("Color", NodeItem::Type::Color4)); return res; } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_rgb_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_tangent.cc b/source/blender/nodes/shader/nodes/node_shader_tangent.cc index 543d4be39d0..e2090843b64 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tangent.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tangent.cc @@ -87,10 +87,12 @@ static int node_shader_gpu_tangent(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { - /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ - return val(MaterialX::Vector3(1.0f, 1.0f, 1.0f)); + /* TODO: This node doesn't have an implementation in MaterialX.*/ + return get_output_default(socket_out_->name, NodeItem::Type::Vector3);; } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_tangent_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc b/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc index fb445cc0d13..7b8ce12e5b6 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc @@ -72,24 +72,30 @@ static int node_shader_gpu_tex_coord(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { - /* TODO: Partially implemented, some nodes don't have an implementation in MaterialX 1.38.6. - * some outputs expected be implemented within the next iteration*/ + /* NOTE: Some outputs don't have an implementation in MaterialX.*/ + NodeItem res = empty(); + std::string name = socket_out_->name; - CLG_LogRef *LOG_MATERIALX_SHADER = materialx::LOG_MATERIALX_SHADER; - - NodeItem res = val(MaterialX::Vector2(1.0f, 1.0f)); - const char *output_name = socket_out_->name; - - if (STREQ(output_name, "UV")) { - res = texcoord_node(); + if (ELEM(name, "Generated", "UV")) { + res = texcoord_node(NodeItem::Type::Vector3); + } + else if (name == "Normal") { + res = create_node("normal", NodeItem::Type::Vector3); + res.set_input("space", val(std::string("world"))); + } + else if (name == "Object") { + res = create_node("position", NodeItem::Type::Vector3); + res.set_input("space", val(std::string("world"))); } else { - CLOG_WARN(LOG_MATERIALX_SHADER, "Unimplemented output %s", output_name); + res = get_output_default(name, NodeItem::Type::Any); } return res; } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_tex_coord_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_uvmap.cc b/source/blender/nodes/shader/nodes/node_shader_uvmap.cc index ab4c79376f5..63781cf792e 100644 --- a/source/blender/nodes/shader/nodes/node_shader_uvmap.cc +++ b/source/blender/nodes/shader/nodes/node_shader_uvmap.cc @@ -68,10 +68,14 @@ static int node_shader_gpu_uvmap(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { - /* TODO: Partially implemented*/ - return texcoord_node(); + /* NODE: "From Instances" not implemented + * UV selection not implemented + */ + return texcoord_node(NodeItem::Type::Vector3); } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_uvmap_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_value.cc b/source/blender/nodes/shader/nodes/node_shader_value.cc index 75f568c3eee..5819f935774 100644 --- a/source/blender/nodes/shader/nodes/node_shader_value.cc +++ b/source/blender/nodes/shader/nodes/node_shader_value.cc @@ -39,11 +39,13 @@ static void sh_node_value_build_multi_function(NodeMultiFunctionBuilder &builder } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { NodeItem res = create_node("constant", NodeItem::Type::Float); - res.set_input("value", get_output_default("Value")); + res.set_input("value", get_output_default("Value", NodeItem::Type::Float)); return res; } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_value_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc b/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc index 71f491e26f0..0664aa1b31e 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc @@ -68,16 +68,13 @@ static int node_shader_gpu_vertex_color(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { /* TODO: some output expected be implemented within the next iteration (see nodedef * )*/ - NodeItem res = val(MaterialX::Color4(1.0f, 0.0f, 1.0f, 1.0f)); - if (STREQ(socket_out_->name, "Alpha")) { - res = res.extract(3); - } - - return res; + return get_output_default(socket_out_->name, NodeItem::Type::Any); } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_vertex_color_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_wireframe.cc b/source/blender/nodes/shader/nodes/node_shader_wireframe.cc index 677c7dcc1d3..de80829b3fe 100644 --- a/source/blender/nodes/shader/nodes/node_shader_wireframe.cc +++ b/source/blender/nodes/shader/nodes/node_shader_wireframe.cc @@ -41,10 +41,12 @@ static int node_shader_gpu_wireframe(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { - /* TODO: This node doesn't have an implementation in MaterialX 1.38.6.*/ - return val(1.0f); + /* NOTE: This node doesn't have an implementation in MaterialX.*/ + return get_output_default(socket_out_->name, NodeItem::Type::Float); } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_wireframe_cc -- 2.30.2 From 1b6b13df4c66a8fd336f0c3857ddf922341da979 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Fri, 15 Sep 2023 13:08:42 +0300 Subject: [PATCH 21/24] Remove redundant type conversion. Removerd to_type argument from get_output_default to avoid double conversion. Revert texcoord node to Vector2 as far as Vector 3 returns black result. --- .../nodes/shader/materialx/node_item.cc | 12 --------- .../nodes/shader/materialx/node_parser.cc | 27 +++++++++---------- .../nodes/shader/materialx/node_parser.h | 8 +++--- .../nodes/node_shader_ambient_occlusion.cc | 2 +- .../shader/nodes/node_shader_attribute.cc | 2 +- .../nodes/shader/nodes/node_shader_camera.cc | 2 +- .../shader/nodes/node_shader_geometry.cc | 2 +- .../shader/nodes/node_shader_hair_info.cc | 2 +- .../shader/nodes/node_shader_object_info.cc | 2 +- .../shader/nodes/node_shader_particle_info.cc | 2 +- .../shader/nodes/node_shader_point_info.cc | 2 +- .../nodes/shader/nodes/node_shader_rgb.cc | 2 +- .../nodes/shader/nodes/node_shader_tangent.cc | 2 +- .../shader/nodes/node_shader_tex_coord.cc | 4 +-- .../nodes/shader/nodes/node_shader_uvmap.cc | 2 +- .../nodes/shader/nodes/node_shader_value.cc | 2 +- .../shader/nodes/node_shader_vertex_color.cc | 2 +- .../shader/nodes/node_shader_wireframe.cc | 2 +- 18 files changed, 33 insertions(+), 46 deletions(-) diff --git a/source/blender/nodes/shader/materialx/node_item.cc b/source/blender/nodes/shader/materialx/node_item.cc index 08ce206b373..af3d6af54f6 100644 --- a/source/blender/nodes/shader/materialx/node_item.cc +++ b/source/blender/nodes/shader/materialx/node_item.cc @@ -376,8 +376,6 @@ NodeItem NodeItem::convert(Type to_type) const switch (to_type) { case Type::Vector4: return convert(Type::Vector3).convert(Type::Vector4); - case Type::Vector3: - return convert(Type::Vector3); case Type::Color3: return convert(Type::Vector3).convert(Type::Color3); case Type::Color4: @@ -390,20 +388,12 @@ NodeItem NodeItem::convert(Type to_type) const switch (to_type) { case Type::Color4: return convert(Type::Color3).convert(Type::Color4); - case Type::Color3: - return convert(Type::Color3); - case Type::Vector4: - return convert(Type::Vector4); - case Type::Vector2: - return convert(Type::Vector2); default: break; } break; case Type::Vector4: switch (to_type) { - case Type::Vector3: - return convert(Type::Vector3); case Type::Vector2: return convert(Type::Vector3).convert(Type::Vector2); case Type::Color3: @@ -418,8 +408,6 @@ NodeItem NodeItem::convert(Type to_type) const return convert(Type::Vector3).convert(Type::Vector2); case Type::Vector4: return convert(Type::Vector3).convert(Type::Vector4); - case Type::Vector3: - return convert(Type::Vector3); default: break; } diff --git a/source/blender/nodes/shader/materialx/node_parser.cc b/source/blender/nodes/shader/materialx/node_parser.cc index 60ea0c8cde4..fbb892afe88 100644 --- a/source/blender/nodes/shader/materialx/node_parser.cc +++ b/source/blender/nodes/shader/materialx/node_parser.cc @@ -73,12 +73,12 @@ NodeItem NodeParser::create_node(const std::string &category, NodeItem::Type typ NodeItem NodeParser::get_input_default(const std::string &name, NodeItem::Type to_type) { - return get_default(node_->input_by_identifier(name), to_type); + return get_default(node_->input_by_identifier(name)).convert(to_type); } NodeItem NodeParser::get_input_default(int index, NodeItem::Type to_type) { - return get_default(node_->input_socket(index), to_type); + return get_default(node_->input_socket(index)).convert(to_type); } NodeItem NodeParser::get_input_link(const std::string &name, NodeItem::Type to_type) @@ -101,14 +101,14 @@ NodeItem NodeParser::get_input_value(int index, NodeItem::Type to_type) return get_input_value(node_->input_socket(index), to_type); } -NodeItem NodeParser::get_output_default(const std::string &name, NodeItem::Type to_type) +NodeItem NodeParser::get_output_default(const std::string &name) { - return get_default(node_->output_by_identifier(name), to_type); + return get_default(node_->output_by_identifier(name)); } -NodeItem NodeParser::get_output_default(int index, NodeItem::Type to_type) +NodeItem NodeParser::get_output_default(int index) { - return get_default(node_->output_socket(index), to_type); + return get_default(node_->output_socket(index)); } NodeItem NodeParser::empty() const @@ -116,19 +116,18 @@ NodeItem NodeParser::empty() const return NodeItem(graph_); } -NodeItem NodeParser::texcoord_node(NodeItem::Type data_type) +NodeItem NodeParser::texcoord_node() { NodeItem res = empty(); - std::string name = TEXCOORD_NODE_NAME + "_" + NodeItem::type(data_type); - res.node = graph_->getNode(name); + res.node = graph_->getNode(TEXCOORD_NODE_NAME); if (!res.node) { - res = create_node("texcoord", data_type); - res.node->setName(name); + res = create_node("texcoord", NodeItem::Type::Vector2); + res.node->setName(TEXCOORD_NODE_NAME); } return res; } -NodeItem NodeParser::get_default(const bNodeSocket &socket, NodeItem::Type to_type) +NodeItem NodeParser::get_default(const bNodeSocket &socket) { NodeItem res = empty(); switch (socket.type) { @@ -153,7 +152,7 @@ NodeItem NodeParser::get_default(const bNodeSocket &socket, NodeItem::Type to_ty CLOG_WARN(LOG_MATERIALX_SHADER, "Unsupported socket type: %d", socket.type); } } - return res.convert(to_type); + return res; } NodeItem NodeParser::get_input_link(const bNodeSocket &socket, NodeItem::Type to_type) @@ -191,7 +190,7 @@ NodeItem NodeParser::get_input_value(const bNodeSocket &socket, NodeItem::Type t { NodeItem res = get_input_link(socket, to_type); if (!res) { - res = get_default(socket, to_type); + res = get_default(socket).convert(to_type); } return res; } diff --git a/source/blender/nodes/shader/materialx/node_parser.h b/source/blender/nodes/shader/materialx/node_parser.h index 5b96c3e8203..8a9286edeee 100644 --- a/source/blender/nodes/shader/materialx/node_parser.h +++ b/source/blender/nodes/shader/materialx/node_parser.h @@ -42,18 +42,18 @@ class NodeParser { NodeItem create_node(const std::string &category, NodeItem::Type type); NodeItem get_input_default(const std::string &name, NodeItem::Type to_type); NodeItem get_input_default(int index, NodeItem::Type to_type); - NodeItem get_output_default(const std::string &name, NodeItem::Type to_type); - NodeItem get_output_default(int index, NodeItem::Type to_type); + NodeItem get_output_default(const std::string &name); + NodeItem get_output_default(int index); NodeItem get_input_link(const std::string &name, NodeItem::Type to_type); NodeItem get_input_link(int index, NodeItem::Type to_type); NodeItem get_input_value(const std::string &name, NodeItem::Type to_type); NodeItem get_input_value(int index, NodeItem::Type to_type); NodeItem empty() const; template NodeItem val(const T &data) const; - NodeItem texcoord_node(NodeItem::Type data_type = NodeItem::Type::Vector2); + NodeItem texcoord_node(); private: - NodeItem get_default(const bNodeSocket &socket, NodeItem::Type to_type); + NodeItem get_default(const bNodeSocket &socket); NodeItem get_input_link(const bNodeSocket &socket, NodeItem::Type to_type); NodeItem get_input_value(const bNodeSocket &socket, NodeItem::Type to_type); }; diff --git a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc index cfb12be235d..f1e7aa4d9ca 100644 --- a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc +++ b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc @@ -65,7 +65,7 @@ NODE_SHADER_MATERIALX_BEGIN * res.set_input("coneangle", val(90.0f)); * res.set_input("maxdistance", maxdistance); */ - return get_output_default(socket_out_->name, NodeItem::Type::Any); + return get_output_default(socket_out_->name); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_attribute.cc b/source/blender/nodes/shader/nodes/node_shader_attribute.cc index 7c5ef505405..e4923a79d16 100644 --- a/source/blender/nodes/shader/nodes/node_shader_attribute.cc +++ b/source/blender/nodes/shader/nodes/node_shader_attribute.cc @@ -83,7 +83,7 @@ NODE_SHADER_MATERIALX_BEGIN /* TODO: some outputs expected be implemented within the next iteration (see nodedef * ) */ - return get_output_default(socket_out_->name, NodeItem::Type::Any); + return get_output_default(socket_out_->name); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_camera.cc b/source/blender/nodes/shader/nodes/node_shader_camera.cc index 65496d1fd54..51e19133290 100644 --- a/source/blender/nodes/shader/nodes/node_shader_camera.cc +++ b/source/blender/nodes/shader/nodes/node_shader_camera.cc @@ -30,7 +30,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { /* NOTE: This node doesn't have an implementation in MaterialX.*/ - return get_output_default(socket_out_->name, NodeItem::Type::Any); + return get_output_default(socket_out_->name); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_geometry.cc b/source/blender/nodes/shader/nodes/node_shader_geometry.cc index 13b84842275..c296a969a8f 100644 --- a/source/blender/nodes/shader/nodes/node_shader_geometry.cc +++ b/source/blender/nodes/shader/nodes/node_shader_geometry.cc @@ -78,7 +78,7 @@ NODE_SHADER_MATERIALX_BEGIN res.set_input("space", val(std::string("world"))); } else { - res = get_output_default(name, NodeItem::Type::Any); + res = get_output_default(name); } return res; } diff --git a/source/blender/nodes/shader/nodes/node_shader_hair_info.cc b/source/blender/nodes/shader/nodes/node_shader_hair_info.cc index fe4f9b21b08..ea960aa3bb0 100644 --- a/source/blender/nodes/shader/nodes/node_shader_hair_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_hair_info.cc @@ -33,7 +33,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { /* NOTE: This node doesn't have an implementation in MaterialX.*/ - return get_output_default(socket_out_->name, NodeItem::Type::Any); + return get_output_default(socket_out_->name); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_object_info.cc b/source/blender/nodes/shader/nodes/node_shader_object_info.cc index 44d6286085a..53bb7f47a1c 100644 --- a/source/blender/nodes/shader/nodes/node_shader_object_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_object_info.cc @@ -51,7 +51,7 @@ NODE_SHADER_MATERIALX_BEGIN * res.set_input("seed", val(0)); *}*/ else { - res = get_output_default(name, NodeItem::Type::Any); + res = get_output_default(name); } return res; } diff --git a/source/blender/nodes/shader/nodes/node_shader_particle_info.cc b/source/blender/nodes/shader/nodes/node_shader_particle_info.cc index d194fb56769..50605f37c9b 100644 --- a/source/blender/nodes/shader/nodes/node_shader_particle_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_particle_info.cc @@ -38,7 +38,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { /* NOTE: This node doesn't have an implementation in MaterialX.*/ - return get_output_default(socket_out_->name, NodeItem::Type::Any); + return get_output_default(socket_out_->name); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_point_info.cc b/source/blender/nodes/shader/nodes/node_shader_point_info.cc index 69ce2c94006..19d58db064d 100644 --- a/source/blender/nodes/shader/nodes/node_shader_point_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_point_info.cc @@ -26,7 +26,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { /* NOTE: This node doesn't have an implementation in MaterialX.*/ - return get_output_default(socket_out_->name, NodeItem::Type::Any); + return get_output_default(socket_out_->name); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_rgb.cc b/source/blender/nodes/shader/nodes/node_shader_rgb.cc index 1899c56a90a..d2cabe3276b 100644 --- a/source/blender/nodes/shader/nodes/node_shader_rgb.cc +++ b/source/blender/nodes/shader/nodes/node_shader_rgb.cc @@ -30,7 +30,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { NodeItem res = create_node("constant", NodeItem::Type::Color4); - res.set_input("value", get_output_default("Color", NodeItem::Type::Color4)); + res.set_input("value", get_output_default("Color")); return res; } #endif diff --git a/source/blender/nodes/shader/nodes/node_shader_tangent.cc b/source/blender/nodes/shader/nodes/node_shader_tangent.cc index e2090843b64..3426cb005d5 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tangent.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tangent.cc @@ -90,7 +90,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { /* TODO: This node doesn't have an implementation in MaterialX.*/ - return get_output_default(socket_out_->name, NodeItem::Type::Vector3);; + return get_output_default(socket_out_->name); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc b/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc index 7b8ce12e5b6..efd25831834 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc @@ -79,7 +79,7 @@ NODE_SHADER_MATERIALX_BEGIN std::string name = socket_out_->name; if (ELEM(name, "Generated", "UV")) { - res = texcoord_node(NodeItem::Type::Vector3); + res = texcoord_node(); } else if (name == "Normal") { res = create_node("normal", NodeItem::Type::Vector3); @@ -90,7 +90,7 @@ NODE_SHADER_MATERIALX_BEGIN res.set_input("space", val(std::string("world"))); } else { - res = get_output_default(name, NodeItem::Type::Any); + res = get_output_default(name); } return res; diff --git a/source/blender/nodes/shader/nodes/node_shader_uvmap.cc b/source/blender/nodes/shader/nodes/node_shader_uvmap.cc index 63781cf792e..95c3b9d6635 100644 --- a/source/blender/nodes/shader/nodes/node_shader_uvmap.cc +++ b/source/blender/nodes/shader/nodes/node_shader_uvmap.cc @@ -73,7 +73,7 @@ NODE_SHADER_MATERIALX_BEGIN /* NODE: "From Instances" not implemented * UV selection not implemented */ - return texcoord_node(NodeItem::Type::Vector3); + return texcoord_node(); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_value.cc b/source/blender/nodes/shader/nodes/node_shader_value.cc index 5819f935774..190c1d43e3f 100644 --- a/source/blender/nodes/shader/nodes/node_shader_value.cc +++ b/source/blender/nodes/shader/nodes/node_shader_value.cc @@ -42,7 +42,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { NodeItem res = create_node("constant", NodeItem::Type::Float); - res.set_input("value", get_output_default("Value", NodeItem::Type::Float)); + res.set_input("value", get_output_default("Value")); return res; } #endif diff --git a/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc b/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc index 0664aa1b31e..6fa58dd1f83 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc @@ -72,7 +72,7 @@ NODE_SHADER_MATERIALX_BEGIN { /* TODO: some output expected be implemented within the next iteration (see nodedef * )*/ - return get_output_default(socket_out_->name, NodeItem::Type::Any); + return get_output_default(socket_out_->name); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_wireframe.cc b/source/blender/nodes/shader/nodes/node_shader_wireframe.cc index de80829b3fe..1836f9aa4f8 100644 --- a/source/blender/nodes/shader/nodes/node_shader_wireframe.cc +++ b/source/blender/nodes/shader/nodes/node_shader_wireframe.cc @@ -44,7 +44,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { /* NOTE: This node doesn't have an implementation in MaterialX.*/ - return get_output_default(socket_out_->name, NodeItem::Type::Float); + return get_output_default(socket_out_->name); } #endif NODE_SHADER_MATERIALX_END -- 2.30.2 From b5343a4d796b976ff9b1dcbb2ebdde6d94ad5e6e Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Fri, 15 Sep 2023 13:11:22 +0300 Subject: [PATCH 22/24] Format. --- source/blender/nodes/shader/nodes/node_shader_geometry.cc | 4 ++-- source/blender/nodes/shader/nodes/node_shader_uvmap.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/nodes/shader/nodes/node_shader_geometry.cc b/source/blender/nodes/shader/nodes/node_shader_geometry.cc index c296a969a8f..2b5e6aba7ff 100644 --- a/source/blender/nodes/shader/nodes/node_shader_geometry.cc +++ b/source/blender/nodes/shader/nodes/node_shader_geometry.cc @@ -65,11 +65,11 @@ NODE_SHADER_MATERIALX_BEGIN NodeItem res = empty(); std::string name = socket_out_->name; - if (name == "Position"){ + if (name == "Position") { res = create_node("position", NodeItem::Type::Vector3); res.set_input("space", val(std::string("world"))); } - else if (name =="Normal"){ + else if (name == "Normal") { res = create_node("normal", NodeItem::Type::Vector3); res.set_input("space", val(std::string("world"))); } diff --git a/source/blender/nodes/shader/nodes/node_shader_uvmap.cc b/source/blender/nodes/shader/nodes/node_shader_uvmap.cc index 95c3b9d6635..6b19a7982d3 100644 --- a/source/blender/nodes/shader/nodes/node_shader_uvmap.cc +++ b/source/blender/nodes/shader/nodes/node_shader_uvmap.cc @@ -71,8 +71,8 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { /* NODE: "From Instances" not implemented - * UV selection not implemented - */ + * UV selection not implemented + */ return texcoord_node(); } #endif -- 2.30.2 From 34ad30637a9d781577b5abf3d4b0093efb0263a6 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Fri, 15 Sep 2023 20:33:41 +0300 Subject: [PATCH 23/24] Review comments. Format. --- .../nodes/shader/materialx/node_parser.cc | 18 +++++++++--------- .../nodes/shader/materialx/node_parser.h | 6 +++--- .../nodes/node_shader_ambient_occlusion.cc | 2 +- .../shader/nodes/node_shader_attribute.cc | 3 +-- .../nodes/shader/nodes/node_shader_camera.cc | 2 +- .../nodes/shader/nodes/node_shader_geometry.cc | 2 +- .../shader/nodes/node_shader_hair_info.cc | 2 +- .../shader/nodes/node_shader_object_info.cc | 2 +- .../shader/nodes/node_shader_particle_info.cc | 2 +- .../shader/nodes/node_shader_point_info.cc | 2 +- .../nodes/shader/nodes/node_shader_rgb.cc | 2 +- .../nodes/shader/nodes/node_shader_tangent.cc | 2 +- .../shader/nodes/node_shader_tex_coord.cc | 2 +- .../nodes/shader/nodes/node_shader_value.cc | 2 +- .../shader/nodes/node_shader_vertex_color.cc | 2 +- .../shader/nodes/node_shader_wireframe.cc | 2 +- 16 files changed, 26 insertions(+), 27 deletions(-) diff --git a/source/blender/nodes/shader/materialx/node_parser.cc b/source/blender/nodes/shader/materialx/node_parser.cc index fbb892afe88..ab8d91e63b8 100644 --- a/source/blender/nodes/shader/materialx/node_parser.cc +++ b/source/blender/nodes/shader/materialx/node_parser.cc @@ -73,12 +73,12 @@ NodeItem NodeParser::create_node(const std::string &category, NodeItem::Type typ NodeItem NodeParser::get_input_default(const std::string &name, NodeItem::Type to_type) { - return get_default(node_->input_by_identifier(name)).convert(to_type); + return get_default(node_->input_by_identifier(name), to_type); } NodeItem NodeParser::get_input_default(int index, NodeItem::Type to_type) { - return get_default(node_->input_socket(index)).convert(to_type); + return get_default(node_->input_socket(index), to_type); } NodeItem NodeParser::get_input_link(const std::string &name, NodeItem::Type to_type) @@ -101,14 +101,14 @@ NodeItem NodeParser::get_input_value(int index, NodeItem::Type to_type) return get_input_value(node_->input_socket(index), to_type); } -NodeItem NodeParser::get_output_default(const std::string &name) +NodeItem NodeParser::get_output_default(const std::string &name, NodeItem::Type to_type) { - return get_default(node_->output_by_identifier(name)); + return get_default(node_->output_by_identifier(name), to_type); } -NodeItem NodeParser::get_output_default(int index) +NodeItem NodeParser::get_output_default(int index, NodeItem::Type to_type) { - return get_default(node_->output_socket(index)); + return get_default(node_->output_socket(index), to_type); } NodeItem NodeParser::empty() const @@ -127,7 +127,7 @@ NodeItem NodeParser::texcoord_node() return res; } -NodeItem NodeParser::get_default(const bNodeSocket &socket) +NodeItem NodeParser::get_default(const bNodeSocket &socket, NodeItem::Type to_type) { NodeItem res = empty(); switch (socket.type) { @@ -152,7 +152,7 @@ NodeItem NodeParser::get_default(const bNodeSocket &socket) CLOG_WARN(LOG_MATERIALX_SHADER, "Unsupported socket type: %d", socket.type); } } - return res; + return res.convert(to_type); } NodeItem NodeParser::get_input_link(const bNodeSocket &socket, NodeItem::Type to_type) @@ -190,7 +190,7 @@ NodeItem NodeParser::get_input_value(const bNodeSocket &socket, NodeItem::Type t { NodeItem res = get_input_link(socket, to_type); if (!res) { - res = get_default(socket).convert(to_type); + res = get_default(socket, to_type); } return res; } diff --git a/source/blender/nodes/shader/materialx/node_parser.h b/source/blender/nodes/shader/materialx/node_parser.h index 8a9286edeee..464c92c0e64 100644 --- a/source/blender/nodes/shader/materialx/node_parser.h +++ b/source/blender/nodes/shader/materialx/node_parser.h @@ -42,8 +42,8 @@ class NodeParser { NodeItem create_node(const std::string &category, NodeItem::Type type); NodeItem get_input_default(const std::string &name, NodeItem::Type to_type); NodeItem get_input_default(int index, NodeItem::Type to_type); - NodeItem get_output_default(const std::string &name); - NodeItem get_output_default(int index); + NodeItem get_output_default(const std::string &name, NodeItem::Type to_type); + NodeItem get_output_default(int index, NodeItem::Type to_type); NodeItem get_input_link(const std::string &name, NodeItem::Type to_type); NodeItem get_input_link(int index, NodeItem::Type to_type); NodeItem get_input_value(const std::string &name, NodeItem::Type to_type); @@ -53,7 +53,7 @@ class NodeParser { NodeItem texcoord_node(); private: - NodeItem get_default(const bNodeSocket &socket); + NodeItem get_default(const bNodeSocket &socket, NodeItem::Type to_type); NodeItem get_input_link(const bNodeSocket &socket, NodeItem::Type to_type); NodeItem get_input_value(const bNodeSocket &socket, NodeItem::Type to_type); }; diff --git a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc index f1e7aa4d9ca..cfb12be235d 100644 --- a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc +++ b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc @@ -65,7 +65,7 @@ NODE_SHADER_MATERIALX_BEGIN * res.set_input("coneangle", val(90.0f)); * res.set_input("maxdistance", maxdistance); */ - return get_output_default(socket_out_->name); + return get_output_default(socket_out_->name, NodeItem::Type::Any); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_attribute.cc b/source/blender/nodes/shader/nodes/node_shader_attribute.cc index e4923a79d16..d0ebd5ef222 100644 --- a/source/blender/nodes/shader/nodes/node_shader_attribute.cc +++ b/source/blender/nodes/shader/nodes/node_shader_attribute.cc @@ -82,8 +82,7 @@ NODE_SHADER_MATERIALX_BEGIN { /* TODO: some outputs expected be implemented within the next iteration (see nodedef * ) */ - - return get_output_default(socket_out_->name); + return get_output_default(socket_out_->name, NodeItem::Type::Any); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_camera.cc b/source/blender/nodes/shader/nodes/node_shader_camera.cc index 51e19133290..65496d1fd54 100644 --- a/source/blender/nodes/shader/nodes/node_shader_camera.cc +++ b/source/blender/nodes/shader/nodes/node_shader_camera.cc @@ -30,7 +30,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { /* NOTE: This node doesn't have an implementation in MaterialX.*/ - return get_output_default(socket_out_->name); + return get_output_default(socket_out_->name, NodeItem::Type::Any); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_geometry.cc b/source/blender/nodes/shader/nodes/node_shader_geometry.cc index 2b5e6aba7ff..651d6f4c390 100644 --- a/source/blender/nodes/shader/nodes/node_shader_geometry.cc +++ b/source/blender/nodes/shader/nodes/node_shader_geometry.cc @@ -78,7 +78,7 @@ NODE_SHADER_MATERIALX_BEGIN res.set_input("space", val(std::string("world"))); } else { - res = get_output_default(name); + res = get_output_default(name, NodeItem::Type::Any); } return res; } diff --git a/source/blender/nodes/shader/nodes/node_shader_hair_info.cc b/source/blender/nodes/shader/nodes/node_shader_hair_info.cc index ea960aa3bb0..fe4f9b21b08 100644 --- a/source/blender/nodes/shader/nodes/node_shader_hair_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_hair_info.cc @@ -33,7 +33,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { /* NOTE: This node doesn't have an implementation in MaterialX.*/ - return get_output_default(socket_out_->name); + return get_output_default(socket_out_->name, NodeItem::Type::Any); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_object_info.cc b/source/blender/nodes/shader/nodes/node_shader_object_info.cc index 53bb7f47a1c..44d6286085a 100644 --- a/source/blender/nodes/shader/nodes/node_shader_object_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_object_info.cc @@ -51,7 +51,7 @@ NODE_SHADER_MATERIALX_BEGIN * res.set_input("seed", val(0)); *}*/ else { - res = get_output_default(name); + res = get_output_default(name, NodeItem::Type::Any); } return res; } diff --git a/source/blender/nodes/shader/nodes/node_shader_particle_info.cc b/source/blender/nodes/shader/nodes/node_shader_particle_info.cc index 50605f37c9b..d194fb56769 100644 --- a/source/blender/nodes/shader/nodes/node_shader_particle_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_particle_info.cc @@ -38,7 +38,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { /* NOTE: This node doesn't have an implementation in MaterialX.*/ - return get_output_default(socket_out_->name); + return get_output_default(socket_out_->name, NodeItem::Type::Any); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_point_info.cc b/source/blender/nodes/shader/nodes/node_shader_point_info.cc index 19d58db064d..69ce2c94006 100644 --- a/source/blender/nodes/shader/nodes/node_shader_point_info.cc +++ b/source/blender/nodes/shader/nodes/node_shader_point_info.cc @@ -26,7 +26,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { /* NOTE: This node doesn't have an implementation in MaterialX.*/ - return get_output_default(socket_out_->name); + return get_output_default(socket_out_->name, NodeItem::Type::Any); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_rgb.cc b/source/blender/nodes/shader/nodes/node_shader_rgb.cc index d2cabe3276b..1899c56a90a 100644 --- a/source/blender/nodes/shader/nodes/node_shader_rgb.cc +++ b/source/blender/nodes/shader/nodes/node_shader_rgb.cc @@ -30,7 +30,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { NodeItem res = create_node("constant", NodeItem::Type::Color4); - res.set_input("value", get_output_default("Color")); + res.set_input("value", get_output_default("Color", NodeItem::Type::Color4)); return res; } #endif diff --git a/source/blender/nodes/shader/nodes/node_shader_tangent.cc b/source/blender/nodes/shader/nodes/node_shader_tangent.cc index 3426cb005d5..fb93a8956d8 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tangent.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tangent.cc @@ -90,7 +90,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { /* TODO: This node doesn't have an implementation in MaterialX.*/ - return get_output_default(socket_out_->name); + return get_output_default(socket_out_->name, NodeItem::Type::Vector3); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc b/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc index efd25831834..177d235077f 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc @@ -90,7 +90,7 @@ NODE_SHADER_MATERIALX_BEGIN res.set_input("space", val(std::string("world"))); } else { - res = get_output_default(name); + res = get_output_default(name, NodeItem::Type::Any); } return res; diff --git a/source/blender/nodes/shader/nodes/node_shader_value.cc b/source/blender/nodes/shader/nodes/node_shader_value.cc index 190c1d43e3f..5819f935774 100644 --- a/source/blender/nodes/shader/nodes/node_shader_value.cc +++ b/source/blender/nodes/shader/nodes/node_shader_value.cc @@ -42,7 +42,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { NodeItem res = create_node("constant", NodeItem::Type::Float); - res.set_input("value", get_output_default("Value")); + res.set_input("value", get_output_default("Value", NodeItem::Type::Float)); return res; } #endif diff --git a/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc b/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc index 6fa58dd1f83..0664aa1b31e 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc @@ -72,7 +72,7 @@ NODE_SHADER_MATERIALX_BEGIN { /* TODO: some output expected be implemented within the next iteration (see nodedef * )*/ - return get_output_default(socket_out_->name); + return get_output_default(socket_out_->name, NodeItem::Type::Any); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_wireframe.cc b/source/blender/nodes/shader/nodes/node_shader_wireframe.cc index 1836f9aa4f8..de80829b3fe 100644 --- a/source/blender/nodes/shader/nodes/node_shader_wireframe.cc +++ b/source/blender/nodes/shader/nodes/node_shader_wireframe.cc @@ -44,7 +44,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { /* NOTE: This node doesn't have an implementation in MaterialX.*/ - return get_output_default(socket_out_->name); + return get_output_default(socket_out_->name, NodeItem::Type::Float); } #endif NODE_SHADER_MATERIALX_END -- 2.30.2 From f0f1b574cbdfbbd2798ccf3062a68d607c42c91e Mon Sep 17 00:00:00 2001 From: Bogdan Nagirniak Date: Fri, 15 Sep 2023 20:53:42 +0300 Subject: [PATCH 24/24] Fixed possible error in converting. Code improvements --- .../nodes/shader/materialx/node_parser.cc | 24 +++++++++---------- .../nodes/shader/nodes/node_shader_rgb.cc | 3 ++- .../nodes/shader/nodes/node_shader_value.cc | 3 ++- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/source/blender/nodes/shader/materialx/node_parser.cc b/source/blender/nodes/shader/materialx/node_parser.cc index ab8d91e63b8..297d39aec01 100644 --- a/source/blender/nodes/shader/materialx/node_parser.cc +++ b/source/blender/nodes/shader/materialx/node_parser.cc @@ -33,20 +33,18 @@ NodeItem NodeParser::compute_full() /* Checking if node was already computed */ res.node = graph_->getNode(node_name()); - if (res.node) { - return res.convert(to_type_); - } + if (!res.node) { + CLOG_INFO(LOG_MATERIALX_SHADER, + 1, + "%s [%d] => %s", + node_->name, + node_->typeinfo->type, + NodeItem::type(to_type_).c_str()); - CLOG_INFO(LOG_MATERIALX_SHADER, - 1, - "%s [%d] => %s", - node_->name, - node_->typeinfo->type, - NodeItem::type(to_type_).c_str()); - - res = compute(); - if (res.node) { - res.node->setName(node_name()); + res = compute(); + if (res.node) { + res.node->setName(node_name()); + } } if (NodeItem::is_arithmetic(to_type_)) { res = res.convert(to_type_); diff --git a/source/blender/nodes/shader/nodes/node_shader_rgb.cc b/source/blender/nodes/shader/nodes/node_shader_rgb.cc index 1899c56a90a..5f84b9f8c9e 100644 --- a/source/blender/nodes/shader/nodes/node_shader_rgb.cc +++ b/source/blender/nodes/shader/nodes/node_shader_rgb.cc @@ -29,8 +29,9 @@ static int gpu_shader_rgb(GPUMaterial *mat, NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { + NodeItem color = get_output_default("Color", NodeItem::Type::Color4); NodeItem res = create_node("constant", NodeItem::Type::Color4); - res.set_input("value", get_output_default("Color", NodeItem::Type::Color4)); + res.set_input("value", color); return res; } #endif diff --git a/source/blender/nodes/shader/nodes/node_shader_value.cc b/source/blender/nodes/shader/nodes/node_shader_value.cc index 5819f935774..01663d11288 100644 --- a/source/blender/nodes/shader/nodes/node_shader_value.cc +++ b/source/blender/nodes/shader/nodes/node_shader_value.cc @@ -41,8 +41,9 @@ static void sh_node_value_build_multi_function(NodeMultiFunctionBuilder &builder NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { + NodeItem value = get_output_default("Value", NodeItem::Type::Float); NodeItem res = create_node("constant", NodeItem::Type::Float); - res.set_input("value", get_output_default("Value", NodeItem::Type::Float)); + res.set_input("value", value); return res; } #endif -- 2.30.2