Code improvements + Mix node #30

Merged
Bogdan Nagirniak merged 18 commits from BogdanNagirniak/blender:matx-code-improvements into matx-export-material 2023-09-22 18:23:13 +02:00
6 changed files with 49 additions and 72 deletions
Showing only changes of commit c713a21851 - Show all commits

View File

@ -379,11 +379,8 @@ NodeItem NodeItem::rotate(const NodeItem &angle, const NodeItem &axis)
BLI_assert(angle.type() == Type::Float); BLI_assert(angle.type() == Type::Float);
BLI_assert(axis.type() == Type::Vector3); BLI_assert(axis.type() == Type::Vector3);
return create_node("rotate3d", return create_node(
NodeItem::Type::Vector3, "rotate3d", NodeItem::Type::Vector3, {{"in", *this}, {"amount", angle}, {"axis", axis}});
{{"in", *this},
{"amount", angle},
{"axis", axis}});
} }
NodeItem NodeItem::rotate(const NodeItem &angle_xyz, bool invert) NodeItem NodeItem::rotate(const NodeItem &angle_xyz, bool invert)

View File

@ -92,8 +92,8 @@ class NodeItem {
NodeItem mix(const NodeItem &val1, const NodeItem &val2) const; NodeItem mix(const NodeItem &val1, const NodeItem &val2) const;
NodeItem clamp(const NodeItem &min_val, const NodeItem &max_val) const; NodeItem clamp(const NodeItem &min_val, const NodeItem &max_val) const;
NodeItem clamp(float min_val = 0.0f, float max_val = 1.0f) const; NodeItem clamp(float min_val = 0.0f, float max_val = 1.0f) const;
NodeItem rotate(const NodeItem &angle, const NodeItem &axis); /* angle in degrees */ NodeItem rotate(const NodeItem &angle, const NodeItem &axis); /* angle in degrees */
NodeItem rotate(const NodeItem &angle_xyz, bool invert = false); /* angle in degrees */ NodeItem rotate(const NodeItem &angle_xyz, bool invert = false); /* angle in degrees */
NodeItem sin() const; NodeItem sin() const;
NodeItem cos() const; NodeItem cos() const;
NodeItem tan() const; NodeItem tan() const;

View File

@ -78,7 +78,7 @@ template<class T> NodeItem NodeParser::val(const T &data) const
/** /**
* Defines for including MaterialX node parsing code into node_shader_<name>.cc * Defines for including MaterialX node parsing code into node_shader_<name>.cc
* *
* Example: * Example:
* \code{.c} * \code{.c}
* NODE_SHADER_MATERIALX_BEGIN * NODE_SHADER_MATERIALX_BEGIN

View File

@ -337,7 +337,7 @@ NODE_SHADER_MATERIALX_BEGIN
NodeItem roughness = in["roughness"]; NodeItem roughness = in["roughness"];
NodeItem anisotropy = in["anisotropic"]; NodeItem anisotropy = in["anisotropic"];
NodeItem rotation = in["anisotropic_rotation"] * val(float(180.0f / M_PI));; NodeItem rotation = in["anisotropic_rotation"] * val(float(180.0f / M_PI));
NodeItem base_color = in["base_color"]; NodeItem base_color = in["base_color"];
NodeItem specular = in["specular"]; NodeItem specular = in["specular"];
NodeItem coat = in["coat"]; NodeItem coat = in["coat"];
@ -348,8 +348,7 @@ NODE_SHADER_MATERIALX_BEGIN
NodeItem n_main_tangent = empty(); NodeItem n_main_tangent = empty();
if (tangent && normal) { if (tangent && normal) {
NodeItem n_tangent_rotate_normalize = NodeItem n_tangent_rotate_normalize = tangent.rotate(rotation, normal).normalize();
tangent.rotate(rotation, normal).normalize();
n_main_tangent = anisotropy.if_else( n_main_tangent = anisotropy.if_else(
NodeItem::CompareOp::Greater, val(0.0f), n_tangent_rotate_normalize, tangent); NodeItem::CompareOp::Greater, val(0.0f), n_tangent_rotate_normalize, tangent);
} }

View File

@ -77,34 +77,31 @@ static void node_shader_update_mapping(bNodeTree *ntree, bNode *node)
NODE_SHADER_MATERIALX_BEGIN NODE_SHADER_MATERIALX_BEGIN
#ifdef WITH_MATERIALX #ifdef WITH_MATERIALX
{ {
NodeItem res = empty(); NodeItem vector = get_input_value("Vector", NodeItem::Type::Vector3);
NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector3);
if (!vector) {
return empty();
}
NodeItem scale = get_input_value("Scale", NodeItem::Type::Vector3); 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) * NodeItem rotation = get_input_value("Rotation", NodeItem::Type::Vector3) *
val(float(180.0f / M_PI)); val(float(180.0f / M_PI));
switch (node_->custom1) { int type = node_->custom1;
case NODE_MAPPING_TYPE_POINT: switch (type) {
case NODE_MAPPING_TYPE_POINT: {
NodeItem location = get_input_value("Location", NodeItem::Type::Vector3);
return (vector * scale).rotate(rotation) + location; return (vector * scale).rotate(rotation) + location;
break; }
case NODE_MAPPING_TYPE_TEXTURE: case NODE_MAPPING_TYPE_TEXTURE: {
res = (vector - location).rotate(rotation, true) / scale; NodeItem location = get_input_value("Location", NodeItem::Type::Vector3);
break; return (vector - location).rotate(rotation, true) / scale;
case NODE_MAPPING_TYPE_VECTOR: }
res = (vector * scale).rotate(rotation * val(MaterialX::Vector3(1.0f, 1.0f, -1.0f))); case NODE_MAPPING_TYPE_VECTOR: {
break; return (vector * scale).rotate(rotation * val(MaterialX::Vector3(1.0f, 1.0f, -1.0f)));
case NODE_MAPPING_TYPE_NORMAL: }
res = (vector / scale).rotate(rotation).normalize(); case NODE_MAPPING_TYPE_NORMAL: {
break; return (vector / scale).rotate(rotation).normalize();
}
default: default:
BLI_assert_unreachable(); BLI_assert_unreachable();
} }
return res; return empty();
} }
#endif #endif
NODE_SHADER_MATERIALX_END NODE_SHADER_MATERIALX_END

View File

@ -215,61 +215,45 @@ static void node_shader_update_vector_rotate(bNodeTree *ntree, bNode *node)
NODE_SHADER_MATERIALX_BEGIN NODE_SHADER_MATERIALX_BEGIN
#ifdef WITH_MATERIALX #ifdef WITH_MATERIALX
{ {
NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector3); /* Axes */
const NodeItem X = val(MaterialX::Vector3(1.0f, 0.0f, 0.0f));
const NodeItem Y = val(MaterialX::Vector3(0.0f, 1.0f, 0.0f));
const NodeItem Z = val(MaterialX::Vector3(0.0f, 0.0f, -1.0f));
BogdanNagirniak marked this conversation as resolved Outdated

To perform the same result as Blender it requires invert Z.
NodeItem center = get_input_value("Center", NodeItem::Type::Vector3) * val(MaterialX::Vector3(1.0f, 1.0f, -1.0f))

To perform the same result as Blender it requires invert Z. `NodeItem center = get_input_value("Center", NodeItem::Type::Vector3) * val(MaterialX::Vector3(1.0f, 1.0f, -1.0f))`
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 res = vector - center;
int mode = node_->custom1; int mode = node_->custom1;
bool invert = node_->custom2; bool invert = node_->custom2;
NodeItem vector = get_input_value("Vector", NodeItem::Type::Vector3);
NodeItem center = get_input_value("Center", NodeItem::Type::Vector3) * (X + Y + Z);
vector = vector - center;
if (mode == NODE_VECTOR_ROTATE_TYPE_EULER_XYZ) { if (mode == NODE_VECTOR_ROTATE_TYPE_EULER_XYZ) {
angle = get_input_value("Rotation", NodeItem::Type::Vector3); NodeItem rotation = get_input_value("Rotation", NodeItem::Type::Vector3) *
angle = angle * val(MaterialX::Vector3(1.0f, 1.0f, -1.0f)); val(float(180.0f / M_PI)) * (X + Y + Z);
}
else {
angle = get_input_value("Angle", NodeItem::Type::Float);
}
angle = invert ? angle * val(-1.0f) : angle;
return vector.rotate(invert ? -rotation : rotation, invert) + center;
}
NodeItem angle = get_input_value("Angle", NodeItem::Type::Float) * val(float(180.0f / M_PI));
NodeItem axis = empty();
switch (mode) { switch (mode) {
case NODE_VECTOR_ROTATE_TYPE_EULER_XYZ: { case NODE_VECTOR_ROTATE_TYPE_AXIS:
return res.rotate(angle, invert) + center; axis = get_input_value("Axis", NodeItem::Type::Vector3) * (X + Y + Z);
}
case NODE_VECTOR_ROTATE_TYPE_AXIS: {
axis = get_input_value("Axis", NodeItem::Type::Vector3) *
val(MaterialX::Vector3(1.0f, 1.0f, -1.0f));
break; break;
} case NODE_VECTOR_ROTATE_TYPE_AXIS_X:
case NODE_VECTOR_ROTATE_TYPE_AXIS_X: { axis = X;
axis = val(MaterialX::Vector3(1.0f, 0.0f, 0.0f));
break; break;
} case NODE_VECTOR_ROTATE_TYPE_AXIS_Y:
case NODE_VECTOR_ROTATE_TYPE_AXIS_Y: { axis = Y;
axis = val(MaterialX::Vector3(0.0f, 1.0f, 0.0f));
break; break;
} case NODE_VECTOR_ROTATE_TYPE_AXIS_Z:
case NODE_VECTOR_ROTATE_TYPE_AXIS_Z: { axis = Z;
axis = val(MaterialX::Vector3(0.0f, 0.0f, -1.0f));
break; break;
} default:
default: {
BLI_assert_unreachable(); BLI_assert_unreachable();
return vector;
}
} }
return create_node("rotate3d", return vector.rotate(invert ? -angle : angle, axis) + center;
NodeItem::Type::Vector3,
{{"in", res}, {"amount", angle}, {"axis", axis}}) +
center;
} }
#endif #endif
NODE_SHADER_MATERIALX_END NODE_SHADER_MATERIALX_END