From d6a15520e2222b34dea625411ad92b082d2154b5 Mon Sep 17 00:00:00 2001 From: Tanasart Date: Thu, 3 Oct 2024 10:00:55 +0700 Subject: [PATCH] - repeat animators --- PixelComposer.resource_order | 1 + PixelComposer.yyp | 1 + .../__node_VFX_effector.gml | 24 +- scripts/area_function/area_function.gml | 69 ++++ scripts/globals/globals.gml | 3 +- scripts/node_2d_light/node_2d_light.gml | 25 +- scripts/node_repeat/node_repeat.gml | 329 ++++++++++++++++-- scripts/panel_inspector/panel_inspector.gml | 21 +- .../000dc648-1068-48f1-be2a-6428a509db2e.png | Bin 0 -> 610 bytes .../71a60998-4c2f-4f5f-b5af-63b69dce2512.png | Bin 0 -> 535 bytes .../9a395831-399b-45d2-bebd-6fb20d8d6b79.png | Bin 0 -> 770 bytes .../9c737327-1000-4655-9cc5-d32fb498c866.png | Bin 0 -> 610 bytes .../9c737327-1000-4655-9cc5-d32fb498c866.png | Bin 0 -> 535 bytes .../9c737327-1000-4655-9cc5-d32fb498c866.png | Bin 0 -> 770 bytes .../s_node_repeat_selection_types.yy | 98 ++++++ 15 files changed, 521 insertions(+), 50 deletions(-) create mode 100644 sprites/s_node_repeat_selection_types/000dc648-1068-48f1-be2a-6428a509db2e.png create mode 100644 sprites/s_node_repeat_selection_types/71a60998-4c2f-4f5f-b5af-63b69dce2512.png create mode 100644 sprites/s_node_repeat_selection_types/9a395831-399b-45d2-bebd-6fb20d8d6b79.png create mode 100644 sprites/s_node_repeat_selection_types/layers/000dc648-1068-48f1-be2a-6428a509db2e/9c737327-1000-4655-9cc5-d32fb498c866.png create mode 100644 sprites/s_node_repeat_selection_types/layers/71a60998-4c2f-4f5f-b5af-63b69dce2512/9c737327-1000-4655-9cc5-d32fb498c866.png create mode 100644 sprites/s_node_repeat_selection_types/layers/9a395831-399b-45d2-bebd-6fb20d8d6b79/9c737327-1000-4655-9cc5-d32fb498c866.png create mode 100644 sprites/s_node_repeat_selection_types/s_node_repeat_selection_types.yy diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 65cf20c12..a9994c7ec 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -2391,6 +2391,7 @@ {"name":"s_node_regex_search","order":11,"path":"sprites/s_node_regex_search/s_node_regex_search.yy",}, {"name":"s_node_region_fill","order":29,"path":"sprites/s_node_region_fill/s_node_region_fill.yy",}, {"name":"s_node_repeat_axis","order":16,"path":"sprites/s_node_repeat_axis/s_node_repeat_axis.yy",}, + {"name":"s_node_repeat_selection_types","order":28,"path":"sprites/s_node_repeat_selection_types/s_node_repeat_selection_types.yy",}, {"name":"s_node_repeat_texture","order":55,"path":"sprites/s_node_repeat_texture/s_node_repeat_texture.yy",}, {"name":"s_node_repeat","order":23,"path":"sprites/s_node_repeat/s_node_repeat.yy",}, {"name":"s_node_replace_palette","order":44,"path":"sprites/s_node_replace_palette/s_node_replace_palette.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index 7bdeff3ee..784cb1ca8 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -3131,6 +3131,7 @@ {"id":{"name":"s_node_regex_search","path":"sprites/s_node_regex_search/s_node_regex_search.yy",},}, {"id":{"name":"s_node_region_fill","path":"sprites/s_node_region_fill/s_node_region_fill.yy",},}, {"id":{"name":"s_node_repeat_axis","path":"sprites/s_node_repeat_axis/s_node_repeat_axis.yy",},}, + {"id":{"name":"s_node_repeat_selection_types","path":"sprites/s_node_repeat_selection_types/s_node_repeat_selection_types.yy",},}, {"id":{"name":"s_node_repeat_texture","path":"sprites/s_node_repeat_texture/s_node_repeat_texture.yy",},}, {"id":{"name":"s_node_repeat","path":"sprites/s_node_repeat/s_node_repeat.yy",},}, {"id":{"name":"s_node_replace_palette","path":"sprites/s_node_replace_palette/s_node_replace_palette.yy",},}, diff --git a/scripts/__node_VFX_effector/__node_VFX_effector.gml b/scripts/__node_VFX_effector/__node_VFX_effector.gml index 914b53a33..01da7152d 100644 --- a/scripts/__node_VFX_effector/__node_VFX_effector.gml +++ b/scripts/__node_VFX_effector/__node_VFX_effector.gml @@ -59,7 +59,7 @@ function Node_VFX_effector(_x, _y, _group = noone) : Node(_x, _y, _group) constr UPDATE_PART_FORWARD - static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) { #region + static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) { inputs[1].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny); var area = getInputData(1); @@ -99,19 +99,19 @@ function Node_VFX_effector(_x, _y, _group = noone) : Node(_x, _y, _group) constr } draw_set_alpha(1); } - } #endregion + } - function reset() { #region + function reset() { resetSeed(); - } #endregion + } - static resetSeed = function() { #region + static resetSeed = function() { seed = getInputData(8); - } #endregion + } function onAffect(part, str) {} - function affect(part) { #region + function affect(part) { if(!part.active) return; var _area = getInputData(1); @@ -158,9 +158,9 @@ function Node_VFX_effector(_x, _y, _group = noone) : Node(_x, _y, _group) constr if(str == 0) return; onAffect(part, str); - } #endregion + } - static update = function(frame = CURRENT_FRAME) { #region + static update = function(frame = CURRENT_FRAME) { var val = getInputData(0); outputs[0].setValue(val); if(val == -1) return; @@ -177,12 +177,12 @@ function Node_VFX_effector(_x, _y, _group = noone) : Node(_x, _y, _group) constr if(jun.value_to[j].value_from == jun) jun.value_to[j].node.doUpdate(); } - } #endregion + } - static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region + static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { var bbox = drawGetBbox(xx, yy, _s); draw_sprite_fit(node_draw_icon, 0, bbox.xc, bbox.yc, bbox.w, bbox.h); - } #endregion + } getPreviewingNode = VFX_PREVIEW_NODE; } \ No newline at end of file diff --git a/scripts/area_function/area_function.gml b/scripts/area_function/area_function.gml index e113e8074..06b52f62b 100644 --- a/scripts/area_function/area_function.gml +++ b/scripts/area_function/area_function.gml @@ -146,4 +146,73 @@ function area_get_random_point(area, distrib = AREA_DISTRIBUTION.area, scatter = } return [xx, yy]; +} + +function area_point_in(_area, _x, _y) { + var _area_x = _area[0]; + var _area_y = _area[1]; + var _area_w = _area[2]; + var _area_h = _area[3]; + var _area_t = _area[4]; + + var _area_x0 = _area_x - _area_w; + var _area_x1 = _area_x + _area_w; + var _area_y0 = _area_y - _area_h; + var _area_y1 = _area_y + _area_h; + + var in = false; + + if(_area_t == AREA_SHAPE.rectangle) { + in = point_in_rectangle(_x, _y, _area_x0, _area_y0, _area_x1, _area_y1); + } else if(_area_t == AREA_SHAPE.elipse) { + var _dirr = point_direction(_area_x, _area_y, _x, _y); + var _epx = _area_x + lengthdir_x(_area_w, _dirr); + var _epy = _area_y + lengthdir_y(_area_h, _dirr); + + in = point_distance(_area_x, _area_y, _x, _y) < point_distance(_area_x, _area_y, _epx, _epy); + } + + return in; +} + +function area_point_in_fallout(_area, _x, _y, _fall_distance) { + if(_fall_distance == 0) return area_point_in(_area, _x, _y); + + var _area_x = _area[0]; + var _area_y = _area[1]; + var _area_w = _area[2]; + var _area_h = _area[3]; + var _area_t = _area[4]; + + var _area_x0 = _area_x - _area_w; + var _area_x1 = _area_x + _area_w; + var _area_y0 = _area_y - _area_h; + var _area_y1 = _area_y + _area_h; + + var str = 0, in, _dst; + + if(_area_t == AREA_SHAPE.rectangle) { + in = point_in_rectangle(_x, _y, _area_x0, _area_y0, _area_x1, _area_y1) + _dst = min( distance_to_line(_x, _y, _area_x0, _area_y0, _area_x1, _area_y0), + distance_to_line(_x, _y, _area_x0, _area_y1, _area_x1, _area_y1), + distance_to_line(_x, _y, _area_x0, _area_y0, _area_x0, _area_y1), + distance_to_line(_x, _y, _area_x1, _area_y0, _area_x1, _area_y1)); + + } else if(_area_t == AREA_SHAPE.elipse) { + var _dirr = point_direction(_area_x, _area_y, _x, _y); + var _epx = _area_x + lengthdir_x(_area_w, _dirr); + var _epy = _area_y + lengthdir_y(_area_h, _dirr); + + in = point_distance(_area_x, _area_y, _x, _y) < point_distance(_area_x, _area_y, _epx, _epy); + _dst = point_distance(_x, _y, _epx, _epy); + } + + if(_dst <= _fall_distance) { + var inf = in? 0.5 + _dst / _fall_distance : 0.5 - _dst / _fall_distance; + str = clamp(inf, 0., 1.); + + } else if(in) + str = 1; + + return str; } \ No newline at end of file diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index ff9ad1c6a..a890103d9 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -42,7 +42,7 @@ LATEST_VERSION = 1_18_00; VERSION = 1_18_00_0; SAVE_VERSION = 1_18_00_0; - VERSION_STRING = MAC? "1.18.003m" : "1.18.1.001"; + VERSION_STRING = MAC? "1.18.003m" : "1.18.1.002"; BUILD_NUMBER = 1_18_00_1; HOTKEYS = ds_map_create(); @@ -116,6 +116,7 @@ #macro DELTA_TIME delta_time / 1_000_000 #macro INLINE gml_pragma("forceinline"); + #macro IS is_instanceof #macro CONF_TESTING false globalvar TESTING, TEST_ERROR; diff --git a/scripts/node_2d_light/node_2d_light.gml b/scripts/node_2d_light/node_2d_light.gml index ab3d198c6..239713087 100644 --- a/scripts/node_2d_light/node_2d_light.gml +++ b/scripts/node_2d_light/node_2d_light.gml @@ -11,25 +11,25 @@ enum LIGHT_SHAPE_2D { function Node_2D_light(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor { name = "2D Light"; + light_inspecting = 0; + newInput(0, nodeValue_Surface("Surface in", self)); - light_inspecting = 0; + typeList = [ + new scrollItem("Point", s_node_2d_light_shape, 0), + new scrollItem("Ellipse", s_node_2d_light_shape, 1), + new scrollItem("Line", s_node_2d_light_shape, 2), + new scrollItem("Line asymmetric", s_node_2d_light_shape, 3), + new scrollItem("Saber", s_node_2d_light_shape, 4), + new scrollItem("Spot", s_node_2d_light_shape, 5), + new scrollItem("Flame", s_node_2d_light_shape, 6), + ]; + typeListStr = array_create_ext(array_length(typeList), function(i) /*=>*/ {return typeList[i].name}); static createNewInput = function() { var _index = array_length(inputs); light_inspecting = getInputAmount(); - typeList = [ - new scrollItem("Point", s_node_2d_light_shape, 0), - new scrollItem("Ellipse", s_node_2d_light_shape, 1), - new scrollItem("Line", s_node_2d_light_shape, 2), - new scrollItem("Line asymmetric", s_node_2d_light_shape, 3), - new scrollItem("Saber", s_node_2d_light_shape, 4), - new scrollItem("Spot", s_node_2d_light_shape, 5), - new scrollItem("Flame", s_node_2d_light_shape, 6), - ]; - typeListStr = array_create_ext(array_length(typeList), function(i) /*=>*/ {return typeList[i].name}); - var _val = nodeValue_Enum_Scroll("Light shape", self, 0, typeList); _val.options_histories = [ typeListStr, { @@ -96,6 +96,7 @@ function Node_2D_light(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) } newOutput(0, nodeValue_Output("Surface out", self, VALUE_TYPE.surface, noone)); + newOutput(1, nodeValue_Output("Light only", self, VALUE_TYPE.surface, noone)); lights_renderer = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus) { diff --git a/scripts/node_repeat/node_repeat.gml b/scripts/node_repeat/node_repeat.gml index e87ba7536..28c4784f2 100644 --- a/scripts/node_repeat/node_repeat.gml +++ b/scripts/node_repeat/node_repeat.gml @@ -20,6 +20,8 @@ function Node_Repeat(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co name = "Repeat"; dimension_index = 1; + animator_inspecting = 0; + newInput(0, nodeValue_Surface("Surface in", self)); newInput(1, nodeValue_Dimension(self)); @@ -32,7 +34,7 @@ function Node_Repeat(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co new scrollItem("Circular", s_node_repeat_axis, 2), ])); newInput(4, nodeValue_Vec2("Shift position", self, [ DEF_SURF_W / 2, 0 ])) - .setUnitRef(function() { return getDimension(); }); + .setUnitRef(function() /*=>*/ {return getDimension()}); newInput(5, nodeValue_Rotation_Range("Repeat rotation", self, [0, 0])); @@ -69,7 +71,7 @@ function Node_Repeat(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co newInput(18, nodeValue_Int("Column", self, 4)); newInput(19, nodeValue_Vec2("Column shift", self, [0, DEF_SURF_H / 2])) - .setUnitRef(function() { return getDimension(); }); + .setUnitRef(function() /*=>*/ {return getDimension()}); /* deprecated */ newInput(20, nodeValue_Float("Animator midpoint", self, 0.5)) .setDisplay(VALUE_DISPLAY.slider, { range: [-1, 2, 0.01] }); @@ -122,6 +124,118 @@ function Node_Repeat(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co newOutput(0, nodeValue_Output("Surface out", self, VALUE_TYPE.surface, noone)); + typeList = [ "Transform", "Blending" ] + + static createNewInput = function() { + var _index = array_length(inputs); + animator_inspecting = getInputAmount(); + + newInput(_index + 0, nodeValue_Enum_Scroll("Animated property", self, 0, typeList)); + + newInput(_index + 1, nodeValue_Enum_Scroll("Select mode", self, 0, [ new scrollItem("Index", s_node_repeat_selection_types, 0), + new scrollItem("Area", s_node_repeat_selection_types, 1), + new scrollItem("Surface", s_node_repeat_selection_types, 2),])); + + newInput(_index + 2, nodeValue_Vec2("Position", self, [ 0, 0 ])); + + newInput(_index + 3, nodeValue_Rotation("Rotation", self, 0)); + + newInput(_index + 4, nodeValue_Vec2("Scale", self, [ 0, 0 ])); + + newInput(_index + 5, nodeValue_Enum_Button("Anchor type", self, 1, [ "Global", "Local" ])); + + newInput(_index + 6, nodeValue_Vec2("Anchor Position", self, [ 0.5, 0.5 ])) + .setTooltip("Anchor point for transformation, absolute value for global type, relative for local."); + + newInput(_index + 7, nodeValue_Color("Color", self, c_white)); + + newInput(_index + 8, nodeValue_Float("Alpha", self, 0)) + .setDisplay(VALUE_DISPLAY.slider, { range : [ -1, 1, 0.01 ] }); + + newInput(_index + 9, nodeValue_Area("Selection area", self, DEF_AREA_REF)) + .setUnitRef(function() /*=>*/ {return getDimension()}, VALUE_UNIT.reference); + + newInput(_index + 10, nodeValue_Float("Selection index", self, 0)); + + newInput(_index + 11, nodeValue_Float("Selection range", self, 2)); + + newInput(_index + 12, nodeValue_Float("Selection falloff", self, 0)); + + newInput(_index + 13, nodeValue("Selection falloff curve", self, CONNECT_TYPE.input, VALUE_TYPE.curve, CURVE_DEF_10)); + + newInput(_index + 14, nodeValue_Surface("Selection surface", self, noone)); + + resetDisplay(); + return inputs[_index]; + } + + animator_renderer = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus) { + + var bs = ui(24); + var bx = _x + ui(20); + var by = _y; + if(buttonInstant(THEME.button_hide, bx, by, bs, bs, _m, _focus, _hover, "", THEME.add_16, 0, COLORS._main_value_positive) == 2) { + createNewInput(); + triggerRender(); + } + + draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text_sub); + draw_text_add(bx + bx + ui(8), by + bs / 2, "Animators"); + + var amo = getInputAmount(); + var lh = ui(28); + var _h = ui(8) + lh * amo; + var yy = _y + bs + ui(4); + + var del_animator = -1; + draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, yy, _w, _h, COLORS.node_composite_bg_blend, 1); + + for(var i = 0; i < amo; i++) { + var _x0 = _x + ui(24); + var _x1 = _x + _w - ui(16); + var _yy = ui(4) + yy + i * lh + lh / 2; + + var _ind = input_fix_len + i * data_length; + var _dtyp = current_data[_ind + 0]; + var _styp = current_data[_ind + 1]; + var cc = i == animator_inspecting? COLORS._main_icon : COLORS._main_icon; + var tc = i == animator_inspecting? COLORS._main_text_accent : COLORS._main_icon; + var hov = _hover && point_in_rectangle(_m[0], _m[1], _x0, _yy - lh / 2, _x1, _yy + lh / 2 - 1); + + if(hov && _m[0] < _x1 - ui(32)) { + tc = COLORS._main_text; + + if(mouse_press(mb_left, _focus)) { + animator_inspecting = i; + resetDisplay(); + } + } + + draw_sprite_ext(s_node_repeat_selection_types, _styp, _x0 + ui(8), _yy, 1, 1, 0, cc); + + draw_set_text(f_p2, fa_left, fa_center, tc); + draw_text_add(_x0 + ui(28), _yy, typeList[_dtyp]); + + if(amo > 1) { + var bs = ui(24); + var bx = _x1 - bs; + var by = _yy - bs / 2; + if(buttonInstant(THEME.button_hide, bx, by, bs, bs, _m, _focus, _hover, "", THEME.minus_16, 0, hov? COLORS._main_value_negative : COLORS._main_icon) == 2) + del_animator = i; + } + } + + if(del_animator > -1) + deleteAnimator(del_animator); + + return ui(32) + _h; + }); + + input_display_animator = [ + ["Selection", false], 1, 9, 10, 11, 12, 13, 14, + ["Effects", false], 0, 2, 3, 4, 5, 6, 7, 8, + ]; + input_display_list = [ ["Surfaces", true], 0, 35, 36, 37, 1, 16, 17, ["Pattern", false], 3, 9, 32, 2, 18, 7, 8, @@ -130,9 +244,37 @@ function Node_Repeat(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co ["Rotation", false], 33, 5, ["Scale", false], 6, 10, ["Render", false], 34, 14, 30, - //["Animator", true, 29], 20, 21, 25, 22, 23, 24, 27, + new Inspector_Spacer(8, true), + new Inspector_Spacer(2, false, false), + animator_renderer, ]; + setDynamicInput(15, false); + + static resetDisplay = function() { + array_resize(input_display_list, array_length(input_display_list_raw)); + + if(getInputAmount()) animator_inspecting = clamp(animator_inspecting, 0, getInputAmount() - 1); + + var _ind = input_fix_len + animator_inspecting * data_length; + + for( var i = 0, n = array_length(input_display_animator); i < n; i++ ) { + var v = input_display_animator[i]; + if(is_real(v)) v += _ind; + + array_push(input_display_list, v); + } + } + + static deleteAnimator = function(index) { + var _ind = input_fix_len + index * data_length; + + array_delete(inputs, _ind, data_length); + animator_inspecting = clamp(animator_inspecting, 0, getInputAmount() - 1); + resetDisplay(); + triggerRender(); + } + attribute_surface_depth(); attribute_interpolation(); @@ -153,6 +295,23 @@ function Node_Repeat(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co var hv = inputs[31].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny, current_data[1]); active &= !hv; _hov |= hv; + var _ani_amo = getInputAmount(); + if(_ani_amo == 0) return _hov; + + animator_inspecting = clamp(animator_inspecting, 0, getInputAmount() - 1); + var _ind = input_fix_len + animator_inspecting * data_length; + + var _prop = current_data[_ind + 0]; + var _selc = current_data[_ind + 1]; + + if(_selc == 0) { + + + } else if(_selc == 1) { + var hv = inputs[_ind + 9].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny); active &= !hv; _hov |= hv; + + } + return _hov; } @@ -209,15 +368,38 @@ function Node_Repeat(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co var _arr = _data[16]; var _sed = _data[17]; - var _col = _data[18]; - var _cls = _data[19]; - + var _col = _data[18]; + var _cls = _data[19]; var _bld_md = _data[34]; - var _surf, runx, runy, posx, posy, scax, scay, rot; - var _dim; + var _ani_amo = getInputAmount(); - var _surf = _iSrf, _sdim = [ 1, 1 ]; + if(_ani_amo > 0) { // animator visibility + animator_inspecting = clamp(animator_inspecting, 0, getInputAmount() - 1); + var _ind = input_fix_len + animator_inspecting * data_length; + + var _prop = _data[_ind + 0]; + var _selc = _data[_ind + 1]; + + inputs[_ind + 2].setVisible(_prop == 0); + inputs[_ind + 3].setVisible(_prop == 0); + inputs[_ind + 4].setVisible(_prop == 0); + inputs[_ind + 5].setVisible(_prop == 0); + inputs[_ind + 6].setVisible(_prop == 0); + inputs[_ind + 7].setVisible(_prop == 1); + inputs[_ind + 8].setVisible(_prop == 1); + + inputs[_ind + 9].setVisible(_selc == 1); + inputs[_ind + 10].setVisible(_selc == 0); + inputs[_ind + 11].setVisible(_selc == 0); + inputs[_ind + 12].setVisible(_selc != 2); + inputs[_ind + 13].setVisible(_selc != 2); + inputs[_ind + 14].setVisible(_selc == 2, _selc == 2); + } + + var _surf, runx, runy, posx, posy, scax, scay, rot; + var _dim, _sdim = [ 1, 1 ]; + var _surf = _iSrf; var minx = 999999, miny = 999999; var maxx = -999999, maxy = -999999; @@ -301,21 +483,13 @@ function Node_Repeat(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co } } - var pos = point_rotate(-sw / 2, -sh / 2, 0, 0, rot); var cc = evaluate_gradient_map(i / (_amo - 1), _grad, _grad_map, _grad_range, inputs[14]); var aa = _color_get_alpha(cc); - ////////////////////////////////////////// animator system goes here... - - minx = min(minx, posx + pos[0], posx - pos[0], posx + pos[1], posx - pos[1]); - miny = min(miny, posy + pos[0], posy - pos[0], posy + pos[1], posy - pos[1]); - maxx = max(maxx, posx + pos[0], posx - pos[0], posx + pos[1], posx - pos[1]); - maxy = max(maxy, posy + pos[0], posy - pos[0], posy + pos[1], posy - pos[1]); - atlases[atlas_i++] = { surface : _surf, - x : posx + pos[0], - y : posy + pos[1], + x : posx, + y : posy, sx : scax, sy : scay, rot : rot, @@ -328,10 +502,123 @@ function Node_Repeat(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co } array_resize(atlases, atlas_i); + var __temp_p = [ 0,0 ]; + + for( var i = 0, n = array_length(atlases); i < n; i++ ) { // animators + var _a = atlases[i]; + var _surf = _a.surface; + + var _x = _a.x; + var _y = _a.y; + + for( var j = 0; j < _ani_amo; j++ ) { + var _ii = input_fix_len + j * data_length; + + var _an_prop = _data[_ii + 0]; + var _an_selt = _data[_ii + 1]; + + var _an_posi = _data[_ii + 2]; + var _an_rota = _data[_ii + 3]; + var _an_scal = _data[_ii + 4]; + var _an_anct = _data[_ii + 5]; + var _an_ancp = _data[_ii + 6]; + var _an_colr = _data[_ii + 7]; + var _an_alph = _data[_ii + 8]; + + var _an_sare = _data[_ii + 9]; + var _an_sind = _data[_ii + 10]; + var _an_srng = _data[_ii + 11]; + var _an_sfal = _data[_ii + 12]; + var _an_sfcr = _data[_ii + 13]; + var _an_ssrf = _data[_ii + 14]; + + var _inf = 0; + var _ax = 0, _ay = 0; + + if(_an_selt == 0) { // index + if(i < _an_sind - _an_srng - _an_sfal || i > _an_sind + _an_srng + _an_sfal) + _inf = 0; + else if (_an_sfal > 0 && (i < _an_sind - _an_srng || i > _an_sind + _an_srng)) + _inf = 1 - clamp(min(abs(i - (_an_sind - _an_srng)), abs(i - (_an_sind + _an_srng))) / _an_sfal, 0, 1); + else + _inf = 1; + + } else if(_an_selt == 1) { // area + _inf = 1 - area_point_in_fallout(_an_sare, _x, _y, _an_sfal); + + } else if(_an_selt == 2) { // surface + if(is_surface(_an_ssrf)) { + var b = surface_getpixel(_an_ssrf, _x, _y); + _inf = 1 - _color_get_light(b); + } + } + + _inf = eval_curve_x(_an_sfcr, _inf); + if(_inf == 0) continue; + + if(_an_prop == 0) { // transform + if(_an_anct == 0) { // global + _ax = _an_ancp[0]; + _ay = _an_ancp[1]; + + } else if(_an_anct == 1) { // local + var _surf_dim = surface_get_dimension(_surf); + _ax = _x + (_an_ancp[0] - .5) * _surf_dim[0]; + _ay = _y + (_an_ancp[1] - .5) * _surf_dim[1]; + + } + + _x += _inf * _an_posi[0]; + _y += _inf * _an_posi[1]; + + var _dr = _inf * _an_rota; + if(_dr != 0) { + _a.rot += _dr; + + __temp_p = point_rotate(_x, _y, _ax, _ay, _dr, __temp_p); + _x = __temp_p[0]; + _y = __temp_p[1]; + } + + var _dsx = _inf * _an_scal[0]; + var _dsy = _inf * _an_scal[1]; + if(_dsx != 0 || _dsy != 0) { + _a.sx += _inf * _an_scal[0]; + _a.sy += _inf * _an_scal[1]; + + _x += _dsx * (_x - _ax); + _y += _dsy * (_y - _ay); + } + + } else if(_an_prop == 1) { // blending + _a.color = merge_color(_a.color, _an_colr, _inf); + _a.alpha += _inf * _an_alph; + + } + + } + + var _sw = surface_get_width_safe(_surf); + var _sh = surface_get_height_safe(_surf); + var sw = _sw * _a.sx; + var sh = _sh * _a.sy; + var pos = point_rotate(-sw / 2, -sh / 2, 0, 0, rot); + + minx = min(minx, _x + pos[0], _x - pos[0], _x + pos[1], _x - pos[1]); + miny = min(miny, _y + pos[0], _y - pos[0], _y + pos[1], _y - pos[1]); + maxx = max(maxx, _x + pos[0], _x - pos[0], _x + pos[1], _x - pos[1]); + maxy = max(maxy, _y + pos[0], _y - pos[0], _y + pos[1], _y - pos[1]); + + _a.x = _x + pos[0]; + _a.y = _y + pos[1]; + } + + /////////////////////////////////////// ===== DIMENSION + inputs[ 1].setVisible(false); inputs[36].setVisible(false); inputs[37].setVisible(false); - + switch(_dimt) { case OUTPUT_SCALING.same_as_input : _dim = _sdim; @@ -363,6 +650,8 @@ function Node_Repeat(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co _outSurf = surface_verify(_outSurf, _dim[0], _dim[1]); var _x, _y; + /////////////////////////////////////// ===== RENDERING + surface_set_shader(_outSurf); if(_bld_md == 0) { BLEND_ALPHA_MULP } else if(_bld_md == 1) { BLEND_ADD } diff --git a/scripts/panel_inspector/panel_inspector.gml b/scripts/panel_inspector/panel_inspector.gml index a2118809d..63f93f0aa 100644 --- a/scripts/panel_inspector/panel_inspector.gml +++ b/scripts/panel_inspector/panel_inspector.gml @@ -85,9 +85,18 @@ function Inspector_Custom_Renderer(drawFn, registerFn = noone) : widget() constr static toString = function() { return $"Custon renderer"; } } -function Inspector_Sprite(spr) constructor { self.spr = spr; } -function Inspector_Spacer(height, line = false) constructor { self.h = height; self.line = line; } -function Inspector_Label( text, font = f_p3) constructor { self.text = text; self.font = font; } +function Inspector_Sprite(spr) constructor { self.spr = spr; } + +function Inspector_Label( text, font = f_p3) constructor { + self.text = text; + self.font = font; +} + +function Inspector_Spacer(height, line = false, coll = true) constructor { + self.h = height; + self.line = line; + self.coll = coll; +} function Panel_Inspector() : PanelContent() constructor { #region ---- main ---- @@ -810,6 +819,7 @@ function Panel_Inspector() : PanelContent() constructor { if(mouse_press(mb_left, pFOCUS)) jun[@ 1] = !coll; + if(mouse_press(mb_right, pFOCUS)) menuCall("inspector_group_menu", group_menu, 0, 0, fa_left); } else @@ -851,8 +861,9 @@ function Panel_Inspector() : PanelContent() constructor { while(j < _len) { var j_jun = _inspecting.input_display_list[j]; - if(is_array(j_jun)) - break; + if(is_array(j_jun)) break; + if(IS(j_jun, Inspector_Spacer) && !j_jun.coll) break; + j++; } diff --git a/sprites/s_node_repeat_selection_types/000dc648-1068-48f1-be2a-6428a509db2e.png b/sprites/s_node_repeat_selection_types/000dc648-1068-48f1-be2a-6428a509db2e.png new file mode 100644 index 0000000000000000000000000000000000000000..a6094149397d08ad1e9ed80d8b6902dcad81b4b9 GIT binary patch literal 610 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj3dtTpz6=aiY77hwEes65fI|H*Yfq^m9)5S5w(Gvq57F%)pI-;UwqOy9advzB+uu%;RgwPsi7#vW zN^38^Z9DJCUgdc?zs@49dEct4RlEEypXS|USSIn2dCr^H6O3X*tbswUTH+c}l9E`G zYL#4+3Zxi}42(>44GnY+j6)2JtW3?VOwF_n46F|H*Yfq{|B)5S5w~{?vzY@5*cXMW1Qjr>bMX9}*(P!>NjlMm zF@Dn%+1~&1_2+MW=wI&;q?)Od`8HW+rIuzuw)o;nOn)03{>z@*n{>6d>F%KwB7`yhz|(1e{(Wnl{yh7EO~h`NW!JW>ziDl-**xJP^ZGr~ z3dfU~^fr|X9LlZq+EF00S-bRv`VzsjKR@buajr44SY#Q<_`OWh^JUQ6S;-egUbLOC zwAkZyH+GsLLyq;U#}47wwn%%L?zT_MP3w-iwryQzLFw+j3YagJzebx8M zo$RmjAIN6tZ5Dj4H>npGPO2rY5hW>!C8<`)MX5lF!N|bKMAy(j*T6W$z{twf+{)BU z+rYrez~D%!a|Vir-29Zxv`X9>wrc#o0@R=Zx1l66H?_DVF}DD>o=3K~xPf{YJYD@< J);T3K0RXX-zbOC! literal 0 HcmV?d00001 diff --git a/sprites/s_node_repeat_selection_types/9a395831-399b-45d2-bebd-6fb20d8d6b79.png b/sprites/s_node_repeat_selection_types/9a395831-399b-45d2-bebd-6fb20d8d6b79.png new file mode 100644 index 0000000000000000000000000000000000000000..7ae623d0e8720d1fe8a86f11fa53b49a9cb42b69 GIT binary patch literal 770 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj3dtTpz6=aiY77hwEes65fI|H*Yfr0U>r;B5V$ML&U?|TO) zN*uR;U*a99e7obukpnZhxu;}g&v@XV#ldyx^@4wF|J(mHgQLx`Ni`-f0Fr;ucBlrsCnxCY7Hez zeFx)N;i;j&wb&hEj(jrOv*p2St|OBR-b~s2r$5L`GylMO*$wZSO5JaVrk*=^;Ak5o zqq1?aFxU3d&jsu*i>&OdnfLEqB0sa?MBNLYgD+1PJk=`s{_;n^ukAXvt646a#1&qD z2)}o`%-{-3L-6eT4=yj-=KNORUi!71DGzTZ-?-Tp!j{y@#_)dLt>XS;hIxUNoO!X$ zUqj#8S28Fs7I=L}m-7m%jsA@?lXvGrwG3?2%-MhJW7O|jx9L{HC8j+yxBvZ-=pOXo zAd`-{xM*G(5p6Y`XhF+8O9;4^zf-Rr))yB%Y{@*Vh~nqhc*=EO@( z`>x70zNvh1Ixt&sR)dRB$blWadag+Yk91^YTdpPCP5%&gy}0s3|Lm*myB_?I^jNBR zA!z@`-_QRO{_m<|T-sA) zoVTUh3Ya8ROI#yLQW8s2t&)pUffR$0fsu)>p@FV}afpGDm8rRvshPHcft7*5ky7Uj z6b-rgDVb@NxHW9m_NoH5~r literal 0 HcmV?d00001 diff --git a/sprites/s_node_repeat_selection_types/layers/000dc648-1068-48f1-be2a-6428a509db2e/9c737327-1000-4655-9cc5-d32fb498c866.png b/sprites/s_node_repeat_selection_types/layers/000dc648-1068-48f1-be2a-6428a509db2e/9c737327-1000-4655-9cc5-d32fb498c866.png new file mode 100644 index 0000000000000000000000000000000000000000..a6094149397d08ad1e9ed80d8b6902dcad81b4b9 GIT binary patch literal 610 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj3dtTpz6=aiY77hwEes65fI|H*Yfq^m9)5S5w(Gvq57F%)pI-;UwqOy9advzB+uu%;RgwPsi7#vW zN^38^Z9DJCUgdc?zs@49dEct4RlEEypXS|USSIn2dCr^H6O3X*tbswUTH+c}l9E`G zYL#4+3Zxi}42(>44GnY+j6)2JtW3?VOwF_n46F|H*Yfq{|B)5S5w~{?vzY@5*cXMW1Qjr>bMX9}*(P!>NjlMm zF@Dn%+1~&1_2+MW=wI&;q?)Od`8HW+rIuzuw)o;nOn)03{>z@*n{>6d>F%KwB7`yhz|(1e{(Wnl{yh7EO~h`NW!JW>ziDl-**xJP^ZGr~ z3dfU~^fr|X9LlZq+EF00S-bRv`VzsjKR@buajr44SY#Q<_`OWh^JUQ6S;-egUbLOC zwAkZyH+GsLLyq;U#}47wwn%%L?zT_MP3w-iwryQzLFw+j3YagJzebx8M zo$RmjAIN6tZ5Dj4H>npGPO2rY5hW>!C8<`)MX5lF!N|bKMAy(j*T6W$z{twf+{)BU z+rYrez~D%!a|Vir-29Zxv`X9>wrc#o0@R=Zx1l66H?_DVF}DD>o=3K~xPf{YJYD@< J);T3K0RXX-zbOC! literal 0 HcmV?d00001 diff --git a/sprites/s_node_repeat_selection_types/layers/9a395831-399b-45d2-bebd-6fb20d8d6b79/9c737327-1000-4655-9cc5-d32fb498c866.png b/sprites/s_node_repeat_selection_types/layers/9a395831-399b-45d2-bebd-6fb20d8d6b79/9c737327-1000-4655-9cc5-d32fb498c866.png new file mode 100644 index 0000000000000000000000000000000000000000..7ae623d0e8720d1fe8a86f11fa53b49a9cb42b69 GIT binary patch literal 770 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj3dtTpz6=aiY77hwEes65fI|H*Yfr0U>r;B5V$ML&U?|TO) zN*uR;U*a99e7obukpnZhxu;}g&v@XV#ldyx^@4wF|J(mHgQLx`Ni`-f0Fr;ucBlrsCnxCY7Hez zeFx)N;i;j&wb&hEj(jrOv*p2St|OBR-b~s2r$5L`GylMO*$wZSO5JaVrk*=^;Ak5o zqq1?aFxU3d&jsu*i>&OdnfLEqB0sa?MBNLYgD+1PJk=`s{_;n^ukAXvt646a#1&qD z2)}o`%-{-3L-6eT4=yj-=KNORUi!71DGzTZ-?-Tp!j{y@#_)dLt>XS;hIxUNoO!X$ zUqj#8S28Fs7I=L}m-7m%jsA@?lXvGrwG3?2%-MhJW7O|jx9L{HC8j+yxBvZ-=pOXo zAd`-{xM*G(5p6Y`XhF+8O9;4^zf-Rr))yB%Y{@*Vh~nqhc*=EO@( z`>x70zNvh1Ixt&sR)dRB$blWadag+Yk91^YTdpPCP5%&gy}0s3|Lm*myB_?I^jNBR zA!z@`-_QRO{_m<|T-sA) zoVTUh3Ya8ROI#yLQW8s2t&)pUffR$0fsu)>p@FV}afpGDm8rRvshPHcft7*5ky7Uj z6b-rgDVb@NxHW9m_NoH5~r literal 0 HcmV?d00001 diff --git a/sprites/s_node_repeat_selection_types/s_node_repeat_selection_types.yy b/sprites/s_node_repeat_selection_types/s_node_repeat_selection_types.yy new file mode 100644 index 000000000..34975d063 --- /dev/null +++ b/sprites/s_node_repeat_selection_types/s_node_repeat_selection_types.yy @@ -0,0 +1,98 @@ +{ + "$GMSprite":"", + "%Name":"s_node_repeat_selection_types", + "bboxMode":0, + "bbox_bottom":21, + "bbox_left":2, + "bbox_right":21, + "bbox_top":2, + "collisionKind":1, + "collisionTolerance":0, + "DynamicTexturePage":false, + "edgeFiltering":false, + "For3D":false, + "frames":[ + {"$GMSpriteFrame":"","%Name":"71a60998-4c2f-4f5f-b5af-63b69dce2512","name":"71a60998-4c2f-4f5f-b5af-63b69dce2512","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + {"$GMSpriteFrame":"","%Name":"000dc648-1068-48f1-be2a-6428a509db2e","name":"000dc648-1068-48f1-be2a-6428a509db2e","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + {"$GMSpriteFrame":"","%Name":"9a395831-399b-45d2-bebd-6fb20d8d6b79","name":"9a395831-399b-45d2-bebd-6fb20d8d6b79","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + ], + "gridX":0, + "gridY":0, + "height":24, + "HTile":false, + "layers":[ + {"$GMImageLayer":"","%Name":"9c737327-1000-4655-9cc5-d32fb498c866","blendMode":0,"displayName":"default","isLocked":false,"name":"9c737327-1000-4655-9cc5-d32fb498c866","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + ], + "name":"s_node_repeat_selection_types", + "nineSlice":null, + "origin":4, + "parent":{ + "name":"nodes", + "path":"folders/sprites/nodes.yy", + }, + "preMultiplyAlpha":false, + "resourceType":"GMSprite", + "resourceVersion":"2.0", + "sequence":{ + "$GMSequence":"", + "%Name":"s_node_repeat_selection_types", + "autoRecord":true, + "backdropHeight":768, + "backdropImageOpacity":0.5, + "backdropImagePath":"", + "backdropWidth":1366, + "backdropXOffset":0.0, + "backdropYOffset":0.0, + "events":{ + "$KeyframeStore":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "eventStubScript":null, + "eventToFunction":{}, + "length":3.0, + "lockOrigin":false, + "moments":{ + "$KeyframeStore":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "name":"s_node_repeat_selection_types", + "playback":1, + "playbackSpeed":30.0, + "playbackSpeedType":0, + "resourceType":"GMSequence", + "resourceVersion":"2.0", + "showBackdrop":true, + "showBackdropImage":false, + "timeUnits":1, + "tracks":[ + {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore":"","Keyframes":[ + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"71a60998-4c2f-4f5f-b5af-63b69dce2512","path":"sprites/s_node_repeat_selection_types/s_node_repeat_selection_types.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"54099991-8e8a-4c97-b0f3-c4c3457fcd4c","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"000dc648-1068-48f1-be2a-6428a509db2e","path":"sprites/s_node_repeat_selection_types/s_node_repeat_selection_types.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"ca68b041-6bdb-4460-9e52-5de9768d1186","IsCreationKey":false,"Key":1.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"9a395831-399b-45d2-bebd-6fb20d8d6b79","path":"sprites/s_node_repeat_selection_types/s_node_repeat_selection_types.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"514189bf-c26d-4bca-9d69-3fe5b164ef0a","IsCreationKey":false,"Key":2.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + ],"resourceType":"KeyframeStore","resourceVersion":"2.0",},"modifiers":[],"name":"frames","resourceType":"GMSpriteFramesTrack","resourceVersion":"2.0","spriteId":null,"trackColour":0,"tracks":[],"traits":0,}, + ], + "visibleRange":null, + "volume":1.0, + "xorigin":12, + "yorigin":12, + }, + "swatchColours":null, + "swfPrecision":0.5, + "textureGroupId":{ + "name":"Default", + "path":"texturegroups/Default", + }, + "type":0, + "VTile":false, + "width":24, +} \ No newline at end of file