Disable animation control while exporting.

This commit is contained in:
Tanasart 2023-11-03 20:43:28 +07:00
parent a344c06035
commit 09eeea9a03
30 changed files with 289 additions and 261 deletions

Binary file not shown.

View file

@ -128,7 +128,7 @@ draw_sprite_ext(s_noti_icon_error, 0, 18, 18, 0.5, 0.5, 0, c_white, 1);
if(point_in_rectangle(mouse_mx, mouse_my, bx0, by0, bx0 + bw, by0 + bh)) { if(point_in_rectangle(mouse_mx, mouse_my, bx0, by0, bx0 + bw, by0 + bh)) {
if(mouse_check_button_pressed(mb_left)) { if(mouse_check_button_pressed(mb_left)) {
var path = executable_get_pathname(); var path = executable_get_pathname();
shell_execute(path, "--crashed"); shell_execute_async(path, "--crashed");
} }
if(mouse_check_button(mb_left)) if(mouse_check_button(mb_left))

View file

@ -46,7 +46,7 @@ if !ready exit;
if(buttonInstant(THEME.button_hide, bx, by, ui(28), ui(28), mouse_ui, sFOCUS, sHOVER, __txtx("color_selector_open_palette", "Open palette folder"), THEME.folder) == 2) { if(buttonInstant(THEME.button_hide, bx, by, ui(28), ui(28), mouse_ui, sFOCUS, sHOVER, __txtx("color_selector_open_palette", "Open palette folder"), THEME.folder) == 2) {
var _realpath = environment_get_variable("LOCALAPPDATA") + "/Pixels_Composer/Palettes"; var _realpath = environment_get_variable("LOCALAPPDATA") + "/Pixels_Composer/Palettes";
var _windir = environment_get_variable("WINDIR") + "/explorer.exe"; var _windir = environment_get_variable("WINDIR") + "/explorer.exe";
shell_execute(_windir, _realpath); shell_execute_async(_windir, _realpath);
} }
bx -= ui(32); bx -= ui(32);

View file

@ -45,7 +45,7 @@ draw_set_alpha(1);
if(directory_exists(_o)) { if(directory_exists(_o)) {
var shell = "/E /I " + _o + " " + _n; var shell = "/E /I " + _o + " " + _n;
shell_execute("Xcopy", shell); shell_execute_async("Xcopy", shell);
} }
} }
instance_destroy(); instance_destroy();

View file

@ -63,7 +63,7 @@ event_inherited();
} }
function onDestroy() { function onDestroy() {
if(!content) return; if(content == noone) return;
content.onClose(); content.onClose();
} }

View file

@ -53,7 +53,7 @@ if !ready exit;
var b = buttonInstant(THEME.button, bx0, by0, bw, bh, mouse_ui, sFOCUS, sHOVER); var b = buttonInstant(THEME.button, bx0, by0, bw, bh, mouse_ui, sFOCUS, sHOVER);
draw_text(bx0 + bw / 2, by0 + bh / 2, __txtx("run", "Run")); draw_text(bx0 + bw / 2, by0 + bh / 2, __txtx("run", "Run"));
if(b == 2) { if(b == 2) {
shell_execute(prog, cmd); shell_execute_async(prog, cmd);
node.trusted = true; node.trusted = true;
instance_destroy(); instance_destroy();

View file

@ -91,10 +91,10 @@
environment_set_variable("IMGUI_DIALOG_WIDTH", string(800)); environment_set_variable("IMGUI_DIALOG_WIDTH", string(800));
var cmd = ".pxc=\"" + string(program_directory) + "PixelComposer.exe\""; var cmd = ".pxc=\"" + string(program_directory) + "PixelComposer.exe\"";
shell_execute("assoc", cmd); shell_execute_async("assoc", cmd);
var cmd = ".pxcc=\"" + string(program_directory) + "PixelComposer.exe\""; var cmd = ".pxcc=\"" + string(program_directory) + "PixelComposer.exe\"";
shell_execute("assoc", cmd); shell_execute_async("assoc", cmd);
//print($"Setup time: {(current_time - t)/1000}s"); //print($"Setup time: {(current_time - t)/1000}s");
#endregion #endregion

View file

@ -18,7 +18,7 @@ if(string(ev_id) == string(STEAM_UGC_ITEM_ID) && ev_type == "ugc_create_item") {
} }
steam_ugc_set_item_tags(STEAM_UGC_UPDATE_HANDLE, tgs); steam_ugc_set_item_tags(STEAM_UGC_UPDATE_HANDLE, tgs);
steam_ugc_set_item_preview(STEAM_UGC_UPDATE_HANDLE, "steamUGCthumbnail.png"); steam_ugc_set_item_preview(STEAM_UGC_UPDATE_HANDLE, TEMPDIR + "steamUGCthumbnail.png");
steam_ugc_set_item_content(STEAM_UGC_UPDATE_HANDLE, "steamUGC"); steam_ugc_set_item_content(STEAM_UGC_UPDATE_HANDLE, "steamUGC");
STEAM_UGC_SUBMIT_ID = steam_ugc_submit_item_update(STEAM_UGC_UPDATE_HANDLE, "Initial upload"); STEAM_UGC_SUBMIT_ID = steam_ugc_submit_item_update(STEAM_UGC_UPDATE_HANDLE, "Initial upload");
@ -30,7 +30,7 @@ if(string(ev_id) == string(STEAM_UGC_SUBMIT_ID)) {
var type = ""; var type = "";
switch(STEAM_UGC_TYPE) { switch(STEAM_UGC_TYPE) {
case STEAM_UGC_FILE_TYPE.collection : type = "Collection"; break; case STEAM_UGC_FILE_TYPE.collection : type = "Collection"; break;
case STEAM_UGC_FILE_TYPE.project : type = "Project"; break; case STEAM_UGC_FILE_TYPE.project : type = "Project"; break;
case STEAM_UGC_FILE_TYPE.node_preset : type = "Node preset"; break; case STEAM_UGC_FILE_TYPE.node_preset : type = "Node preset"; break;
} }

View file

@ -95,7 +95,7 @@ _HOVERING_ELEMENT = noone;
_k = ds_map_find_next(PROJECT.nodeMap, _k); _k = ds_map_find_next(PROJECT.nodeMap, _k);
} }
if(PROJECT.animator.is_playing || PROJECT.animator.rendering) { if(IS_PLAYING || RENDERING) {
if(PROJECT.animator.frame_progress) { if(PROJECT.animator.frame_progress) {
__addon_preAnim(); __addon_preAnim();

View file

@ -37,7 +37,7 @@ function addonPanel(_addon, pane) : PanelContent() constructor {
var runResult = lua_call(_addon.thread, drawFn); var runResult = lua_call(_addon.thread, drawFn);
} }
function onClose() { static onClose = function() {
if(closeFn == "") return; if(closeFn == "") return;
if(!_addon.ready) return; if(!_addon.ready) return;
var runResult = lua_call(_addon.thread, closeFn); var runResult = lua_call(_addon.thread, closeFn);

View file

@ -10,6 +10,7 @@
#macro IS_PLAYING PROJECT.animator.is_playing #macro IS_PLAYING PROJECT.animator.is_playing
#macro CURRENT_FRAME PROJECT.animator.current_frame #macro CURRENT_FRAME PROJECT.animator.current_frame
#macro TOTAL_FRAMES PROJECT.animator.frames_total #macro TOTAL_FRAMES PROJECT.animator.frames_total
#macro RENDERING PROJECT.animator.rendering
#endregion #endregion
#region animation class #region animation class
@ -23,8 +24,8 @@
frame_progress = false; frame_progress = false;
play_freeze = 0; play_freeze = 0;
rendering = false; rendering = 0;
playback = ANIMATOR_END.loop; playback = ANIMATOR_END.loop;
static setFrame = function(frame, resetTime = true) { static setFrame = function(frame, resetTime = true) {
//if(frame == 0) resetAnimation(); //if(frame == 0) resetAnimation();
@ -37,8 +38,6 @@
if(current_frame == frames_total) { if(current_frame == frames_total) {
if(rendering) { if(rendering) {
is_playing = false; is_playing = false;
rendering = false;
setFrame(0); setFrame(0);
} else if(playback == ANIMATOR_END.stop) } else if(playback == ANIMATOR_END.stop)
is_playing = false; is_playing = false;

View file

@ -5,8 +5,11 @@ function __Node_Cache(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
attributes.cache_group = []; attributes.cache_group = [];
cache_group_members = []; cache_group_members = [];
group_vertex = []; group_vertex = [];
vertex_hash = ""; group_dragging = false;
group_adding = false;
group_alpha = 0;
vertex_hash = "";
insp1UpdateTooltip = "Generate cache group"; insp1UpdateTooltip = "Generate cache group";
insp1UpdateIcon = [ THEME.cache_group, 0, COLORS._main_icon ]; insp1UpdateIcon = [ THEME.cache_group, 0, COLORS._main_icon ];
@ -47,8 +50,7 @@ function __Node_Cache(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
} #endregion } #endregion
static getCacheGroup = function(node) { #region static getCacheGroup = function(node) { #region
if(node != self) if(node != self) array_push(attributes.cache_group, node.node_id);
array_push(attributes.cache_group, node.node_id);
for( var i = 0, n = ds_list_size(node.inputs); i < n; i++ ) { for( var i = 0, n = ds_list_size(node.inputs); i < n; i++ ) {
var _from = node.inputs[| i].value_from; var _from = node.inputs[| i].value_from;
@ -71,29 +73,32 @@ function __Node_Cache(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
static ccw = function(a, b, c) { return (b[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (b[1] - a[1]); } static ccw = function(a, b, c) { return (b[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (b[1] - a[1]); }
static getNodeBorder = function(_i, _vertex, _node) { #region static getNodeBorder = function(_i, _vertex, _node) { #region
var _rad = 8; var _rad = 4;
var _stp = 15; var _stp = 15;
var _nx0 = _node.x - 32 + _rad; var _nx0 = _node.x - 32 + _rad;
var _ny0 = _node.y - 32 + _rad; var _ny0 = _node.y - 32 + _rad;
var _nx1 = _node.x + _node.w + 32 - _rad; var _nx1 = _node.x + (_node == self? _node.w / 2 : _node.w + 32 - _rad);
var _ny1 = _node.y + _node.h + 32 - _rad; var _ny1 = _node.y + _node.h + 32 - _rad;
var _ind = 0; var _ind = 0;
for( var i = 0; i <= 90; i += _stp ) for( var i = 0; i <= 90; i += _stp ) _vertex[_i * 7 * 4 + _ind++] = [ _nx1 + lengthdir_x(_rad, i), _ny0 + lengthdir_y(_rad, i) ];
_vertex[_i * 7 * 4 + _ind++] = [ _nx1 + lengthdir_x(_rad, i), _ny0 + lengthdir_y(_rad, i) ]; for( var i = 90; i <= 180; i += _stp ) _vertex[_i * 7 * 4 + _ind++] = [ _nx0 + lengthdir_x(_rad, i), _ny0 + lengthdir_y(_rad, i) ];
for( var i = 180; i <= 270; i += _stp ) _vertex[_i * 7 * 4 + _ind++] = [ _nx0 + lengthdir_x(_rad, i), _ny1 + lengthdir_y(_rad, i) ];
for( var i = 90; i <= 180; i += _stp ) for( var i = 270; i <= 360; i += _stp ) _vertex[_i * 7 * 4 + _ind++] = [ _nx1 + lengthdir_x(_rad, i), _ny1 + lengthdir_y(_rad, i) ];
_vertex[_i * 7 * 4 + _ind++] = [ _nx0 + lengthdir_x(_rad, i), _ny0 + lengthdir_y(_rad, i) ];
for( var i = 180; i <= 270; i += _stp )
_vertex[_i * 7 * 4 + _ind++] = [ _nx0 + lengthdir_x(_rad, i), _ny1 + lengthdir_y(_rad, i) ];
for( var i = 270; i <= 360; i += _stp )
_vertex[_i * 7 * 4 + _ind++] = [ _nx1 + lengthdir_x(_rad, i), _ny1 + lengthdir_y(_rad, i) ];
} #endregion } #endregion
static refrshGroupBG = function() { #region static refreshGroupBG = function() { #region
var _hash = "";
for( var i = -1, n = array_length(cache_group_members); i < n; i++ ) {
var _node = i == -1? self : cache_group_members[i];
_hash += $"{_node.x},{_node.y},{_node.w},{_node.h}|";
}
_hash = md5_string_utf8(_hash);
if(vertex_hash == _hash) return;
vertex_hash = _hash;
group_vertex = []; group_vertex = [];
if(array_empty(cache_group_members)) return; if(array_empty(cache_group_members)) return;
@ -138,22 +143,60 @@ function __Node_Cache(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
} }
} #endregion } #endregion
static drawNodeBG = function(_x, _y, _mx, _my, _s) { #region static groupCheck = function(_x, _y, _s, _mx, _my) { #region
var _hash = ""; if(array_length(group_vertex) < 3) return;
for( var i = -1, n = array_length(cache_group_members); i < n; i++ ) { var _inGroup = true;
var _node = i == -1? self : cache_group_members[i]; var _m = [ _mx / _s - _x, _my / _s - _y ];
_hash += $"{_node.x},{_node.y},{_node.w},{_node.h}|";
group_adding = false;
if(PANEL_GRAPH.node_dragging && key_mod_press(SHIFT)) {
var side = undefined;
for( var i = 1, n = array_length(group_vertex); i < n; i++ ) {
var a = group_vertex[i - 1];
var b = group_vertex[i - 0];
var _side = sign(ccw(a, b, _m));
if(side == undefined) side = _side;
else if(side != _side) _inGroup = false;
}
var _list = PANEL_GRAPH.nodes_selecting;
if(_inGroup) {
group_adding = true;
for( var i = 0, n = array_length(_list); i < n; i++ )
array_push_unique(attributes.cache_group, _list[i].node_id);
} else {
for( var i = 0, n = array_length(_list); i < n; i++ )
array_remove(attributes.cache_group, _list[i].node_id);
}
if(!group_dragging) {
for( var i = 0, n = array_length(_list); i < n; i++ )
array_remove(attributes.cache_group, _list[i].node_id);
refreshCacheGroup();
refreshGroupBG();
}
group_dragging = true;
} }
_hash = md5_string_utf8(_hash);
if(vertex_hash != _hash) refrshGroupBG();
vertex_hash = _hash;
if(group_dragging && mouse_release(mb_left)) {
refreshCacheGroup();
refreshGroupBG();
group_dragging = false;
}
} #endregion
static drawNodeBG = function(_x, _y, _mx, _my, _s) { #region
refreshGroupBG();
if(array_length(group_vertex) < 3) return; if(array_length(group_vertex) < 3) return;
var _color = getColor(); var _color = getColor();
draw_set_color(_color); draw_set_color(_color);
draw_set_alpha(0.025); group_alpha = lerp_float(group_alpha, group_adding, 4);
draw_set_alpha(0.025 + 0.025 * group_alpha);
draw_primitive_begin(pr_trianglelist); draw_primitive_begin(pr_trianglelist);
var a = group_vertex[0]; var a = group_vertex[0];
var b = group_vertex[1]; var b = group_vertex[1];

View file

@ -169,10 +169,12 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
preview_alpha = 1; preview_alpha = 1;
preview_x = 0; preview_x = 0;
preview_y = 0; preview_y = 0;
preview_mx = 0; preview_mx = 0;
preview_my = 0; preview_my = 0;
graph_preview_alpha = 1;
getPreviewingNode = noone; getPreviewingNode = noone;
#endregion #endregion
@ -1078,7 +1080,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
var bbox = drawGetBbox(xx, yy, _s); var bbox = drawGetBbox(xx, yy, _s);
var aa = 0.5 + 0.5 * renderActive; var aa = 0.5 + 0.5 * renderActive;
draw_surface_bbox(preview_surface, bbox, c_white, aa); draw_surface_bbox(preview_surface, bbox, c_white, aa * graph_preview_alpha);
} #endregion } #endregion
static getNodeDimension = function(showFormat = true) { #region static getNodeDimension = function(showFormat = true) { #region

View file

@ -1,4 +1,4 @@
function Node_create_Export(_x, _y, _group = noone) { function Node_create_Export(_x, _y, _group = noone) { #region
var path = ""; var path = "";
if(!LOADING && !APPENDING && !CLONING) { if(!LOADING && !APPENDING && !CLONING) {
path = get_save_filename(@"Portable Network Graphics (.png)|*.png| path = get_save_filename(@"Portable Network Graphics (.png)|*.png|
@ -20,9 +20,9 @@ MPEG-4 (.mp4)|*.mp4",
} }
function exportAll() { function exportAll() {
PROJECT.animator.rendering = true; if(RENDERING) return;
Render(); Render();
PROJECT.animator.rendering = false;
var key = ds_map_find_first(PROJECT.nodeMap); var key = ds_map_find_first(PROJECT.nodeMap);
repeat(ds_map_size(PROJECT.nodeMap)) { repeat(ds_map_size(PROJECT.nodeMap)) {
@ -34,7 +34,7 @@ function exportAll() {
node.doInspectorAction(); node.doInspectorAction();
} }
} } #endregion
enum NODE_EXPORT_FORMAT { enum NODE_EXPORT_FORMAT {
single, single,
@ -207,6 +207,10 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
["Quality", false], 6, 7, 10, 13, ["Quality", false], 6, 7, 10, 13,
]; ];
render_process_id = undefined;
render_type = "";
render_target = "";
directory = TEMPDIR + string(irandom_range(100000, 999999)); directory = TEMPDIR + string(irandom_range(100000, 999999));
converter = filepath_resolve(PREFERENCES.ImageMagick_path) + "convert.exe"; converter = filepath_resolve(PREFERENCES.ImageMagick_path) + "convert.exe";
magick = filepath_resolve(PREFERENCES.ImageMagick_path) + "magick.exe"; magick = filepath_resolve(PREFERENCES.ImageMagick_path) + "magick.exe";
@ -283,13 +287,13 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
var frames = []; var frames = [];
while(_path != "") { while(_path != "") {
var _frame = "\"" + temp_path + string_replace_all(_path, ".png", "") + ".webp\""; var _frame = string_quote(temp_path + string_replace_all(_path, ".png", "") + ".webp");
var _pathTemp = "\"" + temp_path + _path + "\""; var _pathTemp = string_quote(temp_path + _path);
var shell_cmd = _pathTemp + " -define webp:lossless=true " + _frame; var shell_cmd = _pathTemp + " -define webp:lossless=true " + _frame;
array_push(frames, _frame); array_push(frames, _frame);
shell_execute(magick, shell_cmd, self); shell_execute_async(magick, shell_cmd, self);
_path = file_find_next(); _path = file_find_next();
} }
@ -297,22 +301,17 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
if(rate == 0) rate = 1; if(rate == 0) rate = 1;
var framerate = round(1 / rate * 1000); var framerate = round(1 / rate * 1000);
var cmd = ""; var cmd = "";
for( var i = 0, n = array_length(frames); i < n; i++ ) for( var i = 0, n = array_length(frames); i < n; i++ )
cmd += "-frame " + frames[i] + " +" + string(framerate) + "+0+0+1 "; cmd += "-frame " + frames[i] + " +" + string(framerate) + "+0+0+1 ";
cmd += "-bgcolor 0,0,0,0 "; cmd += "-bgcolor 0,0,0,0 ";
cmd += "-o \"" + target_path + "\""; cmd += "-o " + string_quote(target_path);
shell_execute(webp, cmd, self); render_process_id = shell_execute_async(webp, cmd, self);
render_type = "webp";
var noti = log_message("EXPORT", "Export webp as " + target_path, THEME.noti_icon_tick, COLORS._main_value_positive, false); render_target = target_path;
noti.path = filename_dir(target_path);
noti.setOnClick(function() { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer);
PANEL_MENU.setNotiIcon(THEME.noti_icon_tick);
} #endregion } #endregion
static renderGif = function(temp_path, target_path) { #region static renderGif = function(temp_path, target_path) { #region
@ -329,25 +328,21 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
var use_gifski = false; var use_gifski = false;
if(use_gifski) { if(use_gifski) {
var shell_cmd = $"-o {target_path} -r {rate} --repeat {loop_str} -Q {qual} "; var shell_cmd = $"-o {string_quote(target_path)} -r {rate} --repeat {loop_str} -Q {qual} {string_quote(temp_path)}";
shell_cmd += temp_path;
//print($"{gifski} {shell_cmd}"); //print($"{gifski} {shell_cmd}");
shell_execute(gifski, shell_cmd, self); render_process_id = shell_execute_async(gifski, shell_cmd, self);
} else { } else {
var shell_cmd = $"-delay {framerate} -alpha set -dispose previous -loop {loop_str}"; var shell_cmd = $"-delay {framerate} -alpha set -dispose previous -loop {loop_str}";
if(opti) shell_cmd += $" -fuzz {fuzz * 100}% -layers OptimizeFrame -layers OptimizeTransparency"; if(opti) shell_cmd += $" -fuzz {fuzz * 100}% -layers OptimizeFrame -layers OptimizeTransparency";
shell_cmd += " " + temp_path + " " + target_path; shell_cmd += $" {string_quote(temp_path)} {string_quote(target_path)}";
//print($"{converter} {shell_cmd}"); //print($"{converter} {shell_cmd}");
shell_execute(converter, shell_cmd, self); render_process_id = shell_execute_async(converter, shell_cmd, self);
} }
var noti = log_message("EXPORT", "Export gif as " + target_path, THEME.noti_icon_tick, COLORS._main_value_positive, false); render_type = "gif";
noti.path = filename_dir(target_path); render_target = target_path;
noti.setOnClick(function() { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer);
PANEL_MENU.setNotiIcon(THEME.noti_icon_tick);
} #endregion } #endregion
static renderMp4 = function(temp_path, target_path) { #region static renderMp4 = function(temp_path, target_path) { #region
@ -359,15 +354,12 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
temp_path = string_replace_all(temp_path, "/", "\\"); temp_path = string_replace_all(temp_path, "/", "\\");
target_path = string_replace_all(target_path, "/", "\\"); target_path = string_replace_all(target_path, "/", "\\");
var shell_cmd = $"-hide_banner -loglevel quiet -framerate {rate} -i {temp_path}%05d.png -c:v libx264 -r {rate} -pix_fmt yuv420p {target_path}"; var shell_cmd = $"-hide_banner -loglevel quiet -framerate {rate} -i \"{temp_path}%05d.png\" -c:v libx264 -r {rate} -pix_fmt yuv420p {string_quote(target_path)}";
print($"{ffmpeg} {shell_cmd}")
shell_execute_async(ffmpeg, shell_cmd, self); render_process_id = shell_execute_async(ffmpeg, shell_cmd, self);
render_type = "mp4";
var noti = log_message("EXPORT", "Export mp4 as " + target_path, THEME.noti_icon_tick, COLORS._main_value_positive, false); render_target = target_path;
noti.path = filename_dir(target_path);
noti.setOnClick(function() { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer);
PANEL_MENU.setNotiIcon(THEME.noti_icon_tick);
} #endregion } #endregion
static pathString = function(path, index = 0, _array = false) { #region static pathString = function(path, index = 0, _array = false) { #region
@ -494,14 +486,14 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
case 0 : case 0 :
surface_save_safe(_surf, _pathTemp); surface_save_safe(_surf, _pathTemp);
var shell_cmd = $"convert \"{_pathTemp}\" \"{_pathOut}\""; var shell_cmd = $"convert {string_quote(_pathTemp)} {string_quote(_pathOut)}";
shell_execute(magick, shell_cmd, self); shell_execute_async(magick, shell_cmd, self);
break; break;
case 1 : case 1 :
surface_save_safe(_surf, _pathTemp); surface_save_safe(_surf, _pathTemp);
var shell_cmd = $"convert {_pathTemp} PNG8:\"{_pathOut}\""; var shell_cmd = $"convert {string_quote(_pathTemp)} PNG8:{string_quote(_pathOut)}";
shell_execute(magick, shell_cmd, self); shell_execute_async(magick, shell_cmd, self);
break; break;
case 2 : case 2 :
surface_save_safe(_surf, _pathOut); surface_save_safe(_surf, _pathOut);
@ -513,18 +505,18 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
surface_save_safe(_surf, _pathTemp); surface_save_safe(_surf, _pathTemp);
_pathOut = $"\"{string_replace_all(_path, ".png", "")}.jpg\""; _pathOut = $"\"{string_replace_all(_path, ".png", "")}.jpg\"";
var shell_cmd = $"\"{_pathTemp}\" -quality {qual} {_pathOut}"; var shell_cmd = $"{string_quote(_pathTemp)} -quality {qual} {string_quote(_pathOut)}";
shell_execute(magick, shell_cmd, self); shell_execute_async(magick, shell_cmd, self);
break; break;
case ".webp": case ".webp":
surface_save_safe(_surf, _pathTemp); surface_save_safe(_surf, _pathTemp);
_pathOut = $"\"{string_replace_all(_path, ".png", "")}.webp\""; _pathOut = $"\"{string_replace_all(_path, ".png", "")}.webp\"";
var shell_cmd = $"\"{_pathTemp}\" -quality {qual} -define webp:lossless=true {_pathOut}"; var shell_cmd = $"{string_quote(_pathTemp)} -quality {qual} -define webp:lossless=true {string_quote(_pathOut)}";
shell_execute(magick, shell_cmd, self); shell_execute_async(magick, shell_cmd, self);
break; break;
} }
@ -611,7 +603,7 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
switch(extd) { switch(extd) {
case 0 : case 0 :
target_path = string_replace(target_path, ".png", ".gif"); target_path = string_replace(target_path, ".png", ".gif");
renderGif(string_quote(temp_path), string_quote(target_path)); renderGif(temp_path, target_path);
break; break;
case 1 : case 1 :
target_path = string_replace(target_path, ".png", ".webp"); target_path = string_replace(target_path, ".png", ".webp");
@ -629,7 +621,7 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
switch(extd) { switch(extd) {
case 0 : case 0 :
target_path = string_replace(target_path, ".png", ".gif"); target_path = string_replace(target_path, ".png", ".gif");
renderGif(string_quote(directory + "/*.png"), string_quote(target_path)); renderGif(directory + "/*.png", target_path);
break; break;
case 1 : case 1 :
target_path = string_replace(target_path, ".png", ".webp"); target_path = string_replace(target_path, ".png", ".webp");
@ -652,11 +644,16 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
insp2UpdateIcon = [ THEME.play_all, 0, COLORS._main_value_positive ]; insp2UpdateIcon = [ THEME.play_all, 0, COLORS._main_value_positive ];
static onInspector1Update = function() { #region static onInspector1Update = function() { #region
if(RENDERING) return;
if(isInLoop()) RENDER_ALL if(isInLoop()) RENDER_ALL
else doInspectorAction(); else doInspectorAction();
} #endregion } #endregion
static onInspector2Update = function() { exportAll(); } static onInspector2Update = function() {
if(RENDERING) return;
exportAll();
}
static doInspectorAction = function() { #region static doInspectorAction = function() { #region
if(LOADING || APPENDING) return; if(LOADING || APPENDING) return;
@ -666,9 +663,9 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
var form = getInputData(3); var form = getInputData(3);
if(form == NODE_EXPORT_FORMAT.single) { if(form == NODE_EXPORT_FORMAT.single) {
PROJECT.animator.rendering = true; RENDERING++;
Render(); Render();
PROJECT.animator.rendering = false; RENDERING--;
export(); export();
updatedOutTrigger.setValue(true); updatedOutTrigger.setValue(true);
@ -679,8 +676,8 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
played = 0; played = 0;
PROJECT.animator.real_frame = -1; PROJECT.animator.real_frame = -1;
CURRENT_FRAME = -1; CURRENT_FRAME = -1;
PROJECT.animator.is_playing = true; IS_PLAYING = true;
PROJECT.animator.rendering = true; RENDERING++;
if(directory_exists(directory)) if(directory_exists(directory))
directory_destroy(directory); directory_destroy(directory);
@ -688,6 +685,9 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
} #endregion } #endregion
static step = function() { #region static step = function() { #region
insp1UpdateIcon[2] = RENDERING? COLORS._main_icon_dark : COLORS._main_value_positive;
insp2UpdateIcon[2] = RENDERING? COLORS._main_icon_dark : COLORS._main_value_positive;
var surf = getInputData( 0); var surf = getInputData( 0);
var pngf = getInputData(13); var pngf = getInputData(13);
@ -725,6 +725,19 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
} }
outputs[| 0].visible = isInLoop(); outputs[| 0].visible = isInLoop();
if(render_process_id != undefined) {
var res = ProcIdExists(render_process_id);
if(res == 0) {
var noti = log_message("EXPORT", $"Export {render_type} as {render_target}", THEME.noti_icon_tick, COLORS._main_value_positive, false);
noti.path = filename_dir(render_target);
noti.setOnClick(function() { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer);
PANEL_MENU.setNotiIcon(THEME.noti_icon_tick);
render_process_id = undefined;
RENDERING--;
}
}
} #endregion } #endregion
static update = function(frame = CURRENT_FRAME) { #region static update = function(frame = CURRENT_FRAME) { #region
@ -748,5 +761,13 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
renderCompleted(); renderCompleted();
} #endregion } #endregion
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region
graph_preview_alpha = 1;
if(render_process_id != undefined) {
graph_preview_alpha = 0.5;
draw_sprite_ui(THEME.loading, 0, xx + w * _s / 2, yy + h * _s / 2, _s, _s, current_time / 2, COLORS._main_icon, 1);
}
} #endregion
static doApplyDeserialize = function() { onValueUpdate(3); } static doApplyDeserialize = function() { onValueUpdate(3); }
} }

View file

@ -4,17 +4,17 @@ function Node_Frame(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "Frame"; name = "Frame";
w = 240; w = 240;
h = 160; h = 160;
alpha = 1; alpha = 1;
bg_spr = THEME.node_frame_bg; bg_spr = THEME.node_frame_bg;
size_dragging = false; size_dragging = false;
size_dragging_w = w; size_dragging_w = w;
size_dragging_h = h; size_dragging_h = h;
size_dragging_mx = w; size_dragging_mx = w;
size_dragging_my = h; size_dragging_my = h;
auto_height = false; auto_height = false;
name_hover = false; name_hover = false;
hover_progress = 0; hover_progress = 0;
color = c_white; color = c_white;
@ -41,11 +41,11 @@ function Node_Frame(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
.setDisplay(VALUE_DISPLAY.slider) .setDisplay(VALUE_DISPLAY.slider)
.rejectArray(); .rejectArray();
static onValueUpdate = function(index = 3) { static onValueUpdate = function(index = 3) { #region
global.__FRAME_LABEL_SCALE = getInputData(3); global.__FRAME_LABEL_SCALE = getInputData(3);
} } #endregion
static step = function() { static step = function() { #region
var si = getInputData(0); var si = getInputData(0);
w = si[0]; w = si[0];
h = si[1]; h = si[1];
@ -54,9 +54,9 @@ function Node_Frame(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
alpha = getInputData(2); alpha = getInputData(2);
scale = getInputData(3); scale = getInputData(3);
label_color = getInputData(4); label_color = getInputData(4);
} } #endregion
static drawNodeBase = function(xx, yy, _s) { static drawNodeBase = function(xx, yy, _s) { #region
draw_sprite_stretched_ext(bg_spr, 0, xx, yy, w * _s, h * _s, color, alpha); draw_sprite_stretched_ext(bg_spr, 0, xx, yy, w * _s, h * _s, color, alpha);
var txt = display_name == ""? name : display_name; var txt = display_name == ""? name : display_name;
@ -66,10 +66,10 @@ function Node_Frame(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
draw_set_alpha(clamp(alpha + name_hover * 0.5, 0, 1)); draw_set_alpha(clamp(alpha + name_hover * 0.5, 0, 1));
draw_text_cut(xx + 8 + 16 * hover_progress, yy + 4 * _s, txt, (w - 8) * _s - 24, scale); draw_text_cut(xx + 8 + 16 * hover_progress, yy + 4 * _s, txt, (w - 8) * _s - 24, scale);
draw_set_alpha(1); draw_set_alpha(1);
} } #endregion
draw_scale = 1; draw_scale = 1;
static drawNodeBG = function(_x, _y, _mx, _my, _s) { static drawNodeBG = function(_x, _y, _mx, _my, _s) { #region
draw_scale = _s; draw_scale = _s;
if(size_dragging) { if(size_dragging) {
@ -119,9 +119,9 @@ function Node_Frame(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
} }
} }
return noone; return noone;
} } #endregion
static pointIn = function(_x, _y, _mx, _my, _s) { static pointIn = function(_x, _y, _mx, _my, _s) { #region
var xx = x * _s + _x; var xx = x * _s + _x;
var yy = y * _s + _y; var yy = y * _s + _y;
@ -134,5 +134,5 @@ function Node_Frame(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name_hover = hover; name_hover = hover;
return hover; return hover;
} } #endregion
} }

View file

@ -21,7 +21,7 @@ function Node_IsoSurf(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
drag_sv = 0; drag_sv = 0;
drag_sa = 0; drag_sa = 0;
angle_renderer = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus) { angle_renderer = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus) { #region
var hh = ui(240); var hh = ui(240);
var _surfs = getInputData(1); var _surfs = getInputData(1);
var _angle = getInputData(3); var _angle = getInputData(3);
@ -86,7 +86,7 @@ function Node_IsoSurf(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
} }
return hh; return hh;
}); }); #endregion
input_display_list = [ input_display_list = [
["Iso", false], 0, 2, angle_renderer, ["Iso", false], 0, 2, angle_renderer,

View file

@ -145,7 +145,7 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio
addNodeObject(itere, "Index", s_node_iterator_index, "Node_Iterator_Index", [1, Node_Iterator_Index]).hideRecent(); addNodeObject(itere, "Index", s_node_iterator_index, "Node_Iterator_Index", [1, Node_Iterator_Index]).hideRecent();
addNodeObject(itere, "Array Length", s_node_iterator_length, "Node_Iterator_Each_Length", [1, Node_Iterator_Each_Length]).hideRecent(); addNodeObject(itere, "Array Length", s_node_iterator_length, "Node_Iterator_Each_Length", [1, Node_Iterator_Each_Length]).hideRecent();
#endregion #endregion
var filter = ds_list_create(); #region var filter = ds_list_create(); #region
addNodeCatagory("Filter", filter, ["Node_Iterate_Filter"]); addNodeCatagory("Filter", filter, ["Node_Iterate_Filter"]);
ds_list_add(filter, "Groups"); ds_list_add(filter, "Groups");

View file

@ -87,7 +87,7 @@ function Node_Render_Sprite_Sheet(_x, _y, _group = noone) : Node(_x, _y, _group)
if(grup != SPRITE_ANIM_GROUP.animation) { if(grup != SPRITE_ANIM_GROUP.animation) {
initRender(); initRender();
return; return;
} else if(PROJECT.animator.rendering && PROJECT.animator.frame_progress && CURRENT_FRAME == 0 && !refreshSurface) { } else if(RENDERING && PROJECT.animator.frame_progress && CURRENT_FRAME == 0 && !refreshSurface) {
var skip = getInputData(2); var skip = getInputData(2);
var arr = is_array(inpt); var arr = is_array(inpt);

View file

@ -81,24 +81,24 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
scatter_data = []; scatter_data = [];
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
if(process_amount > 1) return; if(process_amount > 1) return;
var _distType = current_data[6]; var _distType = current_data[6];
if(_distType < 3) if(_distType < 3)
inputs[| 5].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny); inputs[| 5].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
} } #endregion
static onValueUpdate = function(index) { static onValueUpdate = function(index) { #region
if(index == 15) { if(index == 15) {
var _arr = getInputData(15); var _arr = getInputData(15);
inputs[| 0].array_depth = _arr; inputs[| 0].array_depth = _arr;
update(); update();
} }
} } #endregion
static step = function() { static step = function() { #region
var _dis = getInputData(6); var _dis = getInputData(6);
var _arr = getInputData(15); var _arr = getInputData(15);
inputs[| 0].array_depth = _arr; inputs[| 0].array_depth = _arr;
@ -111,9 +111,9 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
inputs[| 20].setVisible(_dis == 4); inputs[| 20].setVisible(_dis == 4);
inputs[| 21].setVisible(_dis == 4); inputs[| 21].setVisible(_dis == 4);
inputs[| 22].setVisible(_dis == 4); inputs[| 22].setVisible(_dis == 4);
} } #endregion
static processData = function(_outSurf, _data, _output_index, _array_index) { static processData = function(_outSurf, _data, _output_index, _array_index) { #region
if(_output_index == 1) return scatter_data; if(_output_index == 1) return scatter_data;
if(_output_index == 0 && _array_index == 0) scatter_data = []; if(_output_index == 0 && _array_index == 0) scatter_data = [];
@ -287,12 +287,12 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
surface_reset_target(); surface_reset_target();
return _outSurf; return _outSurf;
} } #endregion
static doApplyDeserialize = function() { static doApplyDeserialize = function() { #region
var _arr = getInputData(15); var _arr = getInputData(15);
inputs[| 0].array_depth = _arr; inputs[| 0].array_depth = _arr;
doUpdate(); doUpdate();
} } #endregion
} }

View file

@ -26,7 +26,7 @@ function Node_Shell(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
if(_pro == "" || _scr == "") return; if(_pro == "" || _scr == "") return;
if(trusted) { if(trusted) {
shell_execute(_pro, _scr); shell_execute_async(_pro, _scr);
} else { } else {
var dia = dialogCall(o_dialog_run_shell); var dia = dialogCall(o_dialog_run_shell);
dia.setData(self, _pro, _scr); dia.setData(self, _pro, _scr);

View file

@ -1979,15 +1979,6 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
} #endregion } #endregion
static drawJunction = function(_s, _mx, _my, sca = 1) { #region static drawJunction = function(_s, _mx, _my, sca = 1) { #region
if(!isVisible()) return false;
var ss = max(0.25, _s / 2);
var hov = PANEL_GRAPH.pHOVER && (PANEL_GRAPH.node_hovering == noone || PANEL_GRAPH.node_hovering == node);
var is_hover = hov && point_in_circle(_mx, _my, x, y, 10 * _s * sca);
var _bgS = THEME.node_junctions_bg;
var _fgS = is_hover? THEME.node_junctions_outline_hover : THEME.node_junctions_outline;
var _bgC, _fgC; var _bgC, _fgC;
if(color == -1) { if(color == -1) {
@ -1998,13 +1989,22 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
_fgC = color; _fgC = color;
} }
color_display = type == VALUE_TYPE.action? #8fde5d : _fgC;
if(!isVisible()) return false;
var ss = max(0.25, _s / 2);
var hov = PANEL_GRAPH.pHOVER && (PANEL_GRAPH.node_hovering == noone || PANEL_GRAPH.node_hovering == node);
var is_hover = hov && point_in_circle(_mx, _my, x, y, 10 * _s * sca);
var _bgS = THEME.node_junctions_bg;
var _fgS = is_hover? THEME.node_junctions_outline_hover : THEME.node_junctions_outline;
if(type == VALUE_TYPE.action) { if(type == VALUE_TYPE.action) {
draw_sprite_ext(THEME.node_junction_inspector, is_hover, x, y, ss, ss, 0, c_white, 1); draw_sprite_ext(THEME.node_junction_inspector, is_hover, x, y, ss, ss, 0, c_white, 1);
color_display = #8fde5d;
} else { } else {
draw_sprite_ext(_bgS, draw_junction_index, x, y, ss, ss, 0, _bgC, 1); draw_sprite_ext(_bgS, draw_junction_index, x, y, ss, ss, 0, _bgC, 1);
draw_sprite_ext(_fgS, draw_junction_index, x, y, ss, ss, 0, _fgC, 1); draw_sprite_ext(_fgS, draw_junction_index, x, y, ss, ss, 0, _fgC, 1);
color_display = _fgC;
} }
return is_hover; return is_hover;

View file

@ -132,53 +132,54 @@ function Panel_Animation() : PanelContent() constructor {
#region ++++ control_buttons ++++ #region ++++ control_buttons ++++
control_buttons = [ control_buttons = [
[ function() { return __txt("Stop"); }, [
function() { return __txt("Stop"); },
function() { return 4; }, function() { return 4; },
function() { return PROJECT.animator.is_playing? COLORS._main_accent : COLORS._main_icon; }, function() { if(RENDERING) return COLORS._main_icon_dark; return PROJECT.animator.is_playing? COLORS._main_accent : COLORS._main_icon; },
function() { PROJECT.animator.stop(); } ], function() { if(RENDERING) return; PROJECT.animator.stop(); }
[ function() { return PROJECT.animator.is_playing? __txt("Pause") : __txt("Play"); }, ],
[
function() { return PROJECT.animator.is_playing? __txt("Pause") : __txt("Play"); },
function() { return !PROJECT.animator.is_playing; }, function() { return !PROJECT.animator.is_playing; },
function() { return PROJECT.animator.is_playing? COLORS._main_accent : COLORS._main_icon; }, function() { if(RENDERING) return COLORS._main_icon_dark; return PROJECT.animator.is_playing? COLORS._main_accent : COLORS._main_icon; },
function() { function() { if(RENDERING) return; if(PROJECT.animator.is_playing) PROJECT.animator.pause(); else PROJECT.animator.resume(); }
if(PROJECT.animator.is_playing) PROJECT.animator.pause(); ],
else PROJECT.animator.resume(); [
} ], function() { return __txtx("panel_animation_go_to_first_frame", "Go to first frame"); },
[ function() { return __txtx("panel_animation_go_to_first_frame", "Go to first frame"); },
function() { return 3; }, function() { return 3; },
function() { return COLORS._main_icon; }, function() { if(RENDERING) return COLORS._main_icon_dark; return COLORS._main_icon; },
function() { PROJECT.animator.setFrame(0); } function() { if(RENDERING) return; PROJECT.animator.setFrame(0); }
], ],
[ function() { return __txtx("panel_animation_go_to_last_frame", "Go to last frame"); }, [
function() { return __txtx("panel_animation_go_to_last_frame", "Go to last frame"); },
function() { return 2; }, function() { return 2; },
function() { return COLORS._main_icon; }, function() { if(RENDERING) return COLORS._main_icon_dark; return COLORS._main_icon; },
function() { PROJECT.animator.setFrame(TOTAL_FRAMES - 1); } function() { if(RENDERING) return; PROJECT.animator.setFrame(TOTAL_FRAMES - 1); }
], ],
[ function() { return __txtx("panel_animation_previous_frame", "Previous frame"); }, [
function() { return __txtx("panel_animation_previous_frame", "Previous frame"); },
function() { return 5; }, function() { return 5; },
function() { return COLORS._main_icon; }, function() { if(RENDERING) return COLORS._main_icon_dark; return COLORS._main_icon; },
function() { PROJECT.animator.setFrame(PROJECT.animator.real_frame - 1); } function() { if(RENDERING) return; PROJECT.animator.setFrame(PROJECT.animator.real_frame - 1); }
], ],
[ function() { return __txtx("panel_animation_next_frame", "Next frame"); }, [
function() { return __txtx("panel_animation_next_frame", "Next frame"); },
function() { return 6; }, function() { return 6; },
function() { return COLORS._main_icon; }, function() { if(RENDERING) return COLORS._main_icon_dark; return COLORS._main_icon; },
function() { PROJECT.animator.setFrame(PROJECT.animator.real_frame + 1); } function() { if(RENDERING) return; PROJECT.animator.setFrame(PROJECT.animator.real_frame + 1); }
], ],
]; ];
#endregion #endregion
#region ++++ hotkeys ++++ #region ++++ hotkeys ++++
addHotkey("", "Play/Pause", vk_space, MOD_KEY.none, function() { if(PROJECT.animator.is_playing) PROJECT.animator.pause() else PROJECT.animator.play(); }); addHotkey("", "Play/Pause", vk_space, MOD_KEY.none, function() { if(RENDERING) return; if(IS_PLAYING) PROJECT.animator.pause() else PROJECT.animator.play(); });
addHotkey("", "Resume/Pause", vk_space, MOD_KEY.shift,function() { if(RENDERING) return; if(PROJECT.animator.is_playing) PROJECT.animator.pause() else PROJECT.animator.resume(); });
addHotkey("", "Resume/Pause", vk_space, MOD_KEY.shift, function() { if(PROJECT.animator.is_playing) PROJECT.animator.pause() else PROJECT.animator.resume(); }); addHotkey("", "First frame", vk_home, MOD_KEY.none, function() { if(RENDERING) return; PROJECT.animator.setFrame(0); });
addHotkey("", "Last frame", vk_end, MOD_KEY.none, function() { if(RENDERING) return; PROJECT.animator.setFrame(TOTAL_FRAMES - 1); });
addHotkey("", "Next frame", vk_right, MOD_KEY.none, function() { if(RENDERING) return; PROJECT.animator.setFrame(min(PROJECT.animator.real_frame + 1, TOTAL_FRAMES - 1)); });
addHotkey("", "Previous frame", vk_left, MOD_KEY.none, function() { if(RENDERING) return; PROJECT.animator.setFrame(max(PROJECT.animator.real_frame - 1, 0)); });
addHotkey("", "First frame", vk_home, MOD_KEY.none, function() { PROJECT.animator.setFrame(0); });
addHotkey("", "Last frame", vk_end, MOD_KEY.none, function() { PROJECT.animator.setFrame(TOTAL_FRAMES - 1); });
addHotkey("", "Next frame", vk_right, MOD_KEY.none, function() {
PROJECT.animator.setFrame(min(PROJECT.animator.real_frame + 1, TOTAL_FRAMES - 1));
});
addHotkey("", "Previous frame", vk_left, MOD_KEY.none, function() {
PROJECT.animator.setFrame(max(PROJECT.animator.real_frame - 1, 0));
});
addHotkey("Animation", "Delete keys", vk_delete, MOD_KEY.none, function() { PANEL_ANIMATION.deleteKeys(); }); addHotkey("Animation", "Delete keys", vk_delete, MOD_KEY.none, function() { PANEL_ANIMATION.deleteKeys(); });
addHotkey("Animation", "Duplicate", "D", MOD_KEY.ctrl, function() { PANEL_ANIMATION.doDuplicate(); }); addHotkey("Animation", "Duplicate", "D", MOD_KEY.ctrl, function() { PANEL_ANIMATION.doDuplicate(); });
addHotkey("Animation", "Copy", "C", MOD_KEY.ctrl, function() { PANEL_ANIMATION.doCopy(); }); addHotkey("Animation", "Copy", "C", MOD_KEY.ctrl, function() { PANEL_ANIMATION.doCopy(); });

View file

@ -924,7 +924,7 @@ function PanelContent() constructor {
static checkClosable = function() { return true; } static checkClosable = function() { return true; }
function onClose() {} static onClose = function() {}
} }
function setFocus(target, fstring = noone) { function setFocus(target, fstring = noone) {

View file

@ -70,7 +70,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
node_drag_oy = 0; node_drag_oy = 0;
selection_block = 0; selection_block = 0;
nodes_selecting = []; nodes_selecting = [];
nodes_select_drag = false; nodes_select_drag = false;
nodes_select_mx = 0; nodes_select_mx = 0;
nodes_select_my = 0; nodes_select_my = 0;
@ -125,10 +125,10 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
toolbar_height = ui(40); toolbar_height = ui(40);
function toCenterNode() { #region function toCenterNode(_list = nodes_list) { #region
if(!project.active) return; if(!project.active) return;
if(ds_list_empty(nodes_list)) { if(ds_list_empty(_list)) {
graph_x = round(w / 2 / graph_s); graph_x = round(w / 2 / graph_s);
graph_y = round(h / 2 / graph_s); graph_y = round(h / 2 / graph_s);
return; return;
@ -139,8 +139,8 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
var miny = 99999; var miny = 99999;
var maxy = -99999; var maxy = -99999;
for(var i = 0; i < ds_list_size(nodes_list); i++) { for(var i = 0; i < ds_list_size(_list); i++) {
var _node = nodes_list[| i]; var _node = _list[| i];
if(!is_struct(_node) || !is_instanceof(_node, Node) || !_node.active) if(!is_struct(_node) || !is_instanceof(_node, Node) || !_node.active)
continue; continue;
@ -156,8 +156,6 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
graph_x = round(graph_x); graph_x = round(graph_x);
graph_y = round(graph_y); graph_y = round(graph_y);
//print(title + ": Center " + string(graph_x) + ", " + string(graph_y));
} #endregion } #endregion
function initSize() { toCenterNode(); } initSize(); function initSize() { toCenterNode(); } initSize();
@ -549,29 +547,14 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
} }
nodes_selecting = [ _node ]; nodes_selecting = [ _node ];
fullView();
var cx = _node.x + _node.w / 2;
var cy = _node.y + _node.h / 2;
graph_x = w / 2 / graph_s - cx;
graph_y = (h - toolbar_height) / 2 / graph_s - cy;
graph_x = round(graph_x);
graph_y = round(graph_y);
} #endregion } #endregion
function fullView() { #region function fullView() { #region
var _node = getFocusingNode(); gml_pragma("forceinline");
if(_node == noone) { var _l = ds_list_create_from_array(nodes_selecting);
toCenterNode(); toCenterNode(array_empty(nodes_selecting)? nodes_list : _l);
return; ds_list_destroy(_l);
}
graph_x = -(_node.x + _node.w / 2) + w / 2 / graph_s;
graph_y = -(_node.y + _node.h / 2) + h / 2 / graph_s;
graph_x = round(graph_x);
graph_y = round(graph_y);
} #endregion } #endregion
function dragGraph() { #region function dragGraph() { #region
@ -815,7 +798,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
var _y = (_node.y + graph_y) * graph_s; var _y = (_node.y + graph_y) * graph_s;
var _w = _node.w * graph_s; var _w = _node.w * graph_s;
var _h = _node.h * graph_s; var _h = _node.h * graph_s;
if(rectangle_inside_rectangle(fx0, fy0, fx1, fy1, _x, _y, _x + _w, _y + _h)) if(rectangle_inside_rectangle(fx0, fy0, fx1, fy1, _x, _y, _x + _w, _y + _h))
array_push(nodes_selecting, _node); array_push(nodes_selecting, _node);
} }
@ -834,7 +817,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
break; break;
} }
if(!hover_selected) if(!hover_selected)
nodes_selecting = []; nodes_selecting = [ node_hovering ];
} }
array_foreach(nodes_selecting, function(node) { bringNodeToFront(node); }); array_foreach(nodes_selecting, function(node) { bringNodeToFront(node); });
@ -991,24 +974,10 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
if(mouse_press(mb_left)) if(mouse_press(mb_left))
node_dragging = noone; node_dragging = noone;
for(var i = 0; i < ds_list_size(nodes_list); i++)
nodes_list[| i].groupCheck(gr_x, gr_y, graph_s, mx, my);
if(node_dragging && !key_mod_press(ALT)) { if(node_dragging && !key_mod_press(ALT)) {
if(key_mod_press(SHIFT)) { ////////////// Group dragging
for(var i = 0; i < ds_list_size(nodes_list); i++) {
var _node = nodes_list[| i];
_node.groupCheck(gr_x, gr_y, graph_s, mx, my);
}
if(node_dragging && node_dragging.cache_group != noone)
node_dragging.cache_group.removeNode(node_dragging);
for(var i = 0; i < array_length(nodes_selecting); i++) {
var _node = nodes_selecting[i];
if(_node.cache_group != noone)
_node.cache_group.removeNode(_node);
}
}
var nx = node_drag_sx + (mouse_graph_x - node_drag_mx); var nx = node_drag_sx + (mouse_graph_x - node_drag_mx);
var ny = node_drag_sy + (mouse_graph_y - node_drag_my); var ny = node_drag_sy + (mouse_graph_y - node_drag_my);
@ -1862,7 +1831,8 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
} #endregion } #endregion
function doDelete(_merge = false) { #region function doDelete(_merge = false) { #region
array_foreach(nodes_selecting, function(node) { if(node.manual_deletable) nodeDelete(node, _merge); }); __temp_merge = _merge;
array_foreach(nodes_selecting, function(node) { if(node.manual_deletable) nodeDelete(node, __temp_merge); });
nodes_selecting = []; nodes_selecting = [];
} #endregion } #endregion

View file

@ -502,21 +502,11 @@ function Panel_Preview() : PanelContent() constructor {
} #endregion } #endregion
function fullView() { #region function fullView() { #region
var node = getNodePreview(); var bbox = noone;
if(node == noone) {
canvas_s = 1;
canvas_x = w / 2;
canvas_y = (h - toolbar_height * 2) / 2;
return;
}
var bbox = node.getPreviewBoundingBox(); var node = getNodePreview();
if(bbox == noone) { if(node != noone) bbox = node.getPreviewBoundingBox();
canvas_s = 1; if(bbox == noone) bbox = BBOX().fromWH(0, 0, PROJECT.attributes.surface_dimension[0], PROJECT.attributes.surface_dimension[1]);
canvas_x = w / 2;
canvas_y = (h - toolbar_height * 2) / 2;
return;
}
var ss = min((w - 32 - tool_side_drawing * 40) / bbox.w, (h - 32 - toolbar_height * 2) / bbox.h); var ss = min((w - 32 - tool_side_drawing * 40) / bbox.w, (h - 32 - toolbar_height * 2) / bbox.h);
canvas_s = ss; canvas_s = ss;
@ -768,7 +758,7 @@ function Panel_Preview() : PanelContent() constructor {
function draw3D() { #region function draw3D() { #region
var _prev_node = getNodePreview(); var _prev_node = getNodePreview();
if(_prev_node == noone) return; if(_prev_node == noone) return;
if(!_prev_node.is_3D) return; if(!_prev_node.is_3D) return
_prev_node.previewing = 1; _prev_node.previewing = 1;
@ -1435,7 +1425,7 @@ function Panel_Preview() : PanelContent() constructor {
dragCanvas(); dragCanvas();
drawNodePreview(); drawNodePreview();
} }
} } else dragCanvas();
drawPreviewOverlay(); drawPreviewOverlay();

View file

@ -6,9 +6,10 @@ function Panel_Test() : PanelContent() constructor {
test_dir = "D:\\Project\\MakhamDev\\LTS-PixelComposer\\TEST"; test_dir = "D:\\Project\\MakhamDev\\LTS-PixelComposer\\TEST";
tb_test_dir = new textBox(TEXTBOX_INPUT.text, function(txt) { test_dir = txt; }); tb_test_dir = new textBox(TEXTBOX_INPUT.text, function(txt) { test_dir = txt; });
testing = false; testing = false;
test_files = []; test_files = [];
test_index = 0; start_index = 0;
test_index = start_index;
test_button_surface = surface_create(1, 1); test_button_surface = surface_create(1, 1);
@ -40,20 +41,20 @@ function Panel_Test() : PanelContent() constructor {
if(testing) return; if(testing) return;
testing = true; testing = true;
test_index = 0; test_index = start_index;
test_files = []; test_files = [];
scanDir(test_dir); scanDir(test_dir);
for( var i = 0, n = array_length(test_files); i < n; i++ ) { for( var i = start_index, n = array_length(test_files); i < n; i++ ) {
run_in(1 + i * 3, function(i) { run_in(1 + (i - start_index) * 3, function(i) {
try { try {
print($"TESTING: {test_files[i]}"); show_debug_message($"TESTING {i}/{array_length(test_files)}: {test_files[i]}");
TEST_PATH(test_files[i]); TEST_PATH(test_files[i]);
test_index = i; test_index = i;
print($" > Test complete"); show_debug_message($" > Test complete");
} catch(e) { } catch(e) {
print($" > Test failed"); show_debug_message($" > Test failed");
exception_print(e); exception_print(e);
} }
}, [i]); }, [i]);

View file

@ -1,33 +1,35 @@
function shellOpenExplorer(path) { function shellOpenExplorer(path) {
var _windir = environment_get_variable("WINDIR") + "/explorer.exe"; var _windir = environment_get_variable("WINDIR") + "/explorer.exe";
path = string_replace_all(path, "/", "\\"); path = string_replace_all(path, "/", "\\");
shell_execute(_windir, path); shell_execute_async(_windir, path);
} }
function shell_execute(path, command, ref = noone) { function shell_execute(path, command, ref = noone) {
gml_pragma("forceinline"); gml_pragma("forceinline");
var txt = $"{path} {command}"; var txt = $"{path} {command}";
if(global.PROC_ID == 0) noti_status(txt, THEME.noti_icon_console,, ref);
try { try {
var res = execute_shell(path, command); var res = ProcessExecute(txt);
if(global.PROC_ID == 0) noti_status("Execute shell complete", THEME.noti_icon_console,, ref); //if(global.PROC_ID == 0) noti_status("Execute shell complete", THEME.noti_icon_console,, ref);
} catch(e) { } catch(e) {
if(global.PROC_ID == 0) noti_warning($"Execute shell failed: {e}", THEME.noti_icon_console_failed, COLORS._main_value_negative, ref); //if(global.PROC_ID == 0) noti_warning($"Execute shell failed: {e}", THEME.noti_icon_console_failed, ref);
} }
return res;
} }
function shell_execute_async(path, command, ref = noone) { function shell_execute_async(path, command, ref = noone) {
gml_pragma("forceinline"); gml_pragma("forceinline");
var txt = $"{path} {command}"; var txt = $"{path} {command}";
if(global.PROC_ID == 0) noti_status(txt, THEME.noti_icon_console,, ref);
try { try {
var res = ProcessExecuteAsync(txt); var res = ProcessExecuteAsync(txt);
if(global.PROC_ID == 0) noti_status("Execute shell complete", THEME.noti_icon_console,, ref); //if(global.PROC_ID == 0) noti_status("Execute shell complete", THEME.noti_icon_console,, ref);
} catch(e) { } catch(e) {
if(global.PROC_ID == 0) noti_warning($"Execute shell failed: {e}", THEME.noti_icon_console_failed, COLORS._main_value_negative, ref); //if(global.PROC_ID == 0) noti_warning($"Execute shell failed: {e}", THEME.noti_icon_console_failed, ref);
} }
return res;
} }

View file

@ -46,7 +46,7 @@ function steam_ugc_update_collection(file, update_preview = false, update_note =
STEAM_UGC_SUBMIT_ID = steam_ugc_submit_item_update(STEAM_UGC_UPDATE_HANDLE, update_note); STEAM_UGC_SUBMIT_ID = steam_ugc_submit_item_update(STEAM_UGC_UPDATE_HANDLE, update_note);
} }
function steam_ugc_collection_generate(file, dest_path = DIRECTORY + "steamUGCthumbnail.png") { function steam_ugc_collection_generate(file, dest_path = TEMPDIR + "steamUGCthumbnail.png") {
file_delete(dest_path); file_delete(dest_path);
var spr = STEAM_UGC_ITEM_FILE.getSpr(); var spr = STEAM_UGC_ITEM_FILE.getSpr();
var prev_size = 512; var prev_size = 512;

View file

@ -18,8 +18,6 @@ function steam_ugc_create_project() {
var preview_surface = PANEL_PREVIEW.getNodePreviewSurface(); var preview_surface = PANEL_PREVIEW.getNodePreviewSurface();
surface_save_safe(preview_surface, DIRECTORY + "steamUGC/thumbnail.png"); surface_save_safe(preview_surface, DIRECTORY + "steamUGC/thumbnail.png");
print(filename_dir(DIRECTORY + "steamUGCthumbnail.png"))
STEAM_UGC_ITEM_ID = steam_ugc_create_item(STEAM_APP_ID, ugc_filetype_community); STEAM_UGC_ITEM_ID = steam_ugc_create_item(STEAM_APP_ID, ugc_filetype_community);
} }
@ -53,7 +51,7 @@ function steam_ugc_update_project(update_preview = false, update_note = "Updated
STEAM_UGC_SUBMIT_ID = steam_ugc_submit_item_update(STEAM_UGC_UPDATE_HANDLE, update_note); STEAM_UGC_SUBMIT_ID = steam_ugc_submit_item_update(STEAM_UGC_UPDATE_HANDLE, update_note);
} }
function steam_ugc_project_generate(dest_path = DIRECTORY + "steamUGCthumbnail.png") { function steam_ugc_project_generate(dest_path = TEMPDIR + "steamUGCthumbnail.png") {
file_delete(dest_path); file_delete(dest_path);
var preview_surface = PANEL_PREVIEW.getNodePreviewSurface(); var preview_surface = PANEL_PREVIEW.getNodePreviewSurface();

View file

@ -9,7 +9,7 @@ function draw_surface_safe(surface, _x = 0, _y = 0) {
} else if(is_instanceof(surface, SurfaceAtlas)) } else if(is_instanceof(surface, SurfaceAtlas))
surface = surface.getSurface(); surface = surface.getSurface();
} }
if(!is_surface(surface)) return; if(!surface_exists(surface)) return;
__channel_pre(surface); __channel_pre(surface);
draw_surface(surface, _x, _y); draw_surface(surface, _x, _y);
@ -26,7 +26,7 @@ function draw_surface_stretched_safe(surface, _x, _y, _w, _h) {
} else if(is_instanceof(surface, SurfaceAtlas)) } else if(is_instanceof(surface, SurfaceAtlas))
surface = surface.getSurface(); surface = surface.getSurface();
} }
if(!is_surface(surface)) return; if(!surface_exists(surface)) return;
__channel_pre(surface); __channel_pre(surface);
draw_surface_stretched(surface, _x, _y, _w, _h); draw_surface_stretched(surface, _x, _y, _w, _h);
@ -43,7 +43,8 @@ function draw_surface_ext_safe(surface, _x, _y, _xs = 1, _ys = 1, _rot = 0, _col
} else if(is_instanceof(surface, SurfaceAtlas)) } else if(is_instanceof(surface, SurfaceAtlas))
surface = surface.getSurface(); surface = surface.getSurface();
} }
if(!is_surface(surface)) return;
if(!surface_exists(surface)) return;
__channel_pre(surface); __channel_pre(surface);
draw_surface_ext(surface, _x, _y, _xs, _ys, _rot, _col, _alpha); draw_surface_ext(surface, _x, _y, _xs, _ys, _rot, _col, _alpha);
@ -60,7 +61,7 @@ function draw_surface_tiled_safe(surface, _x, _y) {
} else if(is_instanceof(surface, SurfaceAtlas)) } else if(is_instanceof(surface, SurfaceAtlas))
surface = surface.getSurface(); surface = surface.getSurface();
} }
if(!is_surface(surface)) return; if(!surface_exists(surface)) return;
__channel_pre(surface); __channel_pre(surface);
draw_surface_tiled(surface, _x, _y); draw_surface_tiled(surface, _x, _y);
@ -77,7 +78,7 @@ function draw_surface_tiled_ext_safe(surface, _x, _y, _xs = 1, _ys = 1, _col = c
} else if(is_instanceof(surface, SurfaceAtlas)) } else if(is_instanceof(surface, SurfaceAtlas))
surface = surface.getSurface(); surface = surface.getSurface();
} }
if(!is_surface(surface)) return; if(!surface_exists(surface)) return;
__channel_pre(surface); __channel_pre(surface);
draw_surface_tiled_ext(surface, _x, _y, _xs, _ys, _col, _alpha); draw_surface_tiled_ext(surface, _x, _y, _xs, _ys, _col, _alpha);
@ -94,7 +95,7 @@ function draw_surface_part_ext_safe(surface, _l, _t, _w, _h, _x, _y, _xs = 1, _y
} else if(is_instanceof(surface, SurfaceAtlas)) } else if(is_instanceof(surface, SurfaceAtlas))
surface = surface.getSurface(); surface = surface.getSurface();
} }
if(!is_surface(surface)) return; if(!surface_exists(surface)) return;
__channel_pre(surface); __channel_pre(surface);
draw_surface_part_ext(surface, _l, _t, _w, _h, _x, _y, _xs, _ys, _col, _alpha); draw_surface_part_ext(surface, _l, _t, _w, _h, _x, _y, _xs, _ys, _col, _alpha);