diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index d1e953629e80..0d37eb5f5bdf 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -160,9 +160,14 @@ if(WITH_MATERIALX) materialx/nodes/bsdf_translucent.cc materialx/nodes/bsdf_transparent.cc materialx/nodes/clamp.cc + materialx/nodes/color_ramp.cc + materialx/nodes/curves.cc + materialx/nodes/gamma.cc materialx/nodes/emission.cc materialx/nodes/huesatval.cc materialx/nodes/invert.cc + materialx/nodes/light_falloff.cc + materialx/nodes/light_path.cc materialx/nodes/map_range.cc materialx/nodes/math.cc materialx/nodes/mix_rgb.cc @@ -180,6 +185,7 @@ if(WITH_MATERIALX) materialx/nodes/tex_image.cc materialx/nodes/tex_noise.cc materialx/nodes/vector_math.cc + materialx/nodes/wavelength.cc materialx/material.h materialx/nodes/node_item.h diff --git a/source/blender/nodes/shader/materialx/nodes/color_ramp.cc b/source/blender/nodes/shader/materialx/nodes/color_ramp.cc new file mode 100644 index 000000000000..b95f272c21ce --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/color_ramp.cc @@ -0,0 +1,15 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" + +namespace blender::nodes::materialx { + +NodeItem ColorRampNodeParser::compute() +{ + /* TODO: implement */ + return empty(); +} + +} // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/curves.cc b/source/blender/nodes/shader/materialx/nodes/curves.cc new file mode 100644 index 000000000000..e8ff16f6e80f --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/curves.cc @@ -0,0 +1,21 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" + +namespace blender::nodes::materialx { + +NodeItem CurvesRGBNodeParser::compute() +{ + /* TODO: implement */ + return get_input_value("Color", NodeItem::Type::Color4); +} + +NodeItem CurvesFloatNodeParser::compute() +{ + /* TODO: implement */ + return get_input_value("Value", NodeItem::Type::Float); +} + +} // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/gamma.cc b/source/blender/nodes/shader/materialx/nodes/gamma.cc new file mode 100644 index 000000000000..ef4b88e05943 --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/gamma.cc @@ -0,0 +1,17 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" + +namespace blender::nodes::materialx { + +NodeItem GammaNodeParser::compute() +{ + NodeItem color = get_input_value("Color", NodeItem::Type::Color4); + NodeItem gamma = get_input_value("Gamma", NodeItem::Type::Float); + + return color ^ gamma; +} + +} // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/light_falloff.cc b/source/blender/nodes/shader/materialx/nodes/light_falloff.cc new file mode 100644 index 000000000000..81186747540b --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/light_falloff.cc @@ -0,0 +1,21 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" + +namespace blender::nodes::materialx { + +NodeItem LightFalloffNodeParser::compute() +{ + NodeItem strength = get_input_value("Strength", NodeItem::Type::Float); + NodeItem smooth = get_input_value("Smooth", NodeItem::Type::Float); + + /* This node isn't supported by MaterialX. This formula was given from OSL shader code in Cycles + * node_light_falloff.osl. Considered ray_length=1.0f. */ + strength = strength * val(1.0f) / (smooth + val(1.0f)); + + return strength; +} + +} // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/light_path.cc b/source/blender/nodes/shader/materialx/nodes/light_path.cc new file mode 100644 index 000000000000..0c58f89d6bf6 --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/light_path.cc @@ -0,0 +1,21 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" + +namespace blender::nodes::materialx { + +NodeItem LightPathNodeParser::compute() +{ + /* This node isn't supported by MaterialX. Only default values returned. */ + if (STREQ(socket_out_->name, "Is Camera Ray")) { + return val(1.0f); + } + if (STREQ(socket_out_->name, "Ray Length")) { + return val(1.0f); + } + return val(0.0f); +} + +} // namespace blender::nodes::materialx diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.cc b/source/blender/nodes/shader/materialx/nodes/node_parser.cc index 4433852a4e76..f68ec48949d0 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.cc +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.cc @@ -152,10 +152,16 @@ NodeItem NodeParser::get_input_link(const bNodeSocket &socket, NodeItem::Type to CASE_NODE_TYPE(SH_NODE_BLACKBODY, BlackbodyNodeParser) CASE_NODE_TYPE(SH_NODE_BRIGHTCONTRAST, BrightContrastNodeParser) CASE_NODE_TYPE(SH_NODE_CLAMP, ClampNodeParser) + CASE_NODE_TYPE(SH_NODE_VALTORGB, ColorRampNodeParser) + CASE_NODE_TYPE(SH_NODE_CURVE_FLOAT, CurvesFloatNodeParser) + CASE_NODE_TYPE(SH_NODE_CURVE_RGB, CurvesRGBNodeParser) + CASE_NODE_TYPE(SH_NODE_GAMMA, GammaNodeParser) CASE_NODE_TYPE(SH_NODE_COMBINE_COLOR, CombineColorNodeParser) CASE_NODE_TYPE(SH_NODE_COMBXYZ, CombineXYZNodeParser) CASE_NODE_TYPE(SH_NODE_HUE_SAT, HueSatValNodeParser) CASE_NODE_TYPE(SH_NODE_INVERT, InvertNodeParser) + CASE_NODE_TYPE(SH_NODE_LIGHT_FALLOFF, LightFalloffNodeParser) + CASE_NODE_TYPE(SH_NODE_LIGHT_PATH, LightPathNodeParser) CASE_NODE_TYPE(SH_NODE_MAP_RANGE, MapRangeNodeParser) CASE_NODE_TYPE(SH_NODE_MATH, MathNodeParser) CASE_NODE_TYPE(SH_NODE_MIX_RGB_LEGACY, MixRGBNodeParser) @@ -168,6 +174,7 @@ NodeItem NodeParser::get_input_link(const bNodeSocket &socket, NodeItem::Type to CASE_NODE_TYPE(SH_NODE_TEX_IMAGE, TexImageNodeParser) CASE_NODE_TYPE(SH_NODE_TEX_NOISE, TexNoiseNodeParser) CASE_NODE_TYPE(SH_NODE_VECTOR_MATH, VectorMathNodeParser) + CASE_NODE_TYPE(SH_NODE_WAVELENGTH, WavelengthNodeParser) default: CLOG_WARN(LOG_MATERIALX_SHADER, diff --git a/source/blender/nodes/shader/materialx/nodes/node_parser.h b/source/blender/nodes/shader/materialx/nodes/node_parser.h index d23471db8c05..a327352629fd 100644 --- a/source/blender/nodes/shader/materialx/nodes/node_parser.h +++ b/source/blender/nodes/shader/materialx/nodes/node_parser.h @@ -94,10 +94,16 @@ template NodeItem NodeParser::val(const T &data) const DECLARE_NODE_PARSER(BlackbodyNodeParser) DECLARE_NODE_PARSER(BrightContrastNodeParser) DECLARE_NODE_PARSER(ClampNodeParser) +DECLARE_NODE_PARSER(ColorRampNodeParser) +DECLARE_NODE_PARSER(CurvesFloatNodeParser) +DECLARE_NODE_PARSER(CurvesRGBNodeParser) DECLARE_NODE_PARSER(CombineColorNodeParser) DECLARE_NODE_PARSER(CombineXYZNodeParser) +DECLARE_NODE_PARSER(GammaNodeParser) DECLARE_NODE_PARSER(HueSatValNodeParser) DECLARE_NODE_PARSER(InvertNodeParser) +DECLARE_NODE_PARSER(LightFalloffNodeParser) +DECLARE_NODE_PARSER(LightPathNodeParser) DECLARE_NODE_PARSER(MapRangeNodeParser) DECLARE_NODE_PARSER(MathNodeParser) DECLARE_NODE_PARSER(MixRGBNodeParser) @@ -110,6 +116,7 @@ DECLARE_NODE_PARSER(TexEnvironmentNodeParser) DECLARE_NODE_PARSER(TexImageNodeParser) DECLARE_NODE_PARSER(TexNoiseNodeParser) DECLARE_NODE_PARSER(VectorMathNodeParser) +DECLARE_NODE_PARSER(WavelengthNodeParser) DECLARE_SHADER_NODE_PARSER(AddShaderNodeParser) DECLARE_SHADER_NODE_PARSER(BSDFDiffuseNodeParser) diff --git a/source/blender/nodes/shader/materialx/nodes/wavelength.cc b/source/blender/nodes/shader/materialx/nodes/wavelength.cc new file mode 100644 index 000000000000..892504e17277 --- /dev/null +++ b/source/blender/nodes/shader/materialx/nodes/wavelength.cc @@ -0,0 +1,15 @@ +/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_parser.h" + +namespace blender::nodes::materialx { + +NodeItem WavelengthNodeParser::compute() +{ + /* TODO: implement */ + return empty(); +} + +} // namespace blender::nodes::materialx