From 03e6d45eb3a686ce3a2aec765a6b6b5be495c806 Mon Sep 17 00:00:00 2001 From: Tanasart Date: Sun, 19 May 2024 12:55:09 +0700 Subject: [PATCH] posterize algo --- PixelComposer.resource_order | 7 +- PixelComposer.yyp | 7 +- objects/o_main/Create_0.gml | 7 +- scripts/buttonColor/buttonColor.gml | 10 +- scripts/buttonGradient/buttonGradient.gml | 8 +- scripts/buttonPalette/buttonPalette.gml | 8 +- scripts/node_atlas_set/node_atlas_set.gml | 108 +++++++----- scripts/node_dither/node_dither.gml | 21 ++- .../node_normalize/node_color_adjustment.yy | 12 ++ .../node_normalize/node_color_replacement.yy | 12 ++ scripts/node_normalize/node_greyscale.yy | 12 ++ scripts/node_normalize/node_normalize.gml | 100 +++++++++++ scripts/node_normalize/node_normalize.yy | 13 ++ scripts/node_normalize/node_outline.yy | 12 ++ scripts/node_posterize/node_posterize.gml | 88 +++++++++- scripts/node_registry/node_registry.gml | 1 + .../node_rigid_render_output.gml | 22 +-- scripts/node_value/node_value.gml | 2 +- .../panel_file_explorer.gml | 10 +- scripts/panel_inspector/panel_inspector.gml | 3 +- scripts/tooltip_hotkey/tooltip_hotkey.gml | 10 +- shaders/sh_color_adjust/sh_color_adjust.fsh | 162 +++++++++--------- shaders/sh_dither/sh_dither.fsh | 61 ++++--- .../sh_get_max_downsampled.fsh | 27 +++ .../sh_get_max_downsampled.vsh | 19 ++ .../sh_get_max_downsampled.yy | 12 ++ .../sh_get_min_downsampled.fsh | 17 ++ .../sh_get_min_downsampled.vsh | 19 ++ .../sh_get_min_downsampled.yy | 12 ++ shaders/sh_normalize/sh_normalize.fsh | 13 ++ shaders/sh_normalize/sh_normalize.vsh | 19 ++ shaders/sh_normalize/sh_normalize.yy | 12 ++ shaders/sh_posterize/sh_posterize.fsh | 119 +++++++++++-- .../473ee652-8202-4be9-8285-8305bdb7811a.png | Bin 0 -> 765 bytes .../80227e67-9114-44ab-ae2c-4f114b54be58.png | Bin 0 -> 765 bytes sprites/s_node_normalize/s_node_normalize.yy | 90 ++++++++++ 36 files changed, 848 insertions(+), 207 deletions(-) create mode 100644 scripts/node_normalize/node_color_adjustment.yy create mode 100644 scripts/node_normalize/node_color_replacement.yy create mode 100644 scripts/node_normalize/node_greyscale.yy create mode 100644 scripts/node_normalize/node_normalize.gml create mode 100644 scripts/node_normalize/node_normalize.yy create mode 100644 scripts/node_normalize/node_outline.yy create mode 100644 shaders/sh_get_max_downsampled/sh_get_max_downsampled.fsh create mode 100644 shaders/sh_get_max_downsampled/sh_get_max_downsampled.vsh create mode 100644 shaders/sh_get_max_downsampled/sh_get_max_downsampled.yy create mode 100644 shaders/sh_get_min_downsampled/sh_get_min_downsampled.fsh create mode 100644 shaders/sh_get_min_downsampled/sh_get_min_downsampled.vsh create mode 100644 shaders/sh_get_min_downsampled/sh_get_min_downsampled.yy create mode 100644 shaders/sh_normalize/sh_normalize.fsh create mode 100644 shaders/sh_normalize/sh_normalize.vsh create mode 100644 shaders/sh_normalize/sh_normalize.yy create mode 100644 sprites/s_node_normalize/473ee652-8202-4be9-8285-8305bdb7811a.png create mode 100644 sprites/s_node_normalize/layers/473ee652-8202-4be9-8285-8305bdb7811a/80227e67-9114-44ab-ae2c-4f114b54be58.png create mode 100644 sprites/s_node_normalize/s_node_normalize.yy diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 475db0a74..aaf7c5b15 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -135,8 +135,8 @@ {"name":"channels","order":41,"path":"folders/shader/filter/channels.yy",}, {"name":"color","order":42,"path":"folders/shader/filter/color.yy",}, {"name":"corner","order":43,"path":"folders/shader/filter/corner.yy",}, - {"name":"edge_shade","order":44,"path":"folders/shader/filter/edge_shade.yy",}, {"name":"dither","order":53,"path":"folders/shader/filter/dither.yy",}, + {"name":"edge_shade","order":44,"path":"folders/shader/filter/edge_shade.yy",}, {"name":"morph","order":45,"path":"folders/shader/filter/morph.yy",}, {"name":"shadow_caster","order":46,"path":"folders/shader/filter/shadow_caster.yy",}, {"name":"shape_seperator","order":47,"path":"folders/shader/filter/shape_seperator.yy",}, @@ -842,6 +842,7 @@ {"name":"node_noise_tri","order":6,"path":"scripts/node_noise_tri/node_noise_tri.yy",}, {"name":"node_normal_light","order":2,"path":"scripts/node_normal_light/node_normal_light.yy",}, {"name":"node_normal","order":1,"path":"scripts/node_normal/node_normal.yy",}, + {"name":"node_normalize","order":17,"path":"scripts/node_normalize/node_normalize.yy",}, {"name":"node_note","order":17,"path":"scripts/node_note/node_note.yy",}, {"name":"node_offset","order":17,"path":"scripts/node_offset/node_offset.yy",}, {"name":"node_onion_skin","order":12,"path":"scripts/node_onion_skin/node_onion_skin.yy",}, @@ -1350,6 +1351,8 @@ {"name":"sh_freeform_fill_pass2","order":1,"path":"shaders/sh_freeform_fill_pass2/sh_freeform_fill_pass2.yy",}, {"name":"sh_FXAA","order":29,"path":"shaders/sh_FXAA/sh_FXAA.yy",}, {"name":"sh_gamma_map","order":38,"path":"shaders/sh_gamma_map/sh_gamma_map.yy",}, + {"name":"sh_get_max_downsampled","order":8,"path":"shaders/sh_get_max_downsampled/sh_get_max_downsampled.yy",}, + {"name":"sh_get_min_downsampled","order":9,"path":"shaders/sh_get_min_downsampled/sh_get_min_downsampled.yy",}, {"name":"sh_glow","order":18,"path":"shaders/sh_glow/sh_glow.yy",}, {"name":"sh_gradient_display_alpha","order":12,"path":"shaders/sh_gradient_display_alpha/sh_gradient_display_alpha.yy",}, {"name":"sh_gradient_display","order":7,"path":"shaders/sh_gradient_display/sh_gradient_display.yy",}, @@ -1403,6 +1406,7 @@ {"name":"sh_noise_wavelet","order":11,"path":"shaders/sh_noise_wavelet/sh_noise_wavelet.yy",}, {"name":"sh_noise","order":1,"path":"shaders/sh_noise/sh_noise.yy",}, {"name":"sh_normal_light","order":1,"path":"shaders/sh_normal_light/sh_normal_light.yy",}, + {"name":"sh_normalize","order":23,"path":"shaders/sh_normalize/sh_normalize.yy",}, {"name":"sh_offset","order":12,"path":"shaders/sh_offset/sh_offset.yy",}, {"name":"sh_outline_only","order":19,"path":"shaders/sh_outline_only/sh_outline_only.yy",}, {"name":"sh_outline","order":9,"path":"shaders/sh_outline/sh_outline.yy",}, @@ -1771,6 +1775,7 @@ {"name":"s_node_noise","order":8,"path":"sprites/s_node_noise/s_node_noise.yy",}, {"name":"s_node_normal_light","order":37,"path":"sprites/s_node_normal_light/s_node_normal_light.yy",}, {"name":"s_node_normal","order":36,"path":"sprites/s_node_normal/s_node_normal.yy",}, + {"name":"s_node_normalize","order":62,"path":"sprites/s_node_normalize/s_node_normalize.yy",}, {"name":"s_node_note","order":35,"path":"sprites/s_node_note/s_node_note.yy",}, {"name":"s_node_number","order":7,"path":"sprites/s_node_number/s_node_number.yy",}, {"name":"s_node_offset","order":19,"path":"sprites/s_node_offset/s_node_offset.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index a1df1d3f5..a0d98de25 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -264,8 +264,8 @@ {"$GMFolder":"","%Name":"channels","folderPath":"folders/shader/filter/channels.yy","name":"channels","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"color","folderPath":"folders/shader/filter/color.yy","name":"color","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"corner","folderPath":"folders/shader/filter/corner.yy","name":"corner","resourceType":"GMFolder","resourceVersion":"2.0",}, - {"$GMFolder":"","%Name":"edge_shade","folderPath":"folders/shader/filter/edge_shade.yy","name":"edge_shade","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"dither","folderPath":"folders/shader/filter/dither.yy","name":"dither","resourceType":"GMFolder","resourceVersion":"2.0",}, + {"$GMFolder":"","%Name":"edge_shade","folderPath":"folders/shader/filter/edge_shade.yy","name":"edge_shade","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"morph","folderPath":"folders/shader/filter/morph.yy","name":"morph","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"shadow_caster","folderPath":"folders/shader/filter/shadow_caster.yy","name":"shadow_caster","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"shape_seperator","folderPath":"folders/shader/filter/shape_seperator.yy","name":"shape_seperator","resourceType":"GMFolder","resourceVersion":"2.0",}, @@ -1275,6 +1275,7 @@ {"id":{"name":"node_noise","path":"scripts/node_noise/node_noise.yy",},}, {"id":{"name":"node_normal_light","path":"scripts/node_normal_light/node_normal_light.yy",},}, {"id":{"name":"node_normal","path":"scripts/node_normal/node_normal.yy",},}, + {"id":{"name":"node_normalize","path":"scripts/node_normalize/node_normalize.yy",},}, {"id":{"name":"node_note","path":"scripts/node_note/node_note.yy",},}, {"id":{"name":"node_number","path":"scripts/node_number/node_number.yy",},}, {"id":{"name":"node_offset","path":"scripts/node_offset/node_offset.yy",},}, @@ -1865,6 +1866,8 @@ {"id":{"name":"sh_freeform_fill_pass2","path":"shaders/sh_freeform_fill_pass2/sh_freeform_fill_pass2.yy",},}, {"id":{"name":"sh_FXAA","path":"shaders/sh_FXAA/sh_FXAA.yy",},}, {"id":{"name":"sh_gamma_map","path":"shaders/sh_gamma_map/sh_gamma_map.yy",},}, + {"id":{"name":"sh_get_max_downsampled","path":"shaders/sh_get_max_downsampled/sh_get_max_downsampled.yy",},}, + {"id":{"name":"sh_get_min_downsampled","path":"shaders/sh_get_min_downsampled/sh_get_min_downsampled.yy",},}, {"id":{"name":"sh_glow","path":"shaders/sh_glow/sh_glow.yy",},}, {"id":{"name":"sh_gradient_display_alpha","path":"shaders/sh_gradient_display_alpha/sh_gradient_display_alpha.yy",},}, {"id":{"name":"sh_gradient_display","path":"shaders/sh_gradient_display/sh_gradient_display.yy",},}, @@ -1928,6 +1931,7 @@ {"id":{"name":"sh_noise","path":"shaders/sh_noise/sh_noise.yy",},}, {"id":{"name":"sh_normal_light","path":"shaders/sh_normal_light/sh_normal_light.yy",},}, {"id":{"name":"sh_normal","path":"shaders/sh_normal/sh_normal.yy",},}, + {"id":{"name":"sh_normalize","path":"shaders/sh_normalize/sh_normalize.yy",},}, {"id":{"name":"sh_offset","path":"shaders/sh_offset/sh_offset.yy",},}, {"id":{"name":"sh_outline_only","path":"shaders/sh_outline_only/sh_outline_only.yy",},}, {"id":{"name":"sh_outline","path":"shaders/sh_outline/sh_outline.yy",},}, @@ -2337,6 +2341,7 @@ {"id":{"name":"s_node_noise","path":"sprites/s_node_noise/s_node_noise.yy",},}, {"id":{"name":"s_node_normal_light","path":"sprites/s_node_normal_light/s_node_normal_light.yy",},}, {"id":{"name":"s_node_normal","path":"sprites/s_node_normal/s_node_normal.yy",},}, + {"id":{"name":"s_node_normalize","path":"sprites/s_node_normalize/s_node_normalize.yy",},}, {"id":{"name":"s_node_note","path":"sprites/s_node_note/s_node_note.yy",},}, {"id":{"name":"s_node_number","path":"sprites/s_node_number/s_node_number.yy",},}, {"id":{"name":"s_node_offset","path":"sprites/s_node_offset/s_node_offset.yy",},}, diff --git a/objects/o_main/Create_0.gml b/objects/o_main/Create_0.gml index 0a14b8d16..a84e905ff 100644 --- a/objects/o_main/Create_0.gml +++ b/objects/o_main/Create_0.gml @@ -1,9 +1,9 @@ /// @description init #region log var path = "log_temp.txt"; - var f = file_text_open_append(path); - file_text_write_string(f, $"[MESSAGE] {_log_template()}session begin\n"); - file_text_close(f); + var file = file_text_open_append(path); + file_text_write_string(file, $"[MESSAGE] {_log_template()}session begin\n"); + file_text_close(file); gpu_set_tex_mip_enable(mip_off); gc_enable(true); @@ -82,6 +82,7 @@ globalvar HOTKEY_MOD, HOTKEY_BLOCK; HOTKEY_MOD = 0; HOTKEY_BLOCK = false; + #endregion #region Loader diff --git a/scripts/buttonColor/buttonColor.gml b/scripts/buttonColor/buttonColor.gml index 2fb1a40f7..68fa7991b 100644 --- a/scripts/buttonColor/buttonColor.gml +++ b/scripts/buttonColor/buttonColor.gml @@ -118,15 +118,17 @@ function buttonColor(_onApply, dialog = noone) : widget() constructor { if(mouse_press(mb_left)) deactivate(); } - var _bx = _x + ui(4); - var _by = _y + ui(4); - var _bw = _cw - ui(8); - var _bh = _h - ui(8); + var _bx = _x + ui(2); + var _by = _y + ui(2); + var _bw = _cw - ui(4); + var _bh = _h - ui(4); if(is_array(current_color)) drawPalette(current_color, _bx, _by, _bw, _bh); + else if(is_real(current_color)) draw_sprite_stretched_ext(THEME.palette_mask, 1, _bx, _by, _bw, _bh, current_color, 1); + else if(is_int64(current_color)) { var _a = _color_get_alpha(current_color); diff --git a/scripts/buttonGradient/buttonGradient.gml b/scripts/buttonGradient/buttonGradient.gml index 2751ef161..2d3cdc9db 100644 --- a/scripts/buttonGradient/buttonGradient.gml +++ b/scripts/buttonGradient/buttonGradient.gml @@ -36,8 +36,8 @@ function buttonGradient(_onApply, dialog = noone) : widget() constructor { _w -= _bs + ui(8); } - var _gw = _w - ui(8); - var _gh = _h - ui(8); + var _gw = _w - ui(4); + var _gh = _h - ui(4); current_gradient = _gradient; @@ -74,8 +74,8 @@ function buttonGradient(_onApply, dialog = noone) : widget() constructor { for( var i = 0, n = array_length(_gradient); i < n; i++ ) { var _grad = _gradient[i]; - var _gx = _x + ui(4); - var _gy = _y + ui(4) + i * _gh; + var _gx = _x + ui(2); + var _gy = _y + ui(2) + i * _gh; if(is_instanceof(_grad, gradientObject)) _grad.draw(_gx, _gy, _gw, _gh); diff --git a/scripts/buttonPalette/buttonPalette.gml b/scripts/buttonPalette/buttonPalette.gml index 322ea9d9e..636e0519d 100644 --- a/scripts/buttonPalette/buttonPalette.gml +++ b/scripts/buttonPalette/buttonPalette.gml @@ -37,8 +37,8 @@ function buttonPalette(_onApply, dialog = noone) : widget() constructor { _w -= _bs + ui(8); } - var _pw = _w - ui(8); - var _ph = _h - ui(8); + var _pw = _w - ui(4); + var _ph = _h - ui(4); current_palette = _color; @@ -73,8 +73,8 @@ function buttonPalette(_onApply, dialog = noone) : widget() constructor { for( var i = 0, n = array_length(_color); i < n; i++ ) { var _pal = _color[i]; - var _px = _x + ui(4); - var _py = _y + ui(4) + i * _ph; + var _px = _x + ui(2); + var _py = _y + ui(2) + i * _ph; if(is_array(_pal)) drawPalette(_pal, _px, _py, _pw, _ph); } diff --git a/scripts/node_atlas_set/node_atlas_set.gml b/scripts/node_atlas_set/node_atlas_set.gml index 0098c7f30..295182130 100644 --- a/scripts/node_atlas_set/node_atlas_set.gml +++ b/scripts/node_atlas_set/node_atlas_set.gml @@ -5,25 +5,19 @@ function Node_Atlas_Set(_x, _y, _group = noone) : Node(_x, _y, _group) construct inputs[| 0] = nodeValue("Atlas", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone) .setVisible(true, true); - inputs[| 1] = nodeValue("Surface", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, []) - .setArrayDepth(1); + inputs[| 1] = nodeValue("Surface", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone); inputs[| 2] = nodeValue("Position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ]) - .setDisplay(VALUE_DISPLAY.vector) - .setArrayDepth(1); + .setDisplay(VALUE_DISPLAY.vector); - inputs[| 3] = nodeValue("Rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, []) - .setArrayDepth(1); + inputs[| 3] = nodeValue("Rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0); inputs[| 4] = nodeValue("Scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ]) - .setDisplay(VALUE_DISPLAY.vector) - .setArrayDepth(1); + .setDisplay(VALUE_DISPLAY.vector); - inputs[| 5] = nodeValue("Blend", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, []) - .setArrayDepth(1); + inputs[| 5] = nodeValue("Blend", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_white); - inputs[| 6] = nodeValue("Alpha", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, []) - .setArrayDepth(1); + inputs[| 6] = nodeValue("Alpha", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1); inputs[| 7] = nodeValue("Recalculate Position", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true); @@ -41,66 +35,88 @@ function Node_Atlas_Set(_x, _y, _group = noone) : Node(_x, _y, _group) construct if(!is_array(atl)) atl = [ atl ]; if(array_empty(atl)) return; - var surf = getInputData(1); - var posi = getInputData(2); - var rota = getInputData(3); - var scal = getInputData(4); - var blns = getInputData(5); - var alph = getInputData(6); var _rot = getInputData(7); - var use = array_create(7); - for( var i = 1; i < 7; i++ ) use[i] = inputs[| i].value_from != noone; + var use = array_create(6); + var len = array_create(6); + var val = array_create(6); - var n = array_length(atl); - var natl = array_create(n); + for( var i = 0; i < 7; i++ ) { + val[i] = getInputData(i); + len[i] = is_array(val[i])? array_length(val[i]) : 0; + use[i] = inputs[| i].value_from != noone; + } + + var n = array_length(atl); + var natl = []; + var _ind = 0; + var _at, _newAtl, _surf, _val; for( var i = 0; i < n; i++ ) { - var _at = atl[i]; + _at = atl[i]; if(!is_instanceof(_at, SurfaceAtlas)) continue; - natl[i] = _at.clone(); + _newAtl = _at.clone(); + _surf = _at.surface.get(); - var _surf = _at.surface.get(); - - if(use[1]) natl[i].setSurface(array_safe_get_fast(surf, i)); - - if(use[2]) { - var pos = array_safe_get_fast(posi, i); - natl[i].x = array_safe_get_fast(pos, 0); - natl[i].y = array_safe_get_fast(pos, 1); + if(use[1] && (len[1] == 0 || i < len[1])) { + _val = len[1] == 0? val[1] : val[1][i]; + + _newAtl.setSurface(_val); } - if(use[3]) { - var _or = natl[i].rotation; - var _nr = array_safe_get_fast(rota, i); + if(use[2] && (len[2] == 0 || i < len[2])) { + _val = len[2] == 0? val[2] : val[2][i]; - natl[i].rotation = _nr; + _newAtl.x = array_safe_get_fast(_val, 0); + _newAtl.y = array_safe_get_fast(_val, 1); + } + + if(use[3] && (len[3] == 0 || i < len[3])) { + _val = len[3] == 0? val[3] : val[3][i]; + + var _or = _newAtl.rotation; + var _nr = _val; + + _newAtl.rotation = _nr; if(_rot) { - var _sw = surface_get_width_safe(_surf) * natl[i].sx; - var _sh = surface_get_height_safe(_surf) * natl[i].sy; + var _sw = surface_get_width_safe(_surf) * _newAtl.sx; + var _sh = surface_get_height_safe(_surf) * _newAtl.sy; var p0 = point_rotate(0, 0, _sw / 2, _sh / 2, -_or); var p1 = point_rotate(0, 0, _sw / 2, _sh / 2, _nr); - natl[i].x = natl[i].x - p0[1] + p1[0]; - natl[i].y = natl[i].y - p0[0] + p1[1]; + _newAtl.x = _newAtl.x - p0[1] + p1[0]; + _newAtl.y = _newAtl.y - p0[0] + p1[1]; } } - if(use[4]) { - var sca = array_safe_get_fast(scal, i); - natl[i].sx = array_safe_get_fast(sca, 0, 1); - natl[i].sy = array_safe_get_fast(sca, 1, 1); + if(use[4] && (len[4] == 0 || i < len[4])) { + _val = len[4] == 0? val[4] : val[4][i]; + + _newAtl.sx = array_safe_get_fast(_val, 0, 1); + _newAtl.sy = array_safe_get_fast(_val, 1, 1); } - if(use[5]) natl[i].blend = array_safe_get_fast(blns, i); + if(use[5] && (len[5] == 0 || i < len[5])) { + _val = len[5] == 0? val[5] : val[5][i]; + + _newAtl.blend = _val; + } - if(use[6]) natl[i].alpha = array_safe_get_fast(alph, i); + if(use[6] && (len[6] == 0 || i < len[6])) { + _val = len[6] == 0? val[6] : val[6][i]; + + _newAtl.alpha = _val; + } + + natl[_ind] = _newAtl; + _ind++; } + array_resize(natl, _ind); outputs[| 0].setValue(natl); } } \ No newline at end of file diff --git a/scripts/node_dither/node_dither.gml b/scripts/node_dither/node_dither.gml index abb8cafa7..7c73d3a07 100644 --- a/scripts/node_dither/node_dither.gml +++ b/scripts/node_dither/node_dither.gml @@ -51,12 +51,18 @@ function Node_Dither(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co inputs[| 13] = nodeValue("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, seed_random(6)) .setDisplay(VALUE_DISPLAY._default, { side_button : button(function() { inputs[| 13].setValue(seed_random(6)); }).setIcon(THEME.icon_random, 0, COLORS._main_icon) }); + inputs[| 14] = nodeValue("Use palette", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true); + + inputs[| 15] = nodeValue("Steps", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 4) + .setDisplay(VALUE_DISPLAY.slider, { range: [2, 16, 0.1] }); + outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ 9, 10, 13, ["Surfaces", true], 0, 7, 8, 11, 12, ["Pattern", false], 2, 3, - ["Dither", false], 6, 1, 4, 5 + ["Dither", false], 6, 4, 5, + ["Palette", false, 14], 1, 15, ] attribute_surface_depth(); @@ -64,13 +70,16 @@ function Node_Dither(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co static step = function() { #region __step_mask_modifier(); - var _type = getInputData(2); - var _mode = getInputData(6); + var _type = getInputData(2); + var _mode = getInputData(6); + var _use_pal = getInputData(14); inputs[| 3].setVisible(_type == 4, _type == 4); - inputs[| 1].setVisible(_mode == 0); + inputs[| 1].setVisible(_mode == 0 && _use_pal); inputs[| 4].setVisible(_mode == 0); inputs[| 5].setVisible(_mode == 0); + + inputs[| 15].setVisible(!_use_pal); } #endregion static processData = function(_outSurf, _data, _output_index, _array_index) { @@ -81,6 +90,8 @@ function Node_Dither(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co var _conMap = _data[5]; var _mode = _data[6]; var _seed = _data[13]; + var _usepal = _data[14]; + var _step = _data[15]; surface_set_shader(_outSurf, _mode? sh_alpha_hash : sh_dither); shader_set_f("dimension", surface_get_dimension(_data[0])); @@ -123,7 +134,9 @@ function Node_Dither(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co shader_set_i("useConMap", is_surface(_conMap)); shader_set_surface("conMap", _conMap); + shader_set_i("usePalette", _usepal); shader_set_f("palette", paletteToArray(_pal)); + shader_set_f("colors", _step); shader_set_i("keys", array_length(_pal)); } diff --git a/scripts/node_normalize/node_color_adjustment.yy b/scripts/node_normalize/node_color_adjustment.yy new file mode 100644 index 000000000..8df16cc8c --- /dev/null +++ b/scripts/node_normalize/node_color_adjustment.yy @@ -0,0 +1,12 @@ +{ + "isDnD": false, + "isCompatibility": false, + "parent": { + "name": "filter", + "path": "folders/nodes/data/filter.yy", + }, + "resourceVersion": "1.0", + "name": "node_color_adjustment", + "tags": [], + "resourceType": "GMScript", +} \ No newline at end of file diff --git a/scripts/node_normalize/node_color_replacement.yy b/scripts/node_normalize/node_color_replacement.yy new file mode 100644 index 000000000..024aa6a80 --- /dev/null +++ b/scripts/node_normalize/node_color_replacement.yy @@ -0,0 +1,12 @@ +{ + "isDnD": false, + "isCompatibility": false, + "parent": { + "name": "process", + "path": "folders/nodes/data/process.yy", + }, + "resourceVersion": "1.0", + "name": "node_color_replacement", + "tags": [], + "resourceType": "GMScript", +} \ No newline at end of file diff --git a/scripts/node_normalize/node_greyscale.yy b/scripts/node_normalize/node_greyscale.yy new file mode 100644 index 000000000..ee372977e --- /dev/null +++ b/scripts/node_normalize/node_greyscale.yy @@ -0,0 +1,12 @@ +{ + "isDnD": false, + "isCompatibility": false, + "parent": { + "name": "filter", + "path": "folders/nodes/data/filter.yy", + }, + "resourceVersion": "1.0", + "name": "node_greyscale", + "tags": [], + "resourceType": "GMScript", +} \ No newline at end of file diff --git a/scripts/node_normalize/node_normalize.gml b/scripts/node_normalize/node_normalize.gml new file mode 100644 index 000000000..4cc4bd0fa --- /dev/null +++ b/scripts/node_normalize/node_normalize.gml @@ -0,0 +1,100 @@ +function Node_Normalize(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor { + name = "Normalize"; + + inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone); + + input_display_list = [ 0 ]; + + outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); + + attribute_surface_depth(); + + temp_surface = [ surface_create(1, 1), surface_create(1, 1), surface_create(1, 1), surface_create(1, 1) ]; + + static step = function() { #region + + } #endregion + + static processData = function(_outSurf, _data, _output_index, _array_index) { #region + var _surf = _data[0]; + + var _sw = surface_get_width(_surf); + var _sh = surface_get_height(_surf); + var _itr = ceil(logn(4, _sw * _sh / 1024)); + + var _sww = ceil(_sw / 2); + var _shh = ceil(_sh / 2); + + for (var i = 0, n = array_length(temp_surface); i < n; i++) + temp_surface[i] = surface_verify(temp_surface[i], _sw, _sh); + + surface_set_shader(temp_surface[0]); + draw_surface(_surf, 0, 0); + surface_reset_shader(); + + surface_set_shader(temp_surface[1]); + draw_surface(_surf, 0, 0); + surface_reset_shader(); + + surface_clear(temp_surface[2]); + surface_clear(temp_surface[3]); + + var _ind = 1; + repeat(_itr) { + surface_resize(temp_surface[(_ind) * 2 + 0], _sww, _shh); + surface_resize(temp_surface[(_ind) * 2 + 1], _sww, _shh); + + shader_set(sh_get_max_downsampled); + surface_set_target_ext(0, temp_surface[(_ind) * 2 + 0]); + surface_set_target_ext(1, temp_surface[(_ind) * 2 + 1]); + shader_set_f("dimension", _sww, _shh); + shader_set_surface("surfaceMax", temp_surface[(!_ind) * 2 + 0]); + shader_set_surface("surfaceMin", temp_surface[(!_ind) * 2 + 1]); + + draw_sprite_stretched(s_fx_pixel, 0, 0, 0, _sww, _shh); + surface_reset_target(); + shader_reset(); + + _sww = ceil(_sww / 2); + _shh = ceil(_shh / 2); + + _ind = !_ind; + } + + var _sMax = temp_surface[(!_ind) * 2 + 0]; + var _sMin = temp_surface[(!_ind) * 2 + 1]; + var _ssw = surface_get_width(_sMax); + var _ssh = surface_get_height(_sMax); + var _max = [ 0, 0, 0 ]; + var _min = [ 1, 1, 1 ]; + var _bMax = buffer_from_surface(_sMax, false); + var _bMin = buffer_from_surface(_sMin, false); + + buffer_seek(_bMax, buffer_seek_start, 0); + buffer_seek(_bMin, buffer_seek_start, 0); + repeat(_ssw * _ssh) { + var _cc = buffer_read(_bMax, buffer_u32); + _max[0] = max(_max[0], _color_get_red(_cc)); + _max[1] = max(_max[1], _color_get_green(_cc)); + _max[2] = max(_max[2], _color_get_blue(_cc)); + + var _cc = buffer_read(_bMin, buffer_u32); + _min[0] = min(_min[0], _color_get_red(_cc)); + _min[1] = min(_min[1], _color_get_green(_cc)); + _min[2] = min(_min[2], _color_get_blue(_cc)); + + } + buffer_delete(_bMax); + buffer_delete(_bMin); + #endregion + + surface_set_shader(_outSurf, sh_normalize); + shader_set_f("cMax", _max); + shader_set_f("cMin", _min); + + draw_surface_safe(_surf); + surface_reset_shader(); + + return _outSurf; + } #endregion +} \ No newline at end of file diff --git a/scripts/node_normalize/node_normalize.yy b/scripts/node_normalize/node_normalize.yy new file mode 100644 index 000000000..f3b19377b --- /dev/null +++ b/scripts/node_normalize/node_normalize.yy @@ -0,0 +1,13 @@ +{ + "$GMScript":"", + "%Name":"node_normalize", + "isCompatibility":false, + "isDnD":false, + "name":"node_normalize", + "parent":{ + "name":"colors", + "path":"folders/nodes/data/filter/colors.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", +} \ No newline at end of file diff --git a/scripts/node_normalize/node_outline.yy b/scripts/node_normalize/node_outline.yy new file mode 100644 index 000000000..86468bc09 --- /dev/null +++ b/scripts/node_normalize/node_outline.yy @@ -0,0 +1,12 @@ +{ + "isDnD": false, + "isCompatibility": false, + "parent": { + "name": "process", + "path": "folders/nodes/data/process.yy", + }, + "resourceVersion": "1.0", + "name": "node_outline", + "tags": [], + "resourceType": "GMScript", +} \ No newline at end of file diff --git a/scripts/node_posterize/node_posterize.gml b/scripts/node_posterize/node_posterize.gml index baee26552..dcb0a0c29 100644 --- a/scripts/node_posterize/node_posterize.gml +++ b/scripts/node_posterize/node_posterize.gml @@ -8,11 +8,11 @@ function Node_Posterize(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) inputs[| 2] = nodeValue("Use palette", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true); - inputs[| 3] = nodeValue("Colors", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 4) + inputs[| 3] = nodeValue("Steps", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 4) .setDisplay(VALUE_DISPLAY.slider, { range: [2, 16, 0.1] }); - inputs[| 4] = nodeValue("Gamma", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.6) - .setDisplay(VALUE_DISPLAY.slider) + inputs[| 4] = nodeValue("Gamma", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1) + .setDisplay(VALUE_DISPLAY.slider, { range: [0, 2, 0.01] }) .setMappable(7); inputs[| 5] = nodeValue("Active", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true); @@ -38,6 +38,8 @@ function Node_Posterize(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) attribute_surface_depth(); + temp_surface = [ surface_create(1, 1), surface_create(1, 1), surface_create(1, 1), surface_create(1, 1) ]; + static step = function() { var _use_pal = getInputData(2); @@ -49,6 +51,7 @@ function Node_Posterize(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) } static processData = function(_outSurf, _data, _output_index, _array_index) { + var _surf = _data[0]; var _pal = _data[1]; var _use_pal = _data[2]; var _alp = _data[6]; @@ -61,16 +64,89 @@ function Node_Posterize(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) shader_set_i("alpha", _alp); shader_set_i("space", _spce); - draw_surface_safe(_data[0]); + draw_surface_safe(_surf); surface_reset_shader(); } else { + #region get range + var _sw = surface_get_width(_surf); + var _sh = surface_get_height(_surf); + var _itr = ceil(logn(4, _sw * _sh / 1024)); + + var _sww = ceil(_sw / 2); + var _shh = ceil(_sh / 2); + + for (var i = 0, n = array_length(temp_surface); i < n; i++) + temp_surface[i] = surface_verify(temp_surface[i], _sw, _sh); + + surface_set_shader(temp_surface[0]); + draw_surface(_surf, 0, 0); + surface_reset_shader(); + + surface_set_shader(temp_surface[1]); + draw_surface(_surf, 0, 0); + surface_reset_shader(); + + surface_clear(temp_surface[2]); + surface_clear(temp_surface[3]); + + var _ind = 1; + repeat(_itr) { + surface_resize(temp_surface[(_ind) * 2 + 0], _sww, _shh); + surface_resize(temp_surface[(_ind) * 2 + 1], _sww, _shh); + + shader_set(sh_get_max_downsampled); + surface_set_target_ext(0, temp_surface[(_ind) * 2 + 0]); + surface_set_target_ext(1, temp_surface[(_ind) * 2 + 1]); + shader_set_f("dimension", _sww, _shh); + shader_set_surface("surfaceMax", temp_surface[(!_ind) * 2 + 0]); + shader_set_surface("surfaceMin", temp_surface[(!_ind) * 2 + 1]); + + draw_sprite_stretched(s_fx_pixel, 0, 0, 0, _sww, _shh); + surface_reset_target(); + shader_reset(); + + _sww = ceil(_sww / 2); + _shh = ceil(_shh / 2); + + _ind = !_ind; + } + + var _sMax = temp_surface[(!_ind) * 2 + 0]; + var _sMin = temp_surface[(!_ind) * 2 + 1]; + var _ssw = surface_get_width(_sMax); + var _ssh = surface_get_height(_sMax); + var _max = [ 0, 0, 0 ]; + var _min = [ 1, 1, 1 ]; + var _bMax = buffer_from_surface(_sMax, false); + var _bMin = buffer_from_surface(_sMin, false); + + buffer_seek(_bMax, buffer_seek_start, 0); + buffer_seek(_bMin, buffer_seek_start, 0); + repeat(_ssw * _ssh) { + var _cc = buffer_read(_bMax, buffer_u32); + _max[0] = max(_max[0], _color_get_red(_cc)); + _max[1] = max(_max[1], _color_get_green(_cc)); + _max[2] = max(_max[2], _color_get_blue(_cc)); + + var _cc = buffer_read(_bMin, buffer_u32); + _min[0] = min(_min[0], _color_get_red(_cc)); + _min[1] = min(_min[1], _color_get_green(_cc)); + _min[2] = min(_min[2], _color_get_blue(_cc)); + + } + buffer_delete(_bMax); + buffer_delete(_bMin); + #endregion + surface_set_shader(_outSurf, sh_posterize); - shader_set_i("colors", _data[3]); + shader_set_f("cMax", _max); + shader_set_f("cMin", _min); + shader_set_f("colors", _data[3]); shader_set_f_map("gamma", _data[4], _data[7], inputs[| 4]); shader_set_i("alpha", _alp); - draw_surface_safe(_data[0]); + draw_surface_safe(_surf); surface_reset_shader(); } diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index 3f83fa71a..859043a36 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -620,6 +620,7 @@ function __initNodes() { addNodeObject(filter, "Curve", s_node_curve_edit, "Node_Curve", [1, Node_Curve],, "Adjust brightness of an image using curves.").setVersion(1120); addNodeObject(filter, "Threshold", s_node_threshold, "Node_Threshold", [1, Node_Threshold],, "Set a threshold where pixel darker will becomes black, and brighter to white. Also works with alpha.").setVersion(1080); addNodeObject(filter, "Alpha Cutoff", s_node_alpha_cut, "Node_Alpha_Cutoff", [1, Node_Alpha_Cutoff], ["remove alpha"], "Remove pixel with low alpha value."); + addNodeObject(filter, "Normalize", s_node_normalize, "Node_Normalize", [1, Node_Normalize]).setVersion(11710); addNodeObject(filter, "Gamma Map", s_node_gamma_map, "Node_Gamma_Map", [1, Node_Gamma_Map]).setVersion(11660); addNodeObject(filter, "ACE", s_node_ace, "Node_Tonemap_ACE", [1, Node_Tonemap_ACE],, "Apply ACE tonemapping.").setVersion(11710); diff --git a/scripts/node_rigid_render_output/node_rigid_render_output.gml b/scripts/node_rigid_render_output/node_rigid_render_output.gml index 2d42534a4..849e828bd 100644 --- a/scripts/node_rigid_render_output/node_rigid_render_output.gml +++ b/scripts/node_rigid_render_output/node_rigid_render_output.gml @@ -2,7 +2,6 @@ function Node_Rigid_Render_Output(_x, _y, _group = noone) : Node_Group_Output(_x name = "Render"; color = COLORS.node_blend_simulation; icon = THEME.rigidSim; - //use_cache = CACHE_USE.auto; manual_ungroupable = false; @@ -25,11 +24,6 @@ function Node_Rigid_Render_Output(_x, _y, _group = noone) : Node_Group_Output(_x attributes.show_objects = !attributes.show_objects; })]); - insp2UpdateTooltip = "Clear cache"; - insp2UpdateIcon = [ THEME.cache, 0, COLORS._main_icon ]; - - static onInspector2Update = function() { clearCache(); } - static createNewInput = function() { #region var index = ds_list_size(inputs); inputs[| index] = nodeValue("Object", self, JUNCTION_CONNECT.input, VALUE_TYPE.rigid, noone ) @@ -136,18 +130,18 @@ function Node_Rigid_Render_Output(_x, _y, _group = noone) : Node_Group_Output(_x physics_draw_debug(); surface_reset_target(); - cacheCurrentFrame(_outSurf); + // cacheCurrentFrame(_outSurf); } #endregion - static recoverCache = function(frame = CURRENT_FRAME) { #region - if(!is_instanceof(outParent, NodeValue)) return false; - if(!cacheExist(frame)) return false; + // static recoverCache = function(frame = CURRENT_FRAME) { #region + // if(!is_instanceof(outParent, NodeValue)) return false; + // if(!cacheExist(frame)) return false; - var _s = cached_output[CURRENT_FRAME]; - outParent.setValue(_s); + // var _s = cached_output[CURRENT_FRAME]; + // outParent.setValue(_s); - return true; - } #endregion + // return true; + // } #endregion static getGraphPreviewSurface = function() { #region if(!is_instanceof(outParent, NodeValue)) return noone; diff --git a/scripts/node_value/node_value.gml b/scripts/node_value/node_value.gml index f717a5026..2959e6514 100644 --- a/scripts/node_value/node_value.gml +++ b/scripts/node_value/node_value.gml @@ -947,7 +947,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru var _dim = struct_try_get(display_data, "useGlobal", true); extract_node = [ "Node_Vector2", "Node_Path" ]; - if(_dim && def_val == DEF_SURF) { + if(_dim && array_equals(def_val, DEF_SURF)) { value_tag = "dimension"; node.attributes.use_project_dimension = true; editWidget.side_button = button(function() { diff --git a/scripts/panel_file_explorer/panel_file_explorer.gml b/scripts/panel_file_explorer/panel_file_explorer.gml index d35624291..36b02d75c 100644 --- a/scripts/panel_file_explorer/panel_file_explorer.gml +++ b/scripts/panel_file_explorer/panel_file_explorer.gml @@ -183,9 +183,7 @@ function Panel_File_Explorer() : PanelContent() constructor { grid_size = ui(64); - tb_root = new textBox(TEXTBOX_INPUT.text, function(val) { - setRoot(val); - }); + tb_root = new textBox(TEXTBOX_INPUT.text, function(val) { setRoot(val); }); file_selectings = []; file_hovering = noone; @@ -330,6 +328,12 @@ function Panel_File_Explorer() : PanelContent() constructor { file_dragging = false; path_dragging = -1; + + } else if(key_mod_press(CTRL)) { + + pieMenuCall("", mouse_mx, mouse_my, [ + + ]); } } diff --git a/scripts/panel_inspector/panel_inspector.gml b/scripts/panel_inspector/panel_inspector.gml index 40e1bdf03..18e14d624 100644 --- a/scripts/panel_inspector/panel_inspector.gml +++ b/scripts/panel_inspector/panel_inspector.gml @@ -668,7 +668,8 @@ function Panel_Inspector() : PanelContent() constructor { jun_disp.rx = ui(16) + x; jun_disp.ry = top_bar_h + y; - hh += jun_disp.draw(ui(6), yy, con_w - ui(12), _m, _hover, pFOCUS) + ui(8); + var _wdh = jun_disp.draw(ui(6), yy, con_w - ui(12), _m, _hover, pFOCUS) + ui(8); + if(!is_undefined(_wdh)) hh += _wdh; continue; } jun = _inspecting.inputs[| _inspecting.input_display_list[i]]; diff --git a/scripts/tooltip_hotkey/tooltip_hotkey.gml b/scripts/tooltip_hotkey/tooltip_hotkey.gml index 9e0114abf..b910e4eb9 100644 --- a/scripts/tooltip_hotkey/tooltip_hotkey.gml +++ b/scripts/tooltip_hotkey/tooltip_hotkey.gml @@ -13,7 +13,7 @@ function tooltipHotkey(text, context = "", name = "") constructor { draw_set_font(f_p1); var _w2 = string_width(keyStr); - var tw = min(WIN_W - ui(32), _w1 + ui(16) + _w2); + var tw = min(WIN_W - ui(32), _w1 + ui(24) + _w2); var th = string_height_ext(text, -1, tw); var mx = min(mouse_mx + ui(16), WIN_W - (tw + ui(16))); @@ -27,6 +27,12 @@ function tooltipHotkey(text, context = "", name = "") constructor { draw_text_line(mx + ui(8), my + ui(8), text, -1, tw); draw_set_text(f_p1, fa_right, fa_center, COLORS._main_text_sub); - draw_text_line(mx + tw + ui(8), my + th / 2 + ui(10), keyStr, -1, tw); + var _tw = string_width( keyStr); + var _th = string_height(keyStr); + var _hx = mx + tw + ui(6); + var _hy = my + th / 2 + ui(10); + + draw_sprite_stretched_ext(THEME.ui_panel_fg, 1, _hx - _tw - ui(4), _hy - _th / 2 - ui(3), _tw + ui(8), _th + ui(3), COLORS._main_text_sub, 0.5); + draw_text(_hx, _hy, keyStr); } } \ No newline at end of file diff --git a/shaders/sh_color_adjust/sh_color_adjust.fsh b/shaders/sh_color_adjust/sh_color_adjust.fsh index 39dde8d63..b915bb19c 100644 --- a/shaders/sh_color_adjust/sh_color_adjust.fsh +++ b/shaders/sh_color_adjust/sh_color_adjust.fsh @@ -36,89 +36,91 @@ uniform vec2 blendAmount; uniform int blendAmountUseSurf; uniform int blendMode; -vec3 rgb2hsv(vec3 c) { #region - vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); - vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); - vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); - - float d = q.x - min(q.w, q.y); - float e = 0.0000000001; - return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); - } #endregion - -vec3 hsv2rgb(vec3 c) { #region - vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); - vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); - return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); -} #endregion - -float hue2rgb( in float m1, in float m2, in float hue) { #region - if (hue < 0.0) - hue += 1.0; - else if (hue > 1.0) - hue -= 1.0; - - if ((6.0 * hue) < 1.0) - return m1 + (m2 - m1) * hue * 6.0; - else if ((2.0 * hue) < 1.0) - return m2; - else if ((3.0 * hue) < 2.0) - return m1 + (m2 - m1) * ((2.0 / 3.0) - hue) * 6.0; - else - return m1; -} #endregion - -vec3 hsl2rgb( in vec3 hsl ) { #region - float r, g, b; - if(hsl.y == 0.) { - r = hsl.z; - g = hsl.z; - b = hsl.z; - } else { - float m1, m2; - if(hsl.z <= 0.5) - m2 = hsl.z * (1. + hsl.y); - else - m2 = hsl.z + hsl.y - hsl.z * hsl.y; - m1 = 2. * hsl.z - m2; - - r = hue2rgb(m1, m2, hsl.x + 1. / 3.); - g = hue2rgb(m1, m2, hsl.x); - b = hue2rgb(m1, m2, hsl.x - 1. / 3.); - } +#region =========================================== COLORS SPACES =========================================== + vec3 rgb2hsv(vec3 c) { #region + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); - return vec3( r, g, b ); -} #endregion - -vec3 rgb2hsl( in vec3 c ) { #region - float h = 0.0; - float s = 0.0; - float l = 0.0; - float r = c.r; - float g = c.g; - float b = c.b; - float cMin = min( r, min( g, b ) ); - float cMax = max( r, max( g, b ) ); - - l = ( cMax + cMin ) / 2.0; - if ( cMax > cMin ) { - float cDelta = cMax - cMin; - - s = l < .5 ? cDelta / ( cMax + cMin ) : cDelta / ( 2.0 - ( cMax + cMin ) ); - - if ( r == cMax ) - h = ( g - b ) / cDelta; - else if ( g == cMax ) - h = 2.0 + ( b - r ) / cDelta; + float d = q.x - min(q.w, q.y); + float e = 0.0000000001; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } #endregion + + vec3 hsv2rgb(vec3 c) { #region + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } #endregion + + float hue2rgb( in float m1, in float m2, in float hue) { #region + if (hue < 0.0) + hue += 1.0; + else if (hue > 1.0) + hue -= 1.0; + + if ((6.0 * hue) < 1.0) + return m1 + (m2 - m1) * hue * 6.0; + else if ((2.0 * hue) < 1.0) + return m2; + else if ((3.0 * hue) < 2.0) + return m1 + (m2 - m1) * ((2.0 / 3.0) - hue) * 6.0; else - h = 4.0 + ( r - g ) / cDelta; + return m1; + } #endregion + + vec3 hsl2rgb( in vec3 hsl ) { #region + float r, g, b; + if(hsl.y == 0.) { + r = hsl.z; + g = hsl.z; + b = hsl.z; + } else { + float m1, m2; + if(hsl.z <= 0.5) + m2 = hsl.z * (1. + hsl.y); + else + m2 = hsl.z + hsl.y - hsl.z * hsl.y; + m1 = 2. * hsl.z - m2; + + r = hue2rgb(m1, m2, hsl.x + 1. / 3.); + g = hue2rgb(m1, m2, hsl.x); + b = hue2rgb(m1, m2, hsl.x - 1. / 3.); + } - if ( h < 0.0) - h += 6.0; - h = h / 6.0; - } - return vec3( h, s, l ); -} #endregion + return vec3( r, g, b ); + } #endregion + + vec3 rgb2hsl( in vec3 c ) { #region + float h = 0.0; + float s = 0.0; + float l = 0.0; + float r = c.r; + float g = c.g; + float b = c.b; + float cMin = min( r, min( g, b ) ); + float cMax = max( r, max( g, b ) ); + + l = ( cMax + cMin ) / 2.0; + if ( cMax > cMin ) { + float cDelta = cMax - cMin; + + s = l < .5 ? cDelta / ( cMax + cMin ) : cDelta / ( 2.0 - ( cMax + cMin ) ); + + if ( r == cMax ) + h = ( g - b ) / cDelta; + else if ( g == cMax ) + h = 2.0 + ( b - r ) / cDelta; + else + h = 4.0 + ( r - g ) / cDelta; + + if ( h < 0.0) + h += 6.0; + h = h / 6.0; + } + return vec3( h, s, l ); + } #endregion +#endregion =========================================== COLORS SPACES =========================================== void main() { vec4 col = texture2D( gm_BaseTexture, v_vTexcoord ); diff --git a/shaders/sh_dither/sh_dither.fsh b/shaders/sh_dither/sh_dither.fsh index 65e996528..d9531bb7e 100644 --- a/shaders/sh_dither/sh_dither.fsh +++ b/shaders/sh_dither/sh_dither.fsh @@ -19,6 +19,9 @@ uniform vec4 palette[32]; uniform int keys; uniform float seed; +uniform int usePalette; +uniform float colors; + float random (in vec2 st, float seed) { return fract(sin(dot(st.xy, vec2(1892.9898, 78.23453))) * (seed + 437.54123)); } #region ============================== COLOR SPACES ============================== @@ -56,38 +59,52 @@ float random (in vec2 st, float seed) { return fract(sin(dot(st.xy, vec2(1892.98 #endregion void main() { #region - vec4 _col = v_vColour * texture2D( gm_BaseTexture, v_vTexcoord ); + vec4 _col = texture2D( gm_BaseTexture, v_vTexcoord ); - bool exactColor = false; - int closet1_index = 0; - int closet2_index = 0; - float closet1_value = 99.; - float closet2_value = 99.; + bool exactColor = false; + vec4 col1, col2; - for(int i = 0; i < keys; i++) { - vec4 p_col = palette[i]; - float dif = colorDifferent(p_col, _col); + if(usePalette == 0) { + col1 = floor(_col * colors) / colors; + col2 = ceil( _col * colors) / colors; - if(dif <= 0.001) { - exactColor = true; - _col = p_col; - } else if(dif < closet1_value) { - closet2_value = closet1_value; - closet2_index = closet1_index; + col1.a = _col.a; + col2.a = _col.a; + + exactColor = distance(_col, col1) < 0.05; + + } else if(usePalette == 1) { + int closet1_index = 0; + int closet2_index = 0; + float closet1_value = 99.; + float closet2_value = 99.; + + for(int i = 0; i < keys; i++) { + vec4 p_col = palette[i]; + float dif = colorDifferent(p_col, _col); - closet1_value = dif; - closet1_index = i; - } else if(dif < closet2_value) { - closet2_value = dif; - closet2_index = i; + if(dif <= 0.001) { + exactColor = true; + _col = p_col; + } else if(dif < closet1_value) { + closet2_value = closet1_value; + closet2_index = closet1_index; + + closet1_value = dif; + closet1_index = i; + } else if(dif < closet2_value) { + closet2_value = dif; + closet2_index = i; + } } + + col1 = palette[closet1_index]; + col2 = palette[closet2_index]; } if(exactColor) { gl_FragColor = _col; } else { - vec4 col1 = palette[closet1_index]; - vec4 col2 = palette[closet2_index]; float d1 = colorDifferent(_col, col1); float d2 = colorDifferent(_col, col2); float rat = d1 / (d1 + d2); diff --git a/shaders/sh_get_max_downsampled/sh_get_max_downsampled.fsh b/shaders/sh_get_max_downsampled/sh_get_max_downsampled.fsh new file mode 100644 index 000000000..bc08a0097 --- /dev/null +++ b/shaders/sh_get_max_downsampled/sh_get_max_downsampled.fsh @@ -0,0 +1,27 @@ +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +uniform vec2 dimension; +uniform sampler2D surfaceMax; +uniform sampler2D surfaceMin; + +vec4 sample(sampler2D tex, vec2 pos) { return texture2D( tex, clamp(pos, 0., 1.) ); } + +void main() { + vec2 tx = 1. / dimension; + + vec4 cMax = vec4(0.); + cMax = max(cMax, sample( surfaceMax, v_vTexcoord + vec2(0., 0.) * tx )); + cMax = max(cMax, sample( surfaceMax, v_vTexcoord + vec2(1., 0.) * tx )); + cMax = max(cMax, sample( surfaceMax, v_vTexcoord + vec2(0., 1.) * tx )); + cMax = max(cMax, sample( surfaceMax, v_vTexcoord + vec2(1., 1.) * tx )); + + vec4 cMin = vec4(1.); + cMin = min(cMin, sample( surfaceMax, v_vTexcoord + vec2(0., 0.) * tx )); + cMin = min(cMin, sample( surfaceMax, v_vTexcoord + vec2(1., 0.) * tx )); + cMin = min(cMin, sample( surfaceMax, v_vTexcoord + vec2(0., 1.) * tx )); + cMin = min(cMin, sample( surfaceMax, v_vTexcoord + vec2(1., 1.) * tx )); + + gl_FragData[0] = cMax; + gl_FragData[1] = cMin; +} diff --git a/shaders/sh_get_max_downsampled/sh_get_max_downsampled.vsh b/shaders/sh_get_max_downsampled/sh_get_max_downsampled.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_get_max_downsampled/sh_get_max_downsampled.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_get_max_downsampled/sh_get_max_downsampled.yy b/shaders/sh_get_max_downsampled/sh_get_max_downsampled.yy new file mode 100644 index 000000000..47251977e --- /dev/null +++ b/shaders/sh_get_max_downsampled/sh_get_max_downsampled.yy @@ -0,0 +1,12 @@ +{ + "$GMShader":"", + "%Name":"sh_get_max_downsampled", + "name":"sh_get_max_downsampled", + "parent":{ + "name":"misc", + "path":"folders/shader/misc.yy", + }, + "resourceType":"GMShader", + "resourceVersion":"2.0", + "type":1, +} \ No newline at end of file diff --git a/shaders/sh_get_min_downsampled/sh_get_min_downsampled.fsh b/shaders/sh_get_min_downsampled/sh_get_min_downsampled.fsh new file mode 100644 index 000000000..fc4ee45a3 --- /dev/null +++ b/shaders/sh_get_min_downsampled/sh_get_min_downsampled.fsh @@ -0,0 +1,17 @@ +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +uniform vec2 dimension; +uniform sampler2D surface; + +void main() { + vec2 tx = 1. / dimension; + + vec4 c = vec4(0.); + c = min(c, texture2D( surface, v_vTexcoord + vec2(0., 0.) * tx )); + c = min(c, texture2D( surface, v_vTexcoord + vec2(1., 0.) * tx )); + c = min(c, texture2D( surface, v_vTexcoord + vec2(0., 1.) * tx )); + c = min(c, texture2D( surface, v_vTexcoord + vec2(1., 1.) * tx )); + + gl_FragColor = c; +} diff --git a/shaders/sh_get_min_downsampled/sh_get_min_downsampled.vsh b/shaders/sh_get_min_downsampled/sh_get_min_downsampled.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_get_min_downsampled/sh_get_min_downsampled.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_get_min_downsampled/sh_get_min_downsampled.yy b/shaders/sh_get_min_downsampled/sh_get_min_downsampled.yy new file mode 100644 index 000000000..3931279fd --- /dev/null +++ b/shaders/sh_get_min_downsampled/sh_get_min_downsampled.yy @@ -0,0 +1,12 @@ +{ + "$GMShader":"", + "%Name":"sh_get_min_downsampled", + "name":"sh_get_min_downsampled", + "parent":{ + "name":"misc", + "path":"folders/shader/misc.yy", + }, + "resourceType":"GMShader", + "resourceVersion":"2.0", + "type":1, +} \ No newline at end of file diff --git a/shaders/sh_normalize/sh_normalize.fsh b/shaders/sh_normalize/sh_normalize.fsh new file mode 100644 index 000000000..ba5437870 --- /dev/null +++ b/shaders/sh_normalize/sh_normalize.fsh @@ -0,0 +1,13 @@ +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +uniform vec3 cMin, cMax; + +void main() { + vec4 c = texture2D( gm_BaseTexture, v_vTexcoord ); + + vec3 cRan = cMax - cMin; + vec3 col = (c.rgb - cMin) / cRan; + + gl_FragColor = vec4(col, c.a); +} diff --git a/shaders/sh_normalize/sh_normalize.vsh b/shaders/sh_normalize/sh_normalize.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_normalize/sh_normalize.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_normalize/sh_normalize.yy b/shaders/sh_normalize/sh_normalize.yy new file mode 100644 index 000000000..65555b742 --- /dev/null +++ b/shaders/sh_normalize/sh_normalize.yy @@ -0,0 +1,12 @@ +{ + "$GMShader":"", + "%Name":"sh_normalize", + "name":"sh_normalize", + "parent":{ + "name":"color", + "path":"folders/shader/filter/color.yy", + }, + "resourceType":"GMShader", + "resourceVersion":"2.0", + "type":1, +} \ No newline at end of file diff --git a/shaders/sh_posterize/sh_posterize.fsh b/shaders/sh_posterize/sh_posterize.fsh index 83cb5b564..385df69fa 100644 --- a/shaders/sh_posterize/sh_posterize.fsh +++ b/shaders/sh_posterize/sh_posterize.fsh @@ -1,16 +1,104 @@ -// -// Simple passthrough fragment shader -// varying vec2 v_vTexcoord; varying vec4 v_vColour; -uniform int colors; -uniform int alpha; +uniform float colors; +uniform int alpha; +uniform vec3 cMin, cMax; uniform vec2 gamma; uniform int gammaUseSurf; uniform sampler2D gammaSurf; +#region =========================================== COLORS SPACES =========================================== + vec3 rgb2hsv(vec3 c) { #region + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 0.0000000001; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } #endregion + + vec3 hsv2rgb(vec3 c) { #region + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } #endregion + + float hue2rgb( in float m1, in float m2, in float hue) { #region + if (hue < 0.0) + hue += 1.0; + else if (hue > 1.0) + hue -= 1.0; + + if ((6.0 * hue) < 1.0) + return m1 + (m2 - m1) * hue * 6.0; + else if ((2.0 * hue) < 1.0) + return m2; + else if ((3.0 * hue) < 2.0) + return m1 + (m2 - m1) * ((2.0 / 3.0) - hue) * 6.0; + else + return m1; + } #endregion + + vec3 hsl2rgb( in vec3 hsl ) { #region + float r, g, b; + if(hsl.y == 0.) { + r = hsl.z; + g = hsl.z; + b = hsl.z; + } else { + float m1, m2; + if(hsl.z <= 0.5) + m2 = hsl.z * (1. + hsl.y); + else + m2 = hsl.z + hsl.y - hsl.z * hsl.y; + m1 = 2. * hsl.z - m2; + + r = hue2rgb(m1, m2, hsl.x + 1. / 3.); + g = hue2rgb(m1, m2, hsl.x); + b = hue2rgb(m1, m2, hsl.x - 1. / 3.); + } + + return vec3( r, g, b ); + } #endregion + + vec3 rgb2hsl( in vec3 c ) { #region + float h = 0.0; + float s = 0.0; + float l = 0.0; + float r = c.r; + float g = c.g; + float b = c.b; + float cMin = min( r, min( g, b ) ); + float cMax = max( r, max( g, b ) ); + + l = ( cMax + cMin ) / 2.0; + if ( cMax > cMin ) { + float cDelta = cMax - cMin; + + s = l < .5 ? cDelta / ( cMax + cMin ) : cDelta / ( 2.0 - ( cMax + cMin ) ); + + if ( r == cMax ) + h = ( g - b ) / cDelta; + else if ( g == cMax ) + h = 2.0 + ( b - r ) / cDelta; + else + h = 4.0 + ( r - g ) / cDelta; + + if ( h < 0.0) + h += 6.0; + h = h / 6.0; + } + return vec3( h, s, l ); + } #endregion +#endregion =========================================== COLORS SPACES =========================================== + +float round(float a) { return fract(a) >= 0.5? ceil(a) : floor(a); } +vec2 round(vec2 a) { return vec2(round(a.x), round(a.y)); } +vec3 round(vec3 a) { return vec3(round(a.x), round(a.y), round(a.z)); } + void main() { float gam = gamma.x; if(gammaUseSurf == 1) { @@ -18,11 +106,20 @@ void main() { gam = mix(gamma.x, gamma.y, (_vMap.r + _vMap.g + _vMap.b) / 3.); } - vec4 _col = texture2D( gm_BaseTexture, v_vTexcoord ); - vec4 c = _col; - c = floor(pow(c, vec4(gam)) * float(colors)); - c = pow(c / float(colors), vec4(1.0 / gam)); + gam = max(gam, .0001); - if(alpha == 1) gl_FragColor = c; - else gl_FragColor = vec4(c.rgb, _col.a); + vec3 cRan = cMax - cMin; + vec4 _col = texture2D( gm_BaseTexture, v_vTexcoord ); + _col.rgb = clamp((_col.rgb - cMin) / cRan, 0., 1.); + + vec3 c = _col.rgb; + + c = pow(c, vec3(gam)); + c = floor(c * colors) / (colors - 1.); + c = pow(c, vec3(1.0 / gam)); + _col = vec4(cMin + c * cRan, 1.); + + _col.a = alpha == 1? 1. : _col.a; + + gl_FragColor = _col; } diff --git a/sprites/s_node_normalize/473ee652-8202-4be9-8285-8305bdb7811a.png b/sprites/s_node_normalize/473ee652-8202-4be9-8285-8305bdb7811a.png new file mode 100644 index 0000000000000000000000000000000000000000..1374cc83aa1e32aeff11150924addee72d925fb4 GIT binary patch literal 765 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=3dtTpz6=aiY77hwEes65fI|H*Yfr0UZr;B4q#jUrqZSxK} z2(;Qab4yJzno<&YsYS_ib^&vr!z`8Kk2qu$?=ajy;OpW0cD`?-bR@^329v|bHv8XV zldgRB^X<8caw=e-mQJFrO3+C`V?*a4v(`?oAT9ebM}K*m#%3h za{DxF3ID&r zq8AUo{`}@=w_dm2?Y%1RG z_|TZq&yjKFd6pL%4s~-aXEX4!KG|6#VKcj7)0FUr=fMtfjPvxHK5>1p;fXrWyhi)L zN{s`L4OT2>=s&!`P3}Rd(vpdsX?EHN{#;-1#P7m>1qBTUMXri{99eJJEB0`(v93sI zlGAoj7yc5#Xmy_{PWwQG1W&Mn594Dl19>)QC6S=S*IXOsvA6IFzUDI6uPL?d=vn!m zmc@pz0}uTASfMdtL!46bJ`b%aCtICP254#jD_Adn@ZyVEXP-rXc^H-WA=S!uZo}@| z(gl6`jzUW~CHUHHY-~S$`&jp7-U-X^p5J%5{O=0w-y0T`9APqdarT?9d};@lyp)+6 zxOH;W!EN7Wwlz#yHQj9ImQ*f}toX}jjJZN_E2GZtZVP>T`&?y%{6^;L<^;BR7l5fj zwZt`|BqgyV)hf9t6-Y4{85o)98kp)DT80=HTN#^KnHXyu7+4t?toV1?3PnS1eoAIq rC2kEj7iYHtHE6(XD9OxCEiOsSEx@g(Z<|*nP!EHrtDnm{r-UW|%fl?m literal 0 HcmV?d00001 diff --git a/sprites/s_node_normalize/layers/473ee652-8202-4be9-8285-8305bdb7811a/80227e67-9114-44ab-ae2c-4f114b54be58.png b/sprites/s_node_normalize/layers/473ee652-8202-4be9-8285-8305bdb7811a/80227e67-9114-44ab-ae2c-4f114b54be58.png new file mode 100644 index 0000000000000000000000000000000000000000..1374cc83aa1e32aeff11150924addee72d925fb4 GIT binary patch literal 765 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=3dtTpz6=aiY77hwEes65fI|H*Yfr0UZr;B4q#jUrqZSxK} z2(;Qab4yJzno<&YsYS_ib^&vr!z`8Kk2qu$?=ajy;OpW0cD`?-bR@^329v|bHv8XV zldgRB^X<8caw=e-mQJFrO3+C`V?*a4v(`?oAT9ebM}K*m#%3h za{DxF3ID&r zq8AUo{`}@=w_dm2?Y%1RG z_|TZq&yjKFd6pL%4s~-aXEX4!KG|6#VKcj7)0FUr=fMtfjPvxHK5>1p;fXrWyhi)L zN{s`L4OT2>=s&!`P3}Rd(vpdsX?EHN{#;-1#P7m>1qBTUMXri{99eJJEB0`(v93sI zlGAoj7yc5#Xmy_{PWwQG1W&Mn594Dl19>)QC6S=S*IXOsvA6IFzUDI6uPL?d=vn!m zmc@pz0}uTASfMdtL!46bJ`b%aCtICP254#jD_Adn@ZyVEXP-rXc^H-WA=S!uZo}@| z(gl6`jzUW~CHUHHY-~S$`&jp7-U-X^p5J%5{O=0w-y0T`9APqdarT?9d};@lyp)+6 zxOH;W!EN7Wwlz#yHQj9ImQ*f}toX}jjJZN_E2GZtZVP>T`&?y%{6^;L<^;BR7l5fj zwZt`|BqgyV)hf9t6-Y4{85o)98kp)DT80=HTN#^KnHXyu7+4t?toV1?3PnS1eoAIq rC2kEj7iYHtHE6(XD9OxCEiOsSEx@g(Z<|*nP!EHrtDnm{r-UW|%fl?m literal 0 HcmV?d00001 diff --git a/sprites/s_node_normalize/s_node_normalize.yy b/sprites/s_node_normalize/s_node_normalize.yy new file mode 100644 index 000000000..5c083c290 --- /dev/null +++ b/sprites/s_node_normalize/s_node_normalize.yy @@ -0,0 +1,90 @@ +{ + "$GMSprite":"", + "%Name":"s_node_normalize", + "bboxMode":0, + "bbox_bottom":63, + "bbox_left":0, + "bbox_right":63, + "bbox_top":0, + "collisionKind":1, + "collisionTolerance":0, + "DynamicTexturePage":false, + "edgeFiltering":false, + "For3D":false, + "frames":[ + {"$GMSpriteFrame":"","%Name":"473ee652-8202-4be9-8285-8305bdb7811a","name":"473ee652-8202-4be9-8285-8305bdb7811a","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + ], + "gridX":0, + "gridY":0, + "height":64, + "HTile":false, + "layers":[ + {"$GMImageLayer":"","%Name":"80227e67-9114-44ab-ae2c-4f114b54be58","blendMode":0,"displayName":"default","isLocked":false,"name":"80227e67-9114-44ab-ae2c-4f114b54be58","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + ], + "name":"s_node_normalize", + "nineSlice":null, + "origin":4, + "parent":{ + "name":"filter", + "path":"folders/nodes/icons/filter.yy", + }, + "preMultiplyAlpha":false, + "resourceType":"GMSprite", + "resourceVersion":"2.0", + "sequence":{ + "$GMSequence":"", + "%Name":"s_node_normalize", + "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_normalize", + "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":"473ee652-8202-4be9-8285-8305bdb7811a","path":"sprites/s_node_normalize/s_node_normalize.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"cd3b70b3-86d6-45f9-9960-e22d6aaa16c2","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