[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":"_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":"_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":"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_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_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",}, {"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_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_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_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_domain","order":4,"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_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_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_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",}, {"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, "pxc_version":11680.0,
"show_in_recent":false, "show_in_recent":false,
"baseNode":"Node_FLIP_to_VFX",
"io":[ "io":[
"fDomain", "fDomain",
"particle" "particle"
], ],
"name":"FLIP to VFX"
} }

View file

@ -37,7 +37,10 @@ function __particleObject() constructor {
__temp_pt = [ 0, 0 ]; __temp_pt = [ 0, 0 ];
static draw = function(exact, surf_w, surf_h) { 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 _sw = surface_get_width(surf) * scx;
var _sh = surface_get_height(surf) * scy; 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); var_drag_insert = max(0, j > var_dragging? j : j - 1);
if(j) { 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; yy += _pd_h;
hh += _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) if(del != noone)
array_delete(_node.inputs, del, 1); array_delete(_node.inputs, del, 1);
} else { } 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++ ) { 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 widH = widg[0];
var mbRight = widg[1]; var mbRight = widg[1];
var widHov = widg[2]; 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 #region left buttons
var butx = xx; var butx = xx;
var lb_x = xx + ui(20);
if(jun.connect_type == CONNECT_TYPE.input && jun.isAnimable() && !jun.expUse) { // Animation if(jun.connect_type == CONNECT_TYPE.input && jun.isAnimable() && !jun.expUse) { // Animation
var index = jun.hasJunctionFrom()? 2 : jun.is_anim; 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(jun.is_anim) cc = COLORS._main_value_positive;
if(index == 2) cc = COLORS._main_accent; if(index == 2) cc = COLORS._main_accent;
draw_sprite_ui_uniform(THEME.animate_clock, index, butx, lb_y, 1, cc, 0.8); var _hov = _hover && point_in_circle(_m[0], _m[1], butx, lb_y, ui(10));
if(_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; cHov = true;
if(anim_hold != noone) if(anim_hold != noone)
@ -72,8 +76,9 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc
if(anim_hold != noone && mouse_release(mb_left)) anim_hold = noone; if(anim_hold != noone && mouse_release(mb_left)) anim_hold = noone;
butx += ui(20);
if(!global_var) { // Visibility if(!global_var) { // Visibility
butx += ui(20);
lb_x += ui(20);
var _visi = jun.isVisible(); var _visi = jun.isVisible();
draw_sprite_ui_uniform(THEME.junc_visible, _visi, butx, lb_y, 1,, 0.8); draw_sprite_ui_uniform(THEME.junc_visible, _visi, butx, lb_y, 1,, 0.8);
@ -93,9 +98,7 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc
visi_hold = jun.visible_manual; 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; 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); draw_set_text(_font, fa_left, fa_center, cc);
var lb_w = ui(40 + 16) + string_width(_name); var lb_w = ui(40 + 16) + string_width(_name);
var lb_x = ui(40) + xx;
if(jun.color != -1) { if(jun.color != -1) {
draw_sprite_ext(THEME.timeline_color, 1, lb_x + ui(8), lb_y, 1, 1, 0, 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 #endregion
#region label #region draw name
draw_text_add(lb_x, lb_y, _name); draw_text_add(lb_x, lb_y, _name);
if(jun.tooltip != "") { // Tooltip 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; is_simulation = true;
update_on_frame = true; update_on_frame = true;
managedRenderOrder = true; managedRenderOrder = true;
loopable = true;
prev_nodes = []; prev_nodes = [];
@ -51,7 +52,6 @@ function Node_VFX_Group_Inline(_x, _y, _group = noone) : Node_Collection_Inline(
if(!string_pos("Node_VFX", _ins)) if(!string_pos("Node_VFX", _ins))
continue; continue;
if(_ins == "Node_VFX_Renderer" || _ins == "Node_VFX_Renderer_Output") if(_ins == "Node_VFX_Renderer" || _ins == "Node_VFX_Renderer_Output")
continue; continue;

View file

@ -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_w = surface_get_width_safe(_outSurf);
var surf_h = surface_get_height_safe(_outSurf); var surf_h = surface_get_height_safe(_outSurf);
surface_set_shader(_outSurf, _type == PARTICLE_RENDER_TYPE.surface? sh_sample : noone); surface_set_shader(_outSurf, noone);
if(_type == PARTICLE_RENDER_TYPE.surface) var blend, parts, part, _part;
shader_set_interpolation(_outSurf);
for( var i = input_fix_len; i < array_length(inputs); i += data_length ) { for( var i = input_fix_len, n = array_length(inputs); i < n; i += data_length ) {
var blend = inputs[i + 0].getValue(_time); blend = inputs[i + 0].getValue(_time);
var parts = inputs[i + 1].getValue(_time); parts = inputs[i + 1].getValue(_time);
switch(blend) { switch(blend) {
case PARTICLE_BLEND_MODE.normal: BLEND_NORMAL break; 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) || array_length(parts) == 0) continue;
if(!is_array(parts[0])) parts = [ parts ]; if(!is_array(parts[0])) parts = [ parts ];
for(var j = 0; j < array_length(parts); j++) { for( var j = 0, m = array_length(parts); j < m; j++ ) {
var part = parts[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.render_type = _type;
_part.line_draw = _llife; _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; if(dummy_input) dummy_input.index = _ina;
inputs = _in; inputs = _in;
refreshNodeDisplay(); setHeight();
if(input_display_dynamic == -1) input_display_list = _input_display_list; 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; }); meta_steam_avatar = new checkBox(function() { STEAM_UGC_ITEM_AVATAR = !STEAM_UGC_ITEM_AVATAR; });
global_buttons = [ global_button_edit = 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; 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);
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(); GM_Explore_draw_init();
#endregion #endregion
@ -450,17 +450,18 @@ function Panel_Inspector() : PanelContent() constructor {
var _x1 = con_w; var _x1 = con_w;
var _y1 = yy + ui(2); 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; 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); 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_button_edit.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_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); _x1 -= _bw + ui(4);
var _b = global_buttons[j]; var _b = _butts[j];
_b.setFocusHover(pFOCUS, _hover); _b.setFocusHover(pFOCUS, _hover);
_b.draw(_x1 + ui(2), _y1, _bw, _bh, _m, THEME.button_hide_fill); _b.draw(_x1 + ui(2), _y1, _bw, _bh, _m, THEME.button_hide_fill);
if(_b.inBBOX(_m)) contentPane.hover_content = true; if(_b.inBBOX(_m)) contentPane.hover_content = true;

View file

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