diff --git a/Pixels Composer.yyp b/Pixels Composer.yyp index 34ab8fa2a..79560d41e 100644 --- a/Pixels Composer.yyp +++ b/Pixels Composer.yyp @@ -171,6 +171,7 @@ {"id":{"name":"node_chromatic_aberration","path":"scripts/node_chromatic_aberration/node_chromatic_aberration.yy",},"order":45,}, {"id":{"name":"node_pin","path":"scripts/node_pin/node_pin.yy",},"order":2,}, {"id":{"name":"sh_bw","path":"shaders/sh_bw/sh_bw.yy",},"order":1,}, + {"id":{"name":"real_comparison","path":"scripts/real_comparison/real_comparison.yy",},"order":1,}, {"id":{"name":"s_node_stripe","path":"sprites/s_node_stripe/s_node_stripe.yy",},"order":36,}, {"id":{"name":"sh_grey_alpha","path":"shaders/sh_grey_alpha/sh_grey_alpha.yy",},"order":11,}, {"id":{"name":"sh_normal","path":"shaders/sh_normal/sh_normal.yy",},"order":1,}, @@ -521,7 +522,7 @@ {"resourceType":"GMFolder","resourceVersion":"1.0","name":"animation_curve","folderPath":"folders/animation_curve.yy","order":14,}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"collection","folderPath":"folders/collection.yy","order":12,}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"dialog","folderPath":"folders/dialog.yy","order":5,}, - {"resourceType":"GMFolder","resourceVersion":"1.0","name":"selector","folderPath":"folders/dialog/selector.yy","order":23,}, + {"resourceType":"GMFolder","resourceVersion":"1.0","name":"color selector","folderPath":"folders/dialog/color selector.yy","order":23,}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"Extensions","folderPath":"folders/Extensions.yy","order":11,}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"font","folderPath":"folders/font.yy","order":8,}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"functions","folderPath":"folders/functions.yy","order":7,}, @@ -833,6 +834,7 @@ {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_padding_link_strip2.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"graphic.ai","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_scroll_bar.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ThemeDef.zip","CopyToMask":-1,"filePath":"datafiles/data/themes",}, ], "MetaData": { "IDEVersion": "2022.9.0.49", diff --git a/datafiles/data/themes/ThemeDef.zip b/datafiles/data/themes/ThemeDef.zip new file mode 100644 index 000000000..8dd9d36a3 Binary files /dev/null and b/datafiles/data/themes/ThemeDef.zip differ diff --git a/datafiles/data/themes/default/colors.json b/datafiles/data/themes/default/colors.json index d07729b48..ed8dd48f6 100644 --- a/datafiles/data/themes/default/colors.json +++ b/datafiles/data/themes/default/colors.json @@ -26,7 +26,7 @@ "_main_text_title": "blue_ltgrey", "_main_text_sub": "blue_grey", "_main_icon": "blue_grey", - "_main_icon_dark": "blue_black", + "_main_icon_dark": "blue_mdblack", "_main_value_positive": "lime", "_main_value_negative": "red", diff --git a/objects/o_dialog_color_selector/o_dialog_color_selector.yy b/objects/o_dialog_color_selector/o_dialog_color_selector.yy index 3e7230f94..44c55f2e7 100644 --- a/objects/o_dialog_color_selector/o_dialog_color_selector.yy +++ b/objects/o_dialog_color_selector/o_dialog_color_selector.yy @@ -33,7 +33,7 @@ "properties": [], "overriddenProperties": [], "parent": { - "name": "selector", - "path": "folders/dialog/selector.yy", + "name": "color selector", + "path": "folders/dialog/color selector.yy", }, } \ No newline at end of file diff --git a/objects/o_dialog_exit/Draw_64.gml b/objects/o_dialog_exit/Draw_64.gml index 545b4e0ef..7adda9823 100644 --- a/objects/o_dialog_exit/Draw_64.gml +++ b/objects/o_dialog_exit/Draw_64.gml @@ -43,8 +43,7 @@ draw_set_alpha(1); bx0 -= bw + ui(12); var b = buttonInstant(THEME.button, bx0, by0, bw, bh, mouse_ui, sFOCUS, sHOVER); draw_text(bx0 + bw / 2, by0 + bh / 2, "Save"); - if(b == 2) { - SAVE(); + if(b == 2 && SAVE()) { PREF_SAVE(); game_end(); } diff --git a/objects/o_dialog_gradient/o_dialog_gradient.yy b/objects/o_dialog_gradient/o_dialog_gradient.yy index c942298ab..bd8c2e1ee 100644 --- a/objects/o_dialog_gradient/o_dialog_gradient.yy +++ b/objects/o_dialog_gradient/o_dialog_gradient.yy @@ -33,7 +33,7 @@ "properties": [], "overriddenProperties": [], "parent": { - "name": "selector", - "path": "folders/dialog/selector.yy", + "name": "color selector", + "path": "folders/dialog/color selector.yy", }, } \ No newline at end of file diff --git a/objects/o_dialog_menubox/Draw_64.gml b/objects/o_dialog_menubox/Draw_64.gml index 5a7b6b698..459988512 100644 --- a/objects/o_dialog_menubox/Draw_64.gml +++ b/objects/o_dialog_menubox/Draw_64.gml @@ -12,11 +12,14 @@ continue; } var _h = hght; + var label = menu[i][0]; + var activated = string_char_at(label, 1) != "-"; + if(!activated) label = string_copy(label, 2, string_length(label) - 1); if(is_array(menu[i][1])) _h += hght; - if(sHOVER && point_in_rectangle(mouse_mx, mouse_my, dialog_x, yy + 1, dialog_x + dialog_w, yy + _h - 1)) { + if(activated && sHOVER && point_in_rectangle(mouse_mx, mouse_my, dialog_x, yy + 1, dialog_x + dialog_w, yy + _h - 1)) { draw_sprite_stretched_ext(THEME.textbox, 3, dialog_x, yy, dialog_w, _h, COLORS.dialog_menubox_highlight, 1); if(!is_array(menu[i][1]) && sFOCUS && mouse_check_button_released(mb_left)) { @@ -30,7 +33,9 @@ if(is_array(menu[i][1])) { draw_set_text(f_p1, fa_center, fa_center, COLORS._main_text_sub); - draw_text(dialog_x + dialog_w / 2, yy + hght / 2, menu[i][0]); + draw_set_alpha(activated * 0.5 + 0.5); + draw_text(dialog_x + dialog_w / 2, yy + hght / 2, label); + draw_set_alpha(1); var amo = array_length(menu[i][1]); var _w = (amo - 1) / 2 * (hght + ui(4)); @@ -63,7 +68,9 @@ } } else { draw_set_text(f_p0, fa_left, fa_center, COLORS._main_text); - draw_text(dialog_x + ui(16), yy + hght / 2, menu[i][0]); + draw_set_alpha(activated * 0.5 + 0.5); + draw_text(dialog_x + ui(16), yy + hght / 2, label); + draw_set_alpha(1); } if(array_length(menu[i]) > 2) { diff --git a/objects/o_dialog_palette/o_dialog_palette.yy b/objects/o_dialog_palette/o_dialog_palette.yy index 0dd9e56f9..f11377991 100644 --- a/objects/o_dialog_palette/o_dialog_palette.yy +++ b/objects/o_dialog_palette/o_dialog_palette.yy @@ -33,7 +33,7 @@ "properties": [], "overriddenProperties": [], "parent": { - "name": "selector", - "path": "folders/dialog/selector.yy", + "name": "color selector", + "path": "folders/dialog/color selector.yy", }, } \ No newline at end of file diff --git a/objects/o_main/Other_2.gml b/objects/o_main/Other_2.gml index 6e348cc29..2ccf209d0 100644 --- a/objects/o_main/Other_2.gml +++ b/objects/o_main/Other_2.gml @@ -2,16 +2,23 @@ #region directory globalvar DIRECTORY; DIRECTORY = environment_get_variable("userprofile") + "\\AppData\\Local\\Pixels_Composer\\"; - if(!directory_exists(DIRECTORY)) { - log_message("DIRECTORY", "Default user directory not exist"); - DIRECTORY = ""; - } + if(!directory_exists(DIRECTORY)) + directory_create(DIRECTORY); + log_clear(); log_newline(); log_message("SESSION", "Begin"); log_message("DIRECTORY", DIRECTORY); + __init_theme(); __init_collection(); __initAssets(); + + PREF_LOAD(); + loadFonts(); + loadGraphic(PREF_MAP[? "theme"]); + loadColor(PREF_MAP[? "theme"]); + + setPanel(); #endregion #region parameter @@ -29,6 +36,4 @@ directory_set_current_working(DIRECTORY); } } -#endregion - -PREF_LOAD(); \ No newline at end of file +#endregion \ No newline at end of file diff --git a/objects/o_main/Step_0.gml b/objects/o_main/Step_0.gml index 8d989169e..9aca8ece2 100644 --- a/objects/o_main/Step_0.gml +++ b/objects/o_main/Step_0.gml @@ -10,20 +10,20 @@ #region animation if(ANIMATOR.is_playing) { - ANIMATOR.real_frame += ANIMATOR.framerate / game_get_speed(gamespeed_fps); - if(floor(ANIMATOR.real_frame) > ANIMATOR.frames_total) { + ANIMATOR.real_frame += ANIMATOR.framerate * (delta_time / 1000000); + if(round(ANIMATOR.real_frame) >= ANIMATOR.frames_total) { switch(ANIMATOR.playback) { case ANIMATOR_END.loop : ANIMATOR.real_frame = 0; break; case ANIMATOR_END.stop : - ANIMATOR.real_frame = ANIMATOR.frames_total; + ANIMATOR.real_frame = ANIMATOR.frames_total - 1; ANIMATOR.is_playing = false; break; } } } else { - ANIMATOR.real_frame = min(ANIMATOR.real_frame, ANIMATOR.frames_total); + ANIMATOR.real_frame = clamp(ANIMATOR.real_frame, 0, ANIMATOR.frames_total - 1); } ANIMATOR.frame_progress = false; diff --git a/scripts/color_selector/color_selector.yy b/scripts/color_selector/color_selector.yy index fc87de206..0c23eab44 100644 --- a/scripts/color_selector/color_selector.yy +++ b/scripts/color_selector/color_selector.yy @@ -5,7 +5,7 @@ "isDnD": false, "isCompatibility": false, "parent": { - "name": "selector", - "path": "folders/dialog/selector.yy", + "name": "color selector", + "path": "folders/dialog/color selector.yy", }, } \ No newline at end of file diff --git a/scripts/event_recorder/event_recorder.gml b/scripts/event_recorder/event_recorder.gml index 4146b9636..70eb12fc8 100644 --- a/scripts/event_recorder/event_recorder.gml +++ b/scripts/event_recorder/event_recorder.gml @@ -129,31 +129,31 @@ function Action(_type, _object, _data) constructor { var ss = ""; switch(type) { case ACTION_TYPE.var_modify : - ss = "var mod: " + string(data[1]); + ss = "modify " + string(data[1]); break; case ACTION_TYPE.list_insert : - ss = "list insert: " + string(data[1]) + " in " + string(obj); + ss = "insert " + string(data[1]) + " to list " + string(obj); break; case ACTION_TYPE.list_modify : - ss = "list mod: " + string(data[1]) + " in " + string(obj); + ss = "modify " + string(data[1]) + " of list " + string(obj); break; case ACTION_TYPE.list_delete : - ss = "list del: " + string(data[1]) + " in " + string(obj); + ss = "delete " + string(data[1]) + " from list " + string(obj); break; case ACTION_TYPE.node_added : - ss = "node add: " + string(obj.name); + ss = "add " + string(obj.name) + " node"; break; case ACTION_TYPE.node_delete : - ss = "node deleted: " + string(obj.name); + ss = "deleted " + string(obj.name) + " node"; break; case ACTION_TYPE.junction_connect : - ss = "junction connect: " + string(obj.name); + ss = "connect " + string(obj.name) + " junction"; break; case ACTION_TYPE.group_added : - ss = "group add: " + string(obj.name); + ss = "add " + string(obj.name) + " to group"; break; case ACTION_TYPE.group_removed : - ss = "group remove: " + string(obj.name); + ss = "remove " + string(obj.name) + " from group"; break; } return ss; @@ -165,16 +165,20 @@ function recordAction(_type, _object, _data = -1) { if(UNDO_HOLDING) return; if(LOADING) return; - o_main.action_last_frame[array_length(o_main.action_last_frame)] = new Action(_type, _object, _data); + var act = new Action(_type, _object, _data); + array_push(o_main.action_last_frame, act); + + return act; } function UNDO() { if(ds_stack_empty(UNDO_STACK)) return; + if(instance_exists(_p_dialog)) return; IS_UNDOING = true; var actions = ds_stack_pop(UNDO_STACK); for(var i = 0; i < array_length(actions); i++) { - //show_debug_message("UNDO " + actions[i].toString()); + //print("UNDO " + actions[i].toString()); actions[i].undo(); } IS_UNDOING = false; @@ -189,7 +193,7 @@ function REDO() { IS_UNDOING = true; var actions = ds_stack_pop(REDO_STACK); for(var i = 0; i < array_length(actions); i++) { - //show_debug_message("REDO " + actions[i].toString()); + //print("REDO " + actions[i].toString()); actions[i].redo(); } IS_UNDOING = false; diff --git a/scripts/font_loader/font_loader.gml b/scripts/font_loader/font_loader.gml index db8ce7343..afbd61dd1 100644 --- a/scripts/font_loader/font_loader.gml +++ b/scripts/font_loader/font_loader.gml @@ -3,7 +3,7 @@ globalvar FONT_LOADED, f_h3, f_h5, f_p0, f_p0b, f_p1, f_p2, f_p3; FONT_LOADED = false; function _font_path(rel) { - return "data/themes/" + PREF_MAP[? "theme"] + "/fonts/" + string_replace_all(rel, "./", ""); + return DIRECTORY + "themes/" + PREF_MAP[? "theme"] + "/fonts/" + string_replace_all(rel, "./", ""); } function _font_load_from_struct(str, def) { @@ -13,8 +13,7 @@ function _font_load_from_struct(str, def) { return def; } - var f = font_add(path, str.size * UI_SCALE, false, false, str.range[0], str.range[1]); - return f; + return font_add(path, str.size * UI_SCALE, false, false, str.range[0], str.range[1]); } function font_clear(font) { if(font_exists(font)) font_delete(font); } diff --git a/scripts/load_palette/load_palette.yy b/scripts/load_palette/load_palette.yy index 692357f8d..2a63f38ca 100644 --- a/scripts/load_palette/load_palette.yy +++ b/scripts/load_palette/load_palette.yy @@ -1,12 +1,11 @@ { + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "load_palette", "isDnD": false, "isCompatibility": false, "parent": { - "name": "selector", - "path": "folders/dialog/selector.yy", + "name": "color selector", + "path": "folders/dialog/color selector.yy", }, - "resourceVersion": "1.0", - "name": "load_palette", - "tags": [], - "resourceType": "GMScript", } \ No newline at end of file diff --git a/scripts/node_data/node_data.gml b/scripts/node_data/node_data.gml index fe6e82b46..b6ce58ab6 100644 --- a/scripts/node_data/node_data.gml +++ b/scripts/node_data/node_data.gml @@ -528,27 +528,25 @@ function Node(_x, _y) constructor { static recoverCache = function() { if(ANIMATOR.current_frame >= array_length(cached_output)) return false; var _s = cached_output[ANIMATOR.current_frame]; - if(is_surface(_s)) { - var _outSurf = outputs[| 0].getValue(); - if(is_surface(_outSurf)) - surface_copy_size(_outSurf, _s); - else { - _outSurf = surface_clone(_s); - outputs[| 0].setValue(_outSurf); - } - - return true; + if(!is_surface(_s)) return false; + + var _outSurf = outputs[| 0].getValue(); + if(is_surface(_outSurf)) + surface_copy_size(_outSurf, _s); + else { + _outSurf = surface_clone(_s); + outputs[| 0].setValue(_outSurf); } - return false; + + return true; } static clearCache = function() { if(array_length(cached_output) != ANIMATOR.frames_total + 1) array_resize(cached_output, ANIMATOR.frames_total + 1); for(var i = 0; i < array_length(cached_output); i++) { var _s = cached_output[i]; - if(is_surface(_s)) { + if(is_surface(_s)) surface_free(_s); - } cached_output[i] = 0; } } diff --git a/scripts/node_keyframe/node_keyframe.gml b/scripts/node_keyframe/node_keyframe.gml index d33864852..ea89ad63f 100644 --- a/scripts/node_keyframe/node_keyframe.gml +++ b/scripts/node_keyframe/node_keyframe.gml @@ -185,12 +185,13 @@ function valueAnimator(_val, _prop) constructor { MODIFIED = true; if(!is_anim) { - if(_record) recordAction(ACTION_TYPE.var_modify, values[| 0], [ values[| 0].value, "value" ]); - if(values[| 0].value != _val) { - values[| 0].value = _val; - return true; - } - return false; + if(isEqual(values[| 0].value, _val)) + return false; + + if(_record) + recordAction(ACTION_TYPE.var_modify, values[| 0], [ values[| 0].value, "value" ]); + values[| 0].value = _val; + return true; } if(ds_list_size(values) == 0) { @@ -204,7 +205,8 @@ function valueAnimator(_val, _prop) constructor { for(var i = 0; i < ds_list_size(values); i++) { var _key = values[| i]; if(_key.time == _time) { - if(_record) recordAction(ACTION_TYPE.var_modify, _key, [ _key.value, "value" ]); + if(_record) + recordAction(ACTION_TYPE.var_modify, _key, [ _key.value, "value" ]); if(_key.value != _val) { _key.value = _val; return true; diff --git a/scripts/node_particle/node_particle.gml b/scripts/node_particle/node_particle.gml index 96a92369b..6c429ef94 100644 --- a/scripts/node_particle/node_particle.gml +++ b/scripts/node_particle/node_particle.gml @@ -254,7 +254,7 @@ function Node_Particle(_x, _y) : Node(_x, _y) constructor { inputs[| 21] = nodeValue(21, "Gravity", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0 ); inputs[| 22] = nodeValue(22, "Wiggle", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0 ); - inputs[| 23] = nodeValue(23, "Loop", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true ); + inputs[| 23] = nodeValue(23, "Loop", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ); inputs[| 24] = nodeValue(24, "Blend mode", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0 ) .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Normal", "Additive" ]); @@ -285,12 +285,13 @@ function Node_Particle(_x, _y) : Node(_x, _y) constructor { ["Rotation", true], 16, 9, 10, ["Scale", true], 11, 18, 12, ["Color", true], 13, 14, 15, - ["Render", true], 24, 19, 23, + ["Render", true], 24, 19, 23 ]; outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE); - seed = irandom(9999999); + seed_origin = irandom(9999999); + seed = seed_origin; def_surface = -1; parts = ds_list_create(); @@ -300,7 +301,8 @@ function Node_Particle(_x, _y) : Node(_x, _y) constructor { outputs[| 1] = nodeValue(1, "Particle data", self, JUNCTION_CONNECT.output, VALUE_TYPE.object, parts ); function spawn() { - randomize(); + random_set_seed(seed++); + var _inSurf = inputs[| 0].getValue(); if(_inSurf == 0) { @@ -429,35 +431,36 @@ function Node_Particle(_x, _y) : Node(_x, _y) constructor { parts[| i].kill(); } render(); + seed = seed_origin; } function updateParticle() { var jun = outputs[| 1]; for(var j = 0; j < ds_list_size(jun.value_to); j++) { - if(jun.value_to[| j].value_from == jun) { + if(jun.value_to[| j].value_from == jun) jun.value_to[| j].node.doUpdate(); - } } render(); } - function resetPartPool() { + function checkPartPool() { var _part_amo = PREF_MAP[? "part_max_amount"]; - if(_part_amo > ds_list_size(parts)) { - repeat(_part_amo - ds_list_size(parts)) { + var _curr_amo = ds_list_size(parts); + + if(_part_amo > _curr_amo) { + repeat(_part_amo - _curr_amo) ds_list_add(parts, new __part()); - } - } else if(_part_amo < ds_list_size(parts)) { - repeat(ds_list_size(parts) - _part_amo) { + } else if(_part_amo < _curr_amo) { + repeat(_curr_amo - _part_amo) ds_list_delete(parts, 0); - } } } static step = function() { var _inSurf = inputs[| 0].getValue(); var _scatt = inputs[| 27].getValue(); + var _loop = inputs[| 23].getValue(); inputs[| 25].setVisible(false); inputs[| 26].setVisible(false); @@ -472,7 +475,7 @@ function Node_Particle(_x, _y) : Node(_x, _y) constructor { } } - resetPartPool(); + checkPartPool(); var _spawn_type = inputs[| 17].getValue(); if(_spawn_type == 0) inputs[| 2].name = "Spawn delay"; @@ -484,24 +487,25 @@ function Node_Particle(_x, _y) : Node(_x, _y) constructor { if(ANIMATOR.is_playing && ANIMATOR.frame_progress) { if(ANIMATOR.current_frame == 0) reset(); - if(_spawn_type == 0) { - if(safe_mod(ANIMATOR.current_frame, _spawn_delay) == 0) - spawn(); - } else if(_spawn_type == 1) { - if(ANIMATOR.current_frame == _spawn_delay) - spawn(); + switch(_spawn_type) { + case 0 : + if(safe_mod(ANIMATOR.current_frame, _spawn_delay) == 0) + spawn(); + break; + case 1 : + if(ANIMATOR.current_frame == _spawn_delay) + spawn(); + break; } - for(var i = 0; i < PREF_MAP[? "part_max_amount"]; i++) + for(var i = 0; i < ds_list_size(parts); i++) parts[| i].step(); updateParticle(); - updateForward(); } - if(ANIMATOR.is_scrubing) { + if(ANIMATOR.is_scrubing) recoverCache(); - } } static drawOverlay = function(_active, _x, _y, _s, _mx, _my) { diff --git a/scripts/node_processor/node_processor.gml b/scripts/node_processor/node_processor.gml index 82fb21f48..73c48e57a 100644 --- a/scripts/node_processor/node_processor.gml +++ b/scripts/node_processor/node_processor.gml @@ -15,10 +15,8 @@ function Node_Processor(_x, _y) : Node(_x, _y) constructor { var len = 0; for(var i = 0; i < ds_list_size(inputs); i++) { var _in = inputs[| i].getValue(); - if(is_array(_in)) { - if(inputs[| i].isArray()) - len = max(len, array_length(_in)); - } + if(inputs[| i].isArray() && is_array(_in)) + len = max(len, array_length(_in)); } for(var _oi = 0; _oi < ds_list_size(outputs); _oi++) { @@ -38,15 +36,15 @@ function Node_Processor(_x, _y) : Node(_x, _y) constructor { var base_s = getData(0, i); if(is_surface(base_s)) { - var ww = surface_get_width(base_s); - var hh = surface_get_height(base_s); + ww = surface_get_width(base_s); + hh = surface_get_height(base_s); } } - if(!is_surface(outSurfs[i])) - outSurfs[i] = surface_create_valid(ww, hh); - else + if(is_surface(outSurfs[i])) surface_size_to(outSurfs[i], ww, hh) + else + outSurfs[i] = surface_create_valid(ww, hh); var _data = getDataArray(i); process_data(outSurfs[i], _data, _oi); @@ -75,11 +73,12 @@ function Node_Processor(_x, _y) : Node(_x, _y) constructor { outputs[| _oi].setValue(outSurfs); } - if(!is_surface(outSurfs)) { + if(is_surface(outSurfs)) { + surface_size_to(outSurfs, ww, hh); + } else { outSurfs = surface_create_valid(ww, hh); outputs[| _oi].setValue(outSurfs); - } else - surface_size_to(outSurfs, ww, hh); + } var _data = getDataArray(0); process_data(outSurfs, _data, _oi); diff --git a/scripts/node_sprite_sheet/node_sprite_sheet.gml b/scripts/node_sprite_sheet/node_sprite_sheet.gml index 8bb63838d..37eea40f0 100644 --- a/scripts/node_sprite_sheet/node_sprite_sheet.gml +++ b/scripts/node_sprite_sheet/node_sprite_sheet.gml @@ -143,7 +143,8 @@ function Node_Render_Sprite_Sheet(_x, _y) : Node(_x, _y) constructor { var skip = inputs[| 2].getValue(); if(is_array(inpt) && array_length(inpt) == 0) return; - if(!is_array(inpt)) inpt = [ inpt ]; + var arr = is_array(inpt); + if(!arr) inpt = [ inpt ]; var _surf = []; for(var i = 0; i < array_length(inpt); i++) { @@ -173,6 +174,8 @@ function Node_Render_Sprite_Sheet(_x, _y) : Node(_x, _y) constructor { draw_clear_alpha(0, 0); surface_reset_target(); } + + if(!arr) _surf = _surf[0]; outputs[| 0].setValue(_surf); } else { if(is_array(inpt)) { diff --git a/scripts/node_time_remap/node_time_remap.gml b/scripts/node_time_remap/node_time_remap.gml index 8e24d6838..1faf0bde4 100644 --- a/scripts/node_time_remap/node_time_remap.gml +++ b/scripts/node_time_remap/node_time_remap.gml @@ -41,7 +41,7 @@ function Node_Time_Remap(_x, _y) : Node(_x, _y) constructor { texture_set_stage(uniform_map, surface_get_texture(_map)); for(var i = 0; i <= _life; i++) { - var frame = clamp(ANIMATOR.current_frame - i, 0, ANIMATOR.frames_total); + var frame = clamp(ANIMATOR.current_frame - i, 0, ANIMATOR.frames_total - 1); if(is_surface(cached_output[frame])) { shader_set_uniform_f(uniform_min, i * ste); diff --git a/scripts/node_trail/node_trail.gml b/scripts/node_trail/node_trail.gml index f162d66ca..e27796133 100644 --- a/scripts/node_trail/node_trail.gml +++ b/scripts/node_trail/node_trail.gml @@ -11,7 +11,8 @@ function Node_Trail(_x, _y) : Node_Processor(_x, _y) constructor { inputs[| 0] = nodeValue(0, "Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0); inputs[| 1] = nodeValue(1, "Max life", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 3); inputs[| 2] = nodeValue(2, "Step", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1); - inputs[| 3] = nodeValue(3, "Alpha decrease", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0); + inputs[| 3] = nodeValue(3, "Alpha decrease", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0) + .setDisplay(VALUE_DISPLAY.slider, [0, 1, 0.01]); inputs[| 4] = nodeValue(4, "Blend mode", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) .setDisplay(VALUE_DISPLAY.enum_scroll, BLEND_TYPES ); @@ -46,19 +47,20 @@ function Node_Trail(_x, _y) : Node_Processor(_x, _y) constructor { var aa = 1; var res_index = 0; - var st_frame = floor(ANIMATOR.current_frame / _step); + var frame_amo = min(_life, floor(ANIMATOR.current_frame / _step)); + var st_frame = ANIMATOR.current_frame - frame_amo * _step; - for(var i = _life; i >= 0; i--) { - var frame = clamp(st_frame - i * _step, 0, ANIMATOR.frames_total); + for(var i = 0; i <= _life; i++) { + var frame_idx = clamp(st_frame + i * _step, 0, ANIMATOR.frames_total - 1); var bg = i % 2; - var fg = (i + 1) % 2; - aa = max(aa - _alpha, 0); + var fg = !bg; + var aa = 1 - _alpha * (_life - i); surface_set_target(temp_surf[bg]); if(i == _life) draw_surface_safe(_data[0], 0, 0); - else if(is_surface(cached_output[frame])) - draw_surface_blend(temp_surf[fg], cached_output[frame], _blend, aa); + else if(is_surface(cached_output[frame_idx])) + draw_surface_blend(temp_surf[fg], cached_output[frame_idx], _blend, aa); surface_reset_target(); res_index = bg; diff --git a/scripts/panel_animation/panel_animation.gml b/scripts/panel_animation/panel_animation.gml index c7e399fe4..8c6d95e5f 100644 --- a/scripts/panel_animation/panel_animation.gml +++ b/scripts/panel_animation/panel_animation.gml @@ -338,9 +338,9 @@ function Panel_Animation() : PanelContent() constructor { if(i >= array_length(inspecting.cached_output)) break; - var x0 = (i + 1) * ui(timeline_scale) + timeline_shift; - var x1 = (i + 2) * ui(timeline_scale) + timeline_shift; - + var x0 = (i + 0) * ui(timeline_scale) + timeline_shift; + var x1 = (i + 1) * ui(timeline_scale) + timeline_shift; + var sh = inspecting.cached_output[i]; draw_set_color(is_surface(sh)? c_lime : c_red); draw_set_alpha(0.5); diff --git a/scripts/panel_menu/panel_menu.gml b/scripts/panel_menu/panel_menu.gml index 7084bf180..a37065333 100644 --- a/scripts/panel_menu/panel_menu.gml +++ b/scripts/panel_menu/panel_menu.gml @@ -3,7 +3,7 @@ function Panel_Menu() : PanelContent() constructor { noti_flash = 0; - static menus = [ + menus = [ ["File", [ [ "New", function() { NEW(); @@ -77,6 +77,51 @@ function Panel_Menu() : PanelContent() constructor { ]], ] + function displayNewVersion() { + var xx = w - ui(88); + draw_set_text(f_p0b, fa_right, fa_center, COLORS._main_value_positive); + var txt = " Newer version available "; + var ww = string_width(txt); + + if(pHOVER && point_in_rectangle(mx, my, xx - ww, 0, xx, h)) { + draw_sprite_stretched(THEME.menu_button, 0, xx - ww - ui(6), ui(6), ww + ui(12), h - ui(12)); + + if(pFOCUS && mouse_check_button_pressed(mb_left)) { + url_open("https://makham.itch.io/pixel-composer"); + } + } + + draw_text(xx, h / 2, txt); + } + + function undoUpdate() { + var txt; + + if(ds_stack_empty(UNDO_STACK)) { + txt = "-Undo"; + } else { + var act = ds_stack_top(UNDO_STACK); + if(array_length(act) > 1) + txt = "Undo " + string(array_length(act)) + " actions"; + else + txt = "Undo " + act[0].toString(); + } + + menus[1][1][0][0] = txt; + + if(ds_stack_empty(REDO_STACK)) { + txt = "-Redo"; + } else { + var act = ds_stack_top(REDO_STACK); + if(array_length(act) > 1) + txt = "Redo " + string(array_length(act)) + " actions"; + else + txt = "Redo " + act[0].toString(); + } + + menus[1][1][1][0] = txt; + } + function drawContent(panel) { draw_clear_alpha(COLORS.panel_bg_clear, 0); draw_sprite_ui_uniform(THEME.icon_24, 0, h / 2, h / 2, 1, c_white); @@ -164,21 +209,9 @@ function Panel_Menu() : PanelContent() constructor { } draw_text(w - ui(16), h / 2, txt); - if(o_main.version_latest > VERSION) { - var xx = w - ui(88); - draw_set_text(f_p0b, fa_right, fa_center, COLORS._main_value_positive); - var txt = " Newer version available "; - var ww = string_width(txt); + if(o_main.version_latest > VERSION) + displayNewVersion(); - if(pHOVER && point_in_rectangle(mx, my, xx - ww, 0, xx, h)) { - draw_sprite_stretched(THEME.menu_button, 0, xx - ww - ui(6), ui(6), ww + ui(12), h - ui(12)); - - if(pFOCUS && mouse_check_button_pressed(mb_left)) { - url_open("https://makham.itch.io/pixel-composer"); - } - } - - draw_text(xx, h / 2, txt); - } + undoUpdate(); } } \ No newline at end of file diff --git a/scripts/panel_preview/panel_preview.gml b/scripts/panel_preview/panel_preview.gml index e3f83ae41..ac3b0facb 100644 --- a/scripts/panel_preview/panel_preview.gml +++ b/scripts/panel_preview/panel_preview.gml @@ -411,7 +411,8 @@ function Panel_Preview() : PanelContent() constructor { if(mouse_check_button_pressed(mb_left)) { _node.preview_index = i; _node.onValueUpdate(0); - do_fullView = true; + if(resetViewOnDoubleClick) + do_fullView = true; } draw_surface_ext_safe(prev, xx, yy, ss, ss, 0, c_white, 1); } else { diff --git a/scripts/preferences/preferences.gml b/scripts/preferences/preferences.gml index e9468a4f4..71e93705e 100644 --- a/scripts/preferences/preferences.gml +++ b/scripts/preferences/preferences.gml @@ -1,8 +1,6 @@ #region data globalvar PREF_MAP; PREF_MAP = ds_map_create(); - loadGraphic(); - loadColor(); #endregion #region pref map @@ -251,11 +249,6 @@ window_set_size(ww, hh); window_set_position(display_get_width() / 2 - ww / 2, display_get_height() / 2 - hh / 2); game_set_speed(PREF_MAP[? "ui_framerate"], gamespeed_fps); - - setPanel(); - loadFonts(); - loadGraphic(PREF_MAP[? "theme"]); - loadColor(PREF_MAP[? "theme"]); } function find_hotkey(_context, _name) { diff --git a/scripts/real_comparison/real_comparison.gml b/scripts/real_comparison/real_comparison.gml new file mode 100644 index 000000000..4f2f3ae7b --- /dev/null +++ b/scripts/real_comparison/real_comparison.gml @@ -0,0 +1,11 @@ +function isEqual(val1, val2) { + if(!is_array(val1) && !is_array(val2)) return val1 == val2; + if(is_array(val1) ^ is_array(val2)) return false; + if(array_length(val1) != array_length(val2)) return false; + + for( var i = 0; i < array_length(val1); i++ ) { + if(val1[i] != val2[i]) return false; + } + + return true; +} \ No newline at end of file diff --git a/scripts/real_comparison/real_comparison.yy b/scripts/real_comparison/real_comparison.yy new file mode 100644 index 000000000..8f32ab81e --- /dev/null +++ b/scripts/real_comparison/real_comparison.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "real_comparison", + "isDnD": false, + "isCompatibility": false, + "parent": { + "name": "eval", + "path": "folders/functions/eval.yy", + }, +} \ No newline at end of file diff --git a/scripts/save_function/save_function.gml b/scripts/save_function/save_function.gml index fca7fe2b2..a5ea65265 100644 --- a/scripts/save_function/save_function.gml +++ b/scripts/save_function/save_function.gml @@ -59,14 +59,13 @@ function SET_PATH(path) { function SAVE() { if(CURRENT_PATH == "" || READONLY) - SAVE_AS(); - else - SAVE_AT(CURRENT_PATH); + return SAVE_AS(); + return SAVE_AT(CURRENT_PATH); } function SAVE_AS() { var path = get_save_filename(".pxc", ""); - if(path == "") return; + if(path == "") return false; if(filename_ext(path) != ".pxc") path += ".pxc"; @@ -75,6 +74,8 @@ function SAVE_AS() { log_warning("SAVE", "Overrided file : " + path); SAVE_AT(path); SET_PATH(path); + + return true; } function SAVE_AT(path) { @@ -88,6 +89,8 @@ function SAVE_AT(path) { MODIFIED = false; log_message("FILE", "save at " + path, THEME.noti_icon_file_save); + + return true; } function SAVE_COLLECTIONS(_list, _path, save_surface = true) { diff --git a/scripts/slider/slider.gml b/scripts/slider/slider.gml index 45369ae6b..af648a86f 100644 --- a/scripts/slider/slider.gml +++ b/scripts/slider/slider.gml @@ -51,11 +51,13 @@ function slider(_min, _max, _step, _onModify = noone, _onRelease = noone) constr val = clamp(val, minn, maxx); if(onModify != noone) onModify(val); + UNDO_HOLDING = true; if(mouse_check_button_released(mb_left)) { dragging = false; if(onRelease != noone) onRelease(val); + UNDO_HOLDING = false; } } else { if(hover && (point_in_rectangle(_m[0], _m[1], _x, _y, _x + sw, _y + _h) || point_in_rectangle(_m[0], _m[1], _kx - ui(10), _y, _kx + ui(10), _y + _h))) { diff --git a/scripts/sliderRange/sliderRange.gml b/scripts/sliderRange/sliderRange.gml index f58200ec5..5ad84c2c7 100644 --- a/scripts/sliderRange/sliderRange.gml +++ b/scripts/sliderRange/sliderRange.gml @@ -47,9 +47,12 @@ function sliderRange(_min, _max, _step, _onModify) constructor { val = round(val / step) * step; val = clamp(val, minn, maxx); onModify(dragging, val); + UNDO_HOLDING = true; - if(mouse_check_button_released(mb_left)) + if(mouse_check_button_released(mb_left)) { + UNDO_HOLDING = false; dragging = -1; + } } else { if(hover) { var _hover = -1; diff --git a/scripts/sprite_loader/sprite_loader.gml b/scripts/sprite_loader/sprite_loader.gml index 66694e772..65f700fc2 100644 --- a/scripts/sprite_loader/sprite_loader.gml +++ b/scripts/sprite_loader/sprite_loader.gml @@ -1,5 +1,21 @@ +function __init_theme() { + var root = DIRECTORY + "Themes"; + if(!directory_exists(root)) + directory_create(root); + + var _l = root + "\\theme" + string(VERSION); + if(file_exists(_l)) return; + + log_message("THEME", "unzipping default theme to DIRECTORY."); + var f = file_text_open_write(_l); + file_text_write_real(f, 0); + file_text_close(f); + + zip_unzip("data/themes/ThemeDef.zip", root); +} + function _sprite_path(rel, theme) { - return "data/themes/" + theme + "/graphics/" + string_replace_all(rel, "./", ""); + return DIRECTORY + "themes/" + theme + "/graphics/" + string_replace_all(rel, "./", ""); } function _sprite_load_from_struct(str, theme, key) { diff --git a/scripts/surface_modify/surface_modify.gml b/scripts/surface_modify/surface_modify.gml index ee8053c22..c7ebecf85 100644 --- a/scripts/surface_modify/surface_modify.gml +++ b/scripts/surface_modify/surface_modify.gml @@ -1,34 +1,39 @@ function draw_surface_safe(surface, _x, _y) { - if(is_surface(surface)) draw_surface(surface, _x, _y); + if(!is_surface(surface)) return; + draw_surface(surface, _x, _y); } -function draw_surface_ext_safe(surface, _x, _y, _xs, _ys, _rot, _col, _alpha) { - if(is_surface(surface)) draw_surface_ext(surface, _x, _y, _xs, _ys, _rot, _col, _alpha); +function draw_surface_ext_safe(surface, _x, _y, _xs = 1, _ys = 1, _rot = 0, _col = c_white, _alpha = 1) { + if(!is_surface(surface)) return; + draw_surface_ext(surface, _x, _y, _xs, _ys, _rot, _col, _alpha); } -function draw_surface_tiled_ext_safe(surface, _x, _y, _xs, _ys, _col, _alpha) { - if(is_surface(surface)) draw_surface_tiled_ext(surface, _x, _y, _xs, _ys, _col, _alpha); +function draw_surface_tiled_ext_safe(surface, _x, _y, _xs = 1, _ys = 1, _col = c_white, _alpha = 1) { + if(!is_surface(surface)) return; + draw_surface_tiled_ext(surface, _x, _y, _xs, _ys, _col, _alpha); } -function draw_surface_part_ext_safe(surface, _l, _t, _w, _h, _x, _y, _xs, _ys, _rot, _col, _alpha) { - if(is_surface(surface)) draw_surface_part_ext(surface, _l, _t, _w, _h, _x, _y, _xs, _ys, _col, _alpha); +function draw_surface_part_ext_safe(surface, _l, _t, _w, _h, _x, _y, _xs = 1, _ys = 1, _rot = 0, _col = c_white, _alpha = 1) { + if(!is_surface(surface)) return; + draw_surface_part_ext(surface, _l, _t, _w, _h, _x, _y, _xs, _ys, _col, _alpha); } function surface_size_to(surface, width, height) { - width = surface_valid(width); - height = surface_valid(height); - if(!surface_exists(surface)) return false; + if(width == 1 && height == 1) return false; + + width = surface_valid_size(width); + height = surface_valid_size(height); var ww = surface_get_width(surface); var hh = surface_get_height(surface); - if(ww != width || hh != height) { - surface_resize(surface, width, height); - return true; - } + if(ww == width && hh == height) return false; - return false; + surface_resize(surface, width, height); + return true; } function surface_clone(surface) { + if(!surface_exists(surface)) return surface_create(1, 1); + var s = surface_create_valid(surface_get_width(surface), surface_get_height(surface)); surface_set_target(s); draw_clear_alpha(0, 0); @@ -39,6 +44,9 @@ function surface_clone(surface) { } function surface_copy_size(dest, source) { + if(!is_surface(dest)) return; + if(!is_surface(source)) return; + surface_size_to(dest, surface_get_width(source), surface_get_height(source)); surface_set_target(dest); draw_clear_alpha(0, 0); @@ -46,13 +54,13 @@ function surface_copy_size(dest, source) { surface_copy(dest, 0, 0, source); } -function surface_valid(s) { +function surface_valid_size(s) { if(is_infinity(s)) return 1; return max(1, s); } function surface_create_valid(w, h) { - return surface_create(surface_valid(w), surface_valid(h)); + return surface_create(surface_valid_size(w), surface_valid_size(h)); } function is_surface(s) { diff --git a/scripts/textArea/textArea.gml b/scripts/textArea/textArea.gml index fe5028e43..ba308e825 100644 --- a/scripts/textArea/textArea.gml +++ b/scripts/textArea/textArea.gml @@ -29,8 +29,15 @@ function textArea(_input, _onModify) constructor { click_block = 0; + static deselect = function() { + apply(); + TEXTBOX_ACTIVE = noone; + UNDO_HOLDING = false; + } + static apply = function() { if(onModify) onModify(_input_text); + UNDO_HOLDING = true; } static move_cursor = function(delta) { @@ -157,11 +164,9 @@ function textArea(_input, _onModify) constructor { if(keyboard_check_pressed(vk_escape)) { _input_text = _last_value; cut_line(); - apply(); - TEXTBOX_ACTIVE = noone; + deselect(); } else if(keyboard_check_pressed(vk_enter)) { - apply(); - TEXTBOX_ACTIVE = noone; + deselect(); } } @@ -419,8 +424,7 @@ function textArea(_input, _onModify) constructor { #endregion if(!point_in_rectangle(_m[0], _m[1], _x, _y, _x + _w, _y + hh) && mouse_check_button_pressed(mb_left)) { - apply(); - TEXTBOX_ACTIVE = noone; + deselect(); } } else { if(hover && point_in_rectangle(_m[0], _m[1], _x, _y, _x + _w, _y + hh)) { diff --git a/scripts/textBox/textBox.gml b/scripts/textBox/textBox.gml index 95af7b5d0..8ca644b59 100644 --- a/scripts/textBox/textBox.gml +++ b/scripts/textBox/textBox.gml @@ -141,9 +141,6 @@ function textBox(_input, _onModify) constructor { keyboard_string = ""; keyboard_lastkey = -1; #endregion - - if(auto_update && keyboard_check_pressed(vk_anykey)) - apply(); if(keyboard_check_pressed(vk_escape)) { _input_text = _last_value; @@ -152,6 +149,8 @@ function textBox(_input, _onModify) constructor { } else if(keyboard_check_pressed(vk_enter)) { apply(); TEXTBOX_ACTIVE = noone; + } else if(auto_update && keyboard_check_pressed(vk_anykey)) { + apply(); } } @@ -278,8 +277,11 @@ function textBox(_input, _onModify) constructor { break; } + apply(); + UNDO_HOLDING = true; + if(mouse_check_button_released(mb_left)) { - apply(); + UNDO_HOLDING = false; TEXTBOX_ACTIVE = noone; } } @@ -330,6 +332,7 @@ function textBox(_input, _onModify) constructor { if(keyboard_check(vk_alt)) _input_text = string(toNumber(ktxt) / 2); else _input_text = string(toNumber(ktxt) * 2); } + apply(); } } @@ -338,8 +341,6 @@ function textBox(_input, _onModify) constructor { else draw_text(_x + ui(8), _y + hh / 2, "x2"); draw_set_alpha(1); - - apply(); } #endregion