Pixel-Composer/scripts/node_collection/node_collection.gml

605 lines
16 KiB
Text
Raw Normal View History

2022-01-24 02:21:25 +01:00
enum COLLECTION_TAG {
group = 1,
loop = 2
}
2023-10-10 07:12:42 +02:00
function groupNodes(nodeArray, _group = noone, record = true, check_connect = true) { #region
2023-02-14 05:32:32 +01:00
UNDO_HOLDING = true;
if(_group == noone) {
var cx = 0;
var cy = 0;
for(var i = 0; i < array_length(nodeArray); i++) {
var _node = nodeArray[i];
cx += _node.x;
cy += _node.y;
}
cx = round(cx / array_length(nodeArray) / 32) * 32;
cy = round(cy / array_length(nodeArray) / 32) * 32;
_group = new Node_Group(cx, cy, PANEL_GRAPH.getCurrentContext());
}
var _content = [];
for(var i = 0; i < array_length(nodeArray); i++) {
_group.add(nodeArray[i]);
_content[i] = nodeArray[i];
}
var _io = [];
if(check_connect)
for(var i = 0; i < array_length(nodeArray); i++)
array_append(_io, nodeArray[i].checkConnectGroup());
UNDO_HOLDING = false;
if(record) recordAction(ACTION_TYPE.group, _group, { io: _io, content: _content });
return _group;
2023-10-10 07:12:42 +02:00
} #endregion
2023-02-14 05:32:32 +01:00
2023-10-10 07:12:42 +02:00
function upgroupNode(collection, record = true) { #region
2023-02-14 05:32:32 +01:00
UNDO_HOLDING = true;
var _content = [];
var _io = [];
2023-02-28 09:43:01 +01:00
var node_list = collection.getNodeList();
while(!ds_list_empty(node_list)) {
var remNode = node_list[| 0];
2023-02-14 05:32:32 +01:00
if(remNode.destroy_when_upgroup)
array_push(_io, remNode);
else
array_push(_content, remNode);
collection.remove(remNode);
}
nodeDelete(collection);
UNDO_HOLDING = false;
if(record) recordAction(ACTION_TYPE.ungroup, collection, { io: _io, content: _content });
2023-10-10 07:12:42 +02:00
} #endregion
2023-02-14 05:32:32 +01:00
2023-10-10 07:12:42 +02:00
function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
2022-01-13 05:24:03 +01:00
nodes = ds_list_create();
2023-07-17 19:58:33 +02:00
ungroupable = true;
auto_render_time = false;
2023-02-19 13:49:20 +01:00
combine_render_time = true;
2023-11-08 08:38:04 +01:00
previewable = true;
w = 128;
h = 128;
min_h = 128;
2022-01-13 05:24:03 +01:00
2023-06-01 10:32:21 +02:00
reset_all_child = false;
2023-07-17 19:58:33 +02:00
isInstancer = false;
instanceBase = noone;
2023-02-28 09:43:01 +01:00
2023-10-07 09:09:18 +02:00
input_display_list_def = [];
2023-11-02 14:37:13 +01:00
custom_input_index = 0;
custom_output_index = 0;
2022-01-23 04:08:16 +01:00
2023-02-14 05:32:32 +01:00
metadata = new MetaDataManager();
2023-06-13 14:42:06 +02:00
attributes.separator = [];
attributes.w = 128;
attributes.h = 128;
2023-03-08 07:35:51 +01:00
2023-11-02 14:37:13 +01:00
managedRenderOrder = false;
2023-10-07 09:09:18 +02:00
input_dummy = nodeValue("Add to group", self, JUNCTION_CONNECT.input, VALUE_TYPE.any, 0);
draw_dummy = false;
input_dummy.onSetFrom = function(juncFrom) { #region
2023-10-07 09:09:18 +02:00
ds_list_remove(juncFrom.value_to, input_dummy);
input_dummy.value_from = noone;
var input = nodeBuild("Node_Group_Input", 0, 0, self);
var _type = juncFrom.type;
var _tind = array_find(input.data_type_map, juncFrom.type);
input.attributes.inherit_type = false;
if(_tind != -1)
input.inputs[| 2].setValue(_tind);
input.inParent.setFrom(juncFrom);
2023-10-08 04:14:35 +02:00
if(onNewInputFromGraph != noone) onNewInputFromGraph(juncFrom);
} #endregion
2023-10-07 09:09:18 +02:00
2023-10-08 04:14:35 +02:00
onNewInputFromGraph = noone;
2023-07-17 19:58:33 +02:00
tool_node = noone;
2023-09-11 16:08:58 +02:00
draw_input_overlay = true;
2023-07-17 19:58:33 +02:00
2023-10-20 12:32:43 +02:00
array_push(attributeEditors, ["Edit Input Display", function() { return attributes.separator; },
2023-03-19 09:17:39 +01:00
button(function() {
var dia = dialogCall(o_dialog_group_input_order);
2023-10-20 12:32:43 +02:00
dia.setNode(self);
}) ]);
array_push(attributeEditors, ["Edit Output Display", function() { return attributes.separator; },
button(function() {
var dia = dialogCall(o_dialog_group_output_order);
dia.setNode(self);
2023-03-19 09:17:39 +01:00
}) ]);
2023-06-04 18:28:29 +02:00
insp1UpdateTooltip = __txtx("panel_inspector_execute", "Execute node contents");
2023-03-28 06:58:28 +02:00
insp1UpdateIcon = [ THEME.sequence_control, 1, COLORS._main_value_positive ];
2023-03-02 07:59:14 +01:00
insp2UpdateTooltip = "Clear cache";
insp2UpdateIcon = [ THEME.cache, 0, COLORS._main_icon ];
2023-03-28 06:58:28 +02:00
static inspector1Update = function() { onInspector1Update(); }
static onInspector1Update = function() { RenderListAction(nodes, group); }
static hasInspector1Update = function(group = false) { #region
2023-03-02 07:59:14 +01:00
for( var i = 0; i < ds_list_size(nodes); i++ ) {
2023-03-28 06:58:28 +02:00
if(nodes[| i].hasInspector1Update())
2023-03-02 07:59:14 +01:00
return true;
}
return false;
} #endregion
2023-03-02 07:59:14 +01:00
static inspector2Update = function() { onInspector2Update(); }
static onInspector2Update = function() { #region
for( var i = 0; i < ds_list_size(nodes); i++ ) {
if(nodes[| i].hasInspector2Update())
nodes[| i].inspector2Update();
}
} #endregion
static hasInspector2Update = function(group = false) { #region
for( var i = 0; i < ds_list_size(nodes); i++ ) {
if(nodes[| i].hasInspector2Update())
return true;
}
return false;
} #endregion
static getNodeBase = function() { #region
2023-02-28 09:43:01 +01:00
if(instanceBase == noone) return self;
return instanceBase.getNodeBase();
} #endregion
2023-02-28 09:43:01 +01:00
static getNodeList = function() { #region
2023-11-08 08:38:04 +01:00
INLINE
2023-02-28 09:43:01 +01:00
if(instanceBase == noone) return nodes;
return instanceBase.getNodeList();
} #endregion
2023-02-28 09:43:01 +01:00
static setHeight = function() { #region
2023-03-11 01:40:17 +01:00
var _hi = ui(32);
var _ho = ui(32);
for( var i = 0; i < ds_list_size(inputs); i++ )
if(inputs[| i].isVisible()) _hi += 24;
2023-10-07 09:09:18 +02:00
if(active_draw_index == 1) _hi += 24;
draw_dummy = active_draw_index == 1;
2023-03-11 01:40:17 +01:00
for( var i = 0; i < ds_list_size(outputs); i++ )
if(outputs[| i].isVisible()) _ho += 24;
var preH = (preview_surface && previewable)? 128 : 0;
h = max(min_h, preH, _hi, _ho);
} #endregion
2023-03-11 01:40:17 +01:00
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
2023-09-11 16:08:58 +02:00
if(!draw_input_overlay) return;
2023-10-09 16:07:33 +02:00
2023-01-01 02:06:02 +01:00
for(var i = custom_input_index; i < ds_list_size(inputs); i++) {
2023-03-11 01:40:17 +01:00
var _in = inputs[| i];
var _show = _in.from.getInputData(6);
2023-01-01 02:06:02 +01:00
if(!_show) continue;
2023-10-09 16:07:33 +02:00
var _hov = _in.drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
if(_hov != undefined) active &= !_hov;
2023-01-01 02:06:02 +01:00
}
} #endregion
2023-01-01 02:06:02 +01:00
static getOutputNodes = function() { #region
2023-06-13 14:42:06 +02:00
var nodes = [];
for( var i = custom_output_index; i < ds_list_size(outputs); i++ ) {
var _junc = outputs[| i];
for( var j = 0; j < ds_list_size(_junc.value_to); j++ ) {
var _to = _junc.value_to[| j];
if(_to.value_from != _junc) continue;
array_push_unique(nodes, _to.node);
}
}
return nodes;
} #endregion
2023-06-13 14:42:06 +02:00
2023-10-07 09:09:18 +02:00
static getInput = function(junc = noone) { #region
return input_dummy;
} #endregion
2023-10-10 07:12:42 +02:00
static getNextNodes = function() { return getNextNodesInternal(); }
static getNextNodesInternal = function() { #region //get node inside the group
LOG_BLOCK_START();
LOG_IF(global.FLAG.render == 1, $"→→→→→ Call get next node from group: {INAME}");
2023-06-01 10:32:21 +02:00
2023-06-13 14:42:06 +02:00
var nodes = [];
2023-06-17 14:30:49 +02:00
if(isRenderActive()) {
2023-06-13 14:42:06 +02:00
var allReady = true;
for(var i = custom_input_index; i < ds_list_size(inputs); i++) {
var _in = inputs[| i].from;
2023-06-17 14:30:49 +02:00
if(!_in.isRenderActive()) continue;
2022-12-16 09:18:09 +01:00
2023-06-13 14:42:06 +02:00
if(!_in.isRenderable()) {
LOG_IF(global.FLAG.render == 1, $"Node {_in.internalName} not ready, loop skip.");
2023-06-13 14:42:06 +02:00
LOG_BLOCK_END();
return [];
}
2023-06-01 10:32:21 +02:00
}
2023-06-13 14:42:06 +02:00
nodes = __nodeLeafList(getNodeList());
2022-12-16 09:18:09 +01:00
}
2023-03-28 06:58:28 +02:00
LOG_BLOCK_END();
2023-03-28 06:58:28 +02:00
return nodes;
} #endregion
2022-12-16 09:18:09 +01:00
static getNextNodesExternal = function() { #region //get node connected to the parent object
LOG_IF(global.FLAG.render == 1, $"Checking next node external for {INAME}");
2023-07-28 19:41:57 +02:00
LOG_BLOCK_START();
2023-06-01 10:32:21 +02:00
var nodes = [];
for( var i = 0; i < ds_list_size(outputs); i++ ) {
var _ot = outputs[| i];
2023-10-19 11:34:29 +02:00
if(!_ot.forward) continue;
if(_ot.type == VALUE_TYPE.node) continue;
2023-07-28 19:41:57 +02:00
var _tos = _ot.getJunctionTo();
for( var j = 0, n = array_length(_tos); j < n; j++ ) {
var _to = _tos[j];
2023-06-01 10:32:21 +02:00
var _node = _to.node;
LOG_IF(global.FLAG.render == 1, $"Checking node {_node.internalName} : {_node.isRenderable()}");
2023-10-10 07:12:42 +02:00
if(!_node.isRenderable()) continue;
2023-06-01 10:32:21 +02:00
2023-07-28 19:41:57 +02:00
array_push(nodes, _to.node);
2023-06-01 10:32:21 +02:00
}
}
2023-07-28 19:41:57 +02:00
LOG_BLOCK_END();
2023-06-01 10:32:21 +02:00
return nodes;
} #endregion
2023-06-01 10:32:21 +02:00
static setRenderStatus = function(result) { #region
LOG_BLOCK_START();
2023-10-08 08:02:38 +02:00
if(rendered == result) return;
LOG_IF(global.FLAG.render == 1, $"Set render status for {INAME} : {result}");
2022-12-12 09:08:03 +01:00
rendered = result;
2023-07-28 19:41:57 +02:00
if(result)
for( var i = custom_output_index, n = ds_list_size(outputs); i < n; i++ ) {
var _o = outputs[| i];
if(_o.from.rendered) continue;
2022-12-16 09:18:09 +01:00
LOG_IF(global.FLAG.render == 1, $"Set fail because {_o.from.internalName} is not rendered.");
2023-07-28 19:41:57 +02:00
rendered = false;
break;
2022-12-12 09:08:03 +01:00
}
2023-04-09 21:24:16 +02:00
2023-10-08 08:02:38 +02:00
if(rendered) exitGroup();
2023-04-09 21:24:16 +02:00
2023-02-28 09:43:01 +01:00
if(!result && group != noone)
2022-12-12 09:08:03 +01:00
group.setRenderStatus(result);
2023-07-28 19:41:57 +02:00
LOG_BLOCK_END();
} #endregion
2022-12-12 09:08:03 +01:00
static isActiveDynamic = function(frame = CURRENT_FRAME) { #region
if(update_on_frame) return true;
2023-11-26 13:16:38 +01:00
for( var i = custom_input_index, n = ds_list_size(inputs); i < n; i++ )
if(inputs[| i].isActiveDynamic(frame) || !inputs[| i].from.rendered) return true;
return false;
} #endregion
2023-04-09 21:24:16 +02:00
static exitGroup = function() {}
static add = function(_node) { #region
2023-02-28 09:43:01 +01:00
ds_list_add(getNodeList(), _node);
var list = _node.group == noone? PANEL_GRAPH.nodes_list : _node.group.getNodeList();
2023-11-08 08:38:04 +01:00
ds_list_remove(list, _node);
2022-01-13 05:24:03 +01:00
recordAction(ACTION_TYPE.group_added, self, _node);
_node.group = self;
} #endregion
2022-01-13 05:24:03 +01:00
static remove = function(_node) { #region
2023-02-28 09:43:01 +01:00
var node_list = getNodeList();
var _pos = ds_list_find_index(node_list, _node);
ds_list_delete(node_list, _pos);
var list = group == noone? PANEL_GRAPH.nodes_list : group.getNodeList();
2022-01-13 05:24:03 +01:00
ds_list_add(list, _node);
recordAction(ACTION_TYPE.group_removed, self, _node);
2022-01-29 14:25:18 +01:00
2023-02-14 05:32:32 +01:00
if(struct_has(_node, "ungroup"))
_node.ungroup();
if(_node.destroy_when_upgroup)
nodeDelete(_node);
else
_node.group = group;
} #endregion
2022-01-13 05:24:03 +01:00
static clearCache = function() { #region
2023-02-28 09:43:01 +01:00
var node_list = getNodeList();
for(var i = 0; i < ds_list_size(node_list); i++) {
node_list[| i].clearCache();
2022-12-10 05:06:01 +01:00
}
} #endregion
2022-12-10 05:06:01 +01:00
static stepBegin = function() { doStepBegin(); }
2022-01-13 05:24:03 +01:00
static step = function() { #region
2023-11-08 08:38:04 +01:00
if(combine_render_time) {
render_time = 0;
var node_list = getNodeList();
for(var i = 0; i < ds_list_size(node_list); i++)
2023-02-28 09:43:01 +01:00
render_time += node_list[| i].render_time;
2022-01-13 05:24:03 +01:00
}
2023-06-13 14:42:06 +02:00
w = attributes.w;
2023-03-11 01:40:17 +01:00
2022-12-16 09:18:09 +01:00
onStep();
} #endregion
2022-01-13 05:24:03 +01:00
2022-12-16 09:18:09 +01:00
static onStep = function() {}
2023-10-07 09:09:18 +02:00
static onPreDraw = function(_x, _y, _s, _iny, _outy) { #region
var xx = x * _s + _x;
var yy = y * _s + _y;
input_dummy.x = xx;
input_dummy.y = _iny;
} #endregion
static preConnect = function() { #region
2022-01-18 05:31:19 +01:00
sortIO();
2022-12-12 09:08:03 +01:00
deserialize(load_map, load_scale);
} #endregion
2022-01-13 05:24:03 +01:00
2023-10-07 09:09:18 +02:00
static onDrawJunctions = function(_x, _y, _mx, _my, _s) { #region
input_dummy.visible = false;
2023-03-08 07:35:51 +01:00
2023-10-07 09:09:18 +02:00
if(draw_dummy) {
input_dummy.visible = true;
input_dummy.drawJunction(_s, _mx, _my);
}
draw_dummy = false;
} #endregion
2023-10-20 12:32:43 +02:00
static getListFreeOrder = function(list) { #region
var _or = 0;
var _ors = [];
2023-10-18 14:58:55 +02:00
2023-10-28 04:07:43 +02:00
for( var i = 0, n = ds_list_size(nodes); i < n; i++ ) {
var _n = nodes[| i];
if(!struct_has(_n.attributes, "input_priority")) continue;
array_push(_ors, _n.attributes.input_priority);
2023-10-18 14:58:55 +02:00
}
2023-10-20 12:32:43 +02:00
array_sort(_ors, true);
for( var i = 0, n = array_length(_ors); i < n; i++ )
if(_or == _ors[i]) _or++;
return _or;
2023-10-18 14:58:55 +02:00
} #endregion
2023-10-20 12:32:43 +02:00
static getInputFreeOrder = function() { return getListFreeOrder(inputs); }
static getOutputFreeOrder = function() { return getListFreeOrder(outputs); }
2023-10-07 09:09:18 +02:00
static sortIO = function() { #region
2023-10-20 12:32:43 +02:00
var sep = attributes.separator;
var siz = ds_list_size(inputs);
var ar = ds_priority_create();
var _ors = {};
var _dup = false;
2023-10-18 14:58:55 +02:00
2023-03-08 07:35:51 +01:00
array_sort(sep, function(a0, a1) { return a0[0] - a1[0]; });
2022-01-18 05:31:19 +01:00
2022-01-23 04:08:16 +01:00
for( var i = custom_input_index; i < siz; i++ ) {
2022-01-18 05:31:19 +01:00
var _in = inputs[| i];
2023-09-11 16:08:58 +02:00
var _or = _in.from.attributes.input_priority;
2023-10-20 12:32:43 +02:00
if(struct_has(_ors, _or)) _dup = true;
_ors[$ _or] = 1;
2022-01-18 05:31:19 +01:00
ds_priority_add(ar, _in, _or);
}
2023-03-08 07:35:51 +01:00
for( var i = siz - 1; i >= custom_input_index; i-- )
2022-01-23 04:08:16 +01:00
ds_list_delete(inputs, i);
2023-10-07 09:09:18 +02:00
if(array_empty(input_display_list_def)) {
input_display_list = [];
for( var i = 0; i < custom_input_index; i++ )
array_push(input_display_list, i);
} else {
input_display_list = array_clone(input_display_list_def);
}
2022-01-23 04:08:16 +01:00
for( var i = custom_input_index; i < siz; i++ ) {
2022-01-18 05:31:19 +01:00
var _jin = ds_priority_delete_min(ar);
_jin.index = i;
ds_list_add(inputs, _jin);
2023-03-08 07:35:51 +01:00
array_push(input_display_list, i);
}
2023-10-07 09:09:18 +02:00
for( var i = array_length(sep) - 1; i >= 0; i-- )
array_insert(input_display_list, array_length(input_display_list_def) + sep[i][0], [ sep[i][1], false, i ]);
2022-01-18 05:31:19 +01:00
ds_priority_destroy(ar);
2023-10-20 12:32:43 +02:00
output_display_list = [];
var siz = ds_list_size(outputs);
var ar = ds_priority_create();
var _dup = false;
2022-01-18 05:31:19 +01:00
2022-01-23 04:08:16 +01:00
for( var i = custom_output_index; i < siz; i++ ) {
2022-01-18 05:31:19 +01:00
var _out = outputs[| i];
2023-09-11 16:08:58 +02:00
var _or = _out.from.attributes.input_priority;
2022-01-18 05:31:19 +01:00
ds_priority_add(ar, _out, _or);
}
2023-10-20 12:32:43 +02:00
for( var i = siz - 1; i >= custom_output_index; i-- )
2022-01-23 04:08:16 +01:00
ds_list_delete(outputs, i);
for( var i = 0; i < siz; i++ )
array_push(output_display_list, i);
2022-01-23 04:08:16 +01:00
for( var i = custom_output_index; i < siz; i++ ) {
2022-01-18 05:31:19 +01:00
var _jout = ds_priority_delete_min(ar);
_jout.index = i;
ds_list_add(outputs, _jout);
}
ds_priority_destroy(ar);
2023-11-08 08:38:04 +01:00
setHeight();
} #endregion
2022-01-19 03:51:53 +01:00
2023-10-10 07:12:42 +02:00
static getTool = function() { #region
for(var i = 0; i < ds_list_size(nodes); i++) {
2023-07-17 19:58:33 +02:00
var _node = nodes[| i];
if(_node.isTool) return _node.getTool();
}
return self;
} #endregion
2023-07-17 19:58:33 +02:00
static onClone = function(_newNode, target = PANEL_GRAPH.getCurrentContext()) { #region
2023-02-28 09:43:01 +01:00
if(instanceBase != noone) {
_newNode.instanceBase = instanceBase;
return;
}
2023-02-14 05:32:32 +01:00
var dups = ds_list_create();
for(var i = 0; i < ds_list_size(nodes); i++) {
var _node = nodes[| i];
var _cnode = _node.clone(target);
ds_list_add(dups, _cnode);
APPEND_MAP[? _node.node_id] = _cnode.node_id;
2022-01-19 03:51:53 +01:00
}
2023-02-14 05:32:32 +01:00
APPENDING = true;
for(var i = 0; i < ds_list_size(dups); i++) {
var _node = dups[| i];
_node.connect();
}
APPENDING = false;
ds_list_destroy(dups);
} #endregion
2023-02-14 05:32:32 +01:00
static enable = function() { #region
2023-02-14 05:32:32 +01:00
active = true;
2023-02-28 09:43:01 +01:00
var node_list = getNodeList();
for( var i = 0; i < ds_list_size(node_list); i++ )
node_list[| i].enable();
} #endregion
2023-02-14 05:32:32 +01:00
static disable = function() { #region
2023-02-14 05:32:32 +01:00
active = false;
2023-02-28 09:43:01 +01:00
var node_list = getNodeList();
for( var i = 0; i < ds_list_size(node_list); i++ )
node_list[| i].disable();
} #endregion
2023-10-08 08:02:38 +02:00
static resetRender = function(_clearCache = false) { #region
LOG_LINE_IF(global.FLAG.render == 1, $"Reset Render for {INAME}");
2023-06-01 10:32:21 +02:00
setRenderStatus(false);
2023-10-08 08:02:38 +02:00
if(_clearCache) clearInputCache();
2023-10-08 08:02:38 +02:00
for( var i = 0; i < ds_list_size(nodes); i++ )
nodes[| i].resetRender(_clearCache);
} #endregion
2022-12-21 02:30:23 +01:00
static setInstance = function(node) { #region
2023-02-28 09:43:01 +01:00
instanceBase = node;
} #endregion
2023-02-28 09:43:01 +01:00
static resetInstance = function() { #region
2023-02-28 09:43:01 +01:00
instanceBase = noone;
} #endregion
2023-02-28 09:43:01 +01:00
static onDoubleClick = function(panel) { #region
2023-11-10 11:32:46 +01:00
__temp_panel = panel;
if(PREFERENCES.graph_open_group_in_tab)
run_in(1, function() { __temp_panel.openGroupTab(self) });
else
panel.addContext(self);
2023-10-09 16:07:33 +02:00
if(ononDoubleClick != noone)
ononDoubleClick(panel);
} #endregion
2023-07-15 20:01:29 +02:00
2023-10-09 16:07:33 +02:00
static ononDoubleClick = noone;
2023-10-06 11:51:11 +02:00
static getGraphPreviewSurface = function() { #region
var _output_junc = outputs[| preview_channel];
2023-11-23 02:32:26 +01:00
2023-10-06 11:51:11 +02:00
for( var i = 0, n = ds_list_size(nodes); i < n; i++ ) {
if(!nodes[| i].active) continue;
if(is_instanceof(nodes[| i], Node_Group_Thumbnail))
_output_junc = nodes[| i].inputs[| 0];
}
2023-10-07 09:09:18 +02:00
if(!is_instanceof(_output_junc, NodeValue)) return noone;
2023-10-06 11:51:11 +02:00
switch(_output_junc.type) {
case VALUE_TYPE.surface :
case VALUE_TYPE.dynaSurface :
return _output_junc.getValue();
}
return noone;
} #endregion
static enable = function() { #region
active = true; timeline_item.active = true;
for( var i = 0, n = ds_list_size(nodes); i < n; i++ ) nodes[| i].enable();
} #endregion
static disable = function() { #region
active = false; timeline_item.active = false;
for( var i = 0, n = ds_list_size(nodes); i < n; i++ ) nodes[| i].disable();
} #endregion
static processSerialize = function(_map) { #region
2023-02-28 09:43:01 +01:00
_map[? "instance_base"] = instanceBase? instanceBase.node_id : noone;
} #endregion
2023-02-28 09:43:01 +01:00
static preConnect = function() { #region
2023-06-13 14:42:06 +02:00
instanceBase = GetAppendID(struct_try_get(load_map, "instance_base", noone));
2023-02-28 09:43:01 +01:00
2022-12-21 02:30:23 +01:00
sortIO();
2023-01-17 08:11:55 +01:00
applyDeserialize();
} #endregion
2023-03-08 07:35:51 +01:00
static attributeSerialize = function() { #region
var att = variable_clone(attributes);
2023-06-13 14:42:06 +02:00
att.separator = json_stringify(attributes.separator);
2023-03-08 07:35:51 +01:00
return att;
} #endregion
2023-03-08 07:35:51 +01:00
static attributeDeserialize = function(attr) { #region
2023-11-02 12:43:00 +01:00
struct_override(attributes, attr);
2023-06-13 14:42:06 +02:00
if(struct_has(attr, "separator"))
attributes.separator = json_parse(attr.separator);
} #endregion
2023-03-08 07:35:51 +01:00
2022-01-13 05:24:03 +01:00
}