1.16.7 init

This commit is contained in:
Tanasart 2024-03-02 16:08:44 +07:00
parent c011a22906
commit d0528c4c81
52 changed files with 906 additions and 140 deletions

View file

@ -1,6 +1,6 @@
{ {
"FolderOrderSettings": [ "FolderOrderSettings": [
{"name":"_extensions","order":16,"path":"folders/_extensions.yy",}, {"name":"_extensions","order":13,"path":"folders/_extensions.yy",},
{"name":"BBMOD","order":6,"path":"folders/_extensions/BBMOD.yy",}, {"name":"BBMOD","order":6,"path":"folders/_extensions/BBMOD.yy",},
{"name":"Math","order":1,"path":"folders/_extensions/BBMOD/Math.yy",}, {"name":"Math","order":1,"path":"folders/_extensions/BBMOD/Math.yy",},
{"name":"FireBase","order":10,"path":"folders/_extensions/FireBase.yy",}, {"name":"FireBase","order":10,"path":"folders/_extensions/FireBase.yy",},
@ -78,6 +78,7 @@
{"name":"nodes","order":32,"path":"folders/functions/nodes.yy",}, {"name":"nodes","order":32,"path":"folders/functions/nodes.yy",},
{"name":"packing","order":30,"path":"folders/functions/packing.yy",}, {"name":"packing","order":30,"path":"folders/functions/packing.yy",},
{"name":"PCX","order":11,"path":"folders/functions/PCX.yy",}, {"name":"PCX","order":11,"path":"folders/functions/PCX.yy",},
{"name":"pen input","order":46,"path":"folders/functions/pen input.yy",},
{"name":"physics","order":21,"path":"folders/functions/physics.yy",}, {"name":"physics","order":21,"path":"folders/functions/physics.yy",},
{"name":"project","order":37,"path":"folders/functions/project.yy",}, {"name":"project","order":37,"path":"folders/functions/project.yy",},
{"name":"shader","order":16,"path":"folders/functions/shader.yy",}, {"name":"shader","order":16,"path":"folders/functions/shader.yy",},
@ -209,6 +210,7 @@
{"name":"graph","order":1,"path":"folders/panels/graph.yy",}, {"name":"graph","order":1,"path":"folders/panels/graph.yy",},
{"name":"inspectors","order":2,"path":"folders/panels/inspectors.yy",}, {"name":"inspectors","order":2,"path":"folders/panels/inspectors.yy",},
{"name":"components","order":1,"path":"folders/panels/inspectors/components.yy",}, {"name":"components","order":1,"path":"folders/panels/inspectors/components.yy",},
{"name":"nodes","order":12,"path":"folders/panels/nodes.yy",},
{"name":"preview","order":3,"path":"folders/panels/preview.yy",}, {"name":"preview","order":3,"path":"folders/panels/preview.yy",},
{"name":"overlay","order":2,"path":"folders/panels/preview/overlay.yy",}, {"name":"overlay","order":2,"path":"folders/panels/preview/overlay.yy",},
{"name":"sprites","order":3,"path":"folders/panels/preview/sprites.yy",}, {"name":"sprites","order":3,"path":"folders/panels/preview/sprites.yy",},
@ -451,6 +453,7 @@
{"name":"sh_d3d_extrude_extends","order":26,"path":"shaders/sh_d3d_extrude_extends/sh_d3d_extrude_extends.yy",}, {"name":"sh_d3d_extrude_extends","order":26,"path":"shaders/sh_d3d_extrude_extends/sh_d3d_extrude_extends.yy",},
{"name":"scrollBox","order":13,"path":"scripts/scrollBox/scrollBox.yy",}, {"name":"scrollBox","order":13,"path":"scripts/scrollBox/scrollBox.yy",},
{"name":"o_dialog_exit","order":2,"path":"objects/o_dialog_exit/o_dialog_exit.yy",}, {"name":"o_dialog_exit","order":2,"path":"objects/o_dialog_exit/o_dialog_exit.yy",},
{"name":"s_node_vfx_triangulate","order":15,"path":"sprites/s_node_vfx_triangulate/s_node_vfx_triangulate.yy",},
{"name":"node_shape_polygon","order":6,"path":"scripts/node_shape_polygon/node_shape_polygon.yy",}, {"name":"node_shape_polygon","order":6,"path":"scripts/node_shape_polygon/node_shape_polygon.yy",},
{"name":"fd_rectangle_get_collision_mask_sprite","order":4,"path":"scripts/fd_rectangle_get_collision_mask_sprite/fd_rectangle_get_collision_mask_sprite.yy",}, {"name":"fd_rectangle_get_collision_mask_sprite","order":4,"path":"scripts/fd_rectangle_get_collision_mask_sprite/fd_rectangle_get_collision_mask_sprite.yy",},
{"name":"node_flip","order":13,"path":"scripts/node_flip/node_flip.yy",}, {"name":"node_flip","order":13,"path":"scripts/node_flip/node_flip.yy",},
@ -750,6 +753,7 @@
{"name":"node_iterator_each_inline_output","order":2,"path":"scripts/node_iterator_each_inline_output/node_iterator_each_inline_output.yy",}, {"name":"node_iterator_each_inline_output","order":2,"path":"scripts/node_iterator_each_inline_output/node_iterator_each_inline_output.yy",},
{"name":"sh_fd_advect_material_a_16_glsl","order":2,"path":"shaders/sh_fd_advect_material_a_16_glsl/sh_fd_advect_material_a_16_glsl.yy",}, {"name":"sh_fd_advect_material_a_16_glsl","order":2,"path":"shaders/sh_fd_advect_material_a_16_glsl/sh_fd_advect_material_a_16_glsl.yy",},
{"name":"distribution_function","order":12,"path":"scripts/distribution_function/distribution_function.yy",}, {"name":"distribution_function","order":12,"path":"scripts/distribution_function/distribution_function.yy",},
{"name":"TabletStuff","order":16,"path":"extensions/TabletStuff/TabletStuff.yy",},
{"name":"sh_blur_radial","order":9,"path":"shaders/sh_blur_radial/sh_blur_radial.yy",}, {"name":"sh_blur_radial","order":9,"path":"shaders/sh_blur_radial/sh_blur_radial.yy",},
{"name":"node_iterator_each_input","order":1,"path":"scripts/node_iterator_each_input/node_iterator_each_input.yy",}, {"name":"node_iterator_each_input","order":1,"path":"scripts/node_iterator_each_input/node_iterator_each_input.yy",},
{"name":"json_minify","order":6,"path":"scripts/json_minify/json_minify.yy",}, {"name":"json_minify","order":6,"path":"scripts/json_minify/json_minify.yy",},
@ -1671,6 +1675,7 @@
{"name":"d3d_gizmo_line_dashed","order":3,"path":"scripts/d3d_gizmo_line_dashed/d3d_gizmo_line_dashed.yy",}, {"name":"d3d_gizmo_line_dashed","order":3,"path":"scripts/d3d_gizmo_line_dashed/d3d_gizmo_line_dashed.yy",},
{"name":"s_node_3d_camera_set","order":24,"path":"sprites/s_node_3d_camera_set/s_node_3d_camera_set.yy",}, {"name":"s_node_3d_camera_set","order":24,"path":"sprites/s_node_3d_camera_set/s_node_3d_camera_set.yy",},
{"name":"s_node_trigger_bool","order":4,"path":"sprites/s_node_trigger_bool/s_node_trigger_bool.yy",}, {"name":"s_node_trigger_bool","order":4,"path":"sprites/s_node_trigger_bool/s_node_trigger_bool.yy",},
{"name":"node_VFX_triangulate","order":1,"path":"scripts/node_VFX_triangulate/node_VFX_triangulate.yy",},
{"name":"panel_color","order":1,"path":"scripts/panel_color/panel_color.yy",}, {"name":"panel_color","order":1,"path":"scripts/panel_color/panel_color.yy",},
{"name":"s_node_line","order":7,"path":"sprites/s_node_line/s_node_line.yy",}, {"name":"s_node_line","order":7,"path":"sprites/s_node_line/s_node_line.yy",},
{"name":"Obj_FirebaseREST_Listener_On_firestore_collection","order":2,"path":"objects/Obj_FirebaseREST_Listener_On_firestore_collection/Obj_FirebaseREST_Listener_On_firestore_collection.yy",}, {"name":"Obj_FirebaseREST_Listener_On_firestore_collection","order":2,"path":"objects/Obj_FirebaseREST_Listener_On_firestore_collection/Obj_FirebaseREST_Listener_On_firestore_collection.yy",},

View file

@ -101,6 +101,7 @@
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"nodes","folderPath":"folders/functions/nodes.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"nodes","folderPath":"folders/functions/nodes.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"packing","folderPath":"folders/functions/packing.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"packing","folderPath":"folders/functions/packing.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"PCX","folderPath":"folders/functions/PCX.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"PCX","folderPath":"folders/functions/PCX.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"pen input","folderPath":"folders/functions/pen input.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"physics","folderPath":"folders/functions/physics.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"physics","folderPath":"folders/functions/physics.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"project","folderPath":"folders/functions/project.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"project","folderPath":"folders/functions/project.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"shader","folderPath":"folders/functions/shader.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"shader","folderPath":"folders/functions/shader.yy",},
@ -240,6 +241,7 @@
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"graph","folderPath":"folders/panels/graph.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"graph","folderPath":"folders/panels/graph.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"inspectors","folderPath":"folders/panels/inspectors.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"inspectors","folderPath":"folders/panels/inspectors.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"components","folderPath":"folders/panels/inspectors/components.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"components","folderPath":"folders/panels/inspectors/components.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"nodes","folderPath":"folders/panels/nodes.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"preview","folderPath":"folders/panels/preview.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"preview","folderPath":"folders/panels/preview.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"overlay","folderPath":"folders/panels/preview/overlay.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"overlay","folderPath":"folders/panels/preview/overlay.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"sprites","folderPath":"folders/panels/preview/sprites.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"sprites","folderPath":"folders/panels/preview/sprites.yy",},
@ -667,6 +669,7 @@
{"id":{"name":"sh_d3d_extrude_extends","path":"shaders/sh_d3d_extrude_extends/sh_d3d_extrude_extends.yy",},}, {"id":{"name":"sh_d3d_extrude_extends","path":"shaders/sh_d3d_extrude_extends/sh_d3d_extrude_extends.yy",},},
{"id":{"name":"scrollBox","path":"scripts/scrollBox/scrollBox.yy",},}, {"id":{"name":"scrollBox","path":"scripts/scrollBox/scrollBox.yy",},},
{"id":{"name":"o_dialog_exit","path":"objects/o_dialog_exit/o_dialog_exit.yy",},}, {"id":{"name":"o_dialog_exit","path":"objects/o_dialog_exit/o_dialog_exit.yy",},},
{"id":{"name":"s_node_vfx_triangulate","path":"sprites/s_node_vfx_triangulate/s_node_vfx_triangulate.yy",},},
{"id":{"name":"node_shape_polygon","path":"scripts/node_shape_polygon/node_shape_polygon.yy",},}, {"id":{"name":"node_shape_polygon","path":"scripts/node_shape_polygon/node_shape_polygon.yy",},},
{"id":{"name":"fd_rectangle_get_collision_mask_sprite","path":"scripts/fd_rectangle_get_collision_mask_sprite/fd_rectangle_get_collision_mask_sprite.yy",},}, {"id":{"name":"fd_rectangle_get_collision_mask_sprite","path":"scripts/fd_rectangle_get_collision_mask_sprite/fd_rectangle_get_collision_mask_sprite.yy",},},
{"id":{"name":"node_flip","path":"scripts/node_flip/node_flip.yy",},}, {"id":{"name":"node_flip","path":"scripts/node_flip/node_flip.yy",},},
@ -1001,6 +1004,7 @@
{"id":{"name":"node_iterator_each_inline_output","path":"scripts/node_iterator_each_inline_output/node_iterator_each_inline_output.yy",},}, {"id":{"name":"node_iterator_each_inline_output","path":"scripts/node_iterator_each_inline_output/node_iterator_each_inline_output.yy",},},
{"id":{"name":"sh_fd_advect_material_a_16_glsl","path":"shaders/sh_fd_advect_material_a_16_glsl/sh_fd_advect_material_a_16_glsl.yy",},}, {"id":{"name":"sh_fd_advect_material_a_16_glsl","path":"shaders/sh_fd_advect_material_a_16_glsl/sh_fd_advect_material_a_16_glsl.yy",},},
{"id":{"name":"distribution_function","path":"scripts/distribution_function/distribution_function.yy",},}, {"id":{"name":"distribution_function","path":"scripts/distribution_function/distribution_function.yy",},},
{"id":{"name":"TabletStuff","path":"extensions/TabletStuff/TabletStuff.yy",},},
{"id":{"name":"sh_blur_radial","path":"shaders/sh_blur_radial/sh_blur_radial.yy",},}, {"id":{"name":"sh_blur_radial","path":"shaders/sh_blur_radial/sh_blur_radial.yy",},},
{"id":{"name":"node_blur","path":"scripts/node_blur/node_blur.yy",},}, {"id":{"name":"node_blur","path":"scripts/node_blur/node_blur.yy",},},
{"id":{"name":"node_iterator_each_input","path":"scripts/node_iterator_each_input/node_iterator_each_input.yy",},}, {"id":{"name":"node_iterator_each_input","path":"scripts/node_iterator_each_input/node_iterator_each_input.yy",},},
@ -1058,6 +1062,7 @@
{"id":{"name":"sh_draw_surface","path":"shaders/sh_draw_surface/sh_draw_surface.yy",},}, {"id":{"name":"sh_draw_surface","path":"shaders/sh_draw_surface/sh_draw_surface.yy",},},
{"id":{"name":"sh_warp_4points_pers","path":"shaders/sh_warp_4points_pers/sh_warp_4points_pers.yy",},}, {"id":{"name":"sh_warp_4points_pers","path":"shaders/sh_warp_4points_pers/sh_warp_4points_pers.yy",},},
{"id":{"name":"node_mirror","path":"scripts/node_mirror/node_mirror.yy",},}, {"id":{"name":"node_mirror","path":"scripts/node_mirror/node_mirror.yy",},},
{"id":{"name":"__initPen","path":"scripts/__initPen/__initPen.yy",},},
{"id":{"name":"node_corner","path":"scripts/node_corner/node_corner.yy",},}, {"id":{"name":"node_corner","path":"scripts/node_corner/node_corner.yy",},},
{"id":{"name":"node_3d_mesh_cylinder","path":"scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.yy",},}, {"id":{"name":"node_3d_mesh_cylinder","path":"scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.yy",},},
{"id":{"name":"__vertex_function","path":"scripts/__vertex_function/__vertex_function.yy",},}, {"id":{"name":"__vertex_function","path":"scripts/__vertex_function/__vertex_function.yy",},},
@ -2053,6 +2058,8 @@
{"id":{"name":"d3d_gizmo_line_dashed","path":"scripts/d3d_gizmo_line_dashed/d3d_gizmo_line_dashed.yy",},}, {"id":{"name":"d3d_gizmo_line_dashed","path":"scripts/d3d_gizmo_line_dashed/d3d_gizmo_line_dashed.yy",},},
{"id":{"name":"s_node_3d_camera_set","path":"sprites/s_node_3d_camera_set/s_node_3d_camera_set.yy",},}, {"id":{"name":"s_node_3d_camera_set","path":"sprites/s_node_3d_camera_set/s_node_3d_camera_set.yy",},},
{"id":{"name":"s_node_trigger_bool","path":"sprites/s_node_trigger_bool/s_node_trigger_bool.yy",},}, {"id":{"name":"s_node_trigger_bool","path":"sprites/s_node_trigger_bool/s_node_trigger_bool.yy",},},
{"id":{"name":"panel_node_canvas_pressure","path":"scripts/panel_node_canvas_pressure/panel_node_canvas_pressure.yy",},},
{"id":{"name":"node_VFX_triangulate","path":"scripts/node_VFX_triangulate/node_VFX_triangulate.yy",},},
{"id":{"name":"panel_color","path":"scripts/panel_color/panel_color.yy",},}, {"id":{"name":"panel_color","path":"scripts/panel_color/panel_color.yy",},},
{"id":{"name":"s_node_line","path":"sprites/s_node_line/s_node_line.yy",},}, {"id":{"name":"s_node_line","path":"sprites/s_node_line/s_node_line.yy",},},
{"id":{"name":"Obj_FirebaseREST_Listener_On_firestore_collection","path":"objects/Obj_FirebaseREST_Listener_On_firestore_collection/Obj_FirebaseREST_Listener_On_firestore_collection.yy",},}, {"id":{"name":"Obj_FirebaseREST_Listener_On_firestore_collection","path":"objects/Obj_FirebaseREST_Listener_On_firestore_collection/Obj_FirebaseREST_Listener_On_firestore_collection.yy",},},

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

View file

@ -30,5 +30,8 @@ event_inherited();
[vk_right, "Right"], [vk_right, "Right"],
]; ];
mouse_left = []; mouse_left = [];
mouse_right = [];
mouse_pos = [];
#endregion #endregion

View file

@ -26,16 +26,16 @@
var win_y = WIN_H; var win_y = WIN_H;
#region graph #region mouse graph
if(show_graph) { if(show_graph) {
win_y -= 64; win_y -= 128;
draw_set_color(c_black); draw_set_color(c_black);
draw_set_alpha(0.5); draw_set_alpha(0.5);
draw_rectangle(0, win_y, WIN_W, WIN_H, false); draw_rectangle(0, win_y, WIN_W, WIN_H, false);
draw_set_alpha(1); draw_set_alpha(1);
draw_set_color(c_white); draw_set_color(c_green);
var mlx = WIN_W - array_length(mouse_left); var mlx = WIN_W - array_length(mouse_left);
var ox, oy, nx, ny; var ox, oy, nx, ny;
@ -49,17 +49,48 @@
ox = nx; ox = nx;
oy = ny; oy = ny;
} }
draw_set_color(c_red);
var mlx = WIN_W - array_length(mouse_right);
var ox, oy, nx, ny;
for( var i = 0, n = array_length(mouse_right); i < n; i++ ) {
nx = mlx + i;
ny = WIN_H - 64 - 4 - mouse_right[i] * 24;
if(i)
draw_line(ox, oy, nx, ny);
ox = nx;
oy = ny;
}
for( var i = 1, n = array_length(mouse_pos); i < n; i++ )
draw_line(mouse_pos[i - 1][0], mouse_pos[i - 1][1], mouse_pos[i][0], mouse_pos[i][1]);
var mp = 0;
if(DOUBLE_CLICK) mp = 2;
else if(mouse_lpress(mb_left)) mp = 1.3;
else if(mouse_lrelease(mb_left)) mp = 1.3;
else if(mouse_lclick(mb_left)) mp = 1;
array_push(mouse_left, mp);
if(array_length(mouse_left) > WIN_W)
array_delete(mouse_left, 0, 1);
var mp = 0;
if(mouse_rpress(mb_right)) mp = 1.3;
else if(mouse_rrelease(mb_right)) mp = 1.3;
else if(mouse_rclick(mb_right)) mp = 1;
array_push(mouse_right, mp);
if(array_length(mouse_right) > WIN_W)
array_delete(mouse_right, 0, 1);
array_push(mouse_pos, [ mouse_mx, mouse_my ])
if(array_length(mouse_pos) > 1000)
array_delete(mouse_pos, 0, 1);
} }
var mp = 0;
if(DOUBLE_CLICK) mp = 2;
else if(mouse_press(mb_left)) mp = 1.2;
else if(mouse_release(mb_left)) mp = 1.2;
else if(mouse_click(mb_left)) mp = 1;
array_push(mouse_left, mp);
if(array_length(mouse_left) > WIN_W)
array_delete(mouse_left, 0, 1);
#endregion #endregion
#region mouse #region mouse
@ -95,7 +126,7 @@
draw_sprite_ext(s_key_display_mouse, 3, mxs, mys, 1, 1, 0, COLORS._main_accent, 1); draw_sprite_ext(s_key_display_mouse, 3, mxs, mys, 1, 1, 0, COLORS._main_accent, 1);
#endregion #endregion
if(alpha > 0) { if(alpha > 0) { #region
draw_set_text(_f_h5, fa_right, fa_bottom, COLORS._main_icon_dark); draw_set_text(_f_h5, fa_right, fa_bottom, COLORS._main_icon_dark);
var pd = ui(4); var pd = ui(4);
var ww = string_width(disp_text) + pd * 3; var ww = string_width(disp_text) + pd * 3;
@ -110,5 +141,5 @@
draw_set_alpha(alpha); draw_set_alpha(alpha);
draw_text(x1 - pd * 1.5, y1 - pd, disp_text); draw_text(x1 - pd * 1.5, y1 - pd, disp_text);
draw_set_alpha(1); draw_set_alpha(1);
} } #endregion
#endregion #endregion

View file

@ -88,6 +88,7 @@
if(!IS_CMD) { __initAddon(); log_message("SESSION", $"> init Addon | complete in {get_timer() - t}"); t = get_timer(); } if(!IS_CMD) { __initAddon(); log_message("SESSION", $"> init Addon | complete in {get_timer() - t}"); t = get_timer(); }
if(!IS_CMD) { __initPalette(); log_message("SESSION", $"> init Palette | complete in {get_timer() - t}"); t = get_timer(); } if(!IS_CMD) { __initPalette(); log_message("SESSION", $"> init Palette | complete in {get_timer() - t}"); t = get_timer(); }
if(!IS_CMD) { __initGradient(); log_message("SESSION", $"> init Gradient | complete in {get_timer() - t}"); t = get_timer(); } if(!IS_CMD) { __initGradient(); log_message("SESSION", $"> init Gradient | complete in {get_timer() - t}"); t = get_timer(); }
if(!IS_CMD) { __initPen(); log_message("SESSION", $"> init Pen | complete in {get_timer() - t}"); t = get_timer(); }
if(!IS_CMD) { loadAddon(); log_message("SESSION", $"> init Addons | complete in {get_timer() - t}"); t = get_timer(); } if(!IS_CMD) { loadAddon(); log_message("SESSION", $"> init Addons | complete in {get_timer() - t}"); t = get_timer(); }

View file

@ -0,0 +1,42 @@
/// @description Pen tablet event
var e; e = tabletstuff_get_event_data();
if (!ds_map_exists(e, "pointer_info_pen")) exit;
PEN_USE = true;
/*
See:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-pointer_pen_info
for flags and constants in the fields.
*/
var f = e[? "pointer_info_flags"];
var pp = e[? "pointer_info_pen_pressure"];
var pr = e[? "pointer_info_pen_rotation"];
var px = e[? "pointer_info_pixel_location_x"] - window_get_x();
var py = e[? "pointer_info_pixel_location_y"] - window_get_y();
var pb = e[? "pointer_info_button_change_type"];
var tx = e[? "pointer_info_pen_tilt_x"];
var ty = e[? "pointer_info_pen_tilt_y"];
PEN_X = px;
PEN_Y = py;
PEN_PRESSURE = pp;
var contact = bool(f & 0x4);
if(PEN_CONTACT && !contact)
PEN_RELEASED = true;
PEN_CONTACT = contact;
var b1 = bool(f & 0x10); // POINTER_FLAG_FIRSTBUTTON
var b2 = bool(f & 0x20); // POINTER_FLAG_SECONDBUTTON
if(!PEN_RIGHT_CLICK && b2) PEN_RIGHT_PRESS = true;
if(PEN_RIGHT_CLICK && !b2) PEN_RIGHT_RELEASE = true;
PEN_RIGHT_CLICK = b2;
//print($"{PEN_RIGHT_CLICK} | {PEN_RIGHT_PRESS}, {PEN_RIGHT_RELEASE}");

View file

@ -22,7 +22,7 @@ _HOVERING_ELEMENT = noone;
} }
#endregion #endregion
#region window #region window & mouse
//if(keyboard_check_pressed(vk_f12)) DEBUG = !DEBUG; //if(keyboard_check_pressed(vk_f12)) DEBUG = !DEBUG;
if(_cursor != CURSOR) { if(_cursor != CURSOR) {
@ -36,6 +36,16 @@ _HOVERING_ELEMENT = noone;
RENDER_ALL RENDER_ALL
watcher_surface = surface_create(1, 1); watcher_surface = surface_create(1, 1);
} }
PEN_USE = false;
PEN_RELEASED = false;
PEN_RIGHT_PRESS = false;
PEN_RIGHT_RELEASE = false;
if(!IS_CMD) tabletstuff_perform_event(id, ev_other, ev_user10);
//print($"{PEN_RIGHT_CLICK} | {PEN_RIGHT_PRESS}, {PEN_RIGHT_RELEASE}");
//print($"{mouse_x}, {mouse_y}");
#endregion #endregion
#region focus #region focus

View file

@ -21,6 +21,7 @@
{"resourceType":"GMEvent","resourceVersion":"1.0","name":"","collisionObjectId":null,"eventNum":68,"eventType":7,"isDnD":false,}, {"resourceType":"GMEvent","resourceVersion":"1.0","name":"","collisionObjectId":null,"eventNum":68,"eventType":7,"isDnD":false,},
{"resourceType":"GMEvent","resourceVersion":"1.0","name":"","collisionObjectId":null,"eventNum":60,"eventType":7,"isDnD":false,}, {"resourceType":"GMEvent","resourceVersion":"1.0","name":"","collisionObjectId":null,"eventNum":60,"eventType":7,"isDnD":false,},
{"resourceType":"GMEvent","resourceVersion":"1.0","name":"","collisionObjectId":null,"eventNum":70,"eventType":7,"isDnD":false,}, {"resourceType":"GMEvent","resourceVersion":"1.0","name":"","collisionObjectId":null,"eventNum":70,"eventType":7,"isDnD":false,},
{"resourceType":"GMEvent","resourceVersion":"1.0","name":"","collisionObjectId":null,"eventNum":20,"eventType":7,"isDnD":false,},
], ],
"managed": true, "managed": true,
"overriddenProperties": [], "overriddenProperties": [],

View file

@ -77,11 +77,12 @@ function __part(_node) constructor {
drawsx = 0; drawsx = 0;
drawsy = 0; drawsy = 0;
col = -1; col = -1;
blend = c_white; blend = c_white;
alp = 1; alp = 1;
alp_draw = alp; alp_draw = alp;
alp_fade = 0; alp_fade = 0;
currColor = c_white;
blend_history = []; blend_history = [];
alp_history = []; alp_history = [];
@ -371,6 +372,8 @@ function __part(_node) constructor {
blend_history[life_incr - 1] = cc; blend_history[life_incr - 1] = cc;
alp_history[life_incr - 1] = alp_draw; alp_history[life_incr - 1] = alp_draw;
currColor = cola(cc, alp_draw);
if(_useS && (x0 > surf_w || y0 > surf_h || x1 < 0 || y1 < 0)) if(_useS && (x0 > surf_w || y0 > surf_h || x1 < 0 || y1 < 0))
return; return;

View file

@ -0,0 +1,18 @@
globalvar PEN_USE, PEN_CONTACT, PEN_RELEASED, PEN_PRESSURE, PEN_X, PEN_Y;
globalvar PEN_RIGHT_CLICK, PEN_RIGHT_PRESS, PEN_RIGHT_RELEASE;
PEN_X = 0;
PEN_Y = 0;
PEN_CONTACT = false;
PEN_PRESSURE = 0;
PEN_RIGHT_CLICK = false;
PEN_RIGHT_PRESS = false;
PEN_RIGHT_RELEASE = false;
function __initPen() {
var c = tabletstuff_get_init_error_code();
if (c != tabletstuff_error_none)
show_error("Unable to initialize TabletStuff. Code=" + tabletstuff_error_to_string(c), true);
}

View file

@ -0,0 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "__initPen",
"isCompatibility": false,
"isDnD": false,
"parent": {
"name": "pen input",
"path": "folders/functions/pen input.yy",
},
}

View file

@ -23,6 +23,12 @@ function __vec2(_x = 0, _y = _x) constructor {
return self; return self;
} set(_x, _y); #endregion } set(_x, _y); #endregion
ref = noone;
static setRef = function(ref = noone) { #region
self.ref = ref;
return self;
} #endregion
static setIndex = function(index, value) { #region static setIndex = function(index, value) { #region
INLINE INLINE
switch(index) { switch(index) {

View file

@ -36,6 +36,13 @@ function vertex_add_2pc(buffer, _x, _y, color, alpha = 1) {
vertex_color(buffer, color, alpha); vertex_color(buffer, color, alpha);
} }
function vertex_add_2pct(buffer, _x, _y, _u, _v, color, alpha = 1) {
INLINE
vertex_position(buffer, _x, _y);
vertex_color(buffer, color, alpha);
vertex_texcoord(buffer, _u, _v);
}
function vertex_add_v(buffer, vertex) { function vertex_add_v(buffer, vertex) {
INLINE INLINE
vertex_position_3d(buffer, vertex.x, vertex.y, vertex.z); vertex_position_3d(buffer, vertex.x, vertex.y, vertex.z);

View file

@ -22,11 +22,11 @@ function argumentRenderer(_typeArray = []) {
_h += _th + ui(8); _h += _th + ui(8);
draw_set_text(f_p1, fa_left, fa_top, COLORS._main_text_sub);
draw_text_add(tx + ui(8), ty + _th + ui(8 + 6), __txt("Value"));
var _jValue = inputs[| i + 2]; var _jValue = inputs[| i + 2];
if(argument_renderer.showValue && _jValue.editWidget != noone) { if(argument_renderer.showValue && _jValue.editWidget != noone) {
draw_set_text(f_p1, fa_left, fa_top, COLORS._main_text_sub);
draw_text_add(tx + ui(8), ty + _th + ui(8 + 6), __txt("Value"));
var params = new widgetParam(tx + ui(64), ty + _th + ui(10), _w - ui(64), TEXTBOX_HEIGHT, _jValue.showValue(), {}, _m, argument_renderer.rx, argument_renderer.ry); var params = new widgetParam(tx + ui(64), ty + _th + ui(10), _w - ui(64), TEXTBOX_HEIGHT, _jValue.showValue(), {}, _m, argument_renderer.rx, argument_renderer.ry);
_jValue.editWidget.setFocusHover(_focus, _hover); _jValue.editWidget.setFocusHover(_focus, _hover);

View file

@ -28,14 +28,6 @@ function __gaussian_get_kernel(size) {
} }
function surface_apply_gaussian(surface, size, bg = false, bg_c = c_white, sampleMode = 0, overColor = noone) { function surface_apply_gaussian(surface, size, bg = false, bg_c = c_white, sampleMode = 0, overColor = noone) {
static uni_bor = shader_get_uniform(sh_blur_gaussian, "sampleMode");
static uni_dim = shader_get_uniform(sh_blur_gaussian, "dimension");
static uni_hor = shader_get_uniform(sh_blur_gaussian, "horizontal");
static uni_wei = shader_get_uniform(sh_blur_gaussian, "weight");
static uni_sze = shader_get_uniform(sh_blur_gaussian, "size");
static uni_ovr = shader_get_uniform(sh_blur_gaussian, "overrideColor");
static uni_ovc = shader_get_uniform(sh_blur_gaussian, "overColor");
var format = surface_get_format(surface); var format = surface_get_format(surface);
var _sw = surface_get_width_safe(surface); var _sw = surface_get_width_safe(surface);
var _sh = surface_get_height_safe(surface); var _sh = surface_get_height_safe(surface);
@ -52,15 +44,15 @@ function surface_apply_gaussian(surface, size, bg = false, bg_c = c_white, sampl
draw_clear_alpha(bg_c, bg); draw_clear_alpha(bg_c, bg);
shader_set(sh_blur_gaussian); shader_set(sh_blur_gaussian);
shader_set_uniform_f_array_safe(uni_dim, [ _sw, _sh ]); shader_set_f("dimension", [ _sw, _sh ]);
shader_set_uniform_f_array_safe(uni_wei, gau_array); shader_set_f("weight", gau_array);
shader_set_uniform_i(uni_bor, sampleMode); shader_set_i("sampleMode", sampleMode);
shader_set_uniform_i(uni_sze, size); shader_set_i("size", size);
shader_set_uniform_i(uni_hor, 1); shader_set_i("horizontal", 1);
shader_set_uniform_i(uni_ovr, overColor != noone); shader_set_i("overrideColor", overColor != noone);
shader_set_uniform_f_array_safe(uni_ovc, colToVec4(overColor)); shader_set_f("overColor", colToVec4(overColor));
draw_surface_safe(surface, 0, 0); draw_surface_safe(surface, 0, 0);
shader_reset(); shader_reset();
@ -70,7 +62,7 @@ function surface_apply_gaussian(surface, size, bg = false, bg_c = c_white, sampl
draw_clear_alpha(bg_c, bg); draw_clear_alpha(bg_c, bg);
shader_set(sh_blur_gaussian); shader_set(sh_blur_gaussian);
shader_set_uniform_i(uni_hor, 0); shader_set_i("horizontal", 0);
draw_surface_safe(__blur_hori, 0, 0); draw_surface_safe(__blur_hori, 0, 0);
shader_reset(); shader_reset();

View file

@ -21,7 +21,7 @@ function delaunay_triangulation(points) { #region
array_remove_triangles(triangles, bad_triangles[j]); array_remove_triangles(triangles, bad_triangles[j]);
for (var j = 0; j < array_length(polygon); j += 2) { for (var j = 0; j < array_length(polygon); j += 2) {
var new_triangle = [_point, polygon[j], polygon[j + 1]]; var new_triangle = [ _point, polygon[j], polygon[j + 1] ];
array_push(triangles, new_triangle); array_push(triangles, new_triangle);
} }
} }

View file

@ -1,4 +1,4 @@
function draw_line_width2(x0, y0, x1, y1, w0, w1, cap = false) { function draw_line_width2(x0, y0, x1, y1, w0, w1, cap = false, c0 = noone, c1 = noone) {
var aa = point_direction(x0, y0, x1, y1) + 90; var aa = point_direction(x0, y0, x1, y1) + 90;
var _x0 = x0 + lengthdir_x(w0 / 2, aa); var _x0 = x0 + lengthdir_x(w0 / 2, aa);
var _y0 = y0 + lengthdir_y(w0 / 2, aa); var _y0 = y0 + lengthdir_y(w0 / 2, aa);
@ -9,17 +9,19 @@ function draw_line_width2(x0, y0, x1, y1, w0, w1, cap = false) {
var _x3 = x1 + lengthdir_x(w1 / 2, aa + 180); var _x3 = x1 + lengthdir_x(w1 / 2, aa + 180);
var _y3 = y1 + lengthdir_y(w1 / 2, aa + 180); var _y3 = y1 + lengthdir_y(w1 / 2, aa + 180);
c0 = c0 == noone? draw_get_color() : c0;
c1 = c1 == noone? draw_get_color() : c1;
draw_primitive_begin(pr_trianglestrip); draw_primitive_begin(pr_trianglestrip);
draw_vertex(_x0, _y0); draw_vertex_color(_x0, _y0, c0, 1);
draw_vertex(_x1, _y1); draw_vertex_color(_x1, _y1, c0, 1);
draw_vertex(_x2, _y2); draw_vertex_color(_x2, _y2, c1, 1);
draw_vertex(_x3, _y3); draw_vertex_color(_x3, _y3, c1, 1);
draw_primitive_end(); draw_primitive_end();
if(cap && w0 / 2 - 1 > 0) { if(cap && w0 / 2 - 1 > 0) {
//draw_set_color(c_red); draw_set_color(c0); draw_circle(x0 - 1, y0 - 1, w0 / 2 - 1, 0);
draw_circle(x0 - 1, y0 - 1, w0 / 2 - 1, 0); draw_set_color(c1); draw_circle(x1 - 1, y1 - 1, w1 / 2 - 1, 0);
draw_circle(x1 - 1, y1 - 1, w1 / 2 - 1, 0);
} }
} }

View file

@ -78,8 +78,8 @@
#macro UI_SCALE PREFERENCES.display_scaling #macro UI_SCALE PREFERENCES.display_scaling
#macro mouse_mx device_mouse_x_to_gui(0) #macro mouse_mx (PEN_USE? PEN_X : device_mouse_x_to_gui(0))
#macro mouse_my device_mouse_y_to_gui(0) #macro mouse_my (PEN_USE? PEN_Y : device_mouse_y_to_gui(0))
#macro mouse_raw_x (device_mouse_raw_x(0) + window_get_x()) #macro mouse_raw_x (device_mouse_raw_x(0) + window_get_x())
#macro mouse_raw_y (device_mouse_raw_y(0) + window_get_y()) #macro mouse_raw_y (device_mouse_raw_y(0) + window_get_y())
#macro mouse_ui [device_mouse_x_to_gui(0), device_mouse_y_to_gui(0)] #macro mouse_ui [device_mouse_x_to_gui(0), device_mouse_y_to_gui(0)]

View file

@ -5,6 +5,7 @@
MOUSE_WRAPPING = false; MOUSE_WRAPPING = false;
MOUSE_BLOCK = false; MOUSE_BLOCK = false;
_MOUSE_BLOCK = false; _MOUSE_BLOCK = false;
PEN_RELEASED = false;
#macro SCROLL_SPEED PREFERENCES.mouse_wheel_speed #macro SCROLL_SPEED PREFERENCES.mouse_wheel_speed
@ -14,17 +15,84 @@
} }
#endregion #endregion
function mouse_click(mouse, focus = true) { function mouse_click(mouse, focus = true) { #region
INLINE INLINE
return !_MOUSE_BLOCK && focus && mouse_check_button(mouse); if(MOUSE_BLOCK) return false;
} if(!focus) return false;
function mouse_press(mouse, focus = true) { if(PEN_RIGHT_CLICK) return mouse == mb_right;
INLINE
return !_MOUSE_BLOCK && focus && mouse_check_button_pressed(mouse);
}
function mouse_release(mouse, focus = true) { return mouse_check_button(mouse);
} #endregion
function mouse_press(mouse, focus = true) { #region
INLINE INLINE
return focus && mouse_check_button_released(mouse); if(MOUSE_BLOCK) return false;
} if(!focus) return false;
if(PEN_RIGHT_PRESS) return mouse == mb_right;
return mouse_check_button_pressed(mouse);
} #endregion
function mouse_release(mouse, focus = true) { #region
INLINE
if(!focus) return false;
if(PEN_RIGHT_RELEASE) return mouse == mb_right;
return mouse_check_button_released(mouse) || (mouse == mb_left && PEN_RELEASED);
} #endregion
function mouse_lclick(focus = true) { #region
INLINE
if(MOUSE_BLOCK) return false;
if(!focus) return false;
if(PEN_RIGHT_CLICK || PEN_RIGHT_RELEASE) return false;
return mouse_check_button(mb_left);
} #endregion
function mouse_lpress(focus = true) { #region
INLINE
if(MOUSE_BLOCK) return false;
if(!focus) return false;
if(PEN_RIGHT_PRESS) return false;
return mouse_check_button_pressed(mb_left);
} #endregion
function mouse_lrelease(focus = true) { #region
INLINE
if(!focus) return false;
if(PEN_RIGHT_RELEASE) return false;
if(PEN_RELEASED) return true;
return mouse_check_button_released(mb_left);
} #endregion
function mouse_rclick(focus = true) { #region
INLINE
if(MOUSE_BLOCK) return false;
if(!focus) return false;
if(PEN_RIGHT_CLICK) return true;
return mouse_check_button(mb_right);
} #endregion
function mouse_rpress(focus = true) { #region
INLINE
if(MOUSE_BLOCK) return false;
if(!focus) return false;
if(PEN_RIGHT_PRESS) return true;
return mouse_check_button_pressed(mb_right);
} #endregion
function mouse_rrelease(focus = true) { #region
INLINE
if(!focus) return false;
if(PEN_RIGHT_RELEASE) return true;
return mouse_check_button_released(mb_right);
} #endregion

View file

@ -5,6 +5,8 @@ function drawWidgetInit() {
min_w = ui(160); min_w = ui(160);
lineBreak = PREFERENCES.inspector_view_default; lineBreak = PREFERENCES.inspector_view_default;
tooltip_loop_type = new tooltipSelector(__txtx("panel_animation_looping_mode", "Looping mode"), global.junctionEndName);
} }
function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _focus = false, _scrollPane = noone, rx = 0, ry = 0) { function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _focus = false, _scrollPane = noone, rx = 0, ry = 0) {
@ -211,7 +213,8 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc
draw_line(bx - ui(20), by - lhf, bx - ui(20), by + lhf); draw_line(bx - ui(20), by - lhf, bx - ui(20), by + lhf);
bx -= ui(26 + 12); bx -= ui(26 + 12);
if(buttonInstant(THEME.button_hide, bx - ui(12), by - ui(12), ui(24), ui(24), _m, _focus, _hover, __txtx("panel_animation_looping_mode", "Looping mode") + " " + global.junctionEndName[jun.on_end], THEME.prop_on_end, jun.on_end) == 2) tooltip_loop_type.index = jun.on_end;
if(buttonInstant(THEME.button_hide, bx - ui(12), by - ui(12), ui(24), ui(24), _m, _focus, _hover, tooltip_loop_type, THEME.prop_on_end, jun.on_end) == 2)
jun.on_end = safe_mod(jun.on_end + 1, sprite_get_number(THEME.prop_on_end)); jun.on_end = safe_mod(jun.on_end + 1, sprite_get_number(THEME.prop_on_end));
} }
#endregion #endregion

View file

@ -0,0 +1,130 @@
function Node_VFX_Triangulate(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "VFX Triangulate";
color = COLORS.node_blend_vfx;
icon = THEME.vfx;
use_cache = CACHE_USE.auto;
function _Point(part) constructor { #region
self.part = part;
x = part.x;
y = part.y;
static equal = function(point) { INLINE return x == point.x && y == point.y; }
} #endregion
manual_ungroupable = false;
inputs[| 0] = nodeValue("Output dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, DEF_SURF )
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 1] = nodeValue("Particles", self, JUNCTION_CONNECT.input, VALUE_TYPE.particle, -1 )
.setVisible(true, true);
inputs[| 2] = nodeValue("Thickness", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1 );
inputs[| 3] = nodeValue("Color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_white );
inputs[| 4] = nodeValue("Inherit Thickness", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false );
inputs[| 5] = nodeValue("Inherit Color", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false );
outputs[| 0] = nodeValue("Triangles", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
input_display_list = [ 0,
[ "Particles", false], 1,
[ "Rendering", false], 4, 2, 5, 3,
]
insp2UpdateTooltip = "Clear cache";
insp2UpdateIcon = [ THEME.cache, 0, COLORS._main_icon ];
static onInspector2Update = function() { clearCache(); }
static step = function() { #region
var _ith = getInputData(4);
var _icl = getInputData(5);
inputs[| 2].setVisible(!_ith);
inputs[| 3].setVisible(!_icl);
} #endregion
static update = function() { #region
var _dim = getInputData(0);
var _par = getInputData(1);
var _th = getInputData(2);
var _cl = getInputData(3);
var _ith = getInputData(4);
var _icl = getInputData(5);
var _surf = outputs[| 0].getValue();
_surf = surface_verify(_surf, _dim[0], _dim[1]);
outputs[| 0].setValue(_surf);
var _vrx = array_create(array_length(_par));
var _ind = 0;
for( var i = 0, n = array_length(_par); i < n; i++ ) {
var p = _par[i];
if(!p.active) continue;
_vrx[_ind++] = new _Point(p);
}
array_resize(_vrx, _ind);
var tri = delaunay_triangulation(_vrx);
var c0, c1, c2;
surface_set_shader(_surf, noone);
draw_set_color(c_white);
for( var i = 0, n = array_length(tri); i < n; i++ ) {
var t = tri[i];
var p0 = t[0].part;
var p1 = t[1].part;
var p2 = t[2].part;
if(_ith) {
if(_icl) {
draw_line_width2(p0.x, p0.y, p1.x, p1.y, min(p0.scx, p0.scy), min(p1.scx, p1.scy), false, p0.currColor, p1.currColor);
draw_line_width2(p0.x, p0.y, p2.x, p2.y, min(p0.scx, p0.scy), min(p2.scx, p2.scy), false, p0.currColor, p2.currColor);
draw_line_width2(p1.x, p1.y, p2.x, p2.y, min(p1.scx, p1.scy), min(p2.scx, p2.scy), false, p1.currColor, p2.currColor);
} else {
draw_set_color(_cl);
draw_line_width2(p0.x, p0.y, p1.x, p1.y, min(p0.scx, p0.scy), min(p1.scx, p1.scy));
draw_line_width2(p0.x, p0.y, p2.x, p2.y, min(p0.scx, p0.scy), min(p2.scx, p2.scy));
draw_line_width2(p1.x, p1.y, p2.x, p2.y, min(p1.scx, p1.scy), min(p2.scx, p2.scy));
}
} else if(_th == 1) {
if(_icl) {
draw_line_color(p0.x, p0.y, p1.x, p1.y, p0.currColor, p1.currColor);
draw_line_color(p0.x, p0.y, p2.x, p2.y, p0.currColor, p2.currColor);
draw_line_color(p1.x, p1.y, p2.x, p2.y, p1.currColor, p2.currColor);
} else {
draw_set_color(_cl);
draw_line(p0.x, p0.y, p1.x, p1.y);
draw_line(p0.x, p0.y, p2.x, p2.y);
draw_line(p1.x, p1.y, p2.x, p2.y);
}
} else {
if(_icl) {
draw_line_width_color(p0.x, p0.y, p1.x, p1.y, _th, p0.currColor, p1.currColor);
draw_line_width_color(p0.x, p0.y, p2.x, p2.y, _th, p0.currColor, p2.currColor);
draw_line_width_color(p1.x, p1.y, p2.x, p2.y, _th, p1.currColor, p2.currColor);
} else {
draw_set_color(_cl);
draw_line_width(p0.x, p0.y, p1.x, p1.y, _th);
draw_line_width(p0.x, p0.y, p2.x, p2.y, _th);
draw_line_width(p1.x, p1.y, p2.x, p2.y, _th);
}
}
}
surface_reset_shader();
cacheCurrentFrame(_surf);
} #endregion
}

View file

@ -0,0 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "node_VFX_triangulate",
"isCompatibility": false,
"isDnD": false,
"parent": {
"name": "effects",
"path": "folders/nodes/data/simulation/VFX/effects.yy",
},
}

View file

@ -160,13 +160,18 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
["Tags", false], 2, tag_renderer, ["Tags", false], 2, tag_renderer,
]; ];
attributes.file_checker = true;
attributes.layer_visible = []; attributes.layer_visible = [];
array_push(attributeEditors, [ "File Watcher", function() { return attributes.file_checker; },
new checkBox(function() { attributes.file_checker = !attributes.file_checker; }) ]);
content = ds_map_create(); content = ds_map_create();
layers = []; layers = [];
tags = []; tags = [];
_tag_delay = 0; _tag_delay = 0;
path_current = ""; path_current = "";
edit_time = 0;
first_update = false; first_update = false;
@ -214,6 +219,7 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
function updatePaths(path) { #region function updatePaths(path) { #region
path_current = path; path_current = path;
edit_time = file_get_modify_s(path_current);
path = try_get_path(path); path = try_get_path(path);
if(path == -1) return false; if(path == -1) return false;
@ -302,6 +308,18 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const
triggerRender(); triggerRender();
} #endregion } #endregion
static step = function() {
if(attributes.file_checker && path_current != "") {
var _ms = file_get_modify_s(path_current);
if(_ms > edit_time) {
edit_time = _ms;
updatePaths(path_current);
update();
}
}
}
static update = function(frame = CURRENT_FRAME) { #region static update = function(frame = CURRENT_FRAME) { #region
var path = getInputData(0); var path = getInputData(0);
var current_tag = getInputData(2); var current_tag = getInputData(2);

View file

@ -27,9 +27,19 @@ function Node_Blur_Simple(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
__init_mask_modifier(6); // inputs 10, 11, __init_mask_modifier(6); // inputs 10, 11,
inputs[| 12] = nodeValue("Gradient", self, JUNCTION_CONNECT.input, VALUE_TYPE.gradient, new gradientObject([ c_black, c_white ]) )
.setMappable(13);
inputs[| 13] = nodeValueMap("Gradient map", self);
inputs[| 14] = nodeValueGradientRange("Gradient map range", self, inputs[| 1]);
inputs[| 15] = nodeValue("Use Gradient", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false);
input_display_list = [ 8, 9, input_display_list = [ 8, 9,
["Surfaces", true], 0, 6, 7, 10, 11, ["Surfaces", true], 0, 6, 7, 10, 11,
["Blur", false], 1, 3, 4, 5, ["Blur", false], 1, 3, 4, 5,
["Effects", false, 15], 12, 13, 14,
]; ];
outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
@ -39,6 +49,8 @@ function Node_Blur_Simple(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
static step = function() { #region static step = function() { #region
__step_mask_modifier(); __step_mask_modifier();
inputs[| 12].mappableStep();
} #endregion } #endregion
static processData = function(_outSurf, _data, _output_index, _array_index) { #region static processData = function(_outSurf, _data, _output_index, _array_index) { #region
@ -50,10 +62,14 @@ function Node_Blur_Simple(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
var _overc = _data[5]; var _overc = _data[5];
var _msk = _data[6]; var _msk = _data[6];
var _mix = _data[7]; var _mix = _data[7];
var _useGrd = _data[15];
inputs[| 5].setVisible(_isovr); inputs[| 5].setVisible(_isovr);
surface_set_shader(_outSurf, sh_blur_simple); surface_set_shader(_outSurf, sh_blur_simple);
shader_set_i("useGradient", _useGrd);
shader_set_gradient(_data[12], _data[13], _data[14], inputs[| 12]);
shader_set_f("dimension", surface_get_width_safe(_data[0]), surface_get_height_safe(_data[0])); shader_set_f("dimension", surface_get_width_safe(_data[0]), surface_get_height_safe(_data[0]));
shader_set_f("size", _size); shader_set_f("size", _size);
shader_set_i("sampleMode", _samp); shader_set_i("sampleMode", _samp);

View file

@ -217,6 +217,10 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
brush_seed = irandom_range(100000, 999999); brush_seed = irandom_range(100000, 999999);
brush_next_dist = 0; brush_next_dist = 0;
draw_stack = ds_list_create();
#endregion
#region ++++ tools ++++
tool_attribute.color = cola(c_white); tool_attribute.color = cola(c_white);
tool_attribute.channel = [ true, true, true, true ]; tool_attribute.channel = [ true, true, true, true ];
@ -224,13 +228,17 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
tool_settings = [ [ "Channel", tool_channel_edit, "channel", tool_attribute ] ]; tool_settings = [ [ "Channel", tool_channel_edit, "channel", tool_attribute ] ];
tool_attribute.size = 1; tool_attribute.size = 1;
tool_size_edit = new textBox(TEXTBOX_INPUT.number, function(val) { tool_attribute.size = max(1, round(val)); }).setSlidable(0.1, true, [ 1, 999999 ]); tool_size_edit = new textBox(TEXTBOX_INPUT.number, function(val) { tool_attribute.size = max(1, round(val)); }).setSlidable(0.1, true, [ 1, 999999 ])
tool_size_edit.font = f_p3; .setFont(f_p3)
.setSideButton(button(function() { dialogPanelCall(new Panel_Node_Canvas_Pressure(self), mouse_mx, mouse_my, { anchor: ANCHOR.top | ANCHOR.left }) })
.setIcon(THEME.pen_pressure, 0, COLORS._main_icon));
tool_size = [ "Size", tool_size_edit, "size", tool_attribute ]; tool_size = [ "Size", tool_size_edit, "size", tool_attribute ];
tool_attribute.pressure = false;
tool_attribute.pressure_size = [ 1, 1 ];
tool_attribute.thres = 0; tool_attribute.thres = 0;
tool_thrs_edit = new textBox(TEXTBOX_INPUT.number, function(val) { tool_attribute.thres = clamp(val, 0, 1); }).setSlidable(0.01, false, [ 0, 1 ]); tool_thrs_edit = new textBox(TEXTBOX_INPUT.number, function(val) { tool_attribute.thres = clamp(val, 0, 1); }).setSlidable(0.01, false, [ 0, 1 ]).setFont(f_p3);
tool_thrs_edit.font = f_p3;
tool_thrs = [ "Threshold", tool_thrs_edit, "thres", tool_attribute ]; tool_thrs = [ "Threshold", tool_thrs_edit, "thres", tool_attribute ];
tool_attribute.fill8 = false; tool_attribute.fill8 = false;
@ -256,8 +264,6 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
.setSetting(tool_thrs) .setSetting(tool_thrs)
.setSetting(tool_fil8), .setSetting(tool_fil8),
]; ];
draw_stack = ds_list_create();
#endregion #endregion
function setToolColor(color) { tool_attribute.color = color; } function setToolColor(color) { tool_attribute.color = color; }
@ -379,7 +385,7 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
var cDep = attrDepth(); var cDep = attrDepth();
var _canvas_surface = getCanvasSurface(index); var _canvas_surface = getCanvasSurface(index);
print($"Applying surface {index} - {_canvas_surface} [{is_surface(_canvas_surface)}]"); //print($"Applying surface {index} - {_canvas_surface} [{is_surface(_canvas_surface)}]");
if(!is_surface(_canvas_surface)) { // recover surface if(!is_surface(_canvas_surface)) { // recover surface
//print($"recovering surface from buffer {random(1)}"); //print($"recovering surface from buffer {random(1)}");
@ -720,7 +726,11 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
var _brushRotD = getInputData(16); var _brushRotD = getInputData(16);
var _brushRotR = getInputData(17); var _brushRotR = getInputData(17);
brush_size = _siz; if(PEN_USE && tool_attribute.pressure)
brush_size = round(lerp(tool_attribute.pressure_size[0], tool_attribute.pressure_size[1], power(PEN_PRESSURE / 1024, 2)));
else
brush_size = _siz;
brush_dist_min = max(1, _brushDist[0]); brush_dist_min = max(1, _brushDist[0]);
brush_dist_max = max(1, _brushDist[1]); brush_dist_max = max(1, _brushDist[1]);
brush_surface = is_surface(_brushSurf)? _brushSurf : noone; brush_surface = is_surface(_brushSurf)? _brushSurf : noone;

View file

@ -108,8 +108,8 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor {
#endregion #endregion
#region ---- junctions ---- #region ---- junctions ----
inputs = ds_list_create(); inputs = ds_list_create();
outputs = ds_list_create(); outputs = ds_list_create();
inputMap = ds_map_create(); inputMap = ds_map_create();
outputMap = ds_map_create(); outputMap = ds_map_create();
input_value_map = {}; input_value_map = {};

View file

@ -8,21 +8,10 @@
global.HLSL_VB_PLANE = vertex_create_buffer(); global.HLSL_VB_PLANE = vertex_create_buffer();
vertex_begin(global.HLSL_VB_PLANE, global.HLSL_VB_FORMAT); vertex_begin(global.HLSL_VB_PLANE, global.HLSL_VB_FORMAT);
vertex_position(global.HLSL_VB_PLANE, 0, 0); vertex_add_2pct(global.HLSL_VB_PLANE, 0, 0, 0, 1, c_white);
vertex_color( global.HLSL_VB_PLANE, c_white, 1); vertex_add_2pct(global.HLSL_VB_PLANE, 0, 1, 0, 0, c_white);
vertex_texcoord(global.HLSL_VB_PLANE, 0, 0); vertex_add_2pct(global.HLSL_VB_PLANE, 1, 0, 1, 1, c_white);
vertex_add_2pct(global.HLSL_VB_PLANE, 1, 1, 1, 0, c_white);
vertex_position(global.HLSL_VB_PLANE, 0, 1);
vertex_color( global.HLSL_VB_PLANE, c_white, 1);
vertex_texcoord(global.HLSL_VB_PLANE, 0, 1);
vertex_position(global.HLSL_VB_PLANE, 1, 0);
vertex_color( global.HLSL_VB_PLANE, c_white, 1);
vertex_texcoord(global.HLSL_VB_PLANE, 1, 0);
vertex_position(global.HLSL_VB_PLANE, 1, 1);
vertex_color( global.HLSL_VB_PLANE, c_white, 1);
vertex_texcoord(global.HLSL_VB_PLANE, 1, 1);
vertex_end(global.HLSL_VB_PLANE); vertex_end(global.HLSL_VB_PLANE);
#endregion #endregion

View file

@ -41,6 +41,7 @@ function Node_Image(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
path_current = []; path_current = [];
first_update = false; first_update = false;
edit_time = [];
on_drop_file = function(path) { #region on_drop_file = function(path) { #region
inputs[| 0].setValue(path); inputs[| 0].setValue(path);
@ -67,7 +68,6 @@ function Node_Image(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
case ".jpeg": case ".jpeg":
case ".gif": case ".gif":
setDisplayName(_name); setDisplayName(_name);
spr = sprite_add(path, 1, false, false, 0, 0); spr = sprite_add(path, 1, false, false, 0, 0);
if(spr == -1) { if(spr == -1) {
@ -75,6 +75,7 @@ function Node_Image(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
break; break;
} }
edit_time = file_get_modify_s(path);
return spr; return spr;
} }
@ -114,6 +115,20 @@ function Node_Image(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
outputs[| 1].setValue(path); outputs[| 1].setValue(path);
if(path_current != path) if(path_current != path)
updatePaths(path); updatePaths(path);
else {
//if(!is_array(path)) path = [ path ];
//var _upd = false;
//for( var i = 0, n = array_length(path); i < n; i++ ) {
// var _et = array_safe_get(edit_time, i);
// var _ms = file_get_modify_s(path[i]);
// if(_ms > edit_time[i]) _upd = true;
// edit_time[i] = _ms;
//}
//if(_upd) updatePaths(path);
}
if(array_empty(spr)) return; if(array_empty(spr)) return;

View file

@ -384,7 +384,8 @@ function __initNodes() {
addNodeObject(vfx, "Oscillate", s_node_vfx_osc, "Node_VFX_Oscillate", [1, Node_VFX_Oscillate],, "Swing particle around its original trajectory.").hideRecent().setVersion(11560); addNodeObject(vfx, "Oscillate", s_node_vfx_osc, "Node_VFX_Oscillate", [1, Node_VFX_Oscillate],, "Swing particle around its original trajectory.").hideRecent().setVersion(11560);
ds_list_add(vfx, "Effects"); ds_list_add(vfx, "Effects");
addNodeObject(vfx, "VFX Trail", s_node_vfx_trail, "Node_VFX_Trail", [1, Node_VFX_Trail],, "Generate path from particle movement.").hideRecent().setVersion(11560); addNodeObject(vfx, "VFX Trail", s_node_vfx_trail, "Node_VFX_Trail", [1, Node_VFX_Trail],, "Generate path from particle movement.").hideRecent().setVersion(11560);
addNodeObject(vfx, "VFX Triangulate", s_node_vfx_triangulate, "Node_VFX_Triangulate", [1, Node_VFX_Triangulate],, "Render line between particles.").hideRecent().setVersion(11670);
ds_list_add(vfx, "Instance control"); ds_list_add(vfx, "Instance control");
addNodeObject(vfx, "VFX Variable", s_node_vfx_variable, "Node_VFX_Variable", [1, Node_VFX_Variable],, "Extract variable from particle objects.").hideRecent().setVersion(1120); addNodeObject(vfx, "VFX Variable", s_node_vfx_variable, "Node_VFX_Variable", [1, Node_VFX_Variable],, "Extract variable from particle objects.").hideRecent().setVersion(1120);

View file

@ -13,7 +13,7 @@ function Node_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
new scrollItem("Grid", s_node_repeat_axis, 1), new scrollItem("Grid", s_node_repeat_axis, 1),
new scrollItem("Circular", s_node_repeat_axis, 2), ]); new scrollItem("Circular", s_node_repeat_axis, 2), ]);
inputs[| 4] = nodeValue("Repeat position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [DEF_SURF_W / 2, 0]) inputs[| 4] = nodeValue("Shift position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [DEF_SURF_W / 2, 0])
.setDisplay(VALUE_DISPLAY.vector) .setDisplay(VALUE_DISPLAY.vector)
.setUnitRef(function() { return getDimension(); }); .setUnitRef(function() { return getDimension(); });
@ -98,14 +98,16 @@ function Node_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
["Surfaces", true], 0, 1, 16, 17, ["Surfaces", true], 0, 1, 16, 17,
["Pattern", false], 3, 9, 2, 18, 7, 8, ["Pattern", false], 3, 9, 2, 18, 7, 8,
["Path", true], 11, 12, 13, ["Path", true], 11, 12, 13,
["Transform", false], 4, 26, 19, 5, 6, 10, ["Position", false], 4, 26, 19,
["Rotation", false], 5,
["Scale", false], 6, 10,
["Render", false], 14, 30, ["Render", false], 14, 30,
["Animator", true, 29], 20, 21, 25, 22, 23, 24, 27, ["Animator", true, 29], 20, 21, 25, 22, 23, 24, 27,
]; ];
attribute_surface_depth(); attribute_surface_depth();
static getDimension = function() { static getDimension = function() { #region
var _surf = getInputData(0); var _surf = getInputData(0);
if(is_array(_surf)) { if(is_array(_surf)) {
if(array_length(_surf) == 0) return [1, 1]; if(array_length(_surf) == 0) return [1, 1];
@ -115,9 +117,9 @@ function Node_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
if(!is_surface(_surf)) return [1, 1]; if(!is_surface(_surf)) return [1, 1];
return [ surface_get_width_safe(_surf), surface_get_height_safe(_surf) ]; return [ surface_get_width_safe(_surf), surface_get_height_safe(_surf) ];
} } #endregion
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
var a = inputs[| 9].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny, THEME.anchor); active &= !a; var a = inputs[| 9].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny, THEME.anchor); active &= !a;
var _pat = getInputData(3); var _pat = getInputData(3);
@ -137,13 +139,13 @@ function Node_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
} }
var a = inputs[| 31].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny, getInputData(1)); active &= !a; var a = inputs[| 31].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny, getInputData(1)); active &= !a;
} } #endregion
static step = function() { #region static step = function() { #region
inputs[| 14].mappableStep(); inputs[| 14].mappableStep();
} #endregion } #endregion
function doRepeat(_outSurf, _inSurf) { function doRepeat(_outSurf, _inSurf) { #region
var _dim = getInputData( 1); var _dim = getInputData( 1);
var _amo = getInputData( 2); var _amo = getInputData( 2);
var _pat = getInputData( 3); var _pat = getInputData( 3);
@ -275,9 +277,9 @@ function Node_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
if(_rsta == 2) runy += _sh / 2; if(_rsta == 2) runy += _sh / 2;
} }
surface_reset_target(); surface_reset_target();
} } #endregion
static update = function(frame = CURRENT_FRAME) { static update = function(frame = CURRENT_FRAME) { #region
var _inSurf = getInputData(0); var _inSurf = getInputData(0);
if(is_array(_inSurf) && array_length(_inSurf) == 0) return; if(is_array(_inSurf) && array_length(_inSurf) == 0) return;
if(!is_array(_inSurf) && !is_surface(_inSurf)) return; if(!is_array(_inSurf) && !is_surface(_inSurf)) return;
@ -316,5 +318,5 @@ function Node_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
} }
outputs[| 0].setValue(_outSurf); outputs[| 0].setValue(_outSurf);
} } #endregion
} }

View file

@ -30,12 +30,12 @@ function Node_Scale(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con
attribute_surface_depth(); attribute_surface_depth();
attribute_interpolation(); attribute_interpolation();
static step = function() { static step = function() { #region
var _surf = getSingleValue(0); var _surf = getSingleValue(0);
var _atlas = is_instanceof(_surf, SurfaceAtlas); var _atlas = is_instanceof(_surf, SurfaceAtlas);
inputs[| 5].setVisible(_atlas); inputs[| 5].setVisible(_atlas);
} } #endregion
static processData = function(_outSurf, _data, _output_index, _array_index) { static processData = function(_outSurf, _data, _output_index, _array_index) {
var scale = _data[1]; var scale = _data[1];

View file

@ -103,7 +103,7 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
inputs[| 32] = nodeValue("Rotate per radius", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0) inputs[| 32] = nodeValue("Rotate per radius", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0)
.setDisplay(VALUE_DISPLAY.rotation); .setDisplay(VALUE_DISPLAY.rotation);
inputs[| 33] = nodeValue("Random position", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [ 0, 0, 0, 0 ]) inputs[| 33] = nodeValue("Random position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector_range); .setDisplay(VALUE_DISPLAY.vector_range);
inputs[| 34] = nodeValue("Scale per radius", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ]) inputs[| 34] = nodeValue("Scale per radius", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ])
@ -112,17 +112,20 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
inputs[| 35] = nodeValue("Angle range", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 360 ]) inputs[| 35] = nodeValue("Angle range", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 360 ])
.setDisplay(VALUE_DISPLAY.rotation_range); .setDisplay(VALUE_DISPLAY.rotation_range);
inputs[| 36] = nodeValue("Shift position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
outputs[| 1] = nodeValue("Atlas data", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, []) outputs[| 1] = nodeValue("Atlas data", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, [])
.setVisible(false) .setVisible(false)
.rejectArrayProcess(); .rejectArrayProcess();
input_display_list = [ input_display_list = [ 10,
["Surfaces", true], 0, 1, 15, 10, 24, 25, 26, 27, ["Surfaces", true], 0, 1, 15, 24, 25, 26, 27,
["Scatter", false], 6, 5, 13, 14, 17, 9, 31, 2, 30, 35, ["Scatter", false], 6, 5, 13, 14, 17, 9, 31, 2, 30, 35,
["Path", false], 19, 20, 21, 22, ["Path", false], 19, 20, 21, 22,
["Position", false], 33, ["Position", false], 33, 36,
["Rotation", false], 7, 4, 32, ["Rotation", false], 7, 4, 32,
["Scale", false], 3, 8, 34, ["Scale", false], 3, 8, 34,
["Render", false], 18, 11, 28, 12, 16, 23, ["Render", false], 18, 11, 28, 12, 16, 23,
@ -264,6 +267,7 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
var posWig = _data[33]; var posWig = _data[33];
var uniSca = _data[34]; var uniSca = _data[34];
var cirRng = _data[35]; var cirRng = _data[35];
var posShf = _data[36];
var _in_w, _in_h; var _in_w, _in_h;
@ -467,6 +471,9 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
if(_wigX) _x += random_range(posWig[0], posWig[1]); if(_wigX) _x += random_range(posWig[0], posWig[1]);
if(_wigY) _y += random_range(posWig[2], posWig[3]); if(_wigY) _y += random_range(posWig[2], posWig[3]);
_x += posShf[0] * i;
_y += posShf[1] * i;
if(_unis) { if(_unis) {
_scy = max(_scx, _scy); _scy = max(_scx, _scy);
_scx = _scy; _scx = _scy;

View file

@ -18,7 +18,7 @@ function Node_Shadow_Cast(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou
if(!is_surface(_surf)) if(!is_surface(_surf))
return [1, 1]; return [1, 1];
return [surface_get_width_safe(_surf), surface_get_height_safe(_surf)]; return [ surface_get_width_safe(_surf), surface_get_height_safe(_surf) ];
}, VALUE_UNIT.reference); }, VALUE_UNIT.reference);
inputs[| 3] = nodeValue("Soft light radius", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1) inputs[| 3] = nodeValue("Soft light radius", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1)

View file

@ -335,6 +335,7 @@ function value_type_from_string(str) { #region
case "strands" : return VALUE_TYPE.strands; case "strands" : return VALUE_TYPE.strands;
case "mesh" : return VALUE_TYPE.mesh; case "mesh" : return VALUE_TYPE.mesh;
case "trigger" : return VALUE_TYPE.trigger; case "trigger" : return VALUE_TYPE.trigger;
case "atlas" : return VALUE_TYPE.atlas;
case "d3vertex" : return VALUE_TYPE.d3vertex; case "d3vertex" : return VALUE_TYPE.d3vertex;
case "gradient" : return VALUE_TYPE.gradient; case "gradient" : return VALUE_TYPE.gradient;
@ -343,17 +344,19 @@ function value_type_from_string(str) { #region
case "pbBox" : return VALUE_TYPE.pbBox; case "pbBox" : return VALUE_TYPE.pbBox;
case "d3Mesh" : return VALUE_TYPE.d3Mesh; case "d3Mesh" : return VALUE_TYPE.d3Mesh;
case "d3Light" : return VALUE_TYPE.d3Light; case "d3Light" : return VALUE_TYPE.d3Light;
case "d3Camera" : return VALUE_TYPE.d3Camera; case "d3Camera" : return VALUE_TYPE.d3Camera;
case "d3Scene" : return VALUE_TYPE.d3Scene; case "d3Scene" : return VALUE_TYPE.d3Scene;
case "d3Material" : return VALUE_TYPE.d3Material; case "d3Material" : return VALUE_TYPE.d3Material;
case "dynaSurface" : return VALUE_TYPE.dynaSurface; case "dynaSurface" : return VALUE_TYPE.dynaSurface;
case "PCXnode" : return VALUE_TYPE.PCXnode; case "PCXnode" : return VALUE_TYPE.PCXnode;
case "audioBit" : return VALUE_TYPE.audioBit; case "audioBit" : return VALUE_TYPE.audioBit;
case "fDomain" : return VALUE_TYPE.fdomain;
case "action" : return VALUE_TYPE.action; case "action" : return VALUE_TYPE.action;
} }
@ -751,6 +754,8 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
static resetValue = function() { #region static resetValue = function() { #region
unit.mode = def_unit; unit.mode = def_unit;
setValue(unit.apply(def_val)); setValue(unit.apply(def_val));
attributes.mapped = false;
is_modified = false; is_modified = false;
} #endregion } #endregion
@ -1922,6 +1927,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
static setValueInspector = function(val = 0, index = noone) { #region static setValueInspector = function(val = 0, index = noone) { #region
INLINE INLINE
var res = false; var res = false;
val = unit.invApply(val);
if(PANEL_INSPECTOR && PANEL_INSPECTOR.inspectGroup == 1) { if(PANEL_INSPECTOR && PANEL_INSPECTOR.inspectGroup == 1) {
var ind = self.index; var ind = self.index;

View file

@ -260,6 +260,12 @@ function Panel_Menu() : PanelContent() constructor {
__test_generate_theme(); __test_generate_theme();
}), }),
-1, -1,
menuItem(__txtx("panel_menu_test_warning", "Display Warning"), function() {
noti_warning("Error message")
}),
menuItem(__txtx("panel_menu_test_error", "Display Error"), function() {
noti_error("Error message")
}),
menuItem(__txtx("panel_menu_test_crash", "Force crash"), function() { menuItem(__txtx("panel_menu_test_crash", "Force crash"), function() {
print(1 + "a"); print(1 + "a");
}), }),

View file

@ -0,0 +1,73 @@
function Panel_Console() : PanelContent() constructor {
title = "Console";
w = ui(640);
h = ui(320);
command = "";
history = [];
cmd_history = [];
cmd_index = 0;
keyboard_string = "";
static submit_command = function() {
if(command == "") return;
array_push(history, { txt: command, color: COLORS._main_text_sub });
array_push(cmd_history, command);
var cmd = string_splice(command, " ");
switch(cmd[0]) {
case "flag":
if(array_length(cmd) < 2) break;
var flg = array_safe_get(cmd, 1, "");
global.FLAG[$ flg] = !global.FLAG[$ flg];
array_push(history, { txt: $"Toggled debug flag: {flg} = {global.FLAG[$ flg]? "True" : "False"}", color: COLORS._main_value_positive });
break;
}
keyboard_string = "";
command = "";
}
function drawContent(panel) {
HOTKEY_BLOCK = true;
command = keyboard_string;
draw_clear_alpha(CDEF.main_dkblack, 1);
draw_set_color(c_black);
draw_set_alpha(0.75);
draw_rectangle(0, h - ui(28), w, h, false);
draw_set_alpha(1);
draw_set_text(f_code, fa_left, fa_bottom, COLORS._main_text);
draw_text(ui(8), h - ui(4), command);
draw_set_color(COLORS._main_text_sub);
draw_text(ui(8) + string_width(command), h - ui(4), "_");
var hy = h - ui(32);
for( var i = 0; i < array_length(history); i++ ) {
var his = history[array_length(history) - i - 1];
var txt = his.txt;
draw_set_color(his.color);
draw_text_ext(ui(8), hy, txt, -1, w - ui(16));
hy -= string_height_ext(txt, -1, w - ui(16));
if(hy <= 0) break;
}
if(keyboard_check_pressed(vk_enter))
submit_command();
if(keyboard_check_pressed(vk_up)) {
cmd_index = max(0, cmd_index - 1);
keyboard_string = array_safe_get(cmd_history, cmd_index, "");
command = keyboard_string;
} else if(keyboard_check_pressed(vk_anykey))
cmd_index = array_length(cmd_history);
}
}

View file

@ -0,0 +1,27 @@
function Panel_Node_Canvas_Pressure(canvas) : Panel_Linear_Setting() constructor {
title = __txtx("pen_pressure_settings", "Per Pressure Settings");
w = ui(380);
self.canvas = canvas;
#region data
properties = [
new __Panel_Linear_Setting_Item(
__txt("Pressure"),
new checkBox(function() { canvas.tool_attribute.pressure = !canvas.tool_attribute.pressure; }),
function() { return canvas.tool_attribute.pressure; },
function(val) { canvas.tool_attribute.pressure = val; },
false,
),
new __Panel_Linear_Setting_Item(
__txt("Size"),
new vectorBox(2, function(in, val) { canvas.tool_attribute.pressure_size[in] = val; }),
function() { return canvas.tool_attribute.pressure_size; },
function(val) { canvas.tool_attribute.pressure_size = val; },
[ 1, 1 ],
),
];
setHeight();
#endregion
}

View file

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

View file

@ -1334,7 +1334,11 @@ function Panel_Preview() : PanelContent() constructor {
wdg.setFocusHover(pFOCUS, pHOVER); wdg.setFocusHover(pFOCUS, pHOVER);
switch(instanceof(wdg)) { switch(instanceof(wdg)) {
case "textBox" : tolw = ui(40); break; case "textBox" :
tolw = ui(40);
if(wdg.side_button != noone) tolw += tolh + ui(8);
break;
case "checkBoxGroup" : tolw = tolh * wdg.size; break; case "checkBoxGroup" : tolw = tolh * wdg.size; break;
case "checkBox" : tolw = tolh; break; case "checkBox" : tolw = tolh; break;
case "scrollBox" : tolw = ui(96); break; case "scrollBox" : tolw = ui(96); break;

View file

@ -146,6 +146,7 @@
ds_stack_push(call_st, con_if.if_true); ds_stack_push(call_st, con_if.if_true);
ds_stack_push(blok_st, con_if); ds_stack_push(blok_st, con_if);
continue; continue;
case "elseif": case "elseif":
var con_if = ds_stack_pop(blok_st); var con_if = ds_stack_pop(blok_st);
var con_elif = new __funcIf(); var con_elif = new __funcIf();
@ -155,12 +156,15 @@
ds_stack_push(call_st, con_elif.if_true); ds_stack_push(call_st, con_elif.if_true);
ds_stack_push(blok_st, con_elif); ds_stack_push(blok_st, con_elif);
continue; continue;
case "else": case "else":
var con_if = ds_stack_pop(blok_st); var con_if = ds_stack_pop(blok_st);
ds_stack_push(call_st, con_if.if_false); ds_stack_push(call_st, con_if.if_false);
continue; continue;
case "for": case "for":
var con_for = new __funcFor(); var con_for = new __funcFor();
var cond = string_splice(_cond, ":"); var cond = string_splice(_cond, ":");
if(array_length(cond) == 2) { if(array_length(cond) == 2) {
@ -323,8 +327,8 @@
vsl = string_trim(vsl); vsl = string_trim(vsl);
switch(vsl) { switch(vsl) {
case "e" : ds_stack_push(vl, 2.71828); break; case "e" : ds_stack_push(vl, 2.7182818284); break;
case "pi": ds_stack_push(vl, pi); break; case "pi": ds_stack_push(vl, pi); break;
default : ds_stack_push(vl, isNumber(vsl)? toNumber(vsl) : vsl); break; default : ds_stack_push(vl, isNumber(vsl)? toNumber(vsl) : vsl); break;
} }

View file

@ -148,7 +148,7 @@ function NodeListSort(_list, _nodeList) { #region
_nodeList[| i].topoSorted = false; _nodeList[| i].topoSorted = false;
ds_list_clear(_list); ds_list_clear(_list);
__sortGraph(_list, _nodeList); topoSort(_list, _nodeList);
} #endregion } #endregion
function __nodeIsRenderLeaf(_node) { #region function __nodeIsRenderLeaf(_node) { #region

View file

@ -102,6 +102,8 @@ function textArea(_input, _onModify) : textInput(_input, _onModify) constructor
cut_line(); cut_line();
undo_delay = 10; undo_delay = 10;
if(PEN_USE) keyboard_virtual_show(kbv_type_default, kbv_returnkey_default, kbv_autocapitalize_none, true);
} #endregion } #endregion
static deactivate = function() { #region static deactivate = function() { #region
@ -110,6 +112,8 @@ function textArea(_input, _onModify) : textInput(_input, _onModify) constructor
apply(); apply();
WIDGET_CURRENT = noone; WIDGET_CURRENT = noone;
UNDO_HOLDING = false; UNDO_HOLDING = false;
if(PEN_USE) keyboard_virtual_hide();
} #endregion } #endregion
static isCodeFormat = function() { INLINE return format == TEXT_AREA_FORMAT.codeLUA || format == TEXT_AREA_FORMAT.codeHLSL; } static isCodeFormat = function() { INLINE return format == TEXT_AREA_FORMAT.codeLUA || format == TEXT_AREA_FORMAT.codeHLSL; }
@ -756,9 +760,11 @@ function textArea(_input, _onModify) : textInput(_input, _onModify) constructor
w = _w; w = _w;
if(side_button && instanceof(side_button) == "buttonClass") { if(side_button && instanceof(side_button) == "buttonClass") {
var bs = min(h, ui(32));
side_button.setFocusHover(active, hover); side_button.setFocusHover(active, hover);
side_button.draw(_x + _w - ui(32), _y + _h / 2 - ui(32 / 2), ui(32), ui(32), _m, THEME.button_hide); side_button.draw(_x + _w - bs, _y + _h / 2 - bs / 2, bs, bs, _m, THEME.button_hide);
_w -= ui(40); _w -= bs + ui(8);
} }
var tx = ui(8); var tx = ui(8);

View file

@ -113,6 +113,8 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
KEYBOARD_STRING = ""; KEYBOARD_STRING = "";
keyboard_lastkey = -1; keyboard_lastkey = -1;
if(PEN_USE) keyboard_virtual_show(input == TEXTBOX_INPUT.number? kbv_type_numbers : kbv_type_default, kbv_returnkey_default, kbv_autocapitalize_none, true);
} #endregion } #endregion
static deactivate = function() { #region static deactivate = function() { #region
@ -121,6 +123,8 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
apply(); apply();
WIDGET_CURRENT = noone; WIDGET_CURRENT = noone;
UNDO_HOLDING = false; UNDO_HOLDING = false;
if(PEN_USE) keyboard_virtual_hide();
} #endregion } #endregion
static onKey = function(key) { #region static onKey = function(key) { #region
@ -372,9 +376,11 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
} }
if(side_button && instanceof(side_button) == "buttonClass") { if(side_button && instanceof(side_button) == "buttonClass") {
var bs = min(h, ui(32));
side_button.setFocusHover(active, hover); side_button.setFocusHover(active, hover);
side_button.draw(_x + _w - ui(32), _y + _h / 2 - ui(32 / 2), ui(32), ui(32), _m, THEME.button_hide); side_button.draw(_x + _w - bs, _y + _h / 2 - bs / 2, bs, bs, _m, THEME.button_hide);
_w -= ui(40); _w -= bs + ui(8);
} }
draw_set_font(font == noone? f_p0 : font); draw_set_font(font == noone? f_p0 : font);

View file

@ -1,6 +1,3 @@
//
// Simple passthrough fragment shader
//
varying vec2 v_vTexcoord; varying vec2 v_vTexcoord;
varying vec4 v_vColour; varying vec4 v_vColour;
@ -14,13 +11,150 @@ uniform int sampleMode;
uniform int overrideColor; uniform int overrideColor;
uniform vec4 overColor; uniform vec4 overColor;
float sampleMask() { uniform int useGradient;
#region //////////////////////////////////// GRADIENT ////////////////////////////////////
#define GRADIENT_LIMIT 128
uniform int gradient_blend;
uniform vec4 gradient_color[GRADIENT_LIMIT];
uniform float gradient_time[GRADIENT_LIMIT];
uniform int gradient_keys;
uniform int gradient_use_map;
uniform vec4 gradient_map_range;
uniform sampler2D gradient_map;
vec3 linearToGamma(vec3 c) { return pow(c, vec3( 2.2)); }
vec3 gammaToLinear(vec3 c) { return pow(c, vec3(1. / 2.2)); }
vec3 rgbMix(vec3 c1, vec3 c2, float t) { #region
vec3 k1 = linearToGamma(c1);
vec3 k2 = linearToGamma(c2);
return gammaToLinear(mix(k1, k2, t));
} #endregion
vec3 rgb2oklab(vec3 c) { #region
const mat3 kCONEtoLMS = mat3(
0.4121656120, 0.2118591070, 0.0883097947,
0.5362752080, 0.6807189584, 0.2818474174,
0.0514575653, 0.1074065790, 0.6302613616);
c = pow(c, vec3(2.2));
c = pow( kCONEtoLMS * c, vec3(1.0 / 3.0) );
return c;
} #endregion
vec3 oklab2rgb(vec3 c) { #region
const mat3 kLMStoCONE = mat3(
4.0767245293, -1.2681437731, -0.0041119885,
-3.3072168827, 2.6093323231, -0.7034763098,
0.2307590544, -0.3411344290, 1.7068625689);
c = kLMStoCONE * (c * c * c);
c = pow(c, vec3(1. / 2.2));
return c;
} #endregion
vec3 oklabMax(vec3 c1, vec3 c2, float t) { #region
vec3 k1 = rgb2oklab(c1);
vec3 k2 = rgb2oklab(c2);
return oklab2rgb(mix(k1, k2, t));
} #endregion
vec3 rgb2hsv(vec3 c) { #region
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
float d = q.x - min(q.w, q.y);
float e = 0.0000000001;
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
} #endregion
vec3 hsv2rgb(vec3 c) { #region
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
} #endregion
float hueDist(float a0, float a1, float t) { #region
float da = fract(a1 - a0);
float ds = fract(2. * da) - da;
return a0 + ds * t;
} #endregion
vec3 hsvMix(vec3 c1, vec3 c2, float t) { #region
vec3 h1 = rgb2hsv(c1);
vec3 h2 = rgb2hsv(c2);
vec3 h = vec3(0.);
h.x = h.x + hueDist(h1.x, h2.x, t);
h.y = mix(h1.y, h2.y, t);
h.z = mix(h1.z, h2.z, t);
return hsv2rgb(h);
} #endregion
vec4 gradientEval(in float prog) { #region
if(gradient_use_map == 1) {
vec2 samplePos = mix(gradient_map_range.xy, gradient_map_range.zw, prog);
return texture2D( gradient_map, samplePos );
}
vec4 col = vec4(0.);
for(int i = 0; i < GRADIENT_LIMIT; i++) {
if(gradient_time[i] == prog) {
col = gradient_color[i];
break;
} else if(gradient_time[i] > prog) {
if(i == 0)
col = gradient_color[i];
else {
float t = (prog - gradient_time[i - 1]) / (gradient_time[i] - gradient_time[i - 1]);
vec3 c0 = gradient_color[i - 1].rgb;
vec3 c1 = gradient_color[i].rgb;
float a = mix(gradient_color[i - 1].a, gradient_color[i].a, t);
if(gradient_blend == 0)
col = vec4(mix(c0, c1, t), a);
else if(gradient_blend == 1)
col = gradient_color[i - 1];
else if(gradient_blend == 2)
col = vec4(hsvMix(c0, c1, t), a);
else if(gradient_blend == 3)
col = vec4(oklabMax(c0, c1, t), a);
else if(gradient_blend == 4)
col = vec4(rgbMix(c0, c1, t), a);
}
break;
}
if(i >= gradient_keys - 1) {
col = gradient_color[gradient_keys - 1];
break;
}
}
return col;
} #endregion
#endregion //////////////////////////////////// GRADIENT ////////////////////////////////////
float sampleMask() { #region
if(useMask == 0) return 1.; if(useMask == 0) return 1.;
vec4 m = texture2D( mask, v_vTexcoord ); vec4 m = texture2D( mask, v_vTexcoord );
return (m.r + m.g + m.b) / 3. * m.a; return (m.r + m.g + m.b) / 3. * m.a;
} } #endregion
vec4 sampleTexture(vec2 pos) { vec4 sampleTexture(vec2 pos) { #region
if(pos.x >= 0. && pos.y >= 0. && pos.x <= 1. && pos.y <= 1.) if(pos.x >= 0. && pos.y >= 0. && pos.x <= 1. && pos.y <= 1.)
return texture2D(gm_BaseTexture, pos); return texture2D(gm_BaseTexture, pos);
@ -37,9 +171,9 @@ vec4 sampleTexture(vec2 pos) {
return vec4(vec3(0.), 1.); return vec4(vec3(0.), 1.);
return vec4(0.); return vec4(0.);
} } #endregion
void main() { void main() { #region
vec4 clr = vec4(0.); vec4 clr = vec4(0.);
float totalWeight = 0.; float totalWeight = 0.;
vec2 texel = 1. / dimension; vec2 texel = 1. / dimension;
@ -53,27 +187,33 @@ void main() {
} else if(realSize < 2.) } else if(realSize < 2.)
realSize = 1.; realSize = 1.;
float cel = ceil(realSize); float cel = ceil(realSize);
float frac = fract(realSize); float frac = fract(realSize);
float weiTotal = 0.;
for( float i = -cel; i <= cel; i++ ) for( float i = -cel; i <= cel; i++ )
for( float j = -cel; j <= cel; j++ ) { for( float j = -cel; j <= cel; j++ ) {
if(i + j >= cel * 2.) continue; if(abs(i + j) >= cel * 2.) continue;
vec4 sam = sampleTexture( v_vTexcoord + vec2(i, j) * texel ); vec4 sam = sampleTexture( v_vTexcoord + vec2(i, j) * texel );
float wei = 1. - (abs(i) + abs(j)) / (realSize * 2.); float wei = 1. - (abs(i) + abs(j)) / (realSize * 2.);
wei *= clamp(abs(i + j - floor(realSize) * 2.), 0., 1.); wei *= clamp(abs(i + j - floor(realSize) * 2.), 0., 1.);
totalWeight += wei; totalWeight += wei;
weiTotal += wei * (sam.r + sam.g + sam.b) / 3. * sam.a;
clr += sam * wei; clr += sam * wei;
} }
clr /= totalWeight; clr /= totalWeight;
gl_FragColor = clr;
if(overrideColor == 1) { if(overrideColor == 1) {
gl_FragColor.rgb = overColor.rgb; clr.rgb = overColor.rgb;
gl_FragColor.a *= overColor.a; clr.a *= overColor.a;
} }
}
if(useGradient == 1)
clr *= gradientEval(1. - weiTotal / totalWeight);
gl_FragColor = clr;
} #endregion

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,74 @@
{
"resourceType": "GMSprite",
"resourceVersion": "1.0",
"name": "s_node_vfx_triangulate",
"bbox_bottom": 60,
"bbox_left": 5,
"bbox_right": 58,
"bbox_top": 3,
"bboxMode": 0,
"collisionKind": 1,
"collisionTolerance": 0,
"DynamicTexturePage": false,
"edgeFiltering": false,
"For3D": false,
"frames": [
{"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"b6b2272d-e49a-4f8c-ac7b-46473f4ee1b6",},
],
"gridX": 0,
"gridY": 0,
"height": 64,
"HTile": false,
"layers": [
{"resourceType":"GMImageLayer","resourceVersion":"1.0","name":"8511e3a0-0f83-4001-b767-e8cc525e1f93","blendMode":0,"displayName":"default","isLocked":false,"opacity":100.0,"visible":true,},
],
"nineSlice": null,
"origin": 4,
"parent": {
"name": "VFX",
"path": "folders/nodes/icons/VFX.yy",
},
"preMultiplyAlpha": false,
"sequence": {
"resourceType": "GMSequence",
"resourceVersion": "1.4",
"name": "s_node_vfx_triangulate",
"autoRecord": true,
"backdropHeight": 768,
"backdropImageOpacity": 0.5,
"backdropImagePath": "",
"backdropWidth": 1366,
"backdropXOffset": 0.0,
"backdropYOffset": 0.0,
"events": {"resourceType":"KeyframeStore<MessageEventKeyframe>","resourceVersion":"1.0","Keyframes":[],},
"eventStubScript": null,
"eventToFunction": {},
"length": 1.0,
"lockOrigin": false,
"moments": {"resourceType":"KeyframeStore<MomentsEventKeyframe>","resourceVersion":"1.0","Keyframes":[],},
"playback": 1,
"playbackSpeed": 30.0,
"playbackSpeedType": 0,
"showBackdrop": true,
"showBackdropImage": false,
"timeUnits": 1,
"tracks": [
{"resourceType":"GMSpriteFramesTrack","resourceVersion":"1.0","name":"frames","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"resourceType":"KeyframeStore<SpriteFrameKeyframe>","resourceVersion":"1.0","Keyframes":[
{"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"b6b2272d-e49a-4f8c-ac7b-46473f4ee1b6","path":"sprites/s_node_vfx_triangulate/s_node_vfx_triangulate.yy",},},},"Disabled":false,"id":"41a7f272-2b57-427a-9302-735209227d4f","IsCreationKey":false,"Key":0.0,"Length":1.0,"Stretch":false,},
],},"modifiers":[],"spriteId":null,"trackColour":0,"tracks":[],"traits":0,},
],
"visibleRange": null,
"volume": 1.0,
"xorigin": 32,
"yorigin": 32,
},
"swatchColours": null,
"swfPrecision": 2.525,
"textureGroupId": {
"name": "Default",
"path": "texturegroups/Default",
},
"type": 0,
"VTile": false,
"width": 64,
}