Pixel-Composer/scripts/node_iterate_inline/node_iterate_inline.gml

108 lines
2.8 KiB
Text
Raw Normal View History

2023-12-19 14:30:34 +01:00
function Node_Iterate_Inline(_x, _y, _group = noone) : Node_Collection_Inline(_x, _y, _group) constructor {
2023-12-20 14:02:49 +01:00
name = "Loop";
color = COLORS.node_blend_loop;
icon = THEME.loop;
icon_24 = THEME.loop_24;
2023-12-19 14:30:34 +01:00
2023-12-22 04:15:04 +01:00
is_root = false;
2024-08-18 09:13:41 +02:00
newInput(0, nodeValue_Int("Repeat", self, 1 ))
2023-12-19 14:30:34 +01:00
.uncache();
managedRenderOrder = true;
attributes.junc_in = [ "", 0 ];
attributes.junc_out = [ "", 0 ];
junc_in = noone;
junc_out = noone;
value_buffer = undefined;
iterated = 0;
static getIterationCount = function() { return getInputData(0); }
2024-08-08 06:57:51 +02:00
static bypassConnection = function() { return iterated > 0 && !is_undefined(value_buffer); }
static bypassNextNode = function() { return iterated < getIterationCount(); }
2023-12-19 14:30:34 +01:00
2024-08-08 06:57:51 +02:00
static getNextNodes = function() {
2023-12-19 14:30:34 +01:00
LOG_BLOCK_START();
LOG_IF(global.FLAG.render == 1, "[outputNextNode] Get next node from inline iterate");
resetRender();
LOG_IF(global.FLAG.render == 1, $"Loop restart: iteration {iterated}");
var _nodes = __nodeLeafList(nodes);
array_push_unique(_nodes, junc_in.node);
iterated++;
LOG_BLOCK_END();
return _nodes;
2024-08-08 06:57:51 +02:00
}
2023-12-19 14:30:34 +01:00
static connectJunctions = function(jFrom, jTo) {
junc_in = jFrom.is_dummy? jFrom.dummy_get() : jFrom;
junc_out = jTo;
attributes.junc_in = [ junc_in .node.node_id, junc_in .index ];
attributes.junc_out = [ junc_out.node.node_id, junc_out.index ];
}
2024-08-08 06:57:51 +02:00
static scanJunc = function() {
2023-12-19 14:30:34 +01:00
var node_in = PROJECT.nodeMap[? attributes.junc_in[0]];
var node_out = PROJECT.nodeMap[? attributes.junc_out[0]];
2024-08-08 06:57:51 +02:00
junc_in = node_in? node_in.inputs[attributes.junc_in[1]] : noone;
junc_out = node_out? node_out.outputs[attributes.junc_out[1]] : noone;
2023-12-19 14:30:34 +01:00
if(junc_in) { junc_in.value_from_loop = self; addNode(junc_in.node); }
if(junc_out) { array_push(junc_out.value_to_loop, self); addNode(junc_out.node); }
2024-08-08 06:57:51 +02:00
}
2023-12-19 14:30:34 +01:00
2024-08-08 06:57:51 +02:00
static updateValue = function() {
2023-12-19 14:30:34 +01:00
var type = junc_out.type;
var val = junc_out.getValue();
switch(type) {
case VALUE_TYPE.surface :
surface_array_free(value_buffer);
value_buffer = surface_array_clone(val);
break;
2024-08-08 06:57:51 +02:00
2023-12-19 14:30:34 +01:00
default :
value_buffer = variable_clone(val);
break;
}
2024-08-08 06:57:51 +02:00
}
2023-12-19 14:30:34 +01:00
2024-08-08 06:57:51 +02:00
static getValue = function(arr) {
2024-04-01 11:10:01 +02:00
INLINE
arr[@ 0] = value_buffer;
arr[@ 1] = junc_out;
2024-08-08 06:57:51 +02:00
}
2023-12-19 14:30:34 +01:00
2024-08-08 06:57:51 +02:00
static update = function() {
iteration_count = inputs[0].getValue();
2023-12-19 14:30:34 +01:00
iterated = 0;
value_buffer = undefined;
2024-08-08 06:57:51 +02:00
}
2023-12-19 14:30:34 +01:00
2024-08-08 06:57:51 +02:00
static drawConnections = function(params = {}) {
if(!active) return noone;
if(!junc_in || !junc_out) return noone;
if(!junc_in.node.active || !junc_out.node.active) return noone;
2023-12-19 14:30:34 +01:00
drawJuncConnection(junc_out, junc_in, params);
return noone;
2024-08-08 06:57:51 +02:00
}
2023-12-19 14:30:34 +01:00
2024-08-08 06:57:51 +02:00
static postDeserialize = function() {
2023-12-19 14:30:34 +01:00
refreshMember();
scanJunc();
2024-08-08 06:57:51 +02:00
}
2023-12-19 14:30:34 +01:00
2024-08-08 06:57:51 +02:00
static onDestroy = function() {
2023-12-19 14:30:34 +01:00
if(junc_in) junc_in.value_from_loop = noone;
if(junc_out) array_remove(junc_out.value_to_loop, self);
2024-08-08 06:57:51 +02:00
}
2023-12-19 14:30:34 +01:00
}