Group trigger

This commit is contained in:
Tanasart 2023-06-13 14:42:06 +02:00
parent 59a6d6d16c
commit c561c756f1
110 changed files with 12411 additions and 11822 deletions

View file

@ -722,6 +722,7 @@
{"name":"s_node_stack","order":37,"path":"sprites/s_node_stack/s_node_stack.yy",},
{"name":"s_fade_up","order":3,"path":"sprites/s_fade_up/s_fade_up.yy",},
{"name":"panel_globalvar","order":2,"path":"scripts/panel_globalvar/panel_globalvar.yy",},
{"name":"node_3d_render","order":20,"path":"scripts/node_3d_render/node_3d_render.yy",},
{"name":"node_guide","order":18,"path":"scripts/node_guide/node_guide.yy",},
{"name":"fd_rectangle_get_velocity_surface","order":24,"path":"scripts/fd_rectangle_get_velocity_surface/fd_rectangle_get_velocity_surface.yy",},
{"name":"s_node_text_char_get","order":2,"path":"sprites/s_node_text_char_get/s_node_text_char_get.yy",},

View file

@ -494,6 +494,7 @@
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_label_bg.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_panel_active.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_panel_bg.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_panel_fg.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_panel_tab.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_scroll_bar.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_selection.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",},
@ -1252,6 +1253,7 @@
{"id":{"name":"s_node_stack","path":"sprites/s_node_stack/s_node_stack.yy",},},
{"id":{"name":"s_fade_up","path":"sprites/s_fade_up/s_fade_up.yy",},},
{"id":{"name":"panel_globalvar","path":"scripts/panel_globalvar/panel_globalvar.yy",},},
{"id":{"name":"node_3d_render","path":"scripts/node_3d_render/node_3d_render.yy",},},
{"id":{"name":"node_guide","path":"scripts/node_guide/node_guide.yy",},},
{"id":{"name":"fd_rectangle_get_velocity_surface","path":"scripts/fd_rectangle_get_velocity_surface/fd_rectangle_get_velocity_surface.yy",},},
{"id":{"name":"s_node_text_char_get","path":"sprites/s_node_text_char_get/s_node_text_char_get.yy",},},

Binary file not shown.

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -14,9 +14,9 @@ event_inherited();
tb_edit = new textBox(TEXTBOX_INPUT.text, function(str) {
if(sep_editing == -1) return;
var sep = node.attributes[? "Separator"];
var sep = node.attributes.separator;
sep[sep_editing][1] = str;
node.attributes[? "Separator"] = sep;
node.attributes.separator = sep;
node.sortIO();
} );
@ -59,7 +59,7 @@ event_inherited();
draw_sprite_ui(THEME.hamburger, 0, hg / 2, _y + hg / 2, 0.5, 0.5,, COLORS._main_icon_light);
if(sep_editing == disp[2]) {
var sep = node.attributes[? "Separator"];
var sep = node.attributes.separator;
WIDGET_CURRENT = tb_edit;
tb_edit.setActiveFocus(sFOCUS, sHOVER);
@ -106,9 +106,9 @@ event_inherited();
}
if(sep_dragging > -1 && mouse_release(mb_left)) {
var sep = node.attributes[? "Separator"];
var sep = node.attributes.separator;
sep[sep_dragging][0] = hovr;
node.attributes[? "Separator"] = sep;
node.attributes.separator = sep;
node.sortIO();
sep_dragging = -1;

View file

@ -25,7 +25,7 @@ if !ready exit;
var _txt = __txtx("dialog_group_order_add", "Add separator");
if(buttonInstant(THEME.button_hide, bx, by, ui(32), ui(32), mouse_ui, sFOCUS, sHOVER, _txt, THEME.add, 1, COLORS._main_value_positive) == 2) {
var sep = node.attributes[? "Separator"];
var sep = node.attributes.separator;
array_push(sep, [ds_list_size(node.inputs) - node.custom_input_index, ""]);
node.sortIO();
}

View file

@ -45,6 +45,7 @@ if !ready exit;
draw_sprite_stretched(THEME.ui_panel_bg, 0, x0, y0, x1 - x0, y1 - y0);
sp_recent.setActiveFocus(sFOCUS, sHOVER);
sp_recent.draw(x0 + ui(6), y0);
draw_sprite_stretched(THEME.ui_panel_fg, 0, x0, y0, x1 - x0, y1 - y0);
var bx = x1 - ui(28);
var by = y0 - ui(28 + 4);
@ -80,8 +81,9 @@ if !ready exit;
x0 = x1 + ui(16);
x1 = dialog_x + dialog_w - ui(16);
bx = x0;
var tab_cover = noone;
var th = ui(36) + THEME_VALUE.panel_tab_extend;
for( var i = 0; i < array_length(pages); i++ ) {
draw_set_text(f_p0, fa_left, fa_bottom, project_page == i? COLORS._main_text : COLORS._main_text_sub);
@ -101,8 +103,11 @@ if !ready exit;
if(txt == "Contests")
tw += ui(32);
if(project_page != i && point_in_rectangle(mouse_mx, mouse_my, bx, y0 - ui(32), bx + tw, y0)) {
draw_sprite_stretched_ext(THEME.ui_panel_tab, 0, bx, y0 - ui(32), tw, ui(40), COLORS.panel_tab_hover, 1);
if(project_page == i) {
draw_sprite_stretched_ext(THEME.ui_panel_tab, 1, bx, y0 - ui(32), tw, th, COLORS.panel_tab, 1);
tab_cover = BBOX().fromWH(bx, y0, tw, THEME_VALUE.panel_tab_extend);
} else if(point_in_rectangle(mouse_mx, mouse_my, bx, y0 - ui(32), bx + tw, y0)) {
draw_sprite_stretched_ext(THEME.ui_panel_tab, 0, bx, y0 - ui(32), tw, th, COLORS.panel_tab_hover, 1);
if(mouse_click(mb_left, sFOCUS)) {
project_page = i;
@ -112,11 +117,8 @@ if !ready exit;
expandAction = true;
}
}
} else {
var foc = project_page == i;
draw_sprite_stretched_ext(THEME.ui_panel_tab, foc, bx, y0 - ui(32), tw, ui(40),
foc? COLORS.panel_tab_active : COLORS.panel_tab_inactive, 1);
}
} else
draw_sprite_stretched_ext(THEME.ui_panel_tab, 0, bx, y0 - ui(32), tw, th, COLORS.panel_tab_inactive, 1);
var _btx = bx + ui(8);
if(txt == "Contests") {
@ -124,9 +126,8 @@ if !ready exit;
_btx += ui(32);
}
var cc = COLORS._main_text;
if(txt == "Contests") cc = project_page == i? CDEF.yellow : COLORS._main_text_sub;
if(project_page == i) cc = COLORS._main_text_on_accent;
var cc = COLORS._main_text_sub;
if(project_page == i) cc = txt == "Contests"? CDEF.yellow : COLORS._main_text;
draw_set_color(cc);
draw_text(_btx, y0 - ui(4), dtxt);
@ -147,6 +148,8 @@ if !ready exit;
}
draw_sprite_stretched(THEME.ui_panel_bg, 0, x0, y0, x1 - x0, y1 - y0);
draw_sprite_stretched(THEME.ui_panel_fg, 0, x0, y0, x1 - x0, y1 - y0);
draw_sprite_bbox(THEME.ui_panel_tab, 3, tab_cover);
switch(pages[project_page]) {
case "Sample projects" :

View file

@ -286,7 +286,7 @@ enum CAMERA_PROJ {
];
}
function _3d_gizmo(active, _x, _y, _s, _mx, _my, _snx, _sny) {
function _3d_gizmo(active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
var _gpos = inputs[| global_pos].getValue();
var _gsca = inputs[| global_sca].getValue();
@ -485,6 +485,7 @@ enum CAMERA_PROJ {
}
inputs[| global_pos].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
#endregion
}
function _3d_local_transform(_lpos, _lrot, _lsca) {
@ -501,13 +502,52 @@ enum CAMERA_PROJ {
matrix_stack_pop();
}
function _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, _pass = "diff", _scale = noone) {
function __3d_transform(pos = 0, rot = 0, sca = 0, lpos = 0, lrot = 0, lsca = 0, apply_local = true, sdim = true) constructor {
self.pos = pos;
self.rot = rot;
self.sca = sca;
self.local_pos = lpos;
self.local_rot = lrot;
self.local_sca = lsca;
self.apply_local = apply_local;
self.scaleDimension = sdim;
}
function __3d_light(dir = 0, height = 0, intensity = 0, color = c_white, ambient = c_white) constructor {
self.dir = dir;
self.height = height;
self.intensity = intensity;
self.color = color;
self.ambient = ambient;
}
function __3d_camera(proj, fov) constructor {
self.projection = proj;
self.fov = fov;
}
function _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, _pass = "diff") {
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1]);
var _pos = _transform.pos;
var _sca = _transform.sca;
var _lpos = _transform.local_pos;
var _lrot = _transform.local_rot;
var _lsca = _transform.local_sca;
var _ldir = _light.dir;
var _lhgt = _light.height;
var _lint = _light.intensity;
var _lclr = _light.color;
var _aclr = _light.ambient;
var _proj = _cam.projection;
var _fov = _cam.fov;
var _applyLocal = _scale == noone? true : _scale.local;
var scaleDimension = _scale == noone? true : _scale.dimension;
var _applyLocal = _transform.apply_local;
var scaleDimension = _transform.scaleDimension;
var lightFor = [ -cos(degtorad(_ldir)), -_lhgt, -sin(degtorad(_ldir)) ];

View file

@ -4,8 +4,8 @@ function BoundingBox(minx = noone, miny = noone, maxx = noone, maxy = noone) con
self.maxx = maxx;
self.maxy = maxy;
self.width = 0;
self.height = 0;
self.width = maxx - minx;
self.height = maxy - miny;
static addPoint = function(px, py) {
minx = minx == noone? px : min(minx, px);
@ -30,7 +30,15 @@ function BoundingBox(minx = noone, miny = noone, maxx = noone, maxy = noone) con
static clone = function() { return new BoundingBox(minx, miny, maxx, maxy); }
}
function node_bbox(x0, y0, x1, y1) constructor {
function BBOX() { return new __BBOX(); }
function __BBOX() constructor {
x0 = 0; x1 = 0;
y0 = 0; y1 = 0;
xc = 0; yc = 0;
w = 0; h = 0;
static fromPoints = function(x0, y0, x1, y1) {
self.x0 = x0;
self.x1 = x1;
self.y0 = y0;
@ -41,5 +49,22 @@ function node_bbox(x0, y0, x1, y1) constructor {
w = x1 - x0;
h = y1 - y0;
static clone = function() { return node_bbox(x0, y0, x1, y1); };
return self;
}
static fromWH = function(x0, y0, w, h) {
self.x0 = x0;
self.x1 = x0 + w;
self.y0 = y0;
self.y1 = y0 + h;
self.xc = (x0 + x1) / 2;
self.yc = (y0 + y1) / 2;
self.w = w;
self.h = h;
return self;
}
static clone = function() { return BBOX().fromPoints(x0, y0, x1, y1); };
}

View file

@ -111,11 +111,11 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co
["Render", true], 21
];
attributes[? "part_amount"] = 512;
attributes.part_amount = 512;
array_push(attributeEditors, ["Maximum particles", "part_amount",
new textBox(TEXTBOX_INPUT.number, function(val) { attributes[? "part_amount"] = val; }) ]);
new textBox(TEXTBOX_INPUT.number, function(val) { attributes.part_amount = val; }) ]);
parts = array_create(attributes[? "part_amount"]);
parts = array_create(attributes.part_amount);
parts_runner = 0;
seed = 0;
@ -125,7 +125,7 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co
current_data = [];
for(var i = 0; i < attributes[? "part_amount"]; i++)
for(var i = 0; i < attributes.part_amount; i++)
parts[i] = new __part(self);
static spawn = function(_time = ANIMATOR.current_frame, _pos = -1) {
@ -270,10 +270,10 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co
part.setPhysic(_vx, _vy, _acc, _grav, _gvDir, _wigg, _trn, _turnSc);
part.setTransform(_scx, _scy, _scale_time, _rot, _rot_spd, _follow);
part.setDraw(_color, _bld, _alp, _fade);
spawn_index = safe_mod(spawn_index + 1, attributes[? "part_amount"]);
spawn_index = safe_mod(spawn_index + 1, attributes.part_amount);
onSpawn(_time, part);
parts_runner = safe_mod(parts_runner + 1, attributes[? "part_amount"]);
parts_runner = safe_mod(parts_runner + 1, attributes.part_amount);
}
}
@ -304,7 +304,7 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co
}
function checkPartPool() {
var _part_amo = attributes[? "part_amount"];
var _part_amo = attributes.part_amount;
var _curr_amo = array_length(parts);
if(_part_amo > _curr_amo) {

View file

@ -1,6 +1,6 @@
function APPEND(_path, context = PANEL_GRAPH.getCurrentContext()) {
if(_path == "") return noone;
var _map = json_load(_path);
var _map = json_load_struct(_path);
if(_map == -1) {
printlog("Decode error");
@ -19,8 +19,8 @@ function __APPEND_MAP(_map, context = PANEL_GRAPH.getCurrentContext()) {
APPENDING = true;
UNDO_HOLDING = true;
if(ds_map_exists(_map, "version")) {
var _v = _map[? "version"];
if(struct_has(_map, "version")) {
var _v = _map.version;
LOADING_VERSION = _v;
if(_v != SAVEFILE_VERSION) {
var warn = "File version mismatch : loading file verion " + string(_v) + " to Pixel Composer " + string(SAVEFILE_VERSION);
@ -28,8 +28,8 @@ function __APPEND_MAP(_map, context = PANEL_GRAPH.getCurrentContext()) {
}
}
if(!ds_map_exists(_map, "nodes")) return noone;
var _node_list = _map[? "nodes"];
if(!struct_has(_map, "nodes")) return noone;
var _node_list = _map.nodes;
var appended_list = ds_list_create();
var node_create = ds_list_create();
@ -37,8 +37,8 @@ function __APPEND_MAP(_map, context = PANEL_GRAPH.getCurrentContext()) {
ds_map_clear(APPEND_MAP);
var t = current_time;
for(var i = 0; i < ds_list_size(_node_list); i++) {
var _node = nodeLoad(_node_list[| i], true, context);
for(var i = 0; i < array_length(_node_list); i++) {
var _node = nodeLoad(_node_list[i], true, context);
if(_node) ds_list_add(appended_list, _node);
}
printlog("Load time: " + string(current_time - t)); t = current_time;
@ -98,12 +98,12 @@ function __APPEND_MAP(_map, context = PANEL_GRAPH.getCurrentContext()) {
try {
while(++pass < 3 && !ds_queue_empty(CONNECTION_CONFLICT)) {
var size = ds_queue_size(CONNECTION_CONFLICT);
log_message("APPEND", "[Connect] " + string(size) + " Connection conflict(s) detected ( pass: " + string(pass) + " )");
log_message("APPEND", $"[Connect] {size} Connection conflict(s) detected (pass: {pass})");
repeat(size) {
var junc = ds_queue_dequeue(CONNECTION_CONFLICT);
var res = junc.connect(true);
log_message("APPEND", "[Connect] Reconnecting " + string(junc.name) + " " + (res? "SUCCESS" : "FAILED"));
log_message("APPEND", $"[Connect] Reconnecting {junc.name} {res? "SUCCESS" : "FAILED"}");
}
Render(true);
}
@ -131,8 +131,8 @@ function __APPEND_MAP(_map, context = PANEL_GRAPH.getCurrentContext()) {
PANEL_ANIMATION.updatePropertyList();
UPDATE |= RENDER_TYPE.full;
if(ds_map_exists(_map, "metadata")) {
var meta = _map[? "metadata"];
if(struct_has(_map, "metadata")) {
var meta = _map.metadata;
for( var i = 0; i < ds_list_size(node_create); i++ ) {
var _node = node_create[| i];
if(!struct_has(_node, "metadata")) continue;
@ -141,7 +141,6 @@ function __APPEND_MAP(_map, context = PANEL_GRAPH.getCurrentContext()) {
}
}
ds_map_destroy(_map);
refreshNodeMap();
return node_create;

View file

@ -127,7 +127,7 @@ function areaBox(_onModify, _unit = noone) : widget() constructor {
y = _y;
w = 0;
h = ui(204);
mode = ds_list_get(_extra_data, 0);
mode = _extra_data[0];
if(buttonInstant(THEME.button_hide, _x - ui(48), _y + ui(64 - 48), ui(96), ui(96), _m, adjust_shape && active, adjust_shape && hover,
"", THEME.inspector_area, array_safe_get(_data, 4), c_white) == 2) {
@ -213,7 +213,7 @@ function areaBox(_onModify, _unit = noone) : widget() constructor {
break;
}
_extra_data[| 0] = (mode + 1) % 3;
_extra_data[0] = (mode + 1) % 3;
}
}

View file

@ -28,6 +28,11 @@ function draw_sprite_stretched_points(spr, ind, _x0, _y0, _x1, _y1) {
__draw_sprite_stretched(spr, ind, _xs, _ys, _w, _h);
}
function draw_sprite_bbox(spr, ind, _bbox) {
if(_bbox == noone) return;
__draw_sprite_stretched(spr, ind, _bbox.x0, _bbox.y0, _bbox.w, _bbox.h);
}
function draw_sprite_uniform(spr, ind, _x, _y, scale, color = c_white) {
draw_sprite_ext(spr, ind, round(_x), round(_y), scale, scale, 0, color, 1);
}

View file

@ -1,4 +1,6 @@
function draw_surface_align(surface, _x, _y, _s, _halign = fa_left, _valign = fa_top) {
if(!is_surface(surface)) return;
var w = surface_get_width(surface) * _s;
var h = surface_get_height(surface) * _s;

View file

@ -10,12 +10,7 @@ function gradientKey(time, value) constructor {
static clone = function() { return new gradientKey(time, value); }
static serialize = function() {
var m = ds_map_create();
m[? "time"] = time;
m[? "value"] = value;
return m;
}
static serialize = function() { return self; }
}
function gradientObject(color = c_black) constructor {
@ -142,14 +137,10 @@ function gradientObject(color = c_black) constructor {
s = json_try_parse(str);
else if(is_struct(str))
s = str;
else if(ds_exists(str, ds_type_list)) {
else if(is_array(str)) {
keys = [];
for( var i = 0; i < ds_list_size(str); i++ ) {
if(!ds_exists(str[| i], ds_type_map)) continue;
keys[i] = new gradientKey(str[| i][? "time"], str[| i][? "value"]);
}
for( var i = 0; i < array_length(str); i++ )
keys[i] = new gradientKey(str[i].time, str[i].value);
return self;
}

View file

@ -1,14 +1,14 @@
function histogramInit() {
attributes[? "preview_resolution"] = 64;
attributes.preview_resolution = 64;
array_push(attributeEditors, ["Preview resolution", "preview_resolution",
new textBox(TEXTBOX_INPUT.number, function(val) { attributes[? "preview_resolution"] = val; })]);
new textBox(TEXTBOX_INPUT.number, function(val) { attributes.preview_resolution = val; })]);
attributes[? "preview_sample"] = 32;
attributes.preview_sample = 32;
array_push(attributeEditors, ["Preview sample", "preview_sample",
new textBox(TEXTBOX_INPUT.number, function(val) { attributes[? "preview_sample"] = val; })]);
new textBox(TEXTBOX_INPUT.number, function(val) { attributes.preview_sample = val; })]);
for( var i = 0; i < 4; i++ ) {
hist[i] = array_create(attributes[? "preview_resolution"] + 1);
hist[i] = array_create(attributes.preview_resolution + 1);
histShow[i] = true;
}
histMax = 0;
@ -50,7 +50,7 @@ function histogramDraw(_x, _y, _w, _h) {
}
function histogramUpdate(surface) {
if(array_length(hist[0]) != attributes[? "preview_resolution"] + 1)
if(array_length(hist[0]) != attributes.preview_resolution + 1)
histogramInit();
if(!is_surface(surface)) return;
@ -58,8 +58,8 @@ function histogramUpdate(surface) {
histMax = 0;
var sw = surface_get_width(surface);
var sh = surface_get_height(surface);
var stw = max(1, sw / attributes[? "preview_sample"]);
var sth = max(1, sh / attributes[? "preview_sample"]);
var stw = max(1, sw / attributes.preview_sample);
var sth = max(1, sh / attributes.preview_sample);
for( var j = 0; j < 4; j++ )
for( var i = 0; i < array_length(hist[0]); i++ ) {
@ -73,9 +73,9 @@ function histogramUpdate(surface) {
for( var j = 0; j < sh; j += sth ) {
var col = buffer_get_color(surface_buffer, i, j, sw, sh);
var colA = [];
colA[0] = round(color_get_red(col) / 256 * attributes[? "preview_resolution"]);
colA[1] = round(color_get_green(col) / 256 * attributes[? "preview_resolution"]);
colA[2] = round(color_get_blue(col) / 256 * attributes[? "preview_resolution"]);
colA[0] = round(color_get_red(col) / 256 * attributes.preview_resolution);
colA[1] = round(color_get_green(col) / 256 * attributes.preview_resolution);
colA[2] = round(color_get_blue(col) / 256 * attributes.preview_resolution);
colA[3] = round((colA[0] + colA[1] + colA[2]) / 3);
for( var k = 0; k < 4; k++ ) {

View file

@ -56,16 +56,10 @@ function __LOAD_PATH(path, readonly = false, safe_mode = false) {
READONLY = readonly;
SET_PATH(path);
var file = file_text_open_read(temp_path);
var load_str = "";
var _load_content = json_load_struct(temp_path);
while(!file_text_eof(file))
load_str += file_text_readln(file);
file_text_close(file);
var _map = json_decode(load_str);
if(ds_map_exists(_map, "version")) {
var _v = _map[? "version"];
if(struct_has(_load_content, "version")) {
var _v = _load_content.version;
LOADING_VERSION = _v;
if(_v != SAVEFILE_VERSION) {
var warn = "File version mismatch : loading file verion " + string(_v) + " to Pixel Composer " + string(SAVEFILE_VERSION);
@ -79,11 +73,11 @@ function __LOAD_PATH(path, readonly = false, safe_mode = false) {
nodeCleanUp();
var create_list = ds_list_create();
if(ds_map_exists(_map, "nodes")) {
if(struct_has(_load_content, "nodes")) {
try {
var _node_list = _map[? "nodes"];
for(var i = 0; i < ds_list_size(_node_list); i++) {
var _node = nodeLoad(_node_list[| i]);
var _node_list = _load_content.nodes;
for(var i = 0; i < array_length(_node_list); i++) {
var _node = nodeLoad(_node_list[i]);
if(_node) ds_list_add(create_list, _node);
}
} catch(e) {
@ -92,37 +86,37 @@ function __LOAD_PATH(path, readonly = false, safe_mode = false) {
}
try {
if(ds_map_exists(_map, "animator")) {
var _anim_map = _map[? "animator"];
ANIMATOR.frames_total = ds_map_try_get(_anim_map, "frames_total");
ANIMATOR.framerate = ds_map_try_get(_anim_map, "framerate");
if(struct_has(_load_content, "animator")) {
var _anim_map = _load_content.animator;
ANIMATOR.frames_total = _anim_map.frames_total;
ANIMATOR.framerate = _anim_map.framerate;
}
} catch(e) {
log_warning("LOAD, animator", exception_print(e));
}
try {
if(ds_map_exists(_map, "metadata"))
METADATA.deserialize(_map[? "metadata"]);
if(struct_has(_load_content, "metadata"))
METADATA.deserialize(_load_content.metadata);
} catch(e) {
log_warning("LOAD, metadata", exception_print(e));
}
GLOBAL = new Node_Global();
try {
if(ds_map_exists(_map, "global"))
GLOBAL.deserialize(_map[? "global"]);
if(struct_has(_load_content, "global"))
GLOBAL.deserialize(_load_content.global);
} catch(e) {
log_warning("LOAD, global", exception_print(e));
}
try {
if(ds_map_exists(_map, "addon")) {
var _addon = _map[? "addon"];
if(struct_has(_load_content, "addon")) {
var _addon = _load_content.addon;
with(addon) {
if(!ds_map_exists(_addon, name)) continue;
var _mp = json_parse(_addon[? name]);
if(!struct_has(_addon, name)) continue;
var _mp = json_parse(_addon.name);
lua_call(thread, "deserialize", _mp);
}
@ -178,7 +172,7 @@ function __LOAD_PATH(path, readonly = false, safe_mode = false) {
try {
while(++pass < 4 && !ds_queue_empty(CONNECTION_CONFLICT)) {
var size = ds_queue_size(CONNECTION_CONFLICT);
log_message("LOAD", "[Connect] " + string(size) + " Connection conflict(s) detected ( pass: " + string(pass) + " )");
log_message("LOAD", $"[Connect] {size} Connection conflict(s) detected (pass: {pass})");
repeat(size)
ds_queue_dequeue(CONNECTION_CONFLICT).connect();
Render();
@ -208,7 +202,6 @@ function __LOAD_PATH(path, readonly = false, safe_mode = false) {
log_message("FILE", "load " + path, THEME.noti_icon_file_load);
PANEL_MENU.setNotiIcon(THEME.noti_icon_file_load);
ds_map_destroy(_map);
refreshNodeMap();
return true;

View file

@ -31,29 +31,26 @@ function MetaDataManager() constructor {
];
static serialize = function() {
var m = ds_map_create();
m[? "description"] = description;
m[? "author"] = author;
m[? "contact"] = contact;
m[? "alias"] = alias;
m[? "aut_id"] = author_steam_id;
m[? "file_id"] = file_id;
ds_map_add_list(m, "tags", ds_list_create_from_array(tags));
var m = {};
m.description = description;
m.author = author;
m.contact = contact;
m.alias = alias;
m.aut_id = author_steam_id;
m.file_id = file_id;
m.tags = tags;
return m;
}
static deserialize = function(m, readonly = false) {
description = ds_map_try_get(m, "description", description);
author = ds_map_try_get(m, "author", author);
contact = ds_map_try_get(m, "contact", contact);
alias = ds_map_try_get(m, "alias", alias);
author_steam_id = ds_map_try_get(m, "aut_id", author_steam_id);
file_id = ds_map_try_get(m, "file_id", file_id);
if(ds_map_exists(m, "tags"))
tags = array_create_from_list(m[? "tags"]);
description = struct_try_get(m, "description", description);
author = struct_try_get(m, "author", author);
contact = struct_try_get(m, "contact", contact);
alias = struct_try_get(m, "alias", alias);
author_steam_id = struct_try_get(m, "aut_id", author_steam_id);
file_id = struct_try_get(m, "file_id", file_id);
tags = struct_try_get(m, "tags", tags);
return self;
}

View file

@ -179,19 +179,20 @@ function Node_3D_Combine(_x, _y, _group = noone) : Node(_x, _y, _group) construc
case 2 : pass = "norm" break;
}
var _cam = { projection: _proj, fov: _fov };
var _scale = { local: false, dimension: _dimS };
var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, false, _dimS );
var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr);
var _cam = new __3d_camera(_proj, _fov);
_outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale);
_outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass);
submit_vertex();
_3d_post_setup();
}
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}
}

View file

@ -70,7 +70,7 @@ function Node_3D_Displace(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
0, 2, 1, 3,
]
attributes[? "auto_update"] = true;
attributes.auto_update = true;
array_push(attributeEditors, ["Auto Update", "auto_update", new checkBox(function() { attribute[? "auto_update"] = !attribute[? "auto_update"]; }, false)]);
@ -124,7 +124,7 @@ function Node_3D_Displace(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
var _dspTex = _data[15];
var _dspStr = _data[16];
if(_output_index == 0 && attributes[? "auto_update"]) {
if(_output_index == 0 && attributes.auto_update) {
var _vert = _data[11];
for( var i = 0; i < array_length(vertexObjects); i++ )
@ -167,10 +167,11 @@ function Node_3D_Displace(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
case 2 : pass = "norm" break;
}
var _cam = { projection: _proj, fov: _fov };
var _scale = { local: true, dimension: _dimS };
var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS );
var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr);
var _cam = new __3d_camera(_proj, _fov);
_outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale);
_outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass);
for( var i = 0; i < array_length(vertexObjects); i++ )
vertexObjects[i].submit();
_3d_post_setup();

View file

@ -313,10 +313,11 @@ function Node_3D_Extrude(_x, _y, _group = noone) : Node_Processor(_x, _y, _group
if(_upda && ANIMATOR.frame_progress)
generateMesh();
var _cam = { projection: _proj, fov: _fov };
var _scale = { local: false, dimension: _dimS };
var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, false, _dimS );
var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr);
var _cam = new __3d_camera(_proj, _fov);
_outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale);
_outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass);
submit_vertex(_array_index);
_3d_post_setup();

View file

@ -235,9 +235,6 @@ function Node_3D_Obj(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
inputs[| 16].setVisible(_proj == 1);
var _cam = { projection: _proj, fov: _fov };
var _scale = { local: true, dimension: _dimS };
for( var i = 0; i < array_length(output_display_list) - 1; i++ ) {
var ind = output_display_list[i];
var _outSurf = outputs[| ind].getValue();
@ -248,7 +245,11 @@ function Node_3D_Obj(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
case 2 : pass = "norm" break;
}
_outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale);
var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS );
var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr);
var _cam = new __3d_camera(_proj, _fov);
_outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass);
for(var i = 0; i < array_length(VB); i++) {
if(i >= array_length(materialIndex)) continue;

View file

@ -184,10 +184,11 @@ function Node_3D_Cone(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
case 2 : pass = "norm" break;
}
var _cam = { projection: _proj, fov: _fov };
var _scale = { local: true, dimension: _dimS };
var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS );
var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr);
var _cam = new __3d_camera(_proj, _fov);
_outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale);
_outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass);
matrix_set(matrix_world, matrix_stack_top());
vertexObjects[0].submit(face_bas);

View file

@ -139,10 +139,11 @@ function Node_3D_Cube(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
case 2 : pass = "norm" break;
}
var _cam = { projection: _proj, fov: _fov };
var _scale = { local: true, dimension: _dimS };
var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS );
var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr);
var _cam = new __3d_camera(_proj, _fov);
_outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale);
_outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass);
for(var i = 0; i < array_length(vertexObjects); i++) {
var _surf = _usetex? _data[6 + i] : _inSurf;

View file

@ -210,10 +210,11 @@ function Node_3D_Cylinder(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
case 2 : pass = "norm" break;
}
var _cam = { projection: _proj, fov: _fov };
var _scale = { local: true, dimension: _dimS };
var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS );
var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr);
var _cam = new __3d_camera(_proj, _fov);
_outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale);
_outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass);
matrix_set(matrix_world, matrix_stack_top());
vertexObjects[0].submit(face_top);

View file

@ -196,10 +196,11 @@ function Node_3D_Sphere(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
case 2 : pass = "norm" break;
}
var _cam = { projection: _proj, fov: _fov };
var _scale = { local: true, dimension: _dimS };
var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS );
var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr);
var _cam = new __3d_camera(_proj, _fov);
_outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale);
_outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass);
vertexObjects[0].submit(texture);
_3d_post_setup();

View file

@ -0,0 +1,241 @@
//function Node_3D_Render(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
// name = "3D Render";
// inputs[| 2] = nodeValue("Dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, def_surf_size2)
// .setDisplay(VALUE_DISPLAY.vector);
// inputs[| 3] = nodeValue("Render position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0.5, 0.5 ])
// .setDisplay(VALUE_DISPLAY.vector)
// .setUnitRef( function() { return inputs[| 2].getValue(); }, VALUE_UNIT.reference);
// inputs[| 4] = nodeValue("Render rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ])
// .setDisplay(VALUE_DISPLAY.vector);
// inputs[| 5] = nodeValue("Render scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1 ])
// .setDisplay(VALUE_DISPLAY.vector);
// inputs[| 6] = nodeValue("Light direction", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0)
// .setDisplay(VALUE_DISPLAY.rotation)
// .rejectArray();
// inputs[| 7] = nodeValue("Light height", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.5)
// .setDisplay(VALUE_DISPLAY.slider, [-1, 1, 0.01])
// .rejectArray();
// inputs[| 8] = nodeValue("Light intensity", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1)
// .setDisplay(VALUE_DISPLAY.slider, [0, 1, 0.01])
// .rejectArray();
// inputs[| 9] = nodeValue("Light color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_white)
// .rejectArray();
// inputs[| 10] = nodeValue("Ambient color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_grey)
// .rejectArray();
// inputs[| 15] = nodeValue("Projection", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
// .setDisplay(VALUE_DISPLAY.enum_button, [ "Orthographic", "Perspective" ])
// .rejectArray();
// inputs[| 16] = nodeValue("Field of view", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 60)
// .setDisplay(VALUE_DISPLAY.slider, [ 0, 90, 1 ])
// .rejectArray();
// inputs[| 17] = nodeValue("Scale view with dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true)
// input_display_list = [
// ["Output", false], 2, 17,
// ["Geometry", false], 0, 1,
// ["Object transform", false], 14, 13, 11,
// ["Camera", false], 15, 16, 3, 5,
// ["Light", false], 6, 7, 8, 9, 10,
// ["Textures", true], 12,
// ];
// input_length = ds_list_size(inputs);
// input_display_len = array_length(input_display_list);
// outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
// outputs[| 1] = nodeValue("3D scene", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3object, function() { return submit_vertex(); });
// outputs[| 2] = nodeValue("Normal pass", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
// output_display_list = [
// 0, 2, 1
// ]
// _3d_node_init(2, /*Transform*/ 3, 5, 14, 13, 11);
// tex_surface = surface_create(1, 1);
// function reset_tex() {
// tex_surface = surface_verify(tex_surface, 1, 1);
// surface_set_target(tex_surface);
// draw_clear(c_black);
// surface_reset_target();
// }
// reset_tex();
// static onValueUpdate = function(index = 0) {
// if(index == 12) updateObj(false);
// }
// function setPath(path) {
// inputs[| 0].setValue(path);
// updateObj();
// }
// function createMaterial(m_index) {
// var index = ds_list_size(inputs);
// inputs[| index] = nodeValue(materialNames[m_index] + " texture", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, tex_surface);
// inputs[| index].setVisible(true);
// input_display_list[input_display_len + m_index] = index;
// if(m_index >= array_length(materials)) return;
// var matY = y - (array_length(materials) - 1) / 2 * (128 + 32);
// var mat = materials[m_index];
// if(file_exists(mat.diff_path)) {
// var sol = Node_create_Image_path(x - (w + 64), matY + m_index * (128 + 32), mat.diff_path);
// sol.name = mat.name + " texture";
// inputs[| index].setFrom(sol.outputs[| 0]);
// } else {
// var sol = nodeBuild("Node_Solid", x - (w + 64), matY + m_index * (128 + 32));
// sol.name = mat.name + " texture";
// sol.inputs[| 1].setValue(mat.diff);
// inputs[| index].setFrom(sol.outputs[| 0]);
// }
// }
// materialNames = [];
// materialIndex = [];
// materials = [];
// static updateObj = function(updateMat = true) {
// var _path = inputs[| 0].getValue();
// var _flip = inputs[| 12].getValue();
// var _dir = filename_dir(_path);
// var _pathMtl = string_copy(_path, 1, string_length(_path) - 4) + ".mtl";
// var _v = readObj(_path, _flip);
// if(_v != noone) {
// VB = _v.vertex_groups;
// materialNames = _v.materials;
// materialIndex = _v.material_index;
// use_normal = _v.use_normal;
// if(_v.mtl_path != "")
// _pathMtl = _dir + "/" + _v.mtl_path;
// }
// if(updateMat) {
// if(array_length(materialNames))
// materials = readMtl(_pathMtl);
// else {
// materialNames = ["Material"];
// materialIndex = [0];
// materials = [ new MTLmaterial("Material") ];
// }
// do_reset_material = true;
// }
// update();
// }
// do_reset_material = false;
// static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) {
// _3d_gizmo(active, _x, _y, _s, _mx, _my, _snx, _sny);
// }
// static submit_vertex = function() {
// var _lpos = inputs[| 14].getValue();
// var _lrot = inputs[| 13].getValue();
// var _lsca = inputs[| 11].getValue();
// _3d_local_transform(_lpos, _lrot, _lsca);
// for(var i = 0; i < array_length(VB); i++) {
// if(i >= array_length(materialIndex)) continue;
// var mIndex = materialIndex[i];
// var tex = inputs[| input_length + mIndex].getValue();
// if(!is_surface(tex)) continue;
// vertex_submit(VB[i], pr_trianglelist, surface_get_texture(tex));
// }
// _3d_clear_local_transform();
// }
// static update = function(frame = ANIMATOR.current_frame) {
// if(!surface_exists(tex_surface)) reset_tex();
// if(do_reset_material) {
// array_resize(input_display_list, input_display_len);
// while(ds_list_size(inputs) > input_length)
// ds_list_delete(inputs, input_length);
// for(var i = 0; i < array_length(materialNames); i++)
// createMaterial(i);
// do_reset_material = false;
// }
// var _dim = inputs[| 2].getValue();
// var _pos = inputs[| 3].getValue();
// //var _rot = inputs[| 4].getValue();
// var _sca = inputs[| 5].getValue();
// var _ldir = inputs[| 6].getValue();
// var _lhgt = inputs[| 7].getValue();
// var _lint = inputs[| 8].getValue();
// var _lclr = inputs[| 9].getValue();
// var _aclr = inputs[| 10].getValue();
// var _lpos = inputs[| 14].getValue();
// var _lrot = inputs[| 13].getValue();
// var _lsca = inputs[| 11].getValue();
// var _proj = inputs[| 15].getValue();
// var _fov = inputs[| 16].getValue();
// var _dimS = inputs[| 17].getValue();
// inputs[| 16].setVisible(_proj == 1);
// for( var i = 0; i < array_length(output_display_list) - 1; i++ ) {
// var ind = output_display_list[i];
// var _outSurf = outputs[| ind].getValue();
// var pass = "diff";
// switch(ind) {
// case 0 : pass = "diff" break;
// case 2 : pass = "norm" break;
// }
// var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS );
// var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr);
// var _cam = new __3d_camera(_proj, _fov);
// _outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass);
// for(var i = 0; i < array_length(VB); i++) {
// if(i >= array_length(materialIndex)) continue;
// var mIndex = materialIndex[i];
// var tex = inputs[| input_length + mIndex].getValue();
// if(!is_surface(tex)) continue;
// vertex_submit(VB[i], pr_trianglelist, surface_get_texture(tex));
// }
// _3d_post_setup();
// outputs[| ind].setValue(_outSurf);
// }
// }
// static onCleanUp = function() {
// surface_free(tex_surface);
// }
//}

View file

@ -0,0 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "node_3d_render",
"isCompatibility": false,
"isDnD": false,
"parent": {
"name": "3D",
"path": "folders/nodes/data/3D.yy",
},
}

View file

@ -193,10 +193,11 @@ function Node_3D_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) construct
case 2 : pass = "norm" break;
}
var _cam = { projection: _proj, fov: _fov };
var _scale = { local: false, dimension: _dimS };
var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, false, _dimS );
var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr);
var _cam = new __3d_camera(_proj, _fov);
_outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale);
_outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass);
submit_vertex();
_3d_post_setup();

View file

@ -117,10 +117,11 @@ function Node_3D_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro
case 2 : pass = "norm" break;
}
var _cam = { projection: _proj, fov: _fov };
var _scale = { local: false, dimension: _dimS };
var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, false, _dimS );
var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr);
var _cam = new __3d_camera(_proj, _fov);
_outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale);
_outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass);
submit_vertex();
_3d_post_setup();

View file

@ -115,9 +115,9 @@ function Node_VFX_Renderer(_x, _y, _group = noone) : Node(_x, _y, _group) constr
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}
}

View file

@ -3,7 +3,7 @@ function Node_VFX_Spawner(_x, _y, _group = noone) : Node_VFX_Spawner_Base(_x, _y
color = COLORS.node_blend_vfx;
icon = THEME.vfx;
attributes[? "Output pool"] = false;
attributes.Output_pool = false;
inputs[| input_len + 0] = nodeValue("Spawn trigger", self, JUNCTION_CONNECT.input, VALUE_TYPE.node, false)
.setVisible(true, true);
@ -26,7 +26,7 @@ function Node_VFX_Spawner(_x, _y, _group = noone) : Node_VFX_Spawner_Base(_x, _y
reset();
runVFX(ANIMATOR.current_frame);
if(attributes[? "Output pool"]) {
if(attributes.Output_pool) {
outputs[| 0].setValue(parts);
return;
} else {

View file

@ -25,7 +25,7 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
var by = _y + ui(8);
if(buttonInstant(THEME.button_hide, bx, by, bw, bh, _m, _focus, _hover) == 2) {
var amo = ds_list_size(inputs) - input_fix_len;
attributes[? "size"] = amo + 1;
attributes.size = amo + 1;
refreshDynamicInput();
update();
}
@ -37,10 +37,10 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
draw_text(bxc + ui(48), byc, __txt("Add"));
var bx = _x + bw + ui(8);
var amo = attributes[? "size"];
var amo = attributes.size;
if(amo > 1 && buttonInstant(THEME.button_hide, bx, by, bw, bh, _m, _focus, _hover) == 2) {
var amo = ds_list_size(inputs) - input_fix_len;
attributes[? "size"] = max(amo - 1, 1);
attributes.size = max(amo - 1, 1);
refreshDynamicInput();
update();
}
@ -64,8 +64,8 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
outputs[| 0] = nodeValue("Array", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, []);
attributes[? "size"] = 1;
attributes[? "spread_value"] = false;
attributes.size = 1;
attributes.spread_value = false;
static getType = function() {
var _type = inputs[| 0].getValue();
@ -93,7 +93,7 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
static refreshDynamicInput = function() {
var _l = ds_list_create();
var amo = attributes[? "size"];
var amo = attributes.size;
var extra = true;
var lastNode = noone;
@ -185,9 +185,9 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}

View file

@ -83,9 +83,9 @@ function Node_Array_Add(_x, _y, _group = noone) : Node(_x, _y, _group) construct
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length )
for(var i = input_fix_len; i < array_length(_inputs); i += data_length )
createNewInput();
}

View file

@ -86,9 +86,9 @@ function Node_Array_Zip(_x, _y, _group = noone) : Node(_x, _y, _group) construct
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length )
for(var i = input_fix_len; i < array_length(_inputs); i += data_length )
createNewInput();
}

View file

@ -51,7 +51,7 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
var amo = array_length(layers);
var hh = 28;
var _h = hh * amo + 16;
var _vis = attributes[? "layer_visible"];
var _vis = attributes.layer_visible;
draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, _y, _w, _h, COLORS.node_composite_bg_blend, 1);
for( var i = 0; i < array_length(layers); i++ ) {
@ -63,16 +63,16 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
draw_line(_x + 16, _yy - 2, _x + _w - 16, _yy - 2);
}
var vis = ds_list_get(_vis, i, true);
var vis = array_safe_get(_vis, i, true);
var _bx = _x + 24;
if(point_in_circle(_m[0], _m[1], _bx, _yy + hh / 2, 12)) {
draw_sprite_ui_uniform(THEME.junc_visible, vis, _bx, _yy + hh / 2, 1, c_white);
if(mouse_press(mb_left, _focus))
hold_visibility = !_vis[| i];
hold_visibility = !_vis[i];
if(mouse_click(mb_left, _focus) && _vis[| i] != hold_visibility) {
_vis[| i] = hold_visibility;
if(mouse_click(mb_left, _focus) && _vis[i] != hold_visibility) {
_vis[i] = hold_visibility;
update();
}
} else
@ -159,7 +159,7 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
["Tags", false], 2, tag_renderer,
];
attributes[? "layer_visible"] = ds_list_create();
attributes.layer_visible = [];
content = ds_map_create();
layers = [];
@ -224,7 +224,7 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
read_ase(path, content);
layers = [];
var vis = attributes[? "layer_visible"];
var vis = attributes.layer_visible;
ds_list_clear(vis);
var frames = content[? "Frames"];
@ -316,7 +316,7 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
_tag_delay = kf.time;
}
var vis = attributes[? "layer_visible"];
var vis = attributes.layer_visible;
var ww = content[? "Width"];
var hh = content[? "Height"];
@ -347,14 +347,14 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
}
static attributeSerialize = function() {
var att = ds_map_create();
ds_map_add_list(att, "layer_visible", ds_list_clone(attributes[? "layer_visible"]));
var att = {};
att.layer_visible = attributes.layer_visible;
return att;
}
static attributeDeserialize = function(attr) {
if(ds_map_exists(attr, "layer_visible"))
attributes[? "layer_visible"] = ds_list_clone(attr[? "layer_visible"], true);
if(struct_has(attr, "layer_visible"))
attributes.layer_visible = attr.layer_visible;
}
}

View file

@ -28,8 +28,8 @@ function Node_Base_Convert(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro
var baseTo = current_data[2];
var bbox = drawGetBbox(xx, yy, _s);
var b1 = new node_bbox(bbox.x0, bbox.y0, bbox.xc - _s * 8, bbox.y1);
var b2 = new node_bbox(bbox.xc + _s * 8, bbox.y0, bbox.x1, bbox.y1);
var b1 = BBOX().fromPoints(bbox.x0, bbox.y0, bbox.xc - _s * 8, bbox.y1);
var b2 = BBOX().fromPoints(bbox.xc + _s * 8, bbox.y0, bbox.x1, bbox.y1);
draw_sprite_ext(THEME.arrow, 0, bbox.xc, bbox.yc + 1 * _s, .5 * _s, .5 * _s, 0, COLORS._main_icon, 1);
draw_text_bbox(b1, baseFrom);

View file

@ -60,7 +60,7 @@ function Node_Bevel(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con
var _shf = _data[2];
var _sca = _data[3];
var _slp = _data[4];
var _sam = ds_map_try_get(attributes, "oversample");
var _sam = struct_try_get(attributes, "oversample");
surface_set_shader(_outSurf, shader);
shader_set_uniform_f(uniform_hei, _hei);

View file

@ -33,7 +33,7 @@ function Node_Blur(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
static process_data = function(_outSurf, _data, _output_index, _array_index) {
var _size = _data[1];
var _clamp = ds_map_try_get(attributes, "oversample");
var _clamp = struct_try_get(attributes, "oversample");
var _isovr = _data[3];
var _mask = _data[5];
var _mix = _data[6];

View file

@ -44,7 +44,7 @@ function Node_Blur_Radial(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
static process_data = function(_outSurf, _data, _output_index, _array_index) {
var _str = _data[1];
var _cen = _data[2];
var _sam = ds_map_try_get(attributes, "oversample");
var _sam = struct_try_get(attributes, "oversample");
var _mask = _data[4];
var _mix = _data[5];
_cen[0] /= surface_get_width(_outSurf);

View file

@ -45,7 +45,7 @@ function Node_Blur_Simple(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
static process_data = function(_outSurf, _data, _output_index, _array_index) {
if(!is_surface(_data[0])) return _outSurf;
var _size = _data[1];
var _samp = ds_map_try_get(attributes, "oversample");
var _samp = struct_try_get(attributes, "oversample");
var _mask = _data[3];
var _isovr = _data[4];
var _overc = _data[5];

View file

@ -56,7 +56,7 @@ function Node_Blur_Zoom(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
static process_data = function(_outSurf, _data, _output_index, _array_index) {
var _str = _data[1];
var _cen = _data[2];
var _sam = ds_map_try_get(attributes, "oversample");
var _sam = struct_try_get(attributes, "oversample");
var _blr = _data[4];
var _msk = _data[5];
var _mask = _data[6];

View file

@ -33,7 +33,7 @@ function Node_Cache(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
}
static update = function() {
if(recoverCache() || !ANIMATOR.is_playing) return;
if(recoverCache()) return;
if(!inputs[| 0].value_from) return;
var _surf = inputs[| 0].getValue();
@ -50,8 +50,8 @@ function Node_Cache(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
}
static postDeserialize = function() {
if(!ds_map_exists(load_map, "cache")) return;
cache_content = load_map[? "cache"];
if(!struct_has(load_map, "cache")) return;
cache_content = load_map.cache;
cache_loading_progress = 0;
cache_loading = true;
}

View file

@ -40,6 +40,8 @@ function Node_Cache_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constru
}
static update = function() {
if(recoverCache()) return;
var ss = [];
var str = inputs[| 1].getValue();
var lst = inputs[| 2].getValue();
@ -72,8 +74,8 @@ function Node_Cache_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constru
}
static postDeserialize = function() {
if(!ds_map_exists(load_map, "cache")) return;
cache_content = load_map[? "cache"];
if(!struct_has(load_map, "cache")) return;
cache_content = load_map.cache;
cache_loading_progress = 0;
cache_loading = true;
}

View file

@ -120,7 +120,7 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co
if(!is_surface(_data[0])) return;
var _area = _data[1];
var _zoom = _data[2];
var _samp = ds_map_try_get(attributes, "oversample");
var _samp = struct_try_get(attributes, "oversample");
var _fix = _data[4];
var cDep = attrDepth();
@ -208,9 +208,9 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}
}

View file

@ -623,8 +623,8 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
}
static doApplyDeserialize = function() {
if(!ds_map_exists(load_map, "surface")) return;
var buff = buffer_base64_decode(load_map[? "surface"]);
if(!struct_has(load_map, "surface")) return;
var buff = buffer_base64_decode(load_map.surface);
surface_buffer = buffer_decompress(buff);
var _dim = inputs[| 0].getValue();

View file

@ -74,11 +74,11 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc
metadata = new MetaDataManager();
attributes[? "Separator"] = [];
attributes[? "w"] = 128;
attributes[? "h"] = 128;
attributes.separator = [];
attributes.w = 128;
attributes.h = 128;
array_push(attributeEditors, ["Edit separator", "Separator",
array_push(attributeEditors, ["Edit separator", "separator",
button(function() {
var dia = dialogCall(o_dialog_group_input_order);
dia.node = self;
@ -136,10 +136,26 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc
}
}
static getOutputNodes = function() {
var nodes = [];
for( var i = custom_output_index; i < ds_list_size(outputs); i++ ) {
var _junc = outputs[| i];
for( var j = 0; j < ds_list_size(_junc.value_to); j++ ) {
var _to = _junc.value_to[| j];
if(_to.value_from != _junc) continue;
array_push_unique(nodes, _to.node);
}
}
return nodes;
}
static getNextNodes = function() { //get node inside the group
LOG_BLOCK_START();
LOG_IF(global.FLAG.render, $"→→→→→ Call get next node from group");
var nodes = [];
if(renderActive) {
var allReady = true;
for(var i = custom_input_index; i < ds_list_size(inputs); i++) {
var _in = inputs[| i].from;
@ -152,7 +168,9 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc
}
}
var nodes = __nodeLeafList(getNodeList());
nodes = __nodeLeafList(getNodeList());
}
LOG_BLOCK_END();
return nodes;
}
@ -186,7 +204,7 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc
var siz = ds_list_size(outputs);
for( var i = custom_output_index; i < siz; i++ ) {
var _o = outputs[| i];
if(_o.node.rendered) continue;
if(_o.from.rendered) continue;
rendered = false;
break;
@ -282,11 +300,18 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc
render_time += node_list[| i].render_time;
}
w = attributes[? "w"];
w = attributes.w;
onStep();
}
static triggerCheck = function() {
_triggerCheck();
var node_list = getNodeList();
for(var i = 0; i < ds_list_size(node_list); i++)
node_list[| i].triggerCheck();
}
static onStep = function() {}
PATCH_STATIC
@ -306,7 +331,7 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc
static sortIO = function() {
input_display_list = [];
var sep = attributes[? "Separator"];
var sep = attributes.separator;
array_sort(sep, function(a0, a1) { return a0[0] - a1[0]; });
var siz = ds_list_size(inputs);
var ar = ds_priority_create();
@ -427,25 +452,25 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc
}
static preConnect = function() {
instanceBase = GetAppendID(ds_map_try_get(load_map, "instance_base", noone));
instanceBase = GetAppendID(struct_try_get(load_map, "instance_base", noone));
sortIO();
applyDeserialize();
}
static attributeSerialize = function() {
var att = ds_map_create();
att[? "Separator"] = json_stringify(attributes[? "Separator"]);
att[? "w"] = attributes[? "w"];
att[? "h"] = attributes[? "h"];
var att = {};
att.separator = json_stringify(attributes.separator);
att.w = attributes.w;
att.h = attributes.h;
return att;
}
static attributeDeserialize = function(attr) {
if(ds_map_exists(attr, "Separator"))
attributes[? "Separator"] = json_parse(attr[? "Separator"]);
attributes[? "w"] = ds_map_try_get(attr, "w", 128);
attributes[? "h"] = ds_map_try_get(attr, "h", 128);
if(struct_has(attr, "separator"))
attributes.separator = json_parse(attr.separator);
attributes.w = attr.w;
attributes.h = attr.h;
}
}

View file

@ -36,8 +36,8 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
input_fix_len = ds_list_size(inputs);
data_length = 4;
attributes[? "layer_visible"] = ds_list_create();
attributes[? "layer_selectable"] = ds_list_create();
attributes.layer_visible = [];
attributes.layer_selectable = [];
hold_visibility = true;
hold_select = true;
@ -52,8 +52,8 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
layer_renderer.h = _h;
draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, _y, _w, _h, COLORS.node_composite_bg_blend, 1);
var _vis = attributes[? "layer_visible"];
var _sel = attributes[? "layer_selectable"];
var _vis = attributes.layer_visible;
var _sel = attributes.layer_selectable;
var ly = _y + 8;
var ssh = lh - 6;
var hoverIndex = noone;
@ -81,8 +81,8 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
if(!is_surface(_surf)) continue;
var aa = (ind != layer_dragging || layer_dragging == noone)? 1 : 0.5;
var vis = _vis[| ind];
var sel = _sel[| ind];
var vis = _vis[ind];
var sel = _sel[ind];
var hover = point_in_rectangle(_m[0], _m[1], _x, _cy, _x + _w, _cy + lh);
draw_set_color(COLORS.node_composite_separator);
@ -93,10 +93,10 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
draw_sprite_ui_uniform(THEME.junc_visible, vis, _bx, _cy + lh / 2, 1, c_white);
if(mouse_press(mb_left, _focus))
hold_visibility = !_vis[| ind];
hold_visibility = !_vis[ind];
if(mouse_click(mb_left, _focus) && _vis[| ind] != hold_visibility) {
_vis[| ind] = hold_visibility;
if(mouse_click(mb_left, _focus) && _vis[ind] != hold_visibility) {
_vis[@ ind] = hold_visibility;
doUpdate();
}
} else
@ -107,10 +107,10 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
draw_sprite_ui_uniform(THEME.cursor_select, sel, _bx, _cy + lh / 2, 1, c_white);
if(mouse_press(mb_left, _focus))
hold_select = !_sel[| ind];
hold_select = !_sel[ind];
if(mouse_click(mb_left, _focus) && _sel[| ind] != hold_select)
_sel[| ind] = hold_select;
if(mouse_click(mb_left, _focus) && _sel[ind] != hold_select)
_sel[@ ind] = hold_select;
} else
draw_sprite_ui_uniform(THEME.cursor_select, sel, _bx, _cy + lh / 2, 1, COLORS._main_icon, 0.5 + 0.5 * sel);
@ -158,17 +158,17 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
if(layer_dragging != hoverIndex && hoverIndex != noone) {
var index = input_fix_len + layer_dragging * data_length;
var targt = input_fix_len + hoverIndex * data_length;
var _vis = attributes[? "layer_visible"];
var _sel = attributes[? "layer_selectable"];
var _vis = attributes.layer_visible;
var _sel = attributes.layer_selectable;
var ext = [];
var vis = _vis[| layer_dragging];
ds_list_delete(_vis, layer_dragging);
ds_list_insert(_vis, hoverIndex, vis);
var vis = _vis[layer_dragging];
array_delete(_vis, layer_dragging, 1);
array_insert(_vis, hoverIndex, vis);
var sel = _sel[| layer_dragging];
ds_list_delete(_sel, layer_dragging);
ds_list_insert(_sel, hoverIndex, sel);
var sel = _sel[layer_dragging];
array_delete(_sel, layer_dragging, 1);
array_insert(_sel, hoverIndex, sel);
for( var i = 0; i < data_length; i++ ) {
ext[i] = inputs[| index];
@ -181,6 +181,7 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
doUpdate();
}
layer_dragging = noone;
}
@ -233,10 +234,10 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
array_push(input_display_list, index + 2);
array_push(input_display_list, index + 3);
while(_s >= ds_list_size(attributes[? "layer_visible"]))
ds_list_add(attributes[? "layer_visible"], true);
while(_s >= ds_list_size(attributes[? "layer_selectable"]))
ds_list_add(attributes[? "layer_selectable"], true);
while(_s >= array_length(attributes.layer_visible))
array_push(attributes.layer_visible, true);
while(_s >= array_length(attributes.layer_selectable))
array_push(attributes.layer_selectable, true);
}
if(!LOADING && !APPENDING) createNewSurface();
@ -572,16 +573,16 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
var hovering = -1;
var hovering_type = 0;
var _vis = attributes[? "layer_visible"];
var _sel = attributes[? "layer_selectable"];
var _vis = attributes.layer_visible;
var _sel = attributes.layer_selectable;
var amo = (ds_list_size(inputs) - input_fix_len) / data_length;
if(array_length(current_data) < input_fix_len + amo * data_length)
return;
for(var i = 0; i < amo; i++) {
var vis = _vis[| i];
var sel = _sel[| i];
var vis = _vis[i];
var sel = _sel[i];
if(!vis) continue;
var index = input_fix_len + i * data_length;
@ -770,12 +771,12 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
var res_index = 0, bg = 0;
var imageAmo = (ds_list_size(inputs) - input_fix_len) / data_length;
var _vis = attributes[? "layer_visible"];
var _vis = attributes.layer_visible;
surface_set_shader(_outSurf, sh_sample, true, BLEND.alphamulp);
for(var i = 0; i < imageAmo; i++) {
var vis = _vis[| i];
var vis = _vis[i];
if(!vis) continue;
var startDataIndex = input_fix_len + i * data_length;
@ -807,26 +808,26 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewSurface();
}
static attributeSerialize = function() {
var att = ds_map_create();
ds_map_add_list(att, "layer_visible", ds_list_clone(attributes[? "layer_visible"]));
ds_map_add_list(att, "layer_selectable", ds_list_clone(attributes[? "layer_selectable"]));
var att = {};
att.layer_visible = attributes.layer_visible;
att.layer_selectable = attributes.layer_selectable;
return att;
}
static attributeDeserialize = function(attr) {
if(ds_map_exists(attr, "layer_visible"))
attributes[? "layer_visible"] = ds_list_clone(attr[? "layer_visible"], true);
if(struct_has(attr, "layer_visible"))
attributes.layer_visible = attr.layer_visible;
if(ds_map_exists(attr, "layer_selectable"))
attributes[? "layer_selectable"] = ds_list_clone(attr[? "layer_selectable"], true);
if(struct_has(attr, "layer_selectable"))
attributes.layer_selectable = attr.layer_selectable;
}
}

View file

@ -34,7 +34,7 @@ function Node_Convolution(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
static process_data = function(_outSurf, _data, _output_index, _array_index) {
var _ker = _data[1];
var _sam = ds_map_try_get(attributes, "oversample");
var _sam = struct_try_get(attributes, "oversample");
surface_set_target(_outSurf);
DRAW_CLEAR

View file

@ -25,69 +25,69 @@ function Node_Crop_Content(_x, _y, _group = noone) : Node(_x, _y, _group) constr
drag_my = 0;
drag_sv = 0;
temp_surface = [ surface_create(1, 1), surface_create(1, 1) ];
temp_surface = [ surface_create(1, 1, surface_r32float) ];
static findBoundary = function(surface) {
if(!is_surface(surface)) return [ 0, 0, 0, 0 ];
//static findBoundary = function(surface) {
// if(!is_surface(surface)) return [ 0, 0, 0, 0 ];
var _w = surface_get_width(surface);
var _h = surface_get_height(surface);
// var _w = surface_get_width(surface);
// var _h = surface_get_height(surface);
var s = surface_create(_w, _h, surface_r8unorm);
surface_set_target(s);
DRAW_CLEAR
draw_surface_safe(surface, 0, 0);
surface_reset_target();
// var s = surface_create(_w, _h, surface_r8unorm);
// surface_set_target(s);
// DRAW_CLEAR
// draw_surface_safe(surface, 0, 0);
// surface_reset_target();
var buff = buffer_create(_w * _h, buffer_fast, 1);
buffer_get_surface(buff, s, 0);
// var buff = buffer_create(_w * _h, buffer_fast, 1);
// buffer_get_surface(buff, s, 0);
var top = 0;
for( var i = top; i < _h; i++ )
for( var j = 0; j < _w; j++ ) {
var col = buffer_read_at(buff, i * _w + j, buffer_u8);
if(col > 0) {
top = i;
i = _h;
break;
}
}
// var top = 0;
// for( var i = top; i < _h; i++ )
// for( var j = 0; j < _w; j++ ) {
// var col = buffer_read_at(buff, i * _w + j, buffer_u8);
// if(col > 0) {
// top = i;
// i = _h;
// break;
// }
// }
var bottom = _h;
for( var i = bottom; i >= top; i-- )
for( var j = 0; j < _w; j++ ) {
var col = buffer_read_at(buff, i * _w + j, buffer_u8);
if(col > 0) {
bottom = i;
i = 0;
break;
}
}
// var bottom = _h;
// for( var i = bottom; i >= top; i-- )
// for( var j = 0; j < _w; j++ ) {
// var col = buffer_read_at(buff, i * _w + j, buffer_u8);
// if(col > 0) {
// bottom = i;
// i = 0;
// break;
// }
// }
var left = 0;
for( var j = 0; j < _w; j++ )
for( var i = top; i < bottom; i++ ) {
var col = buffer_read_at(buff, i * _w + j, buffer_u8);
if(col > 0) {
left = j;
j = _w;
break;
}
}
// var left = 0;
// for( var j = 0; j < _w; j++ )
// for( var i = top; i < bottom; i++ ) {
// var col = buffer_read_at(buff, i * _w + j, buffer_u8);
// if(col > 0) {
// left = j;
// j = _w;
// break;
// }
// }
var right = 0;
for( var j = _w; j >= left; j-- )
for( var i = top; i < bottom; i++ ) {
var col = buffer_read_at(buff, i * _w + j, buffer_u8);
if(col > 0) {
right = j;
j = 0;
break;
}
}
// var right = 0;
// for( var j = _w; j >= left; j-- )
// for( var i = top; i < bottom; i++ ) {
// var col = buffer_read_at(buff, i * _w + j, buffer_u8);
// if(col > 0) {
// right = j;
// j = 0;
// break;
// }
// }
return [ left, top, right + 1, bottom + 1 ];
}
// return [ left, top, right + 1, bottom + 1 ];
//}
static update = function() {
var _inSurf = inputs[| 0].getValue();
@ -124,38 +124,35 @@ function Node_Crop_Content(_x, _y, _group = noone) : Node(_x, _y, _group) constr
draw_surface_safe(_surf, 0, 0);
surface_reset_target();
var _minx, _miny, _maxx, _maxy;
for( var i = 0; i < array_length(temp_surface); i++ ) {
temp_surface[i] = surface_verify(temp_surface[i], 1, 1, cDep);
var _minx = 0, _miny = 0, _maxx = _dim[0], _maxy = _dim[1];
temp_surface[0] = surface_verify(temp_surface[0], 1, 1, surface_r32float);
shader_set(sh_find_boundary);
shader_set_f("dimension", _dim);
shader_set_i("mode", i);
if(i) shader_set_f("minn", [ _minx, _miny ]);
shader_set_surface("texture", s);
surface_set_target(temp_surface[i]);
for( var i = 0; i < 4; i++ ) {
shader_set_i("mode", i);
shader_set_f("bbox", [ _minx, _miny, _maxx, _maxy ]);
surface_set_target(temp_surface[0]);
DRAW_CLEAR
BLEND_OVERRIDE;
draw_surface(s, 0, 0);
BLEND_NORMAL;
surface_reset_target();
switch(i) {
case 0 : _minx = round(surface_get_pixel_ext(temp_surface[0], 0, 0) / 255); break;
case 1 : _miny = round(surface_get_pixel_ext(temp_surface[0], 0, 0) / 255); break;
case 2 : _maxx = round(surface_get_pixel_ext(temp_surface[0], 0, 0) / 255) + 1; break;
case 3 : _maxy = round(surface_get_pixel_ext(temp_surface[0], 0, 0) / 255) + 1; break;
}
}
shader_reset();
if(i == 0) {
var minBox = surface_get_pixel_ext(temp_surface[0] , 0, 0);
_minx = max(0, color_get_red(minBox) * 256 + color_get_green(minBox));
_miny = max(0, color_get_blue(minBox) * 256 + color_get_alpha(minBox));
}
}
surface_free(s);
var maxBox = surface_get_pixel_ext(temp_surface[1], 0, 0);
_maxx = color_get_red(maxBox) * 256 + color_get_green(maxBox) + 1;
_maxy = color_get_blue(maxBox) * 256 + color_get_alpha(maxBox) + 1;
if(_array == 0) {
minx = min(minx, _minx);
miny = min(miny, _miny);

View file

@ -59,7 +59,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
inspector_display_list = -1;
is_dynamic_output = false;
attributes = ds_map_create();
attributes = {};
attributeEditors = [];
inspectInput1 = nodeValue("Toggle execution", self, JUNCTION_CONNECT.input, VALUE_TYPE.action, false).setVisible(true, true);
@ -188,11 +188,14 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
h = max(min_h, (preview_surface && previewable)? 128 : 0, _hi, _ho);
}
onSetDisplayName = noone;
static setDisplayName = function(_name) {
display_name = _name;
internalName = string_replace_all(display_name, " ", "_");
refreshNodeMap();
if(onSetDisplayName != noone)
onSetDisplayName();
}
static getOutput = function(junc = noone) {
@ -292,12 +295,35 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
static doStepBegin = function() {}
static triggerCheck = function() {
_triggerCheck();
}
static _triggerCheck = function() {
for( var i = 0; i < ds_list_size(inputs); i++ ) {
if(inputs[| i].type != VALUE_TYPE.trigger) continue;
if(!is_instanceof(inputs[| i].editWidget, buttonClass)) continue;
var trig = inputs[| i].getValue();
if(trig) inputs[| i].editWidget.onClick();
if(trig) {
inputs[| i].editWidget.onClick();
inputs[| i].setValue(false);
}
}
if(hasInspector1Update()) {
var trig = inspectInput1.getValue();
if(trig) {
inspectInput1.editWidget.onClick();
inspectInput1.setValue(false);
}
}
if(hasInspector2Update()) {
var trig = inspectInput2.getValue();
if(trig) {
inspectInput2.editWidget.onClick();
inspectInput2.setValue(false);
}
}
}
@ -312,14 +338,6 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
LOG_BLOCK_START();
LOG_IF(global.FLAG.render, $">>>>>>>>>> DoUpdate called from {internalName} <<<<<<<<<<");
for( var i = 0; i < ds_list_size(inputs); i++ ) {
if(inputs[| i].type != VALUE_TYPE.trigger) continue;
if(inputs[| i].editWidget == noone) continue;
var trg = inputs[| i].getValue();
if(trg) inputs[| i].editWidget.onClick();
}
try {
var t = get_timer();
@ -512,7 +530,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
var y0 = yy + 20 * draw_name + draw_padding * _s;
var y1 = yy + (h - draw_padding) * _s;
return new node_bbox(x0, y0, x1, y1);
return BBOX().fromPoints(x0, y0, x1, y1);
}
static drawNodeName = function(xx, yy, _s) {
@ -1242,48 +1260,44 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
}
static serialize = function(scale = false, preset = false) {
var _map = ds_map_create();
var _map = {};
//print(" > Serializing: " + name);
if(!preset) {
_map[? "id"] = node_id;
_map[? "render"] = renderActive;
_map[? "name"] = display_name;
_map[? "iname"] = internalName;
_map[? "x"] = x;
_map[? "y"] = y;
_map[? "type"] = instanceof(self);
_map[? "group"] = group == noone? group : group.node_id;
_map[? "preview"] = previewable;
_map.id = node_id;
_map.render = renderActive;
_map.name = display_name;
_map.iname = internalName;
_map.x = x;
_map.y = y;
_map.type = instanceof(self);
_map.group = group == noone? group : group.node_id;
_map.preview = previewable;
}
ds_map_add_map(_map, "attri", attributeSerialize());
_map.attri = attributeSerialize();
var _inputs = ds_list_create();
var _inputs = [];
for(var i = 0; i < ds_list_size(inputs); i++)
ds_list_add_map(_inputs, inputs[| i].serialize(scale, preset));
ds_map_add_list(_map, "inputs", _inputs);
array_push(_inputs, inputs[| i].serialize(scale, preset));
_map.inputs = _inputs;
var _outputs = ds_list_create();
var _outputs = [];
for(var i = 0; i < ds_list_size(outputs); i++)
ds_list_add_map(_outputs, outputs[| i].serialize(scale, preset));
ds_map_add_list(_map, "outputs", _outputs);
array_push(_outputs, outputs[| i].serialize(scale, preset));
_map.outputs = _outputs;
var _trigger = ds_list_create();
ds_list_add_map(_trigger, inspectInput1.serialize(scale, preset));
ds_list_add_map(_trigger, inspectInput2.serialize(scale, preset));
ds_map_add_list(_map, "inspectInputs", _trigger);
var _trigger = [];
array_push(_trigger, inspectInput1.serialize(scale, preset));
array_push(_trigger, inspectInput2.serialize(scale, preset));
_map.inspectInputs = _trigger;
doSerialize(_map);
processSerialize(_map);
return _map;
}
static attributeSerialize = function() {
var att = ds_map_create();
ds_map_override(att, attributes);
return att;
}
static attributeSerialize = function() { return attributes; }
static doSerialize = function(_map) {}
static processSerialize = function(_map) {}
@ -1294,28 +1308,26 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
load_scale = scale;
if(!preset) {
if(APPENDING)
APPEND_MAP[? load_map[? "id"]] = node_id;
else
node_id = ds_map_try_get(load_map, "id");
if(APPENDING) APPEND_MAP[? load_map.id] = node_id;
else node_id = load_map.id;
NODE_MAP[? node_id] = self;
if(ds_map_exists(load_map, "name"))
setDisplayName(ds_map_try_get(load_map, "name", ""));
if(struct_has(load_map, "name"))
setDisplayName(load_map.name);
internalName = ds_map_try_get(load_map, "iname", internalName);
_group = ds_map_try_get(load_map, "group", noone);
internalName = struct_try_get(load_map, "iname", internalName);
_group = struct_try_get(load_map, "group", noone);
if(_group == -1) _group = noone;
x = ds_map_try_get(load_map, "x");
y = ds_map_try_get(load_map, "y");
renderActive = ds_map_try_get(load_map, "render", true);
previewable = ds_map_try_get(load_map, "preview", previewable);
x = struct_try_get(load_map, "x");
y = struct_try_get(load_map, "y");
renderActive = struct_try_get(load_map, "render", true);
previewable = struct_try_get(load_map, "preview", previewable);
}
if(ds_map_exists(load_map, "attri"))
attributeDeserialize(load_map[? "attri"]);
if(struct_has(load_map, "attri"))
attributeDeserialize(load_map.attri);
doDeserialize();
processDeserialize();
@ -1331,33 +1343,33 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
static doDeserialize = function() {}
static attributeDeserialize = function(attr) {
ds_map_override(attributes, attr);
struct_override(attributes, attr);
}
static postDeserialize = function() {}
static processDeserialize = function() {}
static applyDeserialize = function(preset = false) {
var _inputs = load_map[? "inputs"];
var amo = min(ds_list_size(inputs), ds_list_size(_inputs));
var _inputs = load_map.inputs;
var amo = min(ds_list_size(inputs), array_length(_inputs));
for(var i = 0; i < amo; i++) {
if(inputs[| i] == noone) continue;
inputs[| i].applyDeserialize(_inputs[| i], load_scale, preset);
inputs[| i].applyDeserialize(_inputs[i], load_scale, preset);
}
if(ds_map_exists(load_map, "outputs")) {
var _outputs = load_map[? "outputs"];
if(struct_has(load_map, "outputs")) {
var _outputs = load_map.outputs;
for(var i = 0; i < ds_list_size(outputs); i++) {
if(outputs[| i] == noone) continue;
outputs[| i].applyDeserialize(_outputs[| i], load_scale, preset);
outputs[| i].applyDeserialize(_outputs[i], load_scale, preset);
}
}
if(ds_map_exists(load_map, "inspectInputs")) {
var insInp = load_map[? "inspectInputs"];
inspectInput1.applyDeserialize(insInp[| 0], load_scale, preset);
inspectInput2.applyDeserialize(insInp[| 1], load_scale, preset);
if(struct_has(load_map, "inspectInputs")) {
var insInp = load_map.inspectInputs;
inspectInput1.applyDeserialize(insInp[0], load_scale, preset);
inspectInput2.applyDeserialize(insInp[1], load_scale, preset);
}
doApplyDeserialize();
@ -1386,7 +1398,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
for(var i = 0; i < ds_list_size(inputs); i++)
connected &= inputs[| i].connect(log);
if(ds_map_exists(load_map, "inspectInputs")) {
if(struct_has(load_map, "inspectInputs")) {
inspectInput1.connect(log);
inspectInput2.connect(log);
}
@ -1413,8 +1425,6 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
ds_map_destroy(inputMap);
ds_map_destroy(outputMap);
ds_map_destroy(attributes);
for( var i = 0; i < array_length(temp_surface); i++ )
surface_free(temp_surface[i]);
@ -1425,8 +1435,8 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
// helper function
static attrDepth = function() {
if(ds_map_exists(attributes, "color_depth")) {
var form = attributes[? "color_depth"];
if(struct_has(attributes, "color_depth")) {
var form = attributes.color_depth;
if(inputs[| 0].type == VALUE_TYPE.surface)
form--;
if(form >= 0)

View file

@ -55,7 +55,7 @@ function Node_Dilate(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co
var center = _data[1];
var stren = _data[2];
var rad = _data[3];
var sam = ds_map_try_get(attributes, "oversample");
var sam = struct_try_get(attributes, "oversample");
surface_set_shader(_outSurf, shader);
shader_set_interpolation(_data[0]);

View file

@ -83,7 +83,7 @@ If set, then strength value control how many times the effect applies on itself.
shader_set_uniform_f(uniform_mid, _data[4]);
shader_set_uniform_i(uniform_rg, _data[5]);
shader_set_uniform_i(uniform_it, _data[6]);
shader_set_uniform_i(uniform_sam, ds_map_try_get(attributes, "oversample"));
shader_set_uniform_i(uniform_sam, struct_try_get(attributes, "oversample"));
draw_surface_safe(_data[0], 0, 0);
surface_reset_shader();

View file

@ -34,7 +34,7 @@ function Node_Edge_Detect(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
static process_data = function(_outSurf, _data, _output_index, _array_index) {
var ft = _data[1];
var ov = ds_map_try_get(attributes, "oversample");
var ov = struct_try_get(attributes, "oversample");
surface_set_target(_outSurf);
DRAW_CLEAR

View file

@ -164,9 +164,9 @@ function Node_Equation(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}

View file

@ -33,11 +33,11 @@ function Node_Flood_Fill(_x, _y, _group = noone) : Node_Processor(_x, _y, _group
attribute_surface_depth();
attributes[? "fill_iteration"] = -1;
attributes.fill_iteration = -1;
array_push(attributeEditors, "Algorithm");
array_push(attributeEditors, ["Fill iteration", "fill_iteration",
new textBox(TEXTBOX_INPUT.number, function(val) {
attributes[? "fill_iteration"] = val;
attributes.fill_iteration = val;
triggerRender();
})]);
@ -80,7 +80,7 @@ function Node_Flood_Fill(_x, _y, _group = noone) : Node_Processor(_x, _y, _group
surface_reset_target();
var ind = 0;
var it = attributes[? "fill_iteration"] == -1? sw + sh : attributes[? "fill_iteration"];
var it = attributes.fill_iteration == -1? sw + sh : attributes.fill_iteration;
repeat(it) {
ind = !ind;

View file

@ -50,9 +50,9 @@ function Node_Fluid_Domain_Queue(_x, _y, _group = noone) : Node_Fluid(_x, _y, _g
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = 0; i < ds_list_size(_inputs); i++)
for(var i = 0; i < array_length(_inputs); i++)
createNewInput();
}

View file

@ -137,7 +137,7 @@
#endregion
#region utilities
function previewWindow(node) {
function create_preview_window(node) {
if(node == noone) return;
var win = new Panel_Preview_Window();
win.node_target = node;

View file

@ -238,41 +238,39 @@ function Node_Global(_x = 0, _y = 0) : __Node_Base(_x, _y) constructor {
}
static serialize = function() {
var _map = ds_map_create();
var _map = {};
var _inputs = ds_list_create();
var _inputs = [];
for(var i = 0; i < ds_list_size(inputs); i++) {
var _ser = inputs[| i].serialize();
_ser[? "global_type"] = inputs[| i].editor.type_index;
_ser[? "global_disp"] = inputs[| i].editor.disp_index;
_ser[? "global_name"] = inputs[| i].editor.value_name;
_ser[? "global_s_range"] = ds_list_create_from_array(inputs[| i].editor.slider_range);
_ser[? "global_s_step "] = inputs[| i].editor.slider_step;
_ser.global_type = inputs[| i].editor.type_index;
_ser.global_disp = inputs[| i].editor.disp_index;
_ser.global_name = inputs[| i].editor.value_name;
_ser.global_s_range = inputs[| i].editor.slider_range;
_ser.global_s_step = inputs[| i].editor.slider_step;
ds_list_add(_inputs, _ser);
ds_list_mark_as_map(_inputs, i);
array_push(_inputs, _ser);
}
ds_map_add_list(_map, "inputs", _inputs);
_map.inputs = _inputs;
return _map;
}
static deserialize = function(_map) {
var _inputs = _map[? "inputs"];
var _inputs = _map.inputs;
for(var i = 0; i < ds_list_size(_inputs); i++) {
var _des = _inputs[| i];
for(var i = 0; i < array_length(_inputs); i++) {
var _des = _inputs[i];
var _in = createValue();
_in.editor.type_index = ds_map_try_get(_des, "global_type", 0);
_in.editor.disp_index = ds_map_try_get(_des, "global_disp", 0);
_in.editor.disp_index = ds_map_try_get(_des, "global_disp", 0);
_in.editor.value_name = ds_map_try_get(_des, "global_name", "");
_in.editor.type_index = struct_try_get(_des, "global_type", 0);
_in.editor.disp_index = struct_try_get(_des, "global_disp", 0);
_in.editor.disp_index = struct_try_get(_des, "global_disp", 0);
_in.editor.value_name = struct_try_get(_des, "global_name", "");
_in.editor.slider_range = array_create_from_list(ds_map_try_get(_des, "global_s_range", [ 0, 0 ]));
_in.editor.slider_step = ds_map_try_get(_des, "global_s_step", 0.01);
_in.editor.slider_range = _des.global_s_range;
_in.editor.slider_step = struct_try_get(_des, "global_s_step", 0.01);
_in.editor.refreshInput();

View file

@ -12,6 +12,18 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru
h = 32 + 24;
min_h = h;
data_type_list = [ "Integer", "Float", "Boolean", "Color", "Surface",
"File Path", "Curve", "Text", "Object", "Node",
"3D object", "Any", "Path", "Particle", "Rigidbody Object",
"Fluid Domain", "Struct", "Strands", "Mesh", "Trigger"
];
data_type_map = [ VALUE_TYPE.integer, VALUE_TYPE.float, VALUE_TYPE.boolean, VALUE_TYPE.color, VALUE_TYPE.surface,
VALUE_TYPE.path, VALUE_TYPE.curve, VALUE_TYPE.text, VALUE_TYPE.object, VALUE_TYPE.node,
VALUE_TYPE.d3object, VALUE_TYPE.any, VALUE_TYPE.pathnode, VALUE_TYPE.particle, VALUE_TYPE.rigid,
VALUE_TYPE.fdomain, VALUE_TYPE.struct, VALUE_TYPE.strands, VALUE_TYPE.mesh, VALUE_TYPE.trigger
];
display_list = [
/*Integer*/ [ "Default", "Range", "Rotation", "Rotation range", "Slider", "Slider range", "Padding", "Vector", "Vector range", "Area", "Enum button", "Menu scroll" ],
/*Float*/ [ "Default", "Range", "Rotation", "Rotation range", "Slider", "Slider range", "Padding", "Vector", "Vector range", "Area" ],
@ -32,6 +44,7 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru
/*Struct*/ [ "Default", ],
/*Strand*/ [ "Default", ],
/*Mesh*/ [ "Default", ],
/*Trigger*/ [ "Default", ],
];
inputs[| 0] = nodeValue("Display type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
@ -45,8 +58,7 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru
.rejectArray();
inputs[| 2] = nodeValue("Input type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Integer", "Float", "Boolean", "Color", "Surface", "File Path", "Curve", "Text", "Object", "Node",
"3D object", "Any", "Path", "Particle", "Rigidbody Object", "Fluid Domain", "Struct", "Strands", "Mesh" ], { update_hover: false })
.setDisplay(VALUE_DISPLAY.enum_scroll, data_type_list, { update_hover: false })
.rejectArray();
inputs[| 2].editWidget.update_hover = false;
@ -69,13 +81,24 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru
.setVisible(false)
.rejectArray();
inputs[| 8] = nodeValue("Button Label", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "Trigger")
.setVisible(false)
.rejectArray();
input_display_list = [
["Display", false], 5, 6,
["Data", false], 2, 0, 4, 1, 7, 3,
["Data", false], 2, 0, 4, 1, 7, 3, 8,
];
outputs[| 0] = nodeValue("Value", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, 0);
attributes.inherit_name = true;
doTrigger = 0;
_onSetDisplayName = function() {
attributes.inherit_name = false;
}
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) {
if(inParent.isArray()) return;
inParent.drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
@ -86,7 +109,8 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru
var _dtype = inputs[| 0].getValue();
var _range = inputs[| 1].getValue();
var _val_type = inputs[| 2].getValue();
var _type = inputs[| 2].getValue();
var _val_type = data_type_map[_type];
var _enum_label = inputs[| 3].getValue();
var _vec_size = inputs[| 4].getValue();
var _step = inputs[| 7].getValue();
@ -183,7 +207,17 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru
inParent.animator = new valueAnimator(new gradientObject(c_white), inParent);
inParent.setDisplay(VALUE_DISPLAY._default);
break;
default: inParent.setDisplay(VALUE_DISPLAY._default); break;
default:
inParent.setDisplay(VALUE_DISPLAY._default);
break;
}
switch(_val_type) {
case VALUE_TYPE.trigger :
var bname = inputs[| 8].getValue();
inParent.setDisplay(VALUE_DISPLAY.button, [ function() { doTrigger = 1; }, bname]);
break;
}
if(index == 5)
@ -229,6 +263,27 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru
inParent.name = display_name;
group.inputMap[? string_replace_all(display_name, " ", "_")] = inParent;
}
var _to_list = outputs[| 0].value_to;
onSetDisplayName = _onSetDisplayName;
if(attributes.inherit_name && !ds_list_empty(_to_list)) {
for( var i = 0; i < ds_list_size(_to_list); i++ ) {
if(_to_list[| i].value_from != outputs[| 0]) continue;
if(display_name == _to_list[| i].name) break;
onSetDisplayName = noone;
setDisplayName(_to_list[| i].name);
}
}
if(inParent.type == VALUE_TYPE.trigger) {
if(doTrigger == 1) {
outputs[| 0].setValue(true);
doTrigger = -1;
} else if(doTrigger == -1) {
outputs[| 0].setValue(false);
doTrigger = 0;
}
}
}
PATCH_STATIC
@ -236,16 +291,19 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru
static update = function(frame = ANIMATOR.current_frame) {
if(is_undefined(inParent)) return;
var _dtype = inputs[| 0].getValue();
var _dstype = inputs[| 0].getValue();
var _data = inputs[| 2].getValue();
_dtype = display_list[_data][_dtype];
_dstype = display_list[_data][_dstype];
var _datype = data_type_map[_data];
inputs[| 1].setVisible(false);
inputs[| 3].setVisible(false);
inputs[| 4].setVisible(false);
inputs[| 7].setVisible(false);
inputs[| 8].setVisible(_datype == VALUE_TYPE.trigger);
switch(_dtype) {
switch(_dstype) {
case "Slider" :
case "Slider range" :
inputs[| 7].setVisible(true);
@ -266,22 +324,21 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru
static postDeserialize = function() {
createInput(false);
var _inputs = load_map[? "inputs"];
inputs[| 5].applyDeserialize(_inputs[| 5], load_scale);
var _inputs = load_map.inputs;
inputs[| 5].applyDeserialize(_inputs[5], load_scale);
group.sortIO();
inputs[| 2].applyDeserialize(_inputs[| 2], load_scale);
inputs[| 2].applyDeserialize(_inputs[2], load_scale);
onValueUpdate(2);
}
static applyDeserialize = function() {
var _inputs = load_map[? "inputs"];
var amo = min(ds_list_size(_inputs), ds_list_size(inputs));
var _inputs = load_map.inputs;
var amo = min(array_length(_inputs), ds_list_size(inputs));
for(var i = 0; i < amo; i++) {
if(i == 2 || i == 5) continue;
inputs[| i].applyDeserialize(_inputs[| i], load_scale);
var raw_val = _inputs[| i][? "raw value"];
inputs[| i].applyDeserialize(_inputs[i], load_scale);
}
inParent.name = name;

View file

@ -15,9 +15,14 @@ function Node_Group_Output(_x, _y, _group = noone) : Node(_x, _y, _group) constr
inputs[| 1] = nodeValue("Order", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.rejectArray();
attributes.inherit_name = true;
outParent = undefined;
output_index = -1;
_onSetDisplayName = function() {
attributes.inherit_name = false;
}
static setRenderStatus = function(result) {
LOG_LINE_IF(global.FLAG.render, $"Set render status for {internalName} : {result}");
@ -104,6 +109,14 @@ function Node_Group_Output(_x, _y, _group = noone) : Node(_x, _y, _group) constr
outParent.type = inputs[| 0].type;
outParent.display_type = inputs[| 0].display_type;
onSetDisplayName = _onSetDisplayName;
if(attributes.inherit_name && inputs[| 0].value_from != noone) {
if(display_name != inputs[| 0].value_from.name) {
onSetDisplayName = noone;
setDisplayName(inputs[| 0].value_from.name);
}
}
}
//static triggerRender = function() {
@ -118,8 +131,8 @@ function Node_Group_Output(_x, _y, _group = noone) : Node(_x, _y, _group) constr
static postDeserialize = function() {
createOutput(false);
var _inputs = load_map[? "inputs"];
inputs[| 1].applyDeserialize(_inputs[| 1], load_scale);
var _inputs = load_map.inputs;
inputs[| 1].applyDeserialize(_inputs[1], load_scale);
group.sortIO();
}

View file

@ -37,7 +37,7 @@ function __generate_node_data() {
};
_lin[i] = {
name: _b.inputs[| i].name,
name: _b.inputs[| i]._initName,
tooltip: _b.inputs[| i].tooltip,
};
}
@ -49,7 +49,7 @@ function __generate_node_data() {
};
_lot[i] = {
name: _b.outputs[| i].name,
name: _b.outputs[| i]._initName,
tooltip: _b.outputs[| i].tooltip,
};
}

View file

@ -191,9 +191,9 @@ function Node_Json_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) cons
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}

View file

@ -127,9 +127,9 @@ function Node_Json_File_Write(_x, _y, _group = noone) : Node(_x, _y, _group) con
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}

View file

@ -128,6 +128,12 @@ function valueAnimator(_val, _prop, _sep_axis = false) constructor {
static getValue = function(_time = ANIMATOR.current_frame) {
if(prop.type == VALUE_TYPE.trigger) {
if(ds_list_size(values) == 0)
return false;
if(!prop.is_anim)
return values[| 0].value;
for(var i = 0; i < ds_list_size(values); i++) { //Find trigger
var _key = values[| i];
if(_key.time == _time)
@ -278,6 +284,11 @@ function valueAnimator(_val, _prop, _sep_axis = false) constructor {
static setValue = function(_val = 0, _record = true, _time = ANIMATOR.current_frame, ease_in = 0, ease_out = 0) {
if(prop.type == VALUE_TYPE.trigger) {
if(!prop.is_anim) {
values[| 0] = new valueKey(0, _val, self);
return true;
}
for(var i = 0; i < ds_list_size(values); i++) { //Find trigger
var _key = values[| i];
if(_key.time == _time) {
@ -344,60 +355,56 @@ function valueAnimator(_val, _prop, _sep_axis = false) constructor {
}
static serialize = function(scale = false) {
var _list = ds_list_create();
var _data = [];
for(var i = 0; i < ds_list_size(values); i++) {
var _value_list = ds_list_create();
var _value_list = [];
if(scale)
_value_list[| 0] = values[| i].time / (ANIMATOR.frames_total - 1);
_value_list[0] = values[| i].time / (ANIMATOR.frames_total - 1);
else
_value_list[| 0] = values[| i].time;
_value_list[0] = values[| i].time;
var val = values[| i].value;
if(prop.type == VALUE_TYPE.struct)
_value_list[| 1] = json_stringify(val);
_value_list[1] = json_stringify(val);
else if(is_struct(val))
_value_list[| 1] = val.serialize();
_value_list[1] = val.serialize();
else if(!sep_axis && typeArray(prop.display_type) && is_array(val)) {
var __v = ds_list_create();
var __v = [];
for(var j = 0; j < array_length(val); j++) {
if(is_struct(val[j]) && struct_has(val[j], "serialize"))
ds_list_add_map(__v, val[j].serialize());
array_push(__v, val[j].serialize());
else
ds_list_add(__v, val[j]);
array_push(__v, val[j]);
}
_value_list[| 1] = __v;
ds_list_mark_as_list(_value_list, 1);
_value_list[1] = __v;
} else
_value_list[| 1] = values[| i].value;
_value_list[1] = values[| i].value;
_value_list[| 2] = ds_list_create_from_array(values[| i].ease_in);
ds_list_mark_as_list(_value_list, 2);
_value_list[| 3] = ds_list_create_from_array(values[| i].ease_out);
ds_list_mark_as_list(_value_list, 3);
_value_list[2] = values[| i].ease_in;
_value_list[3] = values[| i].ease_out;
_value_list[4] = values[| i].ease_in_type;
_value_list[5] = values[| i].ease_out_type;
_value_list[| 4] = values[| i].ease_in_type;
_value_list[| 5] = values[| i].ease_out_type;
ds_list_add_list(_list, _value_list);
array_push(_data, _value_list);
}
return _list;
return _data;
}
static deserialize = function(_list, scale = false) {
static deserialize = function(_data, scale = false) {
ds_list_clear(values);
if(prop.type == VALUE_TYPE.gradient && LOADING_VERSION < 1340 && !CLONING) { //backward compat: Gradient
var _val = [];
var value = _list[| 0][| 1];
var value = _data[0][1];
if(ds_exists(value, ds_type_list))
for(var i = 0; i < ds_list_size(value); i++) {
var _keyframe = value[| i];
var _t = ds_map_try_get(_keyframe, "time");
var _v = ds_map_try_get(_keyframe, "value");
if(is_array(value))
for(var i = 0; i < array_length(value); i++) {
var _keyframe = value[i];
var _t = struct_try_get(_keyframe, "time");
var _v = struct_try_get(_keyframe, "value");
array_push(_val, new gradientKey(_t, _v));
}
@ -410,36 +417,35 @@ function valueAnimator(_val, _prop, _sep_axis = false) constructor {
var base = getValue();
for(var i = 0; i < ds_list_size(_list); i++) {
var _keyframe = _list[| i];
var _time = _keyframe[| 0];
for(var i = 0; i < array_length(_data); i++) {
var _keyframe = _data[i];
var _time = _keyframe[0];
if(scale && _time <= 1)
_time = round(_time * (ANIMATOR.frames_total - 1));
var value = ds_list_get(_keyframe, 1);
var ease_in = array_create_from_list(ds_list_get(_keyframe, 2));
var ease_out = array_create_from_list(ds_list_get(_keyframe, 3));
var value = _keyframe[1];
var ease_in = _keyframe[2];
var ease_out = _keyframe[3];
var ease_in_type = _keyframe[4];
var ease_out_type = _keyframe[5];
var ease_in_type = ds_list_get(_keyframe, 4, CURVE_TYPE.bezier);
var ease_out_type = ds_list_get(_keyframe, 5, CURVE_TYPE.bezier);
var _val = value;
if(prop.type == VALUE_TYPE.struct)
_val = json_parse(value);
else if(prop.type == VALUE_TYPE.path && prop.display_type == VALUE_DISPLAY.path_array) {
for(var j = 0; j < ds_list_size(value); j++)
_val[j] = value[| j];
for(var j = 0; j < array_length(value); j++)
_val[j] = value[j];
} else if(prop.type == VALUE_TYPE.gradient) {
var grad = new gradientObject();
_val = grad.deserialize(value);
} else if(!sep_axis && typeArray(prop.display_type)) {
_val = [];
if(ds_exists(value, ds_type_list)) {
for(var j = 0; j < ds_list_size(value); j++)
_val[j] = processValue(value[| j]);
}
if(is_array(value))
for(var j = 0; j < array_length(value); j++)
_val[j] = processValue(value[j]);
}
//print($"Deserialize {prop.node.name}:{prop.name} = {_val} ");

View file

@ -43,7 +43,7 @@ function Node_Local_Analyze(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr
static process_data = function(_outSurf, _data, _output_index, _array_index) {
var _alg = _data[1];
var _siz = _data[2];
var _sam = ds_map_try_get(attributes, "oversample");
var _sam = struct_try_get(attributes, "oversample");
var _shp = _data[4];
surface_set_target(_outSurf);

View file

@ -236,12 +236,9 @@ function Node_Lua_Compute(_x, _y, _group = noone) : Node(_x, _y, _group) constru
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
if(LOADING_VERSION < 1380 && !CLONING)
ds_list_insert(_inputs, 4, noone);
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}

View file

@ -234,12 +234,9 @@ function Node_Lua_Surface(_x, _y, _group = noone) : Node(_x, _y, _group) constru
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
if(LOADING_VERSION < 1380 && !CLONING)
ds_list_insert(_inputs, 4, noone);
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}

View file

@ -48,7 +48,7 @@ function Node_Noise_Hex(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
var _pos = _data[2];
var _sca = _data[3];
var _sam = _data[4];
var _samTyp = ds_map_try_get(attributes, "oversample");
var _samTyp = struct_try_get(attributes, "oversample");
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth());

View file

@ -48,7 +48,7 @@ function Node_Noise_Tri(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
var _pos = _data[2];
var _sca = _data[3];
var _sam = _data[4];
var _samTyp = ds_map_try_get(attributes, "oversample");
var _samTyp = struct_try_get(attributes, "oversample");
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth());

View file

@ -66,7 +66,7 @@ function Node_Outline(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
var alpha = _data[4];
var side = _data[5];
var aa = _data[6];
var sam = ds_map_try_get(attributes, "oversample");
var sam = struct_try_get(attributes, "oversample");
var bst = _data[8];
surface_set_target(_outSurf);

View file

@ -307,7 +307,7 @@ function Node_Palette_Extract(_x, _y, _group = noone) : Node(_x, _y, _group) con
static onValueFromUpdate = function() { extractPalettes(); }
function update() {
if(attributes[? "auto_exe"])
if(attributes.auto_exe)
extractPalettes();
}

View file

@ -87,7 +87,7 @@ function Node_Particle(_x, _y, _group = noone) : Node_VFX_Spawner_Base(_x, _y, _
var surf_w = surface_get_width(_outSurf);
var surf_h = surface_get_height(_outSurf);
for(var i = 0; i < attributes[? "part_amount"]; i++)
for(var i = 0; i < attributes.part_amount; i++)
parts[i].draw(_exact, surf_w, surf_h);
BLEND_NORMAL;

View file

@ -1,3 +1,14 @@
enum _ANCHOR {
x,
y,
c1x,
c1y,
c2x,
c2y,
ind,
}
function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "Path";
previewable = false;
@ -28,7 +39,7 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
function createAnchor(_x, _y, _dxx = 0, _dxy = 0, _dyx = 0, _dyy = 0) {
var index = ds_list_size(inputs);
inputs[| index] = nodeValue("Anchor", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ _x, _y, _dxx, _dxy, _dyx, _dyy ])
inputs[| index] = nodeValue("Anchor", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ _x, _y, _dxx, _dxy, _dyx, _dyy, false ])
.setDisplay(VALUE_DISPLAY.vector);
recordAction(ACTION_TYPE.var_modify, self, [ array_clone(input_display_list), "input_display_list" ]);
@ -73,12 +84,11 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
drag_point_sy = 0;
transform_type = 0;
transform_minx = 0;
transform_miny = 0;
transform_maxx = 0;
transform_maxy = 0;
transform_mx = 0;
transform_my = 0;
transform_minx = 0; transform_miny = 0;
transform_maxx = 0; transform_maxy = 0;
transform_cx = 0; transform_cy = 0;
transform_sx = 0; transform_sy = 0;
transform_mx = 0; transform_my = 0;
static onValueUpdate = function(index = 0) {
if(index == 2) {
@ -97,29 +107,33 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
var _edited = false;
if(transform_type > 0) {
var dx = _mx - transform_mx;
var dy = _my - transform_my;
var _transform_minx = transform_minx;
var _transform_miny = transform_miny;
var _transform_maxx = transform_maxx;
var _transform_maxy = transform_maxy;
if(transform_type == 1) {
transform_minx += dx / _s;
transform_miny += dy / _s;
} else if(transform_type == 2) {
transform_maxx += dx / _s;
transform_miny += dy / _s;
} else if(transform_type == 3) {
transform_minx += dx / _s;
transform_maxy += dy / _s;
} else if(transform_type == 4) {
transform_maxx += dx / _s;
transform_maxy += dy / _s;
if(transform_type == 5) { #region move
var mx = _mx, my = _my;
if(key_mod_press(SHIFT)) {
var dirr = point_direction(transform_sx, transform_sy, _mx, _my) + 360;
var diss = point_distance( transform_sx, transform_sy, _mx, _my);
var ang = round((dirr) / 45) * 45;
mx = transform_sx + lengthdir_x(diss, ang);
my = transform_sy + lengthdir_y(diss, ang);
}
if(transform_type == 5) {
//var _tsx = transform_sx;
//var _tsy = transform_sy;
//draw_set_color(COLORS._main_accent);
//draw_line(_tsx, _tsy, _tsx + lengthdir_x(1000, 0), _tsy + lengthdir_y(1000, 0));
//draw_line(_tsx, _tsy, _tsx + lengthdir_x(1000, 90), _tsy + lengthdir_y(1000, 90));
//draw_line(_tsx, _tsy, _tsx + lengthdir_x(1000, 180), _tsy + lengthdir_y(1000, 180));
//draw_line(_tsx, _tsy, _tsx + lengthdir_x(1000, 270), _tsy + lengthdir_y(1000, 270));
var dx = mx - transform_mx;
var dy = my - transform_my;
for( var i = input_fix_len; i < ds_list_size(inputs); i++ ) {
var p = inputs[| i].getValue();
@ -129,24 +143,124 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
if(inputs[| i].setValue(p))
_edited = true;
}
} else {
transform_mx = mx;
transform_my = my;
#endregion
} else { #region scale
var mx = (_mx - _x) / _s;
var my = (_my - _y) / _s;
switch(transform_type) {
case 1 :
if(key_mod_press(SHIFT)) {
var _dx = mx - _transform_maxx;
var _dy = my - _transform_maxy;
var _dd = max(abs(_dx), abs(_dy));
mx = _transform_maxx + _dd * sign(_dx);
my = _transform_maxy + _dd * sign(_dy);
}
transform_minx = mx;
transform_miny = my;
if(key_mod_press(ALT)) {
transform_maxx = transform_cx - (mx - transform_cx);
transform_maxy = transform_cy - (my - transform_cy);
}
break;
case 2 :
if(key_mod_press(SHIFT)) {
var _dx = mx - _transform_minx;
var _dy = my - _transform_maxy;
var _dd = max(abs(_dx), abs(_dy));
mx = _transform_minx + _dd * sign(_dx);
my = _transform_maxy + _dd * sign(_dy);
}
transform_maxx = mx;
transform_miny = my;
if(key_mod_press(ALT)) {
transform_minx = transform_cx - (mx - transform_cx);
transform_maxy = transform_cy - (my - transform_cy);
}
break;
case 3 :
if(key_mod_press(SHIFT)) {
var _dx = mx - _transform_maxx;
var _dy = my - _transform_miny;
var _dd = max(abs(_dx), abs(_dy));
mx = _transform_maxx + _dd * sign(_dx);
my = _transform_miny + _dd * sign(_dy);
}
transform_minx = mx;
transform_maxy = my;
if(key_mod_press(ALT)) {
transform_maxx = transform_cx - (mx - transform_cx);
transform_miny = transform_cy - (my - transform_cy);
}
break;
case 4 :
if(key_mod_press(SHIFT)) {
var _dx = mx - _transform_minx;
var _dy = my - _transform_miny;
var _dd = max(abs(_dx), abs(_dy));
mx = _transform_minx + _dd * sign(_dx);
my = _transform_miny + _dd * sign(_dy);
}
transform_maxx = mx;
transform_maxy = my;
if(key_mod_press(ALT)) {
transform_minx = transform_cx - (mx - transform_cx);
transform_miny = transform_cy - (my - transform_cy);
}
break;
}
var tr_rx = transform_maxx - transform_minx;
var tr_ry = transform_maxy - transform_miny;
var _tr_rx = _transform_maxx - _transform_minx;
var _tr_ry = _transform_maxy - _transform_miny;
for( var i = input_fix_len; i < ds_list_size(inputs); i++ ) {
var p = inputs[| i].getValue();
p[0] = transform_minx + (p[0] - _transform_minx) / (_transform_maxx - _transform_minx) * (transform_maxx - transform_minx);
p[1] = transform_miny + (p[1] - _transform_miny) / (_transform_maxy - _transform_miny) * (transform_maxy - transform_miny);
var _p2 = p[_ANCHOR.x] + p[_ANCHOR.c1x];
var _p3 = p[_ANCHOR.y] + p[_ANCHOR.c1y];
var _p4 = p[_ANCHOR.x] + p[_ANCHOR.c2x];
var _p5 = p[_ANCHOR.y] + p[_ANCHOR.c2y];
p[_ANCHOR.x] = transform_minx + (p[_ANCHOR.x] - _transform_minx) / _tr_rx * tr_rx;
p[_ANCHOR.y] = transform_miny + (p[_ANCHOR.y] - _transform_miny) / _tr_ry * tr_ry;
_p2 = transform_minx + (_p2 - _transform_minx) / _tr_rx * tr_rx;
_p3 = transform_miny + (_p3 - _transform_miny) / _tr_ry * tr_ry;
_p4 = transform_minx + (_p4 - _transform_minx) / _tr_rx * tr_rx;
_p5 = transform_miny + (_p5 - _transform_miny) / _tr_ry * tr_ry;
p[_ANCHOR.c1x] = _p2 - p[_ANCHOR.x];
p[_ANCHOR.c1y] = _p3 - p[_ANCHOR.y];
p[_ANCHOR.c2x] = _p4 - p[_ANCHOR.x];
p[_ANCHOR.c2y] = _p5 - p[_ANCHOR.y];
if(inputs[| i].setValue(p))
_edited = true;
}
#endregion
}
if(_edited)
UNDO_HOLDING = true;
transform_mx = _mx;
transform_my = _my;
if(mouse_release(mb_left)) {
transform_type = 0;
UPDATE |= RENDER_TYPE.full;
@ -156,58 +270,62 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
var dx = value_snap(drag_point_sx + (_mx - drag_point_mx) / _s, _snx);
var dy = value_snap(drag_point_sy + (_my - drag_point_my) / _s, _sny);
if(drag_type < 2) {
if(drag_type < 2) { #region move points
var inp = inputs[| input_fix_len + drag_point];
var anc = inp.getValue();
if(drag_type != 0 && SHIFT == KEYBOARD_STATUS.down)
anc[_ANCHOR.ind] = !anc[_ANCHOR.ind];
if(drag_type == 0) { //drag anchor point
anc[0] = dx;
anc[1] = dy;
anc[_ANCHOR.x] = dx;
anc[_ANCHOR.y] = dy;
if(key_mod_press(CTRL)) {
anc[0] = round(anc[0]);
anc[1] = round(anc[1]);
anc[_ANCHOR.x] = round(anc[0]);
anc[_ANCHOR.y] = round(anc[1]);
}
} else if(drag_type == 1) { //drag control 1
anc[2] = dx - anc[0];
anc[3] = dy - anc[1];
anc[_ANCHOR.c1x] = dx - anc[_ANCHOR.x];
anc[_ANCHOR.c1y] = dy - anc[_ANCHOR.y];
if(!key_mod_press(SHIFT)) {
anc[4] = -anc[2];
anc[5] = -anc[3];
if(!anc[_ANCHOR.ind]) {
anc[_ANCHOR.c2x] = -anc[_ANCHOR.c1x];
anc[_ANCHOR.c2y] = -anc[_ANCHOR.c1y];
}
if(key_mod_press(CTRL)) {
anc[2] = round(anc[2]);
anc[3] = round(anc[3]);
anc[_ANCHOR.c1x] = round(anc[_ANCHOR.c1x]);
anc[_ANCHOR.c1y] = round(anc[_ANCHOR.c1y]);
if(key_mod_press(SHIFT)) {
anc[4] = round(anc[4]);
anc[5] = round(anc[5]);
if(!anc[_ANCHOR.ind]) {
anc[_ANCHOR.c2x] = round(anc[_ANCHOR.c2x]);
anc[_ANCHOR.c2y] = round(anc[_ANCHOR.c2y]);
}
}
} else if(drag_type == -1) { //drag control 2
anc[4] = dx - anc[0];
anc[5] = dy - anc[1];
anc[_ANCHOR.c2x] = dx - anc[_ANCHOR.x];
anc[_ANCHOR.c2y] = dy - anc[_ANCHOR.y];
if(!key_mod_press(SHIFT)) {
anc[2] = -anc[4];
anc[3] = -anc[5];
if(!anc[_ANCHOR.ind]) {
anc[_ANCHOR.c1x] = -anc[4];
anc[_ANCHOR.c1y] = -anc[5];
}
if(key_mod_press(CTRL)) {
anc[2] = round(anc[2]);
anc[3] = round(anc[3]);
anc[_ANCHOR.c2x] = round(anc[_ANCHOR.c2x]);
anc[_ANCHOR.c2y] = round(anc[_ANCHOR.c2y]);
if(!key_mod_press(SHIFT)) {
anc[4] = round(anc[4]);
anc[5] = round(anc[5]);
if(!anc[_ANCHOR.ind]) {
anc[_ANCHOR.c1x] = round(anc[_ANCHOR.c1x]);
anc[_ANCHOR.c1y] = round(anc[_ANCHOR.c1y]);
}
}
}
if(inp.setValue(anc))
_edited = true;
} else if(drag_type == 2) { //pen tools
#endregion
} else if(drag_type == 2) { #region pen tools
var ox, oy, nx, ny;
var pxx = (_mx - _x) / _s;
var pxy = (_my - _y) / _s;
@ -215,11 +333,10 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
draw_set_color(COLORS._main_accent);
for( var i = 0; i < array_length(drag_points); i++ ) {
var _p = drag_points[i];
nx = _x + _p[0] * _s;
ny = _y + _p[1] * _s;
nx = _x + _p[_ANCHOR.x] * _s;
ny = _y + _p[_ANCHOR.y] * _s;
if(i)
draw_line(ox, oy, nx, ny);
if(i) draw_line(ox, oy, nx, ny);
ox = nx;
oy = ny;
@ -282,12 +399,12 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
var _p0 = drag_points[points[i - 1]];
var _p1 = drag_points[points[i + 1]];
var d0 = point_direction(_p0[0], _p0[1], _p[0], _p[1]);
var d1 = point_direction(_p[0], _p[1], _p1[0], _p1[1]);
var d0 = point_direction(_p0[_ANCHOR.x], _p0[_ANCHOR.y], _p[_ANCHOR.x], _p[_ANCHOR.y]);
var d1 = point_direction( _p[_ANCHOR.x], _p[_ANCHOR.y], _p1[_ANCHOR.x], _p1[_ANCHOR.y]);
var dd = d0 + angle_difference(d1, d0) / 2;
var ds0 = point_distance(_p0[0], _p0[1], _p[0], _p[1]);
var ds1 = point_distance(_p[0], _p[1], _p1[0], _p1[1]);
var ds0 = point_distance(_p0[_ANCHOR.x], _p0[_ANCHOR.y], _p[_ANCHOR.x], _p[_ANCHOR.y]);
var ds1 = point_distance( _p[_ANCHOR.x], _p[_ANCHOR.y], _p1[_ANCHOR.x], _p1[_ANCHOR.y]);
dxx = lengthdir_x(ds0 / 3, dd + 180);
dxy = lengthdir_y(ds0 / 3, dd + 180);
@ -295,9 +412,9 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
dyy = lengthdir_y(ds1 / 3, dd);
}
anc = [_p[0], _p[1], dxx, dxy, dyx, dyy];
anc = [_p[_ANCHOR.x], _p[_ANCHOR.y], dxx, dxy, dyx, dyy];
if(input_fix_len + i >= ds_list_size(inputs))
createAnchor(_p[0], _p[1], dxx, dxy, dyx, dyy);
createAnchor(_p[_ANCHOR.x], _p[_ANCHOR.y], dxx, dxy, dyx, dyy);
else
inputs[| input_fix_len + i].setValue(anc);
}
@ -307,7 +424,8 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
inputs[| input_fix_len + i].setValue(anc);
}
}
} else if(drag_type == 3) {
#endregion
} else if(drag_type == 3) { #region draw rectangle
var minx = min((_mx - _x) / _s, (drag_point_mx - _x) / _s);
var maxx = max((_mx - _x) / _s, (drag_point_mx - _x) / _s);
var miny = min((_my - _y) / _s, (drag_point_my - _y) / _s);
@ -328,23 +446,24 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
for( var i = 0; i < 4; i++ )
a[i] = inputs[| input_fix_len + i].getValue();
a[0][0] = minx;
a[0][1] = miny;
a[0][_ANCHOR.x] = minx;
a[0][_ANCHOR.y] = miny;
a[1][0] = maxx;
a[1][1] = miny;
a[1][_ANCHOR.x] = maxx;
a[1][_ANCHOR.y] = miny;
a[2][0] = maxx;
a[2][1] = maxy;
a[2][_ANCHOR.x] = maxx;
a[2][_ANCHOR.y] = maxy;
a[3][0] = minx;
a[3][1] = maxy;
a[3][_ANCHOR.x] = minx;
a[3][_ANCHOR.y] = maxy;
for( var i = 0; i < 4; i++ ) {
if(inputs[| input_fix_len + i].setValue(a[i]))
_edited = true;
}
} else if(drag_type == 4) {
#endregion
} else if(drag_type == 4) { #region draw circle
var minx = min((_mx - _x) / _s, (drag_point_mx - _x) / _s);
var maxx = max((_mx - _x) / _s, (drag_point_mx - _x) / _s);
var miny = min((_my - _y) / _s, (drag_point_my - _y) / _s);
@ -365,38 +484,39 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
for( var i = 0; i < 4; i++ )
a[i] = inputs[| input_fix_len + i].getValue();
a[0][0] = (minx + maxx) / 2;
a[0][1] = miny;
a[0][2] = -(maxx - minx) * 0.27614;
a[0][3] = 0;
a[0][4] = (maxx - minx) * 0.27614;
a[0][5] = 0;
a[0][_ANCHOR.x ] = (minx + maxx) / 2;
a[0][_ANCHOR.y ] = miny;
a[0][_ANCHOR.c1x] = -(maxx - minx) * 0.27614;
a[0][_ANCHOR.c1y] = 0;
a[0][_ANCHOR.c2x] = (maxx - minx) * 0.27614;
a[0][_ANCHOR.c2y] = 0;
a[1][0] = maxx;
a[1][1] = (miny + maxy) / 2;
a[1][2] = 0;
a[1][3] = -(maxy - miny) * 0.27614;
a[1][4] = 0;
a[1][5] = (maxy - miny) * 0.27614;
a[1][_ANCHOR.x ] = maxx;
a[1][_ANCHOR.y ] = (miny + maxy) / 2;
a[1][_ANCHOR.c1x] = 0;
a[1][_ANCHOR.c1y] = -(maxy - miny) * 0.27614;
a[1][_ANCHOR.c2x] = 0;
a[1][_ANCHOR.c2y] = (maxy - miny) * 0.27614;
a[2][0] = (minx + maxx) / 2;
a[2][1] = maxy;
a[2][2] = (maxx - minx) * 0.27614;
a[2][3] = 0;
a[2][4] = -(maxx - minx) * 0.27614;
a[2][5] = 0;
a[2][_ANCHOR.x ] = (minx + maxx) / 2;
a[2][_ANCHOR.y ] = maxy;
a[2][_ANCHOR.c1x] = (maxx - minx) * 0.27614;
a[2][_ANCHOR.c1y] = 0;
a[2][_ANCHOR.c2x] = -(maxx - minx) * 0.27614;
a[2][_ANCHOR.c2y] = 0;
a[3][0] = minx;
a[3][1] = (miny + maxy) / 2;
a[3][2] = 0;
a[3][3] = (maxy - miny) * 0.27614;
a[3][4] = 0;
a[3][5] = -(maxy - miny) * 0.27614;
a[3][_ANCHOR.x ] = minx;
a[3][_ANCHOR.y ] = (miny + maxy) / 2;
a[3][_ANCHOR.c1x] = 0;
a[3][_ANCHOR.c1y] = (maxy - miny) * 0.27614;
a[3][_ANCHOR.c2x] = 0;
a[3][_ANCHOR.c2y] = -(maxy - miny) * 0.27614;
for( var i = 0; i < 4; i++ ) {
if(inputs[| input_fix_len + i].setValue(a[i]))
_edited = true;
}
#endregion
}
if(_edited) UNDO_HOLDING = true;
@ -408,13 +528,13 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
}
}
#region draw control anchor
#region check line hover
var line_hover = -1;
var points = [];
var _a0, _a1;
var minx = 99999, miny = 99999;
var maxx = 0 , maxy = 0;
var maxx = -99999, maxy = -99999;
for(var i = loop? 0 : 1; i < ansize; i++) {
if(i) {
@ -429,12 +549,16 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
for(var j = 0; j < sample; j++) {
if(array_length(_a0) < 6) continue;
p = eval_bezier(j / (sample - 1), _a0[0], _a0[1], _a1[0], _a1[1], _a0[0] + _a0[4], _a0[1] + _a0[5], _a1[0] + _a1[2], _a1[1] + _a1[3]);
p = eval_bezier(j / (sample - 1), _a0[_ANCHOR.x], _a0[_ANCHOR.y],
_a1[_ANCHOR.x], _a1[_ANCHOR.y],
_a0[_ANCHOR.x] + _a0[_ANCHOR.c2x], _a0[_ANCHOR.y] + _a0[_ANCHOR.c2y],
_a1[_ANCHOR.x] + _a1[_ANCHOR.c1x], _a1[_ANCHOR.y] + _a1[_ANCHOR.c1y]);
_nx = _x + p[0] * _s;
_ny = _y + p[1] * _s;
minx = min(minx, _nx); miny = min(miny, _ny);
maxx = max(maxx, _nx); maxy = max(maxy, _ny);
array_push(pnt, [ _nx, _ny ]);
if(j && (key_mod_press(CTRL) || isUsingTool(1)) && distance_to_line(_mx, _my, _ox, _oy, _nx, _ny) < 4)
@ -447,13 +571,13 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
array_push(points, pnt);
}
#endregion
#region draw path
draw_set_color(isUsingTool(0)? c_white : COLORS._main_accent);
var ind = 0;
for(var i = loop? 0 : 1; i < ansize; i++) {
for(var j = 0; j < sample; j++) {
_nx = points[ind][j][0];
_ny = points[ind][j][1];
_nx = points[ind][j][_ANCHOR.x];
_ny = points[ind][j][_ANCHOR.y];
if(j) draw_line_width(_ox, _oy, _nx, _ny, 1 + 2 * (line_hover == i));
@ -511,8 +635,9 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
hover_type = -1;
}
}
#endregion
if(isUsingTool(0)) { //transform tools
if(isUsingTool(0)) { #region transform tools
var hov = 0;
if(point_in_circle(_mx, _my, minx, miny, 8)) hov = 1;
else if(point_in_circle(_mx, _my, maxx, miny, 8)) hov = 2;
@ -530,14 +655,16 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
if(hov && mouse_press(mb_left, active)) {
transform_type = hov;
transform_minx = (minx - _x) / _s;
transform_maxx = (maxx - _x) / _s;
transform_miny = (miny - _y) / _s;
transform_maxy = (maxy - _y) / _s;
transform_mx = _mx;
transform_my = _my;
transform_minx = (minx - _x) / _s; transform_maxx = (maxx - _x) / _s;
transform_miny = (miny - _y) / _s; transform_maxy = (maxy - _y) / _s;
transform_mx = _mx; transform_my = _my;
transform_sx = _mx; transform_sy = _my;
transform_cx = (transform_minx + transform_maxx) / 2;
transform_cy = (transform_miny + transform_maxy) / 2;
}
} else if(isUsingTool(3)) { //pen tools
#endregion
} else if(isUsingTool(3)) { #region pen tools
draw_sprite_ui_uniform(THEME.path_tools_draw, 0, _mx + 16, _my + 16);
if(mouse_press(mb_left, active)) {
@ -554,7 +681,8 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
drag_point_mx = (_mx - _x) / _s;
drag_point_my = (_my - _y) / _s;
}
} else if(isUsingTool(4) || isUsingTool(5)) { //shape tools
#endregion
} else if(isUsingTool(4) || isUsingTool(5)) { #region shape tools
draw_sprite_ui_uniform(THEME.cursor_path_add, 0, _mx + 16, _my + 16);
if(mouse_press(mb_left, active)) {
@ -571,9 +699,10 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
repeat(4)
createAnchor(value_snap((_mx - _x) / _s, _snx), value_snap((_my - _y) / _s, _sny));
}
} else if(anchor_hover != -1) { //no tool, dragging existing point
#endregion
} else if(anchor_hover != -1) { #region no tool, dragging existing point
var _a = inputs[| input_fix_len + anchor_hover].getValue();
if(isUsingTool(2)) {
if(isUsingTool(2) && hover_type == 0) {
draw_sprite_ui_uniform(THEME.cursor_path_anchor, 0, _mx + 16, _my + 16);
if(mouse_press(mb_left, active)) {
@ -582,12 +711,14 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
_a[3] = 0;
_a[4] = 0;
_a[5] = 0;
_a[6] = false;
inputs[| input_fix_len + anchor_hover].setValue(_a);
} else {
_a[2] = -8;
_a[3] = 0;
_a[4] = 8;
_a[5] = 0;
_a[6] = false;
drag_point = anchor_hover;
drag_type = 1;
@ -612,6 +743,11 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
draw_sprite_ui_uniform(THEME.cursor_path_move, 0, _mx + 16, _my + 16);
if(mouse_press(mb_left, active)) {
if(isUsingTool(2)) {
_a[_ANCHOR.ind] = true;
inputs[| input_fix_len + anchor_hover].setValue(_a);
}
drag_point = anchor_hover;
drag_type = hover_type;
drag_point_mx = _mx;
@ -628,7 +764,8 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
}
}
}
} else if(key_mod_press(CTRL) || isUsingTool(1)) { //anchor edit
#endregion
} else if(key_mod_press(CTRL) || isUsingTool(1)) { #region anchor edit
draw_sprite_ui_uniform(THEME.cursor_path_add, 0, _mx + 16, _my + 16);
if(mouse_press(mb_left, active)) {
@ -651,6 +788,7 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
UPDATE |= RENDER_TYPE.full;
}
#endregion
}
}
@ -832,12 +970,9 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
if(LOADING_VERSION < 1380 && !CLONING)
ds_list_insert(_inputs, 3, noone);
for(var i = input_fix_len; i < ds_list_size(_inputs); i++)
for(var i = input_fix_len; i < array_length(_inputs); i++)
createAnchor(0, 0);
}
}

View file

@ -133,9 +133,9 @@ function Node_Path_Array(_x, _y, _group = noone) : Node(_x, _y, _group) construc
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}

View file

@ -286,9 +286,9 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node(_x, _y, _group) const
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}
}

View file

@ -8,7 +8,7 @@ enum ARRAY_PROCESS {
#macro PROCESSOR_OVERLAY_CHECK if(array_length(current_data) != ds_list_size(inputs)) return;
function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
attributes[? "array_process"] = ARRAY_PROCESS.loop;
attributes.array_process = ARRAY_PROCESS.loop;
current_data = [];
inputs_data = [];
@ -23,7 +23,7 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct
array_push(attributeEditors, [ "Array process type", "array_process",
new scrollBox([ "Loop", "Hold", "Expand", "Expand inverse" ],
function(val) {
attributes[? "array_process"] = val;
attributes.array_process = val;
triggerRender();
}, false) ]);
@ -36,7 +36,7 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct
if(!_n.isArray()) return _in;
switch(attributes[? "array_process"]) {
switch(attributes.array_process) {
case ARRAY_PROCESS.loop : _index = safe_mod(_arr, array_length(_in)); break;
case ARRAY_PROCESS.hold : _index = min(_arr, array_length(_in) - 1); break;
case ARRAY_PROCESS.expand : _index = floor(_arr / process_length[_index][1]) % process_length[_index][0]; break;
@ -131,7 +131,7 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct
continue;
}
var _index = 0;
switch(attributes[? "array_process"]) {
switch(attributes.array_process) {
case ARRAY_PROCESS.loop : _index = safe_mod(l, array_length(_in)); break;
case ARRAY_PROCESS.hold : _index = min(l, array_length(_in) - 1); break;
case ARRAY_PROCESS.expand : _index = floor(l / process_length[i][1]) % process_length[i][0]; break;
@ -184,7 +184,7 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct
inputs_data[i] = val;
switch(attributes[? "array_process"]) {
switch(attributes.array_process) {
case ARRAY_PROCESS.loop :
case ARRAY_PROCESS.hold :
process_amount = max(process_amount, amo);
@ -218,10 +218,10 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct
}
static processSerialize = function(_map) {
_map[? "array_process"] = attributes[? "array_process"];
_map.array_process = attributes.array_process;
}
static processDeserialize = function() {
attributes[? "array_process"] = ds_map_try_get(load_map, "array_process", ARRAY_PROCESS.loop);
attributes.array_process = struct_try_get(load_map, "array_process", ARRAY_PROCESS.loop);
}
}

View file

@ -605,18 +605,12 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor {
#region node function
function nodeLoad(_data, scale = false, _group = PANEL_GRAPH.getCurrentContext()) {
if(!ds_exists(_data, ds_type_map)) return noone;
var _x = ds_map_try_get(_data, "x", 0);
var _y = ds_map_try_get(_data, "y", 0);
var _type = ds_map_try_get(_data, "type", 0);
var _x = _data.x;
var _y = _data.y;
var _type = _data.type;
var _node = nodeBuild(_type, _x, _y, _group);
if(_node) {
var map = ds_map_clone(_data);
_node.deserialize(map, scale);
}
if(_node) _node.deserialize(_data, scale);
return _node;
}
@ -767,44 +761,44 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor {
function attribute_surface_depth(label = true) {
depth_array = inputs[| 0].type == VALUE_TYPE.surface? global.SURFACE_FORMAT_NAME_PROCESS : global.SURFACE_FORMAT_NAME;
attributes[? "color_depth"] = array_find(depth_array, "8 bit RGBA");
attributes.color_depth = array_find(depth_array, "8 bit RGBA");
if(label) array_push(attributeEditors, "Surface");
array_push(attributeEditors, ["Color depth", "color_depth",
new scrollBox(depth_array, function(val) {
attributes[? "color_depth"] = val;
attributes.color_depth = val;
triggerRender();
}, false)]);
}
function attribute_interpolation(label = false) {
attributes[? "interpolation"] = 0;
attributes.interpolation = 0;
if(label) array_push(attributeEditors, "Surface");
array_push(attributeEditors, ["Texture interpolation", "interpolation",
new scrollBox(global.SURFACE_INTERPOLATION, function(val) {
attributes[? "interpolation"] = val;
attributes.interpolation = val;
triggerRender();
}, false)]);
}
function attribute_oversample(label = false) {
attributes[? "oversample"] = 0;
attributes.oversample = 0;
if(label) array_push(attributeEditors, "Surface");
array_push(attributeEditors, ["Oversample", "oversample",
new scrollBox(global.SURFACE_OVERSAMPLE, function(val) {
attributes[? "oversample"] = val;
attributes.oversample = val;
triggerRender();
}, false)]);
}
function attribute_auto_execute(label = false) {
attributes[? "auto_exe"] = false;
attributes.auto_exe = false;
if(label) array_push(attributeEditors, "Node");
array_push(attributeEditors, ["Auto execute", "auto_exe",
new checkBox(function() {
attributes[? "auto_exe"] = !attributes[? "auto_exe"];
attributes.auto_exe = !attributes.auto_exe;
})]);
}
#endregion

View file

@ -8,7 +8,7 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr
min_h = 96;
object = [];
attributes[? "mesh"] = [];
attributes.mesh = [];
inputs[| 0] = nodeValue("Affect by force", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true)
.rejectArray();
@ -62,12 +62,12 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr
];
static newMesh = function(index) {
var mesh = ds_map_try_get(attributes, "mesh", []);
var mesh = struct_try_get(attributes, "mesh", []);
mesh[index] = [ [ 0, 0],
[32, 0],
[32, 32],
[ 0, 32] ];
attributes[? "mesh"] = mesh;
attributes.mesh = mesh;
}
newMesh(0);
@ -90,7 +90,7 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr
var _shp = inputs[| 5].getValue();
var _box = inputs[| 7].getValue();
var meshes = attributes[? "mesh"];
var meshes = attributes.mesh;
if(preview_index >= array_length(meshes)) return;
if(previewing == 0) {
@ -260,7 +260,7 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr
if(!is_surface(_tex)) return;
var meshes = attributes[? "mesh"];
var meshes = attributes.mesh;
var mesh = [];
var ww = surface_get_width(_tex);
@ -368,7 +368,7 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr
buffer_delete(surface_buffer);
meshes[index] = mesh;
attributes[? "mesh"] = meshes;
attributes.mesh = meshes;
}
static removeColinear = function(mesh) {
@ -541,7 +541,7 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr
physics_fixture_set_circle_shape(fixture, min(_spos[2], _spos[3]));
fixtureCreate(fixture, object);
} else if(_shp == 2) {
var meshes = attributes[? "mesh"];
var meshes = attributes.mesh;
if(array_safe_get(meshes, index, noone) == noone)
return noone;
@ -652,7 +652,7 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr
var _tex = inputs[| 6].getValue();
if(is_array(_tex)) {
var meshes = attributes[? "mesh"];
var meshes = attributes.mesh;
for( var i = array_length(meshes); i < array_length(_tex); i++ )
newMesh(i);
@ -687,16 +687,16 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr
}
static attributeSerialize = function() {
var att = ds_map_create();
var att = {};
var mesh = ds_map_try_get(attributes, "mesh", []);
att[? "mesh"] = json_stringify(mesh);
var mesh = struct_try_get(attributes, "mesh", []);
att.mesh = json_stringify(mesh);
return att;
}
static attributeDeserialize = function(attr) {
if(ds_map_exists(attr, "mesh"))
attributes[? "mesh"] = json_parse(attr[? "mesh"]);
if(struct_has(attr, "mesh"))
attributes.mesh = json_parse(attr.mesh);
}
}

View file

@ -119,9 +119,9 @@ function Node_Rigid_Render(_x, _y, _group = noone) : Node(_x, _y, _group) constr
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}
}

View file

@ -35,10 +35,10 @@ function Node_Seperate_Shape(_x, _y, _group = noone) : Node(_x, _y, _group) cons
surface_w = 1;
surface_h = 1;
attributes[? "max_shape"] = 32;
attributes.max_shape = 32;
array_push(attributeEditors, ["Maximum shapes", "max_shape",
new textBox(TEXTBOX_INPUT.number, function(val) {
attributes[? "max_shape"] = val;
attributes.max_shape = val;
triggerRender();
})]);
@ -53,7 +53,7 @@ function Node_Seperate_Shape(_x, _y, _group = noone) : Node(_x, _y, _group) cons
static onInspector1Update = function() { separateShape(); }
static update = function() {
if(attributes[? "auto_exe"])
if(attributes.auto_exe)
separateShape();
}
@ -111,16 +111,16 @@ function Node_Seperate_Shape(_x, _y, _group = noone) : Node(_x, _y, _group) cons
shader_reset();
var _pixel_surface = surface_create_valid(attributes[? "max_shape"], 1);
var _pixel_surface = surface_create_valid(attributes.max_shape, 1);
surface_set_target(_pixel_surface);
DRAW_CLEAR
BLEND_OVERRIDE;
shader_set(sh_seperate_shape_counter);
texture_set_stage(shader_get_sampler_index(sh_seperate_shape_counter, "surface"), surface_get_texture(temp_surface[res_index]));
shader_set_uniform_f_array_safe(shader_get_uniform(sh_seperate_shape_counter, "dimension"), [ ww, hh ]);
shader_set_uniform_i(shader_get_uniform(sh_seperate_shape_counter, "maxShape"), attributes[? "max_shape"]);
shader_set_uniform_i(shader_get_uniform(sh_seperate_shape_counter, "maxShape"), attributes.max_shape);
shader_set_uniform_i(shader_get_uniform(sh_seperate_shape_counter, "ignore"), _ignore);
draw_sprite_ext(s_fx_pixel, 0, 0, 0, attributes[? "max_shape"], 1, 0, c_white, 1);
draw_sprite_ext(s_fx_pixel, 0, 0, 0, attributes.max_shape, 1, 0, c_white, 1);
shader_reset();
BLEND_NORMAL;
surface_reset_target();

View file

@ -2,16 +2,18 @@ function Node_Sequence_Anim(_x, _y, _group = noone) : Node(_x, _y, _group) const
name = "Array to Anim";
update_on_frame = true;
inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0)
.setArrayDepth(1);
inputs[| 1] = nodeValue("Speed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1)
.rejectArray();
inputs[| 2] = nodeValue("Sequence", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [])
.setVisible(true, true)
.setArrayDepth(1);
inputs[| 3] = nodeValue("Overflow", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Hold", "Loop", "Empty" ]);
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Hold", "Loop", "Ping Pong", "Empty" ]);
outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
@ -21,7 +23,13 @@ function Node_Sequence_Anim(_x, _y, _group = noone) : Node(_x, _y, _group) const
var _ord = inputs[| 2].getValue();
var _h = ui(64);
if(_hover && point_in_rectangle(_m[0], _m[1], _x, _y, _x + _w, _y + _h)) {
if(array_length(_ord) == 0) {
_ord = array_create(array_length(_seq));
for( var i = 0; i < array_length(_seq); i++ )
_ord[i] = i;
}
if(_hover && point_in_rectangle(_m[0], _m[1], _x, _y, _x + _w, _y + _h) && inputs[| 2].value_from == noone) {
draw_sprite_stretched(THEME.button, mouse_click(mb_left, _focus)? 2 : 1, _x, _y, _w, _h);
if(mouse_press(mb_left, _focus))
dialogPanelCall(new Panel_Array_Sequence(self));
@ -71,41 +79,50 @@ function Node_Sequence_Anim(_x, _y, _group = noone) : Node(_x, _y, _group) const
});
input_display_list = [ 0,
["Frames", false], sequence_renderer, 3,
["Frames", false], sequence_renderer, 2, 3,
["Animation", false], 1,
];
static update = function(frame = ANIMATOR.current_frame) {
var _seq = inputs[| 0].getValue();
var _spd = inputs[| 1].getValue();
var _ord = inputs[| 2].getValue();
var _ovf = inputs[| 3].getValue();
if(!is_array(_seq)) {
outputs[| 0].setValue(_seq);
var _sur = inputs[| 0].getValue();
if(!is_array(_sur)) {
outputs[| 0].setValue(_sur);
return;
}
var _spd = inputs[| 1].getValue();
var _seq = inputs[| 2].getValue();
var _ovf = inputs[| 3].getValue();
var frm = floor(ANIMATOR.current_frame / _spd);
var ind = frm;
if(array_length(_ord) > 0) {
if(array_length(_seq) == 0) {
_seq = array_create(array_length(_sur));
for( var i = 0; i < array_length(_sur); i++ )
_seq[i] = i;
}
if(_ovf == 0)
ind = clamp(ind, 0, array_length(_ord) - 1);
else if(_ovf == 2 && ind >= array_length(_ord)) {
ind = clamp(ind, 0, array_length(_seq) - 1);
else if(_ovf == 2) {
var _slen = array_length(_seq);
var _slpp = _slen * 2 - 2;
ind = abs(ind % _slpp);
if(ind >= _slen)
ind = _slpp - ind;
} else if(_ovf == 3 && ind >= array_length(_seq)) {
outputs[| 0].setValue(noone);
return;
}
ind = array_safe_get(_ord, ind,, ARRAY_OVERFLOW.loop);
} else
ind = safe_mod(floor(ANIMATOR.current_frame / _spd), array_length(_seq));
ind = array_safe_get(_seq, ind,, ARRAY_OVERFLOW.loop);
if(ind == noone) {
outputs[| 0].setValue(noone);
return;
}
outputs[| 0].setValue(array_safe_get(_seq, ind));
outputs[| 0].setValue(array_safe_get(_sur, ind));
}
}

View file

@ -61,7 +61,7 @@ function Node_Skew(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
var _amou = _data[2];
//var _wrap = _data[3];
var _cent = _data[4];
var _samp = ds_map_try_get(attributes, "oversample");
var _samp = struct_try_get(attributes, "oversample");
surface_set_shader(_outSurf, shader);
shader_set_interpolation(_data[0]);

View file

@ -144,9 +144,9 @@ function Node_Stack(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}
}

View file

@ -175,9 +175,9 @@ function Node_Statistic(_x, _y, _group = noone) : Node(_x, _y, _group) construct
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}

View file

@ -46,8 +46,8 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const
inputs[| 15] = nodeValue("Bake hair", self, JUNCTION_CONNECT.input, VALUE_TYPE.trigger, 0, "Prevent strand reseting to apply manual modification. Unbaking will remove all changes.")
.setDisplay(VALUE_DISPLAY.button, [ function() {
attributes[? "use_groom"] = !attributes[? "use_groom"];
if(attributes[? "use_groom"])
attributes.use_groom = !attributes.use_groom;
if(attributes.use_groom)
groomed = strands.clone();
strandUpdate(true);
}, "Bake" ]);
@ -66,7 +66,7 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const
["Preview", true], 16,
];
attributes[? "use_groom"] = false;
attributes.use_groom = false;
groomed = new StrandMesh();
strands = new StrandMesh();
@ -118,10 +118,10 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) {
var _typ = inputs[| 0].getValue();
var _pre = inputs[| 16].getValue();
if(!attributes[? "use_groom"])
if(!attributes.use_groom)
strands.draw(_x, _y, _s, _pre);
tools = attributes[? "use_groom"]? groomTools : -1;
tools = attributes.use_groom? groomTools : -1;
if(_typ == 0) {
if(tool_dragging == noone)
@ -154,7 +154,7 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const
_msh.draw(_x, _y, _s);
}
if(!attributes[? "use_groom"]) return;
if(!attributes.use_groom) return;
groomed.draw(_x, _y, _s, _pre, true);
var __mx = (_mx - _x) / _s;
@ -428,8 +428,8 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const
inputs[| 13].setVisible(_typ == 2, _typ == 2);
inputs[| 14].setVisible(_typ != 2);
inputs[| 15].editWidget.text = attributes[? "use_groom"]? "Unbake" : "Bake";
inputs[| 15].editWidget.blend = attributes[? "use_groom"]? COLORS._main_value_negative : COLORS._main_value_positive;
inputs[| 15].editWidget.text = attributes.use_groom? "Unbake" : "Bake";
inputs[| 15].editWidget.blend = attributes.use_groom? COLORS._main_value_negative : COLORS._main_value_positive;
}
static strandUpdate = function(willReset = false) {
@ -452,7 +452,7 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const
var sx, sy, prog, dir;
if(willReset) {
if(attributes[? "use_groom"]) {
if(attributes.use_groom) {
strands = groomed.clone();
outputs[| 0].setValue(strands);
return;
@ -543,16 +543,16 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const
}
static attributeSerialize = function() {
var att = ds_map_create();
att[? "use_groom"] = attributes[? "use_groom"];
att[? "fixStrand"] = groomed.serialize();
var att = {};
att.use_groom = attributes.use_groom;
att.fixStrand = groomed.serialize();
return att;
}
static attributeDeserialize = function(attr) {
if(ds_map_exists(attr, "fixStrand"))
groomed.deserialize(attr[? "fixStrand"]);
if(struct_has(attr, "fixStrand"))
groomed.deserialize(attr.fixStrand);
attributes[? "use_groom"] = ds_map_try_get(attr, "use_groom", false);
attributes.use_groom = struct_try_get(attr, "use_groom", false);
}
}

View file

@ -68,8 +68,9 @@ function Node_Struct(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
for(var i = input_fix_len; i < ds_list_size(inputs) - data_length; i += data_length) {
var key = inputs[| i + 0].getValue();
var val = inputs[| i + 1].getValue();
var frm = inputs[| i + 1].value_from;
if(inputs[| i + 1].type == VALUE_TYPE.surface)
if(frm != noone && frm.type == VALUE_TYPE.surface)
str[$ key] = new Surface(val);
else
str[$ key] = val;
@ -93,9 +94,9 @@ function Node_Struct(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}

View file

@ -127,9 +127,9 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < array_length(_inputs); i += data_length)
createNewInput();
}

View file

@ -31,7 +31,8 @@ function Node_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
inputs[| 6] = nodeValue("Scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 7] = nodeValue("Tile", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false, "Repeat the surface to fill the screen.");
inputs[| 7] = nodeValue("Render Mode", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_button, [ "Normal", "Tile", "Wrap" ]);
inputs[| 8] = nodeValue("Rotate by velocity", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0, "Make the surface rotates to follow its movement.")
.setDisplay(VALUE_DISPLAY.slider, [0, 1, 0.01]);
@ -140,7 +141,7 @@ function Node_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
var rot = _data[5] + rot_vel;
var sca = _data[6];
var wrp = _data[7];
var mode = _data[7];
var cDep = attrDepth();
@ -180,7 +181,7 @@ function Node_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
pos = point_rotate(pos[0], pos[1], pos[0] + anc[0], pos[1] + anc[1], rot);
if(wrp) {
if(mode == 1) {
var _w = _ww * sqrt(2);
var _h = _hh * sqrt(2);
var _px = (_w - _ww) / 2;
@ -226,6 +227,19 @@ function Node_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
surface_set_shader(_outSurf);
shader_set_interpolation(ins);
draw_surface_ext_safe(ins, draw_x, draw_y, sca[0], sca[1], rot, c_white, 1);
if(mode == 2) {
draw_surface_ext_safe(ins, draw_x - _ww, draw_y - _hh, sca[0], sca[1], rot, c_white, 1);
draw_surface_ext_safe(ins, draw_x, draw_y - _hh, sca[0], sca[1], rot, c_white, 1);
draw_surface_ext_safe(ins, draw_x + _ww, draw_y - _hh, sca[0], sca[1], rot, c_white, 1);
draw_surface_ext_safe(ins, draw_x - _ww, draw_y, sca[0], sca[1], rot, c_white, 1);
draw_surface_ext_safe(ins, draw_x + _ww, draw_y, sca[0], sca[1], rot, c_white, 1);
draw_surface_ext_safe(ins, draw_x - _ww, draw_y + _hh, sca[0], sca[1], rot, c_white, 1);
draw_surface_ext_safe(ins, draw_x, draw_y + _hh, sca[0], sca[1], rot, c_white, 1);
draw_surface_ext_safe(ins, draw_x + _ww, draw_y + _hh, sca[0], sca[1], rot, c_white, 1);
}
surface_reset_shader();
}

View file

@ -18,7 +18,7 @@ function Node_Trigger(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
insp2UpdateTooltip = "Trigger";
insp2UpdateIcon = [ THEME.sequence_control, 1, COLORS._main_value_positive ];
doTrigger = false;
doTrigger = 0;
static onInspector2Update = function() {
inputs[| 0].setAnim(true);
@ -26,16 +26,18 @@ function Node_Trigger(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
}
function step() {
if(doTrigger) {
if(doTrigger == 1) {
outputs[| 0].setValue(true);
doTrigger = false;
} else
doTrigger = -1;
} else if(doTrigger == -1) {
outputs[| 0].setValue(false);
doTrigger = 0;
}
}
function update() {
var trg = inputs[| 0].getValue();
if(trg) doTrigger = true;
if(trg) doTrigger = 1;
}
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {

View file

@ -16,29 +16,30 @@ function Node_Trigger_Bool(_x, _y, _group = noone) : Node(_x, _y, _group) constr
prevVal = false;
preview = false;
doTrigger = 0;
function step() {
if(doTrigger == 1) {
outputs[| 0].setValue(true);
doTrigger = -1;
} else if(doTrigger == -1) {
outputs[| 0].setValue(false);
doTrigger = 0;
}
}
function update() {
var val = inputs[| 0].getValue();
var con = inputs[| 1].getValue();
switch(con) {
case 0 :
outputs[| 0].setValue(val);
preview = val;
break;
case 1 :
outputs[| 0].setValue(!prevVal && val);
preview = !prevVal && val;
break;
case 2 :
outputs[| 0].setValue( prevVal && !val);
preview = prevVal && !val;
break;
case 3 :
outputs[| 0].setValue( prevVal != val);
preview = prevVal != val;
break;
case 0 : doTrigger = val; break;
case 1 : doTrigger = !prevVal && val; break;
case 2 : doTrigger = prevVal && !val; break;
case 3 : doTrigger = prevVal != val; break;
}
preview = doTrigger;
prevVal = val;
}

View file

@ -54,7 +54,7 @@ function Node_Twirl(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con
var center = _data[1];
var stren = _data[2];
var rad = _data[3];
var sam = ds_map_try_get(attributes, "oversample");
var sam = struct_try_get(attributes, "oversample");
surface_set_shader(_outSurf, shader);
shader_set_interpolation(_data[0]);

View file

@ -352,7 +352,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
type = _type;
forward = true;
_initName = _name;
name = __txt_junction_name(instanceof(node), type, index, _name);
name = _name;
internalName = string_replace_all(_name, " ", "_");
if(struct_has(node, "inputMap")) {
@ -386,7 +388,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
def_val = _value;
on_end = KEYFRAME_END.hold;
unit = new nodeValueUnit(self);
extra_data = ds_list_create();
extra_data = [];
dyna_depo = ds_list_create();
draw_line_shift_x = 0;
@ -667,7 +669,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
for( var i = 0; i < array_length(animators); i++ )
animators[i].suffix = " " + array_safe_get(global.displaySuffix_Area, i, "");
extra_data[| 0] = AREA_MODE.area;
extra_data[0] = AREA_MODE.area;
extract_node = "Node_Area";
break;
case VALUE_DISPLAY.padding :
@ -925,7 +927,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
}
if(display_type == VALUE_DISPLAY.area) {
var dispType = ds_list_get(nodeFrom.extra_data, 0);
var dispType = nodeFrom.extra_data[0];
var surfGet = nodeFrom.display_data;
if(!applyUnit || surfGet == -1) return value;
@ -986,6 +988,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
}
static getValue = function(_time = ANIMATOR.current_frame, applyUnit = true, arrIndex = 0, useCache = true) {
if(type == VALUE_TYPE.trigger)
useCache = false;
if(useCache) {
var cache_hit = cache_value[0];
cache_hit &= cache_value[1] == _time;
@ -1070,6 +1075,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
static getValueRecursive = function(_time = ANIMATOR.current_frame) {
var val = [ -1, self ];
if(type == VALUE_TYPE.trigger && connect_type == JUNCTION_CONNECT.output) //trigger even will not propagate from input to output, need to be done manually
return [ __getAnimValue(_time), self ];
if(value_from == noone) {
var _val = __getAnimValue(_time);
val = [ _val, self ];
@ -1593,32 +1601,31 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
}
static serialize = function(scale = false, preset = false) {
var _map = ds_map_create();
var _map = {};
_map[? "visible"] = visible;
_map.visible = visible;
if(connect_type == JUNCTION_CONNECT.output)
return _map;
_map[? "on end"] = on_end;
_map[? "unit"] = unit.mode;
_map[? "sep_axis"] = sep_axis;
_map[? "shift x"] = draw_line_shift_x;
_map[? "shift y"] = draw_line_shift_y;
_map[? "from node"] = !preset && value_from? value_from.node.node_id : -1;
_map[? "from index"] = !preset && value_from? value_from.index : -1;
_map[? "global_use"] = expUse;
_map[? "global_key"] = expression;
_map[? "anim"] = is_anim;
_map.on_end = on_end;
_map.unit = unit.mode;
_map.sep_axis = sep_axis;
_map.shift_x = draw_line_shift_x;
_map.shift_y = draw_line_shift_y;
_map.from_node = !preset && value_from? value_from.node.node_id : -1;
_map.from_index = !preset && value_from? value_from.index : -1;
_map.global_use = expUse;
_map.global_key = expression;
_map.anim = is_anim;
ds_map_add_list(_map, "raw value", animator.serialize(scale));
_map.raw_value = animator.serialize(scale);
var _anims = ds_list_create();
var _anims = [];
for( var i = 0; i < array_length(animators); i++ )
ds_list_add_list(_anims, animators[i].serialize(scale));
ds_map_add_list(_map, "animators", _anims);
ds_map_add_list(_map, "data", ds_list_clone(extra_data));
array_push(_anims, animators[i].serialize(scale));
_map.animators = _anims;
_map.data = extra_data;
return _map;
}
@ -1630,38 +1637,38 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
if(_map == undefined) return;
if(_map == noone) return;
visible = ds_map_try_get(_map, "visible", visible);
visible = _map.visible;
if(connect_type == JUNCTION_CONNECT.output)
return;
//printIf(TESTING, " |- Applying deserialize to junction " + name + " of node " + node.name);
on_end = ds_map_try_get(_map, "on end", on_end);
unit.mode = ds_map_try_get(_map, "unit", VALUE_UNIT.constant);
expUse = ds_map_try_get(_map, "global_use");
expression = ds_map_try_get(_map, "global_key");
on_end = struct_try_get(_map, "on_end");
unit.mode = struct_try_get(_map, "unit");
expUse = struct_try_get(_map, "global_use");
expression = struct_try_get(_map, "global_key");
expTree = evaluateFunctionTree(expression);
sep_axis = ds_map_try_get(_map, "sep_axis");
is_anim = ds_map_try_get(_map, "anim");
sep_axis = struct_try_get(_map, "sep_axis");
is_anim = struct_try_get(_map, "anim");
draw_line_shift_x = ds_map_try_get(_map, "shift x");
draw_line_shift_y = ds_map_try_get(_map, "shift y");
draw_line_shift_x = struct_try_get(_map, "shift_x");
draw_line_shift_y = struct_try_get(_map, "shift_y");
animator.deserialize(_map[? "raw value"], scale);
animator.deserialize(struct_try_get(_map, "raw_value"), scale);
if(ds_map_exists(_map, "animators")) {
var anims = _map[? "animators"];
for( var i = 0; i < ds_list_size(anims); i++ )
animators[i].deserialize(anims[| i], scale);
if(struct_has(_map, "animators")) {
var anims = _map.animators;
for( var i = 0; i < array_length(anims); i++ )
animators[i].deserialize(anims[i], scale);
}
if(!preset) {
con_node = _map[? "from node"];
con_index = _map[? "from index"];
con_node = struct_try_get(_map, "from_node", -1);
con_index = struct_try_get(_map, "from_index", -1);
}
if(ds_map_exists(_map, "data"))
ds_list_copy(extra_data, _map[? "data"]);
if(struct_has(_map, "data"))
extra_data = _map.data;
if(APPENDING) def_val = getValue(0);
@ -1680,8 +1687,8 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
}
if(!ds_map_exists(NODE_MAP, _node)) {
var txt = "Node connect error : Node ID " + string(_node) + " not found.";
log_warning("LOAD", "[Connect] " + txt, node);
var txt = $"Node connect error : Node ID {_node} not found.";
log_warning("LOAD", $"[Connect] {txt}", node);
return false;
}
@ -1689,17 +1696,17 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
var _ol = ds_list_size(_nd.outputs);
if(log)
log_warning("LOAD", "[Connect] Reconnecting " + string(node.name) + " to " + _nd.name, node);
log_warning("LOAD", $"[Connect] Reconnecting {node.name} to {_nd.name}", node);
if(con_index < _ol) {
if(setFrom(_nd.outputs[| con_index], false))
return true;
log_warning("LOAD", "[Connect] Connection conflict " + string(node.name) + " to " + string(_nd.name) + " : Connection failed.", node);
log_warning("LOAD", $"[Connect] Connection conflict {node.name} to {_nd.name} : Connection failed.", node);
return false;
}
log_warning("LOAD", "[Connect] Connection conflict " + string(node.name) + " to " + string(_nd.name) + " : Node not exist.", node);
log_warning("LOAD", $"[Connect] Connection conflict {node.name} to {_nd.name} : Node not exist.", node);
return false;
}
@ -1712,7 +1719,6 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
static cleanUp = function() {
ds_list_destroy(value_to);
ds_list_destroy(extra_data);
animator.cleanUp();
delete animator;
}

View file

@ -74,19 +74,19 @@ function Node_WAV_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
wav_file_prg = 0;
wav_file_lim = 1;
attributes[? "preview_shift"] = 0;
attributes[? "preview_gain"] = 0.5;
attributes.preview_shift = 0;
attributes.preview_gain = 0.5;
array_push(attributeEditors, "Audio Preview");
array_push(attributeEditors, ["Gain", "preview_gain",
new textBox(TEXTBOX_INPUT.number, function(val) {
attributes[? "preview_gain"] = val;
attributes.preview_gain = val;
})]);
array_push(attributeEditors, ["Shift", "preview_shift",
new textBox(TEXTBOX_INPUT.number, function(val) {
attributes[? "preview_shift"] = val;
attributes.preview_shift = val;
})]);
on_dragdrop_file = function(path) {
@ -184,7 +184,7 @@ function Node_WAV_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
insp2UpdateTooltip = __txtx("play_with_timeline", "Play with timeline");
insp2UpdateIcon = [ THEME.play_sound, 1, COLORS._main_icon_light ];
attributes[? "play"] = true;
attributes.play = true;
static onInspector1Update = function() {
var path = inputs[| 0].getValue();
@ -194,7 +194,7 @@ function Node_WAV_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
}
static onInspector2Update = function() {
attributes[? "play"] = !attributes[? "play"];
attributes.play = !attributes.play;
}
static step = function() {
@ -206,21 +206,21 @@ function Node_WAV_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
UPDATE |= RENDER_TYPE.full;
}
insp2UpdateIcon[1] = attributes[? "play"];
insp2UpdateIcon[2] = attributes[? "play"]? COLORS._main_icon_light : COLORS._main_icon;
insp2UpdateIcon[1] = attributes.play;
insp2UpdateIcon[2] = attributes.play? COLORS._main_icon_light : COLORS._main_icon;
if(preview_audio == -1) return;
if(audio_is_playing(preview_audio) && !ANIMATOR.is_playing)
audio_stop_sound(preview_audio);
if(!attributes[? "play"]) return;
if(!attributes.play) return;
if(ANIMATOR.is_playing) {
if(ANIMATOR.current_frame == 0)
audio_stop_sound(preview_audio);
var dur = ANIMATOR.current_frame / ANIMATOR.framerate - attributes[? "preview_shift"];
var dur = ANIMATOR.current_frame / ANIMATOR.framerate - attributes.preview_shift;
if(!audio_is_playing(preview_audio))
audio_play_sound(preview_audio, 1, false, attributes[? "preview_gain"], dur);
audio_play_sound(preview_audio, 1, false, attributes.preview_gain, dur);
else if(ANIMATOR.frame_progress)
audio_sound_set_track_position(preview_audio, dur);
}
@ -277,7 +277,7 @@ function Node_WAV_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
draw_surface_part_ext_safe(audio_surface, 0, 0, min(wd, sw), sh,
bbox.xc - sw * ss / 2,
bbox.yc - sh * ss / 2,
ss, ss,, attributes[? "play"]? COLORS._main_accent : c_white);
ss, ss,, attributes.play? COLORS._main_accent : c_white);
}
var str = filename_name(path_current);

View file

@ -43,7 +43,7 @@ function Node_Websocket_Receiver(_x, _y, _group = noone) : Node(_x, _y, _group)
setPort(_port);
}
network_trigger = false;
network_trigger = 0;
function asyncPackets(_async_load) {
var _active = inputs[| 1].getValue();
if(!_active) return;
@ -72,11 +72,13 @@ function Node_Websocket_Receiver(_x, _y, _group = noone) : Node(_x, _y, _group)
}
static step = function() {
if(network_trigger) {
if(network_trigger == 1) {
outputs[| 1].setValue(1);
network_trigger = false;
} else
network_trigger = -1;
} else if(network_trigger == -1) {
outputs[| 1].setValue(0);
network_trigger = 0;
}
}
static update = function(frame = ANIMATOR.current_frame) {

View file

@ -57,10 +57,10 @@ function Node_Mesh_Warp(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
array_push(attributeEditors, "Warp");
attributes[? "iteration"] = 4;
attributes.iteration = 4;
array_push(attributeEditors, ["Iteration", "iteration",
new textBox(TEXTBOX_INPUT.number, function(val) {
attributes[? "iteration"] = val;
attributes.iteration = val;
triggerRender();
})]);
@ -438,7 +438,7 @@ function Node_Mesh_Warp(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
}
}
var it = attributes[? "iteration"];
var it = attributes.iteration;
var _rat = 1 / it;
repeat(it) {
@ -487,34 +487,33 @@ function Node_Mesh_Warp(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
var _inputs = load_map.inputs;
for(var i = control_index; i < ds_list_size(_inputs); i++) {
for(var i = control_index; i < array_length(_inputs); i++) {
var inp = createControl();
print(instanceof(inp))
inp.applyDeserialize(_inputs[| i]);
inp.applyDeserialize(_inputs[i]);
}
}
static attributeSerialize = function() {
var att = ds_map_create();
var att = {};
var pinList = ds_list_create();
var pinList = [];
for( var j = 0; j < array_length(data.points); j++ )
for( var k = 0; k < array_length(data.points[j]); k++ ) {
var p = data.points[j][k];
if(p == 0) continue;
if(p.pin) ds_list_add(pinList, p.index);
if(p.pin) array_push(pinList, p.index);
}
ds_map_add_list(att, "pin", pinList);
att.pin = pinList;
return att;
}
loadPin = noone;
static attributeDeserialize = function(attr) {
if(ds_map_exists(attr, "pin"))
loadPin = attr[? "pin"];
if(struct_has(attr, "pin"))
loadPin = attr.pin;
}
static postConnect = function() {

View file

@ -1,6 +1,6 @@
function Panel_Array_Sequence(node) : PanelContent() constructor {
self.node = node;
title = __txt("Array Sequence");
title = __txt("Frame Sequence Editor");
w = ui(640);
h = ui(168);
@ -105,11 +105,19 @@ function Panel_Array_Sequence(node) : PanelContent() constructor {
draw_set_alpha(1);
draw_set_text(f_p2, fa_center, fa_top, COLORS._main_text_sub);
draw_text_add(_sx + _ns / 2, ui(0), i);
draw_text_add(_sx + _ns / 2, ui(0), i + 1);
}
for( var i = 0; i < array_length(_ord); i++ ) {
var _i = _ord[i];
var __ord = _ord;
var _def = array_length(_ord) == 0;
if(_def) {
__ord = array_create(array_length(_seq));
for( var i = 0; i < array_length(_seq); i++ )
__ord[i] = i;
}
for( var i = 0; i < array_length(__ord); i++ ) {
var _i = __ord[i];
if(_i == noone) continue;
var _s = _seq[_i];
if(!is_surface(_s)) continue;
@ -122,9 +130,9 @@ function Panel_Array_Sequence(node) : PanelContent() constructor {
var _ssx = _sx + (_ns - _sw * _ss) / 2;
var _ssy = _sy + (_ns - _sh * _ss) / 2;
draw_surface_ext_safe(_s, _ssx, _ssy, _ss, _ss);
draw_surface_ext_safe(_s, _ssx, _ssy, _ss, _ss,,, _def? 0.5 : 1);
if(pHOVER && point_in_rectangle(msx, msy, _sx, _sy, _sx + _ns, _sy + _ns)) {
if(pHOVER && !_def && point_in_rectangle(msx, msy, _sx, _sy, _sx + _ns, _sy + _ns)) {
if(mouse_press(mb_left, pFOCUS)) {
_ord[i] = noone;
node.inputs[| 2].setValue(_ord);

View file

@ -27,7 +27,7 @@ function Panel(_parent, _x, _y, _w, _h) constructor {
split = "";
tab_width = 0;
tab_height = ui(20);
tab_height = ui(24);
tab_x = 0;
tab_x_to = 0;
tab_surface = noone;
@ -450,13 +450,15 @@ function Panel(_parent, _x, _y, _w, _h) constructor {
checkHover();
}
tab_cover = noone;
function drawTab() {
tab_surface = surface_verify(tab_surface, w - padding * 2 + 1, tab_height + ui(4));
var tsx = x + padding - 1;
var tsy = y;
var tsy = y + ui(2);
var msx = mouse_x - tsx;
var msy = mouse_y - tsy;
tab_cover = noone;
surface_set_target(tab_surface);
DRAW_CLEAR
@ -490,16 +492,19 @@ function Panel(_parent, _x, _y, _w, _h) constructor {
content[i].tab_x = lerp_float(content[i].tab_x, tbx, 5);
var _tbx = content[i].tab_x;
var _hov = point_in_rectangle(msx, msy, _tbx, tby, _tbx + tbw, tab_height);
var _tdh = tbh + THEME_VALUE.panel_tab_extend;
if(i == content_index) {
foc = FOCUS == self;
var cc = FOCUS == self? COLORS.panel_tab_active : COLORS.panel_tab;
draw_sprite_stretched_ext(THEME.ui_panel_tab, FOCUS == self, _tbx, tby, tbw, tbh, cc, 1);
var cc = FOCUS == self? COLORS._main_accent : COLORS.panel_tab;
draw_sprite_stretched_ext(THEME.ui_panel_tab, 1 + (FOCUS == self), _tbx, tby, tbw, _tdh, cc, 1);
if(!foc) tab_cover = BBOX().fromWH(tsx + _tbx, tsy + tby + tbh - ui(2), tbw, THEME_VALUE.panel_tab_extend);
} else {
draw_sprite_stretched_ext(THEME.ui_panel_tab, 0, _tbx, tby, tbw, tbh, COLORS.panel_tab_inactive, 1);
var cc = COLORS.panel_tab_inactive;
if(HOVER == self && _hov)
draw_sprite_stretched_ext(THEME.ui_panel_tab, 0, _tbx, tby, tbw, tbh, COLORS.panel_tab_hover, 1);
var cc = COLORS.panel_tab_hover;
draw_sprite_stretched_ext(THEME.ui_panel_tab, 0, _tbx, tby, tbw, _tdh, cc, 1);
}
if(HOVER == self && _hov) {
@ -516,7 +521,7 @@ function Panel(_parent, _x, _y, _w, _h) constructor {
if(mouse_press(mb_right, FOCUS == self)) {
var menu = array_clone(border_rb_menu);
if(instanceof(content[i]) == "Panel_Menu")
array_remove(menu, 2, border_rb_close);
array_remove(menu, 2);
menuCall("panel_border_menu",,, menu);
}
@ -533,7 +538,7 @@ function Panel(_parent, _x, _y, _w, _h) constructor {
}
draw_set_text(f_p3, fa_left, fa_bottom, cc);
draw_text_add(_tbx + ui(8), tab_height - ui(2), txt);
draw_text_add(_tbx + ui(8), tab_height - ui(4), txt);
tbx += tbw + ui(2);
}
@ -553,7 +558,7 @@ function Panel(_parent, _x, _y, _w, _h) constructor {
var tbw = string_width(txt) + ui(16);
if(icn != noone) tbw += ui(16 + 4);
draw_sprite_stretched_ext(THEME.ui_panel_tab, FOCUS == self, _tbx, tby, tbw, tbh, COLORS.panel_tab_active, 1);
draw_sprite_stretched_ext(THEME.ui_panel_tab, 2, _tbx, tby, tbw, tbh, COLORS._main_accent, 1);
var cc = COLORS.panel_bg_clear_inner;
if(icn != noone) {
@ -561,7 +566,7 @@ function Panel(_parent, _x, _y, _w, _h) constructor {
_tbx += ui(20);
}
draw_set_text(f_p3, fa_left, fa_bottom, COLORS.panel_bg_clear_inner);
draw_text(_tbx + ui(8), tab_height - ui(2), txt);
draw_text_add(_tbx + ui(8), tab_height - ui(4), txt);
if(tab_hold_state == 0) {
if(point_distance(tab_holding_mx, tab_holding_my, msx, msy) > 8)
@ -633,7 +638,8 @@ function Panel(_parent, _x, _y, _w, _h) constructor {
surface_reset_target();
draw_surface_safe(content_surface, tx, ty);
draw_sprite_stretched(THEME.ui_panel_bg, 3, tx + padding, ty + padding, _tw, _th);
draw_sprite_stretched(THEME.ui_panel_fg, 0, tx + padding, ty + padding, _tw, _th);
draw_sprite_bbox(THEME.ui_panel_tab, 3, tab_cover);
if(FOCUS == self && parent != noone) {
draw_sprite_stretched_ext(THEME.ui_panel_active, 0, tx + padding, ty + padding, tw - padding * 2, th - padding * 2, COLORS._main_accent, 1);

View file

@ -175,7 +175,7 @@ function Panel_Graph() : PanelContent() constructor {
addHotkey("Graph", "Add node", "A", MOD_KEY.none, function() { PANEL_GRAPH.callAddDialog(); });
addHotkey("Graph", "Focus content", "F", MOD_KEY.none, function() { PANEL_GRAPH.fullView(); });
addHotkey("Graph", "Preview focusing node", "P", MOD_KEY.none, function() { PANEL_GRAPH.setCurrentPreview(); });
addHotkey("Graph", "Preview window", "P", MOD_KEY.ctrl, function() { PANEL_GRAPH.previewWindow(PANEL_GRAPH.node_focus); });
addHotkey("Graph", "Preview window", "P", MOD_KEY.ctrl, function() { create_preview_window(PANEL_GRAPH.node_focus); });
addHotkey("Graph", "Import image", "I", MOD_KEY.none, function() { nodeBuild("Node_Image", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); });
addHotkey("Graph", "Import image array", "I", MOD_KEY.shift, function() { nodeBuild("Node_Image_Sequence", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); });
addHotkey("Graph", "Add number", "1", MOD_KEY.none, function() { nodeBuild("Node_Number", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); });
@ -493,7 +493,7 @@ function Panel_Graph() : PanelContent() constructor {
}));
array_push(menu,
menuItem(__txtx("panel_graph_preview_window", "Send to preview window"), function() {
previewWindow(node_hover);
create_preview_window(node_hover);
}, noone, ["Graph", "Preview window"]));
array_push(menu,
menuItem(__txtx("panel_graph_inspector_panel", "Send to new inspector"), function() {
@ -910,11 +910,11 @@ function Panel_Graph() : PanelContent() constructor {
nodeArray[i] = nodes_select_list[| i];
}
var _map = ds_map_create();
var _node = ds_list_create();
var _map = {};
var _node = [];
for(var i = 0; i < array_length(nodeArray); i++)
SAVE_NODE(_node, nodeArray[i],,,, getCurrentContext());
ds_map_add_list(_map, "nodes", _node);
_map.nodes = _node;
APPENDING = true;
CLONING = true;
@ -922,8 +922,6 @@ function Panel_Graph() : PanelContent() constructor {
APPENDING = false;
CLONING = false;
ds_map_destroy(_map);
if(ds_list_size(_app) == 0) {
ds_list_destroy(_app);
return;
@ -984,20 +982,19 @@ function Panel_Graph() : PanelContent() constructor {
}
}
var _map = ds_map_create();
var _node = ds_list_create();
var _map = {};
var _node = [];
for(var i = 0; i < array_length(nodeArray); i++)
SAVE_NODE(_node, nodeArray[i],,,, getCurrentContext());
ds_map_add_list(_map, "nodes", _node);
_map.nodes = _node;
clipboard_set_text(json_encode_minify(_map));
ds_map_destroy(_map);
}
function doPaste() {
var txt = clipboard_get_text();
var _map = json_decode(txt);
if(_map != -1) {
var _map = json_try_parse(txt);
if(_map != noone) {
ds_map_clear(APPEND_MAP);
APPENDING = true;
CLONING = true;
@ -1005,7 +1002,6 @@ function Panel_Graph() : PanelContent() constructor {
APPENDING = false;
CLONING = false;
ds_map_destroy(_map);
if(_app == noone)
return;

Some files were not shown because too many files have changed in this diff Show more