diff --git a/PixelComposer.yyp b/PixelComposer.yyp index d1e305ec8..20861181f 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -678,6 +678,7 @@ {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_textbox_code_line.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/widget",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_textbox.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/widget",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_widget_highlight.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/widget",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"meta.json","CopyToMask":-1,"filePath":"datafiles/data/themes/default",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"values.json","CopyToMask":-1,"filePath":"datafiles/data/themes/default",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"tooltip.zip","CopyToMask":3035426170322551022,"filePath":"datafiles/data",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"0 introduction.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, diff --git a/datafiles/data/themes/default.zip b/datafiles/data/themes/default.zip index 3151c6a6c..6a3151fc4 100644 Binary files a/datafiles/data/themes/default.zip and b/datafiles/data/themes/default.zip differ diff --git a/objects/o_dialog_add_node/Create_0.gml b/objects/o_dialog_add_node/Create_0.gml index 2227fdba0..a806448e5 100644 --- a/objects/o_dialog_add_node/Create_0.gml +++ b/objects/o_dialog_add_node/Create_0.gml @@ -193,7 +193,7 @@ event_inherited(); for( var i = 0; i < ds_list_size(_new_list); i++ ) { var _in = _new_list[| i].inputs; for( var j = 0; j < ds_list_size(_in); j++ ) { - if(_in[| j].value_from == noone) + if(_in[| j].isLeaf()) ds_list_add(_inputs, _in[| j]); } diff --git a/objects/o_dialog_preference/Create_0.gml b/objects/o_dialog_preference/Create_0.gml index d55764626..da2b1bfec 100644 --- a/objects/o_dialog_preference/Create_0.gml +++ b/objects/o_dialog_preference/Create_0.gml @@ -384,14 +384,32 @@ event_inherited(); themes = []; var f = file_find_first(DIRECTORY + "themes/*", fa_directory); while(f != "") { - if(directory_exists(DIRECTORY + "themes/" + f)) - array_push(themes, f); + var _path = $"{DIRECTORY}themes/{f}"; + if(directory_exists(_path)) { + var _metaPath = _path + "/meta.json"; + if(!file_exists(_metaPath)) { + var _item = new scrollItem(f, THEME.circle); + _item.spr_blend = COLORS._main_accent; + _item.tooltip = "Theme made for earlier version."; + array_push(themes, _item); + } else { + var _meta = json_load_struct(_metaPath); + var _item = new scrollItem(_meta.name, _meta.version >= VERSION? noone : THEME.circle); + _item.data = f; + _item.spr_blend = COLORS._main_accent; + + if(_meta.version < VERSION) + _item.tooltip = "Theme made for earlier version."; + array_push(themes, _item); + } + } + f = file_find_next(); } file_find_close(); sb_theme = new scrollBox(themes, function(index) { - var thm = themes[index] + var thm = themes[index].data; if(PREF_MAP[? "theme"] == thm) return; PREF_MAP[? "theme"] = thm; PREF_SAVE(); diff --git a/objects/o_dialog_scrollbox/Create_0.gml b/objects/o_dialog_scrollbox/Create_0.gml index ef11233dc..32bd757cc 100644 --- a/objects/o_dialog_scrollbox/Create_0.gml +++ b/objects/o_dialog_scrollbox/Create_0.gml @@ -75,7 +75,11 @@ event_inherited(); var hovering = ""; for(var i = 0; i < array_length(data); i++) { - var txt = data[i]; + var _val = data[i]; + var txt = is_instanceof(_val, scrollItem)? _val.name : _val; + var _spr = is_instanceof(_val, scrollItem) && _val.spr; + var _tol = is_instanceof(_val, scrollItem) && _val.tooltip != ""; + var clickable = !string_starts_with(txt, "-"); if(!clickable) txt = string_delete(txt, 1, 1); @@ -92,23 +96,25 @@ event_inherited(); if(sc_content.hover && point_in_rectangle(_m[0], _m[1], 0, _ly + 1, _dw, _ly + hght - 1)) { selecting = i; hovering = data[i]; + + if(_tol) TOOLTIP = _val.tooltip; } if(selecting == i) { draw_sprite_stretched_ext(THEME.textbox, 3, 0, _ly, _dw, hght, COLORS.dialog_menubox_highlight, 1); if(sc_content.active && (mouse_press(mb_left) || keyboard_check_pressed(vk_enter))) { - initVal = array_find(scrollbox.data, txt); + initVal = array_find(scrollbox.data, _val); instance_destroy(); } } } - + draw_set_text(f_p0, align, fa_center, clickable? COLORS._main_text : COLORS._main_text_sub); - if(align == fa_center) - draw_text_cut(_dw / 2, _ly + hght / 2, txt, _dw); - else if(align == fa_left) - draw_text_cut(ui(8), _ly + hght / 2, txt, _dw); + if(align == fa_center) draw_text_cut(_dw / 2, _ly + hght / 2, txt, _dw); + else if(align == fa_left) draw_text_cut(ui(8) + _spr * hght, _ly + hght / 2, txt, _dw); + + if(_spr) draw_sprite_ext(_val.spr, 0, ui(8) + hght / 2, _ly + hght / 2, 1, 1, 0, _val.spr_blend, 1); _ly += hght; _h += hght; @@ -118,7 +124,7 @@ event_inherited(); UNDO_HOLDING = true; if(hovering != "") scrollbox.onModify(array_find(scrollbox.data, hovering)); - else + else if(initVal > -1) scrollbox.onModify(initVal); UNDO_HOLDING = false; } diff --git a/objects/o_dialog_scrollbox/Destroy_0.gml b/objects/o_dialog_scrollbox/Destroy_0.gml index a3ff85a8e..f9f12dc0c 100644 --- a/objects/o_dialog_scrollbox/Destroy_0.gml +++ b/objects/o_dialog_scrollbox/Destroy_0.gml @@ -1,5 +1,6 @@ /// @description init event_inherited(); -scrollbox.onModify(initVal); +if(initVal > -1) + scrollbox.onModify(initVal); scrollbox.open = false; \ No newline at end of file diff --git a/scripts/__node_module/__node_module.gml b/scripts/__node_module/__node_module.gml index 2d18786b0..114f98cc2 100644 --- a/scripts/__node_module/__node_module.gml +++ b/scripts/__node_module/__node_module.gml @@ -6,6 +6,34 @@ function NodeModule(parent) constructor { load_map = -1; load_scale = false; + static isLeaf = function() { #region + for( var i = 0, n = ds_list_size(inputs); i < n; i++ ) { + var _inp = inputs[| i]; + if(!_inp.isLeaf()) return false; + } + + return true; + } #endregion + + static drawConnections = function(params = {}, _inputs = []) { #region + for(var i = 0; i < ds_list_size(inputs); i++) { + var jun = inputs[| i]; + + if(jun.isLeaf()) continue; + if(!jun.value_from.node.active) continue; + if(!jun.isVisible()) continue; + + if(i >= 0) array_push(_inputs, jun); + } + } #endregion + + static isRendered = function() { #region //Check if every input is ready (updated) + for(var j = 0; j < ds_list_size(inputs); j++) + if(!inputs[| j].isRendered()) return false; + + return true; + } #endregion + static resetCache = function() { #region for( var i = 0; i < ds_list_size(inputs); i++ ) { if(!is_instanceof(inputs[| i], NodeValue)) continue; diff --git a/scripts/_node_fluid_nodes/_node_fluid_nodes.gml b/scripts/_node_fluid_nodes/_node_fluid_nodes.gml index a78168a14..9a81447b0 100644 --- a/scripts/_node_fluid_nodes/_node_fluid_nodes.gml +++ b/scripts/_node_fluid_nodes/_node_fluid_nodes.gml @@ -22,7 +22,7 @@ function Node_Fluid(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { for( var i = 0, n = ds_list_size(inputs); i < n; i++ ) { var _input = inputs[| i]; - if(_input.value_from == noone) continue; + if(_input.isLeaf()) continue; if(!is_instanceof(_input.value_from.node, Node_Fluid)) continue; _input.value_from.node.cachedPropagate(); diff --git a/scripts/d3d_object/d3d_object.gml b/scripts/d3d_object/d3d_object.gml index 9e77719c7..f2eed9cae 100644 --- a/scripts/d3d_object/d3d_object.gml +++ b/scripts/d3d_object/d3d_object.gml @@ -90,7 +90,7 @@ function __3dObject() constructor { static build = function(_buffer = VB, _vertex = vertex, counts = object_counts) { #region if(is_array(_buffer)) { for( var i = 0, n = array_length(_buffer); i < n; i++ ) - vertex_delete_buffer(_buffer[i]) + if(_buffer[i] != noone) vertex_delete_buffer(_buffer[i]) } else if(_buffer != noone) vertex_delete_buffer(_buffer); if(array_empty(_vertex)) return noone; diff --git a/scripts/d3d_terrain/d3d_terrain.gml b/scripts/d3d_terrain/d3d_terrain.gml index efe24f071..9987ad213 100644 --- a/scripts/d3d_terrain/d3d_terrain.gml +++ b/scripts/d3d_terrain/d3d_terrain.gml @@ -1,4 +1,5 @@ function __3dTerrain() : __3dObject() constructor { + VB = [ noone ]; VF = global.VF_POS_NORM_TEX_COL; render_type = pr_trianglelist; @@ -60,8 +61,22 @@ function __3dTerrain() : __3dObject() constructor { var _in = 0; var _vt = vertex[0]; + if(VB[0]) vertex_delete_buffer(VB[0]); + VB[0] = vertex_create_buffer(); + vertex_begin(VB[0], VF); + for( var i = 0; i < subdivision; i++ ) for( var j = 0; j < subdivision; j++ ) { + var u0 = (i + 0) / subdivision; + var u1 = (i + 1) / subdivision; + var v0 = (j + 0) / subdivision; + var v1 = (j + 1) / subdivision; + + var x0 = -0.5 + u0; + var x1 = -0.5 + u1; + var y0 = -0.5 + v0; + var y1 = -0.5 + v1; + var _i0 = j * (subdivision + 1) + i; var _i1 = j * (subdivision + 1) + i + 1; var _i2 = (j + 1) * (subdivision + 1) + i; @@ -72,18 +87,30 @@ function __3dTerrain() : __3dObject() constructor { var _h2 = heights[_i2]; var _h3 = heights[_i3]; - _vt[_in + 0].z = _h0; - _vt[_in + 1].z = _h3; - _vt[_in + 2].z = _h1; + var _n = new __vec3(x1 - x0, y0 - y0, _h1 - _h0) + .cross(new __vec3(x0 - x0, y1 - y0, _h2 - _h0)) + .normalize(); - _vt[_in + 3].z = _h0; - _vt[_in + 4].z = _h2; - _vt[_in + 5].z = _h3; + _vt[_in + 0].z = _h0; _vt[_in + 0].nx = _n.x; _vt[_in + 0].ny = _n.y; _vt[_in + 0].nz = _n.z; + _vt[_in + 1].z = _h3; _vt[_in + 1].nx = _n.x; _vt[_in + 1].ny = _n.y; _vt[_in + 1].nz = _n.z; + _vt[_in + 2].z = _h1; _vt[_in + 2].nx = _n.x; _vt[_in + 2].ny = _n.y; _vt[_in + 2].nz = _n.z; + + _vt[_in + 3].z = _h0; _vt[_in + 3].nx = _n.x; _vt[_in + 3].ny = _n.y; _vt[_in + 3].nz = _n.z; + _vt[_in + 4].z = _h2; _vt[_in + 4].nx = _n.x; _vt[_in + 4].ny = _n.y; _vt[_in + 4].nz = _n.z; + _vt[_in + 5].z = _h3; _vt[_in + 5].nx = _n.x; _vt[_in + 5].ny = _n.y; _vt[_in + 5].nz = _n.z; + + vertex_add_vntc(VB[0], _vt[_in + 0]); + vertex_add_vntc(VB[0], _vt[_in + 1]); + vertex_add_vntc(VB[0], _vt[_in + 2]); + + vertex_add_vntc(VB[0], _vt[_in + 3]); + vertex_add_vntc(VB[0], _vt[_in + 4]); + vertex_add_vntc(VB[0], _vt[_in + 5]); _in += 6; } - VB = build(); + vertex_end(VB[0]); } onParameterUpdate = initModel; diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index 759a2c758..69894f9ba 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -26,10 +26,10 @@ globalvar VERSION, SAVE_VERSION, VERSION_STRING, BUILD_NUMBER; - VERSION = 11553; + VERSION = 11560; SAVE_VERSION = 11550; - VERSION_STRING = "1.15.5.3"; - BUILD_NUMBER = 11553; + VERSION_STRING = "1.15.6"; + BUILD_NUMBER = 11560; globalvar APPEND_MAP; APPEND_MAP = ds_map_create(); diff --git a/scripts/node_3d_mesh_terrain/node_3d_mesh_terrain.gml b/scripts/node_3d_mesh_terrain/node_3d_mesh_terrain.gml index 875857b07..f054420fe 100644 --- a/scripts/node_3d_mesh_terrain/node_3d_mesh_terrain.gml +++ b/scripts/node_3d_mesh_terrain/node_3d_mesh_terrain.gml @@ -57,11 +57,12 @@ function Node_3D_Mesh_Terrain(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _gr array_copy(_h, 0, _hia, 0, min(array_length(_h), array_length(_hia))); } + if(CURRENT_FRAME == 0) object.initModel(); + object.checkParameter({ subdivision: _sub }); object.updateHeight(_h); object.materials = [ _mat ]; - object.initModel(); setTransform(object, _data); return object; diff --git a/scripts/node_array/node_array.gml b/scripts/node_array/node_array.gml index b4316c813..c514ec212 100644 --- a/scripts/node_array/node_array.gml +++ b/scripts/node_array/node_array.gml @@ -114,7 +114,7 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { _l[| i].setVisible(i < ds_list_size(_l) - 1); array_push(input_display_list, i); - if(i >= input_fix_len && _l[| i].value_from == noone) + if(i >= input_fix_len && _l[| i].isLeaf()) extra = false; } array_insert(input_display_list, 1, array_adjust_tool); diff --git a/scripts/node_array_add/node_array_add.gml b/scripts/node_array_add/node_array_add.gml index c64140139..6606cd63c 100644 --- a/scripts/node_array_add/node_array_add.gml +++ b/scripts/node_array_add/node_array_add.gml @@ -54,7 +54,7 @@ function Node_Array_Add(_x, _y, _group = noone) : Node(_x, _y, _group) construct static update = function(frame = CURRENT_FRAME) { var _arr = getInputData(0); - if(inputs[| 0].value_from == noone) { + if(inputs[| 0].isLeaf()) { inputs[| 0].setType(VALUE_TYPE.any); outputs[| 0].setType(VALUE_TYPE.any); return; diff --git a/scripts/node_array_length/node_array_length.gml b/scripts/node_array_length/node_array_length.gml index b98f3005b..4c7270d8d 100644 --- a/scripts/node_array_length/node_array_length.gml +++ b/scripts/node_array_length/node_array_length.gml @@ -13,7 +13,7 @@ function Node_Array_Length(_x, _y, _group = noone) : Node(_x, _y, _group) constr static update = function(frame = CURRENT_FRAME) { var _arr = getInputData(0); - inputs[| 0].setType(inputs[| 0].value_from == noone? VALUE_TYPE.any : inputs[| 0].value_from.type); + inputs[| 0].setType(inputs[| 0].isLeaf()? VALUE_TYPE.any : inputs[| 0].value_from.type); if(!is_array(_arr) || array_length(_arr) == 0) { outputs[| 0].setValue(0); diff --git a/scripts/node_array_zip/node_array_zip.gml b/scripts/node_array_zip/node_array_zip.gml index 35166f608..3b4026ff5 100644 --- a/scripts/node_array_zip/node_array_zip.gml +++ b/scripts/node_array_zip/node_array_zip.gml @@ -51,7 +51,7 @@ function Node_Array_Zip(_x, _y, _group = noone) : Node(_x, _y, _group) construct static update = function(frame = CURRENT_FRAME) { var _arr = getInputData(0); - if(inputs[| 0].value_from == noone) { + if(inputs[| 0].isLeaf()) { inputs[| 0].setType(VALUE_TYPE.any); outputs[| 0].setType(VALUE_TYPE.any); return; @@ -66,7 +66,7 @@ function Node_Array_Zip(_x, _y, _group = noone) : Node(_x, _y, _group) construct var val = []; for( var i = 0; i < ds_list_size(inputs) - 1; i += data_length ) { val[i] = getInputData(i); - inputs[| i].setType(inputs[| i].value_from == noone? inputs[| i].value_from.type : VALUE_TYPE.any); + inputs[| i].setType(inputs[| i].isLeaf()? inputs[| i].value_from.type : VALUE_TYPE.any); if(!is_array(val[i])) { val[i] = [ val[i] ]; continue; diff --git a/scripts/node_ase_file_read/node_ase_file_read.gml b/scripts/node_ase_file_read/node_ase_file_read.gml index b0e68373a..8f0520a05 100644 --- a/scripts/node_ase_file_read/node_ase_file_read.gml +++ b/scripts/node_ase_file_read/node_ase_file_read.gml @@ -100,7 +100,7 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, by, _w, _h, COLORS.node_composite_bg_blend, 1); - var index = inputs[| 2].value_from == noone? inputs[| 2].is_anim : 2; + var index = inputs[| 2].isLeaf()? inputs[| 2].is_anim : 2; draw_sprite_ui_uniform(THEME.animate_clock, index, abx, lb_y, 1, index == 2? COLORS._main_accent : c_white, 0.8); if(_hover && point_in_circle(_m[0], _m[1], abx, lb_y, ui(10))) { draw_sprite_ui_uniform(THEME.animate_clock, index, abx, lb_y, 1, index == 2? COLORS._main_accent : c_white, 1); diff --git a/scripts/node_color_replacement/node_color_replacement.gml b/scripts/node_color_replacement/node_color_replacement.gml index 5d1057e60..dfe15dc10 100644 --- a/scripts/node_color_replacement/node_color_replacement.gml +++ b/scripts/node_color_replacement/node_color_replacement.gml @@ -39,7 +39,7 @@ function Node_Colors_Replace(_x, _y, _group = noone) : Node_Processor(_x, _y, _g bx += bs + ui(4); var jun = inputs[| 2]; - var index = jun.value_from == noone? jun.is_anim : 2; + var index = jun.isLeaf()? jun.is_anim : 2; if(buttonInstant(THEME.button_hide, bx, by, bs, bs, _m, _focus, _hover,, THEME.animate_clock, index, index == 2? COLORS._main_accent : COLORS._main_icon) == 2) jun.setAnim(!jun.is_anim); diff --git a/scripts/node_condition/node_condition.gml b/scripts/node_condition/node_condition.gml index 3dd184fa7..13aacfa00 100644 --- a/scripts/node_condition/node_condition.gml +++ b/scripts/node_condition/node_condition.gml @@ -40,7 +40,7 @@ function Node_Condition(_x, _y, _group = noone) : Node(_x, _y, _group) construct outputs[| 0] = nodeValue("Result", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, []); outputs[| 1] = nodeValue("Bool", self, JUNCTION_CONNECT.output, VALUE_TYPE.boolean, false); - static step = function() { + static step = function() { #region var _mode = getInputData(5); inputs[| 0].setVisible(_mode == 1, _mode == 1); @@ -49,9 +49,12 @@ function Node_Condition(_x, _y, _group = noone) : Node(_x, _y, _group) construct inputs[| 6].setVisible(_mode == 0, _mode == 0); inputs[| 7].setVisible(_mode == 2, _mode == 2); inputs[| 8].setVisible(_mode == 2, _mode == 2); - } + + inputs[| 3].setType(inputs[| 3].isLeaf()? VALUE_TYPE.any : inputs[| 3].value_from.type); + inputs[| 4].setType(inputs[| 4].isLeaf()? VALUE_TYPE.any : inputs[| 4].value_from.type); + } #endregion - static update = function(frame = CURRENT_FRAME) { + static update = function(frame = CURRENT_FRAME) { #region var _true = getInputData(3); var _fals = getInputData(4); @@ -64,9 +67,6 @@ function Node_Condition(_x, _y, _group = noone) : Node(_x, _y, _group) construct var _txt1 = getInputData(7); var _txt2 = getInputData(8); - inputs[| 3].setType(inputs[| 3].value_from == noone? VALUE_TYPE.any : inputs[| 3].value_from.type); - inputs[| 4].setType(inputs[| 4].value_from == noone? VALUE_TYPE.any : inputs[| 4].value_from.type); - var res = false; switch(_mode) { @@ -95,9 +95,9 @@ function Node_Condition(_x, _y, _group = noone) : Node(_x, _y, _group) construct } outputs[| 1].setValue(res); - } + } #endregion - static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { + static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region var val = outputs[| 1].getValue(); var frm = val? inputs[| 3] : inputs[| 4]; var to = outputs[| 0]; @@ -107,5 +107,5 @@ function Node_Condition(_x, _y, _group = noone) : Node(_x, _y, _group) construct draw_set_alpha(0.5); draw_line_width(frm.x, frm.y, to.x, to.y, _s * 4); draw_set_alpha(1); - } + } #endregion } \ No newline at end of file diff --git a/scripts/node_data/node_data.gml b/scripts/node_data/node_data.gml index 8061b283b..ea92ddd11 100644 --- a/scripts/node_data/node_data.gml +++ b/scripts/node_data/node_data.gml @@ -284,8 +284,14 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x var _hi = ui(junction_draw_pad_y); var _ho = ui(junction_draw_pad_y); - for( var i = 0; i < ds_list_size(inputs); i++ ) - if(inputs[| i].isVisible()) _hi += 24; + for( var i = 0; i < ds_list_size(inputs); i++ ) { + var _inp = inputs[| i]; + if(is_instanceof(_inp, NodeValue) && _inp.isVisible()) _hi += 24; + if(is_instanceof(_inp, NodeModule)) { + for( var j = 0, m = ds_list_size(_inp.inputs); j < m; j++ ) + if(_inp.inputs[| j].isVisible()) _hi += 24; + } + } for( var i = 0; i < ds_list_size(outputs); i++ ) if(outputs[| i].isVisible()) _ho += 24; @@ -364,8 +370,8 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x return noone; } #endregion - static getInput = function(junc = noone) { #region - for( var i = 0; i < ds_list_size(inputs); i++ ) { + static getInput = function(junc = noone, shift = input_fix_len) { #region + for( var i = shift; i < ds_list_size(inputs); i++ ) { if(!inputs[| i].visible) continue; if(inputs[| i].value_from != noone) continue; if(junc != noone && !inputs[| i].isConnectable(junc, true)) continue; @@ -379,8 +385,8 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x return display_name == ""? name : "[" + name + "] " + display_name; } #endregion - static addInput = function(junctionFrom) { #region - var targ = getInput(junctionFrom); + static addInput = function(junctionFrom, shift = input_fix_len) { #region + var targ = getInput(junctionFrom, shift); if(targ == noone) return; targ.setFrom(junctionFrom); @@ -450,13 +456,16 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x static _triggerCheck = function() { #region for( var i = 0; i < ds_list_size(inputs); i++ ) { - if(inputs[| i].type != VALUE_TYPE.trigger) continue; - if(!is_instanceof(inputs[| i].editWidget, buttonClass)) continue; + var _in = inputs[| i]; + if(!is_instanceof(_in, NodeValue)) continue; - var trig = inputs[| i].getValue(); - if(trig && !inputs[| i].display_data.output) { - inputs[| i].editWidget.onClick(); - inputs[| i].setValue(false); + if(_in.type != VALUE_TYPE.trigger) continue; + if(!is_instanceof(_in.editWidget, buttonClass)) continue; + + var trig = _in.getValue(); + if(trig && !_in.display_data.output) { + _in.editWidget.onClick(); + _in.setValue(false); } } @@ -615,27 +624,23 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x if(_clearCache) clearInputCache(); } #endregion + static isLeaf = function() { #region + for( var i = 0, n = ds_list_size(inputs); i < n; i++ ) { + var _inp = inputs[| i]; + if(!_inp.isLeaf()) return false; + } + + return true; + } #endregion + static isRenderActive = function() { return renderActive || (PREF_MAP[? "render_all_export"] && PROJECT.animator.rendering); } static isRenderable = function(log = false) { #region //Check if every input is ready (updated) if(!active) return false; if(!isRenderActive()) return false; - //if(group && struct_has(group, "iterationStatus") && group.iterationStatus() == ITERATION_STATUS.complete) return false; - - for(var j = 0; j < ds_list_size(inputs); j++) { - var _in = inputs[| j]; - if( _in.type == VALUE_TYPE.node) continue; - - var val_from = _in.value_from; - if( val_from == noone) continue; - if(!val_from.node.active) continue; - if(!val_from.node.isRenderActive()) continue; - if(!val_from.node.rendered) { - LOG_LINE_IF(global.FLAG.render == 1, $"Node {INAME} is not renderable because input {val_from.node.internalName} is not rendered ({val_from.node.rendered})"); - return false; - } - } + for(var j = 0; j < ds_list_size(inputs); j++) + if(!inputs[| j].isRendered()) return false; return true; } #endregion @@ -990,23 +995,24 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x else if(i == -2) jun = inspectInput2; else jun = inputs[| i]; - if(jun.value_from == noone) continue; + if(is_instanceof(jun, NodeModule)) { + jun.drawConnections(params, _inputs); + continue; + } + + if(jun.isLeaf()) continue; if(!jun.value_from.node.active) continue; if(!jun.isVisible()) continue; - if(i >= 0) - array_push(_inputs, jun); + if(i >= 0) array_push(_inputs, jun); } var len = array_length(_inputs); for( var i = 0; i < len; i++ ) _inputs[i].drawLineIndex = 1 + (i > len / 2? (len - 1 - i) : i) * 0.5; - for(var i = st; i < ds_list_size(inputs); i++) { - var jun; - if(i == -1) jun = inspectInput1; - else if(i == -2) jun = inspectInput2; - else jun = inputs[| i]; + for( var i = 0, n = array_length(_inputs); i < n; i++ ) { + var jun = _inputs[i]; var hov = jun.drawConnections(params); if(hov) hovering = hov; @@ -1212,7 +1218,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x if(branch_drawing) return; branch_drawing = true; for( var i = 0, n = ds_list_size(inputs); i < n; i++ ) { - if(inputs[| i].value_from == noone) continue; + if(inputs[| i].isLeaf()) continue; inputs[| i].value_from.node.drawBranch(); } } #endregion @@ -1250,7 +1256,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x for(var j = 0; j < ds_list_size(jun.value_to); j++) { var _vt = jun.value_to[| j]; - if(_vt.value_from == noone) break; + if(_vt.isLeaf()) break; if(_vt.value_from.node != self) break; _vt.removeFrom(false); @@ -1258,7 +1264,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x if(!_merge) continue; for( var k = 0; k < ds_list_size(inputs); k++ ) { - if(inputs[| k].value_from == noone) continue; + if(inputs[| k].isLeaf()) continue; if(_vt.setFrom(inputs[| k].value_from)) break; } } @@ -1394,7 +1400,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x for(var i = 0; i < ds_list_size(inputs); i++) { var _in = inputs[| i]; - if(_in.value_from == noone) continue; + if(_in.isLeaf()) continue; if(_in.value_from.node.group == group) continue; var input_node = noone; @@ -1472,7 +1478,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x for( var i = 0, n = ds_list_size(inputs); i < n; i++ ) { var _inp = inputs[| i]; - if(_inp.is_anim && _inp.value_from == noone) { + if(_inp.is_anim && _inp.isLeaf()) { _cur_anim = true; break; } diff --git a/scripts/node_dynamic_surface/node_dynamic_surface.gml b/scripts/node_dynamic_surface/node_dynamic_surface.gml index 9e20206e1..ee6473c8d 100644 --- a/scripts/node_dynamic_surface/node_dynamic_surface.gml +++ b/scripts/node_dynamic_surface/node_dynamic_surface.gml @@ -99,7 +99,7 @@ function dynaSurf_output_getNextNode() { #region var _to = junc.value_to[| j]; if(!_to.node.isRenderActive()) continue; - if(!_to.node.active || _to.value_from == noone) + if(!_to.node.active || _to.isLeaf()) continue; if(_to.value_from.node != group) continue; diff --git a/scripts/node_feedback_output/node_feedback_output.gml b/scripts/node_feedback_output/node_feedback_output.gml index 27b1cdb6d..d91482576 100644 --- a/scripts/node_feedback_output/node_feedback_output.gml +++ b/scripts/node_feedback_output/node_feedback_output.gml @@ -12,7 +12,7 @@ function Node_Feedback_Output(_x, _y, _group = noone) : Node_Group_Output(_x, _y cache_value = -1; static update = function(frame = CURRENT_FRAME) { - if(inputs[| 0].value_from == noone) return; + if(inputs[| 0].isLeaf()) return; if(CURRENT_FRAME == TOTAL_FRAMES - 1) { cache_value = noone; return; diff --git a/scripts/node_group_output/node_group_output.gml b/scripts/node_group_output/node_group_output.gml index aab11bffe..c27b8d30f 100644 --- a/scripts/node_group_output/node_group_output.gml +++ b/scripts/node_group_output/node_group_output.gml @@ -45,7 +45,7 @@ function Node_Group_Output(_x, _y, _group = noone) : Node(_x, _y, _group) constr if(!_to.node.isRenderActive()) continue; //printIf(global.FLAG.render, "Value to " + _to.name); - if(!_to.node.active || _to.value_from == noone) { + if(!_to.node.active || _to.isLeaf()) { //printIf(global.FLAG.render, "no value from"); continue; } diff --git a/scripts/node_iterate_each/node_iterate_each.gml b/scripts/node_iterate_each/node_iterate_each.gml index 99061d196..3477e97b7 100644 --- a/scripts/node_iterate_each/node_iterate_each.gml +++ b/scripts/node_iterate_each/node_iterate_each.gml @@ -26,7 +26,7 @@ function Node_Iterate_Each(_x, _y, _group = noone) : Node_Iterator(_x, _y, _grou } static onStep = function() { - var type = inputs[| 0].value_from == noone? VALUE_TYPE.any : inputs[| 0].value_from.type; + var type = inputs[| 0].isLeaf()? VALUE_TYPE.any : inputs[| 0].value_from.type; inputs[| 0].setType(type); } diff --git a/scripts/node_iterate_filter/node_iterate_filter.gml b/scripts/node_iterate_filter/node_iterate_filter.gml index b6a354e6a..2ccef32a0 100644 --- a/scripts/node_iterate_filter/node_iterate_filter.gml +++ b/scripts/node_iterate_filter/node_iterate_filter.gml @@ -28,7 +28,7 @@ function Node_Iterate_Filter(_x, _y, _group = noone) : Node_Iterator(_x, _y, _gr } static onStep = function() { - var type = inputs[| 0].value_from == noone? VALUE_TYPE.any : inputs[| 0].value_from.type; + var type = inputs[| 0].isLeaf()? VALUE_TYPE.any : inputs[| 0].value_from.type; inputs[| 0].setType(type); } diff --git a/scripts/node_iterate_sort/node_iterate_sort.gml b/scripts/node_iterate_sort/node_iterate_sort.gml index efcc91651..711575b6f 100644 --- a/scripts/node_iterate_sort/node_iterate_sort.gml +++ b/scripts/node_iterate_sort/node_iterate_sort.gml @@ -36,7 +36,7 @@ function Node_Iterate_Sort(_x, _y, _group = noone) : Node_Collection(_x, _y, _gr static getNextNodes = function() { return getNextNodesExternal(); } static onStep = function() { #region - var type = inputs[| 0].value_from == noone? VALUE_TYPE.any : inputs[| 0].value_from.type; + var type = inputs[| 0].isLeaf()? VALUE_TYPE.any : inputs[| 0].value_from.type; inputs[| 0].setType(type); } #endregion diff --git a/scripts/node_iterator_each_output/node_iterator_each_output.gml b/scripts/node_iterator_each_output/node_iterator_each_output.gml index 15e448be6..f929723f6 100644 --- a/scripts/node_iterator_each_output/node_iterator_each_output.gml +++ b/scripts/node_iterator_each_output/node_iterator_each_output.gml @@ -18,14 +18,14 @@ function Node_Iterator_Each_Output(_x, _y, _group = noone) : Node(_x, _y, _group static step = function() { if(!variable_struct_exists(group, "iterated")) return; - var type = inputs[| 0].value_from == noone? VALUE_TYPE.any : inputs[| 0].value_from.type; + var type = inputs[| 0].isLeaf()? VALUE_TYPE.any : inputs[| 0].value_from.type; inputs[| 0].setType(type); group.outputs[| 0].setType(type); outputs[| 0].setType(type); } static cloneValue = function(_prev_val, _val) { - if(inputs[| 0].value_from == noone) return _prev_val; + if(inputs[| 0].isLeaf()) return _prev_val; var is_surf = inputs[| 0].value_from.type == VALUE_TYPE.surface; var _new_val = []; @@ -38,7 +38,7 @@ function Node_Iterator_Each_Output(_x, _y, _group = noone) : Node(_x, _y, _group } static update = function(frame = CURRENT_FRAME) { - if(inputs[| 0].value_from == noone) { + if(inputs[| 0].isLeaf()) { group.iterationUpdate(); return; } diff --git a/scripts/node_iterator_filter_output/node_iterator_filter_output.gml b/scripts/node_iterator_filter_output/node_iterator_filter_output.gml index bf508ebd0..00315889c 100644 --- a/scripts/node_iterator_filter_output/node_iterator_filter_output.gml +++ b/scripts/node_iterator_filter_output/node_iterator_filter_output.gml @@ -18,13 +18,13 @@ function Node_Iterator_Filter_Output(_x, _y, _group = noone) : Node(_x, _y, _gro static step = function() { if(!variable_struct_exists(group, "iterated")) return; - var type = inputs[| 0].value_from == noone? VALUE_TYPE.any : inputs[| 0].value_from.type; + var type = inputs[| 0].isLeaf()? VALUE_TYPE.any : inputs[| 0].value_from.type; inputs[| 0].setType(type); group.outputs[| 0].setType(type); } static update = function(frame = CURRENT_FRAME) { - if(inputs[| 0].value_from == noone) { + if(inputs[| 0].isLeaf()) { group.iterationUpdate(); return; } diff --git a/scripts/node_iterator_output/node_iterator_output.gml b/scripts/node_iterator_output/node_iterator_output.gml index eb1522f52..8effadfbd 100644 --- a/scripts/node_iterator_output/node_iterator_output.gml +++ b/scripts/node_iterator_output/node_iterator_output.gml @@ -8,7 +8,7 @@ function Node_Iterator_Output(_x, _y, _group = noone) : Node_Group_Output(_x, _y inputs[| 0].setFrom_condition = function(_valueFrom) { if(instanceof(_valueFrom.node) != "Node_Iterator_Input") return true; - if(inputs[| 1].value_from == noone) return true; + if(inputs[| 1].isLeaf()) return true; if(inputs[| 1].value_from.node == _valueFrom.node) { noti_warning("setFrom: Immediate cycle disallowed",, self); return false; @@ -22,7 +22,7 @@ function Node_Iterator_Output(_x, _y, _group = noone) : Node_Group_Output(_x, _y inputs[| 1].setFrom_condition = function(_valueFrom) { if(instanceof(_valueFrom.node) != "Node_Iterator_Input") return true; - if(inputs[| 0].value_from == noone) return true; + if(inputs[| 0].isLeaf()) return true; if(inputs[| 0].value_from.node == _valueFrom.node) { noti_warning("setFrom: Immediate cycle disallowed",, self); return false; @@ -42,7 +42,7 @@ function Node_Iterator_Output(_x, _y, _group = noone) : Node_Group_Output(_x, _y } static cloneValue = function(_prev_val, _val) { - if(inputs[| 0].value_from == noone) return _prev_val; + if(inputs[| 0].isLeaf()) return _prev_val; var is_surf = inputs[| 0].value_from.type == VALUE_TYPE.surface; var _new_val; @@ -54,7 +54,7 @@ function Node_Iterator_Output(_x, _y, _group = noone) : Node_Group_Output(_x, _y } static update = function(frame = CURRENT_FRAME) { - if(inputs[| 0].value_from == noone) { + if(inputs[| 0].isLeaf()) { group.iterationUpdate(); return; } diff --git a/scripts/node_json_file_write/node_json_file_write.gml b/scripts/node_json_file_write/node_json_file_write.gml index b915191ea..122056fe2 100644 --- a/scripts/node_json_file_write/node_json_file_write.gml +++ b/scripts/node_json_file_write/node_json_file_write.gml @@ -86,7 +86,7 @@ function Node_Json_File_Write(_x, _y, _group = noone) : Node(_x, _y, _group) con var cont = {}; - if(inputs[| 1].value_from == noone) { + if(inputs[| 1].isLeaf()) { for( var i = input_fix_len; i < ds_list_size(inputs) - data_length; i += data_length ) { var _key = getInputData(i + 0); var _val = getInputData(i + 1); @@ -104,7 +104,7 @@ function Node_Json_File_Write(_x, _y, _group = noone) : Node(_x, _y, _group) con static step = function() { for(var i = input_fix_len; i < ds_list_size(inputs) - data_length; i += data_length) { var inp = inputs[| i + 1]; - var typ = inp.value_from == noone? VALUE_TYPE.any : inp.value_from.type; + var typ = inp.isLeaf()? VALUE_TYPE.any : inp.value_from.type; inp.setType(typ); } } diff --git a/scripts/node_lua_compute/node_lua_compute.gml b/scripts/node_lua_compute/node_lua_compute.gml index d0f5c3441..238c9fa50 100644 --- a/scripts/node_lua_compute/node_lua_compute.gml +++ b/scripts/node_lua_compute/node_lua_compute.gml @@ -80,7 +80,7 @@ function Node_Lua_Compute(_x, _y, _group = noone) : Node(_x, _y, _group) constru } static getState = function() { - if(inputs[| 3].value_from == noone) + if(inputs[| 3].isLeaf()) return lua_state; return inputs[| 3].value_from.node.getState(); } diff --git a/scripts/node_lua_global/node_lua_global.gml b/scripts/node_lua_global/node_lua_global.gml index 46c5153e0..cd3b3ec98 100644 --- a/scripts/node_lua_global/node_lua_global.gml +++ b/scripts/node_lua_global/node_lua_global.gml @@ -46,7 +46,7 @@ function Node_Lua_Global(_x, _y, _group = noone) : Node(_x, _y, _group) construc } static getState = function() { - if(inputs[| 2].value_from == noone) return lua_state; + if(inputs[| 2].isLeaf()) return lua_state; return inputs[| 2].value_from.node.getState(); } diff --git a/scripts/node_lua_surface/node_lua_surface.gml b/scripts/node_lua_surface/node_lua_surface.gml index 8c9b8a810..1af18e01d 100644 --- a/scripts/node_lua_surface/node_lua_surface.gml +++ b/scripts/node_lua_surface/node_lua_surface.gml @@ -74,7 +74,7 @@ function Node_Lua_Surface(_x, _y, _group = noone) : Node(_x, _y, _group) constru } static getState = function() { - if(inputs[| 3].value_from == noone) + if(inputs[| 3].isLeaf()) return lua_state; return inputs[| 3].value_from.node.getState(); } diff --git a/scripts/node_module_test/node_module_test.gml b/scripts/node_module_test/node_module_test.gml index 13873aa35..14d47bbf0 100644 --- a/scripts/node_module_test/node_module_test.gml +++ b/scripts/node_module_test/node_module_test.gml @@ -11,7 +11,7 @@ function Node_Module_Test(_x, _y, _group = noone) : Node(_x, _y, _group) constru outputs[| 0] = nodeValue("Output", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, 0); - input_display_list = [ 0 ]; + //input_display_list = [ 0 ]; setIsDynamicInput(1); diff --git a/scripts/node_number/node_number.gml b/scripts/node_number/node_number.gml index d71b9cbc4..653f50d6d 100644 --- a/scripts/node_number/node_number.gml +++ b/scripts/node_number/node_number.gml @@ -59,7 +59,7 @@ function Node_Number(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co inputs[| 4].setVisible(false); break; case 1 : - if(inputs[| 0].value_from == noone) { + if(inputs[| 0].isLeaf()) { w = 160; min_h = 96; } @@ -67,7 +67,7 @@ function Node_Number(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co inputs[| 4].setVisible(true); break; case 2 : - if(inputs[| 0].value_from == noone) { + if(inputs[| 0].isLeaf()) { w = 128; min_h = 128; } @@ -332,7 +332,7 @@ function Node_Vector2(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c w = 96; min_h = 80; - if(disp == 1 && inputs[| 0].value_from == noone && inputs[| 1].value_from == noone) { + if(disp == 1 && inputs[| 0].isLeaf() && inputs[| 1].isLeaf()) { w = 160; min_h = 160; } @@ -616,7 +616,7 @@ function Node_Vector_Split(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro outputs[| 3] = nodeValue("w", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, 0); static step = function() { #region - if(inputs[| 0].value_from == noone) return; + if(inputs[| 0].isLeaf()) return; var type = VALUE_TYPE.float; if(inputs[| 0].value_from.type == VALUE_TYPE.integer) type = VALUE_TYPE.integer; diff --git a/scripts/node_pin/node_pin.gml b/scripts/node_pin/node_pin.gml index aa9a403cb..356e8e574 100644 --- a/scripts/node_pin/node_pin.gml +++ b/scripts/node_pin/node_pin.gml @@ -3,16 +3,16 @@ function Node_Pin(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { w = 32; h = 32; - auto_height = false; + auto_height = false; junction_shift_y = 16; - previewable = false; + previewable = false; - isHovering = false; - hover_scale = 0; + isHovering = false; + hover_scale = 0; hover_scale_to = 0; - hover_alpha = 0; + hover_alpha = 0; - bg_spr = THEME.node_pin_bg; + bg_spr = THEME.node_pin_bg; bg_sel_spr = THEME.node_pin_bg_active; inputs[| 0] = nodeValue("In", self, JUNCTION_CONNECT.input, VALUE_TYPE.any, 0 ) @@ -20,25 +20,29 @@ function Node_Pin(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { outputs[| 0] = nodeValue("Out", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, 0); - static step = function() { - if(inputs[| 0].value_from == noone) return; + static step = function() { #region + if(inputs[| 0].isLeaf()) return; inputs[| 0].setType(inputs[| 0].value_from.type); outputs[| 0].setType(inputs[| 0].value_from.type); - outputs[| 0].value_from = inputs[| 0].value_from; inputs[| 0].color_display = inputs[| 0].value_from.color_display; outputs[| 0].color_display = inputs[| 0].color_display; - } + } #endregion - static pointIn = function(_x, _y, _mx, _my, _s) { + static update = function() { #region + var _val = getInputData(0); + outputs[| 0].setValue(_val); + } #endregion + + static pointIn = function(_x, _y, _mx, _my, _s) { #region var xx = x * _s + _x; var yy = y * _s + _y; return point_in_circle(_mx, _my, xx, yy, _s * 24); - } + } #endregion - static preDraw = function(_x, _y, _s) { + static preDraw = function(_x, _y, _s) { #region var xx = x * _s + _x; var yy = y * _s + _y; @@ -47,11 +51,11 @@ function Node_Pin(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { outputs[| 0].x = xx; outputs[| 0].y = yy; - } + } #endregion static drawJunctionNames = function(_x, _y, _mx, _my, _s) {} - static drawJunctions = function(_x, _y, _mx, _my, _s) { + static drawJunctions = function(_x, _y, _mx, _my, _s) { #region isHovering = false; var hover = noone; var xx = x * _s + _x; @@ -67,9 +71,9 @@ function Node_Pin(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { hover = outputs[| 0]; return hover; - } + } #endregion - static drawNode = function(_x, _y, _mx, _my, _s) { + static drawNode = function(_x, _y, _mx, _my, _s) { #region if(group != PANEL_GRAPH.getCurrentContext()) return; var xx = x * _s + _x; @@ -98,5 +102,5 @@ function Node_Pin(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { } return drawJunctions(_x, _y, _mx, _my, _s); - } + } #endregion } \ No newline at end of file diff --git a/scripts/node_sequence_to_anim/node_sequence_to_anim.gml b/scripts/node_sequence_to_anim/node_sequence_to_anim.gml index a074fa693..964d8a2e0 100644 --- a/scripts/node_sequence_to_anim/node_sequence_to_anim.gml +++ b/scripts/node_sequence_to_anim/node_sequence_to_anim.gml @@ -31,7 +31,7 @@ function Node_Sequence_Anim(_x, _y, _group = noone) : Node(_x, _y, _group) const _ord[i] = i; } - if(_hover && point_in_rectangle(_m[0], _m[1], _x, _y, _x + _w, _y + _h) && inputs[| 2].value_from == noone) { + if(_hover && point_in_rectangle(_m[0], _m[1], _x, _y, _x + _w, _y + _h) && inputs[| 2].isLeaf()) { draw_sprite_stretched(THEME.button, mouse_click(mb_left, _focus)? 2 : 1, _x, _y, _w, _h); if(mouse_press(mb_left, _focus)) dialogPanelCall(new Panel_Array_Sequence(self)); diff --git a/scripts/node_strand_render_texture/node_strand_render_texture.gml b/scripts/node_strand_render_texture/node_strand_render_texture.gml index 51202c8b6..a4c76cfe8 100644 --- a/scripts/node_strand_render_texture/node_strand_render_texture.gml +++ b/scripts/node_strand_render_texture/node_strand_render_texture.gml @@ -58,7 +58,7 @@ function Node_Strand_Render_Texture(_x, _y, _group = noone) : Node(_x, _y, _grou return; if(!is_array(_str)) _str = [ _str ]; - if(inputs[| 4].value_from == noone) + if(inputs[| 4].isLeaf()) return; if(!is_array(_tex)) _tex = [ _tex ]; diff --git a/scripts/node_struct/node_struct.gml b/scripts/node_struct/node_struct.gml index 8dd4c4c11..f0900df32 100644 --- a/scripts/node_struct/node_struct.gml +++ b/scripts/node_struct/node_struct.gml @@ -56,7 +56,7 @@ function Node_Struct(_x, _y, _group = noone) : Node(_x, _y, _group) constructor static step = function() { for(var i = input_fix_len; i < ds_list_size(inputs) - data_length; i += data_length) { var inp = inputs[| i + 1]; - var typ = inp.value_from == noone? VALUE_TYPE.any : inp.value_from.type; + var typ = inp.isLeaf()? VALUE_TYPE.any : inp.value_from.type; inp.setType(typ); } } diff --git a/scripts/node_switch/node_switch.gml b/scripts/node_switch/node_switch.gml index b4ba8c859..8e8fec327 100644 --- a/scripts/node_switch/node_switch.gml +++ b/scripts/node_switch/node_switch.gml @@ -4,7 +4,6 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor w = 96; - inputs[| 0] = nodeValue("Index", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "" ) .setVisible(true, true) .rejectArray(); @@ -12,16 +11,16 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor inputs[| 1] = nodeValue("Default value", self, JUNCTION_CONNECT.input, VALUE_TYPE.any, 0 ) .setVisible(false, true); - static createNewInput = function() { + static createNewInput = function() { #region var index = ds_list_size(inputs); inputs[| index + 0] = nodeValue("Case", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "" ); inputs[| index + 1] = nodeValue("value", self, JUNCTION_CONNECT.input, VALUE_TYPE.any, 0 ) - .setVisible(false, true); + .setVisible(false, false); array_push(input_display_list, index + 0); array_push(input_display_list, index + 1); - } + } #endregion outputs[| 0] = nodeValue("Result", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, 0); @@ -33,7 +32,7 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor if(!LOADING && !APPENDING) createNewInput(); - static refreshDynamicInput = function() { + static refreshDynamicInput = function() { #region var _in = ds_list_create(); for( var i = 0; i < input_fix_len; i++ ) @@ -45,6 +44,7 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor if(getInputData(i) != "") { ds_list_add(_in, inputs[| i + 0]); ds_list_add(_in, inputs[| i + 1]); + inputs[| i + 1].setVisible(false, true); array_push(input_display_list, i + 0); array_push(input_display_list, i + 1); @@ -61,9 +61,9 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor inputs = _in; createNewInput(); - } + } #endregion - static onValueFromUpdate = function(index) { + static onValueFromUpdate = function(index) { #region if(LOADING || APPENDING) return; inputs[| 1].setType(inputs[| 1].value_from? inputs[| 1].value_from.type : VALUE_TYPE.any); @@ -73,9 +73,9 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor if(inputs[| i + 1].value_from != noone) inputs[| i + 1].setType(inputs[| i + 1].value_from.type); } - } + } #endregion - static onValueUpdate = function(index = 0) { + static onValueUpdate = function(index = 0) { #region if(index < input_fix_len) return; if(LOADING || APPENDING) return; @@ -83,9 +83,18 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor inputs[| index + 1].name = getInputData(index) + " value"; refreshDynamicInput(); - } + } #endregion - static update = function(frame = CURRENT_FRAME) { + static step = function() { #region + for( var i = input_fix_len; i < ds_list_size(inputs); i += data_length ) { + var _inp = inputs[| i + 1]; + if(_inp.isLeaf()) continue; + + _inp.setType(_inp.value_from.type); + } + } #endregion + + static update = function(frame = CURRENT_FRAME) { #region var sele = getInputData(0); var _res = getInputData(1); @@ -102,9 +111,9 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor } outputs[| 0].setValue(_res); - } + } #endregion - static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { + static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region var frm = inputs[| 1]; var sele = getInputData(0); var _res = getInputData(1); @@ -121,9 +130,7 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor draw_set_alpha(0.5); draw_line_width(frm.x, frm.y, to.x, to.y, _s * 4); draw_set_alpha(1); - } + } #endregion - static doApplyDeserialize = function() { - refreshDynamicInput(); - } + static doApplyDeserialize = function() { refreshDynamicInput(); } } \ No newline at end of file diff --git a/scripts/node_transform/node_transform.gml b/scripts/node_transform/node_transform.gml index 22079e12e..7e88acd60 100644 --- a/scripts/node_transform/node_transform.gml +++ b/scripts/node_transform/node_transform.gml @@ -501,7 +501,7 @@ function Node_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) } #region path - if(inputs[| 2].is_anim && inputs[| 2].value_from == noone && !inputs[| 2].sep_axis) { + if(inputs[| 2].is_anim && inputs[| 2].isLeaf() && !inputs[| 2].sep_axis) { var posInp = inputs[| 2]; var allPos = posInp.animator.values; var ox, oy, nx, ny; diff --git a/scripts/node_tunnel_in/node_tunnel_in.gml b/scripts/node_tunnel_in/node_tunnel_in.gml index d3ba286bc..ba2916cd7 100644 --- a/scripts/node_tunnel_in/node_tunnel_in.gml +++ b/scripts/node_tunnel_in/node_tunnel_in.gml @@ -16,12 +16,12 @@ function Node_Tunnel_In(_x, _y, _group = noone) : Node(_x, _y, _group) construct insp2UpdateTooltip = "Create tunnel out"; insp2UpdateIcon = [ THEME.tunnel, 0, c_white ]; - static onInspector2Update = function() { + static onInspector2Update = function() { #region var _node = nodeBuild("Node_Tunnel_Out", x + 128, y); _node.inputs[| 0].setValue(getInputData(0)); - } + } #endregion - static onDrawNodeBehind = function(_x, _y, _mx, _my, _s) { + static onDrawNodeBehind = function(_x, _y, _mx, _my, _s) { #region var xx = _x + x * _s; var yy = _y + y * _s; @@ -50,17 +50,17 @@ function Node_Tunnel_In(_x, _y, _group = noone) : Node(_x, _y, _group) construct k = ds_map_find_next(TUNNELS_OUT, k); } - } + } #endregion static update = function(frame = CURRENT_FRAME) { onValueUpdate(); } - static resetMap = function() { + static resetMap = function() { #region var _key = getInputData(0); TUNNELS_IN_MAP[? node_id] = _key; TUNNELS_IN[? _key] = inputs[| 1]; - } + } #endregion - static checkDuplicate = function() { + static checkDuplicate = function() { #region var _key = getInputData(0); var amo = ds_map_size(TUNNELS_IN_MAP); var k = ds_map_find_first(TUNNELS_IN_MAP); @@ -80,9 +80,9 @@ function Node_Tunnel_In(_x, _y, _group = noone) : Node(_x, _y, _group) construct noti_remove(error_notification); error_notification = noone; } - } + } #endregion - static onValueUpdate = function(index = -1) { + static onValueUpdate = function(index = -1) { #region var _key = getInputData(0); resetMap(); @@ -102,23 +102,23 @@ function Node_Tunnel_In(_x, _y, _group = noone) : Node(_x, _y, _group) construct } if(index == 0) { RENDER_ALL_REORDER } - } + } #endregion - static step = function() { + static step = function() { #region var _key = getInputData(0); value_validation[VALIDATION.error] = error_notification != noone; - if(inputs[| 1].value_from == noone) { + if(inputs[| 1].isLeaf()) { inputs[| 1].setType(VALUE_TYPE.any); inputs[| 1].display_type = VALUE_DISPLAY._default; } else { inputs[| 1].setType(inputs[| 1].value_from.type); inputs[| 1].display_type = inputs[| 1].value_from.display_type; } - } + } #endregion - static getNextNodes = function() { + static getNextNodes = function() { #region var nodes = []; var nodeNames = []; var _key = getInputData(0); @@ -143,23 +143,23 @@ function Node_Tunnel_In(_x, _y, _group = noone) : Node(_x, _y, _group) construct LOG_BLOCK_END(); LOG_BLOCK_END(); return nodes; - } + } #endregion - static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { + static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region draw_set_text(f_h5, fa_center, fa_center, COLORS._main_text); var str = string(getInputData(0)); var bbox = drawGetBbox(xx, yy, _s); var ss = string_scale(str, bbox.w, bbox.h); draw_text_transformed(bbox.xc, bbox.yc, str, ss, ss, 0); - } + } #endregion static onClone = function() { onValueUpdate(0); } static postConnect = function() { onValueUpdate(0); } - static onDestroy = function() { + static onDestroy = function() { #region if(error_notification != noone) noti_remove(error_notification); - } + } #endregion } \ No newline at end of file diff --git a/scripts/node_tunnel_out/node_tunnel_out.gml b/scripts/node_tunnel_out/node_tunnel_out.gml index 527e09748..0df1fcdef 100644 --- a/scripts/node_tunnel_out/node_tunnel_out.gml +++ b/scripts/node_tunnel_out/node_tunnel_out.gml @@ -13,22 +13,22 @@ function Node_Tunnel_Out(_x, _y, _group = noone) : Node(_x, _y, _group) construc insp2UpdateTooltip = "Goto tunnel in"; insp2UpdateIcon = [ THEME.tunnel, 1, c_white ]; - static onInspector2Update = function() { + static onInspector2Update = function() { #region var _key = getInputData(0); if(!ds_map_exists(TUNNELS_IN, _key)) return; var _node = TUNNELS_IN[? _key].node; graphFocusNode(_node); - } + } #endregion - static isRenderable = function() { + static isRenderable = function() { #region var _key = getInputData(0); if(!ds_map_exists(TUNNELS_IN, _key)) return false; return TUNNELS_IN[? _key].node.rendered; - } + } #endregion - static onDrawNodeBehind = function(_x, _y, _mx, _my, _s) { + static onDrawNodeBehind = function(_x, _y, _mx, _my, _s) { #region var xx = _x + x * _s; var yy = _y + y * _s; @@ -51,17 +51,17 @@ function Node_Tunnel_Out(_x, _y, _group = noone) : Node(_x, _y, _group) construc var toy = yy + h * _s / 2; draw_line_dashed(frx, fry, tox, toy, 8 * _s, 16 * _s, current_time / 10); draw_set_alpha(1); - } + } #endregion - static onValueUpdate = function(index = -1) { + static onValueUpdate = function(index = -1) { #region var _key = getInputData(0); TUNNELS_OUT[? node_id] = _key; if(index == 0) { RENDER_ALL_REORDER } - } + } #endregion - static step = function() { + static step = function() { #region var _key = getInputData(0); if(ds_map_exists(TUNNELS_IN, _key)) { outputs[| 0].setType(TUNNELS_IN[? _key].type); @@ -70,23 +70,23 @@ function Node_Tunnel_Out(_x, _y, _group = noone) : Node(_x, _y, _group) construc outputs[| 0].setType(VALUE_TYPE.any); outputs[| 0].display_type = VALUE_DISPLAY._default; } - } + } #endregion - static update = function(frame = CURRENT_FRAME) { + static update = function(frame = CURRENT_FRAME) { #region var _key = getInputData(0); if(ds_map_exists(TUNNELS_IN, _key)) outputs[| 0].setValue(TUNNELS_IN[? _key].getValue()); - } + } #endregion - static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { + static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region draw_set_text(f_h5, fa_center, fa_center, COLORS._main_text); var str = string(getInputData(0)); var bbox = drawGetBbox(xx, yy, _s); var ss = string_scale(str, bbox.w, bbox.h); draw_text_transformed(bbox.xc, bbox.yc, str, ss, ss, 0); - } + } #endregion static onClone = function() { onValueUpdate(0); } diff --git a/scripts/node_value/node_value.gml b/scripts/node_value/node_value.gml index adc84249c..6c21f3f11 100644 --- a/scripts/node_value/node_value.gml +++ b/scripts/node_value/node_value.gml @@ -1793,6 +1793,18 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru return true; } #endregion + static isLeaf = function() { gml_pragma("forceinline"); return value_from == noone; } + + static isRendered = function() { #region + if(type == VALUE_TYPE.node) return true; + + if( value_from == noone) return true; + if(!value_from.node.active) return true; + if(!value_from.node.isRenderActive()) return true; + + return value_from.node.rendered; + } #endregion + static setFrom = function(_valueFrom, _update = true, checkRecur = true, log = false) { #region //print($"Connecting {_valueFrom.name} to {name}"); @@ -1899,7 +1911,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru } #endregion static checkConnection = function(_remove_list = true) { #region - if(value_from == noone) return; + if(isLeaf()) return; if(value_from.node.active) return; removeFrom(_remove_list); @@ -1932,23 +1944,23 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru var _angle = argument_count > 8? argument[ 8] : 0; var _scale = argument_count > 9? argument[ 9] : 1; var _spr = argument_count > 10? argument[10] : THEME.anchor_selector; - return preview_overlay_scalar(value_from == noone, active, _x, _y, _s, _mx, _my, _snx, _sny, _angle, _scale, _spr); + return preview_overlay_scalar(isLeaf(), active, _x, _y, _s, _mx, _my, _snx, _sny, _angle, _scale, _spr); case VALUE_DISPLAY.rotation : var _rad = argument_count > 8? argument[ 8] : 64; - return preview_overlay_rotation(value_from == noone, active, _x, _y, _s, _mx, _my, _snx, _sny, _rad); + return preview_overlay_rotation(isLeaf(), active, _x, _y, _s, _mx, _my, _snx, _sny, _rad); case VALUE_DISPLAY.vector : var _spr = argument_count > 8? argument[8] : THEME.anchor_selector; var _sca = argument_count > 9? argument[9] : 1; - return preview_overlay_vector(value_from == noone, active, _x, _y, _s, _mx, _my, _snx, _sny, _spr); + return preview_overlay_vector(isLeaf(), active, _x, _y, _s, _mx, _my, _snx, _sny, _spr); case VALUE_DISPLAY.area : var _flag = argument_count > 8? argument[8] : 0b0011; - return preview_overlay_area(value_from == noone, active, _x, _y, _s, _mx, _my, _snx, _sny, _flag, struct_try_get(display_data, "onSurfaceSize")); + return preview_overlay_area(isLeaf(), active, _x, _y, _s, _mx, _my, _snx, _sny, _flag, struct_try_get(display_data, "onSurfaceSize")); case VALUE_DISPLAY.puppet_control : - return preview_overlay_puppet(value_from == noone, active, _x, _y, _s, _mx, _my, _snx, _sny); + return preview_overlay_puppet(isLeaf(), active, _x, _y, _s, _mx, _my, _snx, _sny); } return -1; @@ -2029,7 +2041,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru } #endregion static drawConnections = function(params = {}) { #region - if(value_from == noone) return noone; + if(isLeaf()) return noone; if(!value_from.node.active) return noone; if(!isVisible()) return noone; @@ -2313,7 +2325,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru for(var j = 0; j < ds_list_size(value_to); j++) { var _to = value_to[| j]; - if(!_to.node.active || _to.value_from == noone) continue; + if(!_to.node.active || _to.isLeaf()) continue; if(_to.value_from != self) continue; array_push(to, _to); diff --git a/scripts/notification_system/notification_system.gml b/scripts/notification_system/notification_system.gml index 990f0957e..635e14b7f 100644 --- a/scripts/notification_system/notification_system.gml +++ b/scripts/notification_system/notification_system.gml @@ -44,6 +44,7 @@ str = string(str); show_debug_message("STATUS: " + str); + if(PANEL_MAIN == 0) return; if(flash && PANEL_MENU) { PANEL_MENU.noti_flash = 1; @@ -70,6 +71,7 @@ function noti_warning(str, icon = noone, ref = noone) { if(TEST_ERROR) return {}; show_debug_message("WARNING: " + str); + if(PANEL_MAIN == 0) return; if(PANEL_MENU) { PANEL_MENU.noti_flash = 1; @@ -99,6 +101,7 @@ function noti_error(str, icon = noone, ref = noone) { if(TEST_ERROR) return {}; show_debug_message("ERROR: " + str); + if(PANEL_MAIN == 0) print(str); var noti = new notification(NOTI_TYPE.error, str, icon, c_ui_red); ds_list_add(STATUSES, noti); diff --git a/scripts/panel_graph/panel_graph.gml b/scripts/panel_graph/panel_graph.gml index 61c4cf81c..0d8c6545c 100644 --- a/scripts/panel_graph/panel_graph.gml +++ b/scripts/panel_graph/panel_graph.gml @@ -494,7 +494,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { for( var j = 0, m = ds_list_size(_node.inputs); j < m; j++ ) { var _input = _node.inputs[| j]; - if(_input.value_from == noone) continue; + if(_input.isLeaf()) continue; if(!ds_exists(_input.value_from.node, nodes_select_list)) continue; _input.color = color; @@ -1165,7 +1165,6 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { var _mx = mx; var _my = my; var target = noone; - var _addInput = false; if(value_focus && value_focus != value_dragging && value_focus.connect_type != value_dragging.connect_type) target = value_focus; @@ -1182,9 +1181,6 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { } } - if(target != noone && target.value_from == noone && target.connect_type == JUNCTION_CONNECT.input && target.node.auto_input) - _addInput = true; - var _mmx = target != noone? target.x : _mx; var _mmy = target != noone? target.y : _my; @@ -1192,11 +1188,14 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { connection_draw_target = target; value_dragging.drawJunction(graph_s, value_dragging.x, value_dragging.y); - if(target) - target.drawJunction(graph_s, target.x, target.y); + if(target) target.drawJunction(graph_s, target.x, target.y); if(mouse_release(mb_left)) { // CONNECT junction if(target != noone) { + var _addInput = false; + if(target.isLeaf() && target.connect_type == JUNCTION_CONNECT.input && target.node.auto_input) + _addInput = true; + if(value_dragging.connect_type == JUNCTION_CONNECT.input) { if(array_empty(value_draggings)) value_dragging.setFrom(target); @@ -1204,16 +1203,11 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { for( var i = 0, n = array_length(value_draggings); i < n; i++ ) value_draggings[i].setFrom(target); } - } else if(!_addInput) { + } else if(_addInput && !array_empty(value_draggings)) { + for( var i = 0, n = array_length(value_draggings); i < n; i++ ) + target.node.addInput(value_draggings[i]); + } else target.setFrom(value_dragging); - } else { //addInput - if(array_empty(value_draggings)) - target.node.addInput(value_dragging); - else { - for( var i = 0, n = array_length(value_draggings); i < n; i++ ) - target.node.addInput(value_draggings[i]); - } - } } else { if(value_dragging.connect_type == JUNCTION_CONNECT.input) value_dragging.removeFrom(); @@ -2060,7 +2054,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { break; } - if(!key_mod_press(SHIFT) && node && struct_has(DRAGGING, "from") && DRAGGING.from.value_from == noone) { + if(!key_mod_press(SHIFT) && node && struct_has(DRAGGING, "from") && DRAGGING.from.isLeaf()) { for( var i = 0; i < ds_list_size(node.outputs); i++ ) if(DRAGGING.from.setFrom(node.outputs[| i])) break; } diff --git a/scripts/render_data/render_data.gml b/scripts/render_data/render_data.gml index a6432a5e8..77c8e2136 100644 --- a/scripts/render_data/render_data.gml +++ b/scripts/render_data/render_data.gml @@ -115,7 +115,7 @@ function __sortGraph(_list, _nodeList) { #region for( var i = 0, n = ds_list_size(_node.inputs); i < n; i++ ) { var _in = _node.inputs[| i]; - if(_in.value_from == noone) continue; + if(_in.isLeaf()) continue; if(_in.value_from.node.topoSorted) continue; array_push(_childs, _in.value_from.node); diff --git a/scripts/scrollBox/scrollBox.gml b/scripts/scrollBox/scrollBox.gml index 59dddca0b..066eec59e 100644 --- a/scripts/scrollBox/scrollBox.gml +++ b/scripts/scrollBox/scrollBox.gml @@ -1,3 +1,13 @@ +function scrollItem(name, spr = noone) constructor { + self.name = name; + self.data = name; + self.spr = spr; + self.spr_ind = 0; + self.spr_blend = c_white; + + tooltip = ""; +} + function scrollBox(_data, _onModify, update_hover = true) : widget() constructor { onModify = _onModify; data_list = _data; @@ -46,7 +56,9 @@ function scrollBox(_data, _onModify, update_hover = true) : widget() constructor else data = data_list; if(is_array(_val)) return 0; - var _text = is_string(_val)? _val : array_safe_get(data, _val); + if(is_real(_val)) _val = array_safe_get(data, _val); + + var _text = is_instanceof(_val, scrollItem)? _val.name : _val; curr_text = _text; w = _w; @@ -84,15 +96,16 @@ function scrollBox(_data, _onModify, update_hover = true) : widget() constructor } var _arw = sprite_get_width(arrow_spr) + ui(8); + var _spr = is_instanceof(_val, scrollItem) && _val.spr; draw_set_text(font, align, fa_center, COLORS._main_text); draw_set_alpha(0.5 + 0.5 * interactable); - if(align == fa_center) - draw_text(_x + (w - _arw) / 2, _y + _h / 2 - ui(2), _text); - else if(align == fa_left) - draw_text(_x + ui(8), _y + _h / 2 - ui(2), _text); + if(align == fa_center) draw_text(_x + (w - _arw) / 2, _y + _h / 2 - ui(2), _text); + else if(align == fa_left) draw_text(_x + ui(8) + _spr * _h, _y + _h / 2 - ui(2), _text); draw_set_alpha(1); + if(_spr) draw_sprite_ext(_val.spr, 0, _x + ui(8) + _h / 2, _y + _h / 2, 1, 1, 0, _val.spr_blend, 1); + draw_sprite_ui_uniform(arrow_spr, arrow_ind, _x + w - _arw / 2, _y + _h / 2, 1, COLORS._main_icon, 0.5 + 0.5 * interactable); if(WIDGET_CURRENT == self) diff --git a/scripts/sprite_loader/sprite_loader.gml b/scripts/sprite_loader/sprite_loader.gml index 30441d6e1..38527412c 100644 --- a/scripts/sprite_loader/sprite_loader.gml +++ b/scripts/sprite_loader/sprite_loader.gml @@ -54,11 +54,20 @@ function __getGraphicList() { function loadGraphic(theme = "default") { var sprDef = __getGraphicList(); - var path = _sprite_path("./graphics.json", theme); + var _metaP = $"{DIRECTORY}Themes/{theme}/meta.json"; + if(!file_exists(_metaP)) + noti_warning("Loading theme made for older version."); + else { + var _meta = json_load_struct(_metaP); + if(_meta[$ "version"] < VERSION) + noti_warning("Loading theme made for older version."); + } + + var path = _sprite_path("./graphics.json", theme); print($"Loading theme {theme}"); if(!file_exists(path)) { - noti_status("Theme not defined at " + path + ", rollback to default theme."); + print("Theme not defined at " + path + ", rollback to default theme."); return; } @@ -70,8 +79,8 @@ function loadGraphic(theme = "default") { for( var i = 0, n = array_length(graphics); i < n; i++ ) { var key = graphics[i]; - if(struct_has(THEME, key) && sprite_exists(THEME[$ key])) - sprite_delete(THEME[$ key]); + //if(struct_has(THEME, key) && sprite_exists(THEME[$ key])) + // sprite_delete(THEME[$ key]); if(struct_has(sprStr, key)) { str = sprStr[$ key];