diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 4ca929040..632c31381 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -1174,6 +1174,7 @@ {"name":"node_threshold","order":9,"path":"scripts/node_threshold/node_threshold.yy",}, {"name":"node_tile_random","order":16,"path":"scripts/node_tile_random/node_tile_random.yy",}, {"name":"node_tile","order":5,"path":"scripts/node_tile/node_tile.yy",}, + {"name":"node_tiler_export","order":5,"path":"scripts/node_tiler_export/node_tiler_export.yy",}, {"name":"node_tiler_tileset","order":3,"path":"scripts/node_tiler_tileset/node_tiler_tileset.yy",}, {"name":"node_time_remap","order":3,"path":"scripts/node_time_remap/node_time_remap.yy",}, {"name":"node_timeline_preview","order":2,"path":"scripts/node_timeline_preview/node_timeline_preview.yy",}, @@ -1767,6 +1768,8 @@ {"name":"sh_texture_remap","order":11,"path":"shaders/sh_texture_remap/sh_texture_remap.yy",}, {"name":"sh_threshold","order":18,"path":"shaders/sh_threshold/sh_threshold.yy",}, {"name":"sh_tile_random","order":32,"path":"shaders/sh_tile_random/sh_tile_random.yy",}, + {"name":"sh_tile_rule_apply","order":9,"path":"shaders/sh_tile_rule_apply/sh_tile_rule_apply.yy",}, + {"name":"sh_tile_rule_select","order":10,"path":"shaders/sh_tile_rule_select/sh_tile_rule_select.yy",}, {"name":"sh_tiler_autoterrain_apply","order":8,"path":"shaders/sh_tiler_autoterrain_apply/sh_tiler_autoterrain_apply.yy",}, {"name":"sh_tiler_autoterrain_mask","order":7,"path":"shaders/sh_tiler_autoterrain_mask/sh_tiler_autoterrain_mask.yy",}, {"name":"sh_time_remap","order":2,"path":"shaders/sh_time_remap/sh_time_remap.yy",}, @@ -1826,9 +1829,10 @@ {"name":"s_arrow_16","order":22,"path":"sprites/s_arrow_16/s_arrow_16.yy",}, {"name":"s_arrow_back_32","order":23,"path":"sprites/s_arrow_back_32/s_arrow_back_32.yy",}, {"name":"s_arrow_wire_16","order":24,"path":"sprites/s_arrow_wire_16/s_arrow_wire_16.yy",}, - {"name":"s_autotile_11x5","order":3,"path":"sprites/s_autotile_11x5/s_autotile_11x5.yy",}, - {"name":"s_autotile_5x3","order":1,"path":"sprites/s_autotile_5x3/s_autotile_5x3.yy",}, - {"name":"s_autotile_8x6","order":2,"path":"sprites/s_autotile_8x6/s_autotile_8x6.yy",}, + {"name":"s_autoterrain_11x5","order":3,"path":"sprites/s_autoterrain_11x5/s_autoterrain_11x5.yy",}, + {"name":"s_autoterrain_5x3","order":1,"path":"sprites/s_autoterrain_5x3/s_autoterrain_5x3.yy",}, + {"name":"s_autoterrain_5x5","order":4,"path":"sprites/s_autoterrain_5x5/s_autoterrain_5x5.yy",}, + {"name":"s_autoterrain_8x6","order":2,"path":"sprites/s_autoterrain_8x6/s_autoterrain_8x6.yy",}, {"name":"s_biterator_b_grey_long","order":7,"path":"sprites/s_biterator_b_grey_long/s_biterator_b_grey_long.yy",}, {"name":"s_biterator_b_grey_short","order":8,"path":"sprites/s_biterator_b_grey_short/s_biterator_b_grey_short.yy",}, {"name":"s_biterator_b_labels","order":9,"path":"sprites/s_biterator_b_labels/s_biterator_b_labels.yy",}, @@ -2576,6 +2580,7 @@ {"name":"s_node_threshold","order":54,"path":"sprites/s_node_threshold/s_node_threshold.yy",}, {"name":"s_node_tile_random","order":22,"path":"sprites/s_node_tile_random/s_node_tile_random.yy",}, {"name":"s_node_tileset_drawer","order":41,"path":"sprites/s_node_tileset_drawer/s_node_tileset_drawer.yy",}, + {"name":"s_node_tileset_export","order":42,"path":"sprites/s_node_tileset_export/s_node_tileset_export.yy",}, {"name":"s_node_tileset","order":40,"path":"sprites/s_node_tileset/s_node_tileset.yy",}, {"name":"s_node_time_map","order":55,"path":"sprites/s_node_time_map/s_node_time_map.yy",}, {"name":"s_node_timeline_preview","order":2,"path":"sprites/s_node_timeline_preview/s_node_timeline_preview.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index 14d4eb206..9db315486 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -357,7 +357,6 @@ "IncludedFiles":[ {"$GMIncludedFile":"","%Name":"Actions.zip","CopyToMask":-1,"filePath":"datafiles/data","name":"Actions.zip","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"icons.afdesign","CopyToMask":-1,"filePath":"datafiles/data/Actions","name":"icons.afdesign","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, - {"$GMIncludedFile":"","%Name":"icons.afdesign~lock~","CopyToMask":-1,"filePath":"datafiles/data/Actions","name":"icons.afdesign~lock~","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"Armature Build.json","CopyToMask":-1,"filePath":"datafiles/data/Actions/Nodes","name":"Armature Build.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"Armature Build.png","CopyToMask":-1,"filePath":"datafiles/data/Actions/Nodes","name":"Armature Build.png","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"Follow Path.json","CopyToMask":-1,"filePath":"datafiles/data/Actions/Nodes","name":"Follow Path.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, @@ -1779,6 +1778,7 @@ {"id":{"name":"node_threshold","path":"scripts/node_threshold/node_threshold.yy",},}, {"id":{"name":"node_tile_random","path":"scripts/node_tile_random/node_tile_random.yy",},}, {"id":{"name":"node_tile","path":"scripts/node_tile/node_tile.yy",},}, + {"id":{"name":"node_tiler_export","path":"scripts/node_tiler_export/node_tiler_export.yy",},}, {"id":{"name":"node_tiler_tileset","path":"scripts/node_tiler_tileset/node_tiler_tileset.yy",},}, {"id":{"name":"node_tiler","path":"scripts/node_tiler/node_tiler.yy",},}, {"id":{"name":"node_time_remap","path":"scripts/node_time_remap/node_time_remap.yy",},}, @@ -2473,6 +2473,8 @@ {"id":{"name":"sh_texture_repeat","path":"shaders/sh_texture_repeat/sh_texture_repeat.yy",},}, {"id":{"name":"sh_threshold","path":"shaders/sh_threshold/sh_threshold.yy",},}, {"id":{"name":"sh_tile_random","path":"shaders/sh_tile_random/sh_tile_random.yy",},}, + {"id":{"name":"sh_tile_rule_apply","path":"shaders/sh_tile_rule_apply/sh_tile_rule_apply.yy",},}, + {"id":{"name":"sh_tile_rule_select","path":"shaders/sh_tile_rule_select/sh_tile_rule_select.yy",},}, {"id":{"name":"sh_tiler_autoterrain_apply","path":"shaders/sh_tiler_autoterrain_apply/sh_tiler_autoterrain_apply.yy",},}, {"id":{"name":"sh_tiler_autoterrain_mask","path":"shaders/sh_tiler_autoterrain_mask/sh_tiler_autoterrain_mask.yy",},}, {"id":{"name":"sh_time_remap","path":"shaders/sh_time_remap/sh_time_remap.yy",},}, @@ -2539,10 +2541,11 @@ {"id":{"name":"s_arrow_16","path":"sprites/s_arrow_16/s_arrow_16.yy",},}, {"id":{"name":"s_arrow_back_32","path":"sprites/s_arrow_back_32/s_arrow_back_32.yy",},}, {"id":{"name":"s_arrow_wire_16","path":"sprites/s_arrow_wire_16/s_arrow_wire_16.yy",},}, - {"id":{"name":"s_autotile_11x5","path":"sprites/s_autotile_11x5/s_autotile_11x5.yy",},}, - {"id":{"name":"s_autotile_3x3","path":"sprites/s_autotile_3x3/s_autotile_3x3.yy",},}, - {"id":{"name":"s_autotile_5x3","path":"sprites/s_autotile_5x3/s_autotile_5x3.yy",},}, - {"id":{"name":"s_autotile_8x6","path":"sprites/s_autotile_8x6/s_autotile_8x6.yy",},}, + {"id":{"name":"s_autoterrain_11x5","path":"sprites/s_autoterrain_11x5/s_autoterrain_11x5.yy",},}, + {"id":{"name":"s_autoterrain_3x3","path":"sprites/s_autoterrain_3x3/s_autoterrain_3x3.yy",},}, + {"id":{"name":"s_autoterrain_5x3","path":"sprites/s_autoterrain_5x3/s_autoterrain_5x3.yy",},}, + {"id":{"name":"s_autoterrain_5x5","path":"sprites/s_autoterrain_5x5/s_autoterrain_5x5.yy",},}, + {"id":{"name":"s_autoterrain_8x6","path":"sprites/s_autoterrain_8x6/s_autoterrain_8x6.yy",},}, {"id":{"name":"s_biterator_b_grey_long","path":"sprites/s_biterator_b_grey_long/s_biterator_b_grey_long.yy",},}, {"id":{"name":"s_biterator_b_grey_short","path":"sprites/s_biterator_b_grey_short/s_biterator_b_grey_short.yy",},}, {"id":{"name":"s_biterator_b_labels","path":"sprites/s_biterator_b_labels/s_biterator_b_labels.yy",},}, @@ -3328,6 +3331,7 @@ {"id":{"name":"s_node_threshold","path":"sprites/s_node_threshold/s_node_threshold.yy",},}, {"id":{"name":"s_node_tile_random","path":"sprites/s_node_tile_random/s_node_tile_random.yy",},}, {"id":{"name":"s_node_tileset_drawer","path":"sprites/s_node_tileset_drawer/s_node_tileset_drawer.yy",},}, + {"id":{"name":"s_node_tileset_export","path":"sprites/s_node_tileset_export/s_node_tileset_export.yy",},}, {"id":{"name":"s_node_tileset","path":"sprites/s_node_tileset/s_node_tileset.yy",},}, {"id":{"name":"s_node_time_map","path":"sprites/s_node_time_map/s_node_time_map.yy",},}, {"id":{"name":"s_node_timeline_preview","path":"sprites/s_node_timeline_preview/s_node_timeline_preview.yy",},}, diff --git a/datafiles/data/Actions/icons.afdesign~lock~ b/datafiles/data/Actions/icons.afdesign~lock~ deleted file mode 100644 index 56ef01166..000000000 Binary files a/datafiles/data/Actions/icons.afdesign~lock~ and /dev/null differ diff --git a/scripts/__tiler_autoterrain/__tiler_autoterrain.gml b/scripts/__tiler_autoterrain/__tiler_autoterrain.gml index 155e29fec..0dffc6dd7 100644 --- a/scripts/__tiler_autoterrain/__tiler_autoterrain.gml +++ b/scripts/__tiler_autoterrain/__tiler_autoterrain.gml @@ -1,11 +1,12 @@ enum AUTOTERRAIN_TYPE { box9, + box25, side15, top48, top55, } -global.autoterrain_amount = [ 9, 15, 48, 55, ]; +global.autoterrain_amount = [ 9, 16, 15, 48, 55, ]; function tiler_brush_autoterrain(_type, _index) constructor { name = "autoterrain"; @@ -22,17 +23,20 @@ function tiler_brush_autoterrain(_type, _index) constructor { open = false; - sc_type = new scrollBox(["Simple box (3x3)", "Side platform (5x3)", "Godot tile (12x4)", "Gamemaker tileset (11x5)"], function(ind) /*=>*/ { setType(ind); }); + sc_type = new scrollBox(["Simple box (3x3)", "Corner box (5x5)", "Side platform (5x3)", "Godot tile (12x4)", "Gamemaker tileset (11x5)"], function(ind) /*=>*/ { setType(ind); }); sc_type.font = f_p3; + static indexMap48 = [ 8, 10, 11, 0, 1, 6, 5, 3, 2, 34, 12, 20, 33, 35, 12, 28, 30, 29, 31, 46, 21, 12, 44, 45, 47, 24, 16, 18, 17, 19, 9, 43, 40, 37, 38, 39, 36, 25, 42, 41, 27, 26, 7, 4, 13, 23, 32, 15, 14, 12 ]; + static setType = function(_type) { type = _type; switch(type) { case 0 : index = array_verify_ext(index, 9, function() /*=>*/ {return -1}); break; - case 1 : index = array_verify_ext(index, 15, function() /*=>*/ {return -1}); break; - case 2 : index = array_verify_ext(index, 48, function() /*=>*/ {return -1}); break; - case 3 : index = array_verify_ext(index, 55, function() /*=>*/ {return -1}); break; + case 1 : index = array_verify_ext(index, 25, function() /*=>*/ {return -1}); break; + case 2 : index = array_verify_ext(index, 15, function() /*=>*/ {return -1}); break; + case 3 : index = array_verify_ext(index, 48, function() /*=>*/ {return -1}); break; + case 4 : index = array_verify_ext(index, 55, function() /*=>*/ {return -1}); break; } } setType(_type); @@ -78,7 +82,8 @@ function tiler_brush_autoterrain(_type, _index) constructor { shader_set_2("dimension", _dim); shader_set_surface("maskSurface", mask_surface); - shader_set_i("bitmaskType", type); + shader_set_i("bitmaskType", type); + shader_set_i("indexMapper48", indexMap48); shader_set_i("indexes", index); shader_set_i("indexSize", array_length(index)); diff --git a/scripts/__tiler_rule/__tiler_rule.gml b/scripts/__tiler_rule/__tiler_rule.gml index 71f27f43f..e9b35ae6b 100644 --- a/scripts/__tiler_rule/__tiler_rule.gml +++ b/scripts/__tiler_rule/__tiler_rule.gml @@ -1,9 +1,99 @@ +function tiler_rule_replacement(_index) constructor { + index = _index; +} + function tiler_rule() constructor { name = "rule"; open = false; + active = true; + + range = 1; + size = [ 1, 1 ]; + probability = 100; + _probability = 1; + + selection_rules = array_create(9, -1); + selection_rules[4] = -10000; + replacements = []; + + sl_prop = new textBox(TEXTBOX_INPUT.number, function(v) /*=>*/ { probability = v; }) + .setSlideRange(0, 100); + sl_prop.suffix = "%"; + sl_prop.font = f_p3; + + __aut = []; + __sel = []; + + static shader_select = function(tileset) { + shader_set_i("range", range); + + selection_rules = array_verify_ext(selection_rules, (size[0] + range * 2) * (size[1] + range * 2), function() /*=>*/ {return -1} ); + + __aut = []; + __sel = []; + var autI = []; + + for( var i = 0, n = array_length(selection_rules); i < n; i++ ) { + var _r = selection_rules[i]; + + if(is_array(_r)) { + var _auI = _r[1]; + array_push(__sel, 10000 + _auI); + array_push_unique(autI, _auI); + } else + array_push(__sel, _r); + } + + for( var i = 0, n = array_length(autI); i < n; i++ ) { + var _i = autI[i]; + var _t = tileset.autoterrain[_i]; + + var _ind = 64 * i; + __aut[_ind] = array_length(_t.index); + for( var j = 0, m = array_length(_t.index); j < m; j++ ) + __aut[_ind + 1 + j] = _t.index[j]; + } + + shader_set_f("selection", __sel); + shader_set_f("selectionGroup", __aut); + + } + + static shader_submit = function(tileset) { + shader_set_i("range", range); + shader_set_f("probability", probability / 100); + + shader_set_f("size", size); + shader_set_f("selection", __sel); + shader_set_f("selectionGroup", __aut); + + var rep = []; + var rsz = size[0] * size[1]; + + for( var i = 0, n = array_length(replacements); i < n; i++ ) { + var _r = replacements[i]; + _r.index = array_verify_ext(_r.index, rsz, function() /*=>*/ {return -1} ); + array_append(rep, _r.index); + } + + shader_set_f("replacements", rep); + shader_set_i("replacementCount", array_length(replacements)); + } static deserialize = function(_struct) { - name = struct_try_get(_struct, "name", name); + name = struct_try_get(_struct, "name", name); + size = struct_try_get(_struct, "size", size); + range = struct_try_get(_struct, "range", range); + active = struct_try_get(_struct, "active", active); + + selection_rules = struct_try_get(_struct, "selection_rules", selection_rules); + probability = struct_try_get(_struct, "probability", probability); + + var _rep = struct_try_get(_struct, "replacements", noone); + if(_rep != noone) { + for( var i = 0, n = array_length(_rep); i < n; i++ ) + replacements[i] = new tiler_rule_replacement(_rep[i].index); + } return self; } diff --git a/scripts/checkbox/checkbox.gml b/scripts/checkbox/checkbox.gml index b4b6e39fe..5b69a0651 100644 --- a/scripts/checkbox/checkbox.gml +++ b/scripts/checkbox/checkbox.gml @@ -1,7 +1,7 @@ function checkBox(_onClick) : widget() constructor { - onClick = _onClick; - spr = THEME.checkbox_def; + onClick = _onClick; triggered = false; + spr = THEME.checkbox_def; static setLua = function(_lua_thread, _lua_key, _lua_func) { lua_thread = _lua_thread; diff --git a/scripts/draw_sprite_ext_override/draw_sprite_ext_override.gml b/scripts/draw_sprite_ext_override/draw_sprite_ext_override.gml index e6d95fb78..e7fb092a2 100644 --- a/scripts/draw_sprite_ext_override/draw_sprite_ext_override.gml +++ b/scripts/draw_sprite_ext_override/draw_sprite_ext_override.gml @@ -63,8 +63,8 @@ function draw_sprite_bbox_uniform(spr, ind, _bbox, _col = c_white, _alp = 1) { __draw_sprite_stretched_ext(spr, ind, _bbox.xc - _minS / 2, _bbox.yc - _minS / 2, _minS, _minS, _col, _alp); } -function draw_sprite_uniform(spr, ind, _x, _y, scale, color = c_white) { - INLINE draw_sprite_ext(spr, ind, _x, _y, scale, scale, 0, color, 1); +function draw_sprite_uniform(spr, ind, _x, _y, scale, color = c_white, alpha = 1) { + INLINE draw_sprite_ext(spr, ind, _x, _y, scale, scale, 0, color, alpha); } function draw_sprite_ui(spr, ind, _x, _y, xscale = 1, yscale = 1, rot = 0, color = c_white, alpha = 1) { diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index b97cada8a..3be21f01c 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -42,7 +42,7 @@ LATEST_VERSION = 1_18_00_0; VERSION = 1_18_01_0; SAVE_VERSION = 1_18_02_0; - VERSION_STRING = MAC? "1.18.003m" : "1.18.3.005"; + VERSION_STRING = MAC? "1.18.003m" : "1.18.3.006"; BUILD_NUMBER = 1_18_01_0; HOTKEYS = ds_map_create(); diff --git a/scripts/node_canvas/node_canvas.gml b/scripts/node_canvas/node_canvas.gml index 8163f66d7..03545af79 100644 --- a/scripts/node_canvas/node_canvas.gml +++ b/scripts/node_canvas/node_canvas.gml @@ -770,14 +770,16 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor else if(_currTool != noone) { _tool = _currTool.getToolObject(); - if(_tool) { + if(is(_tool, canvas_tool)) { _tool.node = self; + _tool = _tool.getTool(); _tool.subtool = _currTool.selecting; array_append(rightTools, _tool.rightTools); use_color_3d = _tool.use_color_3d; - } + } else + _tool = noone; } tool_selection.drawing_surface = drawing_surface; diff --git a/scripts/node_line/node_line.gml b/scripts/node_line/node_line.gml index 8d838d46b..b48b581c0 100644 --- a/scripts/node_line/node_line.gml +++ b/scripts/node_line/node_line.gml @@ -95,7 +95,7 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons lines = []; line_data = []; - temp_surfaces = [ noone ]; + temp_surface = [ noone ]; widthMap = ds_map_create(); @@ -541,8 +541,8 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons var _padx = _pbbox * (_ppadd[2] - minx); var _pady = _pbbox * (_ppadd[1] - miny); - temp_surfaces[0] = surface_verify(temp_surfaces[0], _surfDim[0] * _aa, _surfDim[1] * _aa, attrDepth()); - var _cPassAA = temp_surfaces[0]; + temp_surface[0] = surface_verify(temp_surface[0], _surfDim[0] * _aa, _surfDim[1] * _aa, attrDepth()); + var _cPassAA = temp_surface[0]; surface_set_target(_cPassAA); if(_bg) draw_clear_alpha(0, 1); diff --git a/scripts/node_normal/node_normal.gml b/scripts/node_normal/node_normal.gml index 88cb1668c..c6a6281c5 100644 --- a/scripts/node_normal/node_normal.gml +++ b/scripts/node_normal/node_normal.gml @@ -10,10 +10,14 @@ function Node_Normal(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co newInput(3, nodeValue_Bool("Active", self, true)); active_index = 3; + + newInput(4, nodeValue_Bool("Normalize", self, true)); + + newInput(5, nodeValue_Bool("Flip X", self, true)); input_display_list = [ 3, ["Surfaces", false], 0, - ["Normal", false], 1, 2, + ["Normal", false], 1, 2, 5, 4, ] newOutput(0, nodeValue_Output("Surface out", self, VALUE_TYPE.surface, noone)); @@ -23,13 +27,17 @@ function Node_Normal(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co static processData = function(_outSurf, _data, _output_index, _array_index) { var _hei = _data[1]; var _smt = _data[2]; + var _nor = _data[4]; + var _swx = _data[5]; surface_set_shader(_outSurf, sh_normal); gpu_set_texfilter(true); - + shader_set_f("dimension", surface_get_dimension(_data[0]), surface_get_height_safe(_data[0])); - shader_set_f("height", _hei); - shader_set_f("smooth", _smt); + shader_set_f("height", _hei); + shader_set_f("smooth", _smt); + shader_set_i("normal", _nor); + shader_set_i("swapx", _swx); draw_surface_safe(_data[0]); diff --git a/scripts/node_random_shape/node_random_shape.gml b/scripts/node_random_shape/node_random_shape.gml index ec7c55939..03c7ca101 100644 --- a/scripts/node_random_shape/node_random_shape.gml +++ b/scripts/node_random_shape/node_random_shape.gml @@ -16,7 +16,7 @@ function Node_Random_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro ["Render", false], 2, ] - temp_surfaces = [ noone ]; + temp_surface = [ noone ]; function surfaceContentRatio(_surf) { var s = 0; @@ -139,8 +139,8 @@ function Node_Random_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro var _corn = surface_create(_dim[0], _dim[1]); - temp_surfaces[0] = surface_verify(temp_surfaces[0], _adim[0], _adim[1]); - var _cPassAA = temp_surfaces[0]; + temp_surface[0] = surface_verify(temp_surface[0], _adim[0], _adim[1]); + var _cPassAA = temp_surface[0]; surface_set_shader(_cPassAA, sh_rsh_corner, true, BLEND.add); shader_set_f("dimension", _adim[0], _adim[1]); diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index ef040ec27..85fd8e491 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -528,8 +528,9 @@ function __initNodes() { addNodeObject(input, "Canvas", s_node_canvas, "Node_Canvas", [1, Node_Canvas], ["draw"], "Draw on surface using brush, eraser, etc."); addNodeObject(input, "Canvas Group", s_node_canvas_group, "Node_Canvas_Group", [1, Node_Canvas_Group],, "Create a group that combines multiple canvas nodes a layers.").setVersion(11740); addNodeObject(input, "Active Canvas", s_node_active_canvas, "Node_Active_Canvas", [1, Node_Active_Canvas], ["draw"], "Draw using parameterized brush.").setVersion(11570); - addNodeObject(input, "Tileset", s_node_tileset, "Node_Tile_Tileset", [1, Node_Tile_Tileset],, "Create tileset object.").setVersion(1_18_02_0); - addNodeObject(input, "Tile Drawer", s_node_tileset_drawer, "Node_Tile_Drawer", [1, Node_Tile_Drawer],, "Draw using tileset.").setVersion(1_18_02_0); + addNodeObject(input, "Tileset", s_node_tileset, "Node_Tile_Tileset", [1, Node_Tile_Tileset],, "Create tileset object.").setVersion(1_18_03_0); + addNodeObject(input, "Tile Drawer", s_node_tileset_drawer, "Node_Tile_Drawer", [1, Node_Tile_Drawer],, "Draw using tileset.").setVersion(1_18_03_0); + addNodeObject(input, "Export Tilemap", s_node_tileset_export, "Node_Tile_Tilemap_Export", [1, Node_Tile_Tilemap_Export],, "Export tilemap to file.").setVersion(1_18_03_0); ds_list_add(input, "Files"); addNodeObject(input, "Text File In", s_node_text_file_read, "Node_Text_File_Read", [1, Node_Text_File_Read], ["txt"], "Load .txt in as text.").setVersion(1080); diff --git a/scripts/node_shape/node_shape.gml b/scripts/node_shape/node_shape.gml index a9b79f00b..406ffb6cf 100644 --- a/scripts/node_shape/node_shape.gml +++ b/scripts/node_shape/node_shape.gml @@ -595,6 +595,7 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con break; case "Gear": + inputs[ 9].setVisible(true); inputs[13].setVisible(true); inputs[25].setVisible(true); inputs[26].setVisible(true); diff --git a/scripts/node_shape_polygon/node_shape_polygon.gml b/scripts/node_shape_polygon/node_shape_polygon.gml index 3ff85023c..542571df9 100644 --- a/scripts/node_shape_polygon/node_shape_polygon.gml +++ b/scripts/node_shape_polygon/node_shape_polygon.gml @@ -90,7 +90,7 @@ function Node_Shape_Polygon(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr node_draw_transform_init(); - temp_surfaces = [ noone ]; + temp_surface = [ noone ]; static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) { if(array_length(current_data) != array_length(inputs)) return; @@ -197,8 +197,8 @@ function Node_Shape_Polygon(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr var _outSurf = surface_verify(_outData[0], _dim[0], _dim[1], attrDepth()); - temp_surfaces[0] = surface_verify(temp_surfaces[0], _dim[0] * _aa, _dim[1] * _aa, attrDepth()); - var _cPassAA = temp_surfaces[0]; + temp_surface[0] = surface_verify(temp_surface[0], _dim[0] * _aa, _dim[1] * _aa, attrDepth()); + var _cPassAA = temp_surface[0]; var data = { side: _side, diff --git a/scripts/node_tiler/node_tiler.gml b/scripts/node_tiler/node_tiler.gml index 7dcff2957..cf3a49d9e 100644 --- a/scripts/node_tiler/node_tiler.gml +++ b/scripts/node_tiler/node_tiler.gml @@ -11,19 +11,21 @@ function Node_Tile_Drawer(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou newInput( 2, nodeValue_Bool("Animated", self, false)); - input_display_list = [ 1, 0 ]; - input_display_list_tileset = ["Tileset", false, noone, noone]; - input_display_list_autoterrains = ["Autoterrain", true, noone, noone]; - input_display_list_palette = ["Palette", true, noone, noone]; - input_display_list_animated = ["Animated", true, 2, noone]; - input_display_list_rule = ["Rule", true, noone, noone]; + newInput( 3, nodeValueSeed(self, VALUE_TYPE.float)); + + input_display_list = [ 3, 1, 0 ]; + input_display_list_tileset = ["Tileset", false, noone, noone]; + input_display_list_autoterrains = ["Autoterrains", true, noone, noone]; + input_display_list_palette = ["Palette", true, noone, noone]; + input_display_list_animated = ["Animated tiles",true, 2, noone]; + input_display_list_rule = ["Rules", true, noone, noone]; newOutput(0, nodeValue_Output("Tile output", self, VALUE_TYPE.surface, noone)); newOutput(1, nodeValue_Output("Tile map", self, VALUE_TYPE.surface, noone)); - newOutput(2, nodeValue_Output("Index array", self, VALUE_TYPE.integer, [])) - .setArrayDepth(1); + // newOutput(2, nodeValue_Output("Index array", self, VALUE_TYPE.integer, [])) + // .setArrayDepth(1); output_display_list = [ 0, 1 ]; @@ -41,9 +43,7 @@ function Node_Tile_Drawer(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou _preview_draw_mask = surface_create_empty(1, 1); preview_draw_mask = surface_create_empty(1, 1); - attributes.dimension = [ 1, 1 ]; - temp_surface = [ 0 ]; - + temp_surface = [ 0, 0, 0 ]; selection_mask = noone; #endregion @@ -143,18 +143,17 @@ function Node_Tile_Drawer(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou } #region surfaces - var _dim = attributes.dimension; - var _outDim = [ _tileSiz[0] * _dim[0], _tileSiz[1] * _dim[1] ]; + var _outDim = [ _tileSiz[0] * _mapSize[0], _tileSiz[1] * _mapSize[1] ]; - preview_draw_overlay = surface_verify(preview_draw_overlay, _dim[0], _dim[1], surface_rgba16float); - preview_drawing_tile = surface_verify(preview_drawing_tile, _dim[0] * _tileSiz[0], _dim[1] * _tileSiz[1]); - preview_draw_overlay_tile = surface_verify(preview_draw_overlay_tile, _dim[0] * _tileSiz[0], _dim[1] * _tileSiz[1]); + preview_draw_overlay = surface_verify(preview_draw_overlay, _mapSize[0], _mapSize[1], surface_rgba16float); + preview_drawing_tile = surface_verify(preview_drawing_tile, _mapSize[0] * _tileSiz[0], _mapSize[1] * _tileSiz[1]); + preview_draw_overlay_tile = surface_verify(preview_draw_overlay_tile, _mapSize[0] * _tileSiz[0], _mapSize[1] * _tileSiz[1]); var __s = surface_get_target(); var _sw = surface_get_width(__s); var _sh = surface_get_height(__s); - _preview_draw_mask = surface_verify(_preview_draw_mask, _dim[0], _dim[1]); + _preview_draw_mask = surface_verify(_preview_draw_mask, _mapSize[0], _mapSize[1]); preview_draw_mask = surface_verify( preview_draw_mask, _sw, _sh); #endregion @@ -163,12 +162,15 @@ function Node_Tile_Drawer(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou var _currTool = PANEL_PREVIEW.tool_current; var _tool = _currTool == noone? noone : _currTool.getToolObject(); + if(!is(_tool, tiler_tool)) + _tool = noone; + if(_tool) { var brush = tileset.brush; brush.node = self; brush.brush_size = tool_attribute.size; - brush.autoterrain = array_safe_get(tileset.autoterrains, tileset.autoterrain_selecting, noone); + brush.autoterrain = is(tileset.object_selecting, tiler_brush_autoterrain)? tileset.object_selecting : noone; _tool.brush = brush; _tool.subtool = _currTool.selecting; @@ -206,18 +208,18 @@ function Node_Tile_Drawer(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou #region draw preview surfaces - surface_set_shader(preview_drawing_tile, sh_draw_tile_map, true, BLEND.over); - shader_set_2("dimension", _outDim); + // surface_set_shader(preview_drawing_tile, sh_draw_tile_map, true, BLEND.over); + // shader_set_2("dimension", _outDim); - shader_set_surface("indexTexture", drawing_surface); - shader_set_2("indexTextureDim", surface_get_dimension(drawing_surface)); + // shader_set_surface("indexTexture", drawing_surface); + // shader_set_2("indexTextureDim", surface_get_dimension(drawing_surface)); - tileset.shader_submit(); + // tileset.shader_submit(); - draw_empty(); - surface_reset_shader(); + // draw_empty(); + // surface_reset_shader(); - draw_surface_ext(preview_drawing_tile, _x, _y, _s, _s, 0, c_white, 1); + // draw_surface_ext(preview_drawing_tile, _x, _y, _s, _s, 0, c_white, 1); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -245,9 +247,9 @@ function Node_Tile_Drawer(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou #endregion - //if(!array_empty(autoterrains)) draw_surface_ext(autoterrains[0].mask_surface, 32, 32, 8, 8, 0, c_white, 1); - // draw_surface_ext(canvas_surface, 32, 32, 8, 8, 0, c_white, 1); - // draw_surface_ext(drawing_surface, 232, 32, 8, 8, 0, c_white, 1); + // if(!array_empty(autoterrains)) draw_surface_ext(autoterrains[0].mask_surface, 32, 32, 8, 8, 0, c_white, 1); + // if(surface_exists(canvas_surface)) draw_surface_ext(canvas_surface, 32, 32, 8, 8, 0, c_white, 1); + // if(surface_exists(drawing_surface)) draw_surface_ext(drawing_surface, 232, 32, 8, 8, 0, c_white, 1); // draw_surface_ext(preview_draw_overlay, 432, 32, 8, 8, 0, c_white, 1); } @@ -255,7 +257,7 @@ function Node_Tile_Drawer(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou tileset = _data[0]; if(tileset == noone) { - input_display_list = [ 1, 0 ]; + input_display_list = [ 3, 1, 0 ]; return _outData; } @@ -265,7 +267,7 @@ function Node_Tile_Drawer(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou input_display_list_animated[3] = tileset.animated_viewer_toggler; input_display_list_rule[3] = tileset.rules_viewer_toggler; - input_display_list = [ 1, 0, + input_display_list = [ 3, 1, 0, input_display_list_tileset, tileset.tile_selector, input_display_list_autoterrains, tileset.autoterrain_selector, input_display_list_palette, tileset.palette_viewer, @@ -277,17 +279,18 @@ function Node_Tile_Drawer(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou var _tileSiz = tileset.tileSize; var _mapSize = _data[1]; var _animated = _data[2]; + var _seed = _data[3]; update_on_frame = _animated; - attributes.dimension[0] = _mapSize[0]; - attributes.dimension[1] = _mapSize[1]; - if(!is_surface(canvas_surface) && buffer_exists(canvas_buffer)) { canvas_surface = surface_create(_mapSize[0], _mapSize[1], surface_rgba16float); buffer_set_surface(canvas_buffer, canvas_surface, 0); } else canvas_surface = surface_verify(canvas_surface, _mapSize[0], _mapSize[1], surface_rgba16float); drawing_surface = surface_verify(drawing_surface, _mapSize[0], _mapSize[1], surface_rgba16float); + temp_surface[0] = surface_verify(temp_surface[0], _mapSize[0], _mapSize[1], surface_rgba16float); + temp_surface[1] = surface_verify(temp_surface[1], _mapSize[0], _mapSize[1], surface_rgba16float); + temp_surface[2] = surface_verify(temp_surface[2], _mapSize[0], _mapSize[1], surface_r16float); surface_set_shader(drawing_surface, noone, true, BLEND.over); draw_surface(canvas_surface, 0, 0); @@ -299,13 +302,47 @@ function Node_Tile_Drawer(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou var _tileOut = surface_verify(_outData[0], _outDim[0], _outDim[1]); var _tileMap = surface_verify(_outData[1], _mapSize[0], _mapSize[1], surface_rgba16float); - var _arrIndx = array_verify( _outData[2], _mapSize[0] * _mapSize[1]); + // var _arrIndx = array_verify( _outData[2], _mapSize[0] * _mapSize[1]); canvas_buffer = buffer_verify(canvas_buffer, _mapSize[0] * _mapSize[1] * 8); buffer_get_surface(canvas_buffer, canvas_surface, 0); + #region rules + surface_set_shader(temp_surface[1], sh_sample, true, BLEND.over); + draw_surface(canvas_surface, 0, 0); + surface_reset_shader(); + + var bg = 0; + + for( var i = 0, n = array_length(tileset.ruleTiles); i < n; i++ ) { + var _rule = tileset.ruleTiles[i]; + + if(!_rule.active) continue; + if(array_empty(_rule.replacements)) continue; + + surface_set_shader(temp_surface[2], sh_tile_rule_select, true, BLEND.over); + shader_set_2("dimension", _mapSize); + _rule.shader_select(tileset); + + draw_surface(canvas_surface, 0, 0); + surface_reset_shader(); + + surface_set_shader(temp_surface[bg], sh_tile_rule_apply, true, BLEND.over); + shader_set_2("dimension", _mapSize); + shader_set_f("seed", _seed); + shader_set_surface("group", temp_surface[2]); + _rule.shader_submit(tileset); + + draw_surface(temp_surface[!bg], 0, 0); + surface_reset_shader(); + + bg = !bg; + } + + #endregion + surface_set_shader(_tileMap, sh_sample, true, BLEND.over); - draw_surface(canvas_surface, 0, 0); + draw_surface(temp_surface[!bg], 0, 0); surface_reset_shader(); var _tileSetDim = surface_get_dimension(_tileSet); @@ -322,11 +359,15 @@ function Node_Tile_Drawer(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou draw_empty(); surface_reset_shader(); - return [ _tileOut, _tileMap, _arrIndx ]; + return [ _tileOut, _tileMap ]; } - static getPreviewValues = function() { return preview_drawing_tile; } - static getGraphPreviewSurface = function() { return getSingleValue(0, preview_index, true); } + // static getPreviewValues = function() { + // return getSingleValue(0, preview_index, true); + // return preview_drawing_tile; + // } + + // static getGraphPreviewSurface = function() { return getSingleValue(0, preview_index, true); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/scripts/node_tiler_export/node_tiler_export.gml b/scripts/node_tiler_export/node_tiler_export.gml new file mode 100644 index 000000000..eff1da197 --- /dev/null +++ b/scripts/node_tiler_export/node_tiler_export.gml @@ -0,0 +1,83 @@ +function Node_Tile_Tilemap_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { + name = "Export Tilemap"; + + newInput( 0, nodeValue_Surface("Tilemap", self, noone)); + + newInput( 1, nodeValue_Path("Path", self, "")) + .setDisplay(VALUE_DISPLAY.path_save, { filter: "" }) + .setVisible(true); + + export_format = [ "CSV", "JSON" ]; + newInput( 2, nodeValue_Enum_Scroll("Format", self, 0, export_format)); + + insp1UpdateTooltip = "Export"; + insp1UpdateIcon = [ THEME.sequence_control, 1, COLORS._main_value_positive ]; + + static onInspector1Update = function(_fromValue = false) { + export(); + } + + static export = function() { + var tilemap = inputs[0].getValue(); + var path = inputs[1].getValue(); + var format = inputs[2].getValue(); + + if(!is_surface(tilemap)) return; + + var _form = surface_get_format(tilemap); + if(_form != surface_rgba16float) { + noti_warning("Invalid tilemap type (RGBA16float only)") + return; + } + + var _dim = surface_get_dimension(tilemap); + var _buff = buffer_from_surface(tilemap, false); buffer_to_start(_buff); + var _data = array_create(_dim[1]); + + for( var i = 0; i < _dim[1]; i++ ) { + _data[i] = array_create(_dim[0]); + for( var j = 0; j < _dim[0]; j++ ) { + var _a = array_create(4); + + _a[0] = buffer_read(_buff, buffer_f16); + _a[1] = buffer_read(_buff, buffer_f16); + _a[2] = buffer_read(_buff, buffer_f16); + _a[3] = buffer_read(_buff, buffer_f16); + + _data[i][j] = _a[0]; + } + } + + buffer_delete(_buff); + + switch(export_format[format]) { + case "CSV" : + path = filename_change_ext(path, ".csv"); + if(file_exists_empty(path)) file_delete(path); + + var f = file_text_open_write(path); + if(f) { + for( var i = 0; i < _dim[1]; i++ ) { + var _txt = string_join_ext(",", _data[i]); + file_text_write_string(f, _txt); + file_text_writeln(f); + } + + file_text_close(f); + + var _txt = $"Export tilemap complete."; + logNode(_txt); + + var noti = log_message("EXPORT", _txt, THEME.noti_icon_tick, COLORS._main_value_positive, false); + noti.path = filename_dir(path); + noti.setOnClick(function() /*=>*/ { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer); + + } else { + + } + break; + + } + + } +} \ No newline at end of file diff --git a/scripts/node_tiler_export/node_tiler_export.yy b/scripts/node_tiler_export/node_tiler_export.yy new file mode 100644 index 000000000..c4960fb30 --- /dev/null +++ b/scripts/node_tiler_export/node_tiler_export.yy @@ -0,0 +1,13 @@ +{ + "$GMScript":"v1", + "%Name":"node_tiler_export", + "isCompatibility":false, + "isDnD":false, + "name":"node_tiler_export", + "parent":{ + "name":"tiler", + "path":"folders/nodes/data/tiler.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", +} \ No newline at end of file diff --git a/scripts/node_tiler_tileset/node_tiler_tileset.gml b/scripts/node_tiler_tileset/node_tiler_tileset.gml index cd7a9cf89..2432ca9e7 100644 --- a/scripts/node_tiler_tileset/node_tiler_tileset.gml +++ b/scripts/node_tiler_tileset/node_tiler_tileset.gml @@ -19,6 +19,29 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr newOutput(0, nodeValue_Output("Tileset", self, VALUE_TYPE.tileset, self)); + static drawTile = function(_tileSet, _tileAmo, _tileSiz, index, _x, _y, _w, _h) { + if(index < -1) { // animated + var _an = -index - 2; + var _at = array_safe_get(animatedTiles, _an, noone); + if(_at == noone) return; + + var _prin = array_safe_get(_at.index, safe_mod(current_time / 1000 * 2, array_length(_at.index)), undefined); + if(_prin != undefined) drawTile(_tileSet, _tileAmo, _tileSiz, _prin, _x, _y, _w, _h); + return; + } + + var _prc = safe_mod(index, _tileAmo[0]); + var _prr = floor(index / _tileAmo[0]); + + var _pr_tx = _prc * _tileSiz[0]; + var _pr_ty = _prr * _tileSiz[1]; + + var _pr_sx = _w / _tileSiz[0]; + var _pr_sy = _h / _tileSiz[1]; + + draw_surface_part_ext(_tileSet, _pr_tx, _pr_ty, _tileSiz[0], _tileSiz[1], _x, _y, _pr_sx, _pr_sy, c_white, 1); + } + #region ++++ tile selector ++++ tile_selector_surface = 0; tile_selector_mask = 0; @@ -38,6 +61,9 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr tile_selecting = false; tile_select_ss = [ 0, 0 ]; + object_selecting = noone; + object_select_id = noone; + selecting_surface = noone; selecting_surface_tile = noone; @@ -157,21 +183,36 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr draw_set_color(c_black); draw_rectangle_width(_tileHov_x, _tileHov_y, _tileHov_x + _tileSel_w - 1, _tileHov_y + _tileSel_h - 1, 1); + if(is(object_selecting, tiler_brush_autoterrain)) TOOLTIP = "Set Autoterrain"; + else if(is(object_selecting, tiler_brush_animated)) TOOLTIP = "Set Animated tile"; + else if(is(object_selecting, tiler_rule)) TOOLTIP = "Set Rule selector"; + else if(is(object_selecting, tiler_rule_replacement)) TOOLTIP = "Set Rule replacement"; + if(mouse_press(mb_left, _focus)) { - if(autoterrain_subtile_selecting == noone) { - autoterrain_selecting = noone; - animated_selecting = noone; - - tile_selecting = true; + if(object_selecting == noone) { + tile_selecting = true; tile_select_ss = [ _mtx, _mty ]; - - } else { - autoterrain[autoterrain_selecting].index[autoterrain_subtile_selecting] = _mid; - autoterrain_subtile_selecting++; - if(autoterrain_subtile_selecting >= array_length(autoterrain[autoterrain_selecting].index)) - autoterrain_subtile_selecting = noone; - } - + + } else if(is(object_selecting, tiler_brush_autoterrain) || is(object_selecting, tiler_brush_animated)) { + if(object_select_id != noone) { + object_selecting.index[object_select_id] = _mid; + object_select_id++; + if(object_select_id >= array_length(object_selecting.index)) + object_select_id = noone; + } + + } else if(is(object_selecting, tiler_rule)) { + if(object_select_id != noone) + object_selecting.selection_rules[object_select_id] = _mid; + object_selecting = noone; + triggerRender(); + + } else if(is(object_selecting, tiler_rule_replacement)) { + tile_selecting = true; + tile_select_ss = [ _mtx, _mty ]; + + } + palette_using = false; } } @@ -207,14 +248,28 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr brush.brush_indices = []; brush.brush_width = _ts_ex - _ts_sx + 1; brush.brush_height = _ts_ey - _ts_sy + 1; - var _ind = 0; for( var i = _ts_sy; i <= _ts_ey; i++ ) for( var j = _ts_sx; j <= _ts_ex; j++ ) brush.brush_indices[i - _ts_sy][j - _ts_sx] = [ i * _tileAmo[0] + j, 0 ]; - - if(mouse_release(mb_left)) + + if(mouse_release(mb_left)) { + if(is(object_selecting, tiler_rule_replacement)) { + object_select_id.size[0] = max(object_select_id.size[0], brush.brush_width); + object_select_id.size[1] = max(object_select_id.size[1], brush.brush_height); + + var _ind = 0; + for( var i = _ts_sy; i <= _ts_ey; i++ ) + for( var j = _ts_sx; j <= _ts_ex; j++ ) + object_selecting.index[_ind++] = i * _tileAmo[0] + j; + object_selecting = noone; + object_select_id = noone; + triggerRender(); + + } + tile_selecting = false; + } } #region pan zoom @@ -277,15 +332,13 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr draw_surface_ext(tile_selector_mask, _sx, _sy, 1, 1, 0, _cc, 1); shader_reset(); - if(autoterrain_selecting != noone) { // autoterrain - var _att = autoterrain[autoterrain_selecting]; - + if(is(object_selecting, tiler_brush_autoterrain)) { // autoterrain surface_set_target(autoterrain_selector_mask); DRAW_CLEAR draw_set_color(c_white); - for( var j = 0, m = array_length(_att.index); j < m; j++ ) { - var _bindex = _att.index[j]; + for( var j = 0, m = array_length(object_selecting.index); j < m; j++ ) { + var _bindex = object_selecting.index[j]; var _tileSel_row = floor(_bindex / _tileAmo[0]); var _tileSel_col = safe_mod(_bindex, _tileAmo[0]); var _tileSel_x = tile_selector_x + _tileSel_col * _tileSiz[0] * tile_selector_s; @@ -313,13 +366,40 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr var _th = ui(48); _h += ui(8) + _th; + var _sx = _x + ui(8); + var _sy = _ty + ui(8); + + var _ss = (_th - ui(16)) / _sel_sh; + var _sw = _ss * _sel_sw; + var _sh = _ss * _sel_sh; + draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, _ty, _w, _th, COLORS.node_composite_bg_blend, 1); - + + var _shov = _hover && point_in_rectangle(_m[0], _m[1], _sx, _sy, _sx + _sw, _sy + _sh); + var _aa = 0.5 + 0.5 * _shov; + draw_sprite_stretched_ext(THEME.ui_panel, 1, _sx, _sy, _sw, _sh, COLORS._main_icon, _aa); + draw_sprite_uniform(THEME.cross, 0, _sx + _sw / 2, _sy + _sh / 2, 1, COLORS._main_icon, _aa); + + if(_shov) { + if(is(object_selecting, tiler_rule)) { + TOOLTIP = "Set Rule selector"; + + if(mouse_press(mb_left, _focus)) { + if(object_select_id != noone) + object_selecting.selection_rules[object_select_id] = -10000; + object_selecting = noone; + triggerRender(); + + } + } + } + + _sx += _sw + ui(8); + if(brush.brush_width * brush.brush_height != 1) return _h; var _bb = brush.brush_indices[0][0]; - var _sx = _x + ui(8); var _variences = [ 0, 1, 2, 3, 8, 16 ]; for( var v = 0, p = array_length(_variences); v < p; v++ ) { @@ -344,20 +424,13 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr draw_empty(); surface_reset_shader(); - var _sy = _ty + ui(8); - var _ss = (_th - ui(16)) / _sel_sh; - var _sw = _ss * _sel_sw; - var _sh = _ss * _sel_sh; - var _shov = _hover && point_in_rectangle(_m[0], _m[1], _sx, _sy, _sx + _sw, _sy + _sh); var _aa = _bb[1] == _var? 1 : 0.5 + 0.5 * _shov; draw_surface_ext(selecting_surface_tile, _sx, _sy, _ss, _ss, 0, c_white, _aa); - if(_bb[1] == _var) { - draw_set_color(COLORS._main_accent); - draw_rectangle(_sx, _sy, _sx + _sw, _sy + _sh, true); - } + if(_bb[1] == _var) + draw_sprite_stretched_ext(THEME.ui_panel, 1, _sx, _sy, _sw, _sh, COLORS._main_accent); if(_shov && mouse_press(mb_left, _focus)) _bb[1] = _var; @@ -372,12 +445,8 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr #region ++++ auto terrain ++++ autoterrain = []; - - autoterrain_selecting = noone; autoterrain_selector_h = 0; - autoterrain_subtile_selecting = noone; - autoterrain_selector = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus, _panel = noone) { var _yy = _y; var _h = 0; @@ -393,7 +462,7 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr var by = _yy; var bs = ui(24); var _brush_tiles = brush.brush_width * brush.brush_height; - var _fromSel = (_brush_tiles == 9 || _brush_tiles == 15 || _brush_tiles == 48 || _brush_tiles == 55); + var _fromSel = _brush_tiles == 9 || _brush_tiles == 15 || _brush_tiles == 25 ||_brush_tiles == 48 || _brush_tiles == 55; if(buttonInstant(THEME.button_hide, bx, by, bs, bs, _m, _focus, _hover, _fromSel? "New autoterrain from selection" : "New autoterrain", THEME.add_16, 0, COLORS._main_value_positive) == 2) { var _new_at = noone; @@ -404,13 +473,14 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr _indx[i * brush.brush_width + j] = brush.brush_indices[i][j][0]; if(_brush_tiles == 9) _new_at = new tiler_brush_autoterrain(AUTOTERRAIN_TYPE.box9, _indx); + else if(_brush_tiles == 25) _new_at = new tiler_brush_autoterrain(AUTOTERRAIN_TYPE.box25, _indx); else if(_brush_tiles == 15) _new_at = new tiler_brush_autoterrain(AUTOTERRAIN_TYPE.side15, _indx); else if(_brush_tiles == 48) _new_at = new tiler_brush_autoterrain(AUTOTERRAIN_TYPE.top48, _indx); else if(_brush_tiles == 55) _new_at = new tiler_brush_autoterrain(AUTOTERRAIN_TYPE.top55, _indx); else _new_at = new tiler_brush_autoterrain(AUTOTERRAIN_TYPE.box9, _indx); - autoterrain_selecting = array_length(autoterrain); - animated_selecting = noone; + object_selecting = _new_at; + object_select_id = noone; array_push(autoterrain, _new_at); if(!array_empty(_indx)) { @@ -440,28 +510,16 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr var _px = _x + ui(8); var _py = _yy + ui(4); - var _prin = array_safe_get(_at.index, 0, noone); + var _prin = array_safe_get(_at.index, 0, undefined); - if(_prin == noone) { - draw_set_color(COLORS._main_icon); - draw_rectangle(_px, _py, _px + _pw, _py + _ph, true); - - } else { - var _prc = safe_mod(_prin, _tileAmo[0]); - var _prr = floor(_prin / _tileAmo[0]); - - var _pr_tx = _prc * _tileSiz[0]; - var _pr_ty = _prr * _tileSiz[1]; - - var _pr_sx = _pw / _tileSiz[0]; - var _pr_sy = _ph / _tileSiz[1]; - - draw_surface_part_ext(_tileSet, _pr_tx, _pr_ty, _tileSiz[0], _tileSiz[1], _px, _py, _pr_sx, _pr_sy, c_white, 1); - } + if(_prin == undefined) + draw_sprite_stretched_ext(THEME.ui_panel, 1, _px, _py, _pw, _ph, COLORS._main_icon); + else + drawTile(_tileSet, _tileAmo, _tileSiz, _prin, _px, _py, _pw, _ph); var _tx = _px + _pw + ui(8); var _hov = _hover && point_in_rectangle(_m[0], _m[1], _x, _yy, _x + _w, _yy + _hg - 1); - var _cc = i == autoterrain_selecting? COLORS._main_accent : (_hov? COLORS._main_text : COLORS._main_text_sub); + var _cc = object_selecting == _at? COLORS._main_accent : (_hov? COLORS._main_text : COLORS._main_text_sub); if(renaming == _at) { tb_rename.setFocusHover(_focus, _hover); @@ -479,7 +537,17 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr } if(_hov && _m[0] < _x + _w - ui(32)) { - if(_m[0] > _tx) { + if(is(object_selecting, tiler_rule)) { + TOOLTIP = "Set Rule selector"; + + if(mouse_press(mb_left, _focus)) { + if(object_select_id != noone) + object_selecting.selection_rules[object_select_id] = [ "terrain", i ]; + object_selecting = noone; + triggerRender(); + } + + } else if(_m[0] > _tx) { if(DOUBLE_CLICK && _focus) { renaming = _at; rename_text = _at.name; @@ -488,8 +556,8 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr tb_rename.activate(); } else if(mouse_press(mb_left, _focus)) { - autoterrain_selecting = autoterrain_selecting == i? noone : i; - animated_selecting = noone; + object_selecting = object_selecting == _at? noone : _at; + object_select_id = noone; brush.brush_indices = [[ [ _prin, 0 ] ]]; brush.brush_width = 1; @@ -497,8 +565,7 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr palette_using = false; } } else { - draw_set_color(COLORS._main_accent); - draw_rectangle(_px, _py, _px + _pw, _py + _ph, true); + draw_sprite_stretched_ext(THEME.ui_panel, 1, _px, _py, _pw, _ph, COLORS._main_accent); if(mouse_press(mb_left, _focus)) _at.open = !_at.open; @@ -531,6 +598,7 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr switch(_at.type) { case AUTOTERRAIN_TYPE.box9 : _coll = 3; _roww = 3; _over = s_autoterrain_3x3; break; + case AUTOTERRAIN_TYPE.box25 : _coll = 5; _roww = 5; _over = s_autoterrain_5x5; break; case AUTOTERRAIN_TYPE.side15 : _coll = 5; _roww = 3; _over = s_autoterrain_5x3; break; case AUTOTERRAIN_TYPE.top48 : _coll = 12; _roww = 4; _over = s_autoterrain_8x6; break; case AUTOTERRAIN_TYPE.top55 : _coll = 11; _roww = 5; _over = s_autoterrain_11x5; break; @@ -620,9 +688,8 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr draw_rectangle(_at_c_sx, _at_c_sy, _at_c_sx + _dtile_w, _at_c_sy + _dtile_h, true); if(mouse_press(mb_left, _focus)) { - autoterrain_selecting = i; - animated_selecting = noone; - autoterrain_subtile_selecting = autoterrain_subtile_selecting == _at_id? noone : _at_id; + object_selecting = _at; + object_select_id = object_select_id == _at_id? noone : _at_id; } if(mouse_press(mb_right, _focus)) @@ -630,9 +697,9 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr } } - if(autoterrain_selecting == i && autoterrain_subtile_selecting != noone) { - var _at_sl_x = autoterrain_subtile_selecting % _coll; - var _at_sl_y = floor(autoterrain_subtile_selecting / _coll); + if(object_selecting == _at && object_select_id != noone) { + var _at_sl_x = object_select_id % _coll; + var _at_sl_y = floor(object_select_id / _coll); var _at_c_sx = _pre_sx + _at_sl_x * _dtile_w; var _at_c_sy = _pre_sy + _at_sl_y * _dtile_h; @@ -649,7 +716,8 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr if(del != -1) { array_delete(autoterrain, del, 1); - autoterrain_selecting = noone; + object_selecting = noone; + object_select_id = noone; } autoterrain_selector_h = max(ui(12), _ah); @@ -837,8 +905,9 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr } if(palette_tool == 0 && mouse_press(mb_left, _focus)) { - autoterrain_selecting = noone; - animated_selecting = noone; + object_selecting = noone; + object_select_id = noone; + palette_selecting = true; palette_using = true; palette_select_ss = [ _mtx, _mty ]; @@ -1060,10 +1129,7 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr #region ++++ animated tiles ++++ animatedTiles = []; - - animated_selecting = noone; animated_selector_h = 0; - animated_subtile_selecting = noone; aTiles = []; aTilesIndex = []; @@ -1112,11 +1178,11 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr _new_at = new tiler_brush_animated(_indx); if(_new_at != noone) { - animated_selecting = array_length(animatedTiles); - autoterrain_selecting = noone; + object_selecting = _new_at; + object_select_id = noone; array_push(animatedTiles, _new_at); - brush.brush_indices = [[ [ -(animated_selecting + 2), 0 ] ]]; + brush.brush_indices = [[ [ -(array_length(animatedTiles) + 1), 0 ] ]]; brush.brush_width = 1; brush.brush_height = 1; } @@ -1144,28 +1210,16 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr var _px = _x + ui(8); var _py = _yy + ui(4); - var _prin = array_safe_get(_at.index, safe_mod(current_time / 1000 * 2, array_length(_at.index)), noone); + var _prin = array_safe_get(_at.index, safe_mod(current_time / 1000 * 2, array_length(_at.index)), undefined); - if(_prin == noone) { - draw_set_color(COLORS._main_icon); - draw_rectangle(_px, _py, _px + _pw, _py + _ph, true); - - } else { - var _prc = safe_mod(_prin, _tileAmo[0]); - var _prr = floor(_prin / _tileAmo[0]); - - var _pr_tx = _prc * _tileSiz[0]; - var _pr_ty = _prr * _tileSiz[1]; - - var _pr_sx = _pw / _tileSiz[0]; - var _pr_sy = _ph / _tileSiz[1]; - - draw_surface_part_ext(_tileSet, _pr_tx, _pr_ty, _tileSiz[0], _tileSiz[1], _px, _py, _pr_sx, _pr_sy, c_white, 1); - } + if(_prin == undefined) + draw_sprite_stretched_ext(THEME.ui_panel, 1, _px, _py, _pw, _ph, COLORS._main_icon); + else + drawTile(_tileSet, _tileAmo, _tileSiz, _prin, _px, _py, _pw, _ph); var _tx = _px + _pw + ui(8); var _hov = _hover && point_in_rectangle(_m[0], _m[1], _x, _yy, _x + _w, _yy + _hg - 1); - var _cc = i == animated_selecting? COLORS._main_accent : (_hov? COLORS._main_text : COLORS._main_text_sub); + var _cc = object_selecting == _at? COLORS._main_accent : (_hov? COLORS._main_text : COLORS._main_text_sub); if(renaming == _at) { tb_rename.setFocusHover(_focus, _hover); @@ -1183,26 +1237,46 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr } if(_hov && _m[0] < _x + _w - ui(32)) { - if(DOUBLE_CLICK && _focus) { - renaming = _at; - rename_text = _at.name; - - tb_rename._current_text = _at.name; - tb_rename.activate(); + if(is(object_selecting, tiler_rule)) { + TOOLTIP = "Set Rule selector"; - } else if(mouse_press(mb_left, _focus)) { - if(_m[0] > _tx) { - animated_selecting = animated_selecting == i? noone : i; - autoterrain_selecting = noone; - - brush.brush_indices = [[ [ - (i + 2), 0 ] ]]; + if(mouse_press(mb_left, _focus)) { + if(object_select_id != noone) + object_selecting.selection_rules[object_select_id] = -(i + 2); + object_selecting = noone; + triggerRender(); + } + } else if(is(object_selecting, tiler_rule_replacement)) { + TOOLTIP = "Set Rule replacement"; + + if(mouse_press(mb_left, _focus)) { + object_selecting.index = -(i + 2); + object_selecting = noone; + triggerRender(); + } + } else if(_m[0] > _tx) { + if(DOUBLE_CLICK && _focus) { + renaming = _at; + rename_text = _at.name; + + tb_rename._current_text = _at.name; + tb_rename.activate(); + + } else if(mouse_press(mb_left, _focus)) { + object_selecting = object_selecting == _at? noone : _at; + object_select_id = noone; + + brush.brush_indices = [[ [ -(i + 2), 0 ] ]]; brush.brush_width = 1; brush.brush_height = 1; palette_using = false; - } else { - _at.open = !_at.open; - } + } + } else { + draw_sprite_stretched_ext(THEME.ui_panel, 1, _px, _py, _pw, _ph, COLORS._main_accent); + + if(mouse_press(mb_left, _focus)) + _at.open = !_at.open; } } @@ -1256,9 +1330,7 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr surface_reset_shader(); draw_surface_ext(_at.preview_surface_tile, _pre_sx, _pre_sy, _ss, _ss, 0, c_white, 1); - - draw_set_color(COLORS._main_icon); - draw_rectangle(_pre_sx, _pre_sy, _pre_sx + _pre_sw * _ss, _pre_sy + _pre_sh * _ss, true); + draw_sprite_stretched_ext(THEME.ui_panel, 1, _pre_sx, _pre_sy, _pre_sw * _ss, _pre_sh * _ss, COLORS._main_icon); var _dtile_w = _tileSiz[0] * _ss; var _dtile_h = _tileSiz[1] * _ss; @@ -1276,10 +1348,8 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr draw_rectangle(_at_c_sx, _at_c_sy, _at_c_sx + _dtile_w, _at_c_sy + _dtile_h, true); if(mouse_press(mb_left, _focus)) { - animated_selecting = i; - autoterrain_selecting = noone; - - animated_subtile_selecting = animated_subtile_selecting == _at_id? noone : _at_id; + object_selecting = _at; + object_select_id = object_select_id == _at_id? noone : _at_id; } if(mouse_press(mb_right, _focus)) @@ -1287,15 +1357,14 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr } } - if(animated_selecting == i && animated_subtile_selecting != noone) { - var _at_sl_x = animated_subtile_selecting % _coll; - var _at_sl_y = floor(animated_subtile_selecting / _coll); + if(object_selecting == _at && object_select_id != noone) { + var _at_sl_x = object_select_id % _coll; + var _at_sl_y = floor(object_select_id / _coll); var _at_c_sx = _pre_sx + _at_sl_x * _dtile_w; var _at_c_sy = _pre_sy + _at_sl_y * _dtile_h; - draw_set_color(COLORS._main_accent); - draw_rectangle(_at_c_sx, _at_c_sy, _at_c_sx + _dtile_w, _at_c_sy + _dtile_h, true); + draw_sprite_stretched_ext(THEME.ui_panel, 1, _at_c_sx, _at_c_sy, _dtile_w, _dtile_h, COLORS._main_accent); } _yy += _pre_sh * _ss + ui(4); @@ -1306,7 +1375,8 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr if(del != -1) { array_delete(animatedTiles, del, 1); - animated_selecting = noone; + object_selecting = noone; + object_select_id = noone; refreshAnimatedData(); } @@ -1317,10 +1387,9 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr #region ++++ rules ++++ ruleTiles = []; + rule_selector_h = 0; - rule_selecting = noone; - rule_selector_h = 0; - rule_subtile_selecting = noone; + rule_dragging = noone; rules_viewer = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus, _panel = noone) { var _yy = _y; @@ -1338,8 +1407,11 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr var bs = ui(24); if(buttonInstant(THEME.button_hide, bx, by, bs, bs, _m, _focus, _hover, "New rule", THEME.add_16, 0, COLORS._main_value_positive) == 2) { - var _new_rl = new tiler_rule(); + var _new_rl = new tiler_rule(); + _new_rl.name = $"rule {array_length(ruleTiles)}" + _new_rl.open = true; array_push(ruleTiles, _new_rl); + triggerRender(); } _h += bs + ui(4); @@ -1348,6 +1420,7 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr var _pd = ui(4); var _ah = _pd * 2; var del = -1; + var rl_iHover = 0; draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, _yy, _w, rule_selector_h, COLORS.node_composite_bg_blend, 1); @@ -1362,34 +1435,28 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr var _px = _x + ui(8); var _py = _yy + ui(4); - var _prin = 0; + if(_m[1] > _yy) rl_iHover = i; - if(_prin == noone) { - draw_set_color(COLORS._main_icon); - draw_rectangle(_px, _py, _px + _pw, _py + _ph, true); - - } else { - var _prc = safe_mod(_prin, _tileAmo[0]); - var _prr = floor(_prin / _tileAmo[0]); - - var _pr_tx = _prc * _tileSiz[0]; - var _pr_ty = _prr * _tileSiz[1]; - - var _pr_sx = _pw / _tileSiz[0]; - var _pr_sy = _ph / _tileSiz[1]; - - draw_surface_part_ext(_tileSet, _pr_tx, _pr_ty, _tileSiz[0], _tileSiz[1], _px, _py, _pr_sx, _pr_sy, c_white, 1); - } + var _prin = array_safe_get(_rl.replacements, 0, undefined); + + if(_prin == undefined) + draw_sprite_stretched_ext(THEME.ui_panel, 1, _px, _py, _pw, _ph, COLORS._main_icon); + else if(is(_prin, tiler_rule_replacement)) { + var _ind = array_safe_get(_prin.index, 0); + drawTile(_tileSet, _tileAmo, _tileSiz, _ind, _px, _py, _pw, _ph); + } var _tx = _px + _pw + ui(8); var _hov = _hover && point_in_rectangle(_m[0], _m[1], _x, _yy, _x + _w, _yy + _hg - 1); - var _cc = _hov? COLORS._main_text : COLORS._main_text_sub; if(renaming == _rl) { tb_rename.setFocusHover(_focus, _hover); tb_rename.draw(_tx, _yy, _w - _pw - ui(8), _hg, rename_text, _m); } else { + var _cc = _hov? COLORS._main_text : COLORS._main_text_sub; + if(rule_dragging == _rl) _cc = COLORS._main_accent; + draw_set_text(f_p2, fa_left, fa_center, _cc); draw_text_add(_tx, _yy + _hg / 2, _rl.name); @@ -1400,33 +1467,225 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr del = i; } - if(_hov && _m[0] < _x + _w - ui(32)) { - if(DOUBLE_CLICK && _focus) { - renaming = _rl; - rename_text = _rl.name; - - tb_rename._current_text = _rl.name; - tb_rename.activate(); + if(_hov && _m[0] < _x + _w - ui(32 + 160)) { + if(_m[0] > _tx) { - } else if(mouse_press(mb_left, _focus)) { - if(_m[0] > _tx) { - - } else { - _rl.open = !_rl.open; - } + if(mouse_press(mb_left, _focus)) { + rule_dragging = _rl; + + } else if(DOUBLE_CLICK && _focus) { + renaming = _rl; + rename_text = _rl.name; + + tb_rename._current_text = _rl.name; + tb_rename.activate(); + } + + } else { + draw_sprite_stretched_ext(THEME.ui_panel, 1, _px, _py, _pw, _ph, COLORS._main_accent); + + if(mouse_press(mb_left, _focus)) + _rl.open = !_rl.open; } } + var _atWid = _rl.sl_prop; + var _scw = ui(120); + var _sch = ui(20); + var _scx = _x + _w - _scw - ui(32 + 8); + var _scy = _yy + _hg / 2 - _sch / 2; + + _atWid.setFocusHover(_focus, _hover); + _atWid.rx = rules_viewer.rx; _atWid.ry = rules_viewer.ry; + _atWid.draw(_scx, _scy, _scw, _sch, _rl.probability, _m); + if(_rl.probability != _rl._probability) { + _rl._probability = _rl.probability; + triggerRender(); + } + + var _acw = ui(20); + var _ach = ui(20); + var _acx = _scx - _acw - ui(8); + var _acy = _yy + _hg / 2 - _sch / 2; + var _ahv = _hover && point_in_rectangle(_m[0], _m[1], _acx, _acy, _acx + _acw, _acy + _ach); + + if(_ahv) { + TOOLTIP = "Active"; + if(mouse_press(mb_left, _focus)) { + _rl.active = !_rl.active; + triggerRender(); + } + } + + draw_sprite_stretched_ext(THEME.checkbox_def, _ahv, _acx, _acy, _acw, _ach, c_white); + if(_rl.active) draw_sprite_stretched_ext(THEME.checkbox_def, 2, _acx, _acy, _acw, _ach, COLORS._main_accent); + _yy += _hg; _ah += _hg; - if(_at.open) { + if(_rl.open) { _yy += ui(4); _ah += ui(4); + + var _sls = ui(28); + var _radw = _rl.size[0] + _rl.range * 2; + var _radh = _rl.size[1] + _rl.range * 2; + var _slw = ui(16) + _radw * _sls; + var _slh = ui(16) + _radh * _sls; + var _hh0 = _slh; + + draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x + ui(8), _yy, _slw, _slh, COLORS.node_composite_bg_blend, 1); + + for( var j = 0, m = array_length(_rl.selection_rules); j < m; j++ ) { + var _rl_sel = _rl.selection_rules[j]; + var _rl_col = j % _radw; + var _rl_row = floor(j / _radw); + + var _cen = _rl_col >= _rl.range && _rl_col < _rl.range + _rl.size[0] && + _rl_row >= _rl.range && _rl_row < _rl.range + _rl.size[1]; + + var _rl_x = _x + ui(16) + _rl_col * _sls; + var _rl_y = _yy + ui( 8) + _rl_row * _sls; + + var _rl_selected = object_selecting == _rl && object_select_id == j; + var _rl_hov = _hover && point_in_rectangle(_m[0], _m[1], _rl_x, _rl_y, _rl_x + _sls - 1, _rl_y + _sls - 1); + var _pad = ui(2); + + var _cc = _rl_selected? COLORS._main_accent : COLORS._main_icon; + var _aa = _rl_selected? 1 : .5 + _rl_hov * .5; + + if(is_array(_rl_sel)) { + var _autt = autoterrain[_rl_sel[1]]; + drawTile(_tileSet, _tileAmo, _tileSiz, _autt.index[0], _rl_x + ui(2), _rl_y + ui(2), _sls - ui(4), _sls - ui(4)); + draw_sprite_uniform(THEME.circle, 0, _rl_x + _sls - ui(8), _rl_y + _sls - ui(8), 1, COLORS._main_accent); + + } else if (_rl_sel == -10000) { + draw_sprite_uniform(THEME.cross, 0, _rl_x + _sls / 2, _rl_y + _sls / 2, 1, _cc, _aa); + + } else if(_rl_sel != -1) { + drawTile(_tileSet, _tileAmo, _tileSiz, _rl_sel, _rl_x + ui(2), _rl_y + ui(2), _sls - ui(4), _sls - ui(4)); + + } else if(!_cen) _pad = ui(10); + + draw_sprite_stretched_ext(THEME.ui_panel, 1 + _cen, _rl_x + _pad, _rl_y + _pad, _sls - _pad * 2, _sls - _pad * 2, _cc, _aa); + + if(_rl_hov) { + if(mouse_press(mb_left, _focus)) { + object_selecting = _rl_selected? noone : _rl; + object_select_id = j; + + triggerRender(); + } + + if(mouse_press(mb_right, _focus)) { + _rl.selection_rules[j] = -1; + object_selecting = noone; + object_select_id = noone; + + triggerRender(); + } + } + } + + draw_sprite_uniform(THEME.arrow, 0, _x + ui(8) + _slw + ui(8), _yy + _slh / 2, 1, COLORS._main_icon, 1); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + var _rep = _rl.replacements; + var _siz = _rl.size; + + var _rpw = _sls * _siz[0]; + var _rph = _sls * _siz[1]; + + var _dx = ui(8) + _slw + ui(16); + var _rx = _x + _dx; + var _slw = _w - _dx - ui(8); + var _col = max(1, floor((_slw - ui(16)) / _rpw)); + var _row = ceil((array_length(_rep) + 1) / _col); + var _slh = ui(16) + _row * _rph; + + draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _rx, _yy, _slw, max(_hh0, _slh), COLORS.node_composite_bg_blend, 1); + + var del_rep = -1; + + for( var j = 0, m = array_length(_rep) + 1; j < m; j++ ) { + var _rcl = j % _col; + var _rrw = floor(j / _col); + + var _rpx = _rx + ui(8) + _rcl * _rpw; + var _rpy = _yy + ui(8) + _rrw * _rph; + var _rl_hov = _hover && point_in_rectangle(_m[0], _m[1], _rpx, _rpy, _rpx + _rpw, _rpy + _rph); + + if(j == 0) { + var _cc = _rl_hov? COLORS._main_value_positive : COLORS._main_icon; + draw_sprite_uniform(THEME.add_16, 0, _rpx + _rpw / 2, _rpy + _rph / 2, 1, _cc); + + if(_rl_hov && mouse_press(mb_left, _focus)) { + var _new_rep = new tiler_rule_replacement([-1]); + array_push(_rl.replacements, _new_rep); + object_selecting = _new_rep; + object_select_id = _rl; + } + continue; + } + + var _replace = _rep[j - 1]; + var _repIndex = _replace.index; + if(!is_array(_repIndex)) continue; + + for( var k = 0, q = array_length(_repIndex); k < q; k++ ) { + var _repBlockCol = k % _siz[0]; + var _repBlockRow = floor(k / _siz[0]); + var _rpbx = _rpx + _repBlockCol * _sls; + var _rpby = _rpy + _repBlockRow * _sls; + + if(_replace.index[k] != -1) drawTile(_tileSet, _tileAmo, _tileSiz, _replace.index[k], _rpbx + ui(2), _rpby + ui(2), _sls - ui(4), _sls - ui(4)); + } + + var _rl_selected = object_selecting == _replace; + var _cc = _rl_selected? COLORS._main_accent : COLORS._main_icon; + var _aa = _rl_selected? 1 : .5 + _rl_hov * .5; + draw_sprite_stretched_ext(THEME.ui_panel, 1, _rpx + ui(2), _rpy + ui(2), _rpw - ui(4), _rph - ui(4), _cc, _aa); + + if(_rl_hov) { + if(mouse_press(mb_left, _focus)) { + object_selecting = object_selecting == _replace? noone : _replace; + object_select_id = _rl; + triggerRender(); + } + + if(mouse_press(mb_right, _focus)) { + del_rep = j; + triggerRender(); + } + } + } + + if(del_rep != -1) { + array_delete(_rep, del_rep, 1); + triggerRender(); + } + + _yy += max(_hh0, _slh) + ui(8); + _ah += max(_hh0, _slh) + ui(8); + } } - if(del != -1) array_delete(ruleTiles, del, 1); + if(rule_dragging != noone) { + array_remove(ruleTiles, rule_dragging); + array_insert(ruleTiles, rl_iHover, rule_dragging); + + if(mouse_release(mb_left)) { + rule_dragging = noone; + triggerRender(); + } + } + + if(del != -1) { + array_delete(ruleTiles, del, 1); + triggerRender(); + } rule_selector_h = max(ui(12), _ah); return _h + _ah; @@ -1440,14 +1699,14 @@ function Node_Tile_Tileset(_x, _y, _group = noone) : Node(_x, _y, _group) constr autoterrain_selector_toggler = button(function() /*=>*/ { autoterrain_selector.togglePopup("Autoterrain"); }).setIcon(THEME.node_goto, 0, COLORS._main_icon, .75); palette_viewer_toggler = button(function() /*=>*/ { palette_viewer.togglePopup("Tile Palette"); }).setIcon(THEME.node_goto, 0, COLORS._main_icon, .75); animated_viewer_toggler = button(function() /*=>*/ { animated_viewer.togglePopup("Animated Tile"); }).setIcon(THEME.node_goto, 0, COLORS._main_icon, .75); - rules_viewer_toggler = button(function() /*=>*/ { rules_viewer.togglePopup("Tile Riles"); }).setIcon(THEME.node_goto, 0, COLORS._main_icon, .75); + rules_viewer_toggler = button(function() /*=>*/ { rules_viewer.togglePopup("Tile Riles"); }).setIcon(THEME.node_goto, 0, COLORS._main_icon, .75); input_display_list = [ 1, 0, - ["Tileset", false, noone, tile_selector_toggler ], tile_selector, - ["Autoterrain", true, noone, autoterrain_selector_toggler ], autoterrain_selector, - ["Palette", true, noone, palette_viewer_toggler ], palette_viewer, - ["Animated", true, 2, animated_viewer_toggler ], animated_viewer, - ["Rules", true, noone, rules_viewer_toggler ], rules_viewer, + ["Tileset", false, noone, tile_selector_toggler ], tile_selector, + ["Autoterrains", true, noone, autoterrain_selector_toggler ], autoterrain_selector, + ["Palette", true, noone, palette_viewer_toggler ], palette_viewer, + ["Animated tiles",true, 2, animated_viewer_toggler ], animated_viewer, + ["Rules", true, noone, rules_viewer_toggler ], rules_viewer, ]; static shader_submit = function() { diff --git a/scripts/text_file/text_file.gml b/scripts/text_file/text_file.gml index e732f96fa..5eed5eaf9 100644 --- a/scripts/text_file/text_file.gml +++ b/scripts/text_file/text_file.gml @@ -1,4 +1,4 @@ -function file_read_all(path) { #region +function file_read_all(path) { INLINE var f = file_text_open_read(path); @@ -9,9 +9,9 @@ function file_read_all(path) { #region s += string(file_text_readln(f)); file_text_close(f); return s; -} #endregion +} -function file_text_read_all_lines(path) { #region +function file_text_read_all_lines(path) { INLINE var f = file_text_open_read(path); @@ -22,9 +22,9 @@ function file_text_read_all_lines(path) { #region array_push(s, file_text_readln(f)); file_text_close(f); return s; -} #endregion +} -function file_text_write_all(path, str) { #region +function file_text_write_all(path, str) { INLINE if(file_exists_empty(path)) file_delete(path); @@ -34,4 +34,4 @@ function file_text_write_all(path, str) { #region file_text_write_string(f, str); file_text_close(f); -} #endregion \ No newline at end of file +} \ No newline at end of file diff --git a/scripts/tiler_tool_brush/tiler_tool_brush.gml b/scripts/tiler_tool_brush/tiler_tool_brush.gml index ea3280dd8..dde8fbbf2 100644 --- a/scripts/tiler_tool_brush/tiler_tool_brush.gml +++ b/scripts/tiler_tool_brush/tiler_tool_brush.gml @@ -60,6 +60,8 @@ function tiler_tool_brush(node, _brush, eraser = false) : tiler_tool(node) const _auto.drawing_start(drawing_surface, isEraser); tiler_draw_point_brush(brush, mouse_cur_x, mouse_cur_y, false); _auto.drawing_end(); + + apply_draw_surface(); } mouse_holding = true; @@ -75,7 +77,6 @@ function tiler_tool_brush(node, _brush, eraser = false) : tiler_tool(node) const } mouse_holding = false; - apply_draw_surface(); } @@ -95,6 +96,7 @@ function tiler_tool_brush(node, _brush, eraser = false) : tiler_tool(node) const _auto.drawing_end(); } + apply_draw_surface(); } mouse_pre_draw_x = mouse_cur_x; diff --git a/shaders/sh_draw_tile_map/sh_draw_tile_map.fsh b/shaders/sh_draw_tile_map/sh_draw_tile_map.fsh index af059f44d..7fbfa84ba 100644 --- a/shaders/sh_draw_tile_map/sh_draw_tile_map.fsh +++ b/shaders/sh_draw_tile_map/sh_draw_tile_map.fsh @@ -21,12 +21,11 @@ void main() { gl_FragColor = vec4(0.); vec2 px = v_vTexcoord * dimension; - vec2 tileTx = mod(px, tileSize) / tileSize; - vec2 texTx; + vec2 tileTx, texTx; float index = 0.; - vec2 tileAmo = floor(tileTextureDim / tileSize); - vec4 samIdx = texture2D( indexTexture, floor(px / tileSize) / indexTextureDim ); + vec2 tileAmo = floor(tileTextureDim / tileSize); + vec4 samIdx = texture2D( indexTexture, floor(px / tileSize) / (indexTextureDim - 1.) ); if(samIdx.r == 0.) return; if(samIdx.r > 0.) { diff --git a/shaders/sh_normal/sh_normal.fsh b/shaders/sh_normal/sh_normal.fsh index 5bdb2a45f..179f84433 100644 --- a/shaders/sh_normal/sh_normal.fsh +++ b/shaders/sh_normal/sh_normal.fsh @@ -4,6 +4,8 @@ varying vec4 v_vColour; uniform vec2 dimension; uniform float height; uniform float smooth; +uniform int normal; +uniform int swapx; float bright(in vec4 col) { return dot(col.rgb, vec3(0.2126, 0.7152, 0.0722)) * col.a; } @@ -19,7 +21,7 @@ void main() { float v0 = bright(texture2D(gm_BaseTexture, v_vTexcoord + tx * vec2( 0., -1.) * siz)); float v1 = bright(texture2D(gm_BaseTexture, v_vTexcoord + tx * vec2( 0., 1.) * siz)); - vec2 normal; + vec2 _n; if(smooth > 0.) { float d0 = bright(texture2D(gm_BaseTexture, v_vTexcoord + tx * vec2( 1., -1.) * siz)); @@ -27,25 +29,29 @@ void main() { float d2 = bright(texture2D(gm_BaseTexture, v_vTexcoord + tx * vec2(-1., 1.) * siz)); float d3 = bright(texture2D(gm_BaseTexture, v_vTexcoord + tx * vec2( 1., 1.) * siz)); - normal = (vec2(h1 - col, 0.) - + vec2(col - h0, 0.) - + vec2(0., v1 - col) - + vec2(0., col - v0) - + vec2(d0 - col, col - d0) / sqrt(2.) - + vec2(col - d1, col - d1) / sqrt(2.) - + vec2(col - d2, d2 - col) / sqrt(2.) - + vec2(d3 - col, d3 - col) / sqrt(2.) - ) / (2. + 2. * sqrt(2.)); + _n = (vec2(h1 - col, 0.) + + vec2(col - h0, 0.) + + vec2(0., v1 - col) + + vec2(0., col - v0) + + vec2(d0 - col, col - d0) / sqrt(2.) + + vec2(col - d1, col - d1) / sqrt(2.) + + vec2(col - d2, d2 - col) / sqrt(2.) + + vec2(d3 - col, d3 - col) / sqrt(2.) + ) / (2. + 2. * sqrt(2.)); } else { - normal = (vec2(h1 - col, 0.) - + vec2(col - h0, 0.) - + vec2(0., v1 - col) - + vec2(0., col - v0) - ) / 2.; + _n = (vec2(h1 - col, 0.) + + vec2(col - h0, 0.) + + vec2(0., v1 - col) + + vec2(0., col - v0) + ) / 2.; } - normal = normal * height + 0.5; + if(swapx == 1) _n.x = -_n.x; + _n = _n * height; - gl_FragColor = vec4(normal, 1., c.a); + vec3 n3 = vec3(_n, 1.); + if(normal == 1) n3 = normalize(n3); + + gl_FragColor = vec4(.5 + n3 * .5, c.a); } diff --git a/shaders/sh_shape/sh_shape.fsh b/shaders/sh_shape/sh_shape.fsh index c28c64325..92db7159e 100644 --- a/shaders/sh_shape/sh_shape.fsh +++ b/shaders/sh_shape/sh_shape.fsh @@ -62,6 +62,13 @@ float dot2(in vec2 v ) { return dot(v,v); } mat2 rot(in float ang) { return mat2(cos(ang), - sin(ang), sin(ang), cos(ang)); } +float smin( float a, float b, float k ) { + if(k == 0.) return min(a, b); + k *= 1.0/(1.0-sqrt(0.5)); + float h = max( k-abs(a-b), 0.0 )/k; + return min(a,b) - k*0.5*(1.0+h-sqrt(1.0-h*(h-2.0))); +} + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// float eval_curve_segment_t(in float _y0, in float ax0, in float ay0, in float bx1, in float by1, in float _y1, in float prog) { @@ -260,7 +267,7 @@ float sdDonut(vec2 p, float s) { return max(o, -i); } -float sdGear(vec2 p, float s, int teeth, vec2 teethSize, float teethAngle) { +float sdGear(vec2 p, float s, int teeth, vec2 teethSize, float teethAngle, float corner) { float teeth_w = teethSize.y; float teeth_h = teethSize.x; @@ -272,14 +279,17 @@ float sdGear(vec2 p, float s, int teeth, vec2 teethSize, float teethAngle) { float i = length(p) / (rad * s) - 1.; float d = o; - float _angSt = TAU / float(teeth); + float _angSt = TAU / float(teeth); + float irad = corner / max(dimension.x, dimension.y) * 16.; + for(int i = 0; i < teeth; i++) { _p = p; _p = _p * rot(radians(teethAngle) + float(i) * _angSt); _p = _p - vec2(1. - teeth_w, .0); - s1 = sdBox(_p, vec2(teeth_w, teeth_h)); - d = min(d, s1); + s1 = sdRoundBox(_p, vec2(teeth_w, teeth_h), vec4(corner / 2., corner / 2., 0., 0.)); + // d = min(d, s1); + d = smin(d, s1, irad); } d = max(d, -i); @@ -451,7 +461,7 @@ void main() { else if(shape == 14) { d = sdCutDisk( coord, 1., inner ); } else if(shape == 15) { d = sdPie( coord, vec2(sin(angle), cos(angle)), 1. ); } else if(shape == 16) { d = sdRoundedCross( coord, 1. - corner ) - corner; } - else if(shape == 18) { d = sdGear( coord, inner, teeth, teethSize, teethAngle); } + else if(shape == 18) { d = sdGear( coord, inner, teeth, teethSize, teethAngle, corner); } else if(shape == 19) { d = pow(pow(abs(coord.x), squircle_factor) + pow(abs(coord.y), squircle_factor), 1. / squircle_factor) - 1.; } else if(shape == 17) { d = sdArrow( v_vTexcoord, p1, p2, thickness, arrow, arrow_head); } else if(shape == 20) { d = sdSegment(v_vTexcoord, p1, p2) - thickness; } diff --git a/shaders/sh_tile_rule_apply/sh_tile_rule_apply.fsh b/shaders/sh_tile_rule_apply/sh_tile_rule_apply.fsh new file mode 100644 index 000000000..b2d6be08b --- /dev/null +++ b/shaders/sh_tile_rule_apply/sh_tile_rule_apply.fsh @@ -0,0 +1,73 @@ +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +uniform sampler2D group; +uniform vec2 dimension; +uniform float seed; + +uniform float probability; + +uniform vec2 size; +uniform int range; +uniform float selection[64]; + +uniform float replacements[1024]; +uniform int replacementCount; + +vec2 tx = 1. / dimension; + +float random (in vec2 st, float seed) { return fract(sin(dot(st.xy + seed / 1000., vec2(1892.9898, 78.23453))) * 437.54123); } + +bool match(in vec2 p) { + int _w = int(size.x) + range * 2; + int _h = int(size.y) + range * 2; + + for(int i = 0; i < _h; i++) + for(int j = 0; j < _w; j++) { + float selInd = selection[i * _w + j]; + int _x = j - range; + int _y = i - range; + + if(selInd == -1.) continue; // skip matching + if(selInd == -10000.) selInd = -1.; // match empty + + vec2 sx = p + vec2(_x, _y) * tx; + + if(selInd >= 10000.) { + vec4 gr = texture2D( group, sx ); + if(gr.r != selInd) return false; + + } else { + vec4 sp = texture2D( gm_BaseTexture, sx ); + if(sp.r - 1. != selInd) return false; + } + } + + return true; +} + +void main() { + vec4 base = texture2D( gm_BaseTexture, v_vTexcoord ); + gl_FragColor = base; + + vec2 origin = v_vTexcoord; + int repShf = -1; + + for(int i = 0; i < int(size.y); i++) + for(int j = 0; j < int(size.x); j++) { + vec2 o = v_vTexcoord - vec2(j, i) * tx; + if(match(o)) { + origin = o; + repShf = i * int(size.x) + j; + break; + } + } + + if(repShf == -1) return; + + float prop = random(origin, seed); + if(prop > probability) return; + + int repIndex = int(random(origin, seed + 100.) * float(replacementCount)) * int(size.x * size.y); + gl_FragColor = vec4(replacements[repIndex + repShf] + 1., 0., 0., 1.); +} diff --git a/shaders/sh_tile_rule_apply/sh_tile_rule_apply.vsh b/shaders/sh_tile_rule_apply/sh_tile_rule_apply.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_tile_rule_apply/sh_tile_rule_apply.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_tile_rule_apply/sh_tile_rule_apply.yy b/shaders/sh_tile_rule_apply/sh_tile_rule_apply.yy new file mode 100644 index 000000000..b20d44ce6 --- /dev/null +++ b/shaders/sh_tile_rule_apply/sh_tile_rule_apply.yy @@ -0,0 +1,12 @@ +{ + "$GMShader":"", + "%Name":"sh_tile_rule_apply", + "name":"sh_tile_rule_apply", + "parent":{ + "name":"shaders", + "path":"folders/nodes/data/tiler/shaders.yy", + }, + "resourceType":"GMShader", + "resourceVersion":"2.0", + "type":1, +} \ No newline at end of file diff --git a/shaders/sh_tile_rule_select/sh_tile_rule_select.fsh b/shaders/sh_tile_rule_select/sh_tile_rule_select.fsh new file mode 100644 index 000000000..89eb6fed2 --- /dev/null +++ b/shaders/sh_tile_rule_select/sh_tile_rule_select.fsh @@ -0,0 +1,37 @@ +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +uniform vec2 dimension; +uniform int range; +uniform float selection[64]; +uniform float selectionGroup[640]; + +void main() { + vec2 tx = 1. / dimension; + vec4 base = texture2D( gm_BaseTexture, v_vTexcoord ); + float bs = base.r - 1.; + gl_FragColor = vec4(0.); + + if(bs == -1.) return; + + int _r = range * 2 + 1; + for(int i = 0; i < _r; i++) + for(int j = 0; j < _r; j++) { + float selInd = selection[i * _r + j]; + if(selInd < 10000.) continue; + + int _arr = int(selInd - 10000.); + int _len = int(selectionGroup[_arr * 64]); + + for(int k = 0; k < _len; k++) { + float _selInd = selectionGroup[_arr * 64 + 1 + k]; + if(_selInd == -1.) continue; + + if(bs == _selInd) { + gl_FragColor = vec4(selInd, 0., 0., 1.); + return; + } + } + } + +} diff --git a/shaders/sh_tile_rule_select/sh_tile_rule_select.vsh b/shaders/sh_tile_rule_select/sh_tile_rule_select.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_tile_rule_select/sh_tile_rule_select.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_tile_rule_select/sh_tile_rule_select.yy b/shaders/sh_tile_rule_select/sh_tile_rule_select.yy new file mode 100644 index 000000000..1dde3f436 --- /dev/null +++ b/shaders/sh_tile_rule_select/sh_tile_rule_select.yy @@ -0,0 +1,12 @@ +{ + "$GMShader":"", + "%Name":"sh_tile_rule_select", + "name":"sh_tile_rule_select", + "parent":{ + "name":"shaders", + "path":"folders/nodes/data/tiler/shaders.yy", + }, + "resourceType":"GMShader", + "resourceVersion":"2.0", + "type":1, +} \ No newline at end of file diff --git a/shaders/sh_tiler_autoterrain_apply/sh_tiler_autoterrain_apply.fsh b/shaders/sh_tiler_autoterrain_apply/sh_tiler_autoterrain_apply.fsh index ec67e8e45..5ebf13ba9 100644 --- a/shaders/sh_tiler_autoterrain_apply/sh_tiler_autoterrain_apply.fsh +++ b/shaders/sh_tiler_autoterrain_apply/sh_tiler_autoterrain_apply.fsh @@ -15,6 +15,7 @@ uniform int bitmaskType; uniform int indexes[1024]; uniform int indexSize; uniform int erase; +uniform int indexMapper48[64]; vec2 tx = 1. / dimension; @@ -79,6 +80,61 @@ void main() { if(_1(i1) && _1(i3) && _1(i5) && _0(i7)) index = 7; } else if(bitmaskType == 1) { + index = 12; + + if(_A(i0) && _0(i1) && _A(i2) && + _1(i3) && _1(i5) && + _A(i6) && _1(i7) && _A(i8)) index = 2; + + if(_A(i0) && _1(i1) && _A(i2) && + _0(i3) && _1(i5) && + _A(i6) && _1(i7) && _A(i8)) index = 10; + + if(_A(i0) && _1(i1) && _A(i2) && + _1(i3) && _0(i5) && + _A(i6) && _1(i7) && _A(i8)) index = 14; + + if(_A(i0) && _1(i1) && _A(i2) && + _1(i3) && _1(i5) && + _A(i6) && _0(i7) && _A(i8)) index = 22; + + ////////////////////////////////////////////////////////////////////////////////////////////////// + + if(_A(i0) && _0(i1) && _A(i2) && + _0(i3) && _1(i5) && + _A(i6) && _1(i7) && _A(i8)) index = 1; + + if(_A(i0) && _0(i1) && _A(i2) && + _1(i3) && _0(i5) && + _A(i6) && _1(i7) && _A(i8)) index = 3; + + if(_A(i0) && _1(i1) && _A(i2) && + _0(i3) && _1(i5) && + _A(i6) && _0(i7) && _A(i8)) index = 21; + + if(_A(i0) && _1(i1) && _A(i2) && + _1(i3) && _0(i5) && + _A(i6) && _0(i7) && _A(i8)) index = 23; + + ////////////////////////////////////////////////////////////////////////////////////////////////// + + if(_0(i0) && _1(i1) && _A(i2) && + _1(i3) && _1(i5) && + _A(i6) && _1(i7) && _A(i8)) index = 6; + + if(_A(i0) && _1(i1) && _0(i2) && + _1(i3) && _1(i5) && + _A(i6) && _1(i7) && _A(i8)) index = 8; + + if(_A(i0) && _1(i1) && _A(i2) && + _1(i3) && _1(i5) && + _0(i6) && _1(i7) && _A(i8)) index = 16; + + if(_A(i0) && _1(i1) && _A(i2) && + _1(i3) && _1(i5) && + _A(i6) && _1(i7) && _0(i8)) index = 18; + + } else if(bitmaskType == 2) { index = 6; if(_0(i1) && _0(i3) && _1(i5) && _1(i7)) index = 0; @@ -103,7 +159,7 @@ void main() { if(_0(i0) && _0(i8)) index = 14; } - } else if(bitmaskType == 2 || bitmaskType == 3) { + } else if(bitmaskType == 3 || bitmaskType == 4) { index = 12; if(_A(i0) && _0(i1) && _A(i2) && @@ -314,10 +370,7 @@ void main() { _1(i3) && _1(i5) && _0(i6) && _1(i7) && _0(i8)) index = 52; - if(bitmaskType == 2) { - if(index == 0) index == 0; - else if(index == 0) index == 0; - } + if(bitmaskType == 2) index = indexMapper48[index]; } float res = float(indexes[index]); diff --git a/sprites/s_autotile_11x5/01232f7d-baf1-431a-a423-87f5315b841e.png b/sprites/s_autoterrain_11x5/01232f7d-baf1-431a-a423-87f5315b841e.png similarity index 100% rename from sprites/s_autotile_11x5/01232f7d-baf1-431a-a423-87f5315b841e.png rename to sprites/s_autoterrain_11x5/01232f7d-baf1-431a-a423-87f5315b841e.png diff --git a/sprites/s_autotile_11x5/layers/01232f7d-baf1-431a-a423-87f5315b841e/ebef9aaa-f543-4c23-9c83-7b884a011c18.png b/sprites/s_autoterrain_11x5/layers/01232f7d-baf1-431a-a423-87f5315b841e/ebef9aaa-f543-4c23-9c83-7b884a011c18.png similarity index 100% rename from sprites/s_autotile_11x5/layers/01232f7d-baf1-431a-a423-87f5315b841e/ebef9aaa-f543-4c23-9c83-7b884a011c18.png rename to sprites/s_autoterrain_11x5/layers/01232f7d-baf1-431a-a423-87f5315b841e/ebef9aaa-f543-4c23-9c83-7b884a011c18.png diff --git a/sprites/s_autotile_11x5/s_autotile_11x5.yy b/sprites/s_autoterrain_11x5/s_autoterrain_11x5.yy similarity index 90% rename from sprites/s_autotile_11x5/s_autotile_11x5.yy rename to sprites/s_autoterrain_11x5/s_autoterrain_11x5.yy index d9f4b85e3..d68a895f4 100644 --- a/sprites/s_autotile_11x5/s_autotile_11x5.yy +++ b/sprites/s_autoterrain_11x5/s_autoterrain_11x5.yy @@ -1,6 +1,6 @@ { "$GMSprite":"", - "%Name":"s_autotile_11x5", + "%Name":"s_autoterrain_11x5", "bboxMode":0, "bbox_bottom":19, "bbox_left":1, @@ -21,7 +21,7 @@ "layers":[ {"$GMImageLayer":"","%Name":"ebef9aaa-f543-4c23-9c83-7b884a011c18","blendMode":0,"displayName":"default","isLocked":false,"name":"ebef9aaa-f543-4c23-9c83-7b884a011c18","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, ], - "name":"s_autotile_11x5", + "name":"s_autoterrain_11x5", "nineSlice":null, "origin":0, "parent":{ @@ -33,7 +33,7 @@ "resourceVersion":"2.0", "sequence":{ "$GMSequence":"", - "%Name":"s_autotile_11x5", + "%Name":"s_autoterrain_11x5", "autoRecord":true, "backdropHeight":768, "backdropImageOpacity":0.5, @@ -57,7 +57,7 @@ "resourceType":"KeyframeStore", "resourceVersion":"2.0", }, - "name":"s_autotile_11x5", + "name":"s_autoterrain_11x5", "playback":1, "playbackSpeed":30.0, "playbackSpeedType":0, @@ -69,7 +69,7 @@ "tracks":[ {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore":"","Keyframes":[ {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"01232f7d-baf1-431a-a423-87f5315b841e","path":"sprites/s_autotile_11x5/s_autotile_11x5.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"01232f7d-baf1-431a-a423-87f5315b841e","path":"sprites/s_autoterrain_11x5/s_autoterrain_11x5.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, },"Disabled":false,"id":"c2970cc7-3433-47a3-b228-86e7fc0ccfd3","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,}, ], diff --git a/sprites/s_autotile_3x3/489436ec-6bcc-43d3-937c-b67a3080c21b.png b/sprites/s_autoterrain_3x3/489436ec-6bcc-43d3-937c-b67a3080c21b.png similarity index 100% rename from sprites/s_autotile_3x3/489436ec-6bcc-43d3-937c-b67a3080c21b.png rename to sprites/s_autoterrain_3x3/489436ec-6bcc-43d3-937c-b67a3080c21b.png diff --git a/sprites/s_autotile_3x3/layers/489436ec-6bcc-43d3-937c-b67a3080c21b/991afa55-558a-473d-a893-36b42e44b7d0.png b/sprites/s_autoterrain_3x3/layers/489436ec-6bcc-43d3-937c-b67a3080c21b/991afa55-558a-473d-a893-36b42e44b7d0.png similarity index 100% rename from sprites/s_autotile_3x3/layers/489436ec-6bcc-43d3-937c-b67a3080c21b/991afa55-558a-473d-a893-36b42e44b7d0.png rename to sprites/s_autoterrain_3x3/layers/489436ec-6bcc-43d3-937c-b67a3080c21b/991afa55-558a-473d-a893-36b42e44b7d0.png diff --git a/sprites/s_autotile_3x3/s_autotile_3x3.yy b/sprites/s_autoterrain_3x3/s_autoterrain_3x3.yy similarity index 91% rename from sprites/s_autotile_3x3/s_autotile_3x3.yy rename to sprites/s_autoterrain_3x3/s_autoterrain_3x3.yy index 8da2dde4d..7e9b8902d 100644 --- a/sprites/s_autotile_3x3/s_autotile_3x3.yy +++ b/sprites/s_autoterrain_3x3/s_autoterrain_3x3.yy @@ -1,6 +1,6 @@ { "$GMSprite":"", - "%Name":"s_autotile_3x3", + "%Name":"s_autoterrain_3x3", "bboxMode":0, "bbox_bottom":10, "bbox_left":1, @@ -21,7 +21,7 @@ "layers":[ {"$GMImageLayer":"","%Name":"991afa55-558a-473d-a893-36b42e44b7d0","blendMode":0,"displayName":"default","isLocked":false,"name":"991afa55-558a-473d-a893-36b42e44b7d0","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, ], - "name":"s_autotile_3x3", + "name":"s_autoterrain_3x3", "nineSlice":null, "origin":0, "parent":{ @@ -33,7 +33,7 @@ "resourceVersion":"2.0", "sequence":{ "$GMSequence":"", - "%Name":"s_autotile_3x3", + "%Name":"s_autoterrain_3x3", "autoRecord":true, "backdropHeight":768, "backdropImageOpacity":0.5, @@ -57,7 +57,7 @@ "resourceType":"KeyframeStore", "resourceVersion":"2.0", }, - "name":"s_autotile_3x3", + "name":"s_autoterrain_3x3", "playback":1, "playbackSpeed":30.0, "playbackSpeedType":0, @@ -69,7 +69,7 @@ "tracks":[ {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore":"","Keyframes":[ {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"489436ec-6bcc-43d3-937c-b67a3080c21b","path":"sprites/s_autotile_3x3/s_autotile_3x3.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"489436ec-6bcc-43d3-937c-b67a3080c21b","path":"sprites/s_autoterrain_3x3/s_autoterrain_3x3.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, },"Disabled":false,"id":"a8508d65-3502-4f18-a8ee-8c1db13c8fa2","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,}, ], diff --git a/sprites/s_autotile_5x3/e3f83286-9b7e-4bd4-b2ea-c08183709b23.png b/sprites/s_autoterrain_5x3/e3f83286-9b7e-4bd4-b2ea-c08183709b23.png similarity index 100% rename from sprites/s_autotile_5x3/e3f83286-9b7e-4bd4-b2ea-c08183709b23.png rename to sprites/s_autoterrain_5x3/e3f83286-9b7e-4bd4-b2ea-c08183709b23.png diff --git a/sprites/s_autotile_5x3/layers/e3f83286-9b7e-4bd4-b2ea-c08183709b23/9fb628f1-89bb-421e-86a4-4569f01ce93e.png b/sprites/s_autoterrain_5x3/layers/e3f83286-9b7e-4bd4-b2ea-c08183709b23/9fb628f1-89bb-421e-86a4-4569f01ce93e.png similarity index 100% rename from sprites/s_autotile_5x3/layers/e3f83286-9b7e-4bd4-b2ea-c08183709b23/9fb628f1-89bb-421e-86a4-4569f01ce93e.png rename to sprites/s_autoterrain_5x3/layers/e3f83286-9b7e-4bd4-b2ea-c08183709b23/9fb628f1-89bb-421e-86a4-4569f01ce93e.png diff --git a/sprites/s_autotile_5x3/s_autotile_5x3.yy b/sprites/s_autoterrain_5x3/s_autoterrain_5x3.yy similarity index 91% rename from sprites/s_autotile_5x3/s_autotile_5x3.yy rename to sprites/s_autoterrain_5x3/s_autoterrain_5x3.yy index 047b62843..3d3b3cd47 100644 --- a/sprites/s_autotile_5x3/s_autotile_5x3.yy +++ b/sprites/s_autoterrain_5x3/s_autoterrain_5x3.yy @@ -1,6 +1,6 @@ { "$GMSprite":"", - "%Name":"s_autotile_5x3", + "%Name":"s_autoterrain_5x3", "bboxMode":0, "bbox_bottom":11, "bbox_left":1, @@ -21,7 +21,7 @@ "layers":[ {"$GMImageLayer":"","%Name":"9fb628f1-89bb-421e-86a4-4569f01ce93e","blendMode":0,"displayName":"default","isLocked":false,"name":"9fb628f1-89bb-421e-86a4-4569f01ce93e","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, ], - "name":"s_autotile_5x3", + "name":"s_autoterrain_5x3", "nineSlice":null, "origin":0, "parent":{ @@ -33,7 +33,7 @@ "resourceVersion":"2.0", "sequence":{ "$GMSequence":"", - "%Name":"s_autotile_5x3", + "%Name":"s_autoterrain_5x3", "autoRecord":true, "backdropHeight":768, "backdropImageOpacity":0.5, @@ -57,7 +57,7 @@ "resourceType":"KeyframeStore", "resourceVersion":"2.0", }, - "name":"s_autotile_5x3", + "name":"s_autoterrain_5x3", "playback":1, "playbackSpeed":30.0, "playbackSpeedType":0, @@ -69,7 +69,7 @@ "tracks":[ {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore":"","Keyframes":[ {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"e3f83286-9b7e-4bd4-b2ea-c08183709b23","path":"sprites/s_autotile_5x3/s_autotile_5x3.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"e3f83286-9b7e-4bd4-b2ea-c08183709b23","path":"sprites/s_autoterrain_5x3/s_autoterrain_5x3.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, },"Disabled":false,"id":"36ea370b-9cec-43d4-8aa3-92b69e692782","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,}, ], diff --git a/sprites/s_autoterrain_5x5/333c6f4d-d18f-465f-929f-92782d6684d5.png b/sprites/s_autoterrain_5x5/333c6f4d-d18f-465f-929f-92782d6684d5.png new file mode 100644 index 000000000..c53ab5517 Binary files /dev/null and b/sprites/s_autoterrain_5x5/333c6f4d-d18f-465f-929f-92782d6684d5.png differ diff --git a/sprites/s_autoterrain_5x5/layers/333c6f4d-d18f-465f-929f-92782d6684d5/cd0df110-6429-4bd1-a2db-58355c77f9a5.png b/sprites/s_autoterrain_5x5/layers/333c6f4d-d18f-465f-929f-92782d6684d5/cd0df110-6429-4bd1-a2db-58355c77f9a5.png new file mode 100644 index 000000000..c53ab5517 Binary files /dev/null and b/sprites/s_autoterrain_5x5/layers/333c6f4d-d18f-465f-929f-92782d6684d5/cd0df110-6429-4bd1-a2db-58355c77f9a5.png differ diff --git a/sprites/s_autoterrain_5x5/s_autoterrain_5x5.yy b/sprites/s_autoterrain_5x5/s_autoterrain_5x5.yy new file mode 100644 index 000000000..c96f82246 --- /dev/null +++ b/sprites/s_autoterrain_5x5/s_autoterrain_5x5.yy @@ -0,0 +1,90 @@ +{ + "$GMSprite":"", + "%Name":"s_autoterrain_5x5", + "bboxMode":0, + "bbox_bottom":17, + "bbox_left":2, + "bbox_right":17, + "bbox_top":2, + "collisionKind":1, + "collisionTolerance":0, + "DynamicTexturePage":false, + "edgeFiltering":false, + "For3D":false, + "frames":[ + {"$GMSpriteFrame":"","%Name":"333c6f4d-d18f-465f-929f-92782d6684d5","name":"333c6f4d-d18f-465f-929f-92782d6684d5","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + ], + "gridX":0, + "gridY":0, + "height":20, + "HTile":false, + "layers":[ + {"$GMImageLayer":"","%Name":"cd0df110-6429-4bd1-a2db-58355c77f9a5","blendMode":0,"displayName":"default","isLocked":false,"name":"cd0df110-6429-4bd1-a2db-58355c77f9a5","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + ], + "name":"s_autoterrain_5x5", + "nineSlice":null, + "origin":4, + "parent":{ + "name":"sprites", + "path":"folders/nodes/data/tiler/sprites.yy", + }, + "preMultiplyAlpha":false, + "resourceType":"GMSprite", + "resourceVersion":"2.0", + "sequence":{ + "$GMSequence":"", + "%Name":"s_autoterrain_5x5", + "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_autoterrain_5x5", + "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":"333c6f4d-d18f-465f-929f-92782d6684d5","path":"sprites/s_autoterrain_5x5/s_autoterrain_5x5.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"2b8f6d09-964d-44ce-8778-8ecbb11ddce8","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":10, + "yorigin":10, + }, + "swatchColours":null, + "swfPrecision":0.5, + "textureGroupId":{ + "name":"Default", + "path":"texturegroups/Default", + }, + "type":0, + "VTile":false, + "width":20, +} \ No newline at end of file diff --git a/sprites/s_autotile_8x6/b83bc046-0985-4dc1-8946-97dfc2b07310.png b/sprites/s_autoterrain_8x6/b83bc046-0985-4dc1-8946-97dfc2b07310.png similarity index 100% rename from sprites/s_autotile_8x6/b83bc046-0985-4dc1-8946-97dfc2b07310.png rename to sprites/s_autoterrain_8x6/b83bc046-0985-4dc1-8946-97dfc2b07310.png diff --git a/sprites/s_autotile_8x6/layers/b83bc046-0985-4dc1-8946-97dfc2b07310/f68055ce-ac86-4b01-82e6-52237403ebaf.png b/sprites/s_autoterrain_8x6/layers/b83bc046-0985-4dc1-8946-97dfc2b07310/f68055ce-ac86-4b01-82e6-52237403ebaf.png similarity index 100% rename from sprites/s_autotile_8x6/layers/b83bc046-0985-4dc1-8946-97dfc2b07310/f68055ce-ac86-4b01-82e6-52237403ebaf.png rename to sprites/s_autoterrain_8x6/layers/b83bc046-0985-4dc1-8946-97dfc2b07310/f68055ce-ac86-4b01-82e6-52237403ebaf.png diff --git a/sprites/s_autotile_8x6/s_autotile_8x6.yy b/sprites/s_autoterrain_8x6/s_autoterrain_8x6.yy similarity index 91% rename from sprites/s_autotile_8x6/s_autotile_8x6.yy rename to sprites/s_autoterrain_8x6/s_autoterrain_8x6.yy index ab38ce979..21769be2d 100644 --- a/sprites/s_autotile_8x6/s_autotile_8x6.yy +++ b/sprites/s_autoterrain_8x6/s_autoterrain_8x6.yy @@ -1,6 +1,6 @@ { "$GMSprite":"", - "%Name":"s_autotile_8x6", + "%Name":"s_autoterrain_8x6", "bboxMode":0, "bbox_bottom":15, "bbox_left":1, @@ -21,7 +21,7 @@ "layers":[ {"$GMImageLayer":"","%Name":"f68055ce-ac86-4b01-82e6-52237403ebaf","blendMode":0,"displayName":"default","isLocked":false,"name":"f68055ce-ac86-4b01-82e6-52237403ebaf","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, ], - "name":"s_autotile_8x6", + "name":"s_autoterrain_8x6", "nineSlice":null, "origin":0, "parent":{ @@ -33,7 +33,7 @@ "resourceVersion":"2.0", "sequence":{ "$GMSequence":"", - "%Name":"s_autotile_8x6", + "%Name":"s_autoterrain_8x6", "autoRecord":true, "backdropHeight":768, "backdropImageOpacity":0.5, @@ -57,7 +57,7 @@ "resourceType":"KeyframeStore", "resourceVersion":"2.0", }, - "name":"s_autotile_8x6", + "name":"s_autoterrain_8x6", "playback":1, "playbackSpeed":30.0, "playbackSpeedType":0, @@ -69,7 +69,7 @@ "tracks":[ {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore":"","Keyframes":[ {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"b83bc046-0985-4dc1-8946-97dfc2b07310","path":"sprites/s_autotile_8x6/s_autotile_8x6.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"b83bc046-0985-4dc1-8946-97dfc2b07310","path":"sprites/s_autoterrain_8x6/s_autoterrain_8x6.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, },"Disabled":false,"id":"71c3750d-2b37-491b-82a1-e81aa5777085","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,}, ], diff --git a/sprites/s_node_tileset/05965c8d-83ef-49f2-92ed-2c79e632f392.png b/sprites/s_node_tileset/05965c8d-83ef-49f2-92ed-2c79e632f392.png deleted file mode 100644 index d3e1a10d9..000000000 Binary files a/sprites/s_node_tileset/05965c8d-83ef-49f2-92ed-2c79e632f392.png and /dev/null differ diff --git a/sprites/s_node_tileset/0c493bee-f15b-452e-b22b-0eb4f4b1a6a9.png b/sprites/s_node_tileset/0c493bee-f15b-452e-b22b-0eb4f4b1a6a9.png new file mode 100644 index 000000000..d6608e93f Binary files /dev/null and b/sprites/s_node_tileset/0c493bee-f15b-452e-b22b-0eb4f4b1a6a9.png differ diff --git a/sprites/s_node_tileset/layers/05965c8d-83ef-49f2-92ed-2c79e632f392/ec92eda4-1e09-4847-a92f-f90e1c4b090c.png b/sprites/s_node_tileset/layers/05965c8d-83ef-49f2-92ed-2c79e632f392/ec92eda4-1e09-4847-a92f-f90e1c4b090c.png deleted file mode 100644 index d3e1a10d9..000000000 Binary files a/sprites/s_node_tileset/layers/05965c8d-83ef-49f2-92ed-2c79e632f392/ec92eda4-1e09-4847-a92f-f90e1c4b090c.png and /dev/null differ diff --git a/sprites/s_node_tileset/layers/0c493bee-f15b-452e-b22b-0eb4f4b1a6a9/a478b705-fbbc-4b61-aab2-73d2ceb068dc.png b/sprites/s_node_tileset/layers/0c493bee-f15b-452e-b22b-0eb4f4b1a6a9/a478b705-fbbc-4b61-aab2-73d2ceb068dc.png new file mode 100644 index 000000000..d6608e93f Binary files /dev/null and b/sprites/s_node_tileset/layers/0c493bee-f15b-452e-b22b-0eb4f4b1a6a9/a478b705-fbbc-4b61-aab2-73d2ceb068dc.png differ diff --git a/sprites/s_node_tileset/s_node_tileset.yy b/sprites/s_node_tileset/s_node_tileset.yy index f45b16316..9371fd8f7 100644 --- a/sprites/s_node_tileset/s_node_tileset.yy +++ b/sprites/s_node_tileset/s_node_tileset.yy @@ -12,14 +12,14 @@ "edgeFiltering":false, "For3D":false, "frames":[ - {"$GMSpriteFrame":"","%Name":"05965c8d-83ef-49f2-92ed-2c79e632f392","name":"05965c8d-83ef-49f2-92ed-2c79e632f392","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + {"$GMSpriteFrame":"","%Name":"0c493bee-f15b-452e-b22b-0eb4f4b1a6a9","name":"0c493bee-f15b-452e-b22b-0eb4f4b1a6a9","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, ], "gridX":0, "gridY":0, "height":64, "HTile":false, "layers":[ - {"$GMImageLayer":"","%Name":"ec92eda4-1e09-4847-a92f-f90e1c4b090c","blendMode":0,"displayName":"default","isLocked":false,"name":"ec92eda4-1e09-4847-a92f-f90e1c4b090c","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + {"$GMImageLayer":"","%Name":"a478b705-fbbc-4b61-aab2-73d2ceb068dc","blendMode":0,"displayName":"default","isLocked":false,"name":"a478b705-fbbc-4b61-aab2-73d2ceb068dc","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, ], "name":"s_node_tileset", "nineSlice":null, @@ -69,8 +69,8 @@ "tracks":[ {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore":"","Keyframes":[ {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"05965c8d-83ef-49f2-92ed-2c79e632f392","path":"sprites/s_node_tileset/s_node_tileset.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"5cbd7933-8ded-481c-a560-2007a5e2e0de","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"0c493bee-f15b-452e-b22b-0eb4f4b1a6a9","path":"sprites/s_node_tileset/s_node_tileset.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"c4d7e3be-cadc-41a9-a3aa-5dada431e473","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, diff --git a/sprites/s_node_tileset_drawer/c19e60e4-752e-4d33-84d4-8cb8fd6d090e.png b/sprites/s_node_tileset_drawer/c19e60e4-752e-4d33-84d4-8cb8fd6d090e.png new file mode 100644 index 000000000..1c5a993d5 Binary files /dev/null and b/sprites/s_node_tileset_drawer/c19e60e4-752e-4d33-84d4-8cb8fd6d090e.png differ diff --git a/sprites/s_node_tileset_drawer/c3b4ed40-48e3-4bd9-be74-cdb201d5ce07.png b/sprites/s_node_tileset_drawer/c3b4ed40-48e3-4bd9-be74-cdb201d5ce07.png deleted file mode 100644 index fc2e4576e..000000000 Binary files a/sprites/s_node_tileset_drawer/c3b4ed40-48e3-4bd9-be74-cdb201d5ce07.png and /dev/null differ diff --git a/sprites/s_node_tileset_drawer/layers/c19e60e4-752e-4d33-84d4-8cb8fd6d090e/3ebbef57-3950-4b2b-8f28-985405db67a8.png b/sprites/s_node_tileset_drawer/layers/c19e60e4-752e-4d33-84d4-8cb8fd6d090e/3ebbef57-3950-4b2b-8f28-985405db67a8.png new file mode 100644 index 000000000..1c5a993d5 Binary files /dev/null and b/sprites/s_node_tileset_drawer/layers/c19e60e4-752e-4d33-84d4-8cb8fd6d090e/3ebbef57-3950-4b2b-8f28-985405db67a8.png differ diff --git a/sprites/s_node_tileset_drawer/layers/c3b4ed40-48e3-4bd9-be74-cdb201d5ce07/17b46b13-d023-44d6-a82c-1baa780ada99.png b/sprites/s_node_tileset_drawer/layers/c3b4ed40-48e3-4bd9-be74-cdb201d5ce07/17b46b13-d023-44d6-a82c-1baa780ada99.png deleted file mode 100644 index fc2e4576e..000000000 Binary files a/sprites/s_node_tileset_drawer/layers/c3b4ed40-48e3-4bd9-be74-cdb201d5ce07/17b46b13-d023-44d6-a82c-1baa780ada99.png and /dev/null differ diff --git a/sprites/s_node_tileset_drawer/s_node_tileset_drawer.yy b/sprites/s_node_tileset_drawer/s_node_tileset_drawer.yy index 6f951a7df..65b83c90a 100644 --- a/sprites/s_node_tileset_drawer/s_node_tileset_drawer.yy +++ b/sprites/s_node_tileset_drawer/s_node_tileset_drawer.yy @@ -12,14 +12,14 @@ "edgeFiltering":false, "For3D":false, "frames":[ - {"$GMSpriteFrame":"","%Name":"c3b4ed40-48e3-4bd9-be74-cdb201d5ce07","name":"c3b4ed40-48e3-4bd9-be74-cdb201d5ce07","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + {"$GMSpriteFrame":"","%Name":"c19e60e4-752e-4d33-84d4-8cb8fd6d090e","name":"c19e60e4-752e-4d33-84d4-8cb8fd6d090e","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, ], "gridX":0, "gridY":0, "height":64, "HTile":false, "layers":[ - {"$GMImageLayer":"","%Name":"17b46b13-d023-44d6-a82c-1baa780ada99","blendMode":0,"displayName":"default","isLocked":false,"name":"17b46b13-d023-44d6-a82c-1baa780ada99","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + {"$GMImageLayer":"","%Name":"3ebbef57-3950-4b2b-8f28-985405db67a8","blendMode":0,"displayName":"default","isLocked":false,"name":"3ebbef57-3950-4b2b-8f28-985405db67a8","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, ], "name":"s_node_tileset_drawer", "nineSlice":null, @@ -69,8 +69,8 @@ "tracks":[ {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore":"","Keyframes":[ {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"c3b4ed40-48e3-4bd9-be74-cdb201d5ce07","path":"sprites/s_node_tileset_drawer/s_node_tileset_drawer.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"c2cfdd19-a390-4eeb-a59b-7f180a8285ef","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"c19e60e4-752e-4d33-84d4-8cb8fd6d090e","path":"sprites/s_node_tileset_drawer/s_node_tileset_drawer.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"df124ed2-0439-43fb-9437-1f3ab99bbac3","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, diff --git a/sprites/s_node_tileset_export/41ad1ef4-812c-4234-873f-50652a2e18cb.png b/sprites/s_node_tileset_export/41ad1ef4-812c-4234-873f-50652a2e18cb.png new file mode 100644 index 000000000..f4c88920f Binary files /dev/null and b/sprites/s_node_tileset_export/41ad1ef4-812c-4234-873f-50652a2e18cb.png differ diff --git a/sprites/s_node_tileset_export/layers/41ad1ef4-812c-4234-873f-50652a2e18cb/fc03369a-caa3-4b07-9134-abc0293d62e6.png b/sprites/s_node_tileset_export/layers/41ad1ef4-812c-4234-873f-50652a2e18cb/fc03369a-caa3-4b07-9134-abc0293d62e6.png new file mode 100644 index 000000000..f4c88920f Binary files /dev/null and b/sprites/s_node_tileset_export/layers/41ad1ef4-812c-4234-873f-50652a2e18cb/fc03369a-caa3-4b07-9134-abc0293d62e6.png differ diff --git a/sprites/s_node_tileset_export/s_node_tileset_export.yy b/sprites/s_node_tileset_export/s_node_tileset_export.yy new file mode 100644 index 000000000..9f419eec7 --- /dev/null +++ b/sprites/s_node_tileset_export/s_node_tileset_export.yy @@ -0,0 +1,90 @@ +{ + "$GMSprite":"", + "%Name":"s_node_tileset_export", + "bboxMode":0, + "bbox_bottom":61, + "bbox_left":4, + "bbox_right":59, + "bbox_top":2, + "collisionKind":1, + "collisionTolerance":0, + "DynamicTexturePage":false, + "edgeFiltering":false, + "For3D":false, + "frames":[ + {"$GMSpriteFrame":"","%Name":"41ad1ef4-812c-4234-873f-50652a2e18cb","name":"41ad1ef4-812c-4234-873f-50652a2e18cb","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + ], + "gridX":0, + "gridY":0, + "height":64, + "HTile":false, + "layers":[ + {"$GMImageLayer":"","%Name":"fc03369a-caa3-4b07-9134-abc0293d62e6","blendMode":0,"displayName":"default","isLocked":false,"name":"fc03369a-caa3-4b07-9134-abc0293d62e6","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + ], + "name":"s_node_tileset_export", + "nineSlice":null, + "origin":4, + "parent":{ + "name":"IO", + "path":"folders/nodes/icons/IO.yy", + }, + "preMultiplyAlpha":false, + "resourceType":"GMSprite", + "resourceVersion":"2.0", + "sequence":{ + "$GMSequence":"", + "%Name":"s_node_tileset_export", + "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_tileset_export", + "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":"41ad1ef4-812c-4234-873f-50652a2e18cb","path":"sprites/s_node_tileset_export/s_node_tileset_export.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"7a774c57-8fb5-4744-bf39-c20e7e9a1ac7","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