Implement type conversion for NodeItem #9

Merged
Bogdan Nagirniak merged 12 commits from BogdanNagirniak/blender:matx-nodeitem-type into matx-export-material 2023-09-05 12:03:24 +02:00
3 changed files with 22 additions and 15 deletions
Showing only changes of commit 8c8ee4d5c0 - Show all commits

View File

@ -238,15 +238,20 @@ NodeItem NodeItem::exp() const
NodeItem NodeItem::convert(Type to_type) const NodeItem NodeItem::convert(Type to_type) const
{ {
Type t = type(); Type tp = type();
BogdanNagirniak marked this conversation as resolved Outdated

tp -> from_type

tp -> from_type
if (t == to_type) { if (tp == to_type) {
return *this; return *this;
} }
if (!is_arithmetic(t) || !is_arithmetic(to_type)) { if (!is_arithmetic(tp) || !is_arithmetic(to_type)) {
return empty(); return empty();
} }
switch (t) { if (to_type == Type::Float) {
/* TODO: Convert to float, <extract> should be used */
}
/* Converting types which requires > 1 iteration */
switch (tp) {
case Type::Vector2: case Type::Vector2:
switch (to_type) { switch (to_type) {
case Type::Vector4: case Type::Vector4:
@ -301,9 +306,10 @@ NodeItem NodeItem::convert(Type to_type) const
break; break;
} }
/* Converting 1 iteration types */
NodeItem res = empty(); NodeItem res = empty();
if (value) { if (value) {
switch (t) { switch (tp) {
case Type::Float: { case Type::Float: {
float v = value->asA<float>(); float v = value->asA<float>();
switch (to_type) { switch (to_type) {
@ -492,9 +498,9 @@ void NodeItem::set_input(const std::string &name,
const std::string &output_name) const std::string &output_name)
{ {
if (item.value) { if (item.value) {
Type t = item.type(); Type tp = item.type();
std::string mx_type = type(t); std::string mx_type = type(tp);
switch (t) { switch (tp) {
case Type::String: case Type::String:
set_input(name, item.value->asA<std::string>(), mx_type); set_input(name, item.value->asA<std::string>(), mx_type);
break; break;
@ -634,13 +640,13 @@ bool NodeItem::is_arithmetic() const
NodeItem NodeItem::arithmetic(const std::string &category, std::function<float(float)> func) const NodeItem NodeItem::arithmetic(const std::string &category, std::function<float(float)> func) const
{ {
NodeItem res = empty(); NodeItem res = empty();
Type t = type(); Type tp = type();
if (!is_arithmetic(t)) { if (!is_arithmetic(tp)) {
return res; return res;
} }
if (value) { if (value) {
switch (t) { switch (tp) {
case Type::Float: { case Type::Float: {
float v = value->asA<float>(); float v = value->asA<float>();
res.value = MaterialX::Value::createValue<float>(func(v)); res.value = MaterialX::Value::createValue<float>(func(v));
@ -679,7 +685,7 @@ NodeItem NodeItem::arithmetic(const std::string &category, std::function<float(f
} }
} }
else { else {
res.node = graph_->addNode(category, MaterialX::EMPTY_STRING, type(t)); res.node = graph_->addNode(category, MaterialX::EMPTY_STRING, type(tp));
res.set_input("in", *this); res.set_input("in", *this);
} }
return res; return res;

View File

@ -19,7 +19,7 @@ NodeItem TexCheckerNodeParser::compute()
vector = vector * scale; vector = vector * scale;
NodeItem separate = create_node("separate2", "multioutput"); NodeItem separate = create_node("separate2", "multioutput");
separate.set_input("in", vector); separate.set_input("in", vector, NodeItem::Type::Vector2);
separate.add_output("outx", NodeItem::Type::Float); separate.add_output("outx", NodeItem::Type::Float);
separate.add_output("outy", NodeItem::Type::Float); separate.add_output("outy", NodeItem::Type::Float);

View File

@ -16,10 +16,11 @@ NodeItem TexNoiseNodeParser::compute()
detail = value(int(detail.value->asA<float>())); detail = value(int(detail.value->asA<float>()));
} }
NodeItem texcoord = create_node("position", "vector3"); NodeItem position = create_node("position", "vector3");
position = position * scale;
NodeItem res = create_node("fractal3d", "color3"); NodeItem res = create_node("fractal3d", "color3");
res.set_input("position", texcoord * scale); res.set_input("position", position, NodeItem::Type::Vector3);
res.set_input("octaves", detail); res.set_input("octaves", detail);
res.set_input("lacunarity", lacunarity); res.set_input("lacunarity", lacunarity);
return res; return res;