diff --git a/objects/oRigidbody/Create_0.gml b/objects/oRigidbody/Create_0.gml index a4609746a..08a2f3c82 100644 --- a/objects/oRigidbody/Create_0.gml +++ b/objects/oRigidbody/Create_0.gml @@ -5,4 +5,6 @@ xscale = 1; yscale = 1; + + depth = -9999; #endregion \ No newline at end of file diff --git a/objects/oRigidbody/Draw_64.gml b/objects/oRigidbody/Draw_64.gml new file mode 100644 index 000000000..9712e359d --- /dev/null +++ b/objects/oRigidbody/Draw_64.gml @@ -0,0 +1,3 @@ +/// @description +//if(!is_undefined(phy_active)) +// draw_surface_ext_safe(surface, phy_position_x, phy_position_y, xscale, yscale, image_angle); \ No newline at end of file diff --git a/objects/oRigidbody/oRigidbody.yy b/objects/oRigidbody/oRigidbody.yy index e47e51d78..cc86c7ff7 100644 --- a/objects/oRigidbody/oRigidbody.yy +++ b/objects/oRigidbody/oRigidbody.yy @@ -4,6 +4,7 @@ "name": "oRigidbody", "eventList": [ {"resourceType":"GMEvent","resourceVersion":"1.0","name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,}, + {"resourceType":"GMEvent","resourceVersion":"1.0","name":"","collisionObjectId":null,"eventNum":64,"eventType":8,"isDnD":false,}, ], "managed": true, "overriddenProperties": [], @@ -37,5 +38,5 @@ "path": "sprites/s_fx_pixel/s_fx_pixel.yy", }, "spriteMaskId": null, - "visible": false, + "visible": true, } \ No newline at end of file diff --git a/objects/o_main/Create_0.gml b/objects/o_main/Create_0.gml index 110f3d4ae..88d8fe657 100644 --- a/objects/o_main/Create_0.gml +++ b/objects/o_main/Create_0.gml @@ -256,6 +256,5 @@ #region tween tweenInit(); - physics_world_update_iterations(300); - physics_world_update_speed(60); + physics_world_update_iterations(100); #endregion \ No newline at end of file diff --git a/scripts/animation_controller/animation_controller.gml b/scripts/animation_controller/animation_controller.gml index 1b9240cf3..24228536e 100644 --- a/scripts/animation_controller/animation_controller.gml +++ b/scripts/animation_controller/animation_controller.gml @@ -13,6 +13,8 @@ playback = ANIMATOR_END.loop; static setFrame = function(frame) { + //if(frame == 0) resetAnimation(); + var _c = current_frame; frame = clamp(frame, 0, frames_total); real_frame = frame; @@ -33,6 +35,17 @@ } else frame_progress = false; } + + static resetAnimation = function() { + var _key = ds_map_find_first(NODE_MAP); + var amo = ds_map_size(NODE_MAP); + + repeat(amo) { + var _node = NODE_MAP[? _key]; + _node.resetAnimation(); + _key = ds_map_find_next(NODE_MAP, _key); + } + } } #endregion diff --git a/scripts/assets_data/assets_data.gml b/scripts/assets_data/assets_data.gml index 9cde70072..85e3832cb 100644 --- a/scripts/assets_data/assets_data.gml +++ b/scripts/assets_data/assets_data.gml @@ -10,11 +10,11 @@ directory_create(root); var _l = root + "/version"; - if(file_exists(_l)) { - var res = json_load_struct(_l); - if(!is_struct(res) || !struct_has(res, "version") || res.version < VERSION) - zip_unzip("data/Assets.zip", root); - } else + //if(file_exists(_l)) { + // var res = json_load_struct(_l); + // if(!is_struct(res) || !struct_has(res, "version") || res.version != VERSION) + // zip_unzip("data/Assets.zip", root); + //} else zip_unzip("data/Assets.zip", root); json_save_struct(_l, { version: VERSION }); diff --git a/scripts/collection_data/collection_data.gml b/scripts/collection_data/collection_data.gml index 6b5a51bc9..e4183bdd8 100644 --- a/scripts/collection_data/collection_data.gml +++ b/scripts/collection_data/collection_data.gml @@ -9,11 +9,11 @@ function __initCollection() { directory_create(root); var _l = root + "/version"; - if(file_exists(_l)) { - var res = json_load_struct(_l); - if(!is_struct(res) || !struct_has(res, "version") || res.version < COLLECTION_VERSION) - zip_unzip("data/Collections.zip", root); - } else + //if(file_exists(_l)) { + // var res = json_load_struct(_l); + // if(!is_struct(res) || !struct_has(res, "version") || res.version != COLLECTION_VERSION) + // zip_unzip("data/Collections.zip", root); + //} else zip_unzip("data/Collections.zip", root); json_save_struct(_l, { version: COLLECTION_VERSION }); diff --git a/scripts/debug/debug.gml b/scripts/debug/debug.gml index ec2b3f79a..ae7d2ab43 100644 --- a/scripts/debug/debug.gml +++ b/scripts/debug/debug.gml @@ -25,8 +25,8 @@ function __log(title, str, fname = "log.txt") { file_text_close(f); } -function log_message(title, str, icon = noone, flash = false) { - __log("[MESSAGE] ", string(title) + ": " + string(str)); +function log_message(title, str, icon = noone, flash = false, write = true) { + if(write) __log("[MESSAGE] ", string(title) + ": " + string(str)); return noti_status(string(title) + ": " + string(str), icon, flash); } diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index c04a1b10f..cd4155242 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -37,7 +37,7 @@ SAVEFILE_VERSION = 1400; COLLECTION_VERSION = 1140.090; THEME_VERSION = 1140.090; - VERSION_STRING = "1.14.0pr9.2"; + VERSION_STRING = "1.14.0pr9.3"; globalvar NODES, NODE_MAP, APPEND_MAP, HOTKEYS, HOTKEY_CONTEXT, NODE_INSTANCES; diff --git a/scripts/node_array/node_array.gml b/scripts/node_array/node_array.gml index ec2cd4611..757693a20 100644 --- a/scripts/node_array/node_array.gml +++ b/scripts/node_array/node_array.gml @@ -62,6 +62,13 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { outputs[| 0] = nodeValue("Array", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, []); attributes[? "size"] = 1; + attributes[? "spread_value"] = false; + + array_push(attributeEditors, "Node"); + array_push(attributeEditors, ["Spread array", "spread_value", + new checkBox(function() { + attributes[? "spread_value"] = !attributes[? "spread_value"]; + })]); static getType = function() { var _type = inputs[| 0].getValue(); @@ -150,11 +157,17 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { var _typ = getType(); outputs[| 0].type = _typ; - var res = array_create(ds_list_size(inputs) - input_fix_len - 1); + var res = []; var ind = 0; for( var i = input_fix_len; i < ds_list_size(inputs) - 1; i++ ) { - res[ind++] = inputs[| i].getValue(); + var val = inputs[| i].getValue(); + + if(is_array(val) && attributes[? "spread_value"]) + array_append(res, val); + else + array_push(res, val); + inputs[| i].type = inputs[| i].value_from? inputs[| i].value_from.type : _typ; if(i == input_fix_len && _typ == VALUE_TYPE.any && inputs[| i].value_from) diff --git a/scripts/node_data/node_data.gml b/scripts/node_data/node_data.gml index 8db61730e..d5823af6d 100644 --- a/scripts/node_data/node_data.gml +++ b/scripts/node_data/node_data.gml @@ -1329,6 +1329,8 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x static preConnect = function() {} static postConnect = function() {} + static resetAnimation = function() {} + static cleanUp = function() { for( var i = 0; i < ds_list_size(inputs); i++ ) inputs[| i].cleanUp(); diff --git a/scripts/node_export/node_export.gml b/scripts/node_export/node_export.gml index e925bb771..b95d50a36 100644 --- a/scripts/node_export/node_export.gml +++ b/scripts/node_export/node_export.gml @@ -132,7 +132,7 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor execute_shell(webp, cmd); - var noti = log_message("EXPORT", "Export webp as " + target_path, THEME.noti_icon_tick, COLORS._main_value_positive); + var noti = log_message("EXPORT", "Export webp as " + target_path, THEME.noti_icon_tick, COLORS._main_value_positive, false); noti.path = filename_dir(target_path); noti.setOnClick(function() { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer); @@ -164,7 +164,7 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor execute_shell(converter, shell_cmd); - var noti = log_message("EXPORT", "Export gif as " + target_path, THEME.noti_icon_tick, COLORS._main_value_positive); + var noti = log_message("EXPORT", "Export gif as " + target_path, THEME.noti_icon_tick, COLORS._main_value_positive, false); noti.path = filename_dir(target_path); noti.setOnClick(function() { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer); @@ -253,13 +253,14 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor var qual = inputs[| 10].getValue(); var ext = array_safe_get(format_image, extd, ".png"); - var _pathOut = _path; + var _pathOut = _path; var _pathTemp = directory + "/" + string(irandom_range(10000, 99999)) + ".png"; switch(ext) { case ".png": surface_save_safe(_surf, _path); break; + case ".jpg": surface_save_safe(_surf, _pathTemp); @@ -270,6 +271,7 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor print(shell_cmd) execute_shell(magick, shell_cmd); break; + case ".webp": surface_save_safe(_surf, _pathTemp); @@ -311,7 +313,7 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor } if(form != NODE_EXPORT_FORMAT.gif) { - var noti = log_message("EXPORT", "Export " + string(array_length(surf)) + " images complete.", THEME.noti_icon_tick, COLORS._main_value_positive); + var noti = log_message("EXPORT", "Export " + string(array_length(surf)) + " images complete.", THEME.noti_icon_tick, COLORS._main_value_positive, false); noti.path = filename_dir(p); noti.setOnClick(function() { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer); @@ -330,7 +332,7 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor p = save_surface(surf, p); if(form != NODE_EXPORT_FORMAT.gif) { - var noti = log_message("EXPORT", "Export image as " + p, THEME.noti_icon_tick, COLORS._main_value_positive); + var noti = log_message("EXPORT", "Export image as " + p, THEME.noti_icon_tick, COLORS._main_value_positive, false); noti.path = filename_dir(p); noti.setOnClick(function() { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer); diff --git a/scripts/node_guide/node_guide.gml b/scripts/node_guide/node_guide.gml index 5e9272ec9..7d0c3233e 100644 --- a/scripts/node_guide/node_guide.gml +++ b/scripts/node_guide/node_guide.gml @@ -75,7 +75,7 @@ function __initNodeData() { if(file_exists(_l)) { var res = json_load_struct(_l); - if(res.version >= VERSION) return; + if(res.version == VERSION) return; } json_save_struct(_l, { version: VERSION }); diff --git a/scripts/node_image_animated/node_image_animated.gml b/scripts/node_image_animated/node_image_animated.gml index 790db6af7..2711f88db 100644 --- a/scripts/node_image_animated/node_image_animated.gml +++ b/scripts/node_image_animated/node_image_animated.gml @@ -49,7 +49,7 @@ function Node_Image_Animated(_x, _y, _group = noone) : Node(_x, _y, _group) cons inputs[| 2] = nodeValue("Stretch frame", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false) .rejectArray(); - inputs[| 3] = nodeValue("Frame duration", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1) + inputs[| 3] = nodeValue("Frame duration", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1) .rejectArray(); inputs[| 4] = nodeValue("Animation end", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) @@ -174,6 +174,9 @@ function Node_Image_Animated(_x, _y, _group = noone) : Node(_x, _y, _group) cons break; } + var _spr = array_safe_get(spr, _frame, noone); + if(_spr == noone) return; + var curr_w = sprite_get_width(spr[_frame]); var curr_h = sprite_get_height(spr[_frame]); var curr_x = pad[2] + (ww - curr_w) / 2; diff --git a/scripts/node_rigid_group/node_rigid_group.gml b/scripts/node_rigid_group/node_rigid_group.gml index 1abec5376..b568fd931 100644 --- a/scripts/node_rigid_group/node_rigid_group.gml +++ b/scripts/node_rigid_group/node_rigid_group.gml @@ -15,11 +15,9 @@ function Node_Rigid_Group(_x, _y, _group = noone) : Node_Collection(_x, _y, _gro _output.inputs[| 0].setFrom(_render.outputs[| 0]); } - //physics_world_update_iterations(30); - //physics_world_update_speed(100) - static reset = function() { instance_destroy(oRigidbody); + physics_pause_enable(true); var node_list = getNodeList(); @@ -28,6 +26,7 @@ function Node_Rigid_Group(_x, _y, _group = noone) : Node_Collection(_x, _y, _gro if(variable_struct_exists(n, "reset")) n.reset(); } + physics_pause_enable(false); } diff --git a/scripts/node_rigid_object/node_rigid_object.gml b/scripts/node_rigid_object/node_rigid_object.gml index abee07a1e..a7f377a2d 100644 --- a/scripts/node_rigid_object/node_rigid_object.gml +++ b/scripts/node_rigid_object/node_rigid_object.gml @@ -7,7 +7,8 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr w = 96; min_h = 96; - object = []; + object = []; + attributes[? "mesh"] = []; inputs[| 0] = nodeValue("Affect by force", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true) .rejectArray(); @@ -61,20 +62,12 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr ]; static newMesh = function(index) { - var mx = "mesh_x" + string(index); - var my = "mesh_y" + string(index); - - attributes[? mx] = ds_list_create(); - attributes[? mx][| 0] = 0; - attributes[? mx][| 1] = 32; - attributes[? mx][| 2] = 32; - attributes[? mx][| 3] = 0; - - attributes[? my] = ds_list_create(); - attributes[? my][| 0] = 0; - attributes[? my][| 1] = 0; - attributes[? my][| 2] = 32; - attributes[? my][| 3] = 32; + var mesh = ds_map_try_get(attributes, "mesh", []); + mesh[index] = [ [ 0, 0], + [32, 0], + [32, 32], + [ 0, 32] ]; + attributes[? "mesh"] = mesh; } newMesh(0); @@ -97,14 +90,8 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr var _shp = inputs[| 5].getValue(); var _box = inputs[| 7].getValue(); - var mshx = "mesh_x" + string(preview_index); - var mshy = "mesh_y" + string(preview_index); - if(!ds_map_exists(attributes, mshx)) - newMesh(preview_index); - - var lx = attributes[? mshx]; - var ly = attributes[? mshy]; - var len = ds_list_size(lx); + var meshes = attributes[? "mesh"]; + if(preview_index >= array_length(meshes)) return; if(previewing == 0) { if(_shp == 2) { @@ -115,28 +102,33 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr draw_set_color(is_convex? COLORS._main_accent : COLORS._main_value_negative); - for( var i = 0; i < len; i++ ) { - var _px0 = lx[| i]; - var _py0 = ly[| i]; - var _px1 = lx[| safe_mod(i + 1, len)]; - var _py1 = ly[| safe_mod(i + 1, len)]; + for( var j = 0; j < array_length(meshes); j++ ) { + var _m = meshes[j]; + var _l = array_length(_m); - _px0 = (_px0 / tw) * 2 - 1; - _py0 = (_py0 / th) * 2 - 1; - _px1 = (_px1 / tw) * 2 - 1; - _py1 = (_py1 / th) * 2 - 1; + for( var i = 0; i < _l; i++ ) { + var _px0 = _m[i][0]; + var _py0 = _m[i][1]; + var _px1 = _m[safe_mod(i + 1, _l)][0]; + var _py1 = _m[safe_mod(i + 1, _l)][1]; + + _px0 = (_px0 / tw) * 2 - 1; + _py0 = (_py0 / th) * 2 - 1; + _px1 = (_px1 / tw) * 2 - 1; + _py1 = (_py1 / th) * 2 - 1; - _px0 = _box[0] + (_box[2]) * _px0; - _py0 = _box[1] + (_box[3]) * _py0; - _px1 = _box[0] + (_box[2]) * _px1; - _py1 = _box[1] + (_box[3]) * _py1; + _px0 = _box[0] + (_box[2]) * _px0; + _py0 = _box[1] + (_box[3]) * _py0; + _px1 = _box[0] + (_box[2]) * _px1; + _py1 = _box[1] + (_box[3]) * _py1; - var _dx0 = _x + _px0 * _s; - var _dy0 = _y + _py0 * _s; - var _dx1 = _x + _px1 * _s; - var _dy1 = _y + _py1 * _s; + var _dx0 = _x + _px0 * _s; + var _dy0 = _y + _py0 * _s; + var _dx1 = _x + _px1 * _s; + var _dy1 = _y + _py1 * _s; - draw_line_width(_dx0, _dy0, _dx1, _dy1, 1); + draw_line_width(_dx0, _dy0, _dx1, _dy1, 1); + } } draw_set_color(COLORS._main_accent); @@ -162,14 +154,17 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr var _hover = -1, _side = 0; draw_set_color(is_convex? COLORS._main_accent : COLORS._main_value_negative); + var mesh = meshes[preview_index]; + var len = array_length(mesh); + is_convex = true; for( var i = 0; i < len; i++ ) { - var _px0 = lx[| i]; - var _py0 = ly[| i]; - var _px1 = lx[| safe_mod(i + 1, len)]; - var _py1 = ly[| safe_mod(i + 1, len)]; - var _px2 = lx[| safe_mod(i + 2, len)]; - var _py2 = ly[| safe_mod(i + 2, len)]; + var _px0 = mesh[safe_mod(i + 0, len)][0]; + var _py0 = mesh[safe_mod(i + 0, len)][1]; + var _px1 = mesh[safe_mod(i + 1, len)][0]; + var _py1 = mesh[safe_mod(i + 1, len)][1]; + var _px2 = mesh[safe_mod(i + 2, len)][0]; + var _py2 = mesh[safe_mod(i + 2, len)][1]; var side = cross_product(_px0, _py0, _px1, _py1, _px2, _py2); if(_side != 0 && sign(_side) != sign(side)) @@ -191,8 +186,8 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr draw_set_text(f_p1, fa_center, fa_bottom); for( var i = 0; i < len; i++ ) { - var _px = lx[| i]; - var _py = ly[| i]; + var _px = mesh[i][0]; + var _py = mesh[i][1]; var _dx = _x + _px * _s; var _dy = _y + _py * _s; @@ -216,8 +211,8 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr dx = value_snap(dx, _snx); dy = value_snap(dy, _sny); - lx[| anchor_dragging] = dx; - ly[| anchor_dragging] = dy; + mesh[anchor_dragging][0] = dx; + mesh[anchor_dragging][1] = dy; if(mouse_release(mb_left)) anchor_dragging = -1; @@ -230,15 +225,13 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr if(mouse_click(mb_left, active)) { if(isUsingTool(0)) { anchor_dragging = hover; - anchor_drag_sx = lx[| hover]; - anchor_drag_sy = ly[| hover]; + anchor_drag_sx = mesh[hover][0]; + anchor_drag_sy = mesh[hover][1]; anchor_drag_mx = _mx; anchor_drag_my = _my; } else if(isUsingTool(1)) { - if(ds_list_size(lx) > 3) { - ds_list_delete(lx, hover); - ds_list_delete(ly, hover); - } + if(array_length(mesh) > 3) + array_delete(mesh, hover, 1); } } } else { @@ -248,8 +241,8 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr ds_list_insert(ly, ind, (_my - _y) / _s); anchor_dragging = ind; - anchor_drag_sx = lx[| ind]; - anchor_drag_sy = ly[| ind]; + anchor_drag_sx = mesh[ind][0]; + anchor_drag_sy = mesh[ind][1]; anchor_drag_mx = _mx; anchor_drag_my = _my; } @@ -267,13 +260,8 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr if(!is_surface(_tex)) return; - var mshx = "mesh_x" + string(index); - var mshy = "mesh_y" + string(index); - - var lx = attributes[? mshx]; - var ly = attributes[? mshy]; - ds_list_clear(lx); - ds_list_clear(ly); + var meshes = attributes[? "mesh"]; + var mesh = []; var ww = surface_get_width(_tex); var hh = surface_get_height(_tex); @@ -349,29 +337,26 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr py = cmY + lengthdir_y(dist, dirr); } - ds_list_add(lx, px); - ds_list_add(ly, py); + array_push(mesh, [ px, py ]); } - removeColinear(index); - removeConcave(index); + mesh = removeColinear(mesh); + mesh = removeConcave(mesh); var _sm = ds_map_create(); - for( var i = 0; i < ds_list_size(lx); i++ ) - _sm[? point_direction_positive(cmX, cmY, lx[| i], ly[| i])] = [lx[| i], ly[| i]]; + for( var i = 0; i < array_length(mesh); i++ ) + _sm[? point_direction_positive(cmX, cmY, mesh[i][0], mesh[i][1])] = [ mesh[i][0], mesh[i][1] ]; var keys = ds_map_keys_to_array(_sm); + mesh = []; if(array_length(keys)) { array_sort(keys, false); - ds_list_clear(lx); - ds_list_clear(ly); - for( var i = 0; i < array_length(keys); i++ ) { - ds_list_add(lx, _sm[? keys[i]][0]); - ds_list_add(ly, _sm[? keys[i]][1]); + var k = keys[i]; + array_push( mesh, [_sm[? k][0], _sm[? k][1]] ); } } @@ -381,26 +366,23 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr ds_map_destroy(_pm); surface_free(temp); buffer_delete(surface_buffer); + + meshes[index] = mesh; + attributes[? "mesh"] = meshes; } - static removeColinear = function(index = 0) { - var mshx = "mesh_x" + string(index); - var mshy = "mesh_y" + string(index); - - var fxList = attributes[? mshx]; - var fyList = attributes[? mshy]; - - var len = ds_list_size(fxList), _side = 0; + static removeColinear = function(mesh) { + var len = array_length(mesh), _side = 0; var remSt = []; var tolerance = 5; for( var i = 0; i < len; i++ ) { - var _px0 = fxList[| i]; - var _py0 = fyList[| i]; - var _px1 = fxList[| safe_mod(i + 1, len)]; - var _py1 = fyList[| safe_mod(i + 1, len)]; - var _px2 = fxList[| safe_mod(i + 2, len)]; - var _py2 = fyList[| safe_mod(i + 2, len)]; + var _px0 = mesh[safe_mod(i + 0, len)][0]; + var _py0 = mesh[safe_mod(i + 0, len)][1]; + var _px1 = mesh[safe_mod(i + 1, len)][0]; + var _py1 = mesh[safe_mod(i + 1, len)][1]; + var _px2 = mesh[safe_mod(i + 2, len)][0]; + var _py2 = mesh[safe_mod(i + 2, len)][1]; var dir0 = point_direction(_px0, _py0, _px1, _py1); var dir1 = point_direction(_px1, _py1, _px2, _py2); @@ -412,27 +394,21 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr array_sort(remSt, false); for( var i = 0; i < array_length(remSt); i++ ) { var ind = remSt[i]; - - ds_list_delete(fxList, ind); - ds_list_delete(fyList, ind); + array_delete(mesh, ind, 1); } + + return mesh; } - static removeConcave = function(index = 0) { - var mshx = "mesh_x" + string(index); - var mshy = "mesh_y" + string(index); - - var fxList = attributes[? mshx]; - var fyList = attributes[? mshy]; - - var len = ds_list_size(fxList); + static removeConcave = function(mesh) { + var len = array_length(mesh); if(len <= 3) return; var startIndex = 0; var maxx = 0; for( var i = 0; i < len; i++ ) { - var _px0 = fxList[| i]; + var _px0 = mesh[i][0]; if(_px0 > maxx) { maxx = _px0; @@ -457,12 +433,12 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr printIf(log, "Checking " + string(potentialPoint) + " Against " + string(anchorPoint) + " Test " + string(anchorTest)) if(potentialPoint == startIndex) break; - var _px0 = fxList[| anchorPoint]; - var _py0 = fyList[| anchorPoint]; - var _px1 = fxList[| potentialPoint]; - var _py1 = fyList[| potentialPoint]; - var _px2 = fxList[| anchorTest]; - var _py2 = fyList[| anchorTest]; + var _px0 = mesh[anchorPoint][0]; + var _py0 = mesh[anchorPoint][1]; + var _px1 = mesh[potentialPoint][0]; + var _py1 = mesh[potentialPoint][1]; + var _px2 = mesh[anchorTest][0]; + var _py2 = mesh[anchorTest][1]; var side = sign(cross_product(_px0, _py0, _px1, _py1, _px2, _py2)); if(_side == 0 || _side == side) { @@ -485,15 +461,15 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr for( var i = 0; i < array_length(remSt); i++ ) { var ind = remSt[i]; - - ds_list_delete(fxList, ind); - ds_list_delete(fyList, ind); + array_delete(mesh, ind, 1); } + + return mesh; } static onValueUpdate = function(index = 0) { if(index == 5) { - var _spos = inputs[| 7].getValue(); + var _spos = inputs[| 7].getValue(); var _shape = inputs[| 5].getValue(); _spos[4] = _shape; inputs[| 7].setValue(_spos); @@ -545,8 +521,8 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr if(object == noone) { object = instance_create_depth(ox - _spos[2], oy - _spos[3], 0, oRigidbody); - object.image_xscale = _spos[2] / ww * 2; - object.image_yscale = _spos[3] / hh * 2; + object.xscale = _spos[2] / ww * 2; + object.yscale = _spos[3] / hh * 2; object.surface = _tex; } else if(instance_exists(object)) { for( var i = 0; i < array_length(object.fixture); i++ ) @@ -564,23 +540,19 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr physics_fixture_set_circle_shape(fixture, min(_spos[2], _spos[3])); fixtureCreate(fixture, object); } else if(_shp == 2) { - var mshx = "mesh_x" + string(index); - var mshy = "mesh_y" + string(index); - - var fxList = attributes[? mshx]; - var fyList = attributes[? mshy]; - var cx = 0, cy = 0; - var cmx = 0, cmy = 0; + var mesh = attributes[? "mesh"][index]; + var cx = 0, cy = 0; + var cmx = 0, cmy = 0; - var len = ds_list_size(fxList), _side = 0; + var len = array_length(mesh), _side = 0; is_convex = true; for( var i = 0; i < len; i++ ) { - var _px0 = fxList[| i]; - var _py0 = fyList[| i]; - var _px1 = fxList[| safe_mod(i + 1, len)]; - var _py1 = fyList[| safe_mod(i + 1, len)]; - var _px2 = fxList[| safe_mod(i + 2, len)]; - var _py2 = fyList[| safe_mod(i + 2, len)]; + var _px0 = mesh[safe_mod(i + 0, len)][0]; + var _py0 = mesh[safe_mod(i + 0, len)][1]; + var _px1 = mesh[safe_mod(i + 1, len)][0]; + var _py1 = mesh[safe_mod(i + 1, len)][1]; + var _px2 = mesh[safe_mod(i + 2, len)][0]; + var _py2 = mesh[safe_mod(i + 2, len)][1]; var side = cross_product(_px0, _py0, _px1, _py1, _px2, _py2); if(_side != 0 && sign(_side) != sign(side)) @@ -611,8 +583,8 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr physics_fixture_set_polygon_shape(fixture); for( var i = 0; i < len; i++ ) { - var _px0 = fxList[| i]; - var _py0 = fyList[| i]; + var _px0 = mesh[i][0]; + var _py0 = mesh[i][1]; _px0 = (_px0 / ww) * 2 - 1; _py0 = (_py0 / hh) * 2 - 1; @@ -620,7 +592,7 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr _px0 = _spos[2] * _px0; _py0 = _spos[3] * _py0; - physics_fixture_add_point(fixture, _px0, _py0); + physics_fixture_add_point(fixture, round(_px0), round(_py0)); } fixtureCreate(fixture, object); @@ -629,10 +601,10 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr var fixture = physics_fixture_create(); physics_fixture_set_polygon_shape(fixture); - var _px0 = fxList[| i]; - var _py0 = fyList[| i]; - var _px1 = fxList[| safe_mod(i + 1, len)]; - var _py1 = fyList[| safe_mod(i + 1, len)]; + var _px0 = mesh[safe_mod(i + 0, len)][0]; + var _py0 = mesh[safe_mod(i + 0, len)][1]; + var _px1 = mesh[safe_mod(i + 1, len)][0]; + var _py1 = mesh[safe_mod(i + 1, len)][1]; _px0 = (_px0 / ww) * 2 - 1; _py0 = (_py0 / hh) * 2 - 1; @@ -662,14 +634,10 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr } static update = function(frame = ANIMATOR.current_frame) { - if(ANIMATOR.current_frame == 0) { - reset(); - return; - } if(!isAnimated()) return; - for( var i = 0; i < array_length(object); i++ ) - spawn(noone, i, object[i]); + //for( var i = 0; i < array_length(object); i++ ) + // spawn(noone, i, object[i]); } static step = function() { @@ -679,11 +647,10 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr var _tex = inputs[| 6].getValue(); if(is_array(_tex)) { - for( var i = 0; i < array_length(_tex); i++ ) { - var mshx = "mesh_x" + string(i); - if(!ds_map_exists(attributes, mshx)) - newMesh(i); - } + var meshes = attributes[? "mesh"]; + + for( var i = array_length(meshes); i < array_length(_tex); i++ ) + newMesh(i); } } @@ -716,21 +683,15 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr static attributeSerialize = function() { var att = ds_map_create(); - var k = ds_map_find_first(attributes); - repeat(ds_map_size(attributes)) { - ds_map_add_list(att, k, ds_list_clone(attributes[? k])); - k = ds_map_find_next(attributes, k); - } + + var mesh = ds_map_try_get(attributes, "mesh", []); + att[? "mesh"] = json_stringify(mesh); return att; } static attributeDeserialize = function(attr) { - var k = ds_map_find_first(attr); - ds_map_clear(attributes); - repeat(ds_map_size(attr)) { - ds_map_add_list(attributes, k, ds_list_clone(attr[? k])); - k = ds_map_find_next(attr, k); - } + if(ds_map_exists(attr, "mesh")) + attributes[? "mesh"] = json_parse(attr[? "mesh"]); } } \ No newline at end of file diff --git a/scripts/node_rigid_override/node_rigid_override.gml b/scripts/node_rigid_override/node_rigid_override.gml index 487d26344..cdab15373 100644 --- a/scripts/node_rigid_override/node_rigid_override.gml +++ b/scripts/node_rigid_override/node_rigid_override.gml @@ -58,7 +58,7 @@ function Node_Rigid_Override(_x, _y, _group = noone) : Node(_x, _y, _group) cons } if(is_array(_rot) && array_length(_rot) > i) - obj.phy_rotation = _rot[i]; + obj.image_angle = _rot[i]; if(is_array(_col) && array_length(_col) > i) obj.image_blend = _col[i]; diff --git a/scripts/node_rigid_render/node_rigid_render.gml b/scripts/node_rigid_render/node_rigid_render.gml index d375142f5..13e360b79 100644 --- a/scripts/node_rigid_render/node_rigid_render.gml +++ b/scripts/node_rigid_render/node_rigid_render.gml @@ -73,40 +73,47 @@ function Node_Rigid_Render(_x, _y, _group = noone) : Node(_x, _y, _group) constr surface_set_target(_outSurf); DRAW_CLEAR - for( var i = input_fix_len; i < ds_list_size(inputs) - 1; i++ ) { - var objNode = inputs[| i].getValue(); - if(!is_array(objNode)) objNode = [ objNode ]; - - for( var j = 0; j < array_length(objNode); j++ ) { - if(!variable_struct_exists(objNode[j], "object")) continue; - var obj = objNode[j].object; - - if(!is_array(obj)) obj = [ obj ]; - - for( var k = 0; k < array_length(obj); k++ ) { - var _o = obj[k]; - if(_o == noone || !instance_exists(_o)) continue; - if(is_undefined(_o.phy_active)) continue; - - var ixs = max(0, _o.image_xscale); - var iys = max(0, _o.image_yscale); - var xs = max(0, _o.xscale); - var ys = max(0, _o.yscale); - - var xx = lerp(_o.phy_com_x, _o.phy_position_x, xs); - var yy = lerp(_o.phy_com_y, _o.phy_position_y, ys); - - draw_surface_ext_safe(_o.surface, xx, yy, ixs * xs, iys * ys, _o.image_angle, _o.image_blend, _o.image_alpha); - } - } - } - if(TESTING && keyboard_check(ord("D"))) { var flag = phy_debug_render_shapes | phy_debug_render_coms; draw_set_color(c_white); physics_world_draw_debug(flag); + } else { + for( var i = input_fix_len; i < ds_list_size(inputs) - 1; i++ ) { + var objNode = inputs[| i].getValue(); + if(!is_array(objNode)) objNode = [ objNode ]; + + for( var j = 0; j < array_length(objNode); j++ ) { + if(!variable_struct_exists(objNode[j], "object")) continue; + var obj = objNode[j].object; + + if(!is_array(obj)) obj = [ obj ]; + + for( var k = 0; k < array_length(obj); k++ ) { + var _o = obj[k]; + if(_o == noone || !instance_exists(_o)) continue; + if(is_undefined(_o.phy_active)) continue; + + var ixs = max(0, _o.xscale); + var iys = max(0, _o.yscale); + + var xx = _o.phy_position_x; + var yy = _o.phy_position_y; + + draw_surface_ext_safe(_o.surface, xx, yy, ixs, iys, _o.image_angle, _o.image_blend, _o.image_alpha); + + //draw_set_color(c_red); + //draw_circle(_o.phy_com_x, _o.phy_com_y, 2, false); + + //draw_set_color(c_blue); + //draw_circle(_o.phy_position_x, _o.phy_position_y, 2, false); + } + } + } } + draw_set_color(c_white); + physics_draw_debug(); + surface_reset_target(); cacheCurrentFrame(_outSurf); } diff --git a/scripts/node_rigid_variable/node_rigid_variable.gml b/scripts/node_rigid_variable/node_rigid_variable.gml index 06d44ac3f..fab0dc8a0 100644 --- a/scripts/node_rigid_variable/node_rigid_variable.gml +++ b/scripts/node_rigid_variable/node_rigid_variable.gml @@ -62,7 +62,7 @@ function Node_Rigid_Variable(_x, _y, _group = noone) : Node(_x, _y, _group) cons if(_get[0]) _val[0][i] = [ obj.x, obj.y ]; if(_get[1]) _val[1][i] = [ obj.xscale, obj.yscale ]; - if(_get[2]) _val[2][i] = [ obj.phy_rotation ]; + if(_get[2]) _val[2][i] = [ obj.image_angle ]; if(_get[3]) _val[3][i] = [ obj.image_blend ]; if(_get[4]) _val[4][i] = [ obj.image_alpha ]; if(_get[5]) _val[5][i] = [ obj.phy_linear_velocity_x, obj.phy_linear_velocity_y ]; diff --git a/scripts/panel_animation/panel_animation.gml b/scripts/panel_animation/panel_animation.gml index 88ca7abe0..0050b87e0 100644 --- a/scripts/panel_animation/panel_animation.gml +++ b/scripts/panel_animation/panel_animation.gml @@ -952,9 +952,17 @@ function Panel_Animation() : PanelContent() constructor { } else draw_sprite_ui_uniform(THEME.arrow, _node.anim_show? 3 : 0, ui(10), _node_y, 1, COLORS._main_icon, 0.75); - draw_set_color(node_ordering == _node? COLORS._main_text_accent : COLORS._main_text_sub); - draw_set_alpha(aa); - draw_text(ui(20), _node_y - ui(2), _node.name); + var nodeName = "[" + _node.name + "] "; + var tw = string_width(nodeName); + + draw_set_color(node_ordering == _node? COLORS._main_text_accent : COLORS._main_text); + + draw_set_alpha(0.4); + draw_text(ui(20), _node_y - ui(2), nodeName); + + draw_set_alpha(0.9); + draw_text(ui(20) + tw, _node_y - ui(2), _node.display_name); + draw_set_alpha(1); if(!_node.anim_show) { diff --git a/scripts/panel_collection/panel_collection.gml b/scripts/panel_collection/panel_collection.gml index d3ff74e85..32cb1fc00 100644 --- a/scripts/panel_collection/panel_collection.gml +++ b/scripts/panel_collection/panel_collection.gml @@ -208,7 +208,7 @@ function Panel_Collection() : PanelContent() constructor { draw_sprite_ui_uniform(THEME.steam_creator, 0, _boxx + grid_size - ui(8), yy + ui(12), 1, COLORS._main_icon_dark, 1); } - if(meta.version < SAVEFILE_VERSION) { + if(meta.version != SAVEFILE_VERSION) { draw_set_color(COLORS._main_accent); draw_circle(_boxx + grid_size - ui(8), yy + grid_size - ui(8), 3, false); } diff --git a/scripts/panel_function/panel_function.gml b/scripts/panel_function/panel_function.gml index fabe06d15..926c846ef 100644 --- a/scripts/panel_function/panel_function.gml +++ b/scripts/panel_function/panel_function.gml @@ -123,7 +123,7 @@ globalvar CURRENT_PANEL; panelObjectInit(); - if(!directory_exists(DIRECTORY + "layouts")) + //if(!directory_exists(DIRECTORY + "layouts")) zip_unzip("data/layouts.zip", DIRECTORY); var file = DIRECTORY + "layouts/" + PREF_MAP[? "panel_layout_file"] + ".json"; diff --git a/scripts/panel_graph/panel_graph.gml b/scripts/panel_graph/panel_graph.gml index 1aa28941a..8fc37689f 100644 --- a/scripts/panel_graph/panel_graph.gml +++ b/scripts/panel_graph/panel_graph.gml @@ -1030,7 +1030,7 @@ function Panel_Graph() : PanelContent() constructor { if(ds_list_empty(nodes_select_list)) return; if(ds_list_size(nodes_select_list) != 2) return; - var cx = 0; + var cx = nodes_select_list[| 0].x; var cy = 0; for(var i = 0; i < ds_list_size(nodes_select_list); i++) { var _node = nodes_select_list[| i]; @@ -1057,7 +1057,7 @@ function Panel_Graph() : PanelContent() constructor { function doCompose() { if(ds_list_empty(nodes_select_list)) return; - var cx = -99999; + var cx = nodes_select_list[| 0].x; var cy = 0; for(var i = 0; i < ds_list_size(nodes_select_list); i++) { @@ -1084,7 +1084,7 @@ function Panel_Graph() : PanelContent() constructor { function doArray() { if(ds_list_empty(nodes_select_list)) return; - var cx = -99999; + var cx = nodes_select_list[| 0].x; var cy = 0; for(var i = 0; i < ds_list_size(nodes_select_list); i++) { diff --git a/scripts/preset_data/preset_data.gml b/scripts/preset_data/preset_data.gml index 2cc72521e..495120675 100644 --- a/scripts/preset_data/preset_data.gml +++ b/scripts/preset_data/preset_data.gml @@ -11,11 +11,11 @@ var _l = root + "/version"; var _preset_path = "data/Preset.zip"; if(file_exists(_preset_path)) { - if(file_exists(_l)) { - var res = json_load_struct(_l); - if(!is_struct(res) || !struct_has(res, "version") || res.version < VERSION) - zip_unzip(_preset_path, root); - } else + //if(file_exists(_l)) { + // var res = json_load_struct(_l); + // if(!is_struct(res) || !struct_has(res, "version") || res.version != VERSION) + // zip_unzip(_preset_path, root); + //} else zip_unzip(_preset_path, root); } json_save_struct(_l, { version: VERSION }); diff --git a/scripts/sprite_loader/sprite_loader.gml b/scripts/sprite_loader/sprite_loader.gml index aa8188e2d..5644f6260 100644 --- a/scripts/sprite_loader/sprite_loader.gml +++ b/scripts/sprite_loader/sprite_loader.gml @@ -6,7 +6,7 @@ function __initTheme() { var _l = root + "/version"; if(file_exists(_l)) { var res = json_load_struct(_l); - if(res.version >= THEME_VERSION) return; + if(res.version == THEME_VERSION) return; } json_save_struct(_l, { version: THEME_VERSION }); diff --git a/scripts/surface_functions/surface_functions.gml b/scripts/surface_functions/surface_functions.gml index 8048ffa69..e46cbcd30 100644 --- a/scripts/surface_functions/surface_functions.gml +++ b/scripts/surface_functions/surface_functions.gml @@ -45,6 +45,12 @@ function draw_surface_part_ext_safe(surface, _l, _t, _w, _h, _x, _y, _xs = 1, _y function surface_save_safe(surface, path) { if(!is_surface(surface)) return; var f = surface_get_format(surface); + + if(f == surface_rgba8unorm) { + surface_save(surface, path); + return; + } + var w = surface_get_width(surface); var h = surface_get_height(surface); var s = surface_create(w, h, surface_rgba8unorm); diff --git a/shaders/sh_draw_normal/sh_draw_normal.fsh b/shaders/sh_draw_normal/sh_draw_normal.fsh index 7e85b25b3..2ed5d395c 100644 --- a/shaders/sh_draw_normal/sh_draw_normal.fsh +++ b/shaders/sh_draw_normal/sh_draw_normal.fsh @@ -6,10 +6,5 @@ varying vec4 v_vColour; void main() { vec4 basecolor = texture2D( gm_BaseTexture, v_vTexcoord ); - vec4 blendcolor = v_vColour; - - basecolor.rgb *= v_vColour.rgb; - basecolor.a = v_vColour.a; - - gl_FragColor = basecolor; + gl_FragColor = basecolor * v_vColour; }