From fef443c5aa212f75719ef962c9943249d44bbeee Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 00:04:45 +0300 Subject: [PATCH 01/13] Node Bump. --- .../nodes/shader/nodes/node_shader_bump.cc | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_bump.cc b/source/blender/nodes/shader/nodes/node_shader_bump.cc index d8b008884ad..97932eee130 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bump.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bump.cc @@ -71,6 +71,30 @@ static int gpu_shader_bump(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_bump", in, out, dheight, GPU_constant(&invert)); } +NODE_SHADER_MATERIALX_BEGIN +{ + NodeItem strength = get_input_value("Strength", NodeItem::Type::Float); + NodeItem distance = get_input_value("Distance", NodeItem::Type::Float); + NodeItem height = get_input_link("Height", NodeItem::Type::Float); + NodeItem normal = get_input_link("Normal", NodeItem::Type::Vector3); + + if (node_->custom1) { + distance = distance * val(-1.0f); + } + + NodeItem height_normal = create_node("heighttonormal", NodeItem::Type::Vector3); + height_normal.set_input("in", height); + height_normal.set_input("scale", strength); + + NodeItem res = create_node("normalmap", NodeItem::Type::Vector3); + res.set_input("in", height_normal); + res.set_input("scale", distance); + res.set_input("normal", normal); + + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_bump_cc /* node type definition */ @@ -84,6 +108,7 @@ void register_node_type_sh_bump() ntype.declare = file_ns::node_declare; ntype.draw_buttons = file_ns::node_shader_buts_bump; ntype.gpu_fn = file_ns::gpu_shader_bump; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From ac6b5f28f4c8d46bfa06356d45feebbc9c4fda05 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 00:05:25 +0300 Subject: [PATCH 02/13] Node Mapping. --- .../nodes/shader/nodes/node_shader_mapping.cc | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_mapping.cc b/source/blender/nodes/shader/nodes/node_shader_mapping.cc index 742d32937b7..76846997bb0 100644 --- a/source/blender/nodes/shader/nodes/node_shader_mapping.cc +++ b/source/blender/nodes/shader/nodes/node_shader_mapping.cc @@ -74,6 +74,73 @@ static void node_shader_update_mapping(bNodeTree *ntree, bNode *node) ntree, sock, ELEM(node->custom1, NODE_MAPPING_TYPE_POINT, NODE_MAPPING_TYPE_TEXTURE)); } +NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX +{ + NodeItem res = create_node("rotate3d", NodeItem::Type::Vector3); + NodeItem location = get_input_value("Location", NodeItem::Type::Vector3); + NodeItem scale = get_input_value("Scale", NodeItem::Type::Vector3); + NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector3); + NodeItem angle = (get_input_value("Rotation", NodeItem::Type::Vector3) / val(float(M_PI))) * val(180.0f); + MaterialX::Vector3 axis_vector; + NodeItem in = empty(); + const int mode = node_->custom1; + + switch (mode) { + case NODE_MAPPING_TYPE_POINT: + in = vector * scale; + break; + + case NODE_MAPPING_TYPE_TEXTURE: + in = vector - location; + break; + + case NODE_MAPPING_TYPE_VECTOR: + in = vector * scale; + break; + + case NODE_MAPPING_TYPE_NORMAL: + in = vector / scale; + break; + } + + bool tex = mode == NODE_MAPPING_TYPE_TEXTURE; + float inv = tex ? -1.0 : 1.0; + for (int i = tex ? 2 : 0; tex ? i >= 0 : i <= 2; tex ? i-- : i++) { + axis_vector = MaterialX::Vector3(0.0f, 0.0f, 0.0f); + axis_vector[i] = inv; + if (i == 2) { // invert Z axis to get the same result as Cycles + inv *= -1.0f; + } + axis_vector[i] = inv; + NodeItem res_rot = create_node("rotate3d", NodeItem::Type::Vector3); + res_rot.set_input("in", in); + res_rot.set_input("amount", angle.extract(i)); + res_rot.set_input("axis", val(axis_vector)); + in = res_rot; + res = in; + } + + switch (mode) { + case NODE_MAPPING_TYPE_POINT: + res = res + location; + break; + + case NODE_MAPPING_TYPE_TEXTURE: + res = res / scale; + break; + + case NODE_MAPPING_TYPE_NORMAL: + NodeItem normalize = create_node("normalize", NodeItem::Type::Vector3); + normalize.set_input("in", res); + res = normalize; + break; + } + return res; +} +#endif +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_mapping_cc void register_node_type_sh_mapping() @@ -87,6 +154,7 @@ void register_node_type_sh_mapping() ntype.draw_buttons = file_ns::node_shader_buts_mapping; ntype.gpu_fn = file_ns::gpu_shader_mapping; ntype.updatefunc = file_ns::node_shader_update_mapping; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From dba75ad31b74a8345a13b036976042a88f28cc0a Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 00:05:58 +0300 Subject: [PATCH 03/13] Node Normal. --- .../nodes/shader/nodes/node_shader_normal.cc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_normal.cc b/source/blender/nodes/shader/nodes/node_shader_normal.cc index 6af7f4316fa..298a602515e 100644 --- a/source/blender/nodes/shader/nodes/node_shader_normal.cc +++ b/source/blender/nodes/shader/nodes/node_shader_normal.cc @@ -35,6 +35,23 @@ static int gpu_shader_normal(GPUMaterial *mat, return GPU_stack_link(mat, node, "normal_new_shading", in, out, vec); } +NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX +{ + std::string name = socket_out_->name; + NodeItem in1 = get_output_default("Normal", NodeItem::Type::Vector3); + NodeItem in2 = get_input_value("Normal", NodeItem::Type::Vector3); + if (name == "Dot") { + NodeItem res = create_node("dotproduct", NodeItem::Type::Float); + res.set_input("in1", in1); + res.set_input("in2", in2); + return res; + } + return in1; + } +#endif +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_normal_cc void register_node_type_sh_normal() @@ -46,6 +63,7 @@ void register_node_type_sh_normal() sh_node_type_base(&ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR); ntype.declare = file_ns::node_declare; ntype.gpu_fn = file_ns::gpu_shader_normal; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 67cf3b35ea9d1ae5f7c0860ef03f26ae2eae45ff Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 00:06:38 +0300 Subject: [PATCH 04/13] Node Vector Rotate. --- .../shader/nodes/node_shader_vector_rotate.cc | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc index 68a4314d701..25798dc8ff4 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc @@ -212,6 +212,78 @@ static void node_shader_update_vector_rotate(bNodeTree *ntree, bNode *node) ntree, sock_angle, !ELEM(node->custom1, NODE_VECTOR_ROTATE_TYPE_EULER_XYZ)); } +NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX +{ + /* NOTE: This node doesn't have an implementation in MaterialX.*/ + NodeItem res = create_node("rotate3d", NodeItem::Type::Vector3); + MaterialX::Vector3 axis_vector; + NodeItem angle = empty(); + + NodeItem center = get_input_value("Center", NodeItem::Type::Vector3) * + val(MaterialX::Vector3(1.0f, 1.0f, -1.0f)); + NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector3) - center; + const int mode = node_->custom1; + const int invert = node_->custom2 ? -1.0f : 1.0f; + + switch (mode) { + case NODE_VECTOR_ROTATE_TYPE_EULER_XYZ: + angle = get_input_value("Rotation", NodeItem::Type::Vector3); + if (angle == 0.0) { + return vector; + } + angle = (angle / val(float(M_PI))) * val(180.0f); + for (int i = node_->custom2 ? 2 : 0; node_->custom2 ? i >= 0 : i <= 2; node_->custom2 ? i-- : i++) { + axis_vector = MaterialX::Vector3(0.0f, 0.0f, 0.0f); + int inv = invert; + if (i == 2) { + inv *= -1.0f; + } + axis_vector[i] = inv; + NodeItem res_rot = create_node("rotate3d", NodeItem::Type::Vector3); + res_rot.set_input("in", vector); + res_rot.set_input("amount", angle.extract(i)); + res_rot.set_input("axis", val(axis_vector)); + vector = res_rot; + } + res = vector; + break; + + default: { + angle = get_input_value("Angle", NodeItem::Type::Float); + if (angle == 0.0) { + return vector; + } + angle = (angle / val(float(M_PI))) * val(180.0f); + NodeItem axis = empty(); + if (node_->custom2) { + angle = angle * val(-1.0f); + } + switch (mode) { + case NODE_VECTOR_ROTATE_TYPE_AXIS: + axis = get_input_value("Axis", NodeItem::Type::Vector3); + axis = axis * val(MaterialX::Vector3(1.0f, 1.0f, -1.0f)); + break; + case NODE_VECTOR_ROTATE_TYPE_AXIS_X: + axis = val(MaterialX::Vector3(1.0f, 0.0f, 0.0f)); + break; + case NODE_VECTOR_ROTATE_TYPE_AXIS_Y: + axis = val(MaterialX::Vector3(0.0f, 1.0f, 0.0f)); + break; + case NODE_VECTOR_ROTATE_TYPE_AXIS_Z: + axis = val(MaterialX::Vector3(0.0f, 0.0f, -1.0f)); + break; + } + res.set_input("in", vector); + res.set_input("amount", angle); + res.set_input("axis", axis); + } + } + return res + center; +} +#endif +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_vector_rotate_cc void register_node_type_sh_vector_rotate() @@ -226,6 +298,7 @@ void register_node_type_sh_vector_rotate() ntype.gpu_fn = file_ns::gpu_shader_vector_rotate; ntype.updatefunc = file_ns::node_shader_update_vector_rotate; ntype.build_multi_function = file_ns::sh_node_vector_rotate_build_multi_function; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 5926f1ce84edda4d377f6b1d9894fa7487fda331 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 00:07:07 +0300 Subject: [PATCH 05/13] Node Vector Transform. --- .../nodes/node_shader_vector_transform.cc | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc b/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc index d7385147788..5b5b557e373 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc @@ -137,6 +137,61 @@ static int gpu_shader_vect_transform(GPUMaterial *mat, return true; } +NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX +{ + /* NOTE: SHD_VECT_TRANSFORM_SPACE_CAMERA don't have an implementation in MaterialX.*/ + NodeItem res = empty(); + std::string name = socket_out_->name; + NodeShaderVectTransform *nodeprop = (NodeShaderVectTransform *)node_->storage; + std::string fromspace = "world"; + std::string tospace = "world"; + NodeItem vector = get_input_value("Vector", NodeItem::Type::Vector3); + switch (nodeprop->convert_from) { + case SHD_VECT_TRANSFORM_SPACE_WORLD: + fromspace = "world"; + break; + case SHD_VECT_TRANSFORM_SPACE_OBJECT: + fromspace = "object"; + break; + case SHD_VECT_TRANSFORM_SPACE_CAMERA: + return vector; + } + switch (nodeprop->convert_to) { + case SHD_VECT_TRANSFORM_SPACE_WORLD: + tospace = "world"; + break; + case SHD_VECT_TRANSFORM_SPACE_OBJECT: + tospace = "object"; + break; + case SHD_VECT_TRANSFORM_SPACE_CAMERA: + return vector; + } + if (fromspace == tospace) { + return vector; + } + + switch (nodeprop->type) { + case SHD_VECT_TRANSFORM_TYPE_POINT: + res = create_node("transformpoint", NodeItem::Type::Vector3); + break; + case SHD_VECT_TRANSFORM_TYPE_NORMAL: + res = create_node("transformnormal", NodeItem::Type::Vector3); + break; + case SHD_VECT_TRANSFORM_TYPE_VECTOR: + res = create_node("transformvector", NodeItem::Type::Vector3); + break; + } + res.set_input("in", vector); + res.set_input("fromspace", val(fromspace)); + res.set_input("tospace", val(tospace)); + + return res; +} +#endif +NODE_SHADER_MATERIALX_END + + } // namespace blender::nodes::node_shader_vector_transform_cc void register_node_type_sh_vect_transform() @@ -152,6 +207,7 @@ void register_node_type_sh_vect_transform() node_type_storage( &ntype, "NodeShaderVectTransform", node_free_standard_storage, node_copy_standard_storage); ntype.gpu_fn = file_ns::gpu_shader_vect_transform; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From c103e4faa310e99ee96ee05489aa7e4926ae8cbd Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 00:07:46 +0300 Subject: [PATCH 06/13] Node Vector Displacement. --- .../blender/nodes/shader/materialx/node_item.cc | 5 +++++ .../blender/nodes/shader/materialx/node_item.h | 1 + .../nodes/node_shader_vector_displacement.cc | 16 ++++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/source/blender/nodes/shader/materialx/node_item.cc b/source/blender/nodes/shader/materialx/node_item.cc index 8fa84213de7..b00f23bf067 100644 --- a/source/blender/nodes/shader/materialx/node_item.cc +++ b/source/blender/nodes/shader/materialx/node_item.cc @@ -53,6 +53,9 @@ NodeItem::Type NodeItem::type(const std::string &type_str) if (type_str == "EDF") { return Type::EDF; } + if (type_str == "displacementshader") { + return Type::Displacementshader; + } if (type_str == "surfaceshader") { return Type::SurfaceShader; } @@ -94,6 +97,8 @@ std::string NodeItem::type(Type type) return "BSDF"; case Type::EDF: return "EDF"; + case Type::Displacementshader: + return "displacementshader"; case Type::SurfaceShader: return "surfaceshader"; case Type::Material: diff --git a/source/blender/nodes/shader/materialx/node_item.h b/source/blender/nodes/shader/materialx/node_item.h index 40be1153031..9173befbd76 100644 --- a/source/blender/nodes/shader/materialx/node_item.h +++ b/source/blender/nodes/shader/materialx/node_item.h @@ -39,6 +39,7 @@ class NodeItem { * NOTE: There are only supported types */ BSDF, EDF, + Displacementshader, SurfaceShader, Material, }; diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc b/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc index 07cf11433ae..3129843af27 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc @@ -41,6 +41,21 @@ static int gpu_shader_vector_displacement(GPUMaterial *mat, } } +NODE_SHADER_MATERIALX_BEGIN +{ + /* NOTE: Space feature don't have an implementation in MaterialX.*/ + NodeItem midlevel = get_input_value("midlevel", NodeItem::Type::Float); + NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector3); + NodeItem scale = get_input_value("Scale", NodeItem::Type::Float); + + NodeItem res = create_node("displacement", NodeItem::Type::Displacementshader); + res.set_input("displacement", vector); + res.set_input("scale", scale); + + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_vector_displacement_cc /* node type definition */ @@ -55,6 +70,7 @@ void register_node_type_sh_vector_displacement() ntype.declare = file_ns::node_declare; ntype.initfunc = file_ns::node_shader_init_vector_displacement; ntype.gpu_fn = file_ns::gpu_shader_vector_displacement; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 8e91ff2468756a84e0fb21a090110d8b18efe03f Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 00:08:01 +0300 Subject: [PATCH 07/13] Node Displacement. --- .../shader/nodes/node_shader_displacement.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_displacement.cc b/source/blender/nodes/shader/nodes/node_shader_displacement.cc index cc0fed413ce..144d561fb1f 100644 --- a/source/blender/nodes/shader/nodes/node_shader_displacement.cc +++ b/source/blender/nodes/shader/nodes/node_shader_displacement.cc @@ -37,6 +37,21 @@ static int gpu_shader_displacement(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_displacement_world", in, out); } +NODE_SHADER_MATERIALX_BEGIN +{ + /* NOTE: Normal input and Space feature don't have an implementation in MaterialX.*/ + NodeItem midlevel = get_input_value("Midlevel", NodeItem::Type::Float); + NodeItem height = get_input_value("Height", NodeItem::Type::Float) - midlevel; + NodeItem scale = get_input_value("Scale", NodeItem::Type::Float); + + NodeItem res = create_node("displacement", NodeItem::Type::Displacementshader); + res.set_input("displacement", height); + res.set_input("scale", scale); + + return res; +} +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_displacement_cc /* node type definition */ @@ -50,6 +65,7 @@ void register_node_type_sh_displacement() ntype.declare = file_ns::node_declare; ntype.initfunc = file_ns::node_shader_init_displacement; ntype.gpu_fn = file_ns::gpu_shader_displacement; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From c1f4725826dfd5cb8d04983e3b6fc6cf6beecf35 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 00:14:11 +0300 Subject: [PATCH 08/13] Make format. --- .../nodes/shader/nodes/node_shader_mapping.cc | 25 ++++++++++--------- .../nodes/shader/nodes/node_shader_normal.cc | 2 +- .../shader/nodes/node_shader_vector_rotate.cc | 3 ++- .../nodes/node_shader_vector_transform.cc | 1 - 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/source/blender/nodes/shader/nodes/node_shader_mapping.cc b/source/blender/nodes/shader/nodes/node_shader_mapping.cc index 76846997bb0..b7f5beec4d9 100644 --- a/source/blender/nodes/shader/nodes/node_shader_mapping.cc +++ b/source/blender/nodes/shader/nodes/node_shader_mapping.cc @@ -81,7 +81,8 @@ NODE_SHADER_MATERIALX_BEGIN NodeItem location = get_input_value("Location", NodeItem::Type::Vector3); NodeItem scale = get_input_value("Scale", NodeItem::Type::Vector3); NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector3); - NodeItem angle = (get_input_value("Rotation", NodeItem::Type::Vector3) / val(float(M_PI))) * val(180.0f); + NodeItem angle = (get_input_value("Rotation", NodeItem::Type::Vector3) / val(float(M_PI))) * + val(180.0f); MaterialX::Vector3 axis_vector; NodeItem in = empty(); const int mode = node_->custom1; @@ -122,19 +123,19 @@ NODE_SHADER_MATERIALX_BEGIN } switch (mode) { - case NODE_MAPPING_TYPE_POINT: - res = res + location; - break; + case NODE_MAPPING_TYPE_POINT: + res = res + location; + break; - case NODE_MAPPING_TYPE_TEXTURE: - res = res / scale; - break; + case NODE_MAPPING_TYPE_TEXTURE: + res = res / scale; + break; - case NODE_MAPPING_TYPE_NORMAL: - NodeItem normalize = create_node("normalize", NodeItem::Type::Vector3); - normalize.set_input("in", res); - res = normalize; - break; + case NODE_MAPPING_TYPE_NORMAL: + NodeItem normalize = create_node("normalize", NodeItem::Type::Vector3); + normalize.set_input("in", res); + res = normalize; + break; } return res; } diff --git a/source/blender/nodes/shader/nodes/node_shader_normal.cc b/source/blender/nodes/shader/nodes/node_shader_normal.cc index 298a602515e..3b368ed2360 100644 --- a/source/blender/nodes/shader/nodes/node_shader_normal.cc +++ b/source/blender/nodes/shader/nodes/node_shader_normal.cc @@ -48,7 +48,7 @@ NODE_SHADER_MATERIALX_BEGIN return res; } return in1; - } +} #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc index 25798dc8ff4..370f3111115 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc @@ -233,7 +233,8 @@ NODE_SHADER_MATERIALX_BEGIN return vector; } angle = (angle / val(float(M_PI))) * val(180.0f); - for (int i = node_->custom2 ? 2 : 0; node_->custom2 ? i >= 0 : i <= 2; node_->custom2 ? i-- : i++) { + for (int i = node_->custom2 ? 2 : 0; node_->custom2 ? i >= 0 : i <= 2; + node_->custom2 ? i-- : i++) { axis_vector = MaterialX::Vector3(0.0f, 0.0f, 0.0f); int inv = invert; if (i == 2) { diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc b/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc index 5b5b557e373..375e86c9519 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc @@ -191,7 +191,6 @@ NODE_SHADER_MATERIALX_BEGIN #endif NODE_SHADER_MATERIALX_END - } // namespace blender::nodes::node_shader_vector_transform_cc void register_node_type_sh_vect_transform() -- 2.30.2 From 6ce685899a42d575bb2781676dc2e85fecc71d8c Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 09:42:52 +0300 Subject: [PATCH 09/13] Added def WITH_MATERIALX. --- source/blender/nodes/shader/nodes/node_shader_bump.cc | 2 ++ .../blender/nodes/shader/nodes/node_shader_displacement.cc | 2 ++ .../nodes/shader/nodes/node_shader_vector_displacement.cc | 6 ++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/source/blender/nodes/shader/nodes/node_shader_bump.cc b/source/blender/nodes/shader/nodes/node_shader_bump.cc index 97932eee130..2e12a12e457 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bump.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bump.cc @@ -72,6 +72,7 @@ static int gpu_shader_bump(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { NodeItem strength = get_input_value("Strength", NodeItem::Type::Float); NodeItem distance = get_input_value("Distance", NodeItem::Type::Float); @@ -93,6 +94,7 @@ NODE_SHADER_MATERIALX_BEGIN return res; } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_bump_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_displacement.cc b/source/blender/nodes/shader/nodes/node_shader_displacement.cc index 144d561fb1f..0cf9cf80b54 100644 --- a/source/blender/nodes/shader/nodes/node_shader_displacement.cc +++ b/source/blender/nodes/shader/nodes/node_shader_displacement.cc @@ -38,6 +38,7 @@ static int gpu_shader_displacement(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { /* NOTE: Normal input and Space feature don't have an implementation in MaterialX.*/ NodeItem midlevel = get_input_value("Midlevel", NodeItem::Type::Float); @@ -50,6 +51,7 @@ NODE_SHADER_MATERIALX_BEGIN return res; } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_displacement_cc diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc b/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc index 3129843af27..ced845d1e80 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc @@ -42,9 +42,10 @@ static int gpu_shader_vector_displacement(GPUMaterial *mat, } NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX { - /* NOTE: Space feature don't have an implementation in MaterialX.*/ - NodeItem midlevel = get_input_value("midlevel", NodeItem::Type::Float); + /* NOTE: Midlevel input and Space feature don't have an implementation in MaterialX.*/ + // NodeItem midlevel = get_input_value("midlevel", NodeItem::Type::Float); NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector3); NodeItem scale = get_input_value("Scale", NodeItem::Type::Float); @@ -54,6 +55,7 @@ NODE_SHADER_MATERIALX_BEGIN return res; } +#endif NODE_SHADER_MATERIALX_END } // namespace blender::nodes::node_shader_vector_displacement_cc -- 2.30.2 From e9a90ed4627e5d2b58cd04411fa02ab173a05994 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 18:49:08 +0300 Subject: [PATCH 10/13] Updated with node creation inputs. --- .../nodes/shader/nodes/node_shader_bump.cc | 12 ++++----- .../shader/nodes/node_shader_displacement.cc | 6 ++--- .../nodes/shader/nodes/node_shader_mapping.cc | 26 ++++++++----------- .../nodes/shader/nodes/node_shader_normal.cc | 4 +-- .../nodes/node_shader_vector_displacement.cc | 6 ++--- .../shader/nodes/node_shader_vector_rotate.cc | 11 +++++--- .../nodes/node_shader_vector_transform.cc | 9 +++++++ 7 files changed, 39 insertions(+), 35 deletions(-) diff --git a/source/blender/nodes/shader/nodes/node_shader_bump.cc b/source/blender/nodes/shader/nodes/node_shader_bump.cc index 2e12a12e457..69678cff976 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bump.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bump.cc @@ -83,14 +83,12 @@ NODE_SHADER_MATERIALX_BEGIN distance = distance * val(-1.0f); } - NodeItem height_normal = create_node("heighttonormal", NodeItem::Type::Vector3); - height_normal.set_input("in", height); - height_normal.set_input("scale", strength); + NodeItem height_normal = create_node( + "heighttonormal", NodeItem::Type::Vector3, {{"in", height}, {"scale", strength}}); - NodeItem res = create_node("normalmap", NodeItem::Type::Vector3); - res.set_input("in", height_normal); - res.set_input("scale", distance); - res.set_input("normal", normal); + NodeItem res = create_node("normalmap", + NodeItem::Type::Vector3, + {{"in", height_normal}, {"scale", distance}, {"normal", normal}}); return res; } diff --git a/source/blender/nodes/shader/nodes/node_shader_displacement.cc b/source/blender/nodes/shader/nodes/node_shader_displacement.cc index 0cf9cf80b54..6dfb4362eaf 100644 --- a/source/blender/nodes/shader/nodes/node_shader_displacement.cc +++ b/source/blender/nodes/shader/nodes/node_shader_displacement.cc @@ -45,9 +45,9 @@ NODE_SHADER_MATERIALX_BEGIN NodeItem height = get_input_value("Height", NodeItem::Type::Float) - midlevel; NodeItem scale = get_input_value("Scale", NodeItem::Type::Float); - NodeItem res = create_node("displacement", NodeItem::Type::Displacementshader); - res.set_input("displacement", height); - res.set_input("scale", scale); + NodeItem res = create_node("displacement", + NodeItem::Type::Displacementshader, + {{"displacement", height}, {"scale", scale}}); return res; } diff --git a/source/blender/nodes/shader/nodes/node_shader_mapping.cc b/source/blender/nodes/shader/nodes/node_shader_mapping.cc index b7f5beec4d9..c356f021ad6 100644 --- a/source/blender/nodes/shader/nodes/node_shader_mapping.cc +++ b/source/blender/nodes/shader/nodes/node_shader_mapping.cc @@ -77,32 +77,33 @@ static void node_shader_update_mapping(bNodeTree *ntree, bNode *node) NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { - NodeItem res = create_node("rotate3d", NodeItem::Type::Vector3); + NodeItem res = empty(); NodeItem location = get_input_value("Location", NodeItem::Type::Vector3); NodeItem scale = get_input_value("Scale", NodeItem::Type::Vector3); NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector3); NodeItem angle = (get_input_value("Rotation", NodeItem::Type::Vector3) / val(float(M_PI))) * val(180.0f); MaterialX::Vector3 axis_vector; - NodeItem in = empty(); const int mode = node_->custom1; switch (mode) { case NODE_MAPPING_TYPE_POINT: - in = vector * scale; + res = vector * scale; break; case NODE_MAPPING_TYPE_TEXTURE: - in = vector - location; + res = vector - location; break; case NODE_MAPPING_TYPE_VECTOR: - in = vector * scale; + res = vector * scale; break; case NODE_MAPPING_TYPE_NORMAL: - in = vector / scale; + res = vector / scale; break; + BLI_assert_unreachable(); + return vector; } bool tex = mode == NODE_MAPPING_TYPE_TEXTURE; @@ -114,12 +115,9 @@ NODE_SHADER_MATERIALX_BEGIN inv *= -1.0f; } axis_vector[i] = inv; - NodeItem res_rot = create_node("rotate3d", NodeItem::Type::Vector3); - res_rot.set_input("in", in); - res_rot.set_input("amount", angle.extract(i)); - res_rot.set_input("axis", val(axis_vector)); - in = res_rot; - res = in; + res = create_node("rotate3d", + NodeItem::Type::Vector3, + {{"in", res}, {"amount", angle.extract(i)}, {"axis", val(axis_vector)}}); } switch (mode) { @@ -132,9 +130,7 @@ NODE_SHADER_MATERIALX_BEGIN break; case NODE_MAPPING_TYPE_NORMAL: - NodeItem normalize = create_node("normalize", NodeItem::Type::Vector3); - normalize.set_input("in", res); - res = normalize; + res = create_node("normalize", NodeItem::Type::Vector3, {{"in", res}}); break; } return res; diff --git a/source/blender/nodes/shader/nodes/node_shader_normal.cc b/source/blender/nodes/shader/nodes/node_shader_normal.cc index 3b368ed2360..212317df3ed 100644 --- a/source/blender/nodes/shader/nodes/node_shader_normal.cc +++ b/source/blender/nodes/shader/nodes/node_shader_normal.cc @@ -42,9 +42,7 @@ NODE_SHADER_MATERIALX_BEGIN NodeItem in1 = get_output_default("Normal", NodeItem::Type::Vector3); NodeItem in2 = get_input_value("Normal", NodeItem::Type::Vector3); if (name == "Dot") { - NodeItem res = create_node("dotproduct", NodeItem::Type::Float); - res.set_input("in1", in1); - res.set_input("in2", in2); + NodeItem res = create_node("dotproduct", NodeItem::Type::Float, {{"in1", in1}, {"in2", in2}}); return res; } return in1; diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc b/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc index ced845d1e80..c5f27638459 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc @@ -49,9 +49,9 @@ NODE_SHADER_MATERIALX_BEGIN NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector3); NodeItem scale = get_input_value("Scale", NodeItem::Type::Float); - NodeItem res = create_node("displacement", NodeItem::Type::Displacementshader); - res.set_input("displacement", vector); - res.set_input("scale", scale); + NodeItem res = create_node("displacement", + NodeItem::Type::Displacementshader, + {{"displacement", vector}, {"scale", scale}}); return res; } diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc index 370f3111115..6622b1b67f8 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc @@ -241,10 +241,10 @@ NODE_SHADER_MATERIALX_BEGIN inv *= -1.0f; } axis_vector[i] = inv; - NodeItem res_rot = create_node("rotate3d", NodeItem::Type::Vector3); - res_rot.set_input("in", vector); - res_rot.set_input("amount", angle.extract(i)); - res_rot.set_input("axis", val(axis_vector)); + NodeItem res_rot = create_node( + "rotate3d", + NodeItem::Type::Vector3, + {{"in", vector}, {"amount", angle.extract(i)}, {"axis", val(axis_vector)}}); vector = res_rot; } res = vector; @@ -274,6 +274,9 @@ NODE_SHADER_MATERIALX_BEGIN case NODE_VECTOR_ROTATE_TYPE_AXIS_Z: axis = val(MaterialX::Vector3(0.0f, 0.0f, -1.0f)); break; + default: + BLI_assert_unreachable(); + return vector; } res.set_input("in", vector); res.set_input("amount", angle); diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc b/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc index 375e86c9519..7901f858b24 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc @@ -156,6 +156,9 @@ NODE_SHADER_MATERIALX_BEGIN break; case SHD_VECT_TRANSFORM_SPACE_CAMERA: return vector; + default: + BLI_assert_unreachable(); + return vector; } switch (nodeprop->convert_to) { case SHD_VECT_TRANSFORM_SPACE_WORLD: @@ -166,6 +169,9 @@ NODE_SHADER_MATERIALX_BEGIN break; case SHD_VECT_TRANSFORM_SPACE_CAMERA: return vector; + default: + BLI_assert_unreachable(); + return vector; } if (fromspace == tospace) { return vector; @@ -181,6 +187,9 @@ NODE_SHADER_MATERIALX_BEGIN case SHD_VECT_TRANSFORM_TYPE_VECTOR: res = create_node("transformvector", NodeItem::Type::Vector3); break; + default: + BLI_assert_unreachable(); + return vector; } res.set_input("in", vector); res.set_input("fromspace", val(fromspace)); -- 2.30.2 From f9f73e74599a4f88a1d29766e5589dad283666dc Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Thu, 21 Sep 2023 20:20:24 +0300 Subject: [PATCH 11/13] Refactored, code improvements. Fixed normal map type. --- .../nodes/shader/materialx/node_item.cc | 17 +++ .../nodes/shader/materialx/node_item.h | 1 + .../nodes/shader/nodes/node_shader_bump.cc | 22 ++-- .../shader/nodes/node_shader_displacement.cc | 8 +- .../nodes/shader/nodes/node_shader_mapping.cc | 58 +++------- .../nodes/shader/nodes/node_shader_normal.cc | 13 +-- .../shader/nodes/node_shader_normal_map.cc | 2 +- .../nodes/node_shader_vector_displacement.cc | 8 +- .../shader/nodes/node_shader_vector_rotate.cc | 107 ++++++++---------- .../nodes/node_shader_vector_transform.cc | 29 +++-- 10 files changed, 121 insertions(+), 144 deletions(-) diff --git a/source/blender/nodes/shader/materialx/node_item.cc b/source/blender/nodes/shader/materialx/node_item.cc index b00f23bf067..fbf8bdc6c8c 100644 --- a/source/blender/nodes/shader/materialx/node_item.cc +++ b/source/blender/nodes/shader/materialx/node_item.cc @@ -617,6 +617,23 @@ NodeItem NodeItem::empty() const return NodeItem(graph_); } +NodeItem NodeItem::rotate3d(NodeItem rotation, bool invert) +{ + NodeItem res = *this; + if (res.type() == Type::Vector3 && rotation.type() == Type::Vector3) { + for (int i = 0; i <= 2; i++) { + int j = invert ? 2 - i : i; + MaterialX::Vector3 axis_vector = MaterialX::Vector3(); + axis_vector[j] = 1.0f; + res = create_node( + "rotate3d", + NodeItem::Type::Vector3, + {{"in", res}, {"amount", rotation.extract(j)}, {"axis", val(axis_vector)}}); + } + } + return res; +} + NodeItem::Type NodeItem::type() const { if (value) { diff --git a/source/blender/nodes/shader/materialx/node_item.h b/source/blender/nodes/shader/materialx/node_item.h index 9173befbd76..a2b160ec4df 100644 --- a/source/blender/nodes/shader/materialx/node_item.h +++ b/source/blender/nodes/shader/materialx/node_item.h @@ -107,6 +107,7 @@ class NodeItem { /* Useful functions */ NodeItem empty() const; + NodeItem rotate3d(NodeItem rotation, bool invert = false); template NodeItem val(const T &data) const; Type type() const; diff --git a/source/blender/nodes/shader/nodes/node_shader_bump.cc b/source/blender/nodes/shader/nodes/node_shader_bump.cc index 69678cff976..655ebc9513f 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bump.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bump.cc @@ -74,23 +74,27 @@ static int gpu_shader_bump(GPUMaterial *mat, NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { - NodeItem strength = get_input_value("Strength", NodeItem::Type::Float); - NodeItem distance = get_input_value("Distance", NodeItem::Type::Float); NodeItem height = get_input_link("Height", NodeItem::Type::Float); NodeItem normal = get_input_link("Normal", NodeItem::Type::Vector3); - if (node_->custom1) { - distance = distance * val(-1.0f); + if (!height) { + if (!normal) { + return create_node( + "normal", NodeItem::Type::Vector3, {{"space", val(std::string("world"))}}); + } + return normal; } + NodeItem strength = get_input_value("Strength", NodeItem::Type::Float); + NodeItem distance = get_input_value("Distance", NodeItem::Type::Float); NodeItem height_normal = create_node( "heighttonormal", NodeItem::Type::Vector3, {{"in", height}, {"scale", strength}}); - NodeItem res = create_node("normalmap", - NodeItem::Type::Vector3, - {{"in", height_normal}, {"scale", distance}, {"normal", normal}}); - - return res; + return create_node("normalmap", + NodeItem::Type::Vector3, + {{"in", height_normal}, + {"scale", node_->custom1 ? distance * val(-1.0f) : distance}, + {"normal", normal}}); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_displacement.cc b/source/blender/nodes/shader/nodes/node_shader_displacement.cc index 6dfb4362eaf..2083e7eed77 100644 --- a/source/blender/nodes/shader/nodes/node_shader_displacement.cc +++ b/source/blender/nodes/shader/nodes/node_shader_displacement.cc @@ -45,11 +45,9 @@ NODE_SHADER_MATERIALX_BEGIN NodeItem height = get_input_value("Height", NodeItem::Type::Float) - midlevel; NodeItem scale = get_input_value("Scale", NodeItem::Type::Float); - NodeItem res = create_node("displacement", - NodeItem::Type::Displacementshader, - {{"displacement", height}, {"scale", scale}}); - - return res; + return create_node("displacement", + NodeItem::Type::Displacementshader, + {{"displacement", height}, {"scale", scale}}); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_mapping.cc b/source/blender/nodes/shader/nodes/node_shader_mapping.cc index c356f021ad6..b1fff267626 100644 --- a/source/blender/nodes/shader/nodes/node_shader_mapping.cc +++ b/source/blender/nodes/shader/nodes/node_shader_mapping.cc @@ -78,61 +78,35 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { NodeItem res = empty(); - NodeItem location = get_input_value("Location", NodeItem::Type::Vector3); - NodeItem scale = get_input_value("Scale", NodeItem::Type::Vector3); NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector3); - NodeItem angle = (get_input_value("Rotation", NodeItem::Type::Vector3) / val(float(M_PI))) * - val(180.0f); - MaterialX::Vector3 axis_vector; - const int mode = node_->custom1; - switch (mode) { + if (!vector) { + return res; + } + + NodeItem scale = get_input_value("Scale", NodeItem::Type::Vector3); + NodeItem location = get_input_value("Location", NodeItem::Type::Vector3); + NodeItem rotation = (get_input_value("Rotation", NodeItem::Type::Vector3) * + val(float(180.0f / M_PI))); + + switch (node_->custom1) { case NODE_MAPPING_TYPE_POINT: - res = vector * scale; + res = (vector * scale).rotate3d(rotation) + location; break; - case NODE_MAPPING_TYPE_TEXTURE: - res = vector - location; + res = (vector - location).rotate3d(rotation, true) / scale; break; - case NODE_MAPPING_TYPE_VECTOR: - res = vector * scale; + res = (vector * scale).rotate3d(rotation * val(MaterialX::Vector3(1.0f, 1.0f, -1.0f))); break; - case NODE_MAPPING_TYPE_NORMAL: - res = vector / scale; + res = create_node( + "normalize", NodeItem::Type::Vector3, {{"in", (vector / scale).rotate3d(rotation)}}); break; + default: BLI_assert_unreachable(); - return vector; } - bool tex = mode == NODE_MAPPING_TYPE_TEXTURE; - float inv = tex ? -1.0 : 1.0; - for (int i = tex ? 2 : 0; tex ? i >= 0 : i <= 2; tex ? i-- : i++) { - axis_vector = MaterialX::Vector3(0.0f, 0.0f, 0.0f); - axis_vector[i] = inv; - if (i == 2) { // invert Z axis to get the same result as Cycles - inv *= -1.0f; - } - axis_vector[i] = inv; - res = create_node("rotate3d", - NodeItem::Type::Vector3, - {{"in", res}, {"amount", angle.extract(i)}, {"axis", val(axis_vector)}}); - } - - switch (mode) { - case NODE_MAPPING_TYPE_POINT: - res = res + location; - break; - - case NODE_MAPPING_TYPE_TEXTURE: - res = res / scale; - break; - - case NODE_MAPPING_TYPE_NORMAL: - res = create_node("normalize", NodeItem::Type::Vector3, {{"in", res}}); - break; - } return res; } #endif diff --git a/source/blender/nodes/shader/nodes/node_shader_normal.cc b/source/blender/nodes/shader/nodes/node_shader_normal.cc index 212317df3ed..3975ed69c77 100644 --- a/source/blender/nodes/shader/nodes/node_shader_normal.cc +++ b/source/blender/nodes/shader/nodes/node_shader_normal.cc @@ -38,14 +38,13 @@ static int gpu_shader_normal(GPUMaterial *mat, NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { - std::string name = socket_out_->name; - NodeItem in1 = get_output_default("Normal", NodeItem::Type::Vector3); - NodeItem in2 = get_input_value("Normal", NodeItem::Type::Vector3); - if (name == "Dot") { - NodeItem res = create_node("dotproduct", NodeItem::Type::Float, {{"in1", in1}, {"in2", in2}}); - return res; + NodeItem res = get_output_default("Normal", NodeItem::Type::Vector3); + + if (STREQ(socket_out_->name, "Dot")) { + res = res.dotproduct(get_input_value("Normal", NodeItem::Type::Vector3)); } - return in1; + + return res; } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_normal_map.cc b/source/blender/nodes/shader/nodes/node_shader_normal_map.cc index 86ec4a19885..0bd79164ffc 100644 --- a/source/blender/nodes/shader/nodes/node_shader_normal_map.cc +++ b/source/blender/nodes/shader/nodes/node_shader_normal_map.cc @@ -126,7 +126,7 @@ NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { NodeShaderNormalMap *normal_map_node = static_cast(node_->storage); - NodeItem color = get_input_value("Color", NodeItem::Type::Color3); + NodeItem color = get_input_value("Color", NodeItem::Type::Vector3); NodeItem strength = get_input_value("Strength", NodeItem::Type::Float); std::string space; diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc b/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc index c5f27638459..8d0a87ad17d 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc @@ -49,11 +49,9 @@ NODE_SHADER_MATERIALX_BEGIN NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector3); NodeItem scale = get_input_value("Scale", NodeItem::Type::Float); - NodeItem res = create_node("displacement", - NodeItem::Type::Displacementshader, - {{"displacement", vector}, {"scale", scale}}); - - return res; + return create_node("displacement", + NodeItem::Type::Displacementshader, + {{"displacement", vector}, {"scale", scale}}); } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc index 6622b1b67f8..5d71a97def4 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc @@ -215,75 +215,62 @@ static void node_shader_update_vector_rotate(bNodeTree *ntree, bNode *node) NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { - /* NOTE: This node doesn't have an implementation in MaterialX.*/ - NodeItem res = create_node("rotate3d", NodeItem::Type::Vector3); - MaterialX::Vector3 axis_vector; - NodeItem angle = empty(); + NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector3); + if (!vector) { + return empty(); + } + + NodeItem angle = empty(); + NodeItem axis = empty(); NodeItem center = get_input_value("Center", NodeItem::Type::Vector3) * val(MaterialX::Vector3(1.0f, 1.0f, -1.0f)); - NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector3) - center; - const int mode = node_->custom1; - const int invert = node_->custom2 ? -1.0f : 1.0f; + NodeItem res = vector - center; + int mode = node_->custom1; + bool invert = node_->custom1; + + if (mode == NODE_VECTOR_ROTATE_TYPE_EULER_XYZ) { + angle = get_input_value("Rotation", NodeItem::Type::Vector3); + angle = angle * val(MaterialX::Vector3(1.0f, 1.0f, -1.0f)); + } + else { + angle = get_input_value("Angle", NodeItem::Type::Float); + } + + angle = angle * val(float(180.0f / M_PI)); + angle = invert ? angle * val(-1.0f) : angle; switch (mode) { - case NODE_VECTOR_ROTATE_TYPE_EULER_XYZ: - angle = get_input_value("Rotation", NodeItem::Type::Vector3); - if (angle == 0.0) { - return vector; - } - angle = (angle / val(float(M_PI))) * val(180.0f); - for (int i = node_->custom2 ? 2 : 0; node_->custom2 ? i >= 0 : i <= 2; - node_->custom2 ? i-- : i++) { - axis_vector = MaterialX::Vector3(0.0f, 0.0f, 0.0f); - int inv = invert; - if (i == 2) { - inv *= -1.0f; - } - axis_vector[i] = inv; - NodeItem res_rot = create_node( - "rotate3d", - NodeItem::Type::Vector3, - {{"in", vector}, {"amount", angle.extract(i)}, {"axis", val(axis_vector)}}); - vector = res_rot; - } - res = vector; + case NODE_VECTOR_ROTATE_TYPE_EULER_XYZ: { + return res.rotate3d(angle, invert) + center; + } + case NODE_VECTOR_ROTATE_TYPE_AXIS: { + axis = get_input_value("Axis", NodeItem::Type::Vector3) * + val(MaterialX::Vector3(1.0f, 1.0f, -1.0f)); break; - + } + case NODE_VECTOR_ROTATE_TYPE_AXIS_X: { + axis = val(MaterialX::Vector3(1.0f, 0.0f, 0.0f)); + break; + } + case NODE_VECTOR_ROTATE_TYPE_AXIS_Y: { + axis = val(MaterialX::Vector3(0.0f, 1.0f, 0.0f)); + break; + } + case NODE_VECTOR_ROTATE_TYPE_AXIS_Z: { + axis = val(MaterialX::Vector3(0.0f, 0.0f, -1.0f)); + break; + } default: { - angle = get_input_value("Angle", NodeItem::Type::Float); - if (angle == 0.0) { - return vector; - } - angle = (angle / val(float(M_PI))) * val(180.0f); - NodeItem axis = empty(); - if (node_->custom2) { - angle = angle * val(-1.0f); - } - switch (mode) { - case NODE_VECTOR_ROTATE_TYPE_AXIS: - axis = get_input_value("Axis", NodeItem::Type::Vector3); - axis = axis * val(MaterialX::Vector3(1.0f, 1.0f, -1.0f)); - break; - case NODE_VECTOR_ROTATE_TYPE_AXIS_X: - axis = val(MaterialX::Vector3(1.0f, 0.0f, 0.0f)); - break; - case NODE_VECTOR_ROTATE_TYPE_AXIS_Y: - axis = val(MaterialX::Vector3(0.0f, 1.0f, 0.0f)); - break; - case NODE_VECTOR_ROTATE_TYPE_AXIS_Z: - axis = val(MaterialX::Vector3(0.0f, 0.0f, -1.0f)); - break; - default: - BLI_assert_unreachable(); - return vector; - } - res.set_input("in", vector); - res.set_input("amount", angle); - res.set_input("axis", axis); + BLI_assert_unreachable(); + return vector; } } - return res + center; + + return create_node("rotate3d", + NodeItem::Type::Vector3, + {{"in", res}, {"amount", angle}, {"axis", axis}}) + + center; } #endif NODE_SHADER_MATERIALX_END diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc b/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc index 7901f858b24..a580f5ac52d 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc @@ -140,13 +140,13 @@ static int gpu_shader_vect_transform(GPUMaterial *mat, NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { - /* NOTE: SHD_VECT_TRANSFORM_SPACE_CAMERA don't have an implementation in MaterialX.*/ NodeItem res = empty(); - std::string name = socket_out_->name; NodeShaderVectTransform *nodeprop = (NodeShaderVectTransform *)node_->storage; - std::string fromspace = "world"; - std::string tospace = "world"; + std::string fromspace; + std::string tospace; + std::string category; NodeItem vector = get_input_value("Vector", NodeItem::Type::Vector3); + switch (nodeprop->convert_from) { case SHD_VECT_TRANSFORM_SPACE_WORLD: fromspace = "world"; @@ -154,12 +154,12 @@ NODE_SHADER_MATERIALX_BEGIN case SHD_VECT_TRANSFORM_SPACE_OBJECT: fromspace = "object"; break; - case SHD_VECT_TRANSFORM_SPACE_CAMERA: - return vector; default: + /* NOTE: SHD_VECT_TRANSFORM_SPACE_CAMERA don't have an implementation in MaterialX.*/ BLI_assert_unreachable(); return vector; } + switch (nodeprop->convert_to) { case SHD_VECT_TRANSFORM_SPACE_WORLD: tospace = "world"; @@ -167,35 +167,34 @@ NODE_SHADER_MATERIALX_BEGIN case SHD_VECT_TRANSFORM_SPACE_OBJECT: tospace = "object"; break; - case SHD_VECT_TRANSFORM_SPACE_CAMERA: - return vector; default: + /* NOTE: SHD_VECT_TRANSFORM_SPACE_CAMERA don't have an implementation in MaterialX.*/ BLI_assert_unreachable(); return vector; } + if (fromspace == tospace) { return vector; } switch (nodeprop->type) { case SHD_VECT_TRANSFORM_TYPE_POINT: - res = create_node("transformpoint", NodeItem::Type::Vector3); + category = "transformpoint"; break; case SHD_VECT_TRANSFORM_TYPE_NORMAL: - res = create_node("transformnormal", NodeItem::Type::Vector3); + category = "transformnormal"; break; case SHD_VECT_TRANSFORM_TYPE_VECTOR: - res = create_node("transformvector", NodeItem::Type::Vector3); + category = "transformvector"; break; default: BLI_assert_unreachable(); return vector; } - res.set_input("in", vector); - res.set_input("fromspace", val(fromspace)); - res.set_input("tospace", val(tospace)); - return res; + return create_node(category, + NodeItem::Type::Vector3, + {{"in", vector}, {"fromspace", val(fromspace)}, {"tospace", val(tospace)}}); } #endif NODE_SHADER_MATERIALX_END -- 2.30.2 From 5e5a31e22dcd52031d7d954776c93df20e5734c2 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Thu, 21 Sep 2023 20:27:34 +0300 Subject: [PATCH 12/13] Code improvements. --- source/blender/nodes/shader/materialx/node_item.cc | 2 +- source/blender/nodes/shader/nodes/node_shader_normal.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/nodes/shader/materialx/node_item.cc b/source/blender/nodes/shader/materialx/node_item.cc index fbf8bdc6c8c..bdf017f398c 100644 --- a/source/blender/nodes/shader/materialx/node_item.cc +++ b/source/blender/nodes/shader/materialx/node_item.cc @@ -625,7 +625,7 @@ NodeItem NodeItem::rotate3d(NodeItem rotation, bool invert) int j = invert ? 2 - i : i; MaterialX::Vector3 axis_vector = MaterialX::Vector3(); axis_vector[j] = 1.0f; - res = create_node( + return create_node( "rotate3d", NodeItem::Type::Vector3, {{"in", res}, {"amount", rotation.extract(j)}, {"axis", val(axis_vector)}}); diff --git a/source/blender/nodes/shader/nodes/node_shader_normal.cc b/source/blender/nodes/shader/nodes/node_shader_normal.cc index 3975ed69c77..ac1fc498c38 100644 --- a/source/blender/nodes/shader/nodes/node_shader_normal.cc +++ b/source/blender/nodes/shader/nodes/node_shader_normal.cc @@ -41,7 +41,7 @@ NODE_SHADER_MATERIALX_BEGIN NodeItem res = get_output_default("Normal", NodeItem::Type::Vector3); if (STREQ(socket_out_->name, "Dot")) { - res = res.dotproduct(get_input_value("Normal", NodeItem::Type::Vector3)); + return res.dotproduct(get_input_value("Normal", NodeItem::Type::Vector3)); } return res; -- 2.30.2 From 18718951c56217eb84d25e89309cd7af79b6e699 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Fri, 22 Sep 2023 10:59:56 +0300 Subject: [PATCH 13/13] Reverted code. --- source/blender/nodes/shader/materialx/node_item.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/nodes/shader/materialx/node_item.cc b/source/blender/nodes/shader/materialx/node_item.cc index bdf017f398c..fbf8bdc6c8c 100644 --- a/source/blender/nodes/shader/materialx/node_item.cc +++ b/source/blender/nodes/shader/materialx/node_item.cc @@ -625,7 +625,7 @@ NodeItem NodeItem::rotate3d(NodeItem rotation, bool invert) int j = invert ? 2 - i : i; MaterialX::Vector3 axis_vector = MaterialX::Vector3(); axis_vector[j] = 1.0f; - return create_node( + res = create_node( "rotate3d", NodeItem::Type::Vector3, {{"in", res}, {"amount", rotation.extract(j)}, {"axis", val(axis_vector)}}); -- 2.30.2