- [Inspector Panel] Compact view trigger now show up and applies to project attributes, metadata.

This commit is contained in:
Tanasart 2024-05-08 11:44:41 +07:00
parent 5aa848c087
commit 72c4589379
6 changed files with 181 additions and 66 deletions

View file

@ -668,6 +668,7 @@ function BBMOD_Quaternion(_x=0.0, _y=0.0, _z=0.0, _w=1.0) constructor
}; };
} }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function quarternionArraySlerp(_q0, _q1, _s) { function quarternionArraySlerp(_q0, _q1, _s) {
INLINE INLINE
@ -739,4 +740,70 @@ function quarternionArraySlerp(_q0, _q1, _s) {
(_q12 * _s1) + (_q22 * _s2), (_q12 * _s1) + (_q22 * _s2),
(_q13 * _s1) + (_q23 * _s2) (_q13 * _s1) + (_q23 * _s2)
]; ];
}; };
function quarternionFromEuler(_x, _y, _z) {
INLINE
_x = -_x * 0.5;
_y = -_y * 0.5;
_z = -_z * 0.5;
var _q1Sin, _q1Cos, _temp;
var _qX, _qY, _qZ, _qW;
_q1Sin = dsin(_z);
_q1Cos = dcos(_z);
_temp = dsin(_x);
_qX = _q1Cos * _temp;
_qY = _q1Sin * _temp;
_temp = dcos(_x);
_qZ = _q1Sin * _temp;
_qW = _q1Cos * _temp;
_q1Sin = dsin(_y);
_q1Cos = dcos(_y);
var X = _qX * _q1Cos - _qZ * _q1Sin;
var Y = _qW * _q1Sin + _qY * _q1Cos;
var Z = _qZ * _q1Cos + _qX * _q1Sin;
var W = _qW * _q1Cos - _qY * _q1Sin;
return [ X, Y, Z, W ];
}
function quarternionToEuler(X, Y, Z, W) {
INLINE
var ysqr = Y * Y;
// roll (x-axis rotation)
var t0 = +2.0 * (W * X + Y * Z);
var t1 = +1.0 - 2.0 * (X * X + ysqr);
var roll = arctan2(t0, t1);
// pitch (y-axis rotation)
var t2 = +2.0 * (W * Y - Z * X);
t2 = clamp(t2, -1.0, 1.0); // Prevent numerical instability
var pitch = arcsin(t2);
// yaw (z-axis rotation)
var t3 = +2.0 * (W * Z + X * Y);
var t4 = +1.0 - 2.0 * (ysqr + Z * Z);
var yaw = arctan2(t3, t4);
// Convert radians to degrees
var _dx = roll * 180.0 / pi;
var _dy = pitch * 180.0 / pi;
var _dz = yaw * 180.0 / pi;
var _dx = round(_dx * 1000) / 1000;
var _dy = round(_dy * 1000) / 1000;
var _dz = round(_dz * 1000) / 1000;
return [ _dx, _dy, _dz ];
}

View file

@ -569,9 +569,10 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
if(attributes.show_update_trigger) { if(attributes.show_update_trigger) {
if(updatedInTrigger.getValue()) { if(updatedInTrigger.getValue()) {
getInputs(); getInputs();
update(); update();
updatedInTrigger.setValue(false); updatedInTrigger.setValue(false);
} }
updatedOutTrigger.setValue(false); updatedOutTrigger.setValue(false);
@ -824,6 +825,9 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
static getPreviousNodes = function() { #region static getPreviousNodes = function() { #region
var prev = []; var prev = [];
if(attributes.show_update_trigger && updatedInTrigger.value_from)
array_push(prev, updatedInTrigger.value_from.node);
for( var i = 0, n = ds_list_size(inputs); i < n; i++ ) { for( var i = 0, n = ds_list_size(inputs); i < n; i++ ) {
var _in = inputs[| i]; var _in = inputs[| i];
@ -943,7 +947,6 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
static refreshNodeDisplay = function() { #region static refreshNodeDisplay = function() { #region
INLINE INLINE
if(IS_PLAYING) return;
updateIO(); updateIO();
setHeight(); setHeight();

View file

@ -1,7 +1,6 @@
function Node_Trigger(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { function Node_Trigger(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "Trigger"; name = "Trigger";
update_on_frame = true; setDimension(96, 56);
setDimension(96, 32 + 24 * 1);
inputs[| 0] = nodeValue("Trigger", self, JUNCTION_CONNECT.input, VALUE_TYPE.trigger, false ) inputs[| 0] = nodeValue("Trigger", self, JUNCTION_CONNECT.input, VALUE_TYPE.trigger, false )
.setDisplay(VALUE_DISPLAY.button, { name: "Trigger" }); .setDisplay(VALUE_DISPLAY.button, { name: "Trigger" });
@ -16,8 +15,6 @@ function Node_Trigger(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
static update = function() { static update = function() {
var _val = inputs[| 0].getValue(); var _val = inputs[| 0].getValue();
//print($"{CURRENT_FRAME}: {ds_list_to_array(inputs[| 0].animator.values)} | {inputs[| 0].animator.getValue(CURRENT_FRAME)}");
outputs[| 0].setValue(_val); outputs[| 0].setValue(_val);
} }

View file

@ -1650,7 +1650,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
cache_value[2] = val; cache_value[2] = val;
cache_value[3] = applyUnit; cache_value[3] = applyUnit;
if(!IS_PLAYING) updateColor(val); updateColor(val);
return val; return val;
} #endregion } #endregion
@ -1714,6 +1714,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
val = arrayBalance(val); val = arrayBalance(val);
if(value_from != noone && display_type == VALUE_DISPLAY.d3quarternion && display_data.angle_display == QUARTERNION_DISPLAY.euler)
val = quarternionFromEuler(val[0], val[1], val[2]);
if(isArray(val) && array_length(val) < 1024) { #region Process data if(isArray(val) && array_length(val) < 1024) { #region Process data
var _val = array_create(array_length(val)); var _val = array_create(array_length(val));
for( var i = 0, n = array_length(val); i < n; i++ ) for( var i = 0, n = array_length(val); i < n; i++ )
@ -1900,7 +1903,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
if(display_type == VALUE_DISPLAY.d3quarternion) { if(display_type == VALUE_DISPLAY.d3quarternion) {
switch(display_data.angle_display) { switch(display_data.angle_display) {
case QUARTERNION_DISPLAY.quarterion : return val; case QUARTERNION_DISPLAY.quarterion : return val;
case QUARTERNION_DISPLAY.euler : return new BBMOD_Quaternion(val[0], val[1], val[2], val[3]).ToEuler(true); case QUARTERNION_DISPLAY.euler : return quarternionToEuler(val[0], val[1], val[2], val[3]);
} }
} }
@ -2009,8 +2012,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
static setValueInspectorDirect = function(val = 0, index = noone) { static setValueInspectorDirect = function(val = 0, index = noone) {
if(display_type == VALUE_DISPLAY.d3quarternion && display_data.angle_display == QUARTERNION_DISPLAY.euler) { if(display_type == VALUE_DISPLAY.d3quarternion && display_data.angle_display == QUARTERNION_DISPLAY.euler) {
var _qval = new BBMOD_Quaternion().FromEuler(-val[0], -val[1], -val[2]).ToArray(); var _qval = quarternionFromEuler(-val[0], -val[1], -val[2]);
var _eval = new BBMOD_Quaternion(_qval[0], _qval[1], _qval[2], _qval[3]).ToEuler(true);
return setValueDirect(_qval); return setValueDirect(_qval);
} }
return setValueDirect(val, index); return setValueDirect(val, index);
@ -2063,12 +2065,12 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
if(connect_type == JUNCTION_CONNECT.output) { if(connect_type == JUNCTION_CONNECT.output) {
if(self.index == 0) { if(self.index == 0) {
node.preview_value = getValue(); node.preview_value = getValue();
node.preview_array = "[" + array_shape(node.preview_value) + "]"; node.preview_array = $"[{array_shape(node.preview_value)}]";
} }
return; return;
} }
if(is_instanceof(node, Node)) if(is_instanceof(node, Node) && self.index >= 0)
node.setInputData(self.index, animator.getValue(time)); node.setInputData(self.index, animator.getValue(time));
if(tags == VALUE_TAG.updateInTrigger || tags == VALUE_TAG.updateOutTrigger) return true; if(tags == VALUE_TAG.updateInTrigger || tags == VALUE_TAG.updateOutTrigger) return true;
@ -2720,8 +2722,8 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
if(log) log_warning("LOAD", $"[Connect] Reconnecting {node.name} to {_nd.name}", node); if(log) log_warning("LOAD", $"[Connect] Reconnecting {node.name} to {_nd.name}", node);
if(con_index == VALUE_TAG.updateInTrigger) setFrom(_nd.updatedInTrigger); if(con_index == VALUE_TAG.updateInTrigger) return setFrom(_nd.updatedInTrigger);
else if(con_index == VALUE_TAG.updateOutTrigger) setFrom(_nd.updatedOutTrigger); else if(con_index == VALUE_TAG.updateOutTrigger) return setFrom(_nd.updatedOutTrigger);
else if(con_index < _ol) { else if(con_index < _ol) {
var _set = setFrom(_nd.outputs[| con_index], false, true); var _set = setFrom(_nd.outputs[| con_index], false, true);
if(_set) return true; if(_set) return true;

View file

@ -287,9 +287,13 @@ function Panel_Inspector() : PanelContent() constructor {
continue; continue;
} }
var _font = viewMode == INSP_VIEW_MODE.spacious? f_p0 : f_p2;
switch(i) { switch(i) {
case 0 : case 0 :
var _edt = PROJECT.attributeEditor; var _edt = PROJECT.attributeEditor;
var _lh;
for( var j = 0; j < array_length(_edt); j++ ) { for( var j = 0; j < array_length(_edt); j++ ) {
var title = _edt[j][0]; var title = _edt[j][0];
var param = _edt[j][1]; var param = _edt[j][1];
@ -299,70 +303,109 @@ function Panel_Inspector() : PanelContent() constructor {
var widx = ui(8); var widx = ui(8);
var widy = yy; var widy = yy;
draw_set_text(f_p0, fa_left, fa_top, COLORS._main_text_inner); draw_set_text(_font, fa_left, fa_top, COLORS._main_text_inner);
draw_text_add(ui(16), yy, __txt(title)); draw_text_over(ui(16), viewMode == INSP_VIEW_MODE.spacious? yy : yy + ui(3), __txt(title));
yy += line_get_height() + ui(6);
hh += line_get_height() + ui(6); if(viewMode == INSP_VIEW_MODE.spacious) {
_lh = line_get_height();
yy += _lh + ui(6);
hh += _lh + ui(6);
} else if(viewMode == INSP_VIEW_MODE.compact) {
_lh = line_get_height() + ui(6);
}
editW.setFocusHover(pFOCUS, _hover); editW.setFocusHover(pFOCUS, _hover);
if(pFOCUS) editW.register(contentPane); if(pFOCUS) editW.register(contentPane);
var wh = 0; var wh = 0;
var _data = PROJECT.attributes[$ param]; var _data = PROJECT.attributes[$ param];
var _param = new widgetParam(ui(16), yy, w - ui(16 + 48), TEXTBOX_HEIGHT, _data, {}, _m, rx, ry); var _wdx = viewMode == INSP_VIEW_MODE.spacious? ui(16) : ui(140);
var _wdy = yy;
var _wdw = w - ui(48) - _wdx;
var _wdh = viewMode == INSP_VIEW_MODE.spacious? TEXTBOX_HEIGHT : _lh;
var _param = new widgetParam(_wdx, _wdy, _wdw, _wdh, _data, {}, _m, rx, ry);
_param.font = _font;
wh = editW.drawParam(_param); wh = editW.drawParam(_param);
var jun = PANEL_GRAPH.value_dragging; var jun = PANEL_GRAPH.value_dragging;
var widw = con_w - ui(16); var widw = con_w - ui(16);
var widh = line_get_height() + ui(6) + wh + ui(4); var widh = viewMode == INSP_VIEW_MODE.spacious? _lh + ui(6) + wh + ui(4) : max(wh, _lh);
if(jun != noone && _hover && point_in_rectangle(_m[0], _m[1], widx, widy, widx + widw, widy + widh)) { if(jun != noone && _hover && point_in_rectangle(_m[0], _m[1], widx, widy, widx + widw, widy + widh)) {
draw_sprite_stretched_ext(THEME.ui_panel_active, 0, widx, widy, widw, widh, COLORS._main_value_positive, 1); draw_sprite_stretched_ext(THEME.ui_panel_active, 0, widx, widy, widw, widh, COLORS._main_value_positive, 1);
attribute_hovering = drpFn; attribute_hovering = drpFn;
} }
yy += wh + ui(8); if(viewMode == INSP_VIEW_MODE.spacious) {
hh += wh + ui(8); yy += wh + ui(8);
hh += wh + ui(8);
} else if(viewMode == INSP_VIEW_MODE.compact) {
yy += max(wh, _lh) + ui(6);
hh += max(wh, _lh) + ui(6);
}
} }
break; break;
case 1 : case 1 :
for( var j = 0; j < array_length(meta.displays); j++ ) { for( var j = 0; j < array_length(meta.displays); j++ ) {
var display = meta.displays[j]; var display = meta.displays[j];
draw_set_text(f_p0, fa_left, fa_top, COLORS._main_text_inner); draw_set_text(_font, fa_left, fa_top, COLORS._main_text_inner);
draw_text_add(ui(16), yy, __txt(display[0])); draw_text_over(ui(16), viewMode == INSP_VIEW_MODE.spacious? yy : yy + ui(3), __txt(display[0]));
yy += line_get_height() + ui(6);
hh += line_get_height() + ui(6); if(viewMode == INSP_VIEW_MODE.spacious) {
_lh = line_get_height();
yy += _lh + ui(6);
hh += _lh + ui(6);
} else if(viewMode == INSP_VIEW_MODE.compact) {
_lh = line_get_height() + ui(6);
}
meta_tb[j].setFocusHover(pFOCUS, _hover); meta_tb[j].setFocusHover(pFOCUS, _hover);
if(pFOCUS) meta_tb[j].register(contentPane); if(pFOCUS) meta_tb[j].register(contentPane);
var wh = 0; var wh = 0;
var _dataFunc = display[1]; var _dataFunc = display[1];
var _data = _dataFunc(meta); var _data = _dataFunc(meta);
var _wdx = viewMode == INSP_VIEW_MODE.spacious? ui(16) : ui(140);
var _wdy = yy;
var _wdw = w - ui(48) - _wdx;
var _wdh = display[2];
var _param = new widgetParam(_wdx, _wdy, _wdw, _wdh, _data, {}, _m, rx, ry);
_param.font = _font;
switch(instanceof(meta_tb[j])) { switch(instanceof(meta_tb[j])) {
case "textArea" : case "textArrayBox" : meta_tb[j].arraySet = current_meta.tags; break;
wh = meta_tb[j].draw(ui(16), yy, w - ui(16 + 48), display[2], _data, _m); }
break;
case "textArrayBox" : wh = meta_tb[j].drawParam(_param);
meta_tb[j].arraySet = current_meta.tags;
wh = meta_tb[j].draw(ui(16), yy, w - ui(16 + 48), display[2], _m, rx, ry); if(viewMode == INSP_VIEW_MODE.spacious) {
break; yy += wh + ui(8);
hh += wh + ui(8);
} else if(viewMode == INSP_VIEW_MODE.compact) {
yy += max(wh, _lh) + ui(6);
hh += max(wh, _lh) + ui(6);
} }
yy += wh + ui(8);
hh += wh + ui(8);
} }
break; break;
case 2 : case 2 :
if(findPanel("Panel_Globalvar")) { if(findPanel("Panel_Globalvar")) {
yy += ui(4); yy += ui(4);
hh += ui(4); hh += ui(4);
continue; continue;
} }
var gvh = globalvar_viewer_draw(ui(16), yy, contentPane.surface_w - ui(24), _m, pFOCUS, _hover, contentPane, ui(16) + x, top_bar_h + y); var gvh = globalvar_viewer_draw(ui(16), yy, contentPane.surface_w - ui(24), _m, pFOCUS, _hover, contentPane, ui(16) + x, top_bar_h + y);
yy += gvh + ui(8); yy += gvh + ui(8);
hh += gvh + ui(8); hh += gvh + ui(8);
@ -386,7 +429,7 @@ function Panel_Inspector() : PanelContent() constructor {
var bxc = bx + bw / 2 - (string_width(txt) + ui(48)) / 2; var bxc = bx + bw / 2 - (string_width(txt) + ui(48)) / 2;
var byc = by + bh / 2; var byc = by + bh / 2;
draw_sprite_ui(icon, 0, bxc + ui(24), byc,,,, colr); draw_sprite_ui(icon, 0, bxc + ui(24), byc,,,, colr);
draw_text_add(bxc + ui(48), byc, txt); draw_text_over(bxc + ui(48), byc, txt);
bx += bw + ui(4); bx += bw + ui(4);
@ -400,7 +443,7 @@ function Panel_Inspector() : PanelContent() constructor {
var bxc = bx + bw / 2 - (string_width(txt) + ui(48)) / 2; var bxc = bx + bw / 2 - (string_width(txt) + ui(48)) / 2;
var byc = by + bh / 2; var byc = by + bh / 2;
draw_sprite_ui(icon, 0, bxc + ui(24), byc,,,, colr); draw_sprite_ui(icon, 0, bxc + ui(24), byc,,,, colr);
draw_text_add(bxc + ui(48), byc, txt); draw_text_over(bxc + ui(48), byc, txt);
} else { } else {
var bw = bbw; var bw = bbw;
@ -415,9 +458,11 @@ function Panel_Inspector() : PanelContent() constructor {
var bxc = bx + bw / 2 - (string_width(txt) + ui(48)) / 2; var bxc = bx + bw / 2 - (string_width(txt) + ui(48)) / 2;
var byc = by + bh / 2; var byc = by + bh / 2;
draw_sprite_ui(icon, 0, bxc + ui(24), byc,,,, colr); draw_sprite_ui(icon, 0, bxc + ui(24), byc,,,, colr);
draw_text_add(bxc + ui(48), byc, txt); draw_text_over(bxc + ui(48), byc, txt);
} }
break; break;
case 3 : case 3 :
var context = PANEL_GRAPH.getCurrentContext(); var context = PANEL_GRAPH.getCurrentContext();
var _h = drawNodeProperties(yy, _m, context); var _h = drawNodeProperties(yy, _m, context);
@ -427,8 +472,8 @@ function Panel_Inspector() : PanelContent() constructor {
break; break;
} }
yy += ui(8); yy += viewMode == INSP_VIEW_MODE.spacious? ui(8) : ui(4);
hh += ui(8); hh += viewMode == INSP_VIEW_MODE.spacious? ui(8) : ui(4);
} }
return hh; return hh;
@ -885,13 +930,6 @@ function Panel_Inspector() : PanelContent() constructor {
draw_sprite_ui_uniform(THEME.preset, 1, bx + ui(32) / 2, by + ui(32) / 2, 1, COLORS._main_icon_dark); draw_sprite_ui_uniform(THEME.preset, 1, bx + ui(32) / 2, by + ui(32) / 2, 1, COLORS._main_icon_dark);
} }
by += ui(36);
view_mode_tooltip.index = viewMode;
if(buttonInstant(THEME.button_hide, bx, by, ui(32), ui(32), [mx, my], pFOCUS, pHOVER, view_mode_tooltip, THEME.inspector_view, viewMode) == 2) {
viewMode = !viewMode;
PREFERENCES.inspector_view_default = viewMode;
}
//////////////////////////////////////////////////////////////////// INSPECTOR ACTIONS //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// INSPECTOR ACTIONS ////////////////////////////////////////////////////////////////////
var bx = w - ui(44); var bx = w - ui(44);
@ -937,6 +975,12 @@ function Panel_Inspector() : PanelContent() constructor {
if(inspecting && !inspecting.active) inspecting = noone; if(inspecting && !inspecting.active) inspecting = noone;
view_mode_tooltip.index = viewMode;
if(buttonInstant(THEME.button_hide, ui(8), ui(48), ui(32), ui(32), [mx, my], pFOCUS, pHOVER, view_mode_tooltip, THEME.inspector_view, viewMode) == 2) {
viewMode = !viewMode;
PREFERENCES.inspector_view_default = viewMode;
}
if(inspecting) { if(inspecting) {
var _nodes = PANEL_GRAPH.nodes_selecting; var _nodes = PANEL_GRAPH.nodes_selecting;

View file

@ -33,7 +33,7 @@ function ResetAllNodesRender() { #region
} #endregion } #endregion
function NodeTopoSort() { #region function NodeTopoSort() { #region
//print($"======================= RESET TOPO =======================") LOG_IF(global.FLAG.render == 1, $"======================= RESET TOPO =======================")
var _key = ds_map_find_first(PROJECT.nodeMap); var _key = ds_map_find_first(PROJECT.nodeMap);
var amo = ds_map_size(PROJECT.nodeMap); var amo = ds_map_size(PROJECT.nodeMap);
@ -48,7 +48,7 @@ function NodeTopoSort() { #region
ds_list_clear(PROJECT.nodeTopo); ds_list_clear(PROJECT.nodeTopo);
__topoSort(PROJECT.nodeTopo, PROJECT.nodes); __topoSort(PROJECT.nodeTopo, PROJECT.nodes);
LOG_IF(global.FLAG.render == 1, $"+++++++ Topo Sort Completed: {ds_list_size(PROJECT.nodeTopo)} nodes sorted in {(get_timer() - _t) / 1000} ms +++++++"); LOG_IF(global.FLAG.render == 1, $"+++++++ Topo Sort Completed: {ds_list_size(PROJECT.nodeTopo)}/{amo} nodes sorted in {(get_timer() - _t) / 1000} ms +++++++");
} #endregion } #endregion
function NodeListSort(_list, _nodeList) { #region function NodeListSort(_list, _nodeList) { #region
@ -93,6 +93,7 @@ function __sortNode(_list, _node) { #region
function __topoSort(_list, _nodeList) { #region function __topoSort(_list, _nodeList) { #region
var _root = []; var _root = [];
var _leftOver = []; var _leftOver = [];
var _global = _nodeList == PROJECT.nodes;
for( var i = 0, n = ds_list_size(_nodeList); i < n; i++ ) { for( var i = 0, n = ds_list_size(_nodeList); i < n; i++ ) {
var _node = _nodeList[| i]; var _node = _nodeList[| i];
@ -103,17 +104,18 @@ function __topoSort(_list, _nodeList) { #region
continue; continue;
} }
for( var j = 0, m = ds_list_size(_node.outputs); j < m; j++ ) { if(_node.attributes.show_update_trigger && !array_empty(_node.updatedOutTrigger.getJunctionTo())) {
var _to = _node.outputs[| j].getJunctionTo(); _isRoot = false;
for( var k = 0, p = array_length(_to); k < p; k++ ) { } else {
if(ds_list_exist(_nodeList, _to[k].node)) { for( var j = 0, m = ds_list_size(_node.outputs); j < m; j++ ) {
_isRoot = false; var _to = _node.outputs[| j].getJunctionTo();
break;
} if(_global) _isRoot &= array_empty(_to);
else _isRoot &= !array_any(_to, function(_val) { return ds_list_exist(_nodeList, _val.node); } );
if(!_isRoot) break;
} }
if(!_isRoot) break;
} }
if(_isRoot) array_push(_root, _node); if(_isRoot) array_push(_root, _node);