forked from blender/blender
Implement type conversion for NodeItem #9
@ -70,8 +70,8 @@ bool NodeItem::operator==(const NodeItem &other) const
|
||||
|
||||
NodeItem item1 = *this;
|
||||
NodeItem item2 = other;
|
||||
Type tp = adjust_types(item1, item2);
|
||||
if (tp == Type::Empty) {
|
||||
Type to_type = adjust_types(item1, item2);
|
||||
if (to_type == Type::Empty) {
|
||||
return false;
|
||||
}
|
||||
return item1.value->getValueString() == item2.value->getValueString();
|
||||
@ -238,11 +238,11 @@ NodeItem NodeItem::exp() const
|
||||
|
||||
NodeItem NodeItem::convert(Type to_type) const
|
||||
{
|
||||
Type tp = type();
|
||||
if (tp == to_type) {
|
||||
Type from_type = type();
|
||||
BogdanNagirniak marked this conversation as resolved
Outdated
|
||||
if (from_type == to_type) {
|
||||
return *this;
|
||||
}
|
||||
if (!is_arithmetic(tp) || !is_arithmetic(to_type)) {
|
||||
if (!is_arithmetic(from_type) || !is_arithmetic(to_type)) {
|
||||
return empty();
|
||||
}
|
||||
|
||||
@ -251,7 +251,7 @@ NodeItem NodeItem::convert(Type to_type) const
|
||||
}
|
||||
|
||||
/* Converting types which requires > 1 iteration */
|
||||
switch (tp) {
|
||||
switch (from_type) {
|
||||
case Type::Vector2:
|
||||
switch (to_type) {
|
||||
case Type::Vector4:
|
||||
@ -309,7 +309,7 @@ NodeItem NodeItem::convert(Type to_type) const
|
||||
/* Converting 1 iteration types */
|
||||
NodeItem res = empty();
|
||||
if (value) {
|
||||
switch (tp) {
|
||||
switch (from_type) {
|
||||
case Type::Float: {
|
||||
float v = value->asA<float>();
|
||||
switch (to_type) {
|
||||
@ -439,8 +439,8 @@ NodeItem NodeItem::if_else(CompareOp op,
|
||||
|
||||
auto item1 = if_val;
|
||||
auto item2 = else_val;
|
||||
Type tp = adjust_types(item1, item2);
|
||||
if (tp == Type::Empty) {
|
||||
Type to_type = adjust_types(item1, item2);
|
||||
if (to_type == Type::Empty) {
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -467,7 +467,7 @@ NodeItem NodeItem::if_else(CompareOp op,
|
||||
res = func(value->asA<float>(), other.value->asA<float>()) ? item1 : item2;
|
||||
}
|
||||
else {
|
||||
res.node = graph_->addNode(mx_category, MaterialX::EMPTY_STRING, type(tp));
|
||||
res.node = graph_->addNode(mx_category, MaterialX::EMPTY_STRING, type(to_type));
|
||||
res.set_input("value1", *this);
|
||||
res.set_input("value2", other);
|
||||
res.set_input("in1", item1);
|
||||
@ -498,9 +498,9 @@ void NodeItem::set_input(const std::string &name,
|
||||
const std::string &output_name)
|
||||
{
|
||||
if (item.value) {
|
||||
Type tp = item.type();
|
||||
std::string mx_type = type(tp);
|
||||
switch (tp) {
|
||||
Type item_type = item.type();
|
||||
std::string mx_type = type(item_type);
|
||||
switch (item_type) {
|
||||
case Type::String:
|
||||
set_input(name, item.value->asA<std::string>(), mx_type);
|
||||
break;
|
||||
@ -553,38 +553,38 @@ void NodeItem::add_output(const std::string &name, Type out_type)
|
||||
node->addOutput(name, type(out_type));
|
||||
}
|
||||
|
||||
NodeItem::Type NodeItem::type(const std::string &tp)
|
||||
NodeItem::Type NodeItem::type(const std::string &type_str)
|
||||
{
|
||||
if (tp == "string") {
|
||||
if (type_str == "string") {
|
||||
return Type::String;
|
||||
}
|
||||
if (tp == "integer") {
|
||||
if (type_str == "integer") {
|
||||
return Type::Integer;
|
||||
}
|
||||
if (tp == "float") {
|
||||
if (type_str == "float") {
|
||||
return Type::Float;
|
||||
}
|
||||
if (tp == "vector2") {
|
||||
if (type_str == "vector2") {
|
||||
return Type::Vector2;
|
||||
}
|
||||
if (tp == "vector3") {
|
||||
if (type_str == "vector3") {
|
||||
return Type::Vector3;
|
||||
}
|
||||
if (tp == "vector4") {
|
||||
if (type_str == "vector4") {
|
||||
return Type::Vector4;
|
||||
}
|
||||
if (tp == "color3") {
|
||||
if (type_str == "color3") {
|
||||
return Type::Color3;
|
||||
}
|
||||
if (tp == "color4") {
|
||||
if (type_str == "color4") {
|
||||
return Type::Color4;
|
||||
}
|
||||
return Type::Other;
|
||||
}
|
||||
|
||||
std::string NodeItem::type(Type tp)
|
||||
std::string NodeItem::type(Type type)
|
||||
{
|
||||
switch (tp) {
|
||||
switch (type) {
|
||||
case Type::String:
|
||||
return "string";
|
||||
case Type::Integer:
|
||||
@ -607,9 +607,9 @@ std::string NodeItem::type(Type tp)
|
||||
return "";
|
||||
}
|
||||
|
||||
bool NodeItem::is_arithmetic(Type tp)
|
||||
bool NodeItem::is_arithmetic(Type type)
|
||||
{
|
||||
return tp >= Type::Float;
|
||||
return type >= Type::Float;
|
||||
BogdanNagirniak marked this conversation as resolved
Outdated
Georgiy Markelov
commented
Type::Float -> Type::Integer Type::Float -> Type::Integer
Bogdan Nagirniak
commented
Integer isn't used in arithmetic operations Integer isn't used in arithmetic operations
|
||||
}
|
||||
|
||||
NodeItem::Type NodeItem::adjust_types(NodeItem &item1, NodeItem &item2)
|
||||
@ -640,13 +640,13 @@ bool NodeItem::is_arithmetic() const
|
||||
NodeItem NodeItem::arithmetic(const std::string &category, std::function<float(float)> func) const
|
||||
{
|
||||
NodeItem res = empty();
|
||||
Type tp = type();
|
||||
if (!is_arithmetic(tp)) {
|
||||
Type type = this->type();
|
||||
if (!is_arithmetic(type)) {
|
||||
return res;
|
||||
}
|
||||
|
||||
if (value) {
|
||||
switch (tp) {
|
||||
switch (type) {
|
||||
case Type::Float: {
|
||||
float v = value->asA<float>();
|
||||
res.value = MaterialX::Value::createValue<float>(func(v));
|
||||
@ -687,7 +687,7 @@ NodeItem NodeItem::arithmetic(const std::string &category, std::function<float(f
|
||||
else {
|
||||
/* TODO: Some of math functions (sin, cos, ...) doesn't work with Color types,
|
||||
* we have to convert to Vector */
|
||||
res.node = graph_->addNode(category, MaterialX::EMPTY_STRING, type(tp));
|
||||
res.node = graph_->addNode(category, MaterialX::EMPTY_STRING, this->type(type));
|
||||
res.set_input("in", *this);
|
||||
}
|
||||
return res;
|
||||
@ -700,13 +700,13 @@ NodeItem NodeItem::arithmetic(const NodeItem &other,
|
||||
NodeItem res = empty();
|
||||
NodeItem item1 = *this;
|
||||
NodeItem item2 = other;
|
||||
Type tp = adjust_types(item1, item2);
|
||||
if (tp == Type::Empty) {
|
||||
Type to_type = adjust_types(item1, item2);
|
||||
if (to_type == Type::Empty) {
|
||||
return res;
|
||||
}
|
||||
|
||||
if (value && other.value) {
|
||||
switch (tp) {
|
||||
switch (to_type) {
|
||||
case Type::Float: {
|
||||
float v1 = item1.value->asA<float>();
|
||||
float v2 = item2.value->asA<float>();
|
||||
@ -753,7 +753,7 @@ NodeItem NodeItem::arithmetic(const NodeItem &other,
|
||||
}
|
||||
}
|
||||
else {
|
||||
res.node = graph_->addNode(category, MaterialX::EMPTY_STRING, type(tp));
|
||||
res.node = graph_->addNode(category, MaterialX::EMPTY_STRING, type(to_type));
|
||||
res.set_input("in1", item1);
|
||||
res.set_input("in2", item2);
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ class NodeItem {
|
||||
public:
|
||||
enum class Type {
|
||||
Empty = 0,
|
||||
Other,
|
||||
Other, /* For MaterialX types like: surfaceshader, bsdf, edf, ...*/
|
||||
BogdanNagirniak marked this conversation as resolved
Outdated
Georgiy Markelov
commented
Add comment what is Add comment what is `Other`
|
||||
String,
|
||||
Integer,
|
||||
Float,
|
||||
@ -95,9 +95,9 @@ class NodeItem {
|
||||
void add_output(const std::string &in_name, Type out_type);
|
||||
|
||||
private:
|
||||
static Type type(const std::string &tp);
|
||||
static std::string type(Type tp);
|
||||
static bool is_arithmetic(Type tp);
|
||||
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);
|
||||
|
||||
bool is_arithmetic() const;
|
||||
|
Loading…
Reference in New Issue
Block a user
tp -> from_type