[Flip to VFX] Fix freeze on connect,

This commit is contained in:
Tanasart 2025-01-29 14:47:54 +07:00
parent 1b4c4acd7f
commit 5ecca493fb
11 changed files with 74 additions and 61 deletions

View file

@ -316,7 +316,6 @@
{"name":"_addon_custom","order":4,"path":"objects/_addon_custom/_addon_custom.yy",},
{"name":"_p_dialog_undo_block","order":1,"path":"objects/_p_dialog_undo_block/_p_dialog_undo_block.yy",},
{"name":"addon","order":1,"path":"objects/addon/addon.yy",},
{"name":"FLIP_Domain","order":5,"path":"objects/FLIP_Domain/FLIP_Domain.yy",},
{"name":"o_dialog_add_image","order":3,"path":"objects/o_dialog_add_image/o_dialog_add_image.yy",},
{"name":"o_dialog_add_node","order":1,"path":"objects/o_dialog_add_node/o_dialog_add_node.yy",},
{"name":"o_dialog_assetbox","order":4,"path":"objects/o_dialog_assetbox/o_dialog_assetbox.yy",},
@ -851,8 +850,9 @@
{"name":"node_FLIP_apply_force","order":8,"path":"scripts/node_FLIP_apply_force/node_FLIP_apply_force.yy",},
{"name":"node_FLIP_apply_velocity","order":7,"path":"scripts/node_FLIP_apply_velocity/node_FLIP_apply_velocity.yy",},
{"name":"node_FLIP_destroy","order":11,"path":"scripts/node_FLIP_destroy/node_FLIP_destroy.yy",},
{"name":"node_FLIP_domain","order":3,"path":"scripts/node_FLIP_domain/node_FLIP_domain.yy",},
{"name":"node_FLIP_render","order":4,"path":"scripts/node_FLIP_render/node_FLIP_render.yy",},
{"name":"node_FLIP_domain","order":4,"path":"scripts/node_FLIP_domain/node_FLIP_domain.yy",},
{"name":"node_FLIP_group_inline","order":3,"path":"scripts/node_FLIP_group_inline/node_FLIP_group_inline.yy",},
{"name":"node_FLIP_render","order":5,"path":"scripts/node_FLIP_render/node_FLIP_render.yy",},
{"name":"node_FLIP_repel","order":12,"path":"scripts/node_FLIP_repel/node_FLIP_repel.yy",},
{"name":"node_FLIP_spawner","order":6,"path":"scripts/node_FLIP_spawner/node_FLIP_spawner.yy",},
{"name":"node_FLIP_to_VFX","order":14,"path":"scripts/node_FLIP_to_VFX/node_FLIP_to_VFX.yy",},

Binary file not shown.

View file

@ -1,11 +1,11 @@
{
"spr":"s_node_icon",
"name":"FLIP to VFX",
"baseNode":"Node_FLIP_to_VFX",
"spr":"s_node_flip_to_VFX",
"pxc_version":11680.0,
"show_in_recent":false,
"baseNode":"Node_FLIP_to_VFX",
"io":[
"fDomain",
"particle"
],
"name":"FLIP to VFX"
}

View file

@ -37,7 +37,10 @@ function __particleObject() constructor {
__temp_pt = [ 0, 0 ];
static draw = function(exact, surf_w, surf_h) {
if(!surface_exists(surf)) return;
if(!is_surface(surf)) {
draw_point_color(x, y, blend);
return;
}
var _sw = surface_get_width(surf) * scx;
var _sh = surface_get_height(surf) * scy;

View file

@ -48,9 +48,6 @@ function globalvar_viewer_draw(xx, yy, ww, _m, focus, hover, _scrollPane, rx, ry
var_drag_insert = max(0, j > var_dragging? j : j - 1);
if(j) {
// draw_set_color(merge_color(c_black, COLORS.panel_toolbar_separator, 0.75));
// draw_line_round(wd_x + ui(8), yy, wd_x + wd_w - ui(16), yy, 2);
yy += _pd_h;
hh += _pd_h;
}
@ -121,9 +118,16 @@ function globalvar_viewer_draw(xx, yy, ww, _m, focus, hover, _scrollPane, rx, ry
if(del != noone)
array_delete(_node.inputs, del, 1);
} else {
padd = viewMode == INSP_VIEW_MODE.spacious? ui(8) : ui(4);
if(viewMode == INSP_VIEW_MODE.compact) {
yy += ui(4);
hh += ui(4);
}
for( var j = 0; j < array_length(_node.inputs); j++ ) {
var widg = drawWidget(xx, yy, ww, _m, _node.inputs[j], true, focus, hover, _scrollPane, rx, ry);
var widg = drawWidget(xx, yy, ww, _m, _node.inputs[j], true, hover, focus, _scrollPane, rx, ry);
var widH = widg[0];
var mbRight = widg[1];
var widHov = widg[2];

View file

@ -42,6 +42,8 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc
#region left buttons
var butx = xx;
var lb_x = xx + ui(20);
if(jun.connect_type == CONNECT_TYPE.input && jun.isAnimable() && !jun.expUse) { // Animation
var index = jun.hasJunctionFrom()? 2 : jun.is_anim;
@ -49,8 +51,10 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc
if(jun.is_anim) cc = COLORS._main_value_positive;
if(index == 2) cc = COLORS._main_accent;
draw_sprite_ui_uniform(THEME.animate_clock, index, butx, lb_y, 1, cc, 0.8);
if(_hover && point_in_circle(_m[0], _m[1], butx, lb_y, ui(10))) {
var _hov = _hover && point_in_circle(_m[0], _m[1], butx, lb_y, ui(10));
draw_sprite_ui_uniform(THEME.animate_clock, index, butx, lb_y, 1, cc, .8 + .2 * _hov);
if(_hov) {
cHov = true;
if(anim_hold != noone)
@ -69,11 +73,12 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc
}
}
}
if(anim_hold != noone && mouse_release(mb_left)) anim_hold = noone;
butx += ui(20);
if(!global_var) { // Visibility
butx += ui(20);
lb_x += ui(20);
var _visi = jun.isVisible();
draw_sprite_ui_uniform(THEME.junc_visible, _visi, butx, lb_y, 1,, 0.8);
@ -87,15 +92,13 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc
draw_sprite_ui_uniform(THEME.junc_visible, _visi, butx, lb_y, 1,, 1);
TOOLTIP = __txt("Visibility");
if(mouse_press(mb_left, _focus)) {
jun.setVisibleManual(_visi? -1 : 1);
visi_hold = jun.visible_manual;
}
}
} else
draw_sprite_ui_uniform(THEME.node_use_expression, 0, butx, lb_y, 1,, 0.8);
}
if(visi_hold != noone && mouse_release(mb_left)) visi_hold = noone;
@ -114,7 +117,6 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc
draw_set_text(_font, fa_left, fa_center, cc);
var lb_w = ui(40 + 16) + string_width(_name);
var lb_x = ui(40) + xx;
if(jun.color != -1) {
draw_sprite_ext(THEME.timeline_color, 1, lb_x + ui(8), lb_y, 1, 1, 0, jun.color, 1);
@ -143,7 +145,7 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc
}
#endregion
#region label
#region draw name
draw_text_add(lb_x, lb_y, _name);
if(jun.tooltip != "") { // Tooltip

View file

@ -14,6 +14,7 @@ function Node_VFX_Group_Inline(_x, _y, _group = noone) : Node_Collection_Inline(
is_simulation = true;
update_on_frame = true;
managedRenderOrder = true;
loopable = true;
prev_nodes = [];
@ -51,7 +52,6 @@ function Node_VFX_Group_Inline(_x, _y, _group = noone) : Node_Collection_Inline(
if(!string_pos("Node_VFX", _ins))
continue;
if(_ins == "Node_VFX_Renderer" || _ins == "Node_VFX_Renderer_Output")
continue;

View file

@ -42,7 +42,7 @@ function Node_VFX_Renderer(_x, _y, _group = noone) : Node(_x, _y, _group) constr
array_push(input_display_list, ["Particle", false], index + 0, index + 1);
return inputs[index + 1];
}
}
setDynamicInput(2, true, VALUE_TYPE.particle);
dyna_input_check_shift = 1;
@ -80,13 +80,12 @@ function Node_VFX_Renderer(_x, _y, _group = noone) : Node(_x, _y, _group) constr
var surf_w = surface_get_width_safe(_outSurf);
var surf_h = surface_get_height_safe(_outSurf);
surface_set_shader(_outSurf, _type == PARTICLE_RENDER_TYPE.surface? sh_sample : noone);
if(_type == PARTICLE_RENDER_TYPE.surface)
shader_set_interpolation(_outSurf);
surface_set_shader(_outSurf, noone);
var blend, parts, part, _part;
for( var i = input_fix_len; i < array_length(inputs); i += data_length ) {
var blend = inputs[i + 0].getValue(_time);
var parts = inputs[i + 1].getValue(_time);
for( var i = input_fix_len, n = array_length(inputs); i < n; i += data_length ) {
blend = inputs[i + 0].getValue(_time);
parts = inputs[i + 1].getValue(_time);
switch(blend) {
case PARTICLE_BLEND_MODE.normal: BLEND_NORMAL break;
@ -97,16 +96,16 @@ function Node_VFX_Renderer(_x, _y, _group = noone) : Node(_x, _y, _group) constr
if(!is_array(parts) || array_length(parts) == 0) continue;
if(!is_array(parts[0])) parts = [ parts ];
for(var j = 0; j < array_length(parts); j++) {
var part = parts[j];
for( var j = 0, m = array_length(parts); j < m; j++ ) {
part = parts[j];
for(var k = 0; k < array_length(part); k++) {
var _part = part[k];
for( var k = 0, p = array_length(part); k < p; k++ ) {
_part = part[k];
_part.render_type = _type;
_part.line_draw = _llife;
if(_part.active || _type) _part.draw(_exact, surf_w, surf_h);
if(_part.active || _type)
_part.draw(_exact, surf_w, surf_h);
}
}
}

View file

@ -479,7 +479,7 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
if(dummy_input) dummy_input.index = _ina;
inputs = _in;
refreshNodeDisplay();
setHeight();
if(input_display_dynamic == -1) input_display_list = _input_display_list;
}

View file

@ -226,10 +226,10 @@ function Panel_Inspector() : PanelContent() constructor {
meta_steam_avatar = new checkBox(function() { STEAM_UGC_ITEM_AVATAR = !STEAM_UGC_ITEM_AVATAR; });
global_buttons = [
button(function() /*=>*/ { meta_display[2][1] = false; var_editing = !var_editing; } ).setIcon(THEME.gear_16, 0, COLORS._main_icon_light),
button(function() /*=>*/ { meta_display[2][1] = false; PROJECT.globalNode.createValue(); } ).setIcon(THEME.add_16, 0, COLORS._main_value_positive),
];
global_button_edit = button(function() /*=>*/ { meta_display[2][1] = false; var_editing = !var_editing; }).setIcon(THEME.gear_16, 0, COLORS._main_icon_light);
global_button_new = button(function() /*=>*/ { meta_display[2][1] = false; PROJECT.globalNode.createValue(); }).setIcon(THEME.add_16, 0, COLORS._main_value_positive);
global_buttons = [ global_button_edit ];
global_buttons_editing = [ global_button_edit, global_button_new ];
GM_Explore_draw_init();
#endregion
@ -450,17 +450,18 @@ function Panel_Inspector() : PanelContent() constructor {
var _x1 = con_w;
var _y1 = yy + ui(2);
var _amo = array_length(global_buttons);
var _butts = var_editing? global_buttons_editing : global_buttons;
var _amo = array_length(_butts);
var _tw = (_bw + ui(4)) * _amo;
draw_sprite_stretched_ext(THEME.box_r5_clr, 0, con_w - _tw, yy, _tw, lbh, COLORS.panel_inspector_group_bg, 1);
global_buttons[0].icon = var_editing? THEME.accept_16 : THEME.gear_16;
global_buttons[0].icon_blend = var_editing? COLORS._main_value_positive : COLORS._main_icon_light;
global_button_edit.icon = var_editing? THEME.accept_16 : THEME.gear_16;
global_button_edit.icon_blend = var_editing? COLORS._main_value_positive : COLORS._main_icon_light;
for (var j = 0, m = array_length(global_buttons); j < m; j++) {
for (var j = 0, m = array_length(_butts); j < m; j++) {
_x1 -= _bw + ui(4);
var _b = global_buttons[j];
var _b = _butts[j];
_b.setFocusHover(pFOCUS, _hover);
_b.draw(_x1 + ui(2), _y1, _bw, _bh, _m, THEME.button_hide_fill);
if(_b.inBBOX(_m)) contentPane.hover_content = true;

View file

@ -48,12 +48,11 @@ function NodeTopoSort() {
}
function NodeListSort(_nodeList) {
var _arr = [];
__topoSort(_arr, _nodeList);
var _arr = __topoSort([], _nodeList);
return _arr;
}
function __sortNode(_arr, _node, _sorted) {
function __sortNode(_arr, _node, _sorted, _nodeMap = undefined) {
if(struct_has(_sorted, _node.node_id)) return;
var _parents = [];
@ -62,7 +61,8 @@ function __sortNode(_arr, _node, _sorted) {
for( var i = 0, n = array_length(_prev); i < n; i++ ) {
var _in = _prev[i];
if(_in == noone || struct_has(_sorted, _in.node_id)) continue;
if(_nodeMap != undefined && !struct_has(_nodeMap, _in.node_id)) continue;
array_push(_parents, _in);
}
@ -72,7 +72,7 @@ function __sortNode(_arr, _node, _sorted) {
__topoSort(_arr, _node.nodes, _sorted);
for( var i = 0, n = array_length(_parents); i < n; i++ )
__sortNode(_arr, _parents[i], _sorted);
__sortNode(_arr, _parents[i], _sorted, _nodeMap);
if(struct_has(_sorted, _node.node_id)) return;
array_push(_arr, _node);
@ -83,39 +83,42 @@ function __sortNode(_arr, _node, _sorted) {
// print($" > Adding > {_node.name} | {_arr}");
}
function __topoSort(_arr, _nodeArr, _sorted = {}) {
var _root = [];
function __topoSort(_arr = [], _nodeArr = [], _sorted = {}) {
var _leaf = [];
var _leftOver = [];
var _global = _nodeArr == PROJECT.nodes;
var _nodeMap = _global? undefined : {};
__temp_nodeList = _nodeArr;
for( var i = 0, n = array_length(_nodeArr); i < n; i++ ) {
var _node = _nodeArr[i];
var _isRoot = true;
var _isLeaf = true;
if(!_global) _nodeMap[$ _node.node_id] = 1;
if(is_instanceof(_node, Node_Collection_Inline) && !_node.is_root) { array_push(_leftOver, _node); continue; }
if(_node.attributes.show_update_trigger && !array_empty(_node.updatedOutTrigger.getJunctionTo())) {
_isRoot = false;
_isLeaf = false;
} else {
for( var j = 0, m = array_length(_node.outputs); j < m; j++ ) {
var _to = _node.outputs[j].getJunctionTo();
if(_global) _isRoot &= array_empty(_to);
else _isRoot &= !array_any(_to, function(_val) /*=>*/ {return array_exists(__temp_nodeList, _val.node)});
if(_global) _isLeaf &= array_empty(_to);
else _isLeaf &= !array_any(_to, function(_val) /*=>*/ {return array_exists(__temp_nodeList, _val.node)});
if(!_isRoot) break;
if(!_isLeaf) break;
}
}
if(_isRoot) array_push(_root, _node);
if(_isLeaf) array_push(_leaf, _node);
}
// print($"Root: {_root}");
// print($"Leaf: {_leaf}");
for( var i = 0, n = array_length(_root); i < n; i++ )
__sortNode(_arr, _root[i], _sorted);
for( var i = 0, n = array_length(_leaf); i < n; i++ )
__sortNode(_arr, _leaf[i], _sorted, _nodeMap);
for( var i = 0, n = array_length(_leftOver); i < n; i++ ) {
if(!struct_has(_sorted, _leftOver[i].node_id))
@ -123,6 +126,7 @@ function __topoSort(_arr, _nodeArr, _sorted = {}) {
}
__temp_nodeList = [];
return _arr;
}
function __nodeLeafList(_arr) {