Fix crash related to struct loading.

This commit is contained in:
Tanasart 2024-11-24 12:07:17 +07:00
parent af24f73622
commit c7457c644d
20 changed files with 392 additions and 344 deletions

View file

@ -41,7 +41,7 @@ event_inherited();
content_hoverable = true; content_hoverable = true;
canvas = false; canvas = false;
collapsed = ds_map_create(); collapsed = {};
#region ---- category ---- #region ---- category ----
category = NODE_CATEGORY; category = NODE_CATEGORY;
@ -510,7 +510,7 @@ event_inherited();
array_push(group_labels, { y: yy, text: __txt(_node), key: _key }); array_push(group_labels, { y: yy, text: __txt(_node), key: _key });
if(ds_map_exists(collapsed, _key)) { if(struct_try_get(collapsed, _key, 0)) {
hh += ui(24 + 4); hh += ui(24 + 4);
yy += ui(24 + 4); yy += ui(24 + 4);
@ -611,7 +611,7 @@ event_inherited();
var lb = group_labels[i]; var lb = group_labels[i];
var _name = lb.text; var _name = lb.text;
var _key = lb.key; var _key = lb.key;
var _coll = ds_map_exists(collapsed, _key); var _coll = struct_try_get(collapsed, _key, 0);
var _yy = max(lb.y, i == len - 1? ui(8) : min(ui(8), group_labels[i + 1].y - ui(32))); var _yy = max(lb.y, i == len - 1? ui(8) : min(ui(8), group_labels[i + 1].y - ui(32)));
@ -623,8 +623,8 @@ event_inherited();
_cAll = _coll? -1 : 1; _cAll = _coll? -1 : 1;
} else if(mouse_press(mb_left)) { } else if(mouse_press(mb_left)) {
if(_coll) ds_map_delete(collapsed, _key); if(_coll) struct_set(collapsed, _key, 0);
else ds_map_add(collapsed, _key, 1); else struct_set(collapsed, _key, 1);
} }
} }
@ -638,8 +638,8 @@ event_inherited();
draw_text_add(ui(16 + 28), _yy + _lbh / 2, _name); draw_text_add(ui(16 + 28), _yy + _lbh / 2, _name);
} }
if(_cAll == 1) { for( var i = 0; i < len; i++ ) ds_map_delete(collapsed, group_labels[i].key); } if(_cAll == 1) { for( var i = 0; i < len; i++ ) struct_set(collapsed, group_labels[i].key, 0); }
else if(_cAll == -1) { for( var i = 0; i < len; i++ ) ds_map_add(collapsed, group_labels[i].key, 1); } else if(_cAll == -1) { for( var i = 0; i < len; i++ ) struct_set(collapsed, group_labels[i].key, 1); }
} }
hh += curr_height; hh += curr_height;
@ -677,7 +677,7 @@ event_inherited();
array_push(group_labels, { y: yy, text: __txt(_node), key: _key }); array_push(group_labels, { y: yy, text: __txt(_node), key: _key });
if(ds_map_exists(collapsed, _key)) { if(struct_try_get(collapsed, _key, 0)) {
hh += ui(24); hh += ui(24);
yy += ui(24); yy += ui(24);
@ -758,7 +758,7 @@ event_inherited();
var lb = group_labels[i]; var lb = group_labels[i];
var _name = lb.text; var _name = lb.text;
var _key = lb.key; var _key = lb.key;
var _coll = ds_map_exists(collapsed, _key); var _coll = struct_try_get(collapsed, _key, 0);
var _yy = max(lb.y, i == len - 1? ui(8) : min(ui(8), group_labels[i + 1].y - ui(32))); var _yy = max(lb.y, i == len - 1? ui(8) : min(ui(8), group_labels[i + 1].y - ui(32)));
BLEND_OVERRIDE; BLEND_OVERRIDE;
@ -769,8 +769,8 @@ event_inherited();
_cAll = _coll? -1 : 1; _cAll = _coll? -1 : 1;
} else if(mouse_press(mb_left)) { } else if(mouse_press(mb_left)) {
if(_coll) ds_map_delete(collapsed, _key); if(_coll) struct_set(collapsed, _key, 0);
else ds_map_add(collapsed, _key, 1); else struct_set(collapsed, _key, 1);
} }
} }
@ -784,8 +784,8 @@ event_inherited();
draw_text_add(ui(16 + 28), _yy + _lbh / 2, _name); draw_text_add(ui(16 + 28), _yy + _lbh / 2, _name);
} }
if(_cAll == 1) { for( var i = 0; i < len; i++ ) ds_map_delete(collapsed, group_labels[i].key); } if(_cAll == 1) { for( var i = 0; i < len; i++ ) struct_set(collapsed, group_labels[i].key, 0); }
else if(_cAll == -1) { for( var i = 0; i < len; i++ ) ds_map_add(collapsed, group_labels[i].key, 1); } else if(_cAll == -1) { for( var i = 0; i < len; i++ ) struct_set(collapsed, group_labels[i].key, 1); }
} }
if(sHOVER && key_mod_press(CTRL)) { if(sHOVER && key_mod_press(CTRL)) {

View file

@ -1,5 +1,4 @@
/// @description /// @description
event_inherited(); event_inherited();
ds_map_destroy(collapsed);
WIDGET_CURRENT = noone; WIDGET_CURRENT = noone;

View file

@ -93,9 +93,7 @@ function draw_line_elbow_corner(x0, y0, x1, y1, _s = 1, thick = 1, col1 = c_whit
draw_corner(x1 - corner * sx, y0, x1, y0, x1, y0 + corner * sy, thick, colc, sample); draw_corner(x1 - corner * sx, y0, x1, y0, x1, y0 + corner * sy, thick, colc, sample);
} }
function distance_to_elbow(mx, my, x0, y0, x1, y1, cx, cy, _s, params = {}) { function distance_to_elbow(mx, my, x0, y0, x1, y1, cx, cy, _s) {
var extend = params.extend;
var inv = x1 <= x0; var inv = x1 <= x0;
var xx0 = x0; var xx0 = x0;
var xx1 = x1; var xx1 = x1;

View file

@ -243,11 +243,7 @@ function draw_line_elbow_diag_corner(x0, y0, x1, y1, _s = 1, thick = 1, col1 = c
} }
function distance_to_elbow_diag(mx, my, x0, y0, x1, y1, cx, cy, _s, params = {}) { function distance_to_elbow_diag(mx, my, x0, y0, x1, y1, cx, cy, _s, extend, indexIn, indexOut) {
var extend = params.extend;
var indexIn = struct_try_get(params, "fromIndex", 1);
var indexOut = struct_try_get(params, "toIndex", 1);
var iy = sign(y1 - y0); var iy = sign(y1 - y0);
var xx0 = x0 + extend * _s; var xx0 = x0 + extend * _s;
var xx1 = x1 - extend * _s; var xx1 = x1 - extend * _s;

View file

@ -30,8 +30,7 @@ function draw_line_connect(x0, y0, x1, y1, _s = 1, thick = 1, c1 = c_white, c2 =
} }
function distance_to_linear_connection(mx, my, x0, y0, x1, y1, _s, params = {}) { function distance_to_linear_connection(mx, my, x0, y0, x1, y1, _s, extend) {
var extend = params.extend;
var xx0 = x0 + extend * _s; var xx0 = x0 + extend * _s;
var xx1 = x1 - extend * _s; var xx1 = x1 - extend * _s;

View file

@ -1,4 +1,4 @@
function draw_line_feedback(x0, y0, x1, y1, th, c1, c0, _s) { #region function draw_line_feedback(x0, y0, x1, y1, th, c1, c0, _s) {
var _y0 = y0 - 12 * _s; var _y0 = y0 - 12 * _s;
var _y1 = y1 - 12 * _s; var _y1 = y1 - 12 * _s;
@ -39,9 +39,9 @@ function draw_line_feedback(x0, y0, x1, y1, th, c1, c0, _s) { #region
ox = nx; ox = nx;
oy = ny; oy = ny;
} }
} #endregion }
function distance_line_feedback(mx, my, x0, y0, x1, y1, _s) { #region function distance_line_feedback(mx, my, x0, y0, x1, y1, _s) {
var _y0 = y0 - 12 * _s; var _y0 = y0 - 12 * _s;
var _y1 = y1 - 12 * _s; var _y1 = y1 - 12 * _s;
@ -50,4 +50,4 @@ function distance_line_feedback(mx, my, x0, y0, x1, y1, _s) { #region
dd = min(dd, distance_to_line(mx, my, x0, _y0, x1, _y1)); dd = min(dd, distance_to_line(mx, my, x0, _y0, x1, _y1));
return dd; return dd;
} #endregion }

View file

@ -66,14 +66,14 @@ function Node_Array_Pin(_x, _y, _group = noone) : Node(_x, _y, _group) construct
static drawBadge = function(_x, _y, _s) {} static drawBadge = function(_x, _y, _s) {}
static drawJunctionNames = function(_x, _y, _mx, _my, _s) {} static drawJunctionNames = function(_x, _y, _mx, _my, _s) {}
static drawJunctions = function(_x, _y, _mx, _my, _s) { static drawJunctions = function(_draw, _x, _y, _mx, _my, _s) {
var _dval = PANEL_GRAPH.value_dragging; var _dval = PANEL_GRAPH.value_dragging;
var hover = _dval == noone || _dval.connect_type == CONNECT_TYPE.input? outputs[0] : dummy_input; var hover = _dval == noone || _dval.connect_type == CONNECT_TYPE.input? outputs[0] : dummy_input;
var xx = x * _s + _x; var xx = x * _s + _x;
var yy = y * _s + _y; var yy = y * _s + _y;
isHovering = point_in_circle(_mx, _my, xx, yy, _s * 24); isHovering = point_in_circle(_mx, _my, xx, yy, _s * 24);
var jhov = hover.drawJunction(_s, _mx, _my); var jhov = hover.drawJunction(_draw, _s, _mx, _my);
if(!isHovering) return noone; if(!isHovering) return noone;
@ -81,7 +81,7 @@ function Node_Array_Pin(_x, _y, _group = noone) : Node(_x, _y, _group) construct
return jhov? hover : noone; return jhov? hover : noone;
} }
static drawNode = function(_x, _y, _mx, _my, _s) { static drawNode = function(_draw, _x, _y, _mx, _my, _s) {
var xx = x * _s + _x; var xx = x * _s + _x;
var yy = y * _s + _y; var yy = y * _s + _y;
@ -108,6 +108,6 @@ function Node_Array_Pin(_x, _y, _group = noone) : Node(_x, _y, _group) construct
draw_text_transformed(xx, yy - 12 * _s, display_name, _s * 0.4, _s * 0.4, 0); draw_text_transformed(xx, yy - 12 * _s, display_name, _s * 0.4, _s * 0.4, 0);
} }
return drawJunctions(_x, _y, _mx, _my, _s); return drawJunctions(_draw, _x, _y, _mx, _my, _s);
} }
} }

View file

@ -280,7 +280,7 @@ function Node_Collection_Inline(_x, _y, _group = noone) : Node(_x, _y, _group) c
return _hov; return _hov;
} }
static drawNode = function(_x, _y, _mx, _my, _s, display_parameter = noone) {} static drawNode = function(_draw, _x, _y, _mx, _my, _s, display_parameter = noone) {}
static drawBadge = function(_x, _y, _s) {} static drawBadge = function(_x, _y, _s) {}

View file

@ -1263,6 +1263,7 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
updateIO(); updateIO();
setHeight(); setHeight();
getJunctionList(); getJunctionList();
setJunctionIndex();
} run_in(1, function() /*=>*/ { refreshNodeDisplay(); }); } run_in(1, function() /*=>*/ { refreshNodeDisplay(); });
@ -1518,20 +1519,20 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
h_param = h; h_param = h;
} }
static drawJunctions = function(_x, _y, _mx, _my, _s) { static drawJunctions = function(_draw, _x, _y, _mx, _my, _s) {
var hover = noone; var hover = noone;
for(var i = 0, n = array_length(inputDisplayList); i < n; i++) { //inputs for(var i = 0, n = array_length(inputDisplayList); i < n; i++) { //inputs
var jun = inputDisplayList[i]; var jun = inputDisplayList[i];
if(jun.drawJunction(_s, _mx, _my)) hover = jun; if(jun.drawJunction(_draw, _s, _mx, _my)) hover = jun;
} }
for(var i = 0; i < array_length(outputs); i++) { // outputs for(var i = 0; i < array_length(outputs); i++) { // outputs
var jun = outputs[i]; var jun = outputs[i];
if(!jun.isVisible()) continue; if(!jun.isVisible()) continue;
if(jun.drawJunction(_s, _mx, _my)) hover = jun; if(jun.drawJunction(_draw, _s, _mx, _my)) hover = jun;
} }
for( var i = 0; i < array_length(inputs); i++ ) { // bypass for( var i = 0; i < array_length(inputs); i++ ) { // bypass
@ -1539,15 +1540,15 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
var jun = _inp.bypass_junc; var jun = _inp.bypass_junc;
if(jun == noone || !jun.visible) continue; if(jun == noone || !jun.visible) continue;
if(jun.drawJunction(_s, _mx, _my)) hover = jun; if(jun.drawJunction(_draw, _s, _mx, _my)) hover = jun;
} }
if(hasInspector1Update() && inspectInput1.drawJunction(_s, _mx, _my)) hover = inspectInput1; if(hasInspector1Update() && inspectInput1.drawJunction(_draw, _s, _mx, _my)) hover = inspectInput1;
if(hasInspector2Update() && inspectInput2.drawJunction(_s, _mx, _my)) hover = inspectInput2; if(hasInspector2Update() && inspectInput2.drawJunction(_draw, _s, _mx, _my)) hover = inspectInput2;
if(attributes.show_update_trigger) { if(attributes.show_update_trigger) {
if(updatedInTrigger.drawJunction(_s, _mx, _my)) hover = updatedInTrigger; if(updatedInTrigger.drawJunction(_draw, _s, _mx, _my)) hover = updatedInTrigger;
if(updatedOutTrigger.drawJunction(_s, _mx, _my)) hover = updatedOutTrigger; if(updatedOutTrigger.drawJunction(_draw, _s, _mx, _my)) hover = updatedOutTrigger;
} }
if(attributes.outp_meta) { if(attributes.outp_meta) {
@ -1555,7 +1556,7 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
var jun = junc_meta[i]; var jun = junc_meta[i];
if(!jun.isVisible()) continue; if(!jun.isVisible()) continue;
if(jun.drawJunction(_s, _mx, _my)) hover = jun; if(jun.drawJunction(_draw, _s, _mx, _my)) hover = jun;
} }
} }
@ -1564,7 +1565,7 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
return hover; return hover;
} }
static drawJunctions_fast = function(_x, _y, _mx, _my, _s) { static drawJunctions_fast = function(_draw, _x, _y, _mx, _my, _s) {
var hover = noone; var hover = noone;
draw_set_circle_precision(4); draw_set_circle_precision(4);
@ -1572,14 +1573,14 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
for(var i = 0, n = array_length(inputDisplayList); i < n; i++) { for(var i = 0, n = array_length(inputDisplayList); i < n; i++) {
var jun = inputDisplayList[i]; var jun = inputDisplayList[i];
if(jun.drawJunction_fast(_s, _mx, _my)) hover = jun; if(jun.drawJunction_fast(_draw, _s, _mx, _my)) hover = jun;
} }
for(var i = 0; i < array_length(outputs); i++) { for(var i = 0; i < array_length(outputs); i++) {
var jun = outputs[i]; var jun = outputs[i];
if(!jun.isVisible()) continue; if(!jun.isVisible()) continue;
if(jun.drawJunction_fast(_s, _mx, _my)) hover = jun; if(jun.drawJunction_fast(_draw, _s, _mx, _my)) hover = jun;
} }
for( var i = 0; i < array_length(inputs); i++ ) { for( var i = 0; i < array_length(inputs); i++ ) {
@ -1587,15 +1588,15 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
var jun = _inp.bypass_junc; var jun = _inp.bypass_junc;
if(jun == noone || !jun.visible) continue; if(jun == noone || !jun.visible) continue;
if(jun.drawJunction_fast(_s, _mx, _my)) hover = jun; if(jun.drawJunction_fast(_draw, _s, _mx, _my)) hover = jun;
} }
if(hasInspector1Update() && inspectInput1.drawJunction_fast(_s, _mx, _my)) hover = inspectInput1; if(hasInspector1Update() && inspectInput1.drawJunction_fast(_draw, _s, _mx, _my)) hover = inspectInput1;
if(hasInspector2Update() && inspectInput2.drawJunction_fast(_s, _mx, _my)) hover = inspectInput2; if(hasInspector2Update() && inspectInput2.drawJunction_fast(_draw, _s, _mx, _my)) hover = inspectInput2;
if(attributes.show_update_trigger) { if(attributes.show_update_trigger) {
if(updatedInTrigger.drawJunction_fast(_s, _mx, _my)) hover = updatedInTrigger; if(updatedInTrigger.drawJunction_fast(_draw, _s, _mx, _my)) hover = updatedInTrigger;
if(updatedOutTrigger.drawJunction_fast(_s, _mx, _my)) hover = updatedOutTrigger; if(updatedOutTrigger.drawJunction_fast(_draw, _s, _mx, _my)) hover = updatedOutTrigger;
} }
if(attributes.outp_meta) { if(attributes.outp_meta) {
@ -1603,7 +1604,7 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
var jun = junc_meta[i]; var jun = junc_meta[i];
if(!jun.isVisible()) continue; if(!jun.isVisible()) continue;
if(jun.drawJunction_fast(_s, _mx, _my)) hover = jun; if(jun.drawJunction_fast(_draw, _s, _mx, _my)) hover = jun;
} }
} }
@ -1691,16 +1692,12 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
} }
} }
__draw_inputs = [] __draw_inputs = [];
static drawConnections = function(params = {}) { __draw_inputs_len = 0;
if(!active) return noone;
var hovering = noone; static setJunctionIndex = function() {
var drawLineIndex = 1; var drawLineIndex = 1;
var high = params.highlight; // 0
var bg = params.bg; // 0
for(var i = 0, n = array_length(outputs); i < n; i++) { for(var i = 0, n = array_length(outputs); i < n; i++) {
var jun = outputs[i]; var jun = outputs[i];
var connected = !array_empty(jun.value_to); var connected = !array_empty(jun.value_to);
@ -1710,40 +1707,49 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
drawLineIndex += 0.5; drawLineIndex += 0.5;
} }
jun.draw_blend_color = bg; // jun.draw_blend_color = bg;
jun.draw_blend = high? PREFERENCES.connection_line_highlight_fade : -1; // jun.draw_blend = high? PREFERENCES.connection_line_highlight_fade : -1;
} }
__draw_inputs = array_verify(__draw_inputs, array_length(inputs)); __draw_inputs = array_verify(__draw_inputs, array_length(inputs));
var _len = 0;
var _jun, _hov;
if(hasInspector1Update()) { _hov = inspectInput1.drawConnections(params); if(_hov) hovering = _hov; }
if(hasInspector2Update()) { _hov = inspectInput2.drawConnections(params); if(_hov) hovering = _hov; }
var drawLineIndex = 1; var drawLineIndex = 1;
__draw_inputs_len = 0;
for(var i = 0, n = array_length(inputs); i < n; i++) { for(var i = 0, n = array_length(inputs); i < n; i++) {
_jun = inputs[i]; _jun = inputs[i];
_jun.draw_blend_color = bg; // _jun.draw_blend_color = bg;
_jun.draw_blend = high? PREFERENCES.connection_line_highlight_fade : -1; // _jun.draw_blend = high? PREFERENCES.connection_line_highlight_fade : -1;
if(_jun.bypass_junc.visible) _jun.bypass_junc.drawBypass(params);
if( _jun.value_from == noone || !_jun.value_from.node.active || !_jun.isVisible()) continue; if( _jun.value_from == noone || !_jun.value_from.node.active || !_jun.isVisible()) continue;
__draw_inputs[__draw_inputs_len++] = _jun;
__draw_inputs[_len++] = _jun;
} }
for( var i = 0; i < _len; i++ ) { for( var i = 0; i < __draw_inputs_len; i++ ) {
_jun = __draw_inputs[i]; _jun = __draw_inputs[i];
_jun.drawLineIndex = 1 + (i > _len / 2? (_len - 1 - i) : i) * 0.5; _jun.drawLineIndex = 1 + (i > __draw_inputs_len / 2? (__draw_inputs_len - 1 - i) : i) * 0.5;
}
}
_hov = _jun.drawConnectionsRaw(params); if(_hov) hovering = _hov; static drawConnections = function(params = {}, _draw = true) {
if(!active) return noone;
var _hov, hovering = noone;
// var bg = params.bg;
// var high = params.highlight;
if(hasInspector1Update()) { _hov = inspectInput1.drawConnections(params, _draw); if(_hov) hovering = _hov; }
if(hasInspector2Update()) { _hov = inspectInput2.drawConnections(params, _draw); if(_hov) hovering = _hov; }
for( var i = 0; i < __draw_inputs_len; i++ ) {
var _jun = __draw_inputs[i];
if(_jun.bypass_junc.visible) _jun.bypass_junc.drawBypass(params);
_hov = _jun.drawConnections(params, _draw); if(_hov) hovering = _hov;
} }
if(attributes.show_update_trigger) { if(attributes.show_update_trigger) {
if(updatedInTrigger.drawConnections(params)) hovering = updatedInTrigger; if(updatedInTrigger.drawConnections(params, _draw)) hovering = updatedInTrigger;
if(updatedOutTrigger.drawConnections(params)) hovering = updatedOutTrigger; if(updatedOutTrigger.drawConnections(params, _draw)) hovering = updatedOutTrigger;
} }
return hovering; return hovering;
@ -1893,11 +1899,12 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
static drawNodeFG = function(_x, _y, _mx, _my, _s, display_parameter = noone, _panel = noone) { } static drawNodeFG = function(_x, _y, _mx, _my, _s, display_parameter = noone, _panel = noone) { }
static drawNode = function(_x, _y, _mx, _my, _s, display_parameter = noone, _panel = noone) { static drawNode = function(_draw, _x, _y, _mx, _my, _s, display_parameter = noone, _panel = noone) {
if(display_parameter != noone) self.display_parameter = display_parameter; if(display_parameter != noone) self.display_parameter = display_parameter;
var xx = x * _s + _x; var xx = x * _s + _x;
var yy = y * _s + _y; var yy = y * _s + _y;
if(!_draw) return _s > 0.5? drawJunctions(_draw, xx, yy, _mx, _my, _s) : drawJunctions_fast(_draw, xx, yy, _mx, _my, _s);
preview_mx = _mx; preview_mx = _mx;
preview_my = _my; preview_my = _my;
@ -1906,7 +1913,6 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
draw_sprite_stretched_ext(THEME.node_glow_border, 0, xx - 9, yy - 9, w * _s + 18, h * _s + 18, COLORS._main_value_negative, 1); draw_sprite_stretched_ext(THEME.node_glow_border, 0, xx - 9, yy - 9, w * _s + 18, h * _s + 18, COLORS._main_value_negative, 1);
drawNodeBase(xx, yy, _s); drawNodeBase(xx, yy, _s);
draggable = true; draggable = true;
if(previewable) { if(previewable) {
@ -1953,8 +1959,8 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
drawNodeOverlay(xx, yy, _mx, _my, _s); drawNodeOverlay(xx, yy, _mx, _my, _s);
if(!previewable) return drawJunctions_fast(xx, yy, _mx, _my, _s); if(!previewable) return drawJunctions_fast(_draw, xx, yy, _mx, _my, _s);
return _s > 0.5? drawJunctions(xx, yy, _mx, _my, _s) : drawJunctions_fast(xx, yy, _mx, _my, _s); return _s > 0.5? drawJunctions(_draw, xx, yy, _mx, _my, _s) : drawJunctions_fast(_draw, xx, yy, _mx, _my, _s);
} }
static drawNodeBehind = function(_x, _y, _mx, _my, _s) { static drawNodeBehind = function(_x, _y, _mx, _my, _s) {
@ -2415,9 +2421,9 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
struct_override(attributes, attr); struct_override(attributes, attr);
if(!CLONING && LOADING_VERSION < 1_18_02_0) { if(!CLONING && LOADING_VERSION < 1_18_02_0) {
if(struct_has(attr, "color_depth")) attributes.color_depth += (!array_empty(inputs) && inputs[0].type == VALUE_TYPE.surface)? 1 : 2; if(struct_has(attributes, "color_depth")) attributes.color_depth += (!array_empty(inputs) && inputs[0].type == VALUE_TYPE.surface)? 1 : 2;
if(struct_has(attr, "interpolate")) attributes.interpolate++; if(struct_has(attributes, "interpolate")) attributes.interpolate++;
if(struct_has(attr, "oversample")) attributes.oversample++; if(struct_has(attributes, "oversample")) attributes.oversample++;
} }
} }

View file

@ -57,7 +57,7 @@ function Node_Display_Image(_x, _y, _group = noone) : Node(_x, _y, _group) const
sca_dx = 1; sca_dx = 1;
sca_dy = 1; sca_dy = 1;
static move = function(_x, _y, _s) { #region static move = function(_x, _y, _s) {
if(x == _x && y == _y) return; if(x == _x && y == _y) return;
if(!LOADING) PROJECT.modified = true; if(!LOADING) PROJECT.modified = true;
@ -66,16 +66,16 @@ function Node_Display_Image(_x, _y, _group = noone) : Node(_x, _y, _group) const
if(inputs[1].setValue([ _x, _y ])) if(inputs[1].setValue([ _x, _y ]))
UNDO_HOLDING = true; UNDO_HOLDING = true;
} #endregion }
static onInspector1Update = function() { #region static onInspector1Update = function() {
var path = getInputData(0); var path = getInputData(0);
if(path == "") return; if(path == "") return;
updatePaths(path); updatePaths(path);
update(); update();
} #endregion }
function updatePaths(path) { #region function updatePaths(path) {
path = path_get(path); path = path_get(path);
if(path == -1) return false; if(path == -1) return false;
@ -99,9 +99,9 @@ function Node_Display_Image(_x, _y, _group = noone) : Node(_x, _y, _group) const
return true; return true;
} }
return false; return false;
} #endregion }
static update = function(frame = CURRENT_FRAME) { #region static update = function(frame = CURRENT_FRAME) {
var path = getInputData(0); var path = getInputData(0);
var posi = getInputData(1); var posi = getInputData(1);
var scal = getInputData(2); var scal = getInputData(2);
@ -116,16 +116,16 @@ function Node_Display_Image(_x, _y, _group = noone) : Node(_x, _y, _group) const
pos_y = posi[1]; pos_y = posi[1];
sca_x = scal[0]; sca_x = scal[0];
sca_y = scal[1]; sca_y = scal[1];
} #endregion }
static drawNodeBase = function(xx, yy, _s) { #region static drawNodeBase = function(xx, yy, _s) {
if(!spr || !sprite_exists(spr)) return; if(!spr || !sprite_exists(spr)) return;
draw_sprite_uniform(spr, 0, xx, yy, _s); draw_sprite_uniform(spr, 0, xx, yy, _s);
} #endregion }
static drawNode = function(_x, _y, _mx, _my, _s) { #region static drawNode = function(_draw, _x, _y, _mx, _my, _s) {
if(spr == noone) return noone; if(!_draw || spr == noone) return noone;
x = smooth? lerp_float(x, pos_x, 4) : pos_x; x = smooth? lerp_float(x, pos_x, 4) : pos_x;
y = smooth? lerp_float(y, pos_y, 4) : pos_y; y = smooth? lerp_float(y, pos_y, 4) : pos_y;
@ -145,5 +145,5 @@ function Node_Display_Image(_x, _y, _group = noone) : Node(_x, _y, _group) const
active_draw_index = -1; active_draw_index = -1;
} }
return noone; return noone;
} #endregion }
} }

View file

@ -508,7 +508,7 @@ function Node_Display_Text(_x, _y, _group = noone) : Node(_x, _y, _group) constr
init_size = false; init_size = false;
} }
static drawJunctions = function(_x, _y, _mx, _my, _s) { static drawJunctions = function(_draw, _x, _y, _mx, _my, _s) {
if(!active) return; if(!active) return;
var hover = noone; var hover = noone;
@ -517,7 +517,7 @@ function Node_Display_Text(_x, _y, _group = noone) : Node(_x, _y, _group) constr
for(var i = 0, n = array_length(inputDisplayList); i < n; i++) { for(var i = 0, n = array_length(inputDisplayList); i < n; i++) {
var jun = inputDisplayList[i]; var jun = inputDisplayList[i];
if(jun.drawJunction_fast(_s, _mx, _my)) if(jun.drawJunction_fast(_draw, _s, _mx, _my))
hover = jun; hover = jun;
} }
@ -528,7 +528,9 @@ function Node_Display_Text(_x, _y, _group = noone) : Node(_x, _y, _group) constr
init_size = true; init_size = true;
} }
static drawNode = function(_x, _y, _mx, _my, _s) { static drawNode = function(_draw, _x, _y, _mx, _my, _s) {
if(!_draw) return drawJunctions(_draw, _x, _y, _mx, _my, _s);
var xx = x * _s + _x; var xx = x * _s + _x;
var yy = y * _s + _y; var yy = y * _s + _y;
@ -540,6 +542,6 @@ function Node_Display_Text(_x, _y, _group = noone) : Node(_x, _y, _group) constr
active_draw_index = -1; active_draw_index = -1;
} }
return drawJunctions(xx, yy, _mx, _my, _s); return drawJunctions(_draw, xx, yy, _mx, _my, _s);
} }
} }

View file

@ -66,10 +66,6 @@ function Node_Feedback_Inline(_x, _y, _group = noone) : Node(_x, _y, _group) con
} }
static drawConnections = function(params = {}) { 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;
params.dashed = true; params.loop = true; params.dashed = true; params.loop = true;
drawJuncConnection(junc_out, junc_in, params); drawJuncConnection(junc_out, junc_in, params);
params.dashed = false; params.loop = false; params.dashed = false; params.loop = false;
@ -77,7 +73,7 @@ function Node_Feedback_Inline(_x, _y, _group = noone) : Node(_x, _y, _group) con
return noone; return noone;
} }
static drawNode = function(_x, _y, _mx, _my, _s, display_parameter = noone) {} static drawNode = function(_draw, _x, _y, _mx, _my, _s, display_parameter = noone) {}
static pointIn = function(_x, _y, _mx, _my, _s) { return false; } static pointIn = function(_x, _y, _mx, _my, _s) { return false; }

View file

@ -88,10 +88,6 @@ function Node_Iterate_Inline(_x, _y, _group = noone) : Node_Collection_Inline(_x
} }
static drawConnections = function(params = {}) { 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;
params.dashed = true; params.loop = true; params.dashed = true; params.loop = true;
drawJuncConnection(junc_out, junc_in, params); drawJuncConnection(junc_out, junc_in, params);
params.dashed = false; params.loop = false; params.dashed = false; params.loop = false;

View file

@ -67,7 +67,7 @@ function Node_Pin(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
static drawBadge = function(_x, _y, _s) {} static drawBadge = function(_x, _y, _s) {}
static drawJunctionNames = function(_x, _y, _mx, _my, _s) {} static drawJunctionNames = function(_x, _y, _mx, _my, _s) {}
static drawJunctions = function(_x, _y, _mx, _my, _s) { static drawJunctions = function(_draw, _x, _y, _mx, _my, _s) {
var _dval = PANEL_GRAPH.value_dragging; var _dval = PANEL_GRAPH.value_dragging;
var hover = _dval == noone || _dval.connect_type == CONNECT_TYPE.input? outputs[0] : inputs[0]; var hover = _dval == noone || _dval.connect_type == CONNECT_TYPE.input? outputs[0] : inputs[0];
var xx = x * _s + _x; var xx = x * _s + _x;
@ -76,7 +76,7 @@ function Node_Pin(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
isHovering = point_in_circle(_mx, _my, xx, yy, _s * 24); isHovering = point_in_circle(_mx, _my, xx, yy, _s * 24);
hover_junction = noone; hover_junction = noone;
var jhov = hover.drawJunction(_s, _mx, _my); var jhov = hover.drawJunction(_draw, _s, _mx, _my);
if(!isHovering) return noone; if(!isHovering) return noone;
if(!jhov) draw_sprite_ext(THEME.view_pan, 0, _mx + ui(16), _my + ui(24), 1, 1, 0, COLORS._main_accent); if(!jhov) draw_sprite_ext(THEME.view_pan, 0, _mx + ui(16), _my + ui(24), 1, 1, 0, COLORS._main_accent);
@ -87,7 +87,9 @@ function Node_Pin(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
return hover_junction; return hover_junction;
} }
static drawNode = function(_x, _y, _mx, _my, _s) { static drawNode = function(_draw, _x, _y, _mx, _my, _s) {
if(!_draw) return drawJunctions(_draw, _x, _y, _mx, _my, _s);
var xx = x * _s + _x; var xx = x * _s + _x;
var yy = y * _s + _y; var yy = y * _s + _y;
@ -104,9 +106,7 @@ function Node_Pin(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
shader_set(sh_node_circle); shader_set(sh_node_circle);
shader_set_color("color", COLORS._main_accent, hover_alpha); shader_set_color("color", COLORS._main_accent, hover_alpha);
shader_set_f("radius", .5 * hover_scale); shader_set_f("radius", .5 * hover_scale);
draw_sprite_stretched(s_fx_pixel, 0, xx - _r, yy - _r, _r * 2, _r * 2); draw_sprite_stretched(s_fx_pixel, 0, xx - _r, yy - _r, _r * 2, _r * 2);
shader_set_f("radius", 0); shader_set_f("radius", 0);
shader_reset(); shader_reset();
} }
@ -119,6 +119,6 @@ function Node_Pin(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
draw_text_transformed(xx, yy - 12 * _s, display_name, _s * 0.4, _s * 0.4, 0); draw_text_transformed(xx, yy - 12 * _s, display_name, _s * 0.4, _s * 0.4, 0);
} }
return drawJunctions(_x, _y, _mx, _my, _s); return drawJunctions(_draw, _x, _y, _mx, _my, _s);
} }
} }

View file

@ -195,12 +195,12 @@ function Node_Tunnel_In(_x, _y, _group = noone) : Node(_x, _y, _group) construct
draw_set_alpha(1); draw_set_alpha(1);
} }
static drawJunctions = function(_x, _y, _mx, _my, _s) { static drawJunctions = function(_draw, _x, _y, _mx, _my, _s) {
var xx = x * _s + _x; var xx = x * _s + _x;
var yy = y * _s + _y; var yy = y * _s + _y;
isHovering = point_in_circle(_mx, _my, xx, yy, _s * 24); isHovering = point_in_circle(_mx, _my, xx, yy, _s * 24);
junction_hover = inputs[1].drawJunction(_s, _mx, _my); junction_hover = inputs[1].drawJunction(_draw, _s, _mx, _my);
if(!isHovering) return noone; if(!isHovering) return noone;
if(!junction_hover) draw_sprite_ext(THEME.view_pan, 0, _mx + ui(16), _my + ui(24), 1, 1, 0, COLORS._main_accent); if(!junction_hover) draw_sprite_ext(THEME.view_pan, 0, _mx + ui(16), _my + ui(24), 1, 1, 0, COLORS._main_accent);
@ -210,7 +210,9 @@ function Node_Tunnel_In(_x, _y, _group = noone) : Node(_x, _y, _group) construct
return junction_hover? inputs[1] : noone; return junction_hover? inputs[1] : noone;
} }
static drawNode = function(_x, _y, _mx, _my, _s) { static drawNode = function(_draw, _x, _y, _mx, _my, _s) {
if(!_draw) return drawJunctions(_draw, _x, _y, _mx, _my, _s);
var xx = x * _s + _x; var xx = x * _s + _x;
var yy = y * _s + _y; var yy = y * _s + _y;
@ -259,7 +261,7 @@ function Node_Tunnel_In(_x, _y, _group = noone) : Node(_x, _y, _group) construct
draw_set_text(f_sdf, fa_center, fa_bottom, COLORS._main_text); draw_set_text(f_sdf, fa_center, fa_bottom, COLORS._main_text);
draw_text_transformed(xx, yy - 12 * _s, string(inputs[0].getValue()), _s * .3, _s * .3, 0); draw_text_transformed(xx, yy - 12 * _s, string(inputs[0].getValue()), _s * .3, _s * .3, 0);
return drawJunctions(_x, _y, _mx, _my, _s); return drawJunctions(_draw, _x, _y, _mx, _my, _s);
} }
static onClone = function() { onValueUpdate(0); } static onClone = function() { onValueUpdate(0); }

View file

@ -119,12 +119,12 @@ function Node_Tunnel_Out(_x, _y, _group = noone) : Node(_x, _y, _group) construc
draw_set_alpha(1); draw_set_alpha(1);
} }
static drawJunctions = function(_x, _y, _mx, _my, _s) { static drawJunctions = function(_draw, _x, _y, _mx, _my, _s) {
var xx = x * _s + _x; var xx = x * _s + _x;
var yy = y * _s + _y; var yy = y * _s + _y;
isHovering = point_in_circle(_mx, _my, xx, yy, _s * 24); isHovering = point_in_circle(_mx, _my, xx, yy, _s * 24);
junction_hover = outputs[0].drawJunction(_s, _mx, _my); junction_hover = outputs[0].drawJunction(_draw, _s, _mx, _my);
if(!isHovering) return noone; if(!isHovering) return noone;
if(!junction_hover) draw_sprite_ext(THEME.view_pan, 0, _mx + ui(16), _my + ui(24), 1, 1, 0, COLORS._main_accent); if(!junction_hover) draw_sprite_ext(THEME.view_pan, 0, _mx + ui(16), _my + ui(24), 1, 1, 0, COLORS._main_accent);
@ -133,7 +133,9 @@ function Node_Tunnel_Out(_x, _y, _group = noone) : Node(_x, _y, _group) construc
return junction_hover? outputs[0] : noone; return junction_hover? outputs[0] : noone;
} }
static drawNode = function(_x, _y, _mx, _my, _s) { static drawNode = function(_draw, _x, _y, _mx, _my, _s) {
if(!_draw) return drawJunctions(_draw, _x, _y, _mx, _my, _s);
var xx = x * _s + _x; var xx = x * _s + _x;
var yy = y * _s + _y; var yy = y * _s + _y;
@ -182,7 +184,7 @@ function Node_Tunnel_Out(_x, _y, _group = noone) : Node(_x, _y, _group) construc
draw_set_text(f_sdf, fa_center, fa_bottom, COLORS._main_text); draw_set_text(f_sdf, fa_center, fa_bottom, COLORS._main_text);
draw_text_transformed(xx, yy - 12 * _s, string(inputs[0].getValue()), _s * .3, _s * .3, 0); draw_text_transformed(xx, yy - 12 * _s, string(inputs[0].getValue()), _s * .3, _s * .3, 0);
return drawJunctions(_x, _y, _mx, _my, _s); return drawJunctions(_draw, _x, _y, _mx, _my, _s);
} }
static onClone = function() { onValueUpdate(0); } static onClone = function() { onValueUpdate(0); }

View file

@ -1720,6 +1720,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
node.triggerRender(); node.triggerRender();
node.clearCacheForward(); node.clearCacheForward();
if(PANEL_GRAPH) PANEL_GRAPH.connection_draw_update = true;
UPDATE |= RENDER_TYPE.partial; UPDATE |= RENDER_TYPE.partial;
} }
@ -1875,12 +1876,12 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
return -1; return -1;
} }
static drawJunction_fast = function(_s, _mx, _my) { static drawJunction_fast = function(_draw, _s, _mx, _my) {
INLINE
var hov = PANEL_GRAPH.pHOVER && (PANEL_GRAPH.node_hovering == noone || PANEL_GRAPH.node_hovering == node); var hov = PANEL_GRAPH.pHOVER && (PANEL_GRAPH.node_hovering == noone || PANEL_GRAPH.node_hovering == node);
var _d = node.junction_draw_hei_y * _s; var _d = node.junction_draw_hei_y * _s;
var _hov = hov && point_in_rectangle(_mx, _my, x - 6 * _s, y - _d / 2, x + 6 * _s, y + _d / 2 - 1); var _hov = hov && point_in_rectangle(_mx, _my, x - 6 * _s, y - _d / 2, x + 6 * _s, y + _d / 2 - 1);
if(!_draw) return _hov;
var _aa = 0.75 + (!is_dummy * 0.25); var _aa = 0.75 + (!is_dummy * 0.25);
hover_in_graph = _hov; hover_in_graph = _hov;
@ -1902,19 +1903,20 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
return _hov; return _hov;
} }
static drawJunction = function(_s, _mx, _my) { static drawJunction = function(_draw, _s, _mx, _my) {
_s /= 2; _s /= 2;
var hov = PANEL_GRAPH.pHOVER && (PANEL_GRAPH.node_hovering == noone || PANEL_GRAPH.node_hovering == node); var hov = PANEL_GRAPH.pHOVER && (PANEL_GRAPH.node_hovering == noone || PANEL_GRAPH.node_hovering == node);
var _d = node.junction_draw_hei_y * _s; var _d = node.junction_draw_hei_y * _s;
var is_hover = hov && point_in_rectangle(_mx, _my, x - _d, y - _d, x + _d - 1, y + _d - 1); var _hov = hov && point_in_rectangle(_mx, _my, x - _d, y - _d, x + _d - 1, y + _d - 1);
hover_in_graph = is_hover; hover_in_graph = _hov;
if(!_draw) return _hov;
if(custom_icon != noone) { if(custom_icon != noone) {
__draw_sprite_ext(custom_icon, 0, x, y, _s, _s, 0, c_white, 1); __draw_sprite_ext(custom_icon, 0, x, y, _s, _s, 0, c_white, 1);
} else if(is_dummy) { } else if(is_dummy) {
__draw_sprite_ext(THEME.node_junction_add, is_hover, x, y, _s, _s, 0, c_white, 0.5 + 0.5 * is_hover); __draw_sprite_ext(THEME.node_junction_add, _hov, x, y, _s, _s, 0, c_white, 0.5 + 0.5 * _hov);
} else if(type == VALUE_TYPE.action) { } else if(type == VALUE_TYPE.action) {
var _cbg = c_white; var _cbg = c_white;
@ -1922,7 +1924,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
if(draw_blend != -1) if(draw_blend != -1)
_cbg = merge_color(draw_blend_color, _cbg, draw_blend); _cbg = merge_color(draw_blend_color, _cbg, draw_blend);
__draw_sprite_ext(THEME.node_junction_inspector, is_hover, x, y, _s, _s, 0, _cbg, 1); __draw_sprite_ext(THEME.node_junction_inspector, _hov, x, y, _s, _s, 0, _cbg, 1);
} else { } else {
var _cbg = draw_bg; var _cbg = draw_bg;
@ -1937,11 +1939,11 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
if(_s > .5) { if(_s > .5) {
_bgS = THEME.node_junctions_bg_x2; _bgS = THEME.node_junctions_bg_x2;
_fgS = is_hover? THEME.node_junctions_outline_hover_x2 : THEME.node_junctions_outline_x2; _fgS = _hov? THEME.node_junctions_outline_hover_x2 : THEME.node_junctions_outline_x2;
} else { } else {
_bgS = THEME.node_junctions_bg; _bgS = THEME.node_junctions_bg;
_fgS = is_hover? THEME.node_junctions_outline_hover : THEME.node_junctions_outline; _fgS = _hov? THEME.node_junctions_outline_hover : THEME.node_junctions_outline;
_s *= 2; _s *= 2;
} }
@ -1955,7 +1957,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
gpu_set_blendmode(bm_normal); gpu_set_blendmode(bm_normal);
} }
return is_hover; return _hov;
} }
static drawNameBG = function(_s) { static drawNameBG = function(_s) {
@ -2009,10 +2011,10 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
draw_set_alpha(1); draw_set_alpha(1);
} }
static drawConnectionsRaw = function(params = {}) { return drawJuncConnection(value_from, self, params); } static drawConnections = function(params = {}, _draw = true) {
static drawConnections = function(params = {}) {
if(value_from == noone || !value_from.node.active || !isVisible()) return noone; if(value_from == noone || !value_from.node.active || !isVisible()) return noone;
return drawJuncConnection(value_from, self, params); if(_draw) drawJuncConnection(value_from, self, params);
return checkJuncConnection(value_from, self, params);
} }
static drawConnectionMouse = function(params, _mx, _my, target = noone) { static drawConnectionMouse = function(params, _mx, _my, target = noone) {
@ -2380,41 +2382,22 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
/////========== FUNCTIONS ========== /////========== FUNCTIONS ==========
function drawJuncConnection(from, to, params) { function checkJuncConnection(from, to, params) {
#region parameters if(from == noone || to == noone) return noone;
var log = params.log; if(!params.active || !PANEL_GRAPH.pHOVER) return noone;
var high = params.highlight;
var bg = params.bg; to.draw_line_shift_hover = false;
var aa = params.aa;
var _s = params.s; var _s = params.s;
var mx = params.mx; var mx = params.mx;
var my = params.my; var my = params.my;
var _active = params.active;
var cur_layer = params.cur_layer;
var max_layer = params.max_layer;
var hovering = noone;
var jx = to.x, jy = to.y; var jx = to.x, jy = to.y;
var frx = from.x, fry = from.y; var frx = from.x, fry = from.y;
var fromIndex = from.drawLineIndex;
var toIndex = to.drawLineIndex;
var _loop = struct_try_get(params, "loop");
if(params.minx != 0 && params.maxx != 0) { if(params.minx != 0 && params.maxx != 0) {
var minx = params.minx; if((jx < params.minx && frx < params.minx) || (jx > params.maxx && frx > params.maxx) ||
var miny = params.miny; (jy < params.miny && fry < params.miny) || (jy > params.maxy && fry > params.maxy)) return noone;
var maxx = params.maxx;
var maxy = params.maxy;
if(jx < minx && frx < minx) return noone;
if(jx > maxx && frx > maxx) return noone;
if(jy < miny && fry < miny) return noone;
if(jy > maxy && fry > maxy) return noone;
} }
var shx = to.draw_line_shift_x * _s; var shx = to.draw_line_shift_x * _s;
@ -2422,33 +2405,26 @@ function drawJuncConnection(from, to, params) {
var cx = round((frx + jx) / 2 + shx); var cx = round((frx + jx) / 2 + shx);
var cy = round((fry + jy) / 2 + shy); var cy = round((fry + jy) / 2 + shy);
var hover = false;
var th = max(1, PREFERENCES.connection_line_width * _s); var th = max(1, PREFERENCES.connection_line_width * _s);
to.draw_line_shift_hover = false; var hover, hovDist = max(th * 2, 6);
var _x0 = min(jx, cx, frx) - hovDist, _x1 = max(jx, cx, frx) + hovDist;
var _y0 = min(jy, cy, fry) - hovDist, _y1 = max(jy, cy, fry) + hovDist;
if(!point_in_rectangle(mx, my, _x0, _y0, _x1, _y1)) return noone;
var downDirection = to.type == VALUE_TYPE.action || from.type == VALUE_TYPE.action; var downDirection = to.type == VALUE_TYPE.action || from.type == VALUE_TYPE.action;
#endregion var _loop = struct_try_get(params, "loop");
#region +++++ CHECK HOVER +++++
var _drawParam = {
extend : PREFERENCES.connection_line_extend,
fromIndex : fromIndex,
toIndex : toIndex,
}
var hovDist = max(th * 2, 6);
if(PANEL_GRAPH.pHOVER) {
if(_loop || from.node == to.node) { if(_loop || from.node == to.node) {
hover = distance_line_feedback(mx, my, jx, jy, frx, fry, _s) < hovDist; hover = distance_line_feedback(mx, my, jx, jy, frx, fry, _s) < hovDist;
} else { } else {
var _hdist = 999999; var _hdist;
switch(PREFERENCES.curve_connection_line) { switch(PREFERENCES.curve_connection_line) {
case 0 : case 0 :
if(downDirection) _hdist = distance_to_line(mx, my, jx, jy, frx, fry); if(downDirection) _hdist = distance_to_line(mx, my, jx, jy, frx, fry);
else _hdist = distance_to_linear_connection(mx, my, frx, fry, jx, jy, _s, _drawParam); else _hdist = distance_to_linear_connection(mx, my, frx, fry, jx, jy, _s, PREFERENCES.connection_line_extend);
break; break;
case 1 : case 1 :
@ -2458,33 +2434,56 @@ function drawJuncConnection(from, to, params) {
case 2 : case 2 :
if(downDirection) _hdist = distance_to_elbow_corner(mx, my, frx, fry, jx, jy); if(downDirection) _hdist = distance_to_elbow_corner(mx, my, frx, fry, jx, jy);
else _hdist = distance_to_elbow(mx, my, frx, fry, jx, jy, cx, cy, _s, _drawParam); else _hdist = distance_to_elbow(mx, my, frx, fry, jx, jy, cx, cy, _s);
break; break;
case 3 : case 3 :
if(downDirection) _hdist = distance_to_elbow_diag_corner(mx, my, frx, fry, jx, jy); if(downDirection) _hdist = distance_to_elbow_diag_corner(mx, my, frx, fry, jx, jy);
else _hdist = distance_to_elbow_diag(mx, my, frx, fry, jx, jy, cx, cy, _s, _drawParam); else _hdist = distance_to_elbow_diag(mx, my, frx, fry, jx, jy, cx, cy, _s, PREFERENCES.connection_line_extend, from.drawLineIndex, to.drawLineIndex);
break; break;
default : return noone;
} }
hover = _hdist < hovDist; hover = _hdist < hovDist;
if(PANEL_GRAPH.value_focus == noone) to.draw_line_shift_hover = hover;
}
} }
if(_active && hover) if(PANEL_GRAPH.value_focus == noone) to.draw_line_shift_hover = hover;
hovering = self; return hover? self : noone;
#endregion }
function drawJuncConnection(from, to, params, _thick = false) {
if(from == noone || to == noone) return noone;
static drawParam = {
extend : 0,
fromIndex : 0,
toIndex : 0,
corner : 0,
type : 0,
}
var high = params.highlight;
var bg = params.bg;
var aa = params.aa;
var _s = params.s;
var jx = to.x, jy = to.y;
var frx = from.x, fry = from.y;
if(params.minx != 0 && params.maxx != 0) {
if((jx < params.minx && frx < params.minx) || (jx > params.maxx && frx > params.maxx) ||
(jy < params.miny && fry < params.miny) || (jy > params.maxy && fry > params.maxy)) return noone;
}
var shx = to.draw_line_shift_x * _s;
var shy = to.draw_line_shift_y * _s;
var cx = round((frx + jx) / 2 + shx);
var cy = round((fry + jy) / 2 + shy);
var th = max(1, PREFERENCES.connection_line_width * _s) * (1 + _thick);
#region draw parameters #region draw parameters
var thicken = false;
thicken |= PANEL_GRAPH.nodes_junction_d == self;
thicken |= _active && PANEL_GRAPH.junction_hovering == self && PANEL_GRAPH.value_focus == noone;
thicken |= instance_exists(o_dialog_add_node) && o_dialog_add_node.junction_hovering == self;
th *= thicken? 2 : 1;
var corner = PREFERENCES.connection_line_corner * _s; var corner = PREFERENCES.connection_line_corner * _s;
var ty = LINE_STYLE.solid; var ty = LINE_STYLE.solid;
@ -2513,52 +2512,45 @@ function drawJuncConnection(from, to, params) {
} }
#endregion #endregion
#region +++++ DRAW LINE +++++
var ss = _s * aa; var ss = _s * aa;
jx *= aa; jx *= aa;
jy *= aa; jy *= aa;
frx *= aa; frx *= aa;
fry *= aa; fry *= aa;
th *= aa;
cx *= aa; cx *= aa;
cy *= aa; cy *= aa;
corner *= aa; corner *= aa;
th = max(1, round(th)); th = max(1, round(th * aa));
draw_set_color(c0); var _loop = struct_try_get(params, "loop");
if(_loop) { draw_line_feedback(jx, jy, frx, fry, th, c1, c0, ss); return; }
if(_loop || from.node == to.node) { var down = to.type == VALUE_TYPE.action || from.type == VALUE_TYPE.action;
draw_line_feedback(jx, jy, frx, fry, th, c1, c0, ss); drawParam.extend = PREFERENCES.connection_line_extend;
} else { drawParam.fromIndex = from.drawLineIndex;
_drawParam.corner = corner; drawParam.toIndex = to.drawLineIndex;
_drawParam.type = ty; drawParam.corner = corner;
drawParam.type = ty;
switch(PREFERENCES.curve_connection_line) { switch(PREFERENCES.curve_connection_line) {
case 0 : case 0 :
if(downDirection) draw_line_width_color(jx, jy, frx, fry, th, c0, c1); if(down) draw_line_width_color(jx, jy, frx, fry, th, c0, c1);
else draw_line_connect(frx, fry, jx, jy, ss, th, c0, c1, _drawParam); else draw_line_connect(frx, fry, jx, jy, ss, th, c0, c1, drawParam);
break; break;
case 1 : case 1 :
if(downDirection) draw_line_curve_corner(jx, jy, frx, fry, ss, th, c0, c1); if(down) draw_line_curve_corner(jx, jy, frx, fry, ss, th, c0, c1);
else draw_line_curve_color(jx, jy, frx, fry, cx, cy, ss, th, c0, c1, ty); else draw_line_curve_color(jx, jy, frx, fry, cx, cy, ss, th, c0, c1, ty);
break; break;
case 2 : case 2 :
if(downDirection) draw_line_elbow_corner(frx, fry, jx, jy, ss, th, c0, c1, _drawParam); if(down) draw_line_elbow_corner(frx, fry, jx, jy, ss, th, c0, c1, drawParam);
else draw_line_elbow_color(frx, fry, jx, jy, cx, cy, ss, th, c0, c1, _drawParam); else draw_line_elbow_color(frx, fry, jx, jy, cx, cy, ss, th, c0, c1, drawParam);
break; break;
case 3 : case 3 :
if(downDirection) draw_line_elbow_diag_corner(frx, fry, jx, jy, ss, th, c0, c1, _drawParam); if(down) draw_line_elbow_diag_corner(frx, fry, jx, jy, ss, th, c0, c1, drawParam);
else draw_line_elbow_diag_color(frx, fry, jx, jy, cx, cy, ss, th, c0, c1, _drawParam); else draw_line_elbow_diag_color(frx, fry, jx, jy, cx, cy, ss, th, c0, c1, drawParam);
break; break;
} }
} }
draw_set_alpha(1);
#endregion
return hovering;
}

View file

@ -219,7 +219,6 @@ function connectionParameter() constructor {
max_layer = 0; max_layer = 0;
highlight = 0; highlight = 0;
cur_layer = 1;
static setPos = function(_x, _y, _s, _mx, _my) { static setPos = function(_x, _y, _s, _mx, _my) {
self.x = _x; self.x = _x;
@ -403,12 +402,18 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
add_node_draw_x = 0; add_node_draw_x = 0;
add_node_draw_y = 0; add_node_draw_y = 0;
node_surface = surface_create(1, 1);
node_surface_update = true;
connection_aa = 2; connection_aa = 2;
connection_surface = surface_create(1, 1); connection_surface = surface_create(1, 1);
connection_surface_cc = surface_create(1, 1);
connection_surface_aa = surface_create(1, 1); connection_surface_aa = surface_create(1, 1);
connection_draw_mouse = noone; connection_draw_mouse = noone;
connection_draw_target = noone; connection_draw_target = noone;
connection_draw_update = true;
connection_cache = {};
value_focus = noone; value_focus = noone;
_value_focus = noone; _value_focus = noone;
@ -1196,6 +1201,29 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
return _hov; return _hov;
} }
function drawCacheCheck(_x, _y, _s, _w, _h) {
var _upd = false;
_upd |= pFOCUS && mouse_click(mb_any);
_upd |= connection_cache[$ "_x"] != _x; connection_cache[$ "_x"] = _x;
_upd |= connection_cache[$ "_y"] != _y; connection_cache[$ "_y"] = _y;
_upd |= connection_cache[$ "_s"] != _s; connection_cache[$ "_s"] = _s;
_upd |= connection_cache[$ "_w"] != _w; connection_cache[$ "_w"] = _w;
_upd |= connection_cache[$ "_h"] != _h; connection_cache[$ "_h"] = _h;
_upd |= connection_cache[$ "curve_connection_line"] != PREFERENCES.curve_connection_line; connection_cache[$ "curve_connection_line"] = PREFERENCES.curve_connection_line;
_upd |= connection_cache[$ "connection_line_width"] != PREFERENCES.connection_line_width; connection_cache[$ "connection_line_width"] = PREFERENCES.connection_line_width;
_upd |= connection_cache[$ "connection_line_corner"] != PREFERENCES.connection_line_corner; connection_cache[$ "connection_line_corner"] = PREFERENCES.connection_line_corner;
_upd |= connection_cache[$ "connection_line_extend"] != PREFERENCES.connection_line_extend; connection_cache[$ "connection_line_extend"] = PREFERENCES.connection_line_extend;
_upd |= connection_cache[$ "connection_line_aa"] != PREFERENCES.connection_line_aa; connection_cache[$ "connection_line_aa"] = PREFERENCES.connection_line_aa;
connection_draw_update |= _upd;
_upd |= connection_cache[$ "frame"] != CURRENT_FRAME; connection_cache[$ "frame"] = CURRENT_FRAME;
node_surface_update |= _upd;
}
function drawNodes() { // function drawNodes() { //
if(selection_block-- > 0) return; if(selection_block-- > 0) return;
display_parameter.highlight = !array_empty(nodes_selecting) && ((PREFERENCES.connection_line_highlight == 1 && key_mod_press(ALT)) || PREFERENCES.connection_line_highlight == 2); display_parameter.highlight = !array_empty(nodes_selecting) && ((PREFERENCES.connection_line_highlight == 1 && key_mod_press(ALT)) || PREFERENCES.connection_line_highlight == 2);
@ -1215,15 +1243,20 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
__self = self; __self = self;
var log = false; drawCacheCheck(__gr_x, __gr_y, __gr_s, __gr_w, __gr_h);
var log = 0;
var t = get_timer(); var t = get_timer();
printIf(log, "============ Draw start ============"); printIf(log, "============ Draw start ============");
_frame_hovering = frame_hovering; _frame_hovering = frame_hovering;
frame_hovering = noone; frame_hovering = noone;
var _node_draw = display_parameter.show_control? nodes_list : array_filter(nodes_list, function(_n) /*=>*/ {return !_n.is_controller}); var _node_active = nodes_list;
_node_draw = array_filter( _node_draw, function(_n) /*=>*/ { if(display_parameter.show_control) _node_active = array_filter(nodes_list, function(_n) /*=>*/ {return _n.active});
else _node_active = array_filter(nodes_list, function(_n) /*=>*/ {return _n.active && !_n.is_controller});
var _node_draw = array_filter( _node_active, function(_n) /*=>*/ {
_n.preDraw(__gr_x, __gr_y, __gr_s, __gr_x, __gr_y); _n.preDraw(__gr_x, __gr_y, __gr_s, __gr_x, __gr_y);
var _cull = _n.cullCheck(__gr_x, __gr_y, __gr_s, -32, -32, __gr_w + 32, __gr_h + 64); var _cull = _n.cullCheck(__gr_x, __gr_y, __gr_s, -32, -32, __gr_w + 32, __gr_h + 64);
@ -1484,30 +1517,41 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
// draw connections // draw connections
var aa = floor(min(8192 / w, 8192 / h, PREFERENCES.connection_line_aa)); var aa = floor(min(8192 / w, 8192 / h, PREFERENCES.connection_line_aa));
connection_draw_update |= !surface_valid(connection_surface_cc, w * aa, h * aa);
connection_surface = surface_verify(connection_surface, w * aa, h * aa); connection_surface = surface_verify(connection_surface, w * aa, h * aa);
connection_surface_cc = surface_verify(connection_surface_cc, w * aa, h * aa);
connection_surface_aa = surface_verify(connection_surface_aa, w, h ); connection_surface_aa = surface_verify(connection_surface_aa, w, h );
hov = noone;
if(connection_draw_update || pHOVER) {
surface_set_target(connection_surface_cc);
if(connection_draw_update) { DRAW_CLEAR }
var hoverable = !bool(node_dragging) && pHOVER;
connection_param.active = hoverable;
connection_param.setPos(gr_x, gr_y, graph_s, mx, my);
connection_param.setBoundary(-64, -64, w + 64, h + 64);
connection_param.setProp(array_length(_node_active), display_parameter.highlight);
connection_param.setDraw(aa, bg_color);
array_foreach(_node_active, function(n) /*=>*/ {
var _hov = n.drawConnections(connection_param, connection_draw_update);
if(is_struct(_hov)) hov = _hov;
});
connection_draw_update = false;
surface_reset_target();
}
surface_set_target(connection_surface); surface_set_target(connection_surface);
DRAW_CLEAR DRAW_CLEAR
var hov = noone; draw_surface(connection_surface_cc, 0, 0);
var hoverable = !bool(node_dragging) && pHOVER;
var param = connection_param;
param.active = hoverable; if(hov) drawJuncConnection(hov.value_from, hov, connection_param, true);
param.setPos(gr_x, gr_y, graph_s, mx, my);
param.setBoundary(-64, -64, w + 64, h + 64);
param.setProp(array_length(nodes_list), display_parameter.highlight);
param.setDraw(aa, bg_color);
for( var i = 0, n = array_length(nodes_list); i < n; i++ ) {
var _node = nodes_list[i];
if(!_node.active || (!display_parameter.show_control && _node.is_controller))
continue;
param.cur_layer = i + 1;
var _hov = _node.drawConnections(param);
if(_hov != noone && is_struct(_hov)) hov = _hov;
}
if(value_dragging && connection_draw_mouse != noone && !key_mod_press(SHIFT)) { if(value_dragging && connection_draw_mouse != noone && !key_mod_press(SHIFT)) {
var _cmx = connection_draw_mouse[0]; var _cmx = connection_draw_mouse[0];
@ -1515,7 +1559,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
var _cmt = connection_draw_target; var _cmt = connection_draw_target;
if(array_empty(value_draggings)) if(array_empty(value_draggings))
value_dragging.drawConnectionMouse(param, _cmx, _cmy, _cmt); value_dragging.drawConnectionMouse(connection_param, _cmx, _cmy, _cmt);
else { else {
var _stIndex = array_find(value_draggings, value_dragging); var _stIndex = array_find(value_draggings, value_dragging);
@ -1523,7 +1567,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
var _dmx = _cmx; var _dmx = _cmx;
var _dmy = value_draggings[i].connect_type == CONNECT_TYPE.output? _cmy + (i - _stIndex) * 24 * graph_s : _cmy; var _dmy = value_draggings[i].connect_type == CONNECT_TYPE.output? _cmy + (i - _stIndex) * 24 * graph_s : _cmy;
value_draggings[i].drawConnectionMouse(param, _dmx, _dmy, _cmt); value_draggings[i].drawConnectionMouse(connection_param, _dmx, _dmy, _cmt);
} }
} }
} else if(add_node_draw_junc != noone) { } else if(add_node_draw_junc != noone) {
@ -1534,7 +1578,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
var _amx = gr_x + add_node_draw_x * graph_s; var _amx = gr_x + add_node_draw_x * graph_s;
var _amy = gr_y + add_node_draw_y * graph_s; var _amy = gr_y + add_node_draw_y * graph_s;
add_node_draw_junc.drawConnectionMouse(param, _amx, _amy); add_node_draw_junc.drawConnectionMouse(connection_param, _amx, _amy);
} }
} }
surface_reset_target(); surface_reset_target();
@ -1565,12 +1609,19 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
var t = get_timer(); var t = get_timer();
array_foreach(_node_draw, function(_n) /*=>*/ { _n.drawNodeBehind(__gr_x, __gr_y, __mx, __my, __gr_s); }); node_surface_update |= !surface_valid(node_surface, w, h);
node_surface_update |= true;
node_surface = surface_verify(node_surface, w, h);
surface_set_target(node_surface);
if(node_surface_update) draw_clear_alpha(bg_color, 0.);
if(node_surface_update) array_foreach(_node_draw, function(_n) /*=>*/ { _n.drawNodeBehind(__gr_x, __gr_y, __mx, __my, __gr_s); });
array_foreach(value_draggings, function(_v) /*=>*/ { _v.graph_selecting = true; }); array_foreach(value_draggings, function(_v) /*=>*/ { _v.graph_selecting = true; });
array_foreach(_node_draw, function(_n) /*=>*/ { array_foreach(_node_draw, function(_n) /*=>*/ {
try { try {
var val = _n.drawNode(__gr_x, __gr_y, __mx, __my, __gr_s, display_parameter, __self); var val = _n.drawNode(node_surface_update, __gr_x, __gr_y, __mx, __my, __gr_s, display_parameter, __self);
if(val) { if(val) {
value_focus = val; value_focus = val;
if(key_mod_press(SHIFT)) TOOLTIP = [ val.getValue(), val.type ]; if(key_mod_press(SHIFT)) TOOLTIP = [ val.getValue(), val.type ];
@ -1578,12 +1629,19 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
} catch(e) { log_warning("NODE DRAW", exception_print(e)); } } catch(e) { log_warning("NODE DRAW", exception_print(e)); }
}); });
array_foreach(_node_draw, function(_n) /*=>*/ { _n.drawBadge(__gr_x, __gr_y, __gr_s); }); if(node_surface_update) array_foreach(_node_draw, function(_n) /*=>*/ { _n.drawBadge(__gr_x, __gr_y, __gr_s); });
array_foreach(_node_draw, function(_n) /*=>*/ { _n.drawNodeFG(__gr_x, __gr_y, __mx, __my, __gr_s, display_parameter, __self); }); if(node_surface_update) array_foreach(_node_draw, function(_n) /*=>*/ { _n.drawNodeFG(__gr_x, __gr_y, __mx, __my, __gr_s, display_parameter, __self); });
surface_reset_target();
node_surface_update = false;
if(PANEL_INSPECTOR && PANEL_INSPECTOR.prop_hover != noone) if(PANEL_INSPECTOR && PANEL_INSPECTOR.prop_hover != noone)
value_focus = PANEL_INSPECTOR.prop_hover; value_focus = PANEL_INSPECTOR.prop_hover;
BLEND_ALPHA_MULP
draw_surface_safe(node_surface);
BLEND_NORMAL
printIf(log, $"Draw node: {get_timer() - t}"); t = get_timer(); printIf(log, $"Draw node: {get_timer() - t}"); t = get_timer();
// dragging // dragging
@ -1835,7 +1893,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
} }
} }
if(_connect[0] == -7 && !is_instanceof(value_dragging.node, Node_Pin)) { if(_connect[0] == -7 && !is(value_dragging.node, Node_Pin)) {
if(_connect[1].value_from_loop != noone) if(_connect[1].value_from_loop != noone)
_connect[1].value_from_loop.destroy(); _connect[1].value_from_loop.destroy();
@ -1933,8 +1991,8 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
connection_draw_mouse = [ _mmx, _mmy ]; connection_draw_mouse = [ _mmx, _mmy ];
connection_draw_target = target; connection_draw_target = target;
value_dragging.drawJunction(graph_s, value_dragging.x, value_dragging.y); value_dragging.drawJunction(true, graph_s, value_dragging.x, value_dragging.y);
if(target) target.drawJunction(graph_s, target.x, target.y); if(target) target.drawJunction(true, graph_s, target.x, target.y);
var _inline_ctx = value_dragging.node.inline_context; var _inline_ctx = value_dragging.node.inline_context;

View file

@ -86,7 +86,7 @@ function graph_export_image(allList, nodeList, settings = {}) {
#region draw frame #region draw frame
for(var i = 0; i < array_length(nodeList); i++) { for(var i = 0; i < array_length(nodeList); i++) {
if(instanceof(nodeList[i]) != "Node_Frame") continue; if(instanceof(nodeList[i]) != "Node_Frame") continue;
nodeList[i].drawNode(gr_x, gr_y, mx, my, scale); nodeList[i].drawNode(true, gr_x, gr_y, mx, my, scale);
} }
#endregion #endregion
@ -118,7 +118,7 @@ function graph_export_image(allList, nodeList, settings = {}) {
for(var i = 0; i < array_length(nodeList); i++) { for(var i = 0; i < array_length(nodeList); i++) {
var _node = nodeList[i]; var _node = nodeList[i];
if(instanceof(_node) == "Node_Frame") continue; if(instanceof(_node) == "Node_Frame") continue;
var val = _node.drawNode(gr_x, gr_y, mx, my, scale, param); var val = _node.drawNode(true, gr_x, gr_y, mx, my, scale, param);
} }
#endregion #endregion

View file

@ -7,7 +7,7 @@ function struct_override(original, override) {
var args = variable_struct_get_names(override); var args = variable_struct_get_names(override);
for( var i = 0, n = array_length(args); i < n; i++ ) { for( var i = 0, n = array_length(args); i < n; i++ ) {
var _key = args[i]; var _key = array_safe_get(args, i);
if(!struct_has(original, _key)) continue; if(!struct_has(original, _key)) continue;
original[$ _key] = override[$ _key]; original[$ _key] = override[$ _key];
@ -22,7 +22,7 @@ function struct_override_nested(original, override) {
var args = variable_struct_get_names(override); var args = variable_struct_get_names(override);
for( var i = 0, n = array_length(args); i < n; i++ ) { for( var i = 0, n = array_length(args); i < n; i++ ) {
var _key = args[i]; var _key = array_safe_get(args, i);
if(!struct_has(original, _key)) continue; if(!struct_has(original, _key)) continue;
if(is_struct(original[$ _key])) if(is_struct(original[$ _key]))
@ -39,8 +39,10 @@ function struct_append(original, append) {
var args = variable_struct_get_names(append); var args = variable_struct_get_names(append);
for( var i = 0, n = array_length(args); i < n; i++ ) for( var i = 0, n = array_length(args); i < n; i++ ) {
original[$ args[i]] = append[$ args[i]]; var _key = array_safe_get(args, i);
original[$ _key] = append[$ _key];
}
return original; return original;
} }