Pixel-Composer/scripts/node_value/node_value.gml

1379 lines
36 KiB
Plaintext
Raw Normal View History

2022-01-13 05:24:03 +01:00
enum JUNCTION_CONNECT {
input,
output
}
enum VALUE_TYPE {
integer = 0,
float = 1,
boolean = 2,
color = 3,
surface = 4,
path = 5,
curve = 6,
text = 7,
object = 8,
2022-01-25 14:13:47 +01:00
node = 9,
2022-12-13 09:20:36 +01:00
d3object = 10,
2022-01-25 10:58:11 +01:00
2022-01-25 14:13:47 +01:00
any = 11,
2023-02-14 02:51:14 +01:00
pathnode = 12,
particle = 13,
rigid = 14,
fdomain = 15,
2022-01-13 05:24:03 +01:00
}
enum VALUE_DISPLAY {
_default,
range,
//Int
enum_scroll,
enum_button,
rotation,
rotation_range,
slider,
slider_range,
//Color
gradient,
palette,
//Int array
padding,
vector,
vector_range,
area,
2023-01-04 02:30:04 +01:00
kernel,
2022-01-13 05:24:03 +01:00
//Curve
curve,
//Misc
puppet_control,
button,
label,
//Array
path_array,
//Text
export_format,
2023-01-04 02:30:04 +01:00
code,
2023-02-14 02:51:14 +01:00
node_title,
2022-01-13 05:24:03 +01:00
//path
path_save,
2022-09-27 06:37:28 +02:00
path_load,
2022-12-16 09:18:09 +01:00
path_font,
2022-01-13 05:24:03 +01:00
}
2022-09-21 06:09:40 +02:00
enum PADDING {
right,
up,
left,
down
}
2022-01-13 05:24:03 +01:00
function value_color(i) {
2023-02-14 02:51:14 +01:00
static JUNCTION_COLORS = [
$6691ff, //int
$78e4ff, //float
$5d3f8c, //bool
$5dde8f, //color
$976bff, //surface
$4b00eb, //path
$d1c2c2, //curve
$e3ff66, //text
$b5b5ff, //object
$ffa64d, //node
#c1007c, //3D
$808080, //any
$b5b5ff, //path
$5dde8f, //particle
$e3ff66, //rigid
#4da6ff, //fdomain
];
2022-01-13 05:24:03 +01:00
return JUNCTION_COLORS[safe_mod(max(0, i), array_length(JUNCTION_COLORS))];
}
function value_bit(i) {
switch(i) {
case VALUE_TYPE.integer : return 1 << 0 | 1 << 1;
2022-12-23 04:45:52 +01:00
case VALUE_TYPE.float : return 1 << 2 | 1 << 1;
case VALUE_TYPE.boolean : return 1 << 3 | 1 << 1;
case VALUE_TYPE.color : return 1 << 4;
case VALUE_TYPE.surface : return 1 << 5;
2022-01-13 05:24:03 +01:00
case VALUE_TYPE.path : return 1 << 10;
2023-01-25 06:49:00 +01:00
case VALUE_TYPE.text : return 1 << 10;
2023-02-14 02:51:14 +01:00
case VALUE_TYPE.object : return 1 << 13;
case VALUE_TYPE.d3object : return 1 << 14;
case VALUE_TYPE.pathnode : return 1 << 15;
case VALUE_TYPE.particle : return 1 << 16;
case VALUE_TYPE.rigid : return 1 << 17;
case VALUE_TYPE.fdomain : return 1 << 18;
case VALUE_TYPE.node : return 1 << 32;
2022-01-13 05:24:03 +01:00
2023-02-14 02:51:14 +01:00
case VALUE_TYPE.any : return ~0 & ~(1 << 32);
2022-01-13 05:24:03 +01:00
}
return 0;
}
function value_type_directional(f, t) {
2023-02-14 02:51:14 +01:00
if(f == VALUE_TYPE.surface && t == VALUE_TYPE.integer) return true;
if(f == VALUE_TYPE.surface && t == VALUE_TYPE.float) return true;
2022-12-23 04:45:52 +01:00
2023-02-14 02:51:14 +01:00
if(f == VALUE_TYPE.integer && t == VALUE_TYPE.text) return true;
if(f == VALUE_TYPE.float && t == VALUE_TYPE.text) return true;
if(f == VALUE_TYPE.boolean && t == VALUE_TYPE.text) return true;
2022-12-23 04:45:52 +01:00
2023-02-14 02:51:14 +01:00
if(f == VALUE_TYPE.integer && t == VALUE_TYPE.color) return true;
if(f == VALUE_TYPE.float && t == VALUE_TYPE.color) return true;
if(f == VALUE_TYPE.color && t == VALUE_TYPE.integer) return true;
if(f == VALUE_TYPE.color && t == VALUE_TYPE.float ) return true;
2022-12-23 04:45:52 +01:00
2022-01-13 05:24:03 +01:00
return false;
}
function typeArray(_type) {
switch(_type) {
case VALUE_DISPLAY.range :
case VALUE_DISPLAY.vector_range :
case VALUE_DISPLAY.rotation_range :
case VALUE_DISPLAY.slider_range :
case VALUE_DISPLAY.vector :
case VALUE_DISPLAY.padding :
case VALUE_DISPLAY.area :
case VALUE_DISPLAY.puppet_control :
2023-01-04 02:30:04 +01:00
case VALUE_DISPLAY.kernel :
2022-01-13 05:24:03 +01:00
case VALUE_DISPLAY.curve :
return 1;
case VALUE_DISPLAY.path_array :
case VALUE_DISPLAY.palette :
2023-02-14 02:51:14 +01:00
case VALUE_DISPLAY.gradient :
2022-01-13 05:24:03 +01:00
return 2;
}
return 0;
}
2023-02-14 02:51:14 +01:00
function typeArrayDynamic(_type) {
switch(_type) {
case VALUE_DISPLAY.curve :
case VALUE_DISPLAY.palette :
case VALUE_DISPLAY.gradient :
return true;
}
return false;
}
function typeCompatible(fromType, toType, directional_cast = true) {
if(value_bit(fromType) & value_bit(toType) != 0)
return true;
if(!directional_cast)
return false;
return value_type_directional(fromType, toType);
}
2023-02-19 02:13:19 +01:00
function typeIncompatible(from, to) {
if(from.type == VALUE_TYPE.surface && (to.type == VALUE_TYPE.integer || to.type == VALUE_TYPE.float)) {
switch(to.display_type) {
case VALUE_DISPLAY.area :
case VALUE_DISPLAY.kernel :
case VALUE_DISPLAY.vector_range :
case VALUE_DISPLAY.puppet_control :
case VALUE_DISPLAY.padding :
case VALUE_DISPLAY.curve : return true;
}
}
return false;
}
2022-01-13 05:24:03 +01:00
enum KEYFRAME_END {
hold,
loop,
2023-01-09 03:14:20 +01:00
ping,
wrap,
2022-01-13 05:24:03 +01:00
}
2023-01-09 03:14:20 +01:00
globalvar ON_END_NAME;
ON_END_NAME = [ "Hold", "Loop", "Ping pong", "Wrap" ];
enum VALIDATION {
pass,
warning,
error
}
2022-12-27 04:00:50 +01:00
enum VALUE_UNIT {
constant,
reference
}
2022-01-13 05:24:03 +01:00
function isGraphable(type) {
switch(type) {
case VALUE_TYPE.integer :
case VALUE_TYPE.float : return true;
}
return false;
}
2023-02-14 02:51:14 +01:00
function nodeValue(_name, _node, _connect, _type, _value, _tooltip = "") {
return new NodeValue(_name, _node, _connect, _type, _value, _tooltip);
2022-01-13 05:24:03 +01:00
}
2022-12-27 04:00:50 +01:00
function nodeValueUnit(value) constructor {
self.value = value;
mode = VALUE_UNIT.constant;
reference = noone;
triggerButton = button(function() {
mode = !mode;
2023-02-14 02:51:14 +01:00
value.cache_value[0] = false;
2022-12-27 04:00:50 +01:00
value.unitConvert(mode);
2023-01-25 06:49:00 +01:00
value.node.update();
2022-12-27 04:00:50 +01:00
});
triggerButton.icon_blend = COLORS._main_icon_light;
triggerButton.icon = THEME.unit_ref;
static draw = function(_x, _y, _w, _h, _m) {
triggerButton.icon_index = mode;
triggerButton.tooltip = (mode? "Fraction" : "Pixel") + " unit";
triggerButton.draw(_x, _y, _w, _h, _m, THEME.button_hide);
}
static invApply = function(value, index = 0) {
if(mode == VALUE_UNIT.constant)
return value;
if(reference == noone)
return value;
return convertUnit(value, VALUE_UNIT.reference, index);
}
static apply = function(value, index = 0) {
if(mode == VALUE_UNIT.constant)
return value;
if(reference == noone)
return value;
return convertUnit(value, VALUE_UNIT.constant, index);
}
static convertUnit = function(value, unitTo, index = 0) {
var disp = self.value.display_type;
var base = reference(index);
var inv = unitTo == VALUE_UNIT.reference;
2022-12-27 13:30:02 +01:00
if(!is_array(base) && !is_array(value))
2022-12-27 04:00:50 +01:00
return inv? value / base : value * base;
2022-12-27 13:30:02 +01:00
if(!is_array(base) && is_array(value)) {
2022-12-27 04:00:50 +01:00
for( var i = 0; i < array_length(value); i++ )
value[i] = inv? value[i] / base : value[i] * base;
return value;
}
2022-12-27 13:30:02 +01:00
if(is_array(base) && !is_array(value)) {
2022-12-27 04:00:50 +01:00
return value;
2022-12-27 13:30:02 +01:00
}
2022-12-27 04:00:50 +01:00
switch(disp) {
case VALUE_DISPLAY.padding :
case VALUE_DISPLAY.vector :
case VALUE_DISPLAY.vector_range :
for( var i = 0; i < array_length(value); i++ )
value[i] = inv? value[i] / base[i % 2] : value[i] * base[i % 2];
return value;
case VALUE_DISPLAY.area :
for( var i = 0; i < 4; i++ )
value[i] = inv? value[i] / base[i % 2] : value[i] * base[i % 2];
return value;
}
return value;
}
}
2023-02-14 02:51:14 +01:00
function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constructor {
2022-01-13 05:24:03 +01:00
name = _name;
node = _node;
2022-01-26 06:57:34 +01:00
x = node.x;
2022-01-13 05:24:03 +01:00
y = node.y;
2023-02-14 02:51:14 +01:00
index = _connect == JUNCTION_CONNECT.input? ds_list_size(node.inputs) : ds_list_size(node.outputs);
2022-01-13 05:24:03 +01:00
type = _type;
2023-01-25 06:49:00 +01:00
tooltip = _tooltip;
2023-02-14 02:51:14 +01:00
editWidget = noone;
2022-01-13 05:24:03 +01:00
connect_type = _connect;
value_from = noone;
value_to = ds_list_create();
2023-01-17 08:11:55 +01:00
value_to_arr = [];
2022-01-13 05:24:03 +01:00
accept_array = true;
2023-02-14 02:51:14 +01:00
force_array = false;
auto_connect = true;
setFrom_condition = -1;
2022-01-13 05:24:03 +01:00
2022-09-23 13:28:42 +02:00
def_val = _value;
animator = new valueAnimator(_value, self);
on_end = KEYFRAME_END.hold;
2022-12-27 04:00:50 +01:00
unit = new nodeValueUnit(self);
2022-09-23 13:28:42 +02:00
extra_data = ds_list_create();
2022-12-23 04:45:52 +01:00
dyna_depo = ds_list_create();
2022-01-13 05:24:03 +01:00
2022-11-21 06:38:44 +01:00
visible = _connect == JUNCTION_CONNECT.output || _type == VALUE_TYPE.surface || _type == VALUE_TYPE.path;
2022-01-13 05:24:03 +01:00
show_in_inspector = true;
display_type = VALUE_DISPLAY._default;
2023-02-14 02:51:14 +01:00
if(_type == VALUE_TYPE.curve)
display_type = VALUE_DISPLAY.curve;
2022-01-13 05:24:03 +01:00
display_data = -1;
value_validation = VALIDATION.pass;
2023-02-14 02:51:14 +01:00
error_notification = noone;
2023-01-09 03:14:20 +01:00
extract_node = "";
2023-02-14 02:51:14 +01:00
is_changed = true;
cache_value = [ false, undefined ];
cache_array = [ false, false ];
static setDefault = function(vals) {
if(LOADING || APPENDING) return self;
ds_list_clear(animator.values);
for( var i = 0; i < array_length(vals); i++ )
ds_list_add(animator.values, new valueKey(vals[i][0], vals[i][1], animator));
return self;
}
2022-12-27 13:30:02 +01:00
static setUnitRef = function(ref, mode = VALUE_UNIT.constant) {
2022-12-27 04:00:50 +01:00
unit.reference = ref;
2022-12-27 13:30:02 +01:00
unit.mode = mode;
2023-02-14 02:51:14 +01:00
cache_value[0] = false;
2022-12-27 04:00:50 +01:00
return self;
}
2022-01-19 03:05:13 +01:00
static setVisible = function(inspector) {
2023-02-14 02:51:14 +01:00
if(connect_type == JUNCTION_CONNECT.input) {
show_in_inspector = inspector;
visible = argument_count > 1? argument[1] : visible;
} else
visible = inspector;
2022-01-13 05:24:03 +01:00
return self;
}
2023-02-14 02:51:14 +01:00
static setDisplay = function(_type = VALUE_DISPLAY._default, _data = -1) {
2022-01-13 05:24:03 +01:00
display_type = _type;
display_data = _data;
resetDisplay();
return self;
}
2023-02-14 02:51:14 +01:00
static forceArray = function() {
force_array = true;
return self;
}
2022-12-21 02:30:23 +01:00
static rejectArray = function() {
accept_array = false;
2022-01-13 05:24:03 +01:00
return self;
}
2023-02-14 02:51:14 +01:00
static rejectConnect = function() {
auto_connect = false;
return self;
}
2023-01-09 03:14:20 +01:00
static isAnimable = function() {
if(display_type == VALUE_DISPLAY.gradient)
return false;
return true;
}
2022-01-13 05:24:03 +01:00
static resetDisplay = function() {
editWidget = noone;
switch(display_type) {
case VALUE_DISPLAY.button :
editWidget = button(display_data[0]);
editWidget.text = display_data[1];
visible = false;
return;
}
switch(type) {
case VALUE_TYPE.float :
case VALUE_TYPE.integer :
2023-02-14 02:51:14 +01:00
var _txt = TEXTBOX_INPUT.number;
2023-01-09 03:14:20 +01:00
2022-01-13 05:24:03 +01:00
switch(display_type) {
case VALUE_DISPLAY._default :
2022-12-18 03:20:38 +01:00
editWidget = new textBox(_txt, function(val) {
2023-02-14 02:51:14 +01:00
return setValueDirect(val);
2022-01-13 05:24:03 +01:00
} );
editWidget.slidable = true;
2023-02-14 02:51:14 +01:00
if(type == VALUE_TYPE.integer) editWidget.slide_speed = 1;
2022-01-13 05:24:03 +01:00
if(display_data != -1) editWidget.slide_speed = display_data;
2023-01-09 03:14:20 +01:00
extract_node = "Node_Number";
2022-01-13 05:24:03 +01:00
break;
case VALUE_DISPLAY.range :
editWidget = new rangeBox(_txt, function(index, val) {
2022-09-23 13:28:42 +02:00
var _val = animator.getValue();
2022-01-13 05:24:03 +01:00
_val[index] = val;
2023-02-14 02:51:14 +01:00
return setValueDirect(_val);
2022-01-13 05:24:03 +01:00
} );
2023-02-14 02:51:14 +01:00
if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1);
2022-01-13 05:24:03 +01:00
if(display_data != -1) editWidget.extras = display_data;
2023-01-09 03:14:20 +01:00
extract_node = "Node_Number";
2022-01-13 05:24:03 +01:00
break;
case VALUE_DISPLAY.vector :
2023-01-09 03:14:20 +01:00
var val = animator.getValue();
if(array_length(val) <= 4) {
2022-09-23 13:28:42 +02:00
editWidget = new vectorBox(array_length(animator.getValue()), _txt, function(index, val) {
var _val = animator.getValue();
2022-01-13 05:24:03 +01:00
_val[index] = val;
2023-02-14 02:51:14 +01:00
return setValueDirect(_val);
2022-12-27 04:00:50 +01:00
}, unit );
2023-02-14 02:51:14 +01:00
if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1);
2022-01-13 05:24:03 +01:00
if(display_data != -1) editWidget.extras = display_data;
2023-01-09 03:14:20 +01:00
if(array_length(val) == 2)
extract_node = "Node_Vector2";
else if(array_length(val) == 3)
extract_node = "Node_Vector3";
else if(array_length(val) == 4)
extract_node = "Node_Vector4";
2022-01-13 05:24:03 +01:00
}
break;
case VALUE_DISPLAY.vector_range :
2023-01-09 03:14:20 +01:00
var val = animator.getValue();
editWidget = new vectorRangeBox(array_length(val), _txt, function(index, val) {
2022-09-23 13:28:42 +02:00
var _val = animator.getValue();
2022-01-13 05:24:03 +01:00
_val[index] = val;
2023-02-14 02:51:14 +01:00
return setValueDirect(_val);
2022-12-27 04:00:50 +01:00
}, unit );
2023-02-14 02:51:14 +01:00
if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1);
2022-01-13 05:24:03 +01:00
if(display_data != -1) editWidget.extras = display_data;
2023-01-09 03:14:20 +01:00
if(array_length(val) == 2)
extract_node = "Node_Vector2";
else if(array_length(val) == 3)
extract_node = "Node_Vector3";
else if(array_length(val) == 4)
extract_node = "Node_Vector4";
2022-01-13 05:24:03 +01:00
break;
case VALUE_DISPLAY.rotation :
2022-01-19 03:51:53 +01:00
editWidget = new rotator(function(val, _save) {
2023-02-14 02:51:14 +01:00
return setValueDirect(val, _save);
2022-12-16 09:18:09 +01:00
}, display_data );
2023-01-09 03:14:20 +01:00
extract_node = "Node_Number";
2022-01-13 05:24:03 +01:00
break;
case VALUE_DISPLAY.rotation_range :
editWidget = new rotatorRange(function(index, val) {
2022-09-23 13:28:42 +02:00
var _val = animator.getValue();
2022-01-13 05:24:03 +01:00
_val[index] = round(val);
2023-02-14 02:51:14 +01:00
return setValueDirect(_val);
2022-01-13 05:24:03 +01:00
} );
2023-01-09 03:14:20 +01:00
extract_node = "Node_Vector2";
2022-01-13 05:24:03 +01:00
break;
case VALUE_DISPLAY.slider :
editWidget = new slider(display_data[0], display_data[1], display_data[2], function(val) {
2023-02-14 02:51:14 +01:00
return setValueDirect(toNumber(val));
2022-01-13 05:24:03 +01:00
} );
2023-02-14 02:51:14 +01:00
if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1);
2023-01-09 03:14:20 +01:00
extract_node = "Node_Number";
2022-01-13 05:24:03 +01:00
break;
case VALUE_DISPLAY.slider_range :
editWidget = new sliderRange(display_data[0], display_data[1], display_data[2], function(index, val) {
2022-09-23 13:28:42 +02:00
var _val = animator.getValue();
2022-01-13 05:24:03 +01:00
_val[index] = val;
2023-02-14 02:51:14 +01:00
return setValueDirect(_val);
2022-01-13 05:24:03 +01:00
} );
2023-02-14 02:51:14 +01:00
if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1);
2023-01-09 03:14:20 +01:00
extract_node = "Node_Vector2";
2022-01-13 05:24:03 +01:00
break;
case VALUE_DISPLAY.area :
editWidget = new areaBox(function(index, val) {
2022-09-23 13:28:42 +02:00
var _val = animator.getValue();
2022-01-13 05:24:03 +01:00
_val[index] = val;
2023-02-14 02:51:14 +01:00
return setValueDirect(_val);
2022-12-27 04:00:50 +01:00
}, unit);
2023-02-14 02:51:14 +01:00
if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1);
2022-01-13 05:24:03 +01:00
if(display_data != -1) editWidget.onSurfaceSize = display_data;
2023-01-09 03:14:20 +01:00
extract_node = "Node_Area";
2022-01-13 05:24:03 +01:00
break;
case VALUE_DISPLAY.padding :
editWidget = new paddingBox(function(index, val) {
2022-09-23 13:28:42 +02:00
var _val = animator.getValue();
2022-01-13 05:24:03 +01:00
_val[index] = val;
2023-02-14 02:51:14 +01:00
return setValueDirect(_val);
2022-12-27 04:00:50 +01:00
}, unit);
2023-02-14 02:51:14 +01:00
if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1);
2023-01-09 03:14:20 +01:00
2023-01-17 08:11:55 +01:00
extra_data[| 0] = AREA_MODE.area;
2023-01-09 03:14:20 +01:00
extract_node = "Node_Vector4";
2022-01-13 05:24:03 +01:00
break;
case VALUE_DISPLAY.puppet_control :
2022-09-23 13:28:42 +02:00
editWidget = new controlPointBox(function(index, val) {
var _val = animator.getValue();
_val[index] = val;
2023-02-14 02:51:14 +01:00
return setValueDirect(_val);
2022-09-23 13:28:42 +02:00
});
2023-01-09 03:14:20 +01:00
extract_node = "";
2022-01-13 05:24:03 +01:00
break;
case VALUE_DISPLAY.enum_scroll :
editWidget = new scrollBox(display_data, function(val) {
if(val == -1) return;
2023-02-14 02:51:14 +01:00
return setValueDirect(toNumber(val));
2022-01-13 05:24:03 +01:00
} );
2023-01-09 03:14:20 +01:00
2023-02-14 02:51:14 +01:00
rejectConnect();
2023-01-09 03:14:20 +01:00
extract_node = "";
2022-01-13 05:24:03 +01:00
break;
case VALUE_DISPLAY.enum_button :
editWidget = buttonGroup(display_data, function(val) {
2023-02-14 02:51:14 +01:00
return setValueDirect(val);
2022-01-13 05:24:03 +01:00
} );
2023-01-09 03:14:20 +01:00
2023-02-14 02:51:14 +01:00
rejectConnect();
2023-01-09 03:14:20 +01:00
extract_node = "";
2022-01-13 05:24:03 +01:00
break;
2023-01-04 02:30:04 +01:00
case VALUE_DISPLAY.kernel :
editWidget = new matrixGrid(_txt, function(index, val) {
var _val = animator.getValue();
_val[index] = val;
2023-02-14 02:51:14 +01:00
return setValueDirect(_val);
2023-01-04 02:30:04 +01:00
}, unit );
2023-02-14 02:51:14 +01:00
if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1);
2023-01-04 02:30:04 +01:00
if(display_data != -1) editWidget.extras = display_data;
2023-01-09 03:14:20 +01:00
extract_node = "";
2023-01-04 02:30:04 +01:00
break;
2022-01-13 05:24:03 +01:00
}
break;
case VALUE_TYPE.boolean :
editWidget = new checkBox(function() {
2023-02-14 02:51:14 +01:00
return setValueDirect(!animator.getValue());
2022-01-13 05:24:03 +01:00
} );
2023-01-09 03:14:20 +01:00
extract_node = "Node_Boolean";
2022-01-13 05:24:03 +01:00
break;
case VALUE_TYPE.color :
switch(display_type) {
case VALUE_DISPLAY._default :
editWidget = buttonColor(function(color) {
2023-02-14 02:51:14 +01:00
return setValueDirect(color);
2022-01-13 05:24:03 +01:00
} );
2023-01-09 03:14:20 +01:00
extract_node = "Node_Color";
break;
2022-01-13 05:24:03 +01:00
case VALUE_DISPLAY.gradient :
2023-02-14 02:51:14 +01:00
editWidget = buttonGradient(function(gradient) {
return setValueDirect(gradient);
2022-01-13 05:24:03 +01:00
} );
2023-02-14 02:51:14 +01:00
2022-01-13 05:24:03 +01:00
extra_data[| 0] = GRADIENT_INTER.smooth;
2023-01-09 03:14:20 +01:00
extract_node = "Node_Gradient_Out";
break;
2022-01-13 05:24:03 +01:00
case VALUE_DISPLAY.palette :
editWidget = buttonPalette(function(color) {
2023-02-14 02:51:14 +01:00
return setValueDirect(color);
2022-01-13 05:24:03 +01:00
} );
2023-01-09 03:14:20 +01:00
extract_node = "Node_Palette";
break;
2022-01-13 05:24:03 +01:00
}
break;
case VALUE_TYPE.path :
switch(display_type) {
case VALUE_DISPLAY.path_array :
editWidget = button(function() {
2023-02-14 02:51:14 +01:00
var path = get_open_filenames(display_data[0], display_data[1]);
2022-01-13 05:24:03 +01:00
if(path == "") return noone;
2023-02-14 02:51:14 +01:00
var paths = string_splice(path, "\n");
return setValueDirect(paths);
2023-01-01 02:06:02 +01:00
});
break;
case VALUE_DISPLAY.path_load :
editWidget = new textBox(TEXTBOX_INPUT.text, function(str) { setValueDirect(str); },
button(function() {
var path = get_open_filename(display_data[0], display_data[1]);
if(path == "") return noone;
2023-02-14 02:51:14 +01:00
return setValueDirect(path);
2023-01-01 02:06:02 +01:00
}, THEME.button_path_icon)
);
editWidget.align = fa_left;
2023-01-09 03:14:20 +01:00
extract_node = "Node_String";
2022-01-13 05:24:03 +01:00
break;
case VALUE_DISPLAY.path_save :
2023-01-01 02:06:02 +01:00
editWidget = new textBox(TEXTBOX_INPUT.text, function(str) { setValueDirect(str); },
button(function() {
var path = get_save_filename(display_data[0], display_data[1]);
if(path == "") return noone;
2023-02-14 02:51:14 +01:00
return setValueDirect(path);
2023-01-01 02:06:02 +01:00
}, THEME.button_path_icon)
);
editWidget.align = fa_left;
2023-01-09 03:14:20 +01:00
extract_node = "Node_String";
2022-01-13 05:24:03 +01:00
break;
2023-01-01 02:06:02 +01:00
2022-12-16 09:18:09 +01:00
case VALUE_DISPLAY.path_font :
2023-01-17 08:11:55 +01:00
editWidget = new fontScrollBox(
2022-12-16 09:18:09 +01:00
function(val) {
2023-02-14 02:51:14 +01:00
return setValueDirect(DIRECTORY + "Fonts\\" + FONT_INTERNAL[val]);
2022-12-16 09:18:09 +01:00
}
);
break;
2022-01-13 05:24:03 +01:00
}
break;
case VALUE_TYPE.curve :
display_type = VALUE_DISPLAY.curve;
2023-02-14 02:51:14 +01:00
editWidget = new curveBox(function(_modified) {
return setValueDirect(_modified);
});
2022-01-13 05:24:03 +01:00
break;
case VALUE_TYPE.text :
2023-02-14 02:51:14 +01:00
editWidget = new textArea(TEXTBOX_INPUT.text, function(str) {
return setValueDirect(str);
});
2023-01-04 02:30:04 +01:00
if(display_type == VALUE_DISPLAY.code) {
editWidget.font = f_code;
editWidget.format = TEXT_AREA_FORMAT.code;
editWidget.min_lines = 4;
}
2023-01-09 03:14:20 +01:00
extract_node = "Node_String";
2022-01-13 05:24:03 +01:00
break;
2022-09-27 06:37:28 +02:00
case VALUE_TYPE.surface :
2023-02-14 02:51:14 +01:00
editWidget = new surfaceBox(function(ind) {
return setValueDirect(ind);
}, display_data );
2022-09-27 06:37:28 +02:00
show_in_inspector = true;
break;
2022-01-13 05:24:03 +01:00
}
}
resetDisplay();
static onValidate = function() {
2022-11-03 11:44:49 +01:00
var _val = value_validation, str = "";
value_validation = VALIDATION.pass;
switch(type) {
case VALUE_TYPE.path:
switch(display_type) {
case VALUE_DISPLAY.path_load:
2022-09-23 13:28:42 +02:00
var path = animator.getValue();
2022-12-27 13:30:02 +01:00
if(is_array(path)) path = path[0];
2022-11-03 11:44:49 +01:00
if(try_get_path(path) == -1) {
value_validation = VALIDATION.error;
2023-01-04 02:30:04 +01:00
str = "File not exist: " + string(path);
2022-11-03 11:44:49 +01:00
}
break;
case VALUE_DISPLAY.path_array:
2022-09-23 13:28:42 +02:00
var paths = animator.getValue();
2022-09-21 06:09:40 +02:00
if(is_array(paths)) {
for( var i = 0; i < array_length(paths); i++ ) {
2022-12-27 13:30:02 +01:00
if(try_get_path(paths[i]) != -1) continue;
value_validation = VALIDATION.error;
2023-01-04 02:30:04 +01:00
str = "File not exist: " + string(paths[i]);
}
2022-11-03 11:44:49 +01:00
} else {
value_validation = VALIDATION.error;
2023-01-04 02:30:04 +01:00
str = "File not exist: " + string(paths);
2022-11-03 11:44:49 +01:00
}
break;
}
break;
}
2022-12-27 13:30:02 +01:00
node.onValidate();
2022-12-27 13:30:02 +01:00
if(_val == value_validation) return self;
#region notification
2022-11-03 11:44:49 +01:00
if(value_validation == VALIDATION.error && error_notification == noone) {
error_notification = noti_error(str);
2023-01-25 06:49:00 +01:00
error_notification.onClick = function() { PANEL_GRAPH.focusNode(node); };
2022-11-03 11:44:49 +01:00
}
if(value_validation == VALIDATION.pass && error_notification != noone) {
noti_remove(error_notification);
error_notification = noone;
}
2022-12-27 13:30:02 +01:00
#endregion
2022-11-03 11:44:49 +01:00
return self;
}
2023-01-17 08:11:55 +01:00
static valueProcess = function(value, nodeFrom, applyUnit = true, arrIndex = 0) {
var typeFrom = nodeFrom.type;
var display = nodeFrom.display_type;
2023-01-25 06:49:00 +01:00
if(display_type == VALUE_DISPLAY.gradient && typeFrom == VALUE_TYPE.color) {
if(display == VALUE_DISPLAY._default) {
2023-02-14 02:51:14 +01:00
var grad = [ new gradientKey(0, value) ];
return grad;
2023-01-25 06:49:00 +01:00
} else if(display == VALUE_DISPLAY.palette) {
2023-01-01 02:06:02 +01:00
var amo = array_length(value);
2023-02-14 02:51:14 +01:00
var grad = array_create(amo);
for( var i = 0; i < amo; i++ )
grad[i] = new valueKey(i / amo, value[i]);
return grad;
2023-01-01 02:06:02 +01:00
}
2023-01-25 06:49:00 +01:00
return value;
2022-12-16 09:18:09 +01:00
}
2023-01-01 02:06:02 +01:00
2023-02-14 02:51:14 +01:00
if(display_type == VALUE_DISPLAY.palette && !is_array(value)) {
return [ value ];
}
2023-01-17 08:11:55 +01:00
if(display_type == VALUE_DISPLAY.area) {
var dispType = ds_list_get(nodeFrom.extra_data, 0);
var surfGet = nodeFrom.display_data;
if(!applyUnit || surfGet == -1) return value;
var surf = surfGet();
var ww = surf[0];
var hh = surf[1];
switch(dispType) {
case AREA_MODE.area :
return value;
case AREA_MODE.padding :
var cx = (ww - value[0] + value[2]) / 2
var cy = (value[1] + hh - value[3]) / 2;
var sw = abs((ww - value[0]) - value[2]) / 2;
var sh = abs(value[1] - (hh - value[3])) / 2;
return [cx, cy, sw, sh, value[4]];
case AREA_MODE.two_point :
var cx = (value[0] + value[2]) / 2
var cy = (value[1] + value[3]) / 2;
var sw = abs(value[0] - value[2]) / 2;
var sh = abs(value[1] - value[3]) / 2;
return [cx, cy, sw, sh, value[4]];
}
}
2023-01-01 02:06:02 +01:00
if(type == VALUE_TYPE.text)
2023-02-17 04:48:54 +01:00
return string_real(value);
2023-01-01 02:06:02 +01:00
if(typeFrom == VALUE_TYPE.integer && type == VALUE_TYPE.color)
return make_color_hsv(0, 0, value);
2023-02-14 02:51:14 +01:00
if((typeFrom == VALUE_TYPE.float || typeFrom == VALUE_TYPE.boolean) && type == VALUE_TYPE.color)
2023-01-01 02:06:02 +01:00
return make_color_hsv(0, 0, value * 255);
if(typeFrom == VALUE_TYPE.boolean && type == VALUE_TYPE.text)
return value? "true" : "false";
2023-01-09 03:14:20 +01:00
2023-01-01 02:06:02 +01:00
if(type == VALUE_TYPE.integer || type == VALUE_TYPE.float) {
if(typeFrom == VALUE_TYPE.text)
value = toNumber(value);
2023-01-09 03:14:20 +01:00
if(applyUnit)
2023-01-01 02:06:02 +01:00
return unit.apply(value, arrIndex);
}
2022-12-23 04:45:52 +01:00
return value;
2022-12-16 09:18:09 +01:00
}
2022-12-27 04:00:50 +01:00
static getValue = function(_time = ANIMATOR.current_frame, applyUnit = true, arrIndex = 0) {
2023-02-14 02:51:14 +01:00
//var cache_hit = cache_value[0];
//cache_hit &= cache_value[1] == _time;
//cache_hit &= cache_value[2] != undefined;
//cache_hit &= connect_type == JUNCTION_CONNECT.input;
//cache_hit &= unit.reference != VALUE_UNIT.reference;
//if(cache_hit) return cache_value[2];
var val = _getValue(_time, applyUnit, arrIndex);
//is_changed = !isEqual(cache_value[1], val);
//cache_value[0] = true;
//cache_value[1] = val;
return val;
}
static _getValue = function(_time = ANIMATOR.current_frame, applyUnit = true, arrIndex = 0) {
//__count("getValue")
2022-12-10 05:06:01 +01:00
var _val = getValueRecursive(_time);
2022-01-18 05:31:19 +01:00
var val = _val[0];
2022-12-23 04:45:52 +01:00
var nod = _val[1];
var typ = nod.type;
var dis = nod.display_type;
2022-01-18 05:31:19 +01:00
2022-12-10 05:06:01 +01:00
var _base = animator.getValue(_time);
2022-01-13 05:24:03 +01:00
2023-01-25 06:49:00 +01:00
if(typ == VALUE_TYPE.surface && (type == VALUE_TYPE.integer || type == VALUE_TYPE.float) && accept_array) { //Dimension conversion
2022-01-18 05:31:19 +01:00
if(is_array(val)) {
2023-01-01 02:06:02 +01:00
var eqSize = true;
var sArr = [];
var _osZ = 0;
for( var i = 0; i < array_length(val); i++ ) {
if(!is_surface(val[i])) continue;
var surfSz = [ surface_get_width(val[i]), surface_get_height(val[i]) ];
array_push(sArr, surfSz);
if(i && !array_equals(surfSz, _osZ))
eqSize = false;
_osZ = surfSz;
}
if(eqSize) return _osZ;
return sArr;
} else if (is_surface(val))
2022-01-18 05:31:19 +01:00
return [ surface_get_width(val), surface_get_height(val) ];
2023-01-01 02:06:02 +01:00
return [1, 1];
}
2022-01-18 05:31:19 +01:00
2023-02-14 02:51:14 +01:00
if(is_array(_base) && !typeArrayDynamic(display_type)) { //Balance array (generate uniform array from single values)
2023-01-09 03:14:20 +01:00
if(!is_array(val)) {
val = array_create(array_length(_base), val);
2023-01-17 08:11:55 +01:00
return valueProcess(val, nod, applyUnit, arrIndex);
2023-01-09 03:14:20 +01:00
} else if(array_length(val) < array_length(_base)) {
2022-12-16 09:18:09 +01:00
for( var i = array_length(val); i < array_length(_base); i++ )
2022-01-13 05:24:03 +01:00
val[i] = 0;
}
}
2023-02-14 02:51:14 +01:00
if(isArray(val)) { //Process data
2022-12-16 09:18:09 +01:00
for( var i = 0; i < array_length(val); i++ )
2023-01-17 08:11:55 +01:00
val[i] = valueProcess(val[i], nod, applyUnit, arrIndex);
2022-12-16 09:18:09 +01:00
} else
2023-01-17 08:11:55 +01:00
val = valueProcess(val, nod, applyUnit, arrIndex);
2022-12-16 09:18:09 +01:00
2022-01-13 05:24:03 +01:00
return val;
}
2022-12-10 05:06:01 +01:00
static getValueRecursive = function(_time = ANIMATOR.current_frame) {
2023-01-25 06:49:00 +01:00
var val = [ -1, self ];
2022-01-13 05:24:03 +01:00
if(value_from == noone)
2023-02-14 02:51:14 +01:00
val = [ animator.getValue(_time), self ];
else if(value_from != self) {
2022-12-10 05:06:01 +01:00
val = value_from.getValueRecursive(_time);
2023-02-14 02:51:14 +01:00
}
2022-01-13 05:24:03 +01:00
return val;
}
static getExtraData = function() {
2022-12-23 04:45:52 +01:00
if(value_from != noone && value_from != self) {
if(display_type == VALUE_DISPLAY.gradient && value_from.display_type != VALUE_DISPLAY.gradient)
return extra_data;
return value_from.getExtraData();
}
return extra_data;
2022-01-13 05:24:03 +01:00
}
static __anim = function() {
2022-09-23 13:28:42 +02:00
return animator.is_anim || node.update_on_frame;
2022-01-13 05:24:03 +01:00
}
2022-12-12 09:08:03 +01:00
static isAnimated = function() {
2022-01-13 05:24:03 +01:00
if(value_from == noone) return __anim();
2022-12-12 09:08:03 +01:00
else return value_from.isAnimated() || value_from.__anim();
2022-01-13 05:24:03 +01:00
}
static showValue = function() {
2022-12-27 04:00:50 +01:00
var val = getValue(, false);
2022-01-13 05:24:03 +01:00
if(isArray()) {
if(array_length(val) == 0) return 0;
return val[safe_mod(node.preview_index, array_length(val))];
2022-01-13 05:24:03 +01:00
}
return val;
}
2023-02-14 02:51:14 +01:00
static isArray = function(val = undefined) {
if(val == undefined) {
if(cache_array[0])
return cache_array[1];
val = getValue();
}
cache_array[0] = true;
if(!is_array(val)) {
cache_array[1] = false;
return cache_array[1];
}
if(!force_array && !typeArray(display_type)) {
cache_array[1] = true;
return cache_array[1];
}
2022-12-23 04:45:52 +01:00
2023-02-14 02:51:14 +01:00
if(array_length(val) > 0) {
cache_array[1] = is_array(val[0]);
return cache_array[1];
}
2022-01-13 05:24:03 +01:00
2023-02-14 02:51:14 +01:00
cache_array[1] = false;
return cache_array[1];
2022-01-13 05:24:03 +01:00
}
2023-02-14 02:51:14 +01:00
static setValue = function(val = 0, record = true, time = ANIMATOR.current_frame, _update = true) {
2022-12-27 04:00:50 +01:00
val = unit.invApply(val);
2023-02-14 02:51:14 +01:00
return setValueDirect(val, record, time, _update);
2022-12-27 04:00:50 +01:00
}
2023-02-14 02:51:14 +01:00
static setValueDirect = function(val = 0, record = true, time = ANIMATOR.current_frame, _update = true) {
2022-09-23 13:28:42 +02:00
var _o = animator.getValue();
2023-02-14 02:51:14 +01:00
var updated = animator.setValue(val, connect_type == JUNCTION_CONNECT.input && record, time);
2022-09-23 13:28:42 +02:00
var _n = animator.getValue();
2022-01-13 05:24:03 +01:00
2023-02-14 02:51:14 +01:00
if(display_type == VALUE_DISPLAY.gradient) updated = true;
2023-01-04 02:30:04 +01:00
2022-01-13 05:24:03 +01:00
if(updated) {
2023-01-04 02:30:04 +01:00
if(connect_type == JUNCTION_CONNECT.input) {
2022-12-10 05:06:01 +01:00
node.triggerRender();
2023-02-14 02:51:14 +01:00
if(_update)
node.valueUpdate(index);
2023-01-04 02:30:04 +01:00
}
2022-01-13 05:24:03 +01:00
2023-02-14 02:51:14 +01:00
if(node.use_cache)
node.clearCache();
2022-09-27 06:37:28 +02:00
MODIFIED = true;
2023-02-14 02:51:14 +01:00
cache_array[0] = false;
cache_value[0] = false;
2022-01-13 05:24:03 +01:00
}
onValidate();
2023-02-14 02:51:14 +01:00
2022-01-13 05:24:03 +01:00
return updated;
}
2023-01-25 06:49:00 +01:00
static isConnectable = function(_valueFrom, checkRecur = true, log = false) {
2023-01-09 03:14:20 +01:00
if(_valueFrom == -1 || _valueFrom == undefined || _valueFrom == noone) {
2023-01-25 06:49:00 +01:00
if(log)
noti_warning("LOAD: Cannot set node connection from " + string(_valueFrom) + " to " + string(name) + " of node " + string(node.name) + ".",, node);
return false;
2022-01-13 05:24:03 +01:00
}
2022-01-25 10:58:11 +01:00
if(_valueFrom == value_from) {
return false;
2022-01-13 05:24:03 +01:00
}
if(_valueFrom == self) {
2023-01-25 06:49:00 +01:00
if(log)
noti_warning("setFrom: Self connection is not allowed.",, node);
return false;
2022-01-13 05:24:03 +01:00
}
2023-02-14 02:51:14 +01:00
if(!typeCompatible(_valueFrom.type, type)) {
if(log)
2023-01-25 06:49:00 +01:00
noti_warning("setFrom: Type mismatch",, node);
return false;
2023-02-19 02:13:19 +01:00
}
if(typeIncompatible(_valueFrom, self)) {
if(log)
noti_warning("setFrom: Type mismatch",, node);
return false;
2022-01-13 05:24:03 +01:00
}
if(connect_type == _valueFrom.connect_type) {
2023-01-25 06:49:00 +01:00
if(log)
noti_warning("setFrom: Connect type mismatch",, node);
return false;
2022-01-13 05:24:03 +01:00
}
if(checkRecur && _valueFrom.searchNodeBackward(node)) {
2023-01-25 06:49:00 +01:00
if(log)
noti_warning("setFrom: Cycle connection",, node);
return false;
2022-01-13 05:24:03 +01:00
}
2023-02-14 02:51:14 +01:00
if(!accept_array && isArray(_valueFrom.getValue())) {
2023-01-25 06:49:00 +01:00
if(log)
noti_warning("setFrom: Array mismatch",, node);
return false;
2022-01-13 05:24:03 +01:00
}
2023-01-25 06:49:00 +01:00
if(!accept_array && _valueFrom.type == VALUE_TYPE.surface && (type == VALUE_TYPE.integer || type == VALUE_TYPE.float)) {
if(log)
noti_warning("setFrom: Array mismatch",, node);
return false;
2022-01-25 10:58:11 +01:00
}
2023-01-25 06:49:00 +01:00
return true;
}
static setFrom = function(_valueFrom, _update = true, checkRecur = true) {
2023-02-14 02:51:14 +01:00
if(_valueFrom == noone)
return removeFrom();
2023-01-25 06:49:00 +01:00
if(!isConnectable(_valueFrom, checkRecur, true))
2022-01-25 10:58:11 +01:00
return false;
2023-01-25 06:49:00 +01:00
2023-02-14 02:51:14 +01:00
if(setFrom_condition != -1 && !setFrom_condition(_valueFrom))
return false;
2023-01-25 06:49:00 +01:00
if(value_from != noone)
ds_list_remove(value_from.value_to, self);
2022-01-25 10:58:11 +01:00
2022-09-23 13:28:42 +02:00
var _o = animator.getValue();
2022-01-13 05:24:03 +01:00
recordAction(ACTION_TYPE.junction_connect, self, value_from);
value_from = _valueFrom;
ds_list_add(_valueFrom.value_to, self);
//show_debug_message("connected " + name + " to " + _valueFrom.name)
2022-01-13 05:24:03 +01:00
2023-02-14 02:51:14 +01:00
node.valueUpdate(index, _o);
2023-01-04 02:30:04 +01:00
if(_update && connect_type == JUNCTION_CONNECT.input) {
2023-01-09 03:14:20 +01:00
node.onValueFromUpdate(index);
2022-12-12 09:08:03 +01:00
node.triggerRender();
if(node.use_cache) node.clearCache();
}
2023-02-14 02:51:14 +01:00
cache_array[0] = false;
cache_value[0] = false;
2022-09-27 06:37:28 +02:00
MODIFIED = true;
return true;
2022-01-13 05:24:03 +01:00
}
2022-01-26 06:57:34 +01:00
static removeFrom = function(_remove_list = true) {
2023-02-14 02:51:14 +01:00
recordAction(ACTION_TYPE.junction_disconnect, self, value_from);
2022-01-26 06:57:34 +01:00
if(_remove_list && value_from != noone)
2022-01-25 10:58:11 +01:00
ds_list_remove(value_from.value_to, self);
2022-01-13 05:24:03 +01:00
value_from = noone;
2023-01-04 02:30:04 +01:00
if(connect_type == JUNCTION_CONNECT.input)
2023-01-09 03:14:20 +01:00
node.onValueFromUpdate(index);
2023-02-14 02:51:14 +01:00
return false;
2022-01-13 05:24:03 +01:00
}
static getShowString = function() {
var val = showValue();
2023-02-17 04:48:54 +01:00
return string_real(val);
2022-01-13 05:24:03 +01:00
}
static setString = function(str) {
2022-09-23 13:28:42 +02:00
var _o = animator.getValue();
2022-01-13 05:24:03 +01:00
if(string_pos(",", str) > 0) {
string_replace(str, "[", "");
string_replace(str, "]", "");
var ss = str, pos, val = [], ind = 0;
while(string_length(ss) > 0) {
pos = string_pos(",", ss);
if(pos == 0) {
val[ind++] = toNumber(ss);
ss = "";
} else {
val[ind++] = toNumber(string_copy(ss, 1, pos - 1));
ss = string_copy(ss, pos + 1, string_length(ss) - pos);
}
}
var _t = typeArray(display_type);
if(_t) {
2023-02-14 02:51:14 +01:00
if(array_length(_o) == array_length(val) || _t == 2)
2022-01-13 05:24:03 +01:00
setValue(val);
} else if(array_length(val) > 0) {
setValue(val[0]);
}
} else {
if(is_array(_o)) {
setValue(array_create(array_length(_o), toNumber(str)));
} else {
setValue(toNumber(str));
}
}
}
2022-01-26 06:57:34 +01:00
static checkConnection = function(_remove_list = true) {
if(value_from == noone) return;
if(value_from.node.active) return;
removeFrom(_remove_list);
2022-01-13 05:24:03 +01:00
}
static searchNodeBackward = function(_node) {
if(node == _node) return true;
for(var i = 0; i < ds_list_size(node.inputs); i++) {
var _in = node.inputs[| i].value_from;
if(_in && _in.searchNodeBackward(_node))
return true;
}
return false;
}
2022-12-27 04:00:50 +01:00
static unitConvert = function(mode) {
var _v = animator.values;
for( var i = 0; i < ds_list_size(_v); i++ )
_v[| i].value = unit.convertUnit(_v[| i].value, mode);
}
2022-01-13 05:24:03 +01:00
drag_type = 0;
drag_mx = 0;
drag_my = 0;
drag_sx = 0;
drag_sy = 0;
2022-12-19 13:35:30 +01:00
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) {
2023-01-01 02:06:02 +01:00
if(value_from != noone) return;
2022-01-13 05:24:03 +01:00
switch(type) {
case VALUE_TYPE.integer :
case VALUE_TYPE.float :
switch(display_type) {
2023-01-17 08:11:55 +01:00
case VALUE_DISPLAY._default :
var _angle = argument_count > 8? argument[ 8] : 0;
var _scale = argument_count > 9? argument[ 9] : 1;
var _spr = argument_count > 10? argument[10] : THEME.anchor_selector;
return preview_overlay_scalar(active, _x, _y, _s, _mx, _my, _snx, _sny, _angle, _scale, _spr);
2022-01-13 05:24:03 +01:00
2023-01-17 08:11:55 +01:00
case VALUE_DISPLAY.rotation :
var _rad = argument_count > 8? argument[ 8] : 64;
return preview_overlay_rotation(active, _x, _y, _s, _mx, _my, _snx, _sny, _rad);
2022-01-13 05:24:03 +01:00
2023-01-17 08:11:55 +01:00
case VALUE_DISPLAY.vector :
2023-02-14 02:51:14 +01:00
var _spr = argument_count > 8? argument[8] : THEME.anchor_selector;
var _sca = argument_count > 9? argument[9] : 1;
return preview_overlay_vector(active, _x, _y, _s, _mx, _my, _snx, _sny, _spr, _sca);
2022-01-13 05:24:03 +01:00
2023-01-17 08:11:55 +01:00
case VALUE_DISPLAY.area :
return preview_overlay_area(active, _x, _y, _s, _mx, _my, _snx, _sny, display_data);
2022-09-23 13:28:42 +02:00
2023-01-17 08:11:55 +01:00
case VALUE_DISPLAY.puppet_control :
return preview_overlay_puppet(active, _x, _y, _s, _mx, _my, _snx, _sny);
2022-01-13 05:24:03 +01:00
}
break;
}
2023-01-17 08:11:55 +01:00
return -1;
2022-01-13 05:24:03 +01:00
}
2022-09-27 06:37:28 +02:00
static drawJunction = function(_s, _mx, _my) {
2022-01-26 06:57:34 +01:00
if(!isVisible()) return false;
var ss = max(0.25, _s / 2);
var is_hover = false;
if(point_in_circle(_mx, _my, x, y, 10 * _s)) {
is_hover = true;
2022-11-18 03:20:31 +01:00
draw_sprite_ext(isArray()? THEME.node_junctions_array_hover : THEME.node_junctions_single_hover, type, x, y, ss, ss, 0, c_white, 1);
2022-01-26 06:57:34 +01:00
} else {
2022-11-18 03:20:31 +01:00
draw_sprite_ext(isArray()? THEME.node_junctions_array : THEME.node_junctions_single, type, x, y, ss, ss, 0, c_white, 1);
2022-01-26 06:57:34 +01:00
}
2022-09-27 06:37:28 +02:00
return is_hover;
}
static drawNameBG = function(_s) {
if(!isVisible()) return false;
draw_set_text(f_p1, fa_left, fa_center);
2022-12-10 05:06:01 +01:00
2022-09-27 06:37:28 +02:00
var tw = string_width(name) + 16;
var th = string_height(name) + 16;
if(connect_type == JUNCTION_CONNECT.input) {
var tx = x - 12 * _s;
2022-11-18 03:20:31 +01:00
draw_sprite_stretched_ext(THEME.node_junction_name_bg, 0, tx - tw, y - th / 2, tw + 16, th, c_white, 0.5);
2022-09-27 06:37:28 +02:00
} else {
var tx = x + 12 * _s;
2022-11-18 03:20:31 +01:00
draw_sprite_stretched_ext(THEME.node_junction_name_bg, 0, tx - 16, y - th / 2, tw + 16, th, c_white, 0.5);
2022-01-26 06:57:34 +01:00
}
2022-09-27 06:37:28 +02:00
}
static drawName = function(_s, _mx, _my) {
if(!isVisible()) return false;
2022-01-26 06:57:34 +01:00
2022-09-27 06:37:28 +02:00
var _hover = point_in_circle(_mx, _my, x, y, 10 * _s);
2022-11-18 03:20:31 +01:00
var _draw_cc = _hover? COLORS._main_text : COLORS._main_text_sub;
2022-09-27 06:37:28 +02:00
draw_set_text(f_p1, fa_left, fa_center, _draw_cc);
if(connect_type == JUNCTION_CONNECT.input) {
var tx = x - 12 * _s;
draw_set_halign(fa_right);
draw_text(tx, y, name);
} else {
var tx = x + 12 * _s;
draw_set_halign(fa_left);
draw_text(tx, y, name);
}
2022-01-26 06:57:34 +01:00
}
2022-01-13 05:24:03 +01:00
static isVisible = function() {
2023-02-14 02:51:14 +01:00
if(!node.active)
return false;
if(value_from)
return true;
if(connect_type == JUNCTION_CONNECT.input)
return visible && (is_array(node.input_display_list)? array_exists(node.input_display_list, index) : true);
return visible;
2022-01-13 05:24:03 +01:00
}
2023-01-09 03:14:20 +01:00
static extractNode = function() {
if(extract_node == "") return noone;
2023-01-25 06:49:00 +01:00
var ext = nodeBuild(extract_node, node.x, node.y);
ext.x -= ext.w + 32;
setFrom(ext.outputs[| 0]);
var animFrom = animator.values;
var len = 2;
switch(extract_node) {
case "Node_Vector4": len++;
case "Node_Vector3": len++;
case "Node_Vector2":
for( var j = 0; j < len; j++ ) {
var animTo = ext.inputs[| j].animator;
var animLs = animTo.values;
animTo.is_anim = animator.is_anim;
ds_list_clear(animLs);
}
for( var i = 0; i < ds_list_size(animFrom); i++ ) {
for( var j = 0; j < len; j++ ) {
var animTo = ext.inputs[| j].animator;
var animLs = animTo.values;
var a = animFrom[| i].clone(animTo);
a.value = a.value[j];
ds_list_add(animLs, a);
}
}
break;
default:
var animTo = ext.inputs[| 0].animator;
var animLs = animTo.values;
animTo.is_anim = animator.is_anim;
ds_list_clear(animLs);
for( var i = 0; i < ds_list_size(animFrom); i++ )
ds_list_add(animLs, animFrom[| i].clone(animTo));
break;
}
2023-01-09 03:14:20 +01:00
2023-01-25 06:49:00 +01:00
ext.update();
PANEL_ANIMATION.updatePropertyList();
2023-01-09 03:14:20 +01:00
}
2023-02-14 02:51:14 +01:00
static serialize = function(scale = false, preset = false) {
2022-01-13 05:24:03 +01:00
var _map = ds_map_create();
2022-09-23 13:28:42 +02:00
ds_map_add_list(_map, "raw value", animator.serialize(scale));
2022-01-13 05:24:03 +01:00
_map[? "on end"] = on_end;
_map[? "visible"] = visible;
2022-12-27 04:00:50 +01:00
_map[? "unit"] = unit.mode;
2022-09-23 13:28:42 +02:00
_map[? "anim"] = animator.is_anim;
2023-02-14 02:51:14 +01:00
_map[? "from node"] = !preset && value_from? value_from.node.node_id : -1;
_map[? "from index"] = !preset && value_from? value_from.index : -1;
2022-01-13 05:24:03 +01:00
ds_map_add_list(_map, "data", ds_list_clone(extra_data));
return _map;
}
con_node = -1;
con_index = -1;
2022-12-21 02:30:23 +01:00
2023-02-14 02:51:14 +01:00
static applyDeserialize = function(_map, scale = false, preset = false) {
2022-12-22 03:09:55 +01:00
if(_map == undefined) return;
2023-01-09 03:14:20 +01:00
if(_map == noone) return;
2023-01-01 02:06:02 +01:00
printIf(TESTING, " |- Applying deserialize to junction " + name + " of node " + node.name);
2022-01-13 05:24:03 +01:00
on_end = ds_map_try_get(_map, "on end", on_end);
visible = ds_map_try_get(_map, "visible", visible);
2022-12-27 04:00:50 +01:00
unit.mode = ds_map_try_get(_map, "unit", VALUE_UNIT.constant);
2022-09-23 13:28:42 +02:00
animator.deserialize(_map[? "raw value"], scale);
2022-12-27 13:30:02 +01:00
2022-09-23 13:28:42 +02:00
animator.is_anim = _map[? "anim"];
2023-02-14 02:51:14 +01:00
if(!preset) {
con_node = _map[? "from node"];
con_index = _map[? "from index"];
}
2022-01-13 05:24:03 +01:00
if(ds_map_exists(_map, "data"))
ds_list_copy(extra_data, _map[? "data"]);
2022-12-27 13:30:02 +01:00
onValidate();
2022-01-13 05:24:03 +01:00
}
2022-09-21 06:09:40 +02:00
static connect = function(log = false) {
if(con_node == -1 || con_index == -1)
return true;
2022-01-13 05:24:03 +01:00
2022-09-21 06:09:40 +02:00
var _node = con_node;
2022-12-21 02:30:23 +01:00
if(APPENDING) {
2022-09-21 06:09:40 +02:00
_node = GetAppendID(con_node);
2022-12-21 02:30:23 +01:00
if(_node == -1)
return true;
}
if(!ds_map_exists(NODE_MAP, _node)) {
var txt = "Node connect error : Node ID " + string(_node) + " not found.";
2023-01-25 06:49:00 +01:00
log_warning("LOAD", "[Connect] " + txt, node);
2022-12-21 02:30:23 +01:00
return false;
}
2022-01-19 03:05:13 +01:00
2022-12-21 02:30:23 +01:00
var _nd = NODE_MAP[? _node];
var _ol = ds_list_size(_nd.outputs);
2023-02-14 02:51:14 +01:00
2022-12-21 02:30:23 +01:00
if(log)
2023-01-25 06:49:00 +01:00
log_warning("LOAD", "[Connect] Reconnecting " + string(node.name) + " to " + _nd.name, node);
2022-09-21 06:09:40 +02:00
2022-12-21 02:30:23 +01:00
if(con_index < _ol) {
if(setFrom(_nd.outputs[| con_index], false))
return true;
2023-01-25 06:49:00 +01:00
log_warning("LOAD", "[Connect] Connection conflict " + string(node.name) + " to " + string(_nd.name) + " : Connection failed.", node);
2022-12-21 02:30:23 +01:00
return false;
2022-01-13 05:24:03 +01:00
}
2023-01-25 06:49:00 +01:00
log_warning("LOAD", "[Connect] Connection conflict " + string(node.name) + " to " + string(_nd.name) + " : Node not exist.", node);
2022-01-19 03:05:13 +01:00
return false;
2022-01-13 05:24:03 +01:00
}
2022-01-19 06:11:17 +01:00
static cleanUp = function() {
ds_list_destroy(value_to);
ds_list_destroy(extra_data);
2022-09-23 13:28:42 +02:00
animator.cleanUp();
delete animator;
2022-01-19 06:11:17 +01:00
}
2022-01-13 05:24:03 +01:00
}