diff --git a/modules/material_maker/SCsub b/modules/material_maker/SCsub index 72295acbc..b1d2ff837 100644 --- a/modules/material_maker/SCsub +++ b/modules/material_maker/SCsub @@ -67,6 +67,7 @@ sources = [ "nodes/simple/shape.cpp", "nodes/simple/image.cpp", + "nodes/simple/curve.cpp", ] if env["tools"]: diff --git a/modules/material_maker/config.py b/modules/material_maker/config.py index 7eb8845cd..f003560ec 100644 --- a/modules/material_maker/config.py +++ b/modules/material_maker/config.py @@ -37,6 +37,7 @@ def get_doc_classes(): "MMShape", "MMImage", + "MMCurve", ] def get_doc_path(): diff --git a/modules/material_maker/nodes/simple/curve.cpp b/modules/material_maker/nodes/simple/curve.cpp index 5a50446fa..9ac3c7fb5 100644 --- a/modules/material_maker/nodes/simple/curve.cpp +++ b/modules/material_maker/nodes/simple/curve.cpp @@ -1,279 +1,170 @@ #include "curve.h" +#include "../../algos/mm_algos.h" +#include "../../editor/mm_graph_node.h" +#include "../mm_material.h" -Ref Curve::get_image() { - return image; +Ref MMCurve::get_image() { + return image; } -void Curve::set_image(const Ref &val) { -image = val; +void MMCurve::set_image(const Ref &val) { + image = val; } - -Ref Curve::get_input() { - return input; +Ref MMCurve::get_input() { + return input; } -void Curve::set_input(const Ref &val) { -input = val; +void MMCurve::set_input(const Ref &val) { + input = val; } - -Vector2 Curve::get_a() { - return a; +Vector2 MMCurve::get_a() { + return a; } -void Curve::set_a(const Vector2 &val) { -a = val; +void MMCurve::set_a(const Vector2 &val) { + a = val; + set_dirty(true); } - -Vector2 Curve::get_b() { - return b; +Vector2 MMCurve::get_b() { + return b; } -void Curve::set_b(const Vector2 &val) { -b = val; +void MMCurve::set_b(const Vector2 &val) { + b = val; + set_dirty(true); } - -Vector2 Curve::get_c() { - return c; +Vector2 MMCurve::get_c() { + return c; } -void Curve::set_c(const Vector2 &val) { -c = val; +void MMCurve::set_c(const Vector2 &val) { + c = val; + set_dirty(true); } - -float Curve::get_width() const { - return width; +float MMCurve::get_width() const { + return width; } -void Curve::set_width(const float val) { -width = val; +void MMCurve::set_width(const float val) { + width = val; + set_dirty(true); } - -int Curve::get_repeat() const { - return repeat; +int MMCurve::get_repeat() const { + return repeat; } -void Curve::set_repeat(const int val) { -repeat = val; +void MMCurve::set_repeat(const int val) { + repeat = val; + set_dirty(true); } +void MMCurve::_init_properties() { + if (!image.is_valid()) { + image.instance(); + image->set_default_type(MMNodeUniversalProperty::DEFAULT_TYPE_IMAGE); + } + image->set_output_slot_type(MMNodeUniversalProperty::SLOT_TYPE_IMAGE); - //tool; - //export(Resource) ; - Ref image; - //export(Resource) ; - Ref input; - //export(Vector2) ; - Vector2 a = Vector2(-0.35, -0.2); - //export(Vector2) ; - Vector2 b = Vector2(0, 0.5); - //export(Vector2) ; - Vector2 c = Vector2(0.35, -0.2); - //export(float) ; - float width = 0.05; - //export(int) ; - int repeat = 1; + if (!input.is_valid()) { + input.instance(); + input->set_default_type(MMNodeUniversalProperty::DEFAULT_TYPE_FLOAT); + input->set_default_value(1.0); + } - void Curve::_init_properties() { + input->set_input_slot_type(MMNodeUniversalProperty::SLOT_TYPE_UNIVERSAL); + input->set_slot_name(">>> Input "); - if (!image) { - image = MMNodeUniversalProperty.new(); - image.default_type = MMNodeUniversalProperty.DEFAULT_TYPE_IMAGE; + register_input_property(input); + register_output_property(image); } - image.output_slot_type = MMNodeUniversalProperty.SLOT_TYPE_IMAGE; - - if (!input) { - input = MMNodeUniversalProperty.new(); - input.default_type = MMNodeUniversalProperty.DEFAULT_TYPE_FLOAT; - input.set_default_value(1.0); +void MMCurve::_register_methods(MMGraphNode *mm_graph_node) { + mm_graph_node->add_slot_texture_universal(image); + mm_graph_node->add_slot_label_universal(input); + mm_graph_node->add_slot_vector2("get_a", "set_a", "A", 0.01); + mm_graph_node->add_slot_vector2("get_b", "set_b", "B", 0.01); + mm_graph_node->add_slot_vector2("get_c", "set_c", "C", 0.01); + mm_graph_node->add_slot_float("get_width", "set_width", "Width", 0.01); + mm_graph_node->add_slot_int("get_repeat", "set_repeat", "Repeat"); } - input.input_slot_type = MMNodeUniversalProperty.SLOT_TYPE_UNIVERSAL; - input.slot_name = ">>> Input "; - register_input_property(input); - register_output_property(image); +Color MMCurve::_get_value_for(const Vector2 &uv, const int pseed) { + Vector2 nuv = transform_uv(uv); + float f = 0; + + if (nuv.x != 0 && nuv.y != 0) { + f = input->get_value(nuv); + } + + return Color(f, f, f, 1); } - - void Curve::_register_methods(const Variant &mm_graph_node) { - mm_graph_node.add_slot_texture_universal(image); - mm_graph_node.add_slot_label_universal(input); - mm_graph_node.add_slot_vector2("get_a", "set_a", "A", 0.01); - mm_graph_node.add_slot_vector2("get_b", "set_b", "B", 0.01); - mm_graph_node.add_slot_vector2("get_c", "set_c", "C", 0.01); - mm_graph_node.add_slot_float("get_width", "set_width", "Width", 0.01); - mm_graph_node.add_slot_int("get_repeat", "set_repeat", "Repeat"); +void MMCurve::_render(const Ref &material) { + Ref img = render_image(material); + image->set_value(img); } +Vector2 MMCurve::transform_uv(const Vector2 &uv) { + //vec2 $(name_uv)_bezier = sdBezier($uv, vec2($ax+0.5, $ay+0.5), vec2($bx+0.5, $by+0.5), vec2($cx+0.5, $cy+0.5)); + Vector2 bezier = MMAlgos::sdBezier(uv, Vector2(a.x + 0.5, a.y + 0.5), Vector2(b.x + 0.5, b.y + 0.5), Vector2(c.x + 0.5, c.y + 0.5)); + //vec2 $(name_uv)_uv = vec2($(name_uv)_bezier.x, $(name_uv)_bezier.y / $width+0.5); + Vector2 new_uv = Vector2(bezier.x, bezier.y / width + 0.5); + //vec2 $(name_uv)_uvtest = step(vec2(0.5), abs($(name_uv)_uv-vec2(0.5))); + Vector2 uv_test = MMAlgos::stepv2(Vector2(0.5, 0.5), MMAlgos::absv2(new_uv - Vector2(0.5, 0.5))); + //$(name_uv)_uv = mix(vec2(fract($repeat*$(name_uv)_uv.x), $(name_uv)_uv.y), vec2(0.0), max($(name_uv)_uvtest.x, $(name_uv)_uvtest.y)); + Vector2 final_uv = Vector2(MMAlgos::fract(repeat * new_uv.x), new_uv.y).linear_interpolate(Vector2(), MAX(uv_test.x, uv_test.y)); - Color Curve::_get_value_for(const Vector2 &uv, const int pseed) { - Vector2 nuv = transform_uv(uv); - float f = 0; - - if (nuv.x != 0 && nuv.y != 0) { - f = input.get_value(nuv); + return final_uv; } - return Color(f, f, f, 1); +MMCurve::MMCurve() { + a = Vector2(-0.35, -0.2); + b = Vector2(0, 0.5); + c = Vector2(0.35, -0.2); + width = 0.05; + repeat = 1; } - - void Curve::_render(const Variant &material) { - Ref img = render_image(material); - image.set_value(img); +MMCurve::~MMCurve() { } +void MMCurve::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_image"), &MMCurve::get_image); + ClassDB::bind_method(D_METHOD("set_image", "value"), &MMCurve::set_image); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "image", PROPERTY_HINT_RESOURCE_TYPE, "MMNodeUniversalProperty"), "set_image", "get_image"); - Vector2 Curve::transform_uv(const Vector2 &uv) { - //vec2 $(name_uv)_bezier = sdBezier($uv, vec2($ax+0.5, $ay+0.5), vec2($bx+0.5, $by+0.5), vec2($cx+0.5, $cy+0.5)); - Vector2 bezier = MMAlgos.sdBezier(uv, Vector2(a.x + 0.5, a.y + 0.5), Vector2(b.x + 0.5, b.y + 0.5), Vector2(c.x + 0.5, c.y + 0.5)); - //vec2 $(name_uv)_uv = vec2($(name_uv)_bezier.x, $(name_uv)_bezier.y / $width+0.5); - Vector2 new_uv = Vector2(bezier.x, bezier.y / width + 0.5); - //vec2 $(name_uv)_uvtest = step(vec2(0.5), abs($(name_uv)_uv-vec2(0.5))); - Vector2 uv_test = MMAlgos.stepv2(Vector2(0.5, 0.5), MMAlgos.absv2(new_uv - Vector2(0.5, 0.5))); - //$(name_uv)_uv = mix(vec2(fract($repeat*$(name_uv)_uv.x), $(name_uv)_uv.y), vec2(0.0), max($(name_uv)_uvtest.x, $(name_uv)_uvtest.y)); - Vector2 final_uv = lerp(Vector2(MMAlgos.fract(repeat * new_uv.x), new_uv.y), Vector2(), max(uv_test.x, uv_test.y)); - return final_uv; + ClassDB::bind_method(D_METHOD("get_input"), &MMCurve::get_input); + ClassDB::bind_method(D_METHOD("set_input", "value"), &MMCurve::set_input); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "input", PROPERTY_HINT_RESOURCE_TYPE, "MMNodeUniversalProperty"), "set_input", "get_input"); + + ClassDB::bind_method(D_METHOD("get_a"), &MMCurve::get_a); + ClassDB::bind_method(D_METHOD("set_a", "value"), &MMCurve::set_a); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "a"), "set_a", "get_a"); + + ClassDB::bind_method(D_METHOD("get_b"), &MMCurve::get_b); + ClassDB::bind_method(D_METHOD("set_b", "value"), &MMCurve::set_b); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "b"), "set_b", "get_b"); + + ClassDB::bind_method(D_METHOD("get_c"), &MMCurve::get_c); + ClassDB::bind_method(D_METHOD("set_c", "value"), &MMCurve::set_c); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "c"), "set_c", "get_c"); + + ClassDB::bind_method(D_METHOD("get_width"), &MMCurve::get_width); + ClassDB::bind_method(D_METHOD("set_width", "value"), &MMCurve::set_width); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "width"), "set_width", "get_width"); + + ClassDB::bind_method(D_METHOD("get_repeat"), &MMCurve::get_repeat); + ClassDB::bind_method(D_METHOD("set_repeat", "value"), &MMCurve::set_repeat); + ADD_PROPERTY(PropertyInfo(Variant::INT, "repeat"), "set_repeat", "get_repeat"); + + ClassDB::bind_method(D_METHOD("transform_uv", "uv"), &MMCurve::transform_uv); } - - //b; - - Vector2 Curve::get_a() { - return a; -} - - - void Curve::set_a(const Vector2 &val) { - a = val; - set_dirty(true); -} - - //b; - - Vector2 Curve::get_b() { - return b; -} - - - void Curve::set_b(const Vector2 &val) { - b = val; - set_dirty(true); -} - - //c; - - Vector2 Curve::get_c() { - return c; -} - - - void Curve::set_c(const Vector2 &val) { - c = val; - set_dirty(true); -} - - //width; - - float Curve::get_width() { - return width; -} - - - void Curve::set_width(const float val) { - width = val; - set_dirty(true); -} - - //repeat; - - int Curve::get_repeat() { - return repeat; -} - - - void Curve::set_repeat(const int val) { - repeat = val; - set_dirty(true); -} - -} - - Curve::Curve() { - image; - input; - a = Vector2(-0.35, -0.2); - b = Vector2(0, 0.5); - c = Vector2(0.35, -0.2); - width = 0.05; - repeat = 1; - } - - Curve::~Curve() { - } - - - static void Curve::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_image"), &Curve::get_image); - ClassDB::bind_method(D_METHOD("set_image", "value"), &Curve::set_image); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "image", PROPERTY_HINT_RESOURCE_TYPE, "Ref"), "set_image", "get_image"); - - - ClassDB::bind_method(D_METHOD("get_input"), &Curve::get_input); - ClassDB::bind_method(D_METHOD("set_input", "value"), &Curve::set_input); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "input", PROPERTY_HINT_RESOURCE_TYPE, "Ref"), "set_input", "get_input"); - - - ClassDB::bind_method(D_METHOD("get_a"), &Curve::get_a); - ClassDB::bind_method(D_METHOD("set_a", "value"), &Curve::set_a); - ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "a"), "set_a", "get_a"); - - - ClassDB::bind_method(D_METHOD("get_b"), &Curve::get_b); - ClassDB::bind_method(D_METHOD("set_b", "value"), &Curve::set_b); - ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "b"), "set_b", "get_b"); - - - ClassDB::bind_method(D_METHOD("get_c"), &Curve::get_c); - ClassDB::bind_method(D_METHOD("set_c", "value"), &Curve::set_c); - ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "c"), "set_c", "get_c"); - - - ClassDB::bind_method(D_METHOD("get_width"), &Curve::get_width); - ClassDB::bind_method(D_METHOD("set_width", "value"), &Curve::set_width); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "width"), "set_width", "get_width"); - - - ClassDB::bind_method(D_METHOD("get_repeat"), &Curve::get_repeat); - ClassDB::bind_method(D_METHOD("set_repeat", "value"), &Curve::set_repeat); - ADD_PROPERTY(PropertyInfo(Variant::INT, "repeat"), "set_repeat", "get_repeat"); - - - ClassDB::bind_method(D_METHOD("_init_properties"), &Curve::_init_properties); - ClassDB::bind_method(D_METHOD("_register_methods", "mm_graph_node"), &Curve::_register_methods); - ClassDB::bind_method(D_METHOD("_get_value_for", "uv", "pseed"), &Curve::_get_value_for); - ClassDB::bind_method(D_METHOD("_render", "material"), &Curve::_render); - ClassDB::bind_method(D_METHOD("transform_uv", "uv"), &Curve::transform_uv); - ClassDB::bind_method(D_METHOD("get_a"), &Curve::get_a); - ClassDB::bind_method(D_METHOD("set_a", "val"), &Curve::set_a); - ClassDB::bind_method(D_METHOD("get_b"), &Curve::get_b); - ClassDB::bind_method(D_METHOD("set_b", "val"), &Curve::set_b); - ClassDB::bind_method(D_METHOD("get_c"), &Curve::get_c); - ClassDB::bind_method(D_METHOD("set_c", "val"), &Curve::set_c); - ClassDB::bind_method(D_METHOD("get_width"), &Curve::get_width); - ClassDB::bind_method(D_METHOD("set_width", "val"), &Curve::set_width); - ClassDB::bind_method(D_METHOD("get_repeat"), &Curve::get_repeat); - ClassDB::bind_method(D_METHOD("set_repeat", "val"), &Curve::set_repeat); - - } - - - diff --git a/modules/material_maker/nodes/simple/curve.h b/modules/material_maker/nodes/simple/curve.h index 6905615b8..4d8b3a7ff 100644 --- a/modules/material_maker/nodes/simple/curve.h +++ b/modules/material_maker/nodes/simple/curve.h @@ -1,76 +1,53 @@ -#ifndef CURVE_H -#define CURVE_H +#ifndef MM_CURVE_H +#define MM_CURVE_H +#include "../mm_node.h" +#include "../mm_node_universal_property.h" -class Curve : public MMNode { - GDCLASS(Curve, MMNode); +class MMCurve : public MMNode { + GDCLASS(MMCurve, MMNode); - public: +public: + Ref get_image(); + void set_image(const Ref &val); - Ref get_image(); - void set_image(const Ref &val); + Ref get_input(); + void set_input(const Ref &val); - Ref get_input(); - void set_input(const Ref &val); + Vector2 get_a(); + void set_a(const Vector2 &val); - Vector2 get_a(); - void set_a(const Vector2 &val); + Vector2 get_b(); + void set_b(const Vector2 &val); - Vector2 get_b(); - void set_b(const Vector2 &val); + Vector2 get_c(); + void set_c(const Vector2 &val); - Vector2 get_c(); - void set_c(const Vector2 &val); + float get_width() const; + void set_width(const float val); - float get_width() const; - void set_width(const float val); + int get_repeat() const; + void set_repeat(const int val); - int get_repeat() const; - void set_repeat(const int val); + void _init_properties(); + void _register_methods(MMGraphNode *mm_graph_node); + Color _get_value_for(const Vector2 &uv, const int pseed); + void _render(const Ref &material); + Vector2 transform_uv(const Vector2 &uv); - void _init_properties(); - void _register_methods(const Variant &mm_graph_node); - Color _get_value_for(const Vector2 &uv, const int pseed); - void _render(const Variant &material); - Vector2 transform_uv(const Vector2 &uv); - Vector2 get_a(); - void set_a(const Vector2 &val); - Vector2 get_b(); - void set_b(const Vector2 &val); - Vector2 get_c(); - void set_c(const Vector2 &val); - float get_width(); - void set_width(const float val); - int get_repeat(); - void set_repeat(const int val); + MMCurve(); + ~MMCurve(); - Curve(); - ~Curve(); +protected: + static void _bind_methods(); - protected: - static void _bind_methods(); - - //tool - //export(Resource) - Ref image; - //export(Resource) - Ref input; - //export(Vector2) - Vector2 a = Vector2(-0.35, -0.2); - //export(Vector2) - Vector2 b = Vector2(0, 0.5); - //export(Vector2) - Vector2 c = Vector2(0.35, -0.2); - //export(float) - float width = 0.05; - //export(int) - int repeat = 1; - //b - //b - //c - //width - //repeat + Ref image; + Ref input; + Vector2 a; + Vector2 b; + Vector2 c; + float width; + int repeat; }; - #endif diff --git a/modules/material_maker/register_types.cpp b/modules/material_maker/register_types.cpp index fc6c4e8be..5692acde5 100644 --- a/modules/material_maker/register_types.cpp +++ b/modules/material_maker/register_types.cpp @@ -57,6 +57,7 @@ SOFTWARE. #include "nodes/transform/transform.h" #include "nodes/transform/translate.h" +#include "nodes/simple/curve.h" #include "nodes/simple/image.h" #include "nodes/simple/shape.h" @@ -108,6 +109,8 @@ void register_material_maker_types() { MMAlgos::register_node_class("Simple", "MMShape"); ClassDB::register_class(); MMAlgos::register_node_class("Simple", "MMImage"); + ClassDB::register_class(); + MMAlgos::register_node_class("Simple", "MMCurve"); _mm_algos_singleton = memnew(_MMAlgos); Engine::get_singleton()->add_singleton(Engine::Singleton("MMAlgos", _MMAlgos::get_singleton()));