From be6ba22147b175fb4e6d9fb532d0555619364def Mon Sep 17 00:00:00 2001 From: Tanasart Date: Fri, 28 Jun 2024 16:54:13 +0700 Subject: [PATCH] interlace node --- PixelComposer.resource_order | 3 + PixelComposer.yyp | 3 + scripts/globals/globals.gml | 2 +- scripts/node_interlaced/node_alpha_to_grey.yy | 12 +++ scripts/node_interlaced/node_bw.yy | 12 +++ .../node_interlaced/node_color_adjustment.yy | 12 +++ .../node_interlaced/node_color_replacement.yy | 12 +++ scripts/node_interlaced/node_greyscale.yy | 12 +++ scripts/node_interlaced/node_interlaced.gml | 72 ++++++++++++++ scripts/node_interlaced/node_interlaced.yy | 13 +++ scripts/node_interlaced/node_outline.yy | 12 +++ scripts/node_processor/node_processor.gml | 44 ++++----- scripts/node_registry/node_registry.gml | 1 + shaders/sh_interlaced/sh_interlaced.fsh | 24 +++++ shaders/sh_interlaced/sh_interlaced.vsh | 19 ++++ shaders/sh_interlaced/sh_interlaced.yy | 12 +++ .../1e97260f-8a9a-4556-91ed-7d59be5b095c.png | Bin 0 -> 1598 bytes .../4d76f170-b94f-4c41-81bf-c7a0647f4884.png | Bin 0 -> 1598 bytes sprites/s_node_interlace/s_node_interlace.yy | 90 ++++++++++++++++++ 19 files changed, 332 insertions(+), 23 deletions(-) create mode 100644 scripts/node_interlaced/node_alpha_to_grey.yy create mode 100644 scripts/node_interlaced/node_bw.yy create mode 100644 scripts/node_interlaced/node_color_adjustment.yy create mode 100644 scripts/node_interlaced/node_color_replacement.yy create mode 100644 scripts/node_interlaced/node_greyscale.yy create mode 100644 scripts/node_interlaced/node_interlaced.gml create mode 100644 scripts/node_interlaced/node_interlaced.yy create mode 100644 scripts/node_interlaced/node_outline.yy create mode 100644 shaders/sh_interlaced/sh_interlaced.fsh create mode 100644 shaders/sh_interlaced/sh_interlaced.vsh create mode 100644 shaders/sh_interlaced/sh_interlaced.yy create mode 100644 sprites/s_node_interlace/1e97260f-8a9a-4556-91ed-7d59be5b095c.png create mode 100644 sprites/s_node_interlace/layers/1e97260f-8a9a-4556-91ed-7d59be5b095c/4d76f170-b94f-4c41-81bf-c7a0647f4884.png create mode 100644 sprites/s_node_interlace/s_node_interlace.yy diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index d70aff2d9..9a4730898 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -836,6 +836,7 @@ {"name":"node_image_grid","order":3,"path":"scripts/node_image_grid/node_image_grid.yy",}, {"name":"node_image_sequence","order":3,"path":"scripts/node_image_sequence/node_image_sequence.yy",}, {"name":"node_image_sheet","order":4,"path":"scripts/node_image_sheet/node_image_sheet.yy",}, + {"name":"node_interlaced","order":25,"path":"scripts/node_interlaced/node_interlaced.yy",}, {"name":"node_interpret_number","order":3,"path":"scripts/node_interpret_number/node_interpret_number.yy",}, {"name":"node_invert","order":6,"path":"scripts/node_invert/node_invert.yy",}, {"name":"node_isosurf","order":3,"path":"scripts/node_isosurf/node_isosurf.yy",}, @@ -1455,6 +1456,7 @@ {"name":"sh_grid_tri","order":3,"path":"shaders/sh_grid_tri/sh_grid_tri.yy",}, {"name":"sh_herringbone_tile","order":5,"path":"shaders/sh_herringbone_tile/sh_herringbone_tile.yy",}, {"name":"sh_image_trace","order":34,"path":"shaders/sh_image_trace/sh_image_trace.yy",}, + {"name":"sh_interlaced","order":58,"path":"shaders/sh_interlaced/sh_interlaced.yy",}, {"name":"sh_invert","order":17,"path":"shaders/sh_invert/sh_invert.yy",}, {"name":"sh_jpeg_recons","order":1,"path":"shaders/sh_jpeg_recons/sh_jpeg_recons.yy",}, {"name":"sh_kuwahara_ani","order":37,"path":"shaders/sh_kuwahara_ani/sh_kuwahara_ani.yy",}, @@ -1839,6 +1841,7 @@ {"name":"s_node_image_transform_3d","order":25,"path":"sprites/s_node_image_transform_3d/s_node_image_transform_3d.yy",}, {"name":"s_node_image","order":1,"path":"sprites/s_node_image/s_node_image.yy",}, {"name":"s_node_input","order":6,"path":"sprites/s_node_input/s_node_input.yy",}, + {"name":"s_node_interlace","order":68,"path":"sprites/s_node_interlace/s_node_interlace.yy",}, {"name":"s_node_interpret_number","order":30,"path":"sprites/s_node_interpret_number/s_node_interpret_number.yy",}, {"name":"s_node_invert","order":30,"path":"sprites/s_node_invert/s_node_invert.yy",}, {"name":"s_node_isosurf","order":1,"path":"sprites/s_node_isosurf/s_node_isosurf.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index 0e1fc69a7..cee2713ff 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -1245,6 +1245,7 @@ {"id":{"name":"node_image_sequence","path":"scripts/node_image_sequence/node_image_sequence.yy",},}, {"id":{"name":"node_image_sheet","path":"scripts/node_image_sheet/node_image_sheet.yy",},}, {"id":{"name":"node_image","path":"scripts/node_image/node_image.yy",},}, + {"id":{"name":"node_interlaced","path":"scripts/node_interlaced/node_interlaced.yy",},}, {"id":{"name":"node_interpret_number","path":"scripts/node_interpret_number/node_interpret_number.yy",},}, {"id":{"name":"node_invert","path":"scripts/node_invert/node_invert.yy",},}, {"id":{"name":"node_isosurf","path":"scripts/node_isosurf/node_isosurf.yy",},}, @@ -1961,6 +1962,7 @@ {"id":{"name":"sh_grid","path":"shaders/sh_grid/sh_grid.yy",},}, {"id":{"name":"sh_herringbone_tile","path":"shaders/sh_herringbone_tile/sh_herringbone_tile.yy",},}, {"id":{"name":"sh_image_trace","path":"shaders/sh_image_trace/sh_image_trace.yy",},}, + {"id":{"name":"sh_interlaced","path":"shaders/sh_interlaced/sh_interlaced.yy",},}, {"id":{"name":"sh_interpret_number","path":"shaders/sh_interpret_number/sh_interpret_number.yy",},}, {"id":{"name":"sh_invert","path":"shaders/sh_invert/sh_invert.yy",},}, {"id":{"name":"sh_jpeg_dct","path":"shaders/sh_jpeg_dct/sh_jpeg_dct.yy",},}, @@ -2401,6 +2403,7 @@ {"id":{"name":"s_node_image_transform_3d","path":"sprites/s_node_image_transform_3d/s_node_image_transform_3d.yy",},}, {"id":{"name":"s_node_image","path":"sprites/s_node_image/s_node_image.yy",},}, {"id":{"name":"s_node_input","path":"sprites/s_node_input/s_node_input.yy",},}, + {"id":{"name":"s_node_interlace","path":"sprites/s_node_interlace/s_node_interlace.yy",},}, {"id":{"name":"s_node_interpret_number","path":"sprites/s_node_interpret_number/s_node_interpret_number.yy",},}, {"id":{"name":"s_node_invert","path":"sprites/s_node_invert/s_node_invert.yy",},}, {"id":{"name":"s_node_isosurf","path":"sprites/s_node_isosurf/s_node_isosurf.yy",},}, diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index befeebba2..86e4fe0cb 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -38,7 +38,7 @@ LATEST_VERSION = 11700; VERSION = 11760; SAVE_VERSION = 11700; - VERSION_STRING = "1.17.6"; + VERSION_STRING = "1.17.6.001"; BUILD_NUMBER = 11760; globalvar HOTKEYS, HOTKEY_CONTEXT; diff --git a/scripts/node_interlaced/node_alpha_to_grey.yy b/scripts/node_interlaced/node_alpha_to_grey.yy new file mode 100644 index 000000000..fde448fca --- /dev/null +++ b/scripts/node_interlaced/node_alpha_to_grey.yy @@ -0,0 +1,12 @@ +{ + "isDnD": false, + "isCompatibility": false, + "parent": { + "name": "filter", + "path": "folders/nodes/data/filter.yy", + }, + "resourceVersion": "1.0", + "name": "node_alpha_to_grey", + "tags": [], + "resourceType": "GMScript", +} \ No newline at end of file diff --git a/scripts/node_interlaced/node_bw.yy b/scripts/node_interlaced/node_bw.yy new file mode 100644 index 000000000..6d2681493 --- /dev/null +++ b/scripts/node_interlaced/node_bw.yy @@ -0,0 +1,12 @@ +{ + "isDnD": false, + "isCompatibility": false, + "parent": { + "name": "filter", + "path": "folders/nodes/data/filter.yy", + }, + "resourceVersion": "1.0", + "name": "node_bw", + "tags": [], + "resourceType": "GMScript", +} \ No newline at end of file diff --git a/scripts/node_interlaced/node_color_adjustment.yy b/scripts/node_interlaced/node_color_adjustment.yy new file mode 100644 index 000000000..8df16cc8c --- /dev/null +++ b/scripts/node_interlaced/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_interlaced/node_color_replacement.yy b/scripts/node_interlaced/node_color_replacement.yy new file mode 100644 index 000000000..024aa6a80 --- /dev/null +++ b/scripts/node_interlaced/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_interlaced/node_greyscale.yy b/scripts/node_interlaced/node_greyscale.yy new file mode 100644 index 000000000..ee372977e --- /dev/null +++ b/scripts/node_interlaced/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_interlaced/node_interlaced.gml b/scripts/node_interlaced/node_interlaced.gml new file mode 100644 index 000000000..c737df378 --- /dev/null +++ b/scripts/node_interlaced/node_interlaced.gml @@ -0,0 +1,72 @@ +function Node_Interlaced(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor { + name = "Interlace"; + + inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone); + + inputs[| 1] = nodeValue("Active", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true); + active_index = 1; + + inputs[| 2] = nodeValue("Mask", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone); + + inputs[| 3] = nodeValue("Mix", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1) + .setDisplay(VALUE_DISPLAY.slider); + + inputs[| 4] = nodeValue("Channel", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0b1111) + .setDisplay(VALUE_DISPLAY.toggle, { data: array_create(4, THEME.inspector_channel) }); + + __init_mask_modifier(2); // inputs 5, 6 + + inputs[| 7] = nodeValue("Axis", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) + .setDisplay(VALUE_DISPLAY.enum_button, [ "X", "Y" ]); + + inputs[| 8] = nodeValue("Size", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1); + + inputs[| 9] = nodeValue("Invert", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false); + + outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); + + temp_surface = [ ]; + + input_display_list = [ 1, + ["Surface", false], 0, 2, 3, 4, + ["Effects", false], 7, 8, 9, + ]; + + attribute_surface_depth(); + + static step = function() { #region + __step_mask_modifier(); + + } #endregion + + static processData = function(_outSurf, _data, _output_index, _array_index) { #region + var _surf = _data[0]; + var _axis = _data[7]; + var _size = _data[8]; + var _invt = _data[9]; + + var _dim = surface_get_dimension(_surf); + + surface_set_shader(_outSurf, sh_interlaced); + shader_set_i("useSurf", CURRENT_FRAME > 1); + shader_set_surface("prevFrame", array_safe_get(temp_surface, _array_index)); + shader_set_2("dimension", _dim); + shader_set_i("axis", _axis); + shader_set_i("invert", _invt); + shader_set_f("size", _size); + + draw_surface_safe(_surf); + surface_reset_shader(); + + temp_surface[_array_index] = surface_verify(array_safe_get(temp_surface, _array_index), _dim[0], _dim[1]); + surface_set_shader(temp_surface[_array_index], noone); + draw_surface_safe(_surf); + surface_reset_shader(); + + __process_mask_modifier(_data); + _outSurf = mask_apply(_data[0], _outSurf, _data[2], _data[3]); + _outSurf = channel_apply(_data[0], _outSurf, _data[4]); + + return _outSurf; + } #endregion +} \ No newline at end of file diff --git a/scripts/node_interlaced/node_interlaced.yy b/scripts/node_interlaced/node_interlaced.yy new file mode 100644 index 000000000..0925d221c --- /dev/null +++ b/scripts/node_interlaced/node_interlaced.yy @@ -0,0 +1,13 @@ +{ + "$GMScript":"", + "%Name":"node_interlaced", + "isCompatibility":false, + "isDnD":false, + "name":"node_interlaced", + "parent":{ + "name":"effects", + "path":"folders/nodes/data/filter/effects.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", +} \ No newline at end of file diff --git a/scripts/node_interlaced/node_outline.yy b/scripts/node_interlaced/node_outline.yy new file mode 100644 index 000000000..86468bc09 --- /dev/null +++ b/scripts/node_interlaced/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_processor/node_processor.gml b/scripts/node_processor/node_processor.gml index e70e21e07..6a9c6d2e0 100644 --- a/scripts/node_processor/node_processor.gml +++ b/scripts/node_processor/node_processor.gml @@ -39,7 +39,7 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct static processData = function(_outSurf, _data, _output_index, _array_index = 0) { return _outSurf; } - static getSingleValue = function(_index, _arr = preview_index, output = false) { #region + static getSingleValue = function(_index, _arr = preview_index, output = false) { var _l = output? outputs : inputs; var _n = _l[| _index]; var _in = output? _n.getValue() : getInputData(_index); @@ -57,9 +57,9 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct } return array_safe_get_fast(_in, _aIndex); - } #endregion + } - static getDimension = function(arr = 0) { #region + static getDimension = function(arr = 0) { if(dimension_index == -1) return [ 1, 1 ]; var _in = getSingleValue(dimension_index, arr); @@ -74,9 +74,9 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct return _in; return [1, 1]; - } #endregion + } - static processDataArray = function(outIndex) { #region + static processDataArray = function(outIndex) { var _output = outputs[| outIndex]; var _out = _output.getValue(); var _atlas = false; @@ -214,9 +214,9 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct } return _out; - } #endregion + } - static processBatchOutput = function() { #region + static processBatchOutput = function() { var _is = ds_list_size(inputs); var _os = ds_list_size(outputs); var _dep = attrDepth(); @@ -277,19 +277,19 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct for( var i = 0, n = _os; i < n; i++ ) outputs[| i].setValue(_outputs[i]); - } #endregion + } - static processOutput = function() { #region + static processOutput = function() { for(var i = 0; i < ds_list_size(outputs); i++) { var val = outputs[| i].process_array? processDataArray(i) : processData(outputs[| i].getValue(), noone, i); if(val != undefined) outputs[| i].setValue(val); } - } #endregion + } static preGetInputs = function() {} - static getInputs = function() { #region + static getInputs = function() { preGetInputs(); var _len = ds_list_size(inputs); @@ -361,9 +361,9 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct all_inputs[i][l] = inputs[| i].arrayBalance(_in[_index]); } #endregion - } #endregion + } - static update = function(frame = CURRENT_FRAME) { #region + static update = function(frame = CURRENT_FRAME) { processData_prebatch(); if(batch_output) processBatchOutput(); @@ -373,23 +373,23 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct postProcess(); postPostProcess(); - } #endregion + } static postProcess = function() {} static postPostProcess = function() {} - static processSerialize = function(_map) { #region + static processSerialize = function(_map) { _map.array_process = attributes.array_process; - } #endregion + } - static processDeserialize = function() { #region + static processDeserialize = function() { attributes.array_process = struct_try_get(load_map, "array_process", ARRAY_PROCESS.loop); - } #endregion + } ///////////////////// CACHE ///////////////////// - static cacheCurrentFrameIndex = function(_frame, index) { #region + static cacheCurrentFrameIndex = function(_frame, index) { cacheArrayCheck(); if(CURRENT_FRAME < 0) return; if(CURRENT_FRAME >= array_length(cached_output)) return; @@ -401,13 +401,13 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct array_safe_set(cache_result, CURRENT_FRAME, true); return cached_output[CURRENT_FRAME]; - } #endregion + } - static getCacheFrameIndex = function(frame = CURRENT_FRAME, index = 0) { #region + static getCacheFrameIndex = function(frame = CURRENT_FRAME, index = 0) { if(frame < 0) return false; if(!cacheExist(frame)) return noone; var surf = array_safe_get_fast(cached_output, frame); return array_safe_get_fast(surf, index); - } #endregion + } } \ No newline at end of file diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index 07db40cf0..103099190 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -612,6 +612,7 @@ function __initNodes() { addNodeObject(filter, "Vignette", s_node_vignette, "Node_Vignette", [1, Node_Vignette],, "Apply vignette effect to the border.").setVersion(11630); addNodeObject(filter, "FXAA", s_node_FXAA, "Node_FXAA", [1, Node_FXAA],, "Apply fast approximate anti-aliasing to te image."); addNodeObject(filter, "JPEG", s_node_JPEG, "Node_JPEG", [1, Node_JPEG],, "Apply JPEG compression to the image.").setVersion(11730); + addNodeObject(filter, "Interlace", s_node_interlace, "Node_Interlaced", [1, Node_Interlaced],, "Apply interlace effect to an image.").setVersion(11760); addNodeObject(filter, "Blend Edge", s_node_blend_edge, "Node_Blend_Edge", [1, Node_Blend_Edge]).setVersion(11740); ds_list_add(filter, "Colors"); diff --git a/shaders/sh_interlaced/sh_interlaced.fsh b/shaders/sh_interlaced/sh_interlaced.fsh new file mode 100644 index 000000000..bfbc85e3b --- /dev/null +++ b/shaders/sh_interlaced/sh_interlaced.fsh @@ -0,0 +1,24 @@ +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +uniform int useSurf; +uniform sampler2D prevFrame; + +uniform vec2 dimension; +uniform int axis; +uniform int invert; +uniform float size; + +void main() { + vec2 px = v_vTexcoord * dimension - .5; + px /= size; + vec2 md = mod(px, 2.); + if(invert == 1) + md = 1. - md; + + gl_FragColor = vec4(0.); + if((axis == 0 && md.y < 1.) || (axis == 1 && md.x < 1.)) + gl_FragColor = texture2D( gm_BaseTexture, v_vTexcoord ); + else if(useSurf == 1) + gl_FragColor = texture2D( prevFrame, v_vTexcoord ); +} diff --git a/shaders/sh_interlaced/sh_interlaced.vsh b/shaders/sh_interlaced/sh_interlaced.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_interlaced/sh_interlaced.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_interlaced/sh_interlaced.yy b/shaders/sh_interlaced/sh_interlaced.yy new file mode 100644 index 000000000..498bc28de --- /dev/null +++ b/shaders/sh_interlaced/sh_interlaced.yy @@ -0,0 +1,12 @@ +{ + "$GMShader":"", + "%Name":"sh_interlaced", + "name":"sh_interlaced", + "parent":{ + "name":"filter", + "path":"folders/shader/filter.yy", + }, + "resourceType":"GMShader", + "resourceVersion":"2.0", + "type":1, +} \ No newline at end of file diff --git a/sprites/s_node_interlace/1e97260f-8a9a-4556-91ed-7d59be5b095c.png b/sprites/s_node_interlace/1e97260f-8a9a-4556-91ed-7d59be5b095c.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc4319a6d4f0eaafd65c2b56faaaa8ba9f741a9 GIT binary patch literal 1598 zcmZ{ke>~H99LGPi`6ip{Ts54K9HyJTnY6}`-((!8Vw4|?ogX8TA8Xb8Jh7l!B3 zlAS9;m^hA%e(2X(-9(+7k<@BRD7*E~Js$T*kN4yKemx$q_v86^zyEo^Pkry>uBEA` z2>{UY^l^;JXhR5=7P020n{bZ zDS5D}#6P~Ff^!4;LAM9npuC*-LA{6Ult)gP=!`Wn0Np4#9-O&PP};JIvzLsgP(5|} zxvO7`PKiAf#|`?tPg*h#h?`?Jw3Y`GU!?@CvfEIftXCR5+uqrf;p&-0np;y-VnLMc zeIz;hQ9h63boWvVwrLNcy3^+ehfq0LeaBXUTA4F9knHUNPI+0>uV8 zt#~@V5DK|QUojR{4bMX%*bnelUy}(BL9vHGwmDxd%^o_aGycE|A1DEIx@lo2SwD3d z<`myb0CyFGL%Nfb7*uZu({H^|zS_@2L=&7AfGKEhO13lQr^ul4TkOE^aw9z5EXxs_ z`+wM!*+Ywr)V)#5iE37l4DAbpe>sl4a9i!>uQ_Ptn`onK$Fg!GPxRw4zk8CtJ%br8 z4Q-@*!3lI}X_CPrOR~Q!v*-ELl8~0pPt037nAL?yaMI{~aoYH55N=v%HYjU;wy2X5 ziaTGz6mGfq$Y?XFwBjF+{-U9%Zv*1X$g(O&E%S!KD+FeVhreD#x7x8)fSr}K<>hN(_iW;rS{l!N z-*BVk6F0;X$y-orA7QX7L)B#4ALb&&XC0~hSY%n*#-Lap2RG|rx*zI)eq^0%M(g-$ z7e7Zkdu%rXU4WBNoeS>l-MH&V{fYC5#Kh}Y_qjzyXVfDENd|(X6BB8(m$Ibq$B$iE z7+I?kGmnMhX$m@<*a^ukX`NT`j+|Qcv`rbV8KaL`x?!W^1JC^6M#g?wM~qpU1GVoX zE3@_Dk(qax>mOoA74I%n9ort#ej~IzexiG?Djdlgn7YXxPc*zH-qi*-;ap$08+Ic~ z{O3h0@#~?k_@|0P(*Y1@UerN-RXoe{c4pMp*q9Zf)ryK77T4)xk5`8YS~#T--Uf@~ zDkknatmHxH^=us-$@<8_YJ(ma`8BiT`@Q^0*T}Vo7FSnLJ_!{Cgd854!WcfdWcbY}`d2Knz$-<^-)XJHcU)^pAgZ?l){L-s?jnydr4P?^8M2{(q4kE9D!*RObC8WS9hJ)v5@{fSkx zr@6ovu+wQ(s(1QrvTI=Sq44BL5-llG zCBO={vc|(Ucq?K6yo+QFlL$6jVVDHNjbkF|{{Tk9q3EdeF9W@7wI~%}{@;Y;Xh!6b Z@O1TYx$G2{`7Z>H#P9$B literal 0 HcmV?d00001 diff --git a/sprites/s_node_interlace/layers/1e97260f-8a9a-4556-91ed-7d59be5b095c/4d76f170-b94f-4c41-81bf-c7a0647f4884.png b/sprites/s_node_interlace/layers/1e97260f-8a9a-4556-91ed-7d59be5b095c/4d76f170-b94f-4c41-81bf-c7a0647f4884.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc4319a6d4f0eaafd65c2b56faaaa8ba9f741a9 GIT binary patch literal 1598 zcmZ{ke>~H99LGPi`6ip{Ts54K9HyJTnY6}`-((!8Vw4|?ogX8TA8Xb8Jh7l!B3 zlAS9;m^hA%e(2X(-9(+7k<@BRD7*E~Js$T*kN4yKemx$q_v86^zyEo^Pkry>uBEA` z2>{UY^l^;JXhR5=7P020n{bZ zDS5D}#6P~Ff^!4;LAM9npuC*-LA{6Ult)gP=!`Wn0Np4#9-O&PP};JIvzLsgP(5|} zxvO7`PKiAf#|`?tPg*h#h?`?Jw3Y`GU!?@CvfEIftXCR5+uqrf;p&-0np;y-VnLMc zeIz;hQ9h63boWvVwrLNcy3^+ehfq0LeaBXUTA4F9knHUNPI+0>uV8 zt#~@V5DK|QUojR{4bMX%*bnelUy}(BL9vHGwmDxd%^o_aGycE|A1DEIx@lo2SwD3d z<`myb0CyFGL%Nfb7*uZu({H^|zS_@2L=&7AfGKEhO13lQr^ul4TkOE^aw9z5EXxs_ z`+wM!*+Ywr)V)#5iE37l4DAbpe>sl4a9i!>uQ_Ptn`onK$Fg!GPxRw4zk8CtJ%br8 z4Q-@*!3lI}X_CPrOR~Q!v*-ELl8~0pPt037nAL?yaMI{~aoYH55N=v%HYjU;wy2X5 ziaTGz6mGfq$Y?XFwBjF+{-U9%Zv*1X$g(O&E%S!KD+FeVhreD#x7x8)fSr}K<>hN(_iW;rS{l!N z-*BVk6F0;X$y-orA7QX7L)B#4ALb&&XC0~hSY%n*#-Lap2RG|rx*zI)eq^0%M(g-$ z7e7Zkdu%rXU4WBNoeS>l-MH&V{fYC5#Kh}Y_qjzyXVfDENd|(X6BB8(m$Ibq$B$iE z7+I?kGmnMhX$m@<*a^ukX`NT`j+|Qcv`rbV8KaL`x?!W^1JC^6M#g?wM~qpU1GVoX zE3@_Dk(qax>mOoA74I%n9ort#ej~IzexiG?Djdlgn7YXxPc*zH-qi*-;ap$08+Ic~ z{O3h0@#~?k_@|0P(*Y1@UerN-RXoe{c4pMp*q9Zf)ryK77T4)xk5`8YS~#T--Uf@~ zDkknatmHxH^=us-$@<8_YJ(ma`8BiT`@Q^0*T}Vo7FSnLJ_!{Cgd854!WcfdWcbY}`d2Knz$-<^-)XJHcU)^pAgZ?l){L-s?jnydr4P?^8M2{(q4kE9D!*RObC8WS9hJ)v5@{fSkx zr@6ovu+wQ(s(1QrvTI=Sq44BL5-llG zCBO={vc|(Ucq?K6yo+QFlL$6jVVDHNjbkF|{{Tk9q3EdeF9W@7wI~%}{@;Y;Xh!6b Z@O1TYx$G2{`7Z>H#P9$B literal 0 HcmV?d00001 diff --git a/sprites/s_node_interlace/s_node_interlace.yy b/sprites/s_node_interlace/s_node_interlace.yy new file mode 100644 index 000000000..ce09123b9 --- /dev/null +++ b/sprites/s_node_interlace/s_node_interlace.yy @@ -0,0 +1,90 @@ +{ + "$GMSprite":"", + "%Name":"s_node_interlace", + "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":"1e97260f-8a9a-4556-91ed-7d59be5b095c","name":"1e97260f-8a9a-4556-91ed-7d59be5b095c","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + ], + "gridX":0, + "gridY":0, + "height":64, + "HTile":false, + "layers":[ + {"$GMImageLayer":"","%Name":"4d76f170-b94f-4c41-81bf-c7a0647f4884","blendMode":0,"displayName":"default","isLocked":false,"name":"4d76f170-b94f-4c41-81bf-c7a0647f4884","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + ], + "name":"s_node_interlace", + "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_interlace", + "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_interlace", + "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":"1e97260f-8a9a-4556-91ed-7d59be5b095c","path":"sprites/s_node_interlace/s_node_interlace.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"1aa16e81-d840-47ad-a004-ce3dba211fe8","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