From 6f5e6c18c68766e105f22be3763e34e635697d07 Mon Sep 17 00:00:00 2001 From: Tanasart Date: Fri, 31 May 2024 14:18:09 +0700 Subject: [PATCH] wavetable node --- PixelComposer.resource_order | 9 +- PixelComposer.yyp | 8 +- scripts/buttonPalette/buttonPalette.gml | 17 +- scripts/node_registry/node_registry.gml | 69 +- scripts/node_wave_table/node_wave_table.gml | 143 ++ scripts/node_wave_table/node_wave_table.yy | 13 + scripts/node_wiggler/node_wiggler.gml | 90 +- scripts/panel_graph/panel_graph.gml | 1550 +++++++++-------- scripts/panel_palette/panel_palette.gml | 32 +- shaders/sh_node_arc/sh_node_arc.yy | 2 +- shaders/sh_node_circle/sh_node_circle.fsh | 8 +- shaders/sh_node_circle/sh_node_circle.yy | 2 +- .../sh_node_widget_rotator.yy | 2 +- .../sh_node_widget_scalar.yy | 2 +- .../sh_node_widget_scalar_cross.yy | 2 +- .../sh_node_widget_scalar_line.yy | 2 +- .../sh_ui_shape_circle/sh_ui_shape_circle.fsh | 6 + .../sh_ui_shape_circle/sh_ui_shape_circle.vsh | 19 + .../sh_ui_shape_circle/sh_ui_shape_circle.yy | 12 + .../186b66e3-2b5b-4a8c-bddb-bd0261923363.png | Bin 0 -> 1606 bytes .../f01e5163-05f8-41f6-bf85-d41ecd2b9927.png | Bin 0 -> 1606 bytes sprites/s_node_ease/s_node_ease.yy | 90 + .../c1919cb9-1886-4ba5-8668-38d7a0601851.png | Bin 0 -> 1252 bytes .../0caed235-1eeb-40c7-a07f-8f547b5687cc.png | Bin 0 -> 1252 bytes .../s_node_fx_smoothstep.yy | 90 + .../590c15bd-eff6-46fb-887d-6158004741b8.png | Bin 0 -> 1218 bytes .../5fd93566-21dc-4646-9b9e-3305a97c1a22.png | Bin 0 -> 1218 bytes sprites/s_node_wave/s_node_wave.yy | 90 + .../18579d31-c42b-485e-9354-5cc19bf97aec.png | Bin 0 -> 1301 bytes .../7e8c22ae-b343-412c-b6d8-5052c75cc3fe.png | Bin 862 -> 0 bytes .../c125e173-123a-4dff-8e5e-c4b1765266bd.png | Bin 0 -> 1301 bytes .../4707f513-c44f-49a8-9007-58f929f75602.png | Bin 862 -> 0 bytes sprites/s_node_wiggler/s_node_wiggler.yy | 21 +- 33 files changed, 1449 insertions(+), 830 deletions(-) create mode 100644 scripts/node_wave_table/node_wave_table.gml create mode 100644 scripts/node_wave_table/node_wave_table.yy create mode 100644 shaders/sh_ui_shape_circle/sh_ui_shape_circle.fsh create mode 100644 shaders/sh_ui_shape_circle/sh_ui_shape_circle.vsh create mode 100644 shaders/sh_ui_shape_circle/sh_ui_shape_circle.yy create mode 100644 sprites/s_node_ease/186b66e3-2b5b-4a8c-bddb-bd0261923363.png create mode 100644 sprites/s_node_ease/layers/186b66e3-2b5b-4a8c-bddb-bd0261923363/f01e5163-05f8-41f6-bf85-d41ecd2b9927.png create mode 100644 sprites/s_node_ease/s_node_ease.yy create mode 100644 sprites/s_node_fx_smoothstep/c1919cb9-1886-4ba5-8668-38d7a0601851.png create mode 100644 sprites/s_node_fx_smoothstep/layers/c1919cb9-1886-4ba5-8668-38d7a0601851/0caed235-1eeb-40c7-a07f-8f547b5687cc.png create mode 100644 sprites/s_node_fx_smoothstep/s_node_fx_smoothstep.yy create mode 100644 sprites/s_node_wave/590c15bd-eff6-46fb-887d-6158004741b8.png create mode 100644 sprites/s_node_wave/layers/590c15bd-eff6-46fb-887d-6158004741b8/5fd93566-21dc-4646-9b9e-3305a97c1a22.png create mode 100644 sprites/s_node_wave/s_node_wave.yy create mode 100644 sprites/s_node_wiggler/18579d31-c42b-485e-9354-5cc19bf97aec.png delete mode 100644 sprites/s_node_wiggler/7e8c22ae-b343-412c-b6d8-5052c75cc3fe.png create mode 100644 sprites/s_node_wiggler/layers/18579d31-c42b-485e-9354-5cc19bf97aec/c125e173-123a-4dff-8e5e-c4b1765266bd.png delete mode 100644 sprites/s_node_wiggler/layers/7e8c22ae-b343-412c-b6d8-5052c75cc3fe/4707f513-c44f-49a8-9007-58f929f75602.png diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index c1f042b9e..124d89577 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -33,6 +33,7 @@ {"name":"d3d_modifier","order":6,"path":"folders/nodes/data/3D/d3d_modifier.yy",}, {"name":"d3d_particle","order":7,"path":"folders/nodes/data/3D/d3d_particle.yy",}, {"name":"animation","order":13,"path":"folders/nodes/data/animation.yy",}, + {"name":"value","order":7,"path":"folders/nodes/data/animation/value.yy",}, {"name":"canvas","order":30,"path":"folders/nodes/data/canvas.yy",}, {"name":"actions","order":8,"path":"folders/nodes/data/canvas/actions.yy",}, {"name":"shader","order":9,"path":"folders/nodes/data/canvas/shader.yy",}, @@ -159,7 +160,8 @@ {"name":"Flag","order":3,"path":"folders/shader/MK effects/Flag.yy",}, {"name":"Tile","order":4,"path":"folders/shader/MK effects/Tile.yy",}, {"name":"ray march","order":1,"path":"folders/shader/ray march.yy",}, - {"name":"histogram","order":4,"path":"folders/shader/UI/histogram.yy",}, + {"name":"histogram","order":3,"path":"folders/shader/UI/histogram.yy",}, + {"name":"node","order":5,"path":"folders/shader/UI/node.yy",}, {"name":"palette mixer","order":2,"path":"folders/shader/UI/palette mixer.yy",}, ], "ResourceOrderSettings":[ @@ -1072,6 +1074,7 @@ {"name":"node_warp","order":2,"path":"scripts/node_warp/node_warp.yy",}, {"name":"node_wav_file_read","order":15,"path":"scripts/node_wav_file_read/node_wav_file_read.yy",}, {"name":"node_wav_file_write","order":16,"path":"scripts/node_wav_file_write/node_wav_file_write.yy",}, + {"name":"node_wave_table","order":6,"path":"scripts/node_wave_table/node_wave_table.yy",}, {"name":"node_wavelet_noise","order":13,"path":"scripts/node_wavelet_noise/node_wavelet_noise.yy",}, {"name":"node_websocket_sender","order":1,"path":"scripts/node_websocket_sender/node_websocket_sender.yy",}, {"name":"node_widget_test","order":16,"path":"scripts/node_widget_test/node_widget_test.yy",}, @@ -1504,6 +1507,7 @@ {"name":"sh_trail_filler_pass2","order":28,"path":"shaders/sh_trail_filler_pass2/sh_trail_filler_pass2.yy",}, {"name":"sh_trail_filler","order":27,"path":"shaders/sh_trail_filler/sh_trail_filler.yy",}, {"name":"sh_twirl","order":3,"path":"shaders/sh_twirl/sh_twirl.yy",}, + {"name":"sh_ui_shape_circle","order":4,"path":"shaders/sh_ui_shape_circle/sh_ui_shape_circle.yy",}, {"name":"sh_ui_slider","order":1,"path":"shaders/sh_ui_slider/sh_ui_slider.yy",}, {"name":"sh_vertex_depth_pass","order":2,"path":"shaders/sh_vertex_depth_pass/sh_vertex_depth_pass.yy",}, {"name":"sh_vertex_normal_pass","order":3,"path":"shaders/sh_vertex_normal_pass/sh_vertex_normal_pass.yy",}, @@ -1674,6 +1678,7 @@ {"name":"s_node_dot_product","order":3,"path":"sprites/s_node_dot_product/s_node_dot_product.yy",}, {"name":"s_node_draw_atlas","order":2,"path":"sprites/s_node_draw_atlas/s_node_draw_atlas.yy",}, {"name":"s_node_draw_stack","order":4,"path":"sprites/s_node_draw_stack/s_node_draw_stack.yy",}, + {"name":"s_node_ease","order":10,"path":"sprites/s_node_ease/s_node_ease.yy",}, {"name":"s_node_edge_detect","order":20,"path":"sprites/s_node_edge_detect/s_node_edge_detect.yy",}, {"name":"s_node_equation","order":4,"path":"sprites/s_node_equation/s_node_equation.yy",}, {"name":"s_node_erode","order":21,"path":"sprites/s_node_erode/s_node_erode.yy",}, @@ -1703,6 +1708,7 @@ {"name":"s_node_fluidSim_wall","order":12,"path":"sprites/s_node_fluidSim_wall/s_node_fluidSim_wall.yy",}, {"name":"s_node_fold_noise","order":43,"path":"sprites/s_node_fold_noise/s_node_fold_noise.yy",}, {"name":"s_node_frame","order":1,"path":"sprites/s_node_frame/s_node_frame.yy",}, + {"name":"s_node_fx_smoothstep","order":9,"path":"sprites/s_node_fx_smoothstep/s_node_fx_smoothstep.yy",}, {"name":"s_node_FXAA","order":22,"path":"sprites/s_node_FXAA/s_node_FXAA.yy",}, {"name":"s_node_gabor","order":32,"path":"sprites/s_node_gabor/s_node_gabor.yy",}, {"name":"s_node_gamma_map","order":23,"path":"sprites/s_node_gamma_map/s_node_gamma_map.yy",}, @@ -2017,6 +2023,7 @@ {"name":"s_node_warp","order":9,"path":"sprites/s_node_warp/s_node_warp.yy",}, {"name":"s_node_wav_file_read","order":16,"path":"sprites/s_node_wav_file_read/s_node_wav_file_read.yy",}, {"name":"s_node_wav_file_write","order":29,"path":"sprites/s_node_wav_file_write/s_node_wav_file_write.yy",}, + {"name":"s_node_wave","order":8,"path":"sprites/s_node_wave/s_node_wave.yy",}, {"name":"s_node_wavelet","order":34,"path":"sprites/s_node_wavelet/s_node_wavelet.yy",}, {"name":"s_node_websocket_receive","order":19,"path":"sprites/s_node_websocket_receive/s_node_websocket_receive.yy",}, {"name":"s_node_websocket_send","order":21,"path":"sprites/s_node_websocket_send/s_node_websocket_send.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index e868739ac..a7eb1be6d 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -129,6 +129,7 @@ {"$GMFolder":"","%Name":"d3d_modifier","folderPath":"folders/nodes/data/3D/d3d_modifier.yy","name":"d3d_modifier","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"d3d_particle","folderPath":"folders/nodes/data/3D/d3d_particle.yy","name":"d3d_particle","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"animation","folderPath":"folders/nodes/data/animation.yy","name":"animation","resourceType":"GMFolder","resourceVersion":"2.0",}, + {"$GMFolder":"","%Name":"value","folderPath":"folders/nodes/data/animation/value.yy","name":"value","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"canvas","folderPath":"folders/nodes/data/canvas.yy","name":"canvas","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"actions","folderPath":"folders/nodes/data/canvas/actions.yy","name":"actions","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"shader","folderPath":"folders/nodes/data/canvas/shader.yy","name":"shader","resourceType":"GMFolder","resourceVersion":"2.0",}, @@ -298,6 +299,7 @@ {"$GMFolder":"","%Name":"transition","folderPath":"folders/shader/transition.yy","name":"transition","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"UI","folderPath":"folders/shader/UI.yy","name":"UI","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"histogram","folderPath":"folders/shader/UI/histogram.yy","name":"histogram","resourceType":"GMFolder","resourceVersion":"2.0",}, + {"$GMFolder":"","%Name":"node","folderPath":"folders/shader/UI/node.yy","name":"node","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"palette mixer","folderPath":"folders/shader/UI/palette mixer.yy","name":"palette mixer","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"sprites","folderPath":"folders/sprites.yy","name":"sprites","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"bs","folderPath":"folders/sprites/bs.yy","name":"bs","resourceType":"GMFolder","resourceVersion":"2.0",}, @@ -312,7 +314,6 @@ {"$GMFolder":"","%Name":"widget","folderPath":"folders/VCT/widget.yy","name":"widget","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"widgets","folderPath":"folders/widgets.yy","name":"widgets","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"button","folderPath":"folders/widgets/button.yy","name":"button","resourceType":"GMFolder","resourceVersion":"2.0",}, - {"$GMFolder":"","%Name":"node","folderPath":"folders/widgets/node.yy","name":"node","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"rotator","folderPath":"folders/widgets/rotator.yy","name":"rotator","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"sliders","folderPath":"folders/widgets/sliders.yy","name":"sliders","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"text","folderPath":"folders/widgets/text.yy","name":"text","resourceType":"GMFolder","resourceVersion":"2.0",}, @@ -1530,6 +1531,7 @@ {"id":{"name":"node_warp","path":"scripts/node_warp/node_warp.yy",},}, {"id":{"name":"node_wav_file_read","path":"scripts/node_wav_file_read/node_wav_file_read.yy",},}, {"id":{"name":"node_wav_file_write","path":"scripts/node_wav_file_write/node_wav_file_write.yy",},}, + {"id":{"name":"node_wave_table","path":"scripts/node_wave_table/node_wave_table.yy",},}, {"id":{"name":"node_wavelet_noise","path":"scripts/node_wavelet_noise/node_wavelet_noise.yy",},}, {"id":{"name":"node_websocket_receiver","path":"scripts/node_websocket_receiver/node_websocket_receiver.yy",},}, {"id":{"name":"node_websocket_sender","path":"scripts/node_websocket_sender/node_websocket_sender.yy",},}, @@ -2044,6 +2046,7 @@ {"id":{"name":"sh_trans_node_prev_drop","path":"shaders/sh_trans_node_prev_drop/sh_trans_node_prev_drop.yy",},}, {"id":{"name":"sh_twirl","path":"shaders/sh_twirl/sh_twirl.yy",},}, {"id":{"name":"sh_ui_rotator","path":"shaders/sh_ui_rotator/sh_ui_rotator.yy",},}, + {"id":{"name":"sh_ui_shape_circle","path":"shaders/sh_ui_shape_circle/sh_ui_shape_circle.yy",},}, {"id":{"name":"sh_ui_slider","path":"shaders/sh_ui_slider/sh_ui_slider.yy",},}, {"id":{"name":"sh_vector_diverge","path":"shaders/sh_vector_diverge/sh_vector_diverge.yy",},}, {"id":{"name":"sh_vertex_depth_pass","path":"shaders/sh_vertex_depth_pass/sh_vertex_depth_pass.yy",},}, @@ -2239,6 +2242,7 @@ {"id":{"name":"s_node_draw_atlas","path":"sprites/s_node_draw_atlas/s_node_draw_atlas.yy",},}, {"id":{"name":"s_node_draw_stack","path":"sprites/s_node_draw_stack/s_node_draw_stack.yy",},}, {"id":{"name":"s_node_dynasurf","path":"sprites/s_node_dynasurf/s_node_dynasurf.yy",},}, + {"id":{"name":"s_node_ease","path":"sprites/s_node_ease/s_node_ease.yy",},}, {"id":{"name":"s_node_edge_detect","path":"sprites/s_node_edge_detect/s_node_edge_detect.yy",},}, {"id":{"name":"s_node_equation","path":"sprites/s_node_equation/s_node_equation.yy",},}, {"id":{"name":"s_node_erode","path":"sprites/s_node_erode/s_node_erode.yy",},}, @@ -2271,6 +2275,7 @@ {"id":{"name":"s_node_fluidSim_wall","path":"sprites/s_node_fluidSim_wall/s_node_fluidSim_wall.yy",},}, {"id":{"name":"s_node_fold_noise","path":"sprites/s_node_fold_noise/s_node_fold_noise.yy",},}, {"id":{"name":"s_node_frame","path":"sprites/s_node_frame/s_node_frame.yy",},}, + {"id":{"name":"s_node_fx_smoothstep","path":"sprites/s_node_fx_smoothstep/s_node_fx_smoothstep.yy",},}, {"id":{"name":"s_node_FXAA","path":"sprites/s_node_FXAA/s_node_FXAA.yy",},}, {"id":{"name":"s_node_gabor","path":"sprites/s_node_gabor/s_node_gabor.yy",},}, {"id":{"name":"s_node_gamma_map","path":"sprites/s_node_gamma_map/s_node_gamma_map.yy",},}, @@ -2595,6 +2600,7 @@ {"id":{"name":"s_node_warp","path":"sprites/s_node_warp/s_node_warp.yy",},}, {"id":{"name":"s_node_wav_file_read","path":"sprites/s_node_wav_file_read/s_node_wav_file_read.yy",},}, {"id":{"name":"s_node_wav_file_write","path":"sprites/s_node_wav_file_write/s_node_wav_file_write.yy",},}, + {"id":{"name":"s_node_wave","path":"sprites/s_node_wave/s_node_wave.yy",},}, {"id":{"name":"s_node_wavelet","path":"sprites/s_node_wavelet/s_node_wavelet.yy",},}, {"id":{"name":"s_node_websocket_receive","path":"sprites/s_node_websocket_receive/s_node_websocket_receive.yy",},}, {"id":{"name":"s_node_websocket_send","path":"sprites/s_node_websocket_send/s_node_websocket_send.yy",},}, diff --git a/scripts/buttonPalette/buttonPalette.gml b/scripts/buttonPalette/buttonPalette.gml index 2e0152b26..b9c0b4916 100644 --- a/scripts/buttonPalette/buttonPalette.gml +++ b/scripts/buttonPalette/buttonPalette.gml @@ -241,6 +241,11 @@ function drawPaletteGrid(_pal, _x, _y, _w, _gs = 24, params = {}) { #region var _hov = noone; var _hcc = noone; + var hvx = 0; + var hvy = 0; + var hvw = 0; + var hvh = 0; + for(var i = 0; i < amo; i++) { var _cc = safe_mod(i, col); var _rr = floor(i / col); @@ -256,7 +261,7 @@ function drawPaletteGrid(_pal, _x, _y, _w, _gs = 24, params = {}) { #region else if(i == amo - 1) _i = 3; } else { if(i == 0) _i = 6; - else if(_cc == col - 1 && i + col > amo) { + else if(_cc == col - 1 && i + col >= amo) { if(_rr == 0) _i = 3; else _i = 9; } @@ -267,10 +272,15 @@ function drawPaletteGrid(_pal, _x, _y, _w, _gs = 24, params = {}) { #region } } - draw_sprite_stretched_ext(THEME.palette_mask, _i, _x0, _y0 + 1, _cc == col - 1? _gw : ceil(_gw), _gs, _pal[i], 1); + draw_sprite_stretched_ext(THEME.palette_mask, _i, _x0, _y0, _cc == col - 1? _gw : ceil(_gw), _gs, _pal[i], 1); if(point_in_rectangle(_mx, _my, _x0, _y0, _x0 + _gw, _y0 + _gs)) { _hov = i; _hcc = _pal[i]; + + hvx = _x0; + hvy = _y0; + hvw = _gw; + hvh = _gs; } var _same = (c_color & 0x00FFFFFF) == (_pal[i] & 0x00FFFFFF); @@ -282,12 +292,13 @@ function drawPaletteGrid(_pal, _x, _y, _w, _gs = 24, params = {}) { #region if(cx != -1) { var _pd = ui(5); - draw_sprite_stretched_ext(THEME.palette_selecting, 0, cx - _pd, cy + 1 - _pd, _gw + _pd * 2, _gs + _pd * 2); + draw_sprite_stretched_ext(THEME.palette_selecting, 0, cx - _pd, cy - _pd, _gw + _pd * 2, _gs + _pd * 2); } return { height: _h, hoverIndex: _hov, hoverColor: _hcc, + hoverBBOX: [ hvx, hvy, hvw, hvh ], }; } #endregion \ No newline at end of file diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index 60372089d..ef8095c38 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -294,7 +294,7 @@ function __initNodes() { var fav = ds_list_create(); NODE_ADD_CAT("Favourites", fav); - var group = ds_list_create(); #region + var group = ds_list_create(); #region //group NODE_ADD_CAT("Group", group, ["Node_Group"], COLORS.node_blend_collection); ds_list_add(group, "Groups"); addNodeObject(group, "Input", s_node_group_input, "Node_Group_Input", [1, Node_Group_Input]).hideRecent(); @@ -302,7 +302,7 @@ function __initNodes() { addNodeObject(group, "Thumbnail", s_node_group_thumbnail, "Node_Group_Thumbnail", [1, Node_Group_Thumbnail]).hideRecent(); #endregion - var iter = ds_list_create(); #region + var iter = ds_list_create(); #region //for NODE_ADD_CAT("Loop", iter, ["Node_Iterate"], COLORS.node_blend_loop); ds_list_add(iter, "Groups"); addNodeObject(iter, "Loop Input", s_node_loop_input, "Node_Iterator_Input", [1, Node_Iterator_Input]).hideRecent(); @@ -316,14 +316,14 @@ function __initNodes() { addNodeObject(iter, "Loop amount", s_node_iterator_amount, "Node_Iterator_Length", [1, Node_Iterator_Length]).hideRecent(); #endregion - var iter_il = ds_list_create(); #region + var iter_il = ds_list_create(); #region //for inline NODE_ADD_CAT("Loop", iter_il, ["Node_Iterate_Inline"], COLORS.node_blend_loop); ds_list_add(iter_il, "Loops"); addNodeObject(iter_il, "Index", s_node_iterator_index, "Node_Iterator_Index", [1, Node_Iterator_Index]).hideRecent(); addNodeObject(iter_il, "Loop amount", s_node_iterator_amount, "Node_Iterator_Length", [1, Node_Iterator_Length]).hideRecent(); #endregion - var itere = ds_list_create(); #region + var itere = ds_list_create(); #region //for each NODE_ADD_CAT("Loop", itere, ["Node_Iterate_Each"], COLORS.node_blend_loop); ds_list_add(itere, "Groups"); addNodeObject(itere, "Input", s_node_group_input, "Node_Group_Input", [1, Node_Group_Input]).hideRecent(); @@ -335,14 +335,14 @@ function __initNodes() { addNodeObject(itere, "Array Length", s_node_iterator_length, "Node_Iterator_Each_Length", [1, Node_Iterator_Each_Length]).hideRecent(); #endregion - var itere_il = ds_list_create(); #region + var itere_il = ds_list_create(); #region //for each inline NODE_ADD_CAT("Loop", itere_il, ["Node_Iterate_Each_Inline"], COLORS.node_blend_loop); ds_list_add(itere_il, "Loops"); addNodeObject(itere_il, "Index", s_node_iterator_index, "Node_Iterator_Index", [1, Node_Iterator_Index]).hideRecent(); addNodeObject(itere_il, "Array Length", s_node_iterator_length, "Node_Iterator_Length", [1, Node_Iterator_Length]).hideRecent(); #endregion - var filter = ds_list_create(); #region + var filter = ds_list_create(); #region //filter NODE_ADD_CAT("Filter", filter, ["Node_Iterate_Filter"], COLORS.node_blend_loop); ds_list_add(filter, "Groups"); addNodeObject(filter, "Input", s_node_group_input, "Node_Group_Input", [1, Node_Group_Input]).hideRecent(); @@ -354,14 +354,14 @@ function __initNodes() { addNodeObject(filter, "Array Length", s_node_iterator_length, "Node_Iterator_Each_Length", [1, Node_Iterator_Each_Length]).hideRecent(); #endregion - var filter_il = ds_list_create(); #region + var filter_il = ds_list_create(); #region //filter inline NODE_ADD_CAT("Filter", filter_il, ["Node_Iterate_Filter_Inline"], COLORS.node_blend_loop); ds_list_add(filter_il, "Loops"); addNodeObject(filter_il, "Index", s_node_iterator_index, "Node_Iterator_Index", [1, Node_Iterator_Index]).hideRecent(); addNodeObject(filter_il, "Array Length", s_node_iterator_length, "Node_Iterator_Length", [1, Node_Iterator_Length]).hideRecent(); #endregion - var feed = ds_list_create(); #region + var feed = ds_list_create(); #region //feedback NODE_ADD_CAT("Feedback", feed, ["Node_Feedback"], COLORS.node_blend_feedback); ds_list_add(feed, "Groups"); addNodeObject(feed, "Input", s_node_feedback_input, "Node_Feedback_Input", [1, Node_Feedback_Input]).hideRecent(); @@ -369,7 +369,7 @@ function __initNodes() { addNodeObject(feed, "Thumbnail", s_node_group_thumbnail, "Node_Group_Thumbnail", [1, Node_Group_Thumbnail]).hideRecent(); #endregion - var vfx = ds_list_create(); #region + var vfx = ds_list_create(); #region //vfx NODE_ADD_CAT("VFX", vfx, ["Node_VFX_Group", "Node_VFX_Group_Inline"], COLORS.node_blend_vfx); ds_list_add(vfx, "Groups"); addNodeObject(vfx, "Input", s_node_vfx_input, "Node_Group_Input", [1, Node_Group_Input]).hideRecent().hideGlobal(); @@ -399,7 +399,7 @@ function __initNodes() { addNodeObject(vfx, "VFX Override", s_node_vfx_override, "Node_VFX_Override", [1, Node_VFX_Override],, "Replace particle variable with a new one.").hideRecent().setVersion(1120); #endregion - var rigidSim = ds_list_create(); #region + var rigidSim = ds_list_create(); #region //rigidSim NODE_ADD_CAT("RigidSim", rigidSim, ["Node_Rigid_Group", "Node_Rigid_Group_Inline"], COLORS.node_blend_simulation); ds_list_add(rigidSim, "Group"); addNodeObject(rigidSim, "Input", s_node_group_input, "Node_Group_Input", [1, Node_Group_Input]).hideRecent().hideGlobal(); @@ -420,7 +420,7 @@ function __initNodes() { addNodeObject(rigidSim, "Rigidbody Override", s_node_rigid_override, "Node_Rigid_Override", [1, Node_Rigid_Override],, "Replace rigidbody object variable with a new one.").hideRecent().setVersion(1120); #endregion - var smokeSim = ds_list_create(); #region + var smokeSim = ds_list_create(); #region //smokeSim NODE_ADD_CAT("SmokeSim", smokeSim, ["Node_Smoke_Group", "Node_Smoke_Group_Inline"], COLORS.node_blend_smoke); ds_list_add(smokeSim, "Group"); addNodeObject(smokeSim, "Input", s_node_group_input, "Node_Group_Input", [1, Node_Group_Input]).hideRecent().hideGlobal(); @@ -442,7 +442,7 @@ function __initNodes() { addNodeObject(smokeSim, "Turbulence", s_node_smokeSim_turbulence, "Node_Smoke_Turbulence", [1, Node_Smoke_Turbulence],, "Apply random velocity map to the smoke.").hideRecent().setVersion(1120); #endregion - var flipSim = ds_list_create(); #region + var flipSim = ds_list_create(); #region //flipSim NODE_ADD_CAT("FLIP Fluid", flipSim, ["Node_FLIP_Group_Inline"], COLORS.node_blend_fluid); ds_list_add(flipSim, "Domain"); addNodeObject(flipSim, "Domain", s_node_fluidSim_domain, "Node_FLIP_Domain", [1, Node_FLIP_Domain]).hideRecent().setVersion(11620); @@ -464,7 +464,7 @@ function __initNodes() { addNodeObject(flipSim, "FLIP to VFX", s_node_fluidSim_to_VFX, "Node_FLIP_to_VFX", [1, Node_FLIP_to_VFX]).hideRecent().setVersion(11680); #endregion - var strandSim = ds_list_create(); #region + var strandSim = ds_list_create(); #region //strandSim NODE_ADD_CAT("StrandSim", strandSim, ["Node_Strand_Group", "Node_Strand_Group_Inline"], COLORS.node_blend_strand); ds_list_add(strandSim, "Group"); addNodeObject(strandSim, "Input", s_node_group_input, "Node_Group_Input", [1, Node_Group_Input]).hideRecent().hideGlobal(); @@ -486,7 +486,7 @@ function __initNodes() { //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ - var input = ds_list_create(); #region + var input = ds_list_create(); #region //input addNodeCatagory("IO", input); ds_list_add(input, "Images"); addNodeObject(input, "Canvas", s_node_canvas, "Node_Canvas", [1, Node_Canvas], ["draw"], "Draw on surface using brush, eraser, etc."); @@ -521,7 +521,7 @@ function __initNodes() { addNodeObject(input, "MIDI In", s_node_midi, "Node_MIDI_In", [1, Node_MIDI_In],, "Receive MIDI message.").setVersion(11630); #endregion - var transform = ds_list_create(); #region + var transform = ds_list_create(); #region //transform addNodeCatagory("Transform", transform); ds_list_add(transform, "Transformations"); addNodeObject(transform, "Transform", s_node_transform, "Node_Transform", [1, Node_Transform], ["move", "rotate", "scale"], "Move, rotate, and scale image."); @@ -547,7 +547,7 @@ function __initNodes() { addNodeObject(transform, "Tile Random", s_node_padding, "Node_Tile_Random", [1, Node_Tile_Random]); #endregion - var filter = ds_list_create(); #region + var filter = ds_list_create(); #region //filter addNodeCatagory("Filter", filter); //ds_list_add(filter, "Seasonal"); //addNodeObject(filter, "Lovify", s_node_lovify, "Node_Lovify", [1, Node_Lovify],, "Add love to your image.").setIcon(s_lovify_icon); @@ -639,7 +639,7 @@ function __initNodes() { addNodeObject(filter, "De-Stray", s_node_destray, "Node_De_Stray", [1, Node_De_Stray], ["destray"], "Attempt to remove orphan pixel."); #endregion - var d3d = ds_list_create(); #region + var d3d = ds_list_create(); #region //d3d addNodeCatagory("3D", d3d); ds_list_add(d3d, "2D Operations"); addNodeObject(d3d, "Normal", s_node_normal, "Node_Normal", [1, Node_Normal],, "Create normal map using greyscale value as height."); @@ -683,7 +683,7 @@ function __initNodes() { addNodeObject(d3d, "Point Affector", s_node_3d_point_affector, "Node_3D_Point_Affector", [1, Node_3D_Point_Affector],, "Generate array of 3D points interpolating between two values based on the distance.").setVersion(11570); #endregion - var generator = ds_list_create(); #region + var generator = ds_list_create(); #region //generator addNodeCatagory("Generate", generator); ds_list_add(generator, "Colors"); addNodeObject(generator, "Solid", s_node_solid, "Node_Solid", [1, Node_Solid],, "Create image of a single color."); @@ -769,7 +769,7 @@ function __initNodes() { //addNodeObject(generator, "MK Sparkle", s_node_mk_sparkle, "Node_MK_Sparkle", [1, Node_MK_Sparkle]).patreonExtra(); #endregion - var compose = ds_list_create(); #region + var compose = ds_list_create(); #region //compose addNodeCatagory("Compose", compose); ds_list_add(compose, "Composes"); addNodeObject(compose, "Blend", s_node_blend, "Node_Blend", [1, Node_Blend],, "Combine 2 images using different blend modes."); @@ -793,7 +793,7 @@ function __initNodes() { } #endregion - var values = ds_list_create(); #region + var values = ds_list_create(); #region //values addNodeCatagory("Values", values); ds_list_add(values, "Raw data"); addNodeObject(values, "Number", s_node_number, "Node_Number", [1, Node_Number]); @@ -918,7 +918,7 @@ function __initNodes() { addNodeObject(values, "Buffer from Surface", s_node_surface_to_buffer, "Node_Surface_To_Buffer", [1, Node_Surface_To_Buffer], ["surface to buffer"], "Create buffer from surface.").setVersion(1146); #endregion - var color = ds_list_create(); #region + var color = ds_list_create(); #region //color addNodeCatagory("Color", color); ds_list_add(color, "Colors"); addNodeObject(color, "Color", s_node_color_out, "Node_Color", [1, Node_Color],, "Create color value."); @@ -943,15 +943,18 @@ function __initNodes() { addNodeObject(color, "Gradient Data", s_node_gradient_data, "Node_Gradient_Extract", [1, Node_Gradient_Extract],, "Get palatte and array of key positions from gradient.").setVersion(1135); #endregion - var animation = ds_list_create(); #region + var animation = ds_list_create(); #region //animation addNodeCatagory("Animation", animation); ds_list_add(animation, "Animations"); addNodeObject(animation, "Frame Index", s_node_counter, "Node_Counter", [1, Node_Counter], ["current frame", "counter"], "Output current frame as frame index, or animation progress (0 - 1)."); - addNodeObject(animation, "Wiggler", s_node_wiggler, "Node_Wiggler", [1, Node_Wiggler],, "Create smooth random value."); addNodeObject(animation, "Evaluate Curve", s_node_curve_eval, "Node_Anim_Curve", [1, Node_Anim_Curve],, "Evaluate value from an animation curve."); addNodeObject(animation, "Rate Remap", s_node_rate_remap, "Node_Rate_Remap", [1, Node_Rate_Remap],, "Remap animation to a new framerate.").setVersion(1147); addNodeObject(animation, "Delay", s_node_delay, "Node_Delay", [1, Node_Delay]).setVersion(11640); addNodeObject(animation, "Stagger", s_node_stagger, "Node_Stagger", [1, Node_Stagger]).setVersion(11640); + + ds_list_add(animation, "Value"); + addNodeObject(animation, "Wave Table", s_node_wave, "Node_Wave_Table", [1, Node_Wave_Table],, "Create value changing overtime in wave pattern."); + addNodeObject(animation, "Wiggler", s_node_wiggler, "Node_Wiggler", [1, Node_Wiggler],, "Create random value smoothly changing over time."); ds_list_add(animation, "Audio"); addNodeObject(animation, "WAV File In", s_node_wav_file_read, "Node_WAV_File_Read", [0, Node_create_WAV_File_Read],, "Load wav audio file.").setVersion(1144); @@ -962,7 +965,7 @@ function __initNodes() { addNodeObject(animation, "Audio Volume", s_node_audio_volume, "Node_Audio_Loudness", [1, Node_Audio_Loudness],, "Calculate volume of an audio bit array.").setVersion(11540); #endregion - var node = ds_list_create(); #region + var node = ds_list_create(); #region //node addNodeCatagory("Misc", node); ds_list_add(node, "Control"); addNodeObject(node, "Condition", s_node_condition, "Node_Condition", [1, Node_Condition],, "Given a condition, output one value if true, another value is false."); @@ -1032,14 +1035,14 @@ function __initNodes() { //////////////////////////////////////////////////////////// PIXEL BUILDER //////////////////////////////////////////////////////////// - var pb_group = ds_list_create(); #region + var pb_group = ds_list_create(); #region //pb_group addNodePBCatagory("Group", pb_group); ds_list_add(pb_group, "Groups"); addNodeObject(pb_group, "Input", s_node_group_input, "Node_Group_Input", [1, Node_Group_Input]).hideRecent(); addNodeObject(pb_group, "Output", s_node_group_output, "Node_Group_Output", [1, Node_Group_Output]).hideRecent(); #endregion - var pb_draw = ds_list_create(); #region + var pb_draw = ds_list_create(); #region //pb_draw addNodePBCatagory("Draw", pb_draw); ds_list_add(pb_draw, "Fill"); addNodeObject(pb_draw, "Fill", s_node_pb_draw_fill, "Node_PB_Draw_Fill", [1, Node_PB_Draw_Fill]).hideRecent(); @@ -1056,7 +1059,7 @@ function __initNodes() { addNodeObject(pb_draw, "Blob", s_node_pb_draw_blob, "Node_PB_Draw_Blob", [1, Node_PB_Draw_Blob]).hideRecent(); #endregion - var pb_box = ds_list_create(); #region + var pb_box = ds_list_create(); #region //pb_box addNodePBCatagory("Box", pb_box); ds_list_add(pb_box, "Layer"); addNodeObject(pb_box, "Layer", s_node_pb_layer, "Node_PB_Layer", [1, Node_PB_Layer]).hideRecent(); @@ -1071,7 +1074,7 @@ function __initNodes() { addNodeObject(pb_box, "Contract", s_node_pb_box_contract, "Node_PB_Box_Contract", [1, Node_PB_Box_Contract]).hideRecent(); #endregion - var pb_fx = ds_list_create(); #region + var pb_fx = ds_list_create(); #region //pb_fx addNodePBCatagory("Effects", pb_fx); ds_list_add(pb_fx, "Effect"); addNodeObject(pb_fx, "Outline", s_node_pb_fx_outline, "Node_PB_Fx_Outline", [1, Node_PB_Fx_Outline]).hideRecent(); @@ -1093,7 +1096,7 @@ function __initNodes() { addNodeObject(pb_fx, "Intersect", s_node_pb_fx_interesct, "Node_PB_Fx_Intersect", [1, Node_PB_Fx_Intersect]).hideRecent(); #endregion - var pb_arr = ds_list_create(); #region + var pb_arr = ds_list_create(); #region //pb_arr addNodePBCatagory("Array", pb_arr); addNodeObject(pb_arr, "Array", s_node_array, "Node_Array", [1, Node_Array]).hideRecent(); addNodeObject(pb_arr, "Array Get", s_node_array_get, "Node_Array_Get", [1, Node_Array_Get], ["get array"]).hideRecent(); @@ -1104,13 +1107,13 @@ function __initNodes() { /////////////////////////////////////////////////////////////// PCX NODE /////////////////////////////////////////////////////////////// - var pcx_var = ds_list_create(); #region + var pcx_var = ds_list_create(); #region //pcx_var addNodePCXCatagory("Variable", pcx_var); addNodeObject(pcx_var, "Variable", s_node_array, "Node_PCX_var", [1, Node_PCX_var]).hideRecent(); addNodeObject(pcx_var, "Fn Variable", s_node_array, "Node_PCX_fn_var", [1, Node_PCX_fn_var]).hideRecent(); #endregion - var pcx_fn = ds_list_create(); #region + var pcx_fn = ds_list_create(); #region //pcx_fn addNodePCXCatagory("Functions", pcx_fn); addNodeObject(pcx_fn, "Equation", s_node_array, "Node_PCX_Equation", [1, Node_PCX_Equation]).hideRecent(); @@ -1127,14 +1130,14 @@ function __initNodes() { addNodeObject(pcx_fn, "Array Set", s_node_array, "Node_PCX_Array_Set", [1, Node_PCX_Array_Set]).hideRecent(); #endregion - var pcx_flow = ds_list_create(); #region + var pcx_flow = ds_list_create(); #region //pcx_flow addNodePCXCatagory("Flow Control", pcx_flow); addNodeObject(pcx_flow, "Condition", s_node_array, "Node_PCX_Condition", [1, Node_PCX_Condition]).hideRecent(); #endregion //////////////////////////////////////////////////////////////// HIDDEN //////////////////////////////////////////////////////////////// - var hid = ds_list_create(); #region + var hid = ds_list_create(); #region //hid addNodeCatagory("Hidden", hid, ["Hidden"]); addNodeObject(hid, "Input", s_node_loop_input, "Node_Iterator_Each_Input", [1, Node_Iterator_Each_Input]).hideRecent(); addNodeObject(hid, "Output", s_node_loop_output, "Node_Iterator_Each_Output", [1, Node_Iterator_Each_Output]).hideRecent(); diff --git a/scripts/node_wave_table/node_wave_table.gml b/scripts/node_wave_table/node_wave_table.gml new file mode 100644 index 000000000..142969bf7 --- /dev/null +++ b/scripts/node_wave_table/node_wave_table.gml @@ -0,0 +1,143 @@ +function Node_Wave_Table(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor { + name = "Wave Table"; + update_on_frame = true; + setDimension(96, 96); + + inputs[| 0] = nodeValue("Range", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 1 ]) + .setDisplay(VALUE_DISPLAY.vector); + + inputs[| 1] = nodeValue("Frequency", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 2 ) + .setDisplay(VALUE_DISPLAY.slider, { range: [1, 8, 0.01] }); + + inputs[| 2] = nodeValue("Display", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1 ) + .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Number", "Graph" ]); + + inputs[| 3] = nodeValue("Pattern", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0 ) + .setDisplay(VALUE_DISPLAY.slider, { range: [0, 3, 0.01] }); + + outputs[| 0] = nodeValue("Output", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, 0); + + input_display_list = [ + ["Display", true], 2, + ["Wave", false], 3, 0, 1, + ]; + + graph_display = array_create(64, 0); + + pattern = 0; + frequency = 0; + range_min = 0; + range_max = 0; + disp_text = 0; + + function getPattern(_patt, _time) { + switch(_patt % 3) { + case 0 : return sin(_time * pi * 2); + case 1 : return frac(_time) < 0.5? 1 : -1; + case 2 : return frac(_time + 0.5) * 2 - 1; + } + + return 0; + } + + function __getWave(_time = 0) { + var _p0 = floor(pattern); + var _p1 = floor(pattern) + 1; + var _fr = frac(pattern); + + var _v0 = getPattern(_p0, _time * frequency) * .5 + .5; + var _v1 = getPattern(_p1, _time * frequency) * .5 + .5; + var _lrp = lerp(_v0, _v1, _fr); + + return lerp(range_min, range_max, _lrp); + } + + static onValueUpdate = function(index = 0) { + var ran = getSingleValue(0); + range_min = array_safe_get_fast(ran, 0); + range_max = array_safe_get_fast(ran, 1); + + frequency = getSingleValue(1); + pattern = getSingleValue(3); + + for( var i = 0; i < 64; i++ ) + graph_display[i] = __getWave(i / 64); + } + + run_in(1, function() { onValueUpdate(); }); + + static processData = function(_output, _data, _output_index, _array_index = 0) { #region + var ran = _data[0]; + range_min = array_safe_get_fast(ran, 0); + range_max = array_safe_get_fast(ran, 1); + + frequency = _data[1]; + pattern = _data[3]; + + var val = __getWave(CURRENT_FRAME / TOTAL_FRAMES); + if(_output_index == 0) disp_text = val; + + return val; + } #endregion + + static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region + var bbox = drawGetBbox(xx, yy, _s); + + var ran = array_safe_get_fast(current_data, 0); + var disp = array_safe_get_fast(current_data, 2); + var time = CURRENT_FRAME; + var total_time = TOTAL_FRAMES; + + if(!is_array(ran)) return; + + switch(disp) { + case 0 : + draw_set_text(f_sdf, fa_center, fa_center, COLORS._main_text); + draw_text_bbox(bbox, disp_text); + break; + + case 1 : + var _min = ran[0]; + var _max = ran[1]; + var val = (_min + _max) / 2; + var _ran = _max - _min; + + var x0 = xx + 8 * _s; + var x1 = xx + (w - 8) * _s; + var y0 = yy + 20 * draw_name + 8 * _s; + var y1 = yy + (h - 8) * _s; + var ww = x1 - x0; + var hh = y1 - y0; + + var yc = (y0 + y1) / 2; + draw_set_color(COLORS.node_wiggler_frame); + draw_set_alpha(0.5); + draw_line(x0, yc, x1, yc); + draw_set_alpha(1); + + draw_set_text(f_sdf, fa_right, fa_bottom, COLORS._main_text_sub); + draw_text_transformed(x1 - 2 * _s, y1, disp_text, 0.3 * _s, 0.3 * _s, 0); + + var lw = ww / (64 - 1); + var ox, oy; + draw_set_color(c_white); + for( var i = 0; i < 64; i++ ) { + var _x = x0 + i * lw; + var _y = yc - (graph_display[i] - val) / _ran * hh; + if(i) draw_line(ox, oy, _x, _y); + + ox = _x; + oy = _y; + } + draw_set_color(COLORS._main_accent); + var _fx = x0 + (time / total_time * ww); + draw_line(_fx, y0, _fx, y1); + + draw_set_color(COLORS.node_wiggler_frame); + draw_rectangle(x0, y0, x1, y1, true); + break; + } + } #endregion + + static doApplyDeserialize = function() { onValueUpdate(); } +} \ No newline at end of file diff --git a/scripts/node_wave_table/node_wave_table.yy b/scripts/node_wave_table/node_wave_table.yy new file mode 100644 index 000000000..0ca64f80d --- /dev/null +++ b/scripts/node_wave_table/node_wave_table.yy @@ -0,0 +1,13 @@ +{ + "$GMScript":"", + "%Name":"node_wave_table", + "isCompatibility":false, + "isDnD":false, + "name":"node_wave_table", + "parent":{ + "name":"animation", + "path":"folders/nodes/data/animation.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", +} \ No newline at end of file diff --git a/scripts/node_wiggler/node_wiggler.gml b/scripts/node_wiggler/node_wiggler.gml index 4788f94f9..af46e43e0 100644 --- a/scripts/node_wiggler/node_wiggler.gml +++ b/scripts/node_wiggler/node_wiggler.gml @@ -13,37 +13,87 @@ function Node_Wiggler(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c .setDisplay(VALUE_DISPLAY._default, { side_button : button(function() { inputs[| 2].setValue(seed_random(6)); }).setIcon(THEME.icon_random, 0, COLORS._main_icon) }); inputs[| 3] = nodeValue("Display", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1 ) - .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Number", "Graph" ]) + .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Number", "Graph" ]); + inputs[| 4] = nodeValue("Clip", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0b11 ) + .setDisplay(VALUE_DISPLAY.toggle, { data : [ "Start", "End" ] }); + outputs[| 0] = nodeValue("Output", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, 0); input_display_list = [ - ["Display", true], 3, - ["Wiggle", false], 2, 0, 1, + ["Display", true], 3, + ["Wiggle", false], 2, 0, 1, 4, ]; - random_value = array_create(64, 0); + graph_display = array_create(64, 0); - static onValueUpdate = function(index = 0) { #region - var ran = getSingleValue(0); - var fre = getSingleValue(1); - var sed = getSingleValue(2); + range_min = 0; + range_max = 0; + disp_text = 0; + wiggle_seed = 0; + wiggle_freq = 1; + + clip_start = true; + clip_end = true; + + function __getWiggle(_time = 0) { #region + + var _ed = TOTAL_FRAMES; + var sdMin = floor(_time / wiggle_freq) * wiggle_freq; + var sdMax = min(_ed, sdMin + wiggle_freq); + + var _x0 = (clip_start && sdMin <= 0)? 0.5 : random1D(PROJECT.seed + wiggle_seed + sdMin); + var _x1 = (clip_end && sdMax >= _ed)? 0.5 : random1D(PROJECT.seed + wiggle_seed + sdMax); + + var t = (_time - sdMin) / (sdMax - sdMin); + t = -(cos(pi * t) - 1) / 2; + + var _lrp = lerp(_x0, _x1, t); + return lerp(range_min, range_max, _lrp); + } #endregion + + static onValueUpdate = function(index = 0) { + var ran = getSingleValue(0); + range_min = array_safe_get_fast(ran, 0); + range_max = array_safe_get_fast(ran, 1); + + var fre = getSingleValue(1); + wiggle_freq = fre == 0? 1 : max(1, TOTAL_FRAMES / fre); + wiggle_seed = getSingleValue(2); + + var clp = getSingleValue(4); + clip_start = bool(clp & 0b01); + clip_end = bool(clp & 0b10); var step = TOTAL_FRAMES / 64; for( var i = 0; i < 64; i++ ) - random_value[i] = getWiggle(array_safe_get_fast(ran, 0), array_safe_get_fast(ran, 1), TOTAL_FRAMES / fre, step * i, sed, 0, TOTAL_FRAMES); - } run_in(1, function() { onValueUpdate(); }); #endregion + graph_display[i] = __getWiggle(step * i); + } + + run_in(1, function() { onValueUpdate(); }); static processData = function(_output, _data, _output_index, _array_index = 0) { #region - var ran = _data[0]; - var fre = _data[1]; - var sed = _data[2]; - var time = CURRENT_FRAME; + var ran = _data[0]; + range_min = array_safe_get_fast(ran, 0); + range_max = array_safe_get_fast(ran, 1); - return getWiggle(array_safe_get_fast(ran, 0), array_safe_get_fast(ran, 1), TOTAL_FRAMES / fre, time, sed, 0, TOTAL_FRAMES); + var fre = _data[1]; + wiggle_freq = fre == 0? 1 : max(1, TOTAL_FRAMES / fre); + wiggle_seed = _data[2]; + + var clp = _data[4]; + clip_start = bool(clp & 0b01); + clip_end = bool(clp & 0b10); + + var val = __getWiggle(CURRENT_FRAME); + if(_output_index == 0) disp_text = val; + + return val; } #endregion static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region + var bbox = drawGetBbox(xx, yy, _s); + var ran = array_safe_get_fast(current_data, 0); var fre = array_safe_get_fast(current_data, 1); var sed = array_safe_get_fast(current_data, 2); @@ -56,9 +106,7 @@ function Node_Wiggler(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c switch(disp) { case 0 : draw_set_text(f_sdf, fa_center, fa_center, COLORS._main_text); - var str = getWiggle(ran[0], ran[1], TOTAL_FRAMES / fre, time, sed, 0, TOTAL_FRAMES); - var ss = string_scale(str, (w - 16) * _s, (h - 16) * _s - 20 * draw_name); - draw_text_transformed(xx + w / 2 * _s, yy + 10 + h / 2 * _s, str, ss, ss, 0); + draw_text_bbox(bbox, disp_text); break; case 1 : @@ -80,12 +128,15 @@ function Node_Wiggler(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c draw_line(x0, yc, x1, yc); draw_set_alpha(1); + draw_set_text(f_sdf, fa_right, fa_bottom, COLORS._main_text_sub); + draw_text_transformed(x1 - 2 * _s, y1, disp_text, 0.3 * _s, 0.3 * _s, 0); + var lw = ww / (64 - 1); var ox, oy; draw_set_color(c_white); for( var i = 0; i < 64; i++ ) { var _x = x0 + i * lw; - var _y = yc - (random_value[i] - val) / _ran * hh; + var _y = yc - (graph_display[i] - val) / _ran * hh; if(i) draw_line(ox, oy, _x, _y); ox = _x; @@ -97,6 +148,7 @@ function Node_Wiggler(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c draw_set_color(COLORS.node_wiggler_frame); draw_rectangle(x0, y0, x1, y1, true); + break; } } #endregion diff --git a/scripts/panel_graph/panel_graph.gml b/scripts/panel_graph/panel_graph.gml index dd7600743..4f2625e09 100644 --- a/scripts/panel_graph/panel_graph.gml +++ b/scripts/panel_graph/panel_graph.gml @@ -79,8 +79,21 @@ function panel_graph_copy() { CALL("graph_copy"); PANEL_GRAPH.doCopy(); } function panel_graph_paste() { CALL("graph_paste"); PANEL_GRAPH.doPaste(); } - function panel_graph_pan() { CALL("graph_pan"); PANEL_GRAPH.graph_dragging_key = true; } - function panel_graph_zoom() { CALL("graph_zoom"); PANEL_GRAPH.graph_zooming_key = true; } + function panel_graph_pan() { + CALL("graph_pan"); + if(PANEL_GRAPH.node_hovering) return; + if(PANEL_GRAPH.value_focus) return; + + PANEL_GRAPH.graph_dragging_key = true; + } + + function panel_graph_zoom() { + CALL("graph_zoom"); + if(PANEL_GRAPH.node_hovering) return; + if(PANEL_GRAPH.value_focus) return; + + PANEL_GRAPH.graph_zooming_key = true; + } #endregion function connectionParameter() constructor { #region @@ -130,6 +143,8 @@ function connectionParameter() constructor { #region } } #endregion +//// ========== Graph Panel ========== + function Panel_Graph(project = PROJECT) : PanelContent() constructor { title = __txt("Graph"); title_raw = ""; @@ -407,259 +422,121 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { ]; #endregion - #region ++++ node setters ++++ - function setCurrentPreview(_node = getFocusingNode()) { #region - if(!_node) return; - - PANEL_PREVIEW.setNodePreview(_node); - } #endregion + //// =========== Get Set =========== - function setCurrentExport(_node = getFocusingNode()) { #region - if(DEMO) return; - if(!_node) return; - - var _outp = -1; - var _path = -1; - - for( var i = 0; i < ds_list_size(_node.outputs); i++ ) { - if(_node.outputs[| i].type == VALUE_TYPE.path) - _path = _node.outputs[| i]; - if(_node.outputs[| i].type == VALUE_TYPE.surface && _outp == -1) - _outp = _node.outputs[| i]; - } - - if(_outp == -1) return; - - var _export = nodeBuild("Node_Export", _node.x + _node.w + 64, _node.y); - if(_path != -1) - _export.inputs[| 1].setFrom(_path); - - _export.inputs[| 0].setFrom(_outp); - } #endregion + function setCurrentPreview(_node = getFocusingNode()) { #region + if(!_node) return; - function setCurrentCanvas(_node = getFocusingNode()) { #region - if(!_node) return; - - var _outp = -1; - var surf = -1; - - for( var i = 0; i < ds_list_size(_node.outputs); i++ ) { - if(_node.outputs[| i].type != VALUE_TYPE.surface) continue; - + PANEL_PREVIEW.setNodePreview(_node); + } #endregion + + function setCurrentExport(_node = getFocusingNode()) { #region + if(DEMO) return; + if(!_node) return; + + var _outp = -1; + var _path = -1; + + for( var i = 0; i < ds_list_size(_node.outputs); i++ ) { + if(_node.outputs[| i].type == VALUE_TYPE.path) + _path = _node.outputs[| i]; + if(_node.outputs[| i].type == VALUE_TYPE.surface && _outp == -1) _outp = _node.outputs[| i]; - surf = _outp.getValue(); + } + + if(_outp == -1) return; + + var _export = nodeBuild("Node_Export", _node.x + _node.w + 64, _node.y); + if(_path != -1) + _export.inputs[| 1].setFrom(_path); + + _export.inputs[| 0].setFrom(_outp); + } #endregion + + function setCurrentCanvas(_node = getFocusingNode()) { #region + if(!_node) return; + + var _outp = -1; + var surf = -1; + + for( var i = 0; i < ds_list_size(_node.outputs); i++ ) { + if(_node.outputs[| i].type != VALUE_TYPE.surface) continue; + + _outp = _node.outputs[| i]; + surf = _outp.getValue(); + break; + } + + if(_outp == -1) return; + if(!is_array(surf)) surf = [ surf ]; + + var _canvas = nodeBuild("Node_Canvas", _node.x + _node.w + 64, _node.y); + var _dim = surface_get_dimension(surf[0]); + + _canvas.attributes.dimension = _dim; + _canvas.attributes.frames = array_length(surf); + _canvas.canvas_surface = surface_array_clone(surf); + _canvas.inputs[| 0].setValue(_dim); + + _canvas.apply_surfaces(); + + } #endregion + + function setTriggerPreview() { #region + __temp_show = false; + array_foreach(nodes_selecting, function(node, index) { + if(index == 0) __temp_show = !node.previewable; + node.previewable = __temp_show; + node.refreshNodeDisplay(); + }); + } #endregion + + function setTriggerParameter() { #region + __temp_show = false; + array_foreach(nodes_selecting, function(node, index) { + if(index == 0) __temp_show = !node.show_parameter; + node.show_parameter = __temp_show; + node.refreshNodeDisplay(); + }); + } #endregion + + function setTriggerRender() { #region + __temp_active = false; + array_foreach(nodes_selecting, function(node, index) { + if(index == 0) __temp_active = !node.renderActive; + node.renderActive = __temp_active; + }); + } #endregion + + function setCurrentCanvasBlend(_node = getFocusingNode()) { #region + if(!_node) return; + + var _outp = -1; + var surf = -1; + + for( var i = 0; i < ds_list_size(_node.outputs); i++ ) { + if(_node.outputs[| i].type == VALUE_TYPE.surface) { + _outp = _node.outputs[| i]; + var _val = _node.outputs[| i].getValue(); + if(is_array(_val)) + surf = _val[_node.preview_index]; + else + surf = _val; break; } - - if(_outp == -1) return; - if(!is_array(surf)) surf = [ surf ]; - - var _canvas = nodeBuild("Node_Canvas", _node.x + _node.w + 64, _node.y); - var _dim = surface_get_dimension(surf[0]); - - _canvas.attributes.dimension = _dim; - _canvas.attributes.frames = array_length(surf); - _canvas.canvas_surface = surface_array_clone(surf); - _canvas.inputs[| 0].setValue(_dim); - - _canvas.apply_surfaces(); - - } #endregion - - function setTriggerPreview() { #region - __temp_show = false; - array_foreach(nodes_selecting, function(node, index) { - if(index == 0) __temp_show = !node.previewable; - node.previewable = __temp_show; - node.refreshNodeDisplay(); - }); - } #endregion - - function setTriggerParameter() { #region - __temp_show = false; - array_foreach(nodes_selecting, function(node, index) { - if(index == 0) __temp_show = !node.show_parameter; - node.show_parameter = __temp_show; - node.refreshNodeDisplay(); - }); - } #endregion - - function setTriggerRender() { #region - __temp_active = false; - array_foreach(nodes_selecting, function(node, index) { - if(index == 0) __temp_active = !node.renderActive; - node.renderActive = __temp_active; - }); - } #endregion - - function setCurrentCanvasBlend(_node = getFocusingNode()) { #region - if(!_node) return; - - var _outp = -1; - var surf = -1; - - for( var i = 0; i < ds_list_size(_node.outputs); i++ ) { - if(_node.outputs[| i].type == VALUE_TYPE.surface) { - _outp = _node.outputs[| i]; - var _val = _node.outputs[| i].getValue(); - if(is_array(_val)) - surf = _val[_node.preview_index]; - else - surf = _val; - break; - } - } - - if(_outp == -1) return; - - var _canvas = nodeBuild("Node_Canvas", _node.x, _node.y + _node.h + 64); - - _canvas.inputs[| 0].setValue([surface_get_width_safe(surf), surface_get_height_safe(surf)]); - _canvas.inputs[| 5].setValue(true); - - var _blend = new Node_Blend(_node.x + _node.w + 64, _node.y, getCurrentContext()); - _blend.inputs[| 0].setFrom(_outp); - _blend.inputs[| 1].setFrom(_canvas.outputs[| 0]); - } #endregion - #endregion - - #region ++++ context menu ++++ - menu_sent_to_preview = menuItem(__txtx("panel_graph_send_to_preview", "Send to preview"), function() { setCurrentPreview(node_hover); }); - menu_send_to_window = menuItem(__txtx("panel_graph_preview_window", "Send to preview window"), function() { create_preview_window(node_hover); }, noone, ["Graph", "Preview window"]); - menu_sent_to_inspector = menuItem(__txtx("panel_graph_inspector_panel", "Send to new inspector"), function() { - var pan = panelAdd("Panel_Inspector", true); - pan.destroy_on_click_out = false; - pan.content.setInspecting(node_hover); - pan.content.locked = true; - }); - menu_send_export = menuItem(__txtx("panel_graph_send_to_export", "Send to export"), function() { setCurrentExport(node_hover); }, noone, ["Graph", "Export"]); - menu_toggle_preview = menuItem(__txtx("panel_graph_toggle_preview", "Toggle node preview"), function() { setTriggerPreview(); }, noone, ["Graph", "Toggle preview"]); - menu_toggle_render = menuItem(__txtx("panel_graph_toggle_render", "Toggle node render"), function() { setTriggerRender(); }, noone, ["Graph", "Toggle render"]); - menu_toggle_param = menuItem(__txtx("panel_graph_toggle_parameter", "Toggle node parameters"),function() { setTriggerParameter(); }, noone, ["Graph", "Toggle parameters"]); - menu_open_group = menuItem(__txtx("panel_graph_enter_group", "Open group"), function() { PANEL_GRAPH.addContext(node_hover); }, THEME.group); - - function openGroupTab(group) { - var graph = new Panel_Graph(project); - panel.setContent(graph, true); - - for( var i = 0; i < ds_list_size(node_context); i++ ) - graph.addContext(node_context[| i]); - graph.addContext(group); - - setFocus(panel); } - menu_open_group_tab = menuItem(__txtx("panel_graph_enter_group_new_tab", "Open group in new tab"), function() { openGroupTab(node_hover); }, THEME.group); - menu_group_group = menuItem(__txt("Ungroup"), function() { doGroup(); }, THEME.group, ["Graph", "group"]); - menu_group_ungroup = menuItem(__txt("Ungroup"), function() { doUngroup(); }, THEME.group, ["Graph", "Ungroup"]); - menu_group_tool = menuItem(__txt("Set as group tool"), function() { node_hover.setTool(!node_hover.isTool); }); - - menu_node_delete_merge = menuItem(__txtx("panel_graph_delete_and_merge_connection", "Delete and merge connection"), function() { doDelete(true); }, THEME.cross, ["Graph", "Delete (merge)"]); - menu_node_delete_cut = menuItem(__txtx("panel_graph_delete_and_cut_connection", "Delete and cut connection"), function() { doDelete(false); }, THEME.cross, ["Graph", "Delete (break)"]); - menu_node_duplicate = menuItem(__txt("Duplicate"), function() { doDuplicate(); }, THEME.duplicate, ["Graph", "Duplicate"]); - menu_node_copy = menuItem(__txt("Copy"), function() { doCopy(); }, THEME.copy, ["Graph", "Copy"]); - - menu_node_transform = menuItem(__txtx("panel_graph_add_transform", "Add transform"), function() { doTransform(); }, noone, ["Graph", "Transform node"]); - menu_node_canvas = menuItem(__txtx("panel_graph_canvas", "Canvas"), - function(_dat) { - return submenuCall(_dat, [ - menuItem(__txtx("panel_graph_copy_to_canvas", "Copy to canvas"), function() { setCurrentCanvas(node_hover); }, noone, ["Graph", "Canvas"]), - menuItem(__txtx("panel_graph_overlay_canvas", "Overlay canvas"), function() { setCurrentCanvasBlend(node_hover); }, noone, ["Graph", "Canvas blend"]) - ]); - }).setIsShelf(); - - menu_nodes_align = menuItemGroup(__txtx("panel_graph_align_nodes", "Align"), [ - [ [THEME.inspector_surface_halign, 0], function() { node_halign(nodes_selecting, fa_left); } ], - [ [THEME.inspector_surface_halign, 1], function() { node_halign(nodes_selecting, fa_center); } ], - [ [THEME.inspector_surface_halign, 2], function() { node_halign(nodes_selecting, fa_right); } ], - - [ [THEME.inspector_surface_valign, 0], function() { node_valign(nodes_selecting, fa_top); } ], - [ [THEME.inspector_surface_valign, 1], function() { node_valign(nodes_selecting, fa_middle); } ], - [ [THEME.inspector_surface_valign, 2], function() { node_valign(nodes_selecting, fa_bottom); } ], - - [ [THEME.obj_distribute_h, 0], function() { node_hdistribute(nodes_selecting); } ], - [ [THEME.obj_distribute_v, 0], function() { node_vdistribute(nodes_selecting); } ], - ]); - menu_nodes_blend = menuItem(__txtx("panel_graph_blend_nodes", "Blend nodes"), function() { doBlend(); }, noone, ["Graph", "Blend"]); - menu_nodes_compose = menuItem(__txtx("panel_graph_compose_nodes", "Compose nodes"), function() { doCompose(); }, noone, ["Graph", "Compose"]); - menu_nodes_array = menuItem(__txtx("panel_graph_array_from_nodes", "Array from nodes"), function() { doArray(); }, noone, ["Graph", "Array"]); - menu_nodes_group = menuItem(__txtx("panel_graph_group_nodes", "Group nodes"), function() { doGroup(); }, THEME.group, ["Graph", "Group"]); - menu_nodes_frame = menuItem(__txtx("panel_graph_frame_nodes", "Frame nodes"), function() { doFrame(); }, noone, ["Graph", "Frame"]); - - menu_node_copy_prop = menuItem(__txtx("panel_graph_copy_prop", "Copy all properties"), function() { doCopyProp(); }); - menu_node_paste_prop = menuItem(__txtx("panel_graph_paste_prop", "Paste all properties"), function() { doPasteProp(); }); - - #region node color - function setSelectingNodeColor(color) { - __temp_color = color; - - if(node_hover) node_hover.attributes.color = __temp_color; - array_foreach(nodes_selecting, function(node) { node.attributes.color = __temp_color; }); - } - - var _clrs = COLORS.labels; - var _item = array_create(array_length(_clrs)); - for( var i = 0, n = array_length(_clrs); i < n; i++ ) { - _item[i] = [ - [ THEME.timeline_color, i > 0, _clrs[i] ], - function(_data) { - setSelectingNodeColor(_data.color); - }, "", { color: i == 0? -1 : _clrs[i] } - ]; - } + if(_outp == -1) return; - array_push(_item, [ - [ THEME.timeline_color, 2 ], - function(_data) { - colorSelectorCall(node_hover? node_hover.attributes.color : c_white, setSelectingNodeColor); - } - ]); + var _canvas = nodeBuild("Node_Canvas", _node.x, _node.y + _node.h + 64); - menu_node_color = menuItemGroup(__txt("Node Color"), _item); - menu_node_color.spacing = ui(24); - #endregion - - #region junction color - __junction_hovering = noone; - - function setSelectingJuncColor(color) { - if(__junction_hovering == noone) return; - __junction_hovering.setColor(color); - - for(var i = 0; i < array_length(nodes_selecting); i++) { - var _node = nodes_selecting[i]; - - for( var j = 0, m = ds_list_size(_node.inputs); j < m; j++ ) { - var _input = _node.inputs[| j]; - if(_input.value_from == noone) continue; - _input.setColor(color); - } - } - } - - var _clrs = COLORS.labels; - var _item = array_create(array_length(_clrs)); + _canvas.inputs[| 0].setValue([surface_get_width_safe(surf), surface_get_height_safe(surf)]); + _canvas.inputs[| 5].setValue(true); - for( var i = 0, n = array_length(_clrs); i < n; i++ ) { - _item[i] = [ - [ THEME.timeline_color, i > 0, _clrs[i] ], - function(_data) { - setSelectingJuncColor(_data.color); - }, "", { color: i == 0? -1 : _clrs[i] } - ]; - } - - array_push(_item, [ - [ THEME.timeline_color, 2 ], - function(_data) { - colorSelectorCall(__junction_hovering? __junction_hovering.color : c_white, setSelectingJuncColor); - } - ]); - - menu_junc_color = menuItemGroup(__txt("Connection Color"), _item); - menu_junc_color.spacing = ui(24); - #endregion - #endregion + var _blend = new Node_Blend(_node.x + _node.w + 64, _node.y, getCurrentContext()); + _blend.inputs[| 0].setFrom(_outp); + _blend.inputs[| 1].setFrom(_canvas.outputs[| 0]); + } #endregion function getFocusingNode() { INLINE return array_empty(nodes_selecting)? noone : nodes_selecting[0]; } @@ -672,6 +549,146 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { return cont == noone? project.nodes : cont.getNodeList(); } #endregion + //// =========== Menus =========== + + menu_sent_to_preview = menuItem(__txtx("panel_graph_send_to_preview", "Send to preview"), function() { setCurrentPreview(node_hover); }); + menu_send_to_window = menuItem(__txtx("panel_graph_preview_window", "Send to preview window"), function() { create_preview_window(node_hover); }, noone, ["Graph", "Preview window"]); + menu_sent_to_inspector = menuItem(__txtx("panel_graph_inspector_panel", "Send to new inspector"), function() { + var pan = panelAdd("Panel_Inspector", true); + pan.destroy_on_click_out = false; + pan.content.setInspecting(node_hover); + pan.content.locked = true; + }); + menu_send_export = menuItem(__txtx("panel_graph_send_to_export", "Send to export"), function() { setCurrentExport(node_hover); }, noone, ["Graph", "Export"]); + menu_toggle_preview = menuItem(__txtx("panel_graph_toggle_preview", "Toggle node preview"), function() { setTriggerPreview(); }, noone, ["Graph", "Toggle preview"]); + menu_toggle_render = menuItem(__txtx("panel_graph_toggle_render", "Toggle node render"), function() { setTriggerRender(); }, noone, ["Graph", "Toggle render"]); + menu_toggle_param = menuItem(__txtx("panel_graph_toggle_parameter", "Toggle node parameters"),function() { setTriggerParameter(); }, noone, ["Graph", "Toggle parameters"]); + menu_open_group = menuItem(__txtx("panel_graph_enter_group", "Open group"), function() { PANEL_GRAPH.addContext(node_hover); }, THEME.group); + + function openGroupTab(group) { + var graph = new Panel_Graph(project); + panel.setContent(graph, true); + + for( var i = 0; i < ds_list_size(node_context); i++ ) + graph.addContext(node_context[| i]); + graph.addContext(group); + + setFocus(panel); + } + menu_open_group_tab = menuItem(__txtx("panel_graph_enter_group_new_tab", "Open group in new tab"), function() { openGroupTab(node_hover); }, THEME.group); + menu_group_group = menuItem(__txt("Ungroup"), function() { doGroup(); }, THEME.group, ["Graph", "group"]); + menu_group_ungroup = menuItem(__txt("Ungroup"), function() { doUngroup(); }, THEME.group, ["Graph", "Ungroup"]); + menu_group_tool = menuItem(__txt("Set as group tool"), function() { node_hover.setTool(!node_hover.isTool); }); + + menu_node_delete_merge = menuItem(__txtx("panel_graph_delete_and_merge_connection", "Delete and merge connection"), function() { doDelete(true); }, THEME.cross, ["Graph", "Delete (merge)"]); + menu_node_delete_cut = menuItem(__txtx("panel_graph_delete_and_cut_connection", "Delete and cut connection"), function() { doDelete(false); }, THEME.cross, ["Graph", "Delete (break)"]); + menu_node_duplicate = menuItem(__txt("Duplicate"), function() { doDuplicate(); }, THEME.duplicate, ["Graph", "Duplicate"]); + menu_node_copy = menuItem(__txt("Copy"), function() { doCopy(); }, THEME.copy, ["Graph", "Copy"]); + + menu_node_transform = menuItem(__txtx("panel_graph_add_transform", "Add transform"), function() { doTransform(); }, noone, ["Graph", "Transform node"]); + menu_node_canvas = menuItem(__txtx("panel_graph_canvas", "Canvas"), + function(_dat) { + return submenuCall(_dat, [ + menuItem(__txtx("panel_graph_copy_to_canvas", "Copy to canvas"), function() { setCurrentCanvas(node_hover); }, noone, ["Graph", "Canvas"]), + menuItem(__txtx("panel_graph_overlay_canvas", "Overlay canvas"), function() { setCurrentCanvasBlend(node_hover); }, noone, ["Graph", "Canvas blend"]) + ]); + }).setIsShelf(); + + menu_nodes_align = menuItemGroup(__txtx("panel_graph_align_nodes", "Align"), [ + [ [THEME.inspector_surface_halign, 0], function() { node_halign(nodes_selecting, fa_left); } ], + [ [THEME.inspector_surface_halign, 1], function() { node_halign(nodes_selecting, fa_center); } ], + [ [THEME.inspector_surface_halign, 2], function() { node_halign(nodes_selecting, fa_right); } ], + + [ [THEME.inspector_surface_valign, 0], function() { node_valign(nodes_selecting, fa_top); } ], + [ [THEME.inspector_surface_valign, 1], function() { node_valign(nodes_selecting, fa_middle); } ], + [ [THEME.inspector_surface_valign, 2], function() { node_valign(nodes_selecting, fa_bottom); } ], + + [ [THEME.obj_distribute_h, 0], function() { node_hdistribute(nodes_selecting); } ], + [ [THEME.obj_distribute_v, 0], function() { node_vdistribute(nodes_selecting); } ], + ]); + menu_nodes_blend = menuItem(__txtx("panel_graph_blend_nodes", "Blend nodes"), function() { doBlend(); }, noone, ["Graph", "Blend"]); + menu_nodes_compose = menuItem(__txtx("panel_graph_compose_nodes", "Compose nodes"), function() { doCompose(); }, noone, ["Graph", "Compose"]); + menu_nodes_array = menuItem(__txtx("panel_graph_array_from_nodes", "Array from nodes"), function() { doArray(); }, noone, ["Graph", "Array"]); + menu_nodes_group = menuItem(__txtx("panel_graph_group_nodes", "Group nodes"), function() { doGroup(); }, THEME.group, ["Graph", "Group"]); + menu_nodes_frame = menuItem(__txtx("panel_graph_frame_nodes", "Frame nodes"), function() { doFrame(); }, noone, ["Graph", "Frame"]); + + menu_node_copy_prop = menuItem(__txtx("panel_graph_copy_prop", "Copy all properties"), function() { doCopyProp(); }); + menu_node_paste_prop = menuItem(__txtx("panel_graph_paste_prop", "Paste all properties"), function() { doPasteProp(); }); + + #region node color + function setSelectingNodeColor(color) { + __temp_color = color; + + if(node_hover) node_hover.attributes.color = __temp_color; + array_foreach(nodes_selecting, function(node) { node.attributes.color = __temp_color; }); + } + + var _clrs = COLORS.labels; + var _item = array_create(array_length(_clrs)); + + for( var i = 0, n = array_length(_clrs); i < n; i++ ) { + _item[i] = [ + [ THEME.timeline_color, i > 0, _clrs[i] ], + function(_data) { + setSelectingNodeColor(_data.color); + }, "", { color: i == 0? -1 : _clrs[i] } + ]; + } + + array_push(_item, [ + [ THEME.timeline_color, 2 ], + function(_data) { + colorSelectorCall(node_hover? node_hover.attributes.color : c_white, setSelectingNodeColor); + } + ]); + + menu_node_color = menuItemGroup(__txt("Node Color"), _item); + menu_node_color.spacing = ui(24); + #endregion + + #region junction color + __junction_hovering = noone; + + function setSelectingJuncColor(color) { + if(__junction_hovering == noone) return; + __junction_hovering.setColor(color); + + for(var i = 0; i < array_length(nodes_selecting); i++) { + var _node = nodes_selecting[i]; + + for( var j = 0, m = ds_list_size(_node.inputs); j < m; j++ ) { + var _input = _node.inputs[| j]; + if(_input.value_from == noone) continue; + _input.setColor(color); + } + } + } + + var _clrs = COLORS.labels; + var _item = array_create(array_length(_clrs)); + + for( var i = 0, n = array_length(_clrs); i < n; i++ ) { + _item[i] = [ + [ THEME.timeline_color, i > 0, _clrs[i] ], + function(_data) { + setSelectingJuncColor(_data.color); + }, "", { color: i == 0? -1 : _clrs[i] } + ]; + } + + array_push(_item, [ + [ THEME.timeline_color, 2 ], + function(_data) { + colorSelectorCall(__junction_hovering? __junction_hovering.color : c_white, setSelectingJuncColor); + } + ]); + + menu_junc_color = menuItemGroup(__txt("Connection Color"), _item); + menu_junc_color.spacing = ui(24); + #endregion + + //// ============ Views ============ + function onFocusBegin() { #region PANEL_GRAPH = self; PROJECT = project; @@ -679,20 +696,6 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { nodes_select_drag = 0; } #endregion - function stepBegin() { #region - var gr_x = graph_x * graph_s; - var gr_y = graph_y * graph_s; - var m_x = (mx - gr_x) / graph_s; - var m_y = (my - gr_y) / graph_s; - mouse_graph_x = m_x; - mouse_graph_y = m_y; - - mouse_grid_x = round(m_x / project.graphGrid.size) * project.graphGrid.size; - mouse_grid_y = round(m_y / project.graphGrid.size) * project.graphGrid.size; - - setTitle(); - } #endregion - function focusNode(_node) { #region if(_node == noone) { nodes_selecting = []; @@ -830,6 +833,56 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { graph_y = round(graph_y); } #endregion + //// =========== Context ========== + + function resetContext() { #region + ds_list_clear(node_context); + nodes_list = project.nodes; + toCenterNode(); + } #endregion + + function addContext(node) { #region + var _node = node.getNodeBase(); + setContextFrame(false, _node); + + nodes_list = _node.nodes; + ds_list_add(node_context, _node); + + node_dragging = noone; + nodes_selecting = []; + selection_block = 1; + + toCenterNode(); + } #endregion + + function setContextFrame(dirr, node) { #region + context_framing = true; + context_frame_direct = dirr; + context_frame_progress = 0; + context_frame_sx = w / 2 - 8; + context_frame_sy = h / 2 - 8; + context_frame_ex = context_frame_sx + 16; + context_frame_ey = context_frame_sy + 16; + } #endregion + + //// ============ Step ============ + + function stepBegin() { #region + var gr_x = graph_x * graph_s; + var gr_y = graph_y * graph_s; + var m_x = (mx - gr_x) / graph_s; + var m_y = (my - gr_y) / graph_s; + mouse_graph_x = m_x; + mouse_graph_y = m_y; + + mouse_grid_x = round(m_x / project.graphGrid.size) * project.graphGrid.size; + mouse_grid_y = round(m_y / project.graphGrid.size) * project.graphGrid.size; + + setTitle(); + } #endregion + + //// ============ Draw ============ + function drawGrid() { #region if(!display_parameter.show_grid) return; var gls = project.graphGrid.size; @@ -1167,11 +1220,11 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { if(_hov != noone && is_struct(_hov)) hov = _hov; } - if(value_dragging && connection_draw_mouse != noone) { + if(value_dragging && connection_draw_mouse != noone && !key_mod_press(SHIFT)) { var _cmx = connection_draw_mouse[0]; var _cmy = connection_draw_mouse[1]; var _cmt = connection_draw_target; - + if(array_empty(value_draggings)) value_dragging.drawConnectionMouse(param, _cmx, _cmy, _cmt); else { @@ -1383,11 +1436,136 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { printIf(log, $"Draw selection frame : {get_timer() - t}"); t = get_timer(); } #endregion - function drawJunctionConnect() { #region - - if(value_dragging) { - if(!value_dragging.node.active) { value_dragging = noone; return; } + function connectDraggingValueTo(target) { #region + var _connect = [ 0, noone, noone ]; + if(PANEL_INSPECTOR && PANEL_INSPECTOR.attribute_hovering != noone) { + PANEL_INSPECTOR.attribute_hovering(value_dragging); + + } else if(target != noone) { + + if(target.connect_type == value_dragging.connect_type) { + + if(value_dragging.connect_type == JUNCTION_CONNECT.input) { + if(target.value_from) { + value_dragging.setFrom(target.value_from); + target.removeFrom(); + } + + } else if(value_dragging.connect_type == JUNCTION_CONNECT.output) { + var _tos = target.getJunctionTo(); + + for (var i = 0, n = array_length(_tos); i < n; i++) + _tos[i].setFrom(value_dragging); + } + + } else { + var _addInput = target.value_from == noone && target.connect_type == JUNCTION_CONNECT.input && target.node.auto_input; + + if(value_dragging.connect_type == JUNCTION_CONNECT.input) { + if(array_empty(value_draggings)) { + _connect = [ value_dragging.setFrom(target), value_dragging, target ]; + } else { + for( var i = 0, n = array_length(value_draggings); i < n; i++ ) + value_draggings[i].setFrom(target); + } + + } else if(_addInput && !array_empty(value_draggings)) { + for( var i = 0, n = array_length(value_draggings); i < n; i++ ) + target.node.addInput(value_draggings[i]); + + } else { + _connect = [ target.setFrom(value_dragging), target, value_dragging ]; + } + } + + } else { + if(value_dragging.connect_type == JUNCTION_CONNECT.input) + value_dragging.removeFrom(); + value_dragging.node.triggerRender(); + + if(value_focus != value_dragging) { + var ctx = is_instanceof(frame_hovering, Node_Collection_Inline)? frame_hovering : getCurrentContext(); + if(value_dragging.node.inline_context && !key_mod_press(SHIFT)) + ctx = value_dragging.node.inline_context; + + with(dialogCall(o_dialog_add_node, mouse_mx + 8, mouse_my + 8, { context: ctx })) { + node_target_x = other.mouse_grid_x; + node_target_y = other.mouse_grid_y; + node_called = other.value_dragging; + + alarm[0] = 1; + } + } + } + + value_dragging = noone; + connection_draw_mouse = noone; + + if(_connect[0] == -9) { + if(_connect[1].value_from_loop != noone) + _connect[1].value_from_loop.destroy(); + + var menu = [ + menuItem("Feedback", function(data) { + var junc_in = data.params.junc_in; + var junc_out = data.params.junc_out; + + var feed = nodeBuild("Node_Feedback_Inline", 0, 0); + // feed.connectJunctions(junc_in, junc_out); + feed.attributes.junc_in = [ junc_in .node.node_id, junc_in .index ]; + feed.attributes.junc_out = [ junc_out.node.node_id, junc_out.index ]; + feed.scanJunc(); + + }, THEME.feedback_24,,, { junc_in : _connect[1], junc_out : _connect[2] }), + + menuItem("Loop", function(data) { + var junc_in = data.params.junc_in; + var junc_out = data.params.junc_out; + + var feed = nodeBuild("Node_Iterate_Inline", 0, 0); + feed.attributes.junc_in = [ junc_in .node.node_id, junc_in .index ]; + feed.attributes.junc_out = [ junc_out.node.node_id, junc_out.index ]; + feed.scanJunc(); + + }, THEME.loop_24,,, { junc_in : _connect[1], junc_out : _connect[2] }), + ]; + + menuCall(,,, menu); + } + } #endregion + + function draggingValue() { + if(!value_dragging.node.active) { + value_dragging = noone; + return; + } + + if(key_mod_press(SHIFT)) { + array_push_unique(value_draggings, value_dragging) + + if(value_focus) + array_push_unique(value_draggings, value_focus); + + for (var i = 0, n = array_length(value_draggings); i < n; i++) { + var _v = value_draggings[i]; + var xx = _v.x - 1; + var yy = _v.y - 1; + + shader_set(sh_node_circle); + shader_set_color("color", COLORS._main_accent); + shader_set_f("thickness", 0.05); + shader_set_f("antialias", 0.05); + draw_rectangle(xx - 12 * graph_s, yy - 12 * graph_s, xx + 12 * graph_s, yy + 12 * graph_s, false); + shader_reset(); + } + + if(mouse_release(mb_left)) { + value_dragging = noone; + connection_draw_mouse = noone; + } + + } else { var xx = value_dragging.x; var yy = value_dragging.y; var _mx = mx; @@ -1430,105 +1608,17 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { if(_inline_ctx && !key_mod_press(SHIFT)) _inline_ctx.addPoint(mouse_graph_x, mouse_graph_y); - if(mouse_release(mb_left)) { //// CONNECT junction - var _connect = [ 0, noone, noone ]; - - if(PANEL_INSPECTOR && PANEL_INSPECTOR.attribute_hovering != noone) { - PANEL_INSPECTOR.attribute_hovering(value_dragging); - - } else if(target != noone) { - - if(target.connect_type == value_dragging.connect_type) { - - if(value_dragging.connect_type == JUNCTION_CONNECT.input) { - if(target.value_from) { - value_dragging.setFrom(target.value_from); - target.removeFrom(); - } - - } else if(value_dragging.connect_type == JUNCTION_CONNECT.output) { - var _tos = target.getJunctionTo(); - - for (var i = 0, n = array_length(_tos); i < n; i++) - _tos[i].setFrom(value_dragging); - } - - } else { - var _addInput = target.value_from == noone && target.connect_type == JUNCTION_CONNECT.input && target.node.auto_input; - - if(value_dragging.connect_type == JUNCTION_CONNECT.input) { - if(array_empty(value_draggings)) { - _connect = [ value_dragging.setFrom(target), value_dragging, target ]; - } else { - for( var i = 0, n = array_length(value_draggings); i < n; i++ ) - value_draggings[i].setFrom(target); - } - - } else if(_addInput && !array_empty(value_draggings)) { - for( var i = 0, n = array_length(value_draggings); i < n; i++ ) - target.node.addInput(value_draggings[i]); - - } else { - _connect = [ target.setFrom(value_dragging), target, value_dragging ]; - } - } - - } else { - if(value_dragging.connect_type == JUNCTION_CONNECT.input) - value_dragging.removeFrom(); - value_dragging.node.triggerRender(); - - if(value_focus != value_dragging) { - var ctx = is_instanceof(frame_hovering, Node_Collection_Inline)? frame_hovering : getCurrentContext(); - if(value_dragging.node.inline_context && !key_mod_press(SHIFT)) - ctx = value_dragging.node.inline_context; - - with(dialogCall(o_dialog_add_node, mouse_mx + 8, mouse_my + 8, { context: ctx })) { - node_target_x = other.mouse_grid_x; - node_target_y = other.mouse_grid_y; - node_called = other.value_dragging; - - alarm[0] = 1; - } - } - } - - value_dragging = noone; - connection_draw_mouse = noone; - - if(_connect[0] == -9) { - if(_connect[1].value_from_loop != noone) - _connect[1].value_from_loop.destroy(); - - var menu = [ - menuItem("Feedback", function(data) { - var junc_in = data.params.junc_in; - var junc_out = data.params.junc_out; - - var feed = nodeBuild("Node_Feedback_Inline", 0, 0); - // feed.connectJunctions(junc_in, junc_out); - feed.attributes.junc_in = [ junc_in .node.node_id, junc_in .index ]; - feed.attributes.junc_out = [ junc_out.node.node_id, junc_out.index ]; - feed.scanJunc(); - - }, THEME.feedback_24,,, { junc_in : _connect[1], junc_out : _connect[2] }), - - menuItem("Loop", function(data) { - var junc_in = data.params.junc_in; - var junc_out = data.params.junc_out; - - var feed = nodeBuild("Node_Iterate_Inline", 0, 0); - feed.attributes.junc_in = [ junc_in .node.node_id, junc_in .index ]; - feed.attributes.junc_out = [ junc_out.node.node_id, junc_out.index ]; - feed.scanJunc(); - - }, THEME.loop_24,,, { junc_in : _connect[1], junc_out : _connect[2] }), - ]; - - menuCall(,,, menu); - } - } - } else if(value_focus && mouse_press(mb_left, pFOCUS) && !key_mod_press(ALT)) { + if(mouse_release(mb_left)) + connectDraggingValueTo(target); + } + } + + function drawJunctionConnect() { #region + + if(value_dragging) + draggingValue(); + + if(value_dragging == noone && value_focus && mouse_press(mb_left, pFOCUS) && !key_mod_press(ALT)) { value_dragging = value_focus; value_draggings = []; @@ -1570,7 +1660,9 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { ds_priority_destroy(_jlist); } - } else { + } + + if(value_dragging.connect_type == JUNCTION_CONNECT.input) { if(key_mod_press(CTRL) && value_dragging.value_from) { var fr = value_dragging.value_from; value_dragging.removeFrom(); @@ -1581,12 +1673,10 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { nodes_selecting_jun = array_clone(nodes_selecting, 1); - #region draw junction name - var gr_x = graph_x * graph_s; - var gr_y = graph_y * graph_s; - for(var i = 0; i < ds_list_size(nodes_list); i++) - nodes_list[| i].drawJunctionNames(gr_x, gr_y, mx, my, graph_s); - #endregion + var gr_x = graph_x * graph_s; + var gr_y = graph_y * graph_s; + for(var i = 0; i < ds_list_size(nodes_list); i++) + nodes_list[| i].drawJunctionNames(gr_x, gr_y, mx, my, graph_s); } #endregion @@ -1825,37 +1915,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { draw_set_alpha(1); } #endregion - function resetContext() { #region - ds_list_clear(node_context); - nodes_list = project.nodes; - toCenterNode(); - } #endregion - - function addContext(node) { #region - var _node = node.getNodeBase(); - setContextFrame(false, _node); - - nodes_list = _node.nodes; - ds_list_add(node_context, _node); - - node_dragging = noone; - nodes_selecting = []; - selection_block = 1; - - toCenterNode(); - } #endregion - - function setContextFrame(dirr, node) { #region - context_framing = true; - context_frame_direct = dirr; - context_frame_progress = 0; - context_frame_sx = w / 2 - 8; - context_frame_sy = h / 2 - 8; - context_frame_ex = context_frame_sx + 16; - context_frame_ey = context_frame_sy + 16; - } #endregion - - function drawContent(panel) { #region ======================================= MAIN DRAW ======================================= + function drawContent(panel) { #region ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// MAIN DRAW if(!project.active) return; dragGraph(); @@ -1910,381 +1970,381 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { } } #endregion - #region ++++++++++++++++ node manipulation ++++++++++++++++ - function createNodeHotkey(_node) { #region - var node = nodeBuild(_node, mouse_grid_x, mouse_grid_y); + //// ============ Action ============ + + function createNodeHotkey(_node) { #region + var node = nodeBuild(_node, mouse_grid_x, mouse_grid_y); + + if(value_dragging) { - if(value_dragging) { - - if(value_dragging.connect_type == JUNCTION_CONNECT.output) { - if(node.input_display_list != -1) { - for (var i = 0, n = array_length(node.input_display_list); i < n; i++) { - if(!is_real(node.input_display_list[i])) continue; - if(node.inputs[| node.input_display_list[i]].setFrom(value_dragging)) break; - } - - } else { - for (var i = 0, n = ds_list_size(node.inputs); i < n; i++) - if(node.inputs[| i].setFrom(value_dragging)) break; + if(value_dragging.connect_type == JUNCTION_CONNECT.output) { + if(node.input_display_list != -1) { + for (var i = 0, n = array_length(node.input_display_list); i < n; i++) { + if(!is_real(node.input_display_list[i])) continue; + if(node.inputs[| node.input_display_list[i]].setFrom(value_dragging)) break; } - - } else if(value_dragging.connect_type == JUNCTION_CONNECT.input) { - - for (var i = 0, n = ds_list_size(node.outputs); i < n; i++) - if(value_dragging.setFrom(node.outputs[| i])) break; + + } else { + for (var i = 0, n = ds_list_size(node.inputs); i < n; i++) + if(node.inputs[| i].setFrom(value_dragging)) break; } - value_dragging = noone; - } - } #endregion - - function doTransform() { #region - for( var i = 0; i < array_length(nodes_selecting); i++ ) { - var node = nodes_selecting[i]; - if(ds_list_empty(node.outputs)) continue; + } else if(value_dragging.connect_type == JUNCTION_CONNECT.input) { - var _o = node.outputs[| 0]; - if(_o.type == VALUE_TYPE.surface || _o.type == VALUE_TYPE.dynaSurface) { - var tr = nodeBuild("Node_Transform", node.x + node.w + 64, node.y); - tr.inputs[| 0].setFrom(_o); - } + for (var i = 0, n = ds_list_size(node.outputs); i < n; i++) + if(value_dragging.setFrom(node.outputs[| i])) break; } - } #endregion + + value_dragging = noone; + } + } #endregion - function doDuplicate() { #region - if(array_empty(nodes_selecting)) return; + function doTransform() { #region + for( var i = 0; i < array_length(nodes_selecting); i++ ) { + var node = nodes_selecting[i]; + if(ds_list_empty(node.outputs)) continue; - var _map = {}; - var _pmap = {}; - var _node = []; - - for(var i = 0; i < array_length(nodes_selecting); i++) { - var _n = nodes_selecting[i]; - - if(_n.inline_parent_object != "") - _pmap[$ _n.inline_context.node_id] = _n.inline_parent_object; - - SAVE_NODE(_node, _n,,,, getCurrentContext()); + var _o = node.outputs[| 0]; + if(_o.type == VALUE_TYPE.surface || _o.type == VALUE_TYPE.dynaSurface) { + var tr = nodeBuild("Node_Transform", node.x + node.w + 64, node.y); + tr.inputs[| 0].setFrom(_o); } - - _map.nodes = _node; - - ds_map_clear(APPEND_MAP); - ds_list_clear(APPEND_LIST); - - CLONING = true; - var _pmap_keys = variable_struct_get_names(_pmap); - for( var i = 0, n = array_length(_pmap_keys); i < n; i++ ) { - var _pkey = _pmap_keys[i]; - var _original = PROJECT.nodeMap[? _pkey]; - var _nodeS = _pmap[$ _pkey]; - - CLONING_GROUP = _original; - var _newGroup = nodeBuild(_nodeS, _original.x, _original.y); - APPEND_MAP[? _pkey] = _newGroup; - } - - APPEND_LIST = __APPEND_MAP(_map,, APPEND_LIST); - recordAction(ACTION_TYPE.collection_loaded, array_create_from_list(APPEND_LIST)); - CLONING = false; - - if(ds_list_size(APPEND_LIST) == 0) return; - - for(var i = 0; i < array_length(nodes_selecting); i++) { - var _orignal = nodes_selecting[i]; - if(!_orignal.clonable) continue; - - var _cloned = ds_map_try_get(APPEND_MAP, _orignal.node_id, ""); - var _inline_ctx = _orignal.inline_context; - - if(_inline_ctx != noone && _cloned != "") { - _inline_ctx = ds_map_try_get(APPEND_MAP, _inline_ctx.node_id, _inline_ctx); - _inline_ctx.addNode(PROJECT.nodeMap[? _cloned]); - } - } - - var x0 = 99999999; - var y0 = 99999999; - for(var i = 0; i < ds_list_size(APPEND_LIST); i++) { - var _node = APPEND_LIST[| i]; - - x0 = min(x0, _node.x); - y0 = min(y0, _node.y); - } - - node_dragging = APPEND_LIST[| 0]; - node_drag_mx = x0; node_drag_my = y0; - node_drag_sx = x0; node_drag_sy = y0; - node_drag_ox = x0; node_drag_oy = y0; - - nodes_selecting = array_create_from_list(APPEND_LIST); - } #endregion + } + } #endregion - function doInstance() { #region - var node = getFocusingNode(); - if(node == noone) return; + function doDuplicate() { #region + if(array_empty(nodes_selecting)) return; - if(node.instanceBase == noone) { - node.isInstancer = true; + var _map = {}; + var _pmap = {}; + var _node = []; + + for(var i = 0; i < array_length(nodes_selecting); i++) { + var _n = nodes_selecting[i]; - CLONING = true; - var _type = instanceof(node); - var _node = nodeBuild(_type, x, y); - CLONING = false; + if(_n.inline_parent_object != "") + _pmap[$ _n.inline_context.node_id] = _n.inline_parent_object; - _node.setInstance(node); + SAVE_NODE(_node, _n,,,, getCurrentContext()); + } + + _map.nodes = _node; + + ds_map_clear(APPEND_MAP); + ds_list_clear(APPEND_LIST); + + CLONING = true; + var _pmap_keys = variable_struct_get_names(_pmap); + for( var i = 0, n = array_length(_pmap_keys); i < n; i++ ) { + var _pkey = _pmap_keys[i]; + var _original = PROJECT.nodeMap[? _pkey]; + var _nodeS = _pmap[$ _pkey]; + + CLONING_GROUP = _original; + var _newGroup = nodeBuild(_nodeS, _original.x, _original.y); + APPEND_MAP[? _pkey] = _newGroup; } + + APPEND_LIST = __APPEND_MAP(_map,, APPEND_LIST); + recordAction(ACTION_TYPE.collection_loaded, array_create_from_list(APPEND_LIST)); + CLONING = false; - var _nodeNew = _node.clone(); + if(ds_list_size(APPEND_LIST) == 0) return; - node_dragging = _nodeNew; - node_drag_mx = _nodeNew.x; node_drag_my = _nodeNew.y; - node_drag_sx = _nodeNew.x; node_drag_sy = _nodeNew.y; - node_drag_ox = _nodeNew.x; node_drag_oy = _nodeNew.y; - } #endregion + for(var i = 0; i < array_length(nodes_selecting); i++) { + var _orignal = nodes_selecting[i]; + if(!_orignal.clonable) continue; + + var _cloned = ds_map_try_get(APPEND_MAP, _orignal.node_id, ""); + var _inline_ctx = _orignal.inline_context; + + if(_inline_ctx != noone && _cloned != "") { + _inline_ctx = ds_map_try_get(APPEND_MAP, _inline_ctx.node_id, _inline_ctx); + _inline_ctx.addNode(PROJECT.nodeMap[? _cloned]); + } + } + + var x0 = 99999999; + var y0 = 99999999; + for(var i = 0; i < ds_list_size(APPEND_LIST); i++) { + var _node = APPEND_LIST[| i]; + + x0 = min(x0, _node.x); + y0 = min(y0, _node.y); + } - function doCopy() { #region - if(array_empty(nodes_selecting)) return; - clipboard_set_text(""); + node_dragging = APPEND_LIST[| 0]; + node_drag_mx = x0; node_drag_my = y0; + node_drag_sx = x0; node_drag_sy = y0; + node_drag_ox = x0; node_drag_oy = y0; - var _map = {}; - _map.nodes = []; - for(var i = 0; i < array_length(nodes_selecting); i++) - SAVE_NODE(_map.nodes, nodes_selecting[i],,,, getCurrentContext()); - - clipboard_set_text(json_stringify_minify(_map)); - } #endregion + nodes_selecting = array_create_from_list(APPEND_LIST); + } #endregion + + function doInstance() { #region + var node = getFocusingNode(); + if(node == noone) return; - function doPaste() { #region - var txt = clipboard_get_text(); - var _map = json_try_parse(txt, noone); - - if(txt == "") return; - - if(is_struct(_map)) { - ds_map_clear(APPEND_MAP); - APPENDING = true; - CLONING = true; - var _app = __APPEND_MAP(_map); - APPENDING = false; - CLONING = false; - - if(_app == noone) - return; - - if(ds_list_size(_app) == 0) { - ds_list_destroy(_app); - return; - } - - var x0 = 99999999; - var y0 = 99999999; - for(var i = 0; i < ds_list_size(_app); i++) { - var _node = _app[| i]; - - x0 = min(x0, _node.x); - y0 = min(y0, _node.y); - } + if(node.instanceBase == noone) { + node.isInstancer = true; - node_dragging = _app[| 0]; - node_drag_mx = x0; node_drag_my = y0; - node_drag_sx = x0; node_drag_sy = y0; - node_drag_ox = x0; node_drag_oy = y0; + CLONING = true; + var _type = instanceof(node); + var _node = nodeBuild(_type, x, y); + CLONING = false; - nodes_selecting = array_create_from_list(_app); + _node.setInstance(node); + } + + var _nodeNew = _node.clone(); + + node_dragging = _nodeNew; + node_drag_mx = _nodeNew.x; node_drag_my = _nodeNew.y; + node_drag_sx = _nodeNew.x; node_drag_sy = _nodeNew.y; + node_drag_ox = _nodeNew.x; node_drag_oy = _nodeNew.y; + } #endregion + + function doCopy() { #region + if(array_empty(nodes_selecting)) return; + clipboard_set_text(""); + + var _map = {}; + _map.nodes = []; + for(var i = 0; i < array_length(nodes_selecting); i++) + SAVE_NODE(_map.nodes, nodes_selecting[i],,,, getCurrentContext()); + + clipboard_set_text(json_stringify_minify(_map)); + } #endregion + + function doPaste() { #region + var txt = clipboard_get_text(); + var _map = json_try_parse(txt, noone); + + if(txt == "") return; + + if(is_struct(_map)) { + ds_map_clear(APPEND_MAP); + APPENDING = true; + CLONING = true; + var _app = __APPEND_MAP(_map); + APPENDING = false; + CLONING = false; + + if(_app == noone) + return; + + if(ds_list_size(_app) == 0) { + ds_list_destroy(_app); return; } - if(filename_ext(txt) == ".pxc") - APPEND(txt); - else if(filename_ext(txt) == ".pxcc") - APPEND(txt); - else if(filename_ext(txt) == ".png") { - if(file_exists_empty(txt)) { - Node_create_Image_path(0, 0, txt); - return; - } - - var path = TEMPDIR + "url_pasted_" + string(irandom_range(100000, 999999)) + ".png"; - var img = http_get_file(txt, path); - CLONING = true; - var node = Node_create_Image(0, 0); - CLONING = false; - var args = [node, path]; - - global.FILE_LOAD_ASYNC[? img] = [ function(args) { - args[0].inputs[| 0].setValue(args[1]); - args[0].doUpdate(); - }, args]; - } - } #endregion - - function doBlend() { #region - if(array_length(nodes_selecting) != 2) return; + var x0 = 99999999; + var y0 = 99999999; + for(var i = 0; i < ds_list_size(_app); i++) { + var _node = _app[| i]; - var _n0 = nodes_selecting[0].y < nodes_selecting[1].y? nodes_selecting[0] : nodes_selecting[1]; - var _n1 = nodes_selecting[0].y < nodes_selecting[1].y? nodes_selecting[1] : nodes_selecting[0]; - - var cx = max(_n0.x, _n1.x) + 160; - var cy = round((_n0.y + _n1.y) / 2 / 32) * 32; - - var _j0 = _n0.outputs[| 0]; - var _j1 = _n1.outputs[| 0]; - - if(_j0.type == VALUE_TYPE.surface && _j1.type == VALUE_TYPE.surface) { - var _blend = new Node_Blend(cx, cy, getCurrentContext()); - _blend.inputs[| 0].setFrom(_j0); - _blend.inputs[| 1].setFrom(_j1); - - } else if((_j0.type == VALUE_TYPE.integer || _j0.type == VALUE_TYPE.float) && (_j1.type == VALUE_TYPE.integer || _j1.type == VALUE_TYPE.float)) { - var _blend = new Node_Math(cx, cy, getCurrentContext()); - _blend.inputs[| 1].setFrom(_j0); - _blend.inputs[| 2].setFrom(_j1); - - } - - nodes_selecting = []; - } #endregion - - function doCompose() { #region - if(array_empty(nodes_selecting)) return; - - var cx = nodes_selecting[0].x; - var cy = 0; - var pr = ds_priority_create(); - var amo = array_length(nodes_selecting); - var len = 0; - - for(var i = 0; i < amo; i++) { - var _node = nodes_selecting[i]; - if(ds_list_size(_node.outputs) == 0) continue; - - if(_node.outputs[| 0].type != VALUE_TYPE.surface) continue; - - cx = max(cx, _node.x); - cy += _node.y; - - ds_priority_add(pr, _node, _node.y); - len++; - } - - cx = cx + 160; - cy = round(cy / len / 32) * 32; - - var _compose = new Node_Composite(cx, cy, getCurrentContext()); - - repeat(len) { - var _node = ds_priority_delete_min(pr); - _compose.addInput(_node.outputs[| 0]); - } - - nodes_selecting = []; - ds_priority_destroy(pr); - } #endregion - - function doArray() { #region - if(array_empty(nodes_selecting)) return; - - var cx = nodes_selecting[0].x; - var cy = 0; - var pr = ds_priority_create(); - var amo = array_length(nodes_selecting); - var len = 0; - - for(var i = 0; i < amo; i++) { - var _node = nodes_selecting[i]; - if(ds_list_size(_node.outputs) == 0) continue; - - cx = max(cx, _node.x); - cy += _node.y; - - ds_priority_add(pr, _node, _node.y); - len++; - } - - cx = cx + 160; - cy = round(cy / len / 32) * 32; - - var _array = nodeBuild("Node_Array", cx, cy); - - repeat(len) { - var _node = ds_priority_delete_min(pr); - _array.addInput(_node.outputs[| 0]); - } - - nodes_selecting = []; - ds_priority_destroy(pr); - } #endregion - - function doGroup() { #region - if(array_empty(nodes_selecting)) return; - groupNodes(nodes_selecting); - } #endregion - - function doUngroup() { #region - var _node = getFocusingNode(); - if(_node == noone) return; - if(!is_instanceof(_node, Node_Collection) || !_node.ungroupable) return; - - upgroupNode(_node); - } #endregion - - function doFrame() { #region - var x0 = 999999, y0 = 999999, x1 = -999999, y1 = -999999; - - for( var i = 0; i < array_length(nodes_selecting); i++ ) { - var _node = nodes_selecting[i]; x0 = min(x0, _node.x); y0 = min(y0, _node.y); - x1 = max(x1, _node.x + _node.w); - y1 = max(y1, _node.y + _node.h); } - - x0 -= 64; - y0 -= 64; - x1 += 64; - y1 += 64; - - var f = new Node_Frame(x0, y0, getCurrentContext()); - f.inputs[| 0].setValue([x1 - x0, y1 - y0]); - } #endregion - function doDelete(_merge = false) { #region - __temp_merge = _merge; - array_foreach(nodes_selecting, function(node) { if(node.manual_deletable) node.destroy(__temp_merge); }); - nodes_selecting = []; - } #endregion + node_dragging = _app[| 0]; + node_drag_mx = x0; node_drag_my = y0; + node_drag_sx = x0; node_drag_sy = y0; + node_drag_ox = x0; node_drag_oy = y0; - node_prop_clipboard = noone; - function doCopyProp() { #region - if(node_hover == noone) return; - node_prop_clipboard = node_hover; - } #endregion - - function doPasteProp() { #region - if(node_hover == noone) return; - if(node_prop_clipboard == noone) return; - if(!node_prop_clipboard.active) return; - - if(instanceof(node_prop_clipboard) != instanceof(node_hover)) return; - - var _vals = []; - for( var i = 0, n = ds_list_size(node_prop_clipboard.inputs); i < n; i++ ) { - var _inp = node_prop_clipboard.inputs[| i]; - _vals[i] = _inp.serialize(); + nodes_selecting = array_create_from_list(_app); + return; + } + + if(filename_ext(txt) == ".pxc") + APPEND(txt); + else if(filename_ext(txt) == ".pxcc") + APPEND(txt); + else if(filename_ext(txt) == ".png") { + if(file_exists_empty(txt)) { + Node_create_Image_path(0, 0, txt); + return; } + + var path = TEMPDIR + "url_pasted_" + string(irandom_range(100000, 999999)) + ".png"; + var img = http_get_file(txt, path); + CLONING = true; + var node = Node_create_Image(0, 0); + CLONING = false; + var args = [node, path]; + + global.FILE_LOAD_ASYNC[? img] = [ function(args) { + args[0].inputs[| 0].setValue(args[1]); + args[0].doUpdate(); + }, args]; + } + } #endregion + + function doBlend() { #region + if(array_length(nodes_selecting) != 2) return; + + var _n0 = nodes_selecting[0].y < nodes_selecting[1].y? nodes_selecting[0] : nodes_selecting[1]; + var _n1 = nodes_selecting[0].y < nodes_selecting[1].y? nodes_selecting[1] : nodes_selecting[0]; + + var cx = max(_n0.x, _n1.x) + 160; + var cy = round((_n0.y + _n1.y) / 2 / 32) * 32; + + var _j0 = _n0.outputs[| 0]; + var _j1 = _n1.outputs[| 0]; - for( var i = 0, n = ds_list_size(node_hover.inputs); i < n; i++ ) { - var _inp = node_hover.inputs[| i]; - if(_inp.value_from != noone) continue; - - _inp.applyDeserialize(_vals[i]); - } + if(_j0.type == VALUE_TYPE.surface && _j1.type == VALUE_TYPE.surface) { + var _blend = new Node_Blend(cx, cy, getCurrentContext()); + _blend.inputs[| 0].setFrom(_j0); + _blend.inputs[| 1].setFrom(_j1); - node_hover.clearInputCache(); - RENDER_PARTIAL - } #endregion - #endregion + } else if((_j0.type == VALUE_TYPE.integer || _j0.type == VALUE_TYPE.float) && (_j1.type == VALUE_TYPE.integer || _j1.type == VALUE_TYPE.float)) { + var _blend = new Node_Math(cx, cy, getCurrentContext()); + _blend.inputs[| 1].setFrom(_j0); + _blend.inputs[| 2].setFrom(_j1); + + } + + nodes_selecting = []; + } #endregion + + function doCompose() { #region + if(array_empty(nodes_selecting)) return; + + var cx = nodes_selecting[0].x; + var cy = 0; + var pr = ds_priority_create(); + var amo = array_length(nodes_selecting); + var len = 0; + + for(var i = 0; i < amo; i++) { + var _node = nodes_selecting[i]; + if(ds_list_size(_node.outputs) == 0) continue; + + if(_node.outputs[| 0].type != VALUE_TYPE.surface) continue; + + cx = max(cx, _node.x); + cy += _node.y; + + ds_priority_add(pr, _node, _node.y); + len++; + } + + cx = cx + 160; + cy = round(cy / len / 32) * 32; + + var _compose = new Node_Composite(cx, cy, getCurrentContext()); + + repeat(len) { + var _node = ds_priority_delete_min(pr); + _compose.addInput(_node.outputs[| 0]); + } + + nodes_selecting = []; + ds_priority_destroy(pr); + } #endregion + + function doArray() { #region + if(array_empty(nodes_selecting)) return; + + var cx = nodes_selecting[0].x; + var cy = 0; + var pr = ds_priority_create(); + var amo = array_length(nodes_selecting); + var len = 0; + + for(var i = 0; i < amo; i++) { + var _node = nodes_selecting[i]; + if(ds_list_size(_node.outputs) == 0) continue; + + cx = max(cx, _node.x); + cy += _node.y; + + ds_priority_add(pr, _node, _node.y); + len++; + } + + cx = cx + 160; + cy = round(cy / len / 32) * 32; + + var _array = nodeBuild("Node_Array", cx, cy); + + repeat(len) { + var _node = ds_priority_delete_min(pr); + _array.addInput(_node.outputs[| 0]); + } + + nodes_selecting = []; + ds_priority_destroy(pr); + } #endregion + + function doGroup() { #region + if(array_empty(nodes_selecting)) return; + groupNodes(nodes_selecting); + } #endregion + + function doUngroup() { #region + var _node = getFocusingNode(); + if(_node == noone) return; + if(!is_instanceof(_node, Node_Collection) || !_node.ungroupable) return; + + upgroupNode(_node); + } #endregion + + function doFrame() { #region + var x0 = 999999, y0 = 999999, x1 = -999999, y1 = -999999; + + for( var i = 0; i < array_length(nodes_selecting); i++ ) { + var _node = nodes_selecting[i]; + x0 = min(x0, _node.x); + y0 = min(y0, _node.y); + x1 = max(x1, _node.x + _node.w); + y1 = max(y1, _node.y + _node.h); + } + + x0 -= 64; + y0 -= 64; + x1 += 64; + y1 += 64; + + var f = new Node_Frame(x0, y0, getCurrentContext()); + f.inputs[| 0].setValue([x1 - x0, y1 - y0]); + } #endregion + + function doDelete(_merge = false) { #region + __temp_merge = _merge; + array_foreach(nodes_selecting, function(node) { if(node.manual_deletable) node.destroy(__temp_merge); }); + nodes_selecting = []; + } #endregion + + node_prop_clipboard = noone; + function doCopyProp() { #region + if(node_hover == noone) return; + node_prop_clipboard = node_hover; + } #endregion + + function doPasteProp() { #region + if(node_hover == noone) return; + if(node_prop_clipboard == noone) return; + if(!node_prop_clipboard.active) return; + + if(instanceof(node_prop_clipboard) != instanceof(node_hover)) return; + + var _vals = []; + for( var i = 0, n = ds_list_size(node_prop_clipboard.inputs); i < n; i++ ) { + var _inp = node_prop_clipboard.inputs[| i]; + _vals[i] = _inp.serialize(); + } + + for( var i = 0, n = ds_list_size(node_hover.inputs); i < n; i++ ) { + var _inp = node_hover.inputs[| i]; + if(_inp.value_from != noone) continue; + + _inp.applyDeserialize(_vals[i]); + } + + node_hover.clearInputCache(); + RENDER_PARTIAL + } #endregion function dropFile(path) { #region if(node_hovering && is_callable(node_hovering.on_drop_file)) @@ -2400,6 +2460,8 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { static onFullScreen = function() { run_in(1, fullView); } + //// =========== Serialize =========== + static serialize = function() { return { name: instanceof(self), diff --git a/scripts/panel_palette/panel_palette.gml b/scripts/panel_palette/panel_palette.gml index ca2b91261..2bc86d6d7 100644 --- a/scripts/panel_palette/panel_palette.gml +++ b/scripts/panel_palette/panel_palette.gml @@ -12,6 +12,7 @@ function Panel_Palette() : PanelContent() constructor { drag_from_self = false; __save_palette_data = []; + view_label = true; menu_refresh = menuItem(__txt("Refresh"), function() { __initPalette(); }); menu_add = menuItem(__txt("Add"), function(_dat) { @@ -37,6 +38,7 @@ function Panel_Palette() : PanelContent() constructor { }).setIsShelf(); menu_stretch = menuItem(__txt("Stretch"), function() { PREFERENCES.palette_stretch = !PREFERENCES.palette_stretch; }, noone, noone, function() /*=>*/ {return PREFERENCES.palette_stretch}); + menu_mini = menuItem(__txt("Label"), function() { view_label = !view_label; }, noone, noone, function() /*=>*/ {return view_label}); function onResize() { sp_palettes.resize(w - ui(padding + padding), h - ui(padding + padding)); @@ -55,7 +57,7 @@ function Panel_Palette() : PanelContent() constructor { if(mouse_wheel_down()) grid_size_to = clamp(grid_size_to - ui(4), ui(8), ui(32)); if(mouse_wheel_up()) grid_size_to = clamp(grid_size_to + ui(4), ui(8), ui(32)); } - grid_size = lerp_float(grid_size, grid_size_to, 3); + grid_size = lerp_float(grid_size, grid_size_to, 10); if(DRAGGING && DRAGGING.type == "Palette" && !drag_from_self) { var _add_h = ui(28); @@ -100,8 +102,9 @@ function Panel_Palette() : PanelContent() constructor { if(mouse_release(mb_left)) drag_from_self = false; var right_clicked = false; - var pd = lerp(ui(4), ui(10), (grid_size - ui(8)) / (ui(32) - ui(8))); + var pd = view_label? lerp(ui(4), ui(10), (grid_size - ui(8)) / (ui(32) - ui(8))) : ui(3); var param = { color: cur, stretch : PREFERENCES.palette_stretch, mx : _m[0], my : _m[1] }; + var _font = grid_size > ui(12)? f_p2 : f_p3; for(var i = 0; i < array_length(PALETTES); i++) { var preset = PALETTES[i]; @@ -109,19 +112,28 @@ function Panel_Palette() : PanelContent() constructor { var col = floor((ww - pd * 2) / _gs); var row = ceil(pre_amo / col); - _height = ui(21) + row * _gs + pd; - + var _th = line_get_height(_font); + var _phh = row * _gs; + var _height = view_label? _th + _phh + pd : _phh + pd * 2; + var _paly = view_label? yy + _th : yy + pd; + var _palh = _gs; var isHover = pHOVER && point_in_rectangle(_m[0], _m[1], 0, max(0, yy), ww, min(sp_palettes.h, yy + _height)); draw_sprite_stretched(THEME.ui_panel_bg, 3, 0, yy, ww, _height); - if(isHover) - draw_sprite_stretched_ext(THEME.node_active, 1, 0, yy, ww, _height, COLORS._main_accent, 1); + if(isHover) draw_sprite_stretched_ext(THEME.node_active, 1, 0, yy, ww, _height, COLORS._main_accent, 1); - draw_set_text(f_p2, fa_left, fa_top, COLORS._main_text_sub); - draw_text(pd, yy + ui(2), preset.name); - var _palRes = drawPaletteGrid(preset.palette, pd, yy + ui(20), ww - pd * 2, _gs, param); + var _palRes = drawPaletteGrid(preset.palette, pd, _paly, ww - pd * 2, _palh, param); + if(view_label) { + draw_set_text(_font, fa_left, fa_top, COLORS._main_text_sub); + draw_text_add(pd, yy + ui(2), preset.name); + } if(isHover) { + if(_palRes.hoverIndex > noone) { + var _box = _palRes.hoverBBOX; + draw_sprite_stretched_add(THEME.menu_button_mask, 1, _box[0] + 1, _box[1] + 1, _box[2] - 2, _box[3] - 2, c_white, 0.3); + } + if(mouse_press(mb_left, pFOCUS)) { if(_palRes.hoverIndex > noone) { CURRENT_COLOR = _palRes.hoverColor; @@ -159,6 +171,7 @@ function Panel_Palette() : PanelContent() constructor { }), -1, menu_stretch, + menu_mini, ]); } } @@ -173,6 +186,7 @@ function Panel_Palette() : PanelContent() constructor { menu_refresh, -1, menu_stretch, + menu_mini, ]); } diff --git a/shaders/sh_node_arc/sh_node_arc.yy b/shaders/sh_node_arc/sh_node_arc.yy index 732cd322b..5b4b3c1d3 100644 --- a/shaders/sh_node_arc/sh_node_arc.yy +++ b/shaders/sh_node_arc/sh_node_arc.yy @@ -4,7 +4,7 @@ "name":"sh_node_arc", "parent":{ "name":"node", - "path":"folders/widgets/node.yy", + "path":"folders/shader/UI/node.yy", }, "resourceType":"GMShader", "resourceVersion":"2.0", diff --git a/shaders/sh_node_circle/sh_node_circle.fsh b/shaders/sh_node_circle/sh_node_circle.fsh index daf7b0ef7..eb846db69 100644 --- a/shaders/sh_node_circle/sh_node_circle.fsh +++ b/shaders/sh_node_circle/sh_node_circle.fsh @@ -2,14 +2,18 @@ varying vec2 v_vTexcoord; varying vec4 v_vColour; uniform vec4 color; +uniform float thickness; +uniform float antialias; void main() { float dist = abs(length(v_vTexcoord - .5) * 2. - 0.9); float a; - vec4 c = vec4(0.); + vec4 c = vec4(0.); + float th = thickness == 0.? 0.05 : thickness; + float aa = antialias == 0.? 0.05 : antialias; - a = smoothstep(.1, .05, dist); + a = smoothstep(th + antialias, th, dist); c = mix(c, color, a); gl_FragColor = c; diff --git a/shaders/sh_node_circle/sh_node_circle.yy b/shaders/sh_node_circle/sh_node_circle.yy index 04edd5e3a..dc21c271a 100644 --- a/shaders/sh_node_circle/sh_node_circle.yy +++ b/shaders/sh_node_circle/sh_node_circle.yy @@ -4,7 +4,7 @@ "name":"sh_node_circle", "parent":{ "name":"node", - "path":"folders/widgets/node.yy", + "path":"folders/shader/UI/node.yy", }, "resourceType":"GMShader", "resourceVersion":"2.0", diff --git a/shaders/sh_node_widget_rotator/sh_node_widget_rotator.yy b/shaders/sh_node_widget_rotator/sh_node_widget_rotator.yy index e58120aae..8596b5fdf 100644 --- a/shaders/sh_node_widget_rotator/sh_node_widget_rotator.yy +++ b/shaders/sh_node_widget_rotator/sh_node_widget_rotator.yy @@ -4,7 +4,7 @@ "name":"sh_node_widget_rotator", "parent":{ "name":"node", - "path":"folders/widgets/node.yy", + "path":"folders/shader/UI/node.yy", }, "resourceType":"GMShader", "resourceVersion":"2.0", diff --git a/shaders/sh_node_widget_scalar/sh_node_widget_scalar.yy b/shaders/sh_node_widget_scalar/sh_node_widget_scalar.yy index 5af30d4e9..b81d528c9 100644 --- a/shaders/sh_node_widget_scalar/sh_node_widget_scalar.yy +++ b/shaders/sh_node_widget_scalar/sh_node_widget_scalar.yy @@ -4,7 +4,7 @@ "name":"sh_node_widget_scalar", "parent":{ "name":"node", - "path":"folders/widgets/node.yy", + "path":"folders/shader/UI/node.yy", }, "resourceType":"GMShader", "resourceVersion":"2.0", diff --git a/shaders/sh_node_widget_scalar_cross/sh_node_widget_scalar_cross.yy b/shaders/sh_node_widget_scalar_cross/sh_node_widget_scalar_cross.yy index 369eab89a..479db7683 100644 --- a/shaders/sh_node_widget_scalar_cross/sh_node_widget_scalar_cross.yy +++ b/shaders/sh_node_widget_scalar_cross/sh_node_widget_scalar_cross.yy @@ -4,7 +4,7 @@ "name":"sh_node_widget_scalar_cross", "parent":{ "name":"node", - "path":"folders/widgets/node.yy", + "path":"folders/shader/UI/node.yy", }, "resourceType":"GMShader", "resourceVersion":"2.0", diff --git a/shaders/sh_node_widget_scalar_line/sh_node_widget_scalar_line.yy b/shaders/sh_node_widget_scalar_line/sh_node_widget_scalar_line.yy index 946001b9e..80579c177 100644 --- a/shaders/sh_node_widget_scalar_line/sh_node_widget_scalar_line.yy +++ b/shaders/sh_node_widget_scalar_line/sh_node_widget_scalar_line.yy @@ -4,7 +4,7 @@ "name":"sh_node_widget_scalar_line", "parent":{ "name":"node", - "path":"folders/widgets/node.yy", + "path":"folders/shader/UI/node.yy", }, "resourceType":"GMShader", "resourceVersion":"2.0", diff --git a/shaders/sh_ui_shape_circle/sh_ui_shape_circle.fsh b/shaders/sh_ui_shape_circle/sh_ui_shape_circle.fsh new file mode 100644 index 000000000..f78a13128 --- /dev/null +++ b/shaders/sh_ui_shape_circle/sh_ui_shape_circle.fsh @@ -0,0 +1,6 @@ +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +void main() { + gl_FragColor = v_vColour * texture2D( gm_BaseTexture, v_vTexcoord ); +} diff --git a/shaders/sh_ui_shape_circle/sh_ui_shape_circle.vsh b/shaders/sh_ui_shape_circle/sh_ui_shape_circle.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_ui_shape_circle/sh_ui_shape_circle.vsh @@ -0,0 +1,19 @@ +// +// Simple passthrough vertex shader +// +attribute vec3 in_Position; // (x,y,z) +//attribute vec3 in_Normal; // (x,y,z) unused in this shader. +attribute vec4 in_Colour; // (r,g,b,a) +attribute vec2 in_TextureCoord; // (u,v) + +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +void main() +{ + vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0); + gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos; + + v_vColour = in_Colour; + v_vTexcoord = in_TextureCoord; +} diff --git a/shaders/sh_ui_shape_circle/sh_ui_shape_circle.yy b/shaders/sh_ui_shape_circle/sh_ui_shape_circle.yy new file mode 100644 index 000000000..87bf8234b --- /dev/null +++ b/shaders/sh_ui_shape_circle/sh_ui_shape_circle.yy @@ -0,0 +1,12 @@ +{ + "$GMShader":"", + "%Name":"sh_ui_shape_circle", + "name":"sh_ui_shape_circle", + "parent":{ + "name":"UI", + "path":"folders/shader/UI.yy", + }, + "resourceType":"GMShader", + "resourceVersion":"2.0", + "type":1, +} \ No newline at end of file diff --git a/sprites/s_node_ease/186b66e3-2b5b-4a8c-bddb-bd0261923363.png b/sprites/s_node_ease/186b66e3-2b5b-4a8c-bddb-bd0261923363.png new file mode 100644 index 0000000000000000000000000000000000000000..56c986eff9ecce8e1af36f9dd674f36cac402b51 GIT binary patch literal 1606 zcmZ{keKga19LK-IJUR%*igbz9WtQhW#fCiOsa2A6(XFn>p(B-W z^@OZYx$EI(w=$J7w6aL{(6uAvu5<3W=iEO!pY!>=&iQ=K>wNxupV;NUT}RVI69Ay& zLxFZHNc!IDs)~6zK6Ok1OeAIZP5`p404QJq@Kv!Y5CM>m2Vgn^0OEN7kOyme0^Jk` z)%||kA+Ykj*qn=%0Khl;dP3wxjMga$l}8r6%&$<$iIqxj0u;(H*RB6WlQW=EdIQPI@E&MHSkrQD)i4Z2jOaXiD#Lp-TMs(8p)OWp~mmTNJ5?r7&m z`l2L9GYZ?L)UfP%V9 zGApBq0$VY8k2$Jh<(ce=@3Zdbn!w!u1y8Lpp>#DWy6@zc>Q-psRsxLF1^HQcnOaxm z=B)e0rOM;P!%^cth_$m!R$?h+s81Lhg$-KiWpwrmqGM|B@T?PV6ZgnEBx)PH>r(t_of1{gxnomm&ik}(+JTnm@rb;c2CjMZ9%N$~ z7W?c~>O`Y?kmp)TBmVT5l8K3Q-Ka23gXjIi=xfQmlD-5pIHxvxDZT4pA`Mxx4e9NT-3bta>$bEx<%N#7D*A>&&Gpm82_;(Z0vgD0dQV`p`%r2dTb2_m zyoLZQ94pXr@$?FnUpn*ncmMJS91@bQVL$O|V(Y#&cSVE2JERNOFhKn$n(4QQgm)oz z9xDOE`R+*>nS0@&e5)Lmk+~_WQyw~;vWxaag{sL@el(;jU&zVv9%&aYc-mhfcaNzC zjLXG;c<9a7Z-j1y^?sSB&4qsx)ovK6{P;fZW%8b2AuT_$>gbZ1R&mb*4F(NHhg^~HFxpTYxs1FR`t3ez01Wd?Y8U< zldfo2L(E^pc>E@AMjzKc(w^*9C{YJ^F2!HEQB#eU3e(Mil>=!LQW zQ6Tm5&a~+~5c*QPa81>Gb!h7<>Is{d=WX#qbdzVt8P-yNzggzoo1q%Fz9arzxq$y_Ms84ARTU{j)qY*u!MSno?fl`o zr9~%()Sl0qmA)OJNn`<;yNAkO!ZXmbQt{~|-FZFiHaAU1_u7ziCApzuCyswlfe+#n z7pB85f6oc?6(VB7h3^H#`)d8NV#dn7hySKlH*!4x_{`#t!%T{`B39Qk$)U_BIy0IW znHH@8aKt-0+2Nh-2o6Db7ovkRk>HHOR%*igbz9WtQhW#fCiOsa2A6(XFn>p(B-W z^@OZYx$EI(w=$J7w6aL{(6uAvu5<3W=iEO!pY!>=&iQ=K>wNxupV;NUT}RVI69Ay& zLxFZHNc!IDs)~6zK6Ok1OeAIZP5`p404QJq@Kv!Y5CM>m2Vgn^0OEN7kOyme0^Jk` z)%||kA+Ykj*qn=%0Khl;dP3wxjMga$l}8r6%&$<$iIqxj0u;(H*RB6WlQW=EdIQPI@E&MHSkrQD)i4Z2jOaXiD#Lp-TMs(8p)OWp~mmTNJ5?r7&m z`l2L9GYZ?L)UfP%V9 zGApBq0$VY8k2$Jh<(ce=@3Zdbn!w!u1y8Lpp>#DWy6@zc>Q-psRsxLF1^HQcnOaxm z=B)e0rOM;P!%^cth_$m!R$?h+s81Lhg$-KiWpwrmqGM|B@T?PV6ZgnEBx)PH>r(t_of1{gxnomm&ik}(+JTnm@rb;c2CjMZ9%N$~ z7W?c~>O`Y?kmp)TBmVT5l8K3Q-Ka23gXjIi=xfQmlD-5pIHxvxDZT4pA`Mxx4e9NT-3bta>$bEx<%N#7D*A>&&Gpm82_;(Z0vgD0dQV`p`%r2dTb2_m zyoLZQ94pXr@$?FnUpn*ncmMJS91@bQVL$O|V(Y#&cSVE2JERNOFhKn$n(4QQgm)oz z9xDOE`R+*>nS0@&e5)Lmk+~_WQyw~;vWxaag{sL@el(;jU&zVv9%&aYc-mhfcaNzC zjLXG;c<9a7Z-j1y^?sSB&4qsx)ovK6{P;fZW%8b2AuT_$>gbZ1R&mb*4F(NHhg^~HFxpTYxs1FR`t3ez01Wd?Y8U< zldfo2L(E^pc>E@AMjzKc(w^*9C{YJ^F2!HEQB#eU3e(Mil>=!LQW zQ6Tm5&a~+~5c*QPa81>Gb!h7<>Is{d=WX#qbdzVt8P-yNzggzoo1q%Fz9arzxq$y_Ms84ARTU{j)qY*u!MSno?fl`o zr9~%()Sl0qmA)OJNn`<;yNAkO!ZXmbQt{~|-FZFiHaAU1_u7ziCApzuCyswlfe+#n z7pB85f6oc?6(VB7h3^H#`)d8NV#dn7hySKlH*!4x_{`#t!%T{`B39Qk$)U_BIy0IW znHH@8aKt-0+2Nh-2o6Db7ovkRk>HHO":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "eventStubScript":null, + "eventToFunction":{}, + "length":1.0, + "lockOrigin":false, + "moments":{ + "$KeyframeStore":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "name":"s_node_ease", + "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":"186b66e3-2b5b-4a8c-bddb-bd0261923363","path":"sprites/s_node_ease/s_node_ease.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"efd6696f-4d2d-4c5e-9bef-c51f4832858e","IsCreationKey":false,"Key":0.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":32, + "yorigin":32, + }, + "swatchColours":null, + "swfPrecision":0.5, + "textureGroupId":{ + "name":"Default", + "path":"texturegroups/Default", + }, + "type":0, + "VTile":false, + "width":64, +} \ No newline at end of file diff --git a/sprites/s_node_fx_smoothstep/c1919cb9-1886-4ba5-8668-38d7a0601851.png b/sprites/s_node_fx_smoothstep/c1919cb9-1886-4ba5-8668-38d7a0601851.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe87f2ad3ae5bdc03e9cff678b4df2d10e62637 GIT binary patch literal 1252 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=3dtTpz6=aiY77hwEes65fI|H*Yfr0tDr;B4q#jU5a&wGmm z${etFRcTwM#_BXnL!~0Kn=g=^RnvxL?c7~k=RGs4(0KK%tfy(4B};M9Uv87G4*^Ts zd+HoEi!VNKL8ry1$am7B4Tpncu75xF*U zc--B1hw?X7jK53j8xI`b_^Od(!^e7Mo1Ai!-M{8-n$Ik=TC{`d?(6zeyRGdT??$9@ z6s(ajV3>1ab87rE4~_la4h_c}lUe5}GEG^?aJ-Ab^V9o}Z)TkQ6CgLeA(@xqJCj8) z*X`aEIfHr@i!h-bv%+WJa5qh;?hvYMR+b5r|Xl$E(W?j~{hC2^0n{3_x>`Lor z8C$+kcB9k31gH0zoDrQM{YOXOco}1x%F}%xo^chdIl}khW$6bN0c{aEpE)eD+FU(9 zuFPOvbYoq(&Ynu9Bdg9i@15n%c=yJ;Ab}4F_YMab`BZFX=~#GwsfI7}#sv=#PVsiI zIas-3`gZBp-yI$voFi!PfVqBu$cHozfxY$%G(@-W7CJav(c!>#&C@yNQCby$nf_GU zho0eDZ^QEA>%W`(HU=G@t)QT08+G|ZYgpxYePC>)H-ie{b!* zAjioXH=kkSv+3)9or~e&1+uT6*}q@vmeRt5uSEo=%H{T_yn8l9Ca$01;|1mUf0S$& z9(paf;MLz-ZW|jVm1=%49XaK{?`r8L^^zYSSXWfZKM1(|b;HBM;sKWnf~)rYJ7FDV z^}dZ)eqF=);Oh}TFDmLr|9bYKfj`)x=jTi7u1#Cs^!loDb}%~o>+?2UV##U! z|Cf82ZRp*HU&Uobl@qjW8ou-VTeIqwddXpS%>?T|pOp5<24D1Fv;Xc@IY*8geEc7N z9OVA@cWu~~&ev@GUJWvJSw$1x$Dh-@|iS#le_WvGL)` zQ%{XoediW^z`mb_=iP;CD^8eup5nj9e604?y+dW`CCusWcAP?WAB;PeTa{LMhqW!! zocLPx0sDO}o9~VO$qz2v?}%}0koouaMy{HB)lJLFo&MjPS%Z_*8KWPHKYQ@nz2b99 z-_@zlWX|1RU%Y*J0b`%&;-$u3!M9b#o;~=!sv&&+>(fGUdJbov9ewg-x!_9OV~3r; z-aJ5O#$KV)iY(TJ`uvEWO%)$H?<<;|iCbJdpHmhEl$zgOPNGIibLT41JEEpd$~ zNl7e8wMs5Z1yT$~21X{j2Bx~kh9L&#R)(fl#-`c^237_JqG}ySQ8eV{r(~v8;?|H- mZBPl+paHj`Br`X)xFj*R0Jk3FJi%o^Jq(_%elF{r5}E+yzB9%E literal 0 HcmV?d00001 diff --git a/sprites/s_node_fx_smoothstep/layers/c1919cb9-1886-4ba5-8668-38d7a0601851/0caed235-1eeb-40c7-a07f-8f547b5687cc.png b/sprites/s_node_fx_smoothstep/layers/c1919cb9-1886-4ba5-8668-38d7a0601851/0caed235-1eeb-40c7-a07f-8f547b5687cc.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe87f2ad3ae5bdc03e9cff678b4df2d10e62637 GIT binary patch literal 1252 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=3dtTpz6=aiY77hwEes65fI|H*Yfr0tDr;B4q#jU5a&wGmm z${etFRcTwM#_BXnL!~0Kn=g=^RnvxL?c7~k=RGs4(0KK%tfy(4B};M9Uv87G4*^Ts zd+HoEi!VNKL8ry1$am7B4Tpncu75xF*U zc--B1hw?X7jK53j8xI`b_^Od(!^e7Mo1Ai!-M{8-n$Ik=TC{`d?(6zeyRGdT??$9@ z6s(ajV3>1ab87rE4~_la4h_c}lUe5}GEG^?aJ-Ab^V9o}Z)TkQ6CgLeA(@xqJCj8) z*X`aEIfHr@i!h-bv%+WJa5qh;?hvYMR+b5r|Xl$E(W?j~{hC2^0n{3_x>`Lor z8C$+kcB9k31gH0zoDrQM{YOXOco}1x%F}%xo^chdIl}khW$6bN0c{aEpE)eD+FU(9 zuFPOvbYoq(&Ynu9Bdg9i@15n%c=yJ;Ab}4F_YMab`BZFX=~#GwsfI7}#sv=#PVsiI zIas-3`gZBp-yI$voFi!PfVqBu$cHozfxY$%G(@-W7CJav(c!>#&C@yNQCby$nf_GU zho0eDZ^QEA>%W`(HU=G@t)QT08+G|ZYgpxYePC>)H-ie{b!* zAjioXH=kkSv+3)9or~e&1+uT6*}q@vmeRt5uSEo=%H{T_yn8l9Ca$01;|1mUf0S$& z9(paf;MLz-ZW|jVm1=%49XaK{?`r8L^^zYSSXWfZKM1(|b;HBM;sKWnf~)rYJ7FDV z^}dZ)eqF=);Oh}TFDmLr|9bYKfj`)x=jTi7u1#Cs^!loDb}%~o>+?2UV##U! z|Cf82ZRp*HU&Uobl@qjW8ou-VTeIqwddXpS%>?T|pOp5<24D1Fv;Xc@IY*8geEc7N z9OVA@cWu~~&ev@GUJWvJSw$1x$Dh-@|iS#le_WvGL)` zQ%{XoediW^z`mb_=iP;CD^8eup5nj9e604?y+dW`CCusWcAP?WAB;PeTa{LMhqW!! zocLPx0sDO}o9~VO$qz2v?}%}0koouaMy{HB)lJLFo&MjPS%Z_*8KWPHKYQ@nz2b99 z-_@zlWX|1RU%Y*J0b`%&;-$u3!M9b#o;~=!sv&&+>(fGUdJbov9ewg-x!_9OV~3r; z-aJ5O#$KV)iY(TJ`uvEWO%)$H?<<;|iCbJdpHmhEl$zgOPNGIibLT41JEEpd$~ zNl7e8wMs5Z1yT$~21X{j2Bx~kh9L&#R)(fl#-`c^237_JqG}ySQ8eV{r(~v8;?|H- mZBPl+paHj`Br`X)xFj*R0Jk3FJi%o^Jq(_%elF{r5}E+yzB9%E literal 0 HcmV?d00001 diff --git a/sprites/s_node_fx_smoothstep/s_node_fx_smoothstep.yy b/sprites/s_node_fx_smoothstep/s_node_fx_smoothstep.yy new file mode 100644 index 000000000..6470f7654 --- /dev/null +++ b/sprites/s_node_fx_smoothstep/s_node_fx_smoothstep.yy @@ -0,0 +1,90 @@ +{ + "$GMSprite":"", + "%Name":"s_node_fx_smoothstep", + "bboxMode":0, + "bbox_bottom":60, + "bbox_left":3, + "bbox_right":60, + "bbox_top":3, + "collisionKind":1, + "collisionTolerance":0, + "DynamicTexturePage":false, + "edgeFiltering":false, + "For3D":false, + "frames":[ + {"$GMSpriteFrame":"","%Name":"c1919cb9-1886-4ba5-8668-38d7a0601851","name":"c1919cb9-1886-4ba5-8668-38d7a0601851","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + ], + "gridX":0, + "gridY":0, + "height":64, + "HTile":false, + "layers":[ + {"$GMImageLayer":"","%Name":"0caed235-1eeb-40c7-a07f-8f547b5687cc","blendMode":0,"displayName":"default","isLocked":false,"name":"0caed235-1eeb-40c7-a07f-8f547b5687cc","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + ], + "name":"s_node_fx_smoothstep", + "nineSlice":null, + "origin":4, + "parent":{ + "name":"animation", + "path":"folders/nodes/icons/animation.yy", + }, + "preMultiplyAlpha":false, + "resourceType":"GMSprite", + "resourceVersion":"2.0", + "sequence":{ + "$GMSequence":"", + "%Name":"s_node_fx_smoothstep", + "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":1.0, + "lockOrigin":false, + "moments":{ + "$KeyframeStore":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "name":"s_node_fx_smoothstep", + "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":"c1919cb9-1886-4ba5-8668-38d7a0601851","path":"sprites/s_node_fx_smoothstep/s_node_fx_smoothstep.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"19ca05e9-199f-423f-98fd-acdcda2ca7fb","IsCreationKey":false,"Key":0.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":32, + "yorigin":32, + }, + "swatchColours":null, + "swfPrecision":0.5, + "textureGroupId":{ + "name":"Default", + "path":"texturegroups/Default", + }, + "type":0, + "VTile":false, + "width":64, +} \ No newline at end of file diff --git a/sprites/s_node_wave/590c15bd-eff6-46fb-887d-6158004741b8.png b/sprites/s_node_wave/590c15bd-eff6-46fb-887d-6158004741b8.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5be9d50e68e672aa9882c4273b276cde1515a0 GIT binary patch literal 1218 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=3dtTpz6=aiY77hwEes65fI|H*Yfq{9er;B4q#jUqd_W73` zME;8^UR?W+Vd^VJ&MT^IE9XAy&HH+Y>zS~?4~7#@nH`RodB1E*@SG`ex$~-I*QtgA z7U$J^e8JYXZN(V{HUHmupFjB1bGgRz>gV6<_I-bMcfP8U)8xY2+nAUtA`2OpFg#kb z#O=P5OQ|-apz0C#{*Id9_tC3na+fgLgyvMUD6Fwkdgap4_c57=ktJcB;dPc0hCRBP z)=b@^C-(?FVEPfbv7eDaUiHqyX}PZ%-+0ZFZ}|D!>+Zo0T=N&8s|0j_zjLN^(5xO5IlHP|sM ze`nY*{q4zp|8`Ueg?n^p=saeU6FeHJo@sWc>}0|(Po29@9iQ9E2D$sNepH;#z9S*> zs@KJgpQb(^p6=+M?-`W&CO?-wBEK^DtN8PDi#zv?FNw1Udj{LFvDiFjOej5j^s&04 z+3mW_$M1FYi$(1^li&WclmA*!Shws}jq2u)`d+LD&u;5q`*uN(#=CpF&)1e2T~KFW z;QRjlLul+ZLBR{bZ&UX^Jy^eG>Do7kdwUQ4dVk-qu(UF=i=m;n#b5s3O=5^Kf#S zlKuWtX<8)9+%xAZGz8jYuO6+ZQriRa$alyClPAy^61Qj#$_KHa}WCp8mJv){=oAmR;pp= zY3?a^_RSMbE7W_C>SiTeYG@)B_1W)0%tAhPWo{-hmWYF~hBzq7AT^fPzL z*;aec@E@OAl5ZVLi>uJ;>~)4mU$vNGE|BF@P94$ibWq;R_tov-&|RhyTHpqnv1);(&cfig1RdP`(kYX@0Ff!3KFx53S3^6dXGP1NXHP$vTure@scky)* yiiX_$l+3hB+#2Th1fK(H(16=el9`)YT#}eufLqUrnMHy?Jq(_%elF{r5}E*ug9FR} literal 0 HcmV?d00001 diff --git a/sprites/s_node_wave/layers/590c15bd-eff6-46fb-887d-6158004741b8/5fd93566-21dc-4646-9b9e-3305a97c1a22.png b/sprites/s_node_wave/layers/590c15bd-eff6-46fb-887d-6158004741b8/5fd93566-21dc-4646-9b9e-3305a97c1a22.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5be9d50e68e672aa9882c4273b276cde1515a0 GIT binary patch literal 1218 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=3dtTpz6=aiY77hwEes65fI|H*Yfq{9er;B4q#jUqd_W73` zME;8^UR?W+Vd^VJ&MT^IE9XAy&HH+Y>zS~?4~7#@nH`RodB1E*@SG`ex$~-I*QtgA z7U$J^e8JYXZN(V{HUHmupFjB1bGgRz>gV6<_I-bMcfP8U)8xY2+nAUtA`2OpFg#kb z#O=P5OQ|-apz0C#{*Id9_tC3na+fgLgyvMUD6Fwkdgap4_c57=ktJcB;dPc0hCRBP z)=b@^C-(?FVEPfbv7eDaUiHqyX}PZ%-+0ZFZ}|D!>+Zo0T=N&8s|0j_zjLN^(5xO5IlHP|sM ze`nY*{q4zp|8`Ueg?n^p=saeU6FeHJo@sWc>}0|(Po29@9iQ9E2D$sNepH;#z9S*> zs@KJgpQb(^p6=+M?-`W&CO?-wBEK^DtN8PDi#zv?FNw1Udj{LFvDiFjOej5j^s&04 z+3mW_$M1FYi$(1^li&WclmA*!Shws}jq2u)`d+LD&u;5q`*uN(#=CpF&)1e2T~KFW z;QRjlLul+ZLBR{bZ&UX^Jy^eG>Do7kdwUQ4dVk-qu(UF=i=m;n#b5s3O=5^Kf#S zlKuWtX<8)9+%xAZGz8jYuO6+ZQriRa$alyClPAy^61Qj#$_KHa}WCp8mJv){=oAmR;pp= zY3?a^_RSMbE7W_C>SiTeYG@)B_1W)0%tAhPWo{-hmWYF~hBzq7AT^fPzL z*;aec@E@OAl5ZVLi>uJ;>~)4mU$vNGE|BF@P94$ibWq;R_tov-&|RhyTHpqnv1);(&cfig1RdP`(kYX@0Ff!3KFx53S3^6dXGP1NXHP$vTure@scky)* yiiX_$l+3hB+#2Th1fK(H(16=el9`)YT#}eufLqUrnMHy?Jq(_%elF{r5}E*ug9FR} literal 0 HcmV?d00001 diff --git a/sprites/s_node_wave/s_node_wave.yy b/sprites/s_node_wave/s_node_wave.yy new file mode 100644 index 000000000..00b0a6090 --- /dev/null +++ b/sprites/s_node_wave/s_node_wave.yy @@ -0,0 +1,90 @@ +{ + "$GMSprite":"", + "%Name":"s_node_wave", + "bboxMode":0, + "bbox_bottom":60, + "bbox_left":3, + "bbox_right":60, + "bbox_top":1, + "collisionKind":1, + "collisionTolerance":0, + "DynamicTexturePage":false, + "edgeFiltering":false, + "For3D":false, + "frames":[ + {"$GMSpriteFrame":"","%Name":"590c15bd-eff6-46fb-887d-6158004741b8","name":"590c15bd-eff6-46fb-887d-6158004741b8","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + ], + "gridX":0, + "gridY":0, + "height":64, + "HTile":false, + "layers":[ + {"$GMImageLayer":"","%Name":"5fd93566-21dc-4646-9b9e-3305a97c1a22","blendMode":0,"displayName":"default","isLocked":false,"name":"5fd93566-21dc-4646-9b9e-3305a97c1a22","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + ], + "name":"s_node_wave", + "nineSlice":null, + "origin":4, + "parent":{ + "name":"animation", + "path":"folders/nodes/icons/animation.yy", + }, + "preMultiplyAlpha":false, + "resourceType":"GMSprite", + "resourceVersion":"2.0", + "sequence":{ + "$GMSequence":"", + "%Name":"s_node_wave", + "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":1.0, + "lockOrigin":false, + "moments":{ + "$KeyframeStore":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "name":"s_node_wave", + "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":"590c15bd-eff6-46fb-887d-6158004741b8","path":"sprites/s_node_wave/s_node_wave.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"34f9b1d4-13f4-4257-a2bb-458f9a298931","IsCreationKey":false,"Key":0.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":32, + "yorigin":32, + }, + "swatchColours":null, + "swfPrecision":0.5, + "textureGroupId":{ + "name":"Default", + "path":"texturegroups/Default", + }, + "type":0, + "VTile":false, + "width":64, +} \ No newline at end of file diff --git a/sprites/s_node_wiggler/18579d31-c42b-485e-9354-5cc19bf97aec.png b/sprites/s_node_wiggler/18579d31-c42b-485e-9354-5cc19bf97aec.png new file mode 100644 index 0000000000000000000000000000000000000000..9875f8b20e2a6f4c59d97e264a36412d9a7ee729 GIT binary patch literal 1301 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=3dtTpz6=aiY77hwEes65fI|H*Yfq{j?)5S5Q;?~<)d-LwN z2^_EYTD)4t%q)cEf}}^{62bcpC8^$C=3;oIpg+wcA4AH%}SZ^WOUzd7?}Kl4(N|LHZRU$}XCZ5f^S zAGmNs*Z{;?$Kv9^wc^vsMo9slwG*`YtXdAT{0P*Dp87<@S^JteqvD5sOV6$FD45Gs z+-;Tq;-vxCjtGaQoL_1-PQTgKKTKkr-dDT(nmo%kF$30r0;jGW*r>qY7Pf(Ro7e;s z4gIOI%pWgs<#jW7PPDX=kFebKnazxaCF8uFV8GwkUJea>GX<+=y_NG?xlKJVO=PN7 zu&T1j7fH>fM$UJ425D`mSiaWQOiY0D)0R)x?(^6@-~N~Uz+I5HqB`*P_VOD70$iWg zG)~Z3bn3nKgZ613&rOtleeI$c8}ozwg=^-$XgQJjY4N5%YoAvCJ=s^|G@I3hSAWL! zl+!_Zhj@0I{9;@FMx&`jRiSuFe1hM!SrdLZIB1-h-c<9>;-6H7?iAPE3JY|7cC>7p ztsefZQ^2+nYRc%w)Sx$WX->J&U_)FXU>3_>xR!g=8IVD-gnRA?bcuDF1{cn>w zljGjq;&eOFr}Or$_lbDRS2yAtw(V&8zwO=oFQN09f&;WIER4SX_&j_5kH3$P$8Gul z>|^r0{eRx|)oj+QD6M^Z<$CjE;kY;z89Bc!)huTA^pH(AcCj9r^l5hK#o3=2>Ywfm ztSgZzu$UR~z1U(V$0_HP(J@ma^1J@cO5Ll;|Ka>}{hVv98{a%U*;#7uKhI8hiuqzc zhgD~vnAJt={@f7t&5Pl{bN~50pVs>?4}06+)R2GvP@7bi^WA<)o8%DB^x~yg*1Rv- z^65;A$AqYD^UarB-Kn|tU6I)hb)_$PfwE@5nHg{GoEbLP{N#1nA7wWCM4l|)GT-pX z3Ga6Q-REGq$#tmBjPZk$#%y!mXUdE-75b%a9pO!Vd4nT@ z>(jESi7F@VUo7%J=+3mMZBxL6<4rcX(r4V64&=6LxPAM#ST*6LM+4{DXYY*}Z;EkD z_$6V=c>K;cX2b6W_47G3HdyEMwpwZHyjTC}#c(35U~x%?`68LtKe>D zYo=Hzd!U@jVSeBm-B+=fAF^cfusqokzdQEg$EI%*91OBT`;X^vUcd9WYTtXm4Sfqj z%v_?~j@jlf>F;e=o2(O@;D2CVgDqn<(>IncjrEMC5~`Wz`(5RMrG#pUYeY#(Vo9o1 za#1RfVlXl=GSM|K)ipK@F)*_-vam8X(l#)#GB8NwZmLJokei>9nO2EggFu+oVW0*L hxD6$lxv9k^iMa*1^|(7r%K-H-c)I$ztaD0e0szLoF0uds literal 0 HcmV?d00001 diff --git a/sprites/s_node_wiggler/7e8c22ae-b343-412c-b6d8-5052c75cc3fe.png b/sprites/s_node_wiggler/7e8c22ae-b343-412c-b6d8-5052c75cc3fe.png deleted file mode 100644 index d2312c949e19347246d0ec5b7c6dfbb238915f02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 862 zcmV-k1EKthP)# z;f8!pyB%B!mkziJauAIrWZ|)AJi!Yd z$qFLIn9uVb1HkQeGbIP)oz+f6)M{S^68?-nAwpZ zK;r6aXTda1uQ1Lg0UXEndu-p=%qB=oe@z)!fX&!W3FD{&s2O9WWWmp|J>zy;8h`^{ zw2fz!!-rrjRRC3F`lrfZTJ0xiU-K0J)PnK2S#b0~{()IBd_@2k{C!gZK=ob43_+0o z_CB5ZY%n*zrD$^ksEK1NfHQGy$27jBSj7xMkp6acF9|YOGQOo~asfDc_Rq`IUMPbj zfsGX&2HK1BkM$befbJk$(fY_VTQ=jm^7n=6Bm@oAdj-!}?#1m`4H_ z2pNQoZz&{Z=o|BMY=0gNfRaJT_D+(Q#UNCqL}lbT^eWLuvDz*%T~5;N>QGO_R`K&t{6JTizeK8YFnimd4O z4j`BmR|Xv8OVg_L))ud^l$KiTjEH;F_U$^|uVbn&Gun00SCdbj`mv02)u3 o_t-Lk|H*Yfq{j?)5S5Q;?~<)d-LwN z2^_EYTD)4t%q)cEf}}^{62bcpC8^$C=3;oIpg+wcA4AH%}SZ^WOUzd7?}Kl4(N|LHZRU$}XCZ5f^S zAGmNs*Z{;?$Kv9^wc^vsMo9slwG*`YtXdAT{0P*Dp87<@S^JteqvD5sOV6$FD45Gs z+-;Tq;-vxCjtGaQoL_1-PQTgKKTKkr-dDT(nmo%kF$30r0;jGW*r>qY7Pf(Ro7e;s z4gIOI%pWgs<#jW7PPDX=kFebKnazxaCF8uFV8GwkUJea>GX<+=y_NG?xlKJVO=PN7 zu&T1j7fH>fM$UJ425D`mSiaWQOiY0D)0R)x?(^6@-~N~Uz+I5HqB`*P_VOD70$iWg zG)~Z3bn3nKgZ613&rOtleeI$c8}ozwg=^-$XgQJjY4N5%YoAvCJ=s^|G@I3hSAWL! zl+!_Zhj@0I{9;@FMx&`jRiSuFe1hM!SrdLZIB1-h-c<9>;-6H7?iAPE3JY|7cC>7p ztsefZQ^2+nYRc%w)Sx$WX->J&U_)FXU>3_>xR!g=8IVD-gnRA?bcuDF1{cn>w zljGjq;&eOFr}Or$_lbDRS2yAtw(V&8zwO=oFQN09f&;WIER4SX_&j_5kH3$P$8Gul z>|^r0{eRx|)oj+QD6M^Z<$CjE;kY;z89Bc!)huTA^pH(AcCj9r^l5hK#o3=2>Ywfm ztSgZzu$UR~z1U(V$0_HP(J@ma^1J@cO5Ll;|Ka>}{hVv98{a%U*;#7uKhI8hiuqzc zhgD~vnAJt={@f7t&5Pl{bN~50pVs>?4}06+)R2GvP@7bi^WA<)o8%DB^x~yg*1Rv- z^65;A$AqYD^UarB-Kn|tU6I)hb)_$PfwE@5nHg{GoEbLP{N#1nA7wWCM4l|)GT-pX z3Ga6Q-REGq$#tmBjPZk$#%y!mXUdE-75b%a9pO!Vd4nT@ z>(jESi7F@VUo7%J=+3mMZBxL6<4rcX(r4V64&=6LxPAM#ST*6LM+4{DXYY*}Z;EkD z_$6V=c>K;cX2b6W_47G3HdyEMwpwZHyjTC}#c(35U~x%?`68LtKe>D zYo=Hzd!U@jVSeBm-B+=fAF^cfusqokzdQEg$EI%*91OBT`;X^vUcd9WYTtXm4Sfqj z%v_?~j@jlf>F;e=o2(O@;D2CVgDqn<(>IncjrEMC5~`Wz`(5RMrG#pUYeY#(Vo9o1 za#1RfVlXl=GSM|K)ipK@F)*_-vam8X(l#)#GB8NwZmLJokei>9nO2EggFu+oVW0*L hxD6$lxv9k^iMa*1^|(7r%K-H-c)I$ztaD0e0szLoF0uds literal 0 HcmV?d00001 diff --git a/sprites/s_node_wiggler/layers/7e8c22ae-b343-412c-b6d8-5052c75cc3fe/4707f513-c44f-49a8-9007-58f929f75602.png b/sprites/s_node_wiggler/layers/7e8c22ae-b343-412c-b6d8-5052c75cc3fe/4707f513-c44f-49a8-9007-58f929f75602.png deleted file mode 100644 index d2312c949e19347246d0ec5b7c6dfbb238915f02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 862 zcmV-k1EKthP)# z;f8!pyB%B!mkziJauAIrWZ|)AJi!Yd z$qFLIn9uVb1HkQeGbIP)oz+f6)M{S^68?-nAwpZ zK;r6aXTda1uQ1Lg0UXEndu-p=%qB=oe@z)!fX&!W3FD{&s2O9WWWmp|J>zy;8h`^{ zw2fz!!-rrjRRC3F`lrfZTJ0xiU-K0J)PnK2S#b0~{()IBd_@2k{C!gZK=ob43_+0o z_CB5ZY%n*zrD$^ksEK1NfHQGy$27jBSj7xMkp6acF9|YOGQOo~asfDc_Rq`IUMPbj zfsGX&2HK1BkM$befbJk$(fY_VTQ=jm^7n=6Bm@oAdj-!}?#1m`4H_ z2pNQoZz&{Z=o|BMY=0gNfRaJT_D+(Q#UNCqL}lbT^eWLuvDz*%T~5;N>QGO_R`K&t{6JTizeK8YFnimd4O z4j`BmR|Xv8OVg_L))ud^l$KiTjEH;F_U$^|uVbn&Gun00SCdbj`mv02)u3 o_t-Lk":"","Keyframes":[ {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"7e8c22ae-b343-412c-b6d8-5052c75cc3fe","path":"sprites/s_node_wiggler/s_node_wiggler.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"d0c9d110-4447-4301-aada-37d8621e688b","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"18579d31-c42b-485e-9354-5cc19bf97aec","path":"sprites/s_node_wiggler/s_node_wiggler.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"6fdb9218-dea0-4edc-8010-86a2571b0635","IsCreationKey":false,"Key":0.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":{ - "x":0.0, - "y":0.0, - }, + "visibleRange":null, "volume":1.0, "xorigin":32, "yorigin":32,