mirror of
https://github.com/Ttanasart-pt/Pixel-Composer.git
synced 2025-02-15 14:45:12 +01:00
Fix auto-update node not working in group.
This commit is contained in:
parent
8ae0dc2a57
commit
2af707f36f
5 changed files with 24 additions and 44 deletions
|
@ -25,12 +25,7 @@ function Node_VFX_Group_Inline(_x, _y, _group = noone) : Node_Collection_Inline(
|
||||||
addNode(output);
|
addNode(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
static clearTopoSorted = function() { INLINE topoSorted = false; prev_nodes = []; }
|
static getPreviousNodes = function() { onGetPreviousNodes(prev_nodes); return prev_nodes; }
|
||||||
|
|
||||||
static getPreviousNodes = function() {
|
|
||||||
onGetPreviousNodes(prev_nodes);
|
|
||||||
return prev_nodes;
|
|
||||||
}
|
|
||||||
|
|
||||||
static onRemoveNode = function(node) { node.in_VFX = noone; }
|
static onRemoveNode = function(node) { node.in_VFX = noone; }
|
||||||
static onAddNode = function(node) { node.in_VFX = self; }
|
static onAddNode = function(node) { node.in_VFX = self; }
|
||||||
|
|
|
@ -480,8 +480,6 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc
|
||||||
return nextNodes;
|
return nextNodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
static clearTopoSorted = function() { INLINE topoSorted = false; for( var i = 0, n = array_length(nodes); i < n; i++ ) { nodes[i].clearTopoSorted(); } }
|
|
||||||
|
|
||||||
static setRenderStatus = function(result) {
|
static setRenderStatus = function(result) {
|
||||||
LOG_BLOCK_START();
|
LOG_BLOCK_START();
|
||||||
LOG_IF(global.FLAG.render == 1, $"Set render status for {INAME} : {result}");
|
LOG_IF(global.FLAG.render == 1, $"Set render status for {INAME} : {result}");
|
||||||
|
|
|
@ -279,7 +279,6 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
|
||||||
auto_render_time = true;
|
auto_render_time = true;
|
||||||
updated = false;
|
updated = false;
|
||||||
passiveDynamic = false;
|
passiveDynamic = false;
|
||||||
topoSorted = false;
|
|
||||||
temp_surface = [];
|
temp_surface = [];
|
||||||
force_requeue = false;
|
force_requeue = false;
|
||||||
|
|
||||||
|
@ -1147,8 +1146,6 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
|
||||||
LOG_BLOCK_END();
|
LOG_BLOCK_END();
|
||||||
}
|
}
|
||||||
|
|
||||||
static clearTopoSorted = function() { INLINE topoSorted = false; }
|
|
||||||
|
|
||||||
static forwardPassiveDynamic = function() {
|
static forwardPassiveDynamic = function() {
|
||||||
rendered = false;
|
rendered = false;
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,6 @@ function Node_Group_Output(_x, _y, _group = noone) : Node(_x, _y, _group) constr
|
||||||
static createOutput = function() {
|
static createOutput = function() {
|
||||||
if(group == noone) return;
|
if(group == noone) return;
|
||||||
if(!is_struct(group)) return;
|
if(!is_struct(group)) return;
|
||||||
|
|
||||||
if(!is_undefined(outParent)) array_remove(group.outputs, outParent);
|
if(!is_undefined(outParent)) array_remove(group.outputs, outParent);
|
||||||
|
|
||||||
outParent = nodeValue("Value", group, CONNECT_TYPE.output, VALUE_TYPE.any, -1)
|
outParent = nodeValue("Value", group, CONNECT_TYPE.output, VALUE_TYPE.any, -1)
|
||||||
|
@ -76,7 +75,6 @@ function Node_Group_Output(_x, _y, _group = noone) : Node(_x, _y, _group) constr
|
||||||
|
|
||||||
static step = function() {
|
static step = function() {
|
||||||
if(is_undefined(outParent)) return;
|
if(is_undefined(outParent)) return;
|
||||||
|
|
||||||
outParent.name = display_name;
|
outParent.name = display_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,6 +88,10 @@ function Node_Group_Output(_x, _y, _group = noone) : Node(_x, _y, _group) constr
|
||||||
_in0.display_type = _dis;
|
_in0.display_type = _dis;
|
||||||
if(!is(outParent, NodeValue)) return;
|
if(!is(outParent, NodeValue)) return;
|
||||||
|
|
||||||
|
var ww = _typ == VALUE_TYPE.surface? 128 : 96;
|
||||||
|
var hh = _typ == VALUE_TYPE.surface? 128 : 56;
|
||||||
|
setDimension(ww, hh);
|
||||||
|
|
||||||
outParent.setType(_in0.type);
|
outParent.setType(_in0.type);
|
||||||
outParent.display_type = _in0.display_type;
|
outParent.display_type = _in0.display_type;
|
||||||
outParent.color_display = _in0.color_display;
|
outParent.color_display = _in0.color_display;
|
||||||
|
|
|
@ -38,40 +38,32 @@ function NodeTopoSort() {
|
||||||
var amo = array_length(PROJECT.allNodes);
|
var amo = array_length(PROJECT.allNodes);
|
||||||
var _t = get_timer();
|
var _t = get_timer();
|
||||||
|
|
||||||
array_foreach(PROJECT.allNodes, function(_node) {
|
array_foreach(PROJECT.allNodes, function(n) /*=>*/ { if(is(n, Node_Collection)) n.refreshNodes(); });
|
||||||
_node.clearTopoSorted();
|
|
||||||
if(is(_node, Node_Collection)) _node.refreshNodes();
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
PROJECT.nodeTopo = [];
|
PROJECT.nodeTopo = [];
|
||||||
PROJECT.renderList = [];
|
PROJECT.renderList = [];
|
||||||
PROJECT.useRenderList = true;
|
PROJECT.useRenderList = true;
|
||||||
__topoSort(PROJECT.nodeTopo, PROJECT.nodes);
|
__topoSort(PROJECT.nodeTopo, PROJECT.nodes);
|
||||||
|
|
||||||
|
// print(PROJECT.nodeTopo);
|
||||||
LOG_IF(global.FLAG.render == 1, $"+++++++ Topo Sort Completed: {array_length(PROJECT.nodeTopo)}/{amo} nodes sorted in {(get_timer() - _t) / 1000} ms +++++++");
|
LOG_IF(global.FLAG.render == 1, $"+++++++ Topo Sort Completed: {array_length(PROJECT.nodeTopo)}/{amo} nodes sorted in {(get_timer() - _t) / 1000} ms +++++++");
|
||||||
}
|
}
|
||||||
|
|
||||||
function NodeListSort(_nodeList) {
|
function NodeListSort(_nodeList) {
|
||||||
array_foreach(_nodeList, function(node) {
|
|
||||||
node.clearTopoSorted();
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
var _arr = [];
|
var _arr = [];
|
||||||
__topoSort(_arr, _nodeList);
|
__topoSort(_arr, _nodeList);
|
||||||
return _arr;
|
return _arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
function __sortNode(_arr, _node) {
|
function __sortNode(_arr, _node, _sorted) {
|
||||||
if(_node.topoSorted) return;
|
if(struct_has(_sorted, _node.node_id)) return;
|
||||||
|
|
||||||
var _parents = [];
|
var _parents = [];
|
||||||
var _prev = _node.getPreviousNodes();
|
var _prev = _node.getPreviousNodes();
|
||||||
|
|
||||||
for( var i = 0, n = array_length(_prev); i < n; i++ ) {
|
for( var i = 0, n = array_length(_prev); i < n; i++ ) {
|
||||||
var _in = _prev[i];
|
var _in = _prev[i];
|
||||||
if(_in == noone || _in.topoSorted) continue;
|
if(_in == noone || struct_has(_sorted, _in.node_id)) continue;
|
||||||
|
|
||||||
array_push(_parents, _in);
|
array_push(_parents, _in);
|
||||||
}
|
}
|
||||||
|
@ -79,21 +71,20 @@ function __sortNode(_arr, _node) {
|
||||||
// print($" > Checking {_node.name}: {array_length(_parents)}");
|
// print($" > Checking {_node.name}: {array_length(_parents)}");
|
||||||
|
|
||||||
if(is_instanceof(_node, Node_Collection) && !_node.managedRenderOrder)
|
if(is_instanceof(_node, Node_Collection) && !_node.managedRenderOrder)
|
||||||
__topoSort(_arr, _node.nodes);
|
__topoSort(_arr, _node.nodes, _sorted);
|
||||||
|
|
||||||
for( var i = 0, n = array_length(_parents); i < n; i++ )
|
for( var i = 0, n = array_length(_parents); i < n; i++ )
|
||||||
__sortNode(_arr, _parents[i]);
|
__sortNode(_arr, _parents[i], _sorted);
|
||||||
|
|
||||||
if(!_node.topoSorted) {
|
if(struct_has(_sorted, _node.node_id)) return;
|
||||||
array_push(_arr, _node);
|
array_push(_arr, _node);
|
||||||
_node.topoSorted = true;
|
_sorted[$ _node.node_id] = 1;
|
||||||
_node.__nextNodes = noone;
|
_node.__nextNodes = noone;
|
||||||
|
|
||||||
// print($" > Adding > {_node.name}");
|
// print($" > Adding > {_node.name} | {_arr}");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function __topoSort(_arr, _nodeArr) {
|
function __topoSort(_arr, _nodeArr, _sorted = {}) {
|
||||||
var _root = [];
|
var _root = [];
|
||||||
var _leftOver = [];
|
var _leftOver = [];
|
||||||
var _global = _nodeArr == PROJECT.nodes;
|
var _global = _nodeArr == PROJECT.nodes;
|
||||||
|
@ -103,10 +94,7 @@ function __topoSort(_arr, _nodeArr) {
|
||||||
var _node = _nodeArr[i];
|
var _node = _nodeArr[i];
|
||||||
var _isRoot = true;
|
var _isRoot = true;
|
||||||
|
|
||||||
if(is_instanceof(_node, Node_Collection_Inline) && !_node.is_root) {
|
if(is_instanceof(_node, Node_Collection_Inline) && !_node.is_root) { array_push(_leftOver, _node); continue; }
|
||||||
array_push(_leftOver, _node);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(_node.attributes.show_update_trigger && !array_empty(_node.updatedOutTrigger.getJunctionTo())) {
|
if(_node.attributes.show_update_trigger && !array_empty(_node.updatedOutTrigger.getJunctionTo())) {
|
||||||
_isRoot = false;
|
_isRoot = false;
|
||||||
|
@ -116,7 +104,7 @@ function __topoSort(_arr, _nodeArr) {
|
||||||
var _to = _node.outputs[j].getJunctionTo();
|
var _to = _node.outputs[j].getJunctionTo();
|
||||||
|
|
||||||
if(_global) _isRoot &= array_empty(_to);
|
if(_global) _isRoot &= array_empty(_to);
|
||||||
else _isRoot &= !array_any(_to, function(_val) { return array_exists(__temp_nodeList, _val.node); } );
|
else _isRoot &= !array_any(_to, function(_val) /*=>*/ {return array_exists(__temp_nodeList, _val.node)});
|
||||||
|
|
||||||
if(!_isRoot) break;
|
if(!_isRoot) break;
|
||||||
}
|
}
|
||||||
|
@ -128,10 +116,10 @@ function __topoSort(_arr, _nodeArr) {
|
||||||
// print($"Root: {_root}");
|
// print($"Root: {_root}");
|
||||||
|
|
||||||
for( var i = 0, n = array_length(_root); i < n; i++ )
|
for( var i = 0, n = array_length(_root); i < n; i++ )
|
||||||
__sortNode(_arr, _root[i]);
|
__sortNode(_arr, _root[i], _sorted);
|
||||||
|
|
||||||
for( var i = 0, n = array_length(_leftOver); i < n; i++ ) {
|
for( var i = 0, n = array_length(_leftOver); i < n; i++ ) {
|
||||||
if(!_leftOver[i].topoSorted)
|
if(!struct_has(_sorted, _leftOver[i].node_id))
|
||||||
array_insert(_arr, 0, _leftOver[i]);
|
array_insert(_arr, 0, _leftOver[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue