forked from blender/blender
MaterialX: add convert nodes #15
@ -153,6 +153,7 @@ if(WITH_MATERIALX)
|
||||
materialx/nodes/clamp.cc
|
||||
materialx/nodes/huesatval.cc
|
||||
materialx/nodes/invert.cc
|
||||
materialx/nodes/map_range.cc
|
||||
materialx/nodes/math.cc
|
||||
materialx/nodes/mix_rgb.cc
|
||||
materialx/nodes/node_item.cc
|
||||
|
51
source/blender/nodes/shader/materialx/nodes/map_range.cc
Normal file
51
source/blender/nodes/shader/materialx/nodes/map_range.cc
Normal file
@ -0,0 +1,51 @@
|
||||
/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
#include "node_parser.h"
|
||||
|
||||
namespace blender::nodes::materialx {
|
||||
|
||||
NodeItem MapRangeNodeParser::compute()
|
||||
{
|
||||
/* Interpolation isn't supported by MaterialX. */
|
||||
const NodeMapRange *map_range = static_cast<NodeMapRange *>(node_->storage);
|
||||
|
||||
NodeItem::Type type;
|
||||
NodeItem val = empty();
|
||||
NodeItem from_min = empty();
|
||||
NodeItem from_max = empty();
|
||||
NodeItem to_min = empty();
|
||||
NodeItem to_max = empty();
|
||||
switch (map_range->data_type) {
|
||||
case CD_PROP_FLOAT:
|
||||
type = NodeItem::Type::Float;
|
||||
val = get_input_value("Value", type);
|
||||
from_min = get_input_value(1, type);
|
||||
from_max = get_input_value(2, type);
|
||||
to_min = get_input_value(3, type);
|
||||
to_max = get_input_value(4, type);
|
||||
break;
|
||||
case CD_PROP_FLOAT3:
|
||||
type = NodeItem::Type::Vector3;
|
||||
val = get_input_value("Vector", type);
|
||||
from_min = get_input_value(7, type);
|
||||
from_max = get_input_value(8, type);
|
||||
to_min = get_input_value(9, type);
|
||||
to_max = get_input_value(10, type);
|
||||
break;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
}
|
||||
|
||||
NodeItem res = create_node("range", NodeItem::type(type));
|
||||
res.set_input("in", val);
|
||||
res.set_input("inlow", from_min);
|
||||
res.set_input("inhigh", from_max);
|
||||
res.set_input("outlow", to_min);
|
||||
res.set_input("outhigh", to_max);
|
||||
res.set_input("doclamp", value(bool(map_range->clamp)));
|
||||
return res;
|
||||
}
|
||||
|
||||
} // namespace blender::nodes::materialx
|
@ -513,6 +513,9 @@ void NodeItem::set_input(const std::string &name,
|
||||
case Type::String:
|
||||
set_input(name, item.value->asA<std::string>(), mx_type);
|
||||
break;
|
||||
case Type::Bool:
|
||||
set_input(name, item.value->asA<bool>(), mx_type);
|
||||
break;
|
||||
case Type::Integer:
|
||||
set_input(name, item.value->asA<int>(), mx_type);
|
||||
break;
|
||||
@ -559,6 +562,9 @@ NodeItem::Type NodeItem::type(const std::string &type_str)
|
||||
if (type_str == "string") {
|
||||
return Type::String;
|
||||
}
|
||||
if (type_str == "boolean") {
|
||||
return Type::Bool;
|
||||
}
|
||||
if (type_str == "integer") {
|
||||
return Type::Integer;
|
||||
}
|
||||
@ -588,6 +594,8 @@ std::string NodeItem::type(Type type)
|
||||
switch (type) {
|
||||
case Type::String:
|
||||
return "string";
|
||||
case Type::Bool:
|
||||
return "boolean";
|
||||
case Type::Integer:
|
||||
return "integer";
|
||||
case Type::Float:
|
||||
@ -603,6 +611,7 @@ std::string NodeItem::type(Type type)
|
||||
case Type::Color4:
|
||||
return "color4";
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
break;
|
||||
}
|
||||
return "";
|
||||
|
@ -14,6 +14,7 @@ class NodeItem {
|
||||
Empty = 0,
|
||||
Other, /* For MaterialX types like: surfaceshader, bsdf, edf, ...*/
|
||||
String,
|
||||
Bool,
|
||||
Integer,
|
||||
Float,
|
||||
Vector2,
|
||||
@ -47,6 +48,9 @@ class NodeItem {
|
||||
bool operator==(const NodeItem &other) const;
|
||||
bool operator!=(const NodeItem &other) const;
|
||||
|
||||
static Type type(const std::string &type_str);
|
||||
static std::string type(Type type);
|
||||
|
||||
/* Math functions */
|
||||
NodeItem abs() const;
|
||||
NodeItem floor() const;
|
||||
@ -92,8 +96,6 @@ class NodeItem {
|
||||
void add_output(const std::string &in_name, Type out_type);
|
||||
|
||||
private:
|
||||
static Type type(const std::string &type_str);
|
||||
static std::string type(Type type);
|
||||
static bool is_arithmetic(Type type);
|
||||
static Type adjust_types(NodeItem &item1, NodeItem &item2);
|
||||
|
||||
|
@ -140,6 +140,7 @@ NodeItem NodeParser::get_input_link(const bNodeSocket &socket)
|
||||
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_MAP_RANGE, MapRangeNodeParser)
|
||||
CASE_NODE_TYPE(SH_NODE_MATH, MathNodeParser)
|
||||
CASE_NODE_TYPE(SH_NODE_MIX_RGB_LEGACY, MixRGBNodeParser)
|
||||
CASE_NODE_TYPE(SH_NODE_NORMAL_MAP, NormalMapNodeParser)
|
||||
|
@ -71,6 +71,7 @@ DECLARE_PARSER(CombineColorNodeParser)
|
||||
DECLARE_PARSER(CombineXYZNodeParser)
|
||||
DECLARE_PARSER(HueSatValNodeParser)
|
||||
DECLARE_PARSER(InvertNodeParser)
|
||||
DECLARE_PARSER(MapRangeNodeParser)
|
||||
DECLARE_PARSER(MathNodeParser)
|
||||
DECLARE_PARSER(MixRGBNodeParser)
|
||||
DECLARE_PARSER(NormalMapNodeParser)
|
||||
|
Loading…
Reference in New Issue
Block a user