- [Patreon exclusive] New extra perlin noises node.

This commit is contained in:
Tanasart 2023-11-15 20:42:53 +07:00
parent 265f7c997e
commit e8418a809c
84 changed files with 1057 additions and 55144 deletions

View file

@ -494,6 +494,7 @@
{"name":"s_workshop_badge","order":1,"path":"sprites/s_workshop_badge/s_workshop_badge.yy",},
{"name":"node_pb_fx_brick","order":12,"path":"scripts/node_pb_fx_brick/node_pb_fx_brick.yy",},
{"name":"node_compare","order":16,"path":"scripts/node_compare/node_compare.yy",},
{"name":"node_3d_transform","order":6,"path":"scripts/node_3d_transform/node_3d_transform.yy",},
{"name":"node_iterator_each_size","order":3,"path":"scripts/node_iterator_each_size/node_iterator_each_size.yy",},
{"name":"panel_console","order":8,"path":"scripts/panel_console/panel_console.yy",},
{"name":"s_node_HSV_combine","order":44,"path":"sprites/s_node_HSV_combine/s_node_HSV_combine.yy",},
@ -538,7 +539,7 @@
{"name":"text_file","order":5,"path":"scripts/text_file/text_file.yy",},
{"name":"node_armature_pose","order":3,"path":"scripts/node_armature_pose/node_armature_pose.yy",},
{"name":"s_node_pb_draw_diamond","order":29,"path":"sprites/s_node_pb_draw_diamond/s_node_pb_draw_diamond.yy",},
{"name":"node_3d_transform","order":4,"path":"scripts/node_3d_transform/node_3d_transform.yy",},
{"name":"node_3d_transform_scene","order":4,"path":"scripts/node_3d_transform_scene/node_3d_transform_scene.yy",},
{"name":"sh_trail_filler_pass1","order":49,"path":"shaders/sh_trail_filler_pass1/sh_trail_filler_pass1.yy",},
{"name":"s_node_vfx_wind","order":3,"path":"sprites/s_node_vfx_wind/s_node_vfx_wind.yy",},
{"name":"s_node_pb_fx_strip","order":26,"path":"sprites/s_node_pb_fx_strip/s_node_pb_fx_strip.yy",},
@ -1028,6 +1029,7 @@
{"name":"sh_greyscale","order":13,"path":"shaders/sh_greyscale/sh_greyscale.yy",},
{"name":"gameframe_native","order":2,"path":"extensions/gameframe_native/gameframe_native.yy",},
{"name":"s_node_pb_box_mirror","order":21,"path":"sprites/s_node_pb_box_mirror/s_node_pb_box_mirror.yy",},
{"name":"__node_shader_generator","order":22,"path":"scripts/__node_shader_generator/__node_shader_generator.yy",},
{"name":"node_global","order":3,"path":"scripts/node_global/node_global.yy",},
{"name":"spr_gameframe_buttons","order":1,"path":"sprites/spr_gameframe_buttons/spr_gameframe_buttons.yy",},
{"name":"s_node_draw_stack","order":4,"path":"sprites/s_node_draw_stack/s_node_draw_stack.yy",},
@ -1067,6 +1069,7 @@
{"name":"s_node_flood_fill","order":24,"path":"sprites/s_node_flood_fill/s_node_flood_fill.yy",},
{"name":"json_compare","order":21,"path":"scripts/json_compare/json_compare.yy",},
{"name":"node_rigid_force_apply","order":4,"path":"scripts/node_rigid_force_apply/node_rigid_force_apply.yy",},
{"name":"__node_shader","order":21,"path":"scripts/__node_shader/__node_shader.yy",},
{"name":"__node_iterator","order":6,"path":"scripts/__node_iterator/__node_iterator.yy",},
{"name":"s_node_rigid_variable","order":8,"path":"sprites/s_node_rigid_variable/s_node_rigid_variable.yy",},
{"name":"safe_operation","order":6,"path":"scripts/safe_operation/safe_operation.yy",},
@ -1142,6 +1145,7 @@
{"name":"node_PCX_fn_surface_width","order":1,"path":"scripts/node_PCX_fn_surface_width/node_PCX_fn_surface_width.yy",},
{"name":"o_main","order":1,"path":"objects/o_main/o_main.yy",},
{"name":"area_function","order":2,"path":"scripts/area_function/area_function.yy",},
{"name":"__node_shader_processor","order":23,"path":"scripts/__node_shader_processor/__node_shader_processor.yy",},
{"name":"Obj_FirebaseFirestore_Collection_Query_options_value","order":11,"path":"objects/Obj_FirebaseFirestore_Collection_Query_options_value/Obj_FirebaseFirestore_Collection_Query_options_value.yy",},
{"name":"__node_3d_mesh","order":1,"path":"scripts/__node_3d_mesh/__node_3d_mesh.yy",},
{"name":"d3d_surface_extrude","order":7,"path":"scripts/d3d_surface_extrude/d3d_surface_extrude.yy",},
@ -1198,6 +1202,7 @@
{"name":"Obj_FirebaseREST_Listener_On_firestore_document","order":3,"path":"objects/Obj_FirebaseREST_Listener_On_firestore_document/Obj_FirebaseREST_Listener_On_firestore_document.yy",},
{"name":"sh_blend_add_alpha_adj","order":2,"path":"shaders/sh_blend_add_alpha_adj/sh_blend_add_alpha_adj.yy",},
{"name":"preview_overlay_area","order":3,"path":"scripts/preview_overlay_area/preview_overlay_area.yy",},
{"name":"sh_perlin_extra","order":9,"path":"shaders/sh_perlin_extra/sh_perlin_extra.yy",},
{"name":"node_text","order":4,"path":"scripts/node_text/node_text.yy",},
{"name":"panel_collection","order":3,"path":"scripts/panel_collection/panel_collection.yy",},
{"name":"node_string_trim","order":4,"path":"scripts/node_string_trim/node_string_trim.yy",},
@ -1551,6 +1556,7 @@
{"name":"sh_blend_screen","order":3,"path":"shaders/sh_blend_screen/sh_blend_screen.yy",},
{"name":"node_group_output","order":2,"path":"scripts/node_group_output/node_group_output.yy",},
{"name":"s_node_palette_extract","order":12,"path":"sprites/s_node_palette_extract/s_node_palette_extract.yy",},
{"name":"node_perlin_extra","order":10,"path":"scripts/node_perlin_extra/node_perlin_extra.yy",},
{"name":"node_palette_replacement","order":2,"path":"scripts/node_palette_replacement/node_palette_replacement.yy",},
{"name":"s_node_scatter","order":19,"path":"sprites/s_node_scatter/s_node_scatter.yy",},
{"name":"s_node_bokeh","order":51,"path":"sprites/s_node_bokeh/s_node_bokeh.yy",},

View file

@ -673,7 +673,6 @@
{"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_inner_bg.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",},
@ -719,7 +718,7 @@
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"1 image import.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"1 image import.pxc","CopyToMask":-1,"filePath":"datafiles/Getting started",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"10 RigidSim.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"11 Fluid sim.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"11 Smoke sim.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"12 Strand sim.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"13 Expression.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"14 Audio.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
@ -742,9 +741,6 @@
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"card_clubs_03.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"card_clubs_04.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"card_clubs_05.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"back-buildings.png","CopyToMask":-1,"filePath":"datafiles/Getting started/cyberpunk street",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"far-buildings.png","CopyToMask":-1,"filePath":"datafiles/Getting started/cyberpunk street",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"foreground.png","CopyToMask":-1,"filePath":"datafiles/Getting started/cyberpunk street",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"dice_1.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"dice_2.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"dice_3.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
@ -1092,6 +1088,7 @@
{"id":{"name":"s_workshop_badge","path":"sprites/s_workshop_badge/s_workshop_badge.yy",},},
{"id":{"name":"node_pb_fx_brick","path":"scripts/node_pb_fx_brick/node_pb_fx_brick.yy",},},
{"id":{"name":"node_compare","path":"scripts/node_compare/node_compare.yy",},},
{"id":{"name":"node_3d_transform","path":"scripts/node_3d_transform/node_3d_transform.yy",},},
{"id":{"name":"node_iterator_each_size","path":"scripts/node_iterator_each_size/node_iterator_each_size.yy",},},
{"id":{"name":"sh_trans_node_prev_drop","path":"shaders/sh_trans_node_prev_drop/sh_trans_node_prev_drop.yy",},},
{"id":{"name":"fd_draw_self_to_collision_mask_surface","path":"scripts/fd_draw_self_to_collision_mask_surface/fd_draw_self_to_collision_mask_surface.yy",},},
@ -1145,7 +1142,7 @@
{"id":{"name":"text_file","path":"scripts/text_file/text_file.yy",},},
{"id":{"name":"node_armature_pose","path":"scripts/node_armature_pose/node_armature_pose.yy",},},
{"id":{"name":"s_node_pb_draw_diamond","path":"sprites/s_node_pb_draw_diamond/s_node_pb_draw_diamond.yy",},},
{"id":{"name":"node_3d_transform","path":"scripts/node_3d_transform/node_3d_transform.yy",},},
{"id":{"name":"node_3d_transform_scene","path":"scripts/node_3d_transform_scene/node_3d_transform_scene.yy",},},
{"id":{"name":"sh_trail_filler_pass1","path":"shaders/sh_trail_filler_pass1/sh_trail_filler_pass1.yy",},},
{"id":{"name":"s_node_vfx_wind","path":"sprites/s_node_vfx_wind/s_node_vfx_wind.yy",},},
{"id":{"name":"s_node_pb_fx_strip","path":"sprites/s_node_pb_fx_strip/s_node_pb_fx_strip.yy",},},
@ -1706,6 +1703,7 @@
{"id":{"name":"sh_greyscale","path":"shaders/sh_greyscale/sh_greyscale.yy",},},
{"id":{"name":"gameframe_native","path":"extensions/gameframe_native/gameframe_native.yy",},},
{"id":{"name":"s_node_pb_box_mirror","path":"sprites/s_node_pb_box_mirror/s_node_pb_box_mirror.yy",},},
{"id":{"name":"__node_shader_generator","path":"scripts/__node_shader_generator/__node_shader_generator.yy",},},
{"id":{"name":"node_global","path":"scripts/node_global/node_global.yy",},},
{"id":{"name":"spr_gameframe_buttons","path":"sprites/spr_gameframe_buttons/spr_gameframe_buttons.yy",},},
{"id":{"name":"s_node_draw_stack","path":"sprites/s_node_draw_stack/s_node_draw_stack.yy",},},
@ -1748,6 +1746,7 @@
{"id":{"name":"s_node_flood_fill","path":"sprites/s_node_flood_fill/s_node_flood_fill.yy",},},
{"id":{"name":"json_compare","path":"scripts/json_compare/json_compare.yy",},},
{"id":{"name":"node_rigid_force_apply","path":"scripts/node_rigid_force_apply/node_rigid_force_apply.yy",},},
{"id":{"name":"__node_shader","path":"scripts/__node_shader/__node_shader.yy",},},
{"id":{"name":"__node_iterator","path":"scripts/__node_iterator/__node_iterator.yy",},},
{"id":{"name":"s_node_rigid_variable","path":"sprites/s_node_rigid_variable/s_node_rigid_variable.yy",},},
{"id":{"name":"safe_operation","path":"scripts/safe_operation/safe_operation.yy",},},
@ -1832,6 +1831,7 @@
{"id":{"name":"node_PCX_fn_surface_width","path":"scripts/node_PCX_fn_surface_width/node_PCX_fn_surface_width.yy",},},
{"id":{"name":"o_main","path":"objects/o_main/o_main.yy",},},
{"id":{"name":"area_function","path":"scripts/area_function/area_function.yy",},},
{"id":{"name":"__node_shader_processor","path":"scripts/__node_shader_processor/__node_shader_processor.yy",},},
{"id":{"name":"Obj_FirebaseFirestore_Collection_Query_options_value","path":"objects/Obj_FirebaseFirestore_Collection_Query_options_value/Obj_FirebaseFirestore_Collection_Query_options_value.yy",},},
{"id":{"name":"__node_3d_mesh","path":"scripts/__node_3d_mesh/__node_3d_mesh.yy",},},
{"id":{"name":"Obj_FirebaseFirestore_Collection_Query","path":"objects/Obj_FirebaseFirestore_Collection_Query/Obj_FirebaseFirestore_Collection_Query.yy",},},
@ -1894,6 +1894,7 @@
{"id":{"name":"Obj_FirebaseREST_Listener_On_firestore_document","path":"objects/Obj_FirebaseREST_Listener_On_firestore_document/Obj_FirebaseREST_Listener_On_firestore_document.yy",},},
{"id":{"name":"sh_blend_add_alpha_adj","path":"shaders/sh_blend_add_alpha_adj/sh_blend_add_alpha_adj.yy",},},
{"id":{"name":"preview_overlay_area","path":"scripts/preview_overlay_area/preview_overlay_area.yy",},},
{"id":{"name":"sh_perlin_extra","path":"shaders/sh_perlin_extra/sh_perlin_extra.yy",},},
{"id":{"name":"node_text","path":"scripts/node_text/node_text.yy",},},
{"id":{"name":"panel_collection","path":"scripts/panel_collection/panel_collection.yy",},},
{"id":{"name":"contextMenu_controller","path":"scripts/contextMenu_controller/contextMenu_controller.yy",},},
@ -2307,6 +2308,7 @@
{"id":{"name":"sh_blend_screen","path":"shaders/sh_blend_screen/sh_blend_screen.yy",},},
{"id":{"name":"node_group_output","path":"scripts/node_group_output/node_group_output.yy",},},
{"id":{"name":"s_node_palette_extract","path":"sprites/s_node_palette_extract/s_node_palette_extract.yy",},},
{"id":{"name":"node_perlin_extra","path":"scripts/node_perlin_extra/node_perlin_extra.yy",},},
{"id":{"name":"node_palette_replacement","path":"scripts/node_palette_replacement/node_palette_replacement.yy",},},
{"id":{"name":"s_node_scatter","path":"sprites/s_node_scatter/s_node_scatter.yy",},},
{"id":{"name":"s_node_bokeh","path":"sprites/s_node_bokeh/s_node_bokeh.yy",},},

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 2 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -73,6 +73,7 @@ event_inherited();
if(node_called == noone && junction_hovering == noone) return true;
if(!struct_has(node, "node")) return true;
if(!struct_has(global.NODE_GUIDE, node.node)) return true;
if(is_instanceof(node, NodeObject) && node.is_patreon_extra && !IS_PATREON) return false;
var io = global.NODE_GUIDE[$ node.node];
@ -156,7 +157,7 @@ event_inherited();
if(category == NODE_CATEGORY && _node.show_in_recent) {
array_remove(global.RECENT_NODES, _node.node);
array_insert(global.RECENT_NODES, 0, _node.node);
if(array_length(global.RECENT_NODES) > 20)
if(array_length(global.RECENT_NODES) > PREFERENCES.node_recents_amount)
array_pop(global.RECENT_NODES);
}
@ -433,17 +434,7 @@ event_inherited();
else if(mouse_press(mb_right, sFOCUS))
rightClick(_node);
}
var spr_x = _boxx + grid_size / 2;
var spr_y = yy + grid_size / 2;
if(variable_struct_exists(_node, "getSpr")) _node.getSpr();
if(sprite_exists(_node.spr))
draw_sprite_ui_uniform(_node.spr, 0, spr_x, spr_y, 0.5);
if(is_instanceof(_node, NodeAction))
draw_sprite_ui_uniform(THEME.play_action, 0, _boxx + grid_size - 16, yy + grid_size - 16, 1, COLORS.add_node_blend_action);
if(_node.getTooltip() != "") {
if(point_in_rectangle(_m[0], _m[1], _boxx, yy, _boxx + ui(16), yy + ui(16))) {
draw_sprite_ui_uniform(THEME.info, 0, _boxx + ui(8), yy + ui(8), 0.7, COLORS._main_icon, 1.0);
@ -454,19 +445,18 @@ event_inherited();
draw_sprite_ui_uniform(THEME.info, 0, _boxx + ui(8), yy + ui(8), 0.7, COLORS._main_icon, 0.5);
}
if(_node.new_node) {
draw_sprite_ui_uniform(THEME.node_new_badge, 0, _boxx + grid_size - ui(12), yy + ui(6),, COLORS._main_accent);
draw_sprite_ui_uniform(THEME.node_new_badge, 1, _boxx + grid_size - ui(12), yy + ui(6));
}
if(struct_try_get(_node, "deprecated")) {
draw_sprite_ui_uniform(THEME.node_deprecated_badge, 0, _boxx + grid_size - ui(12), yy + ui(6),, COLORS._main_value_negative);
draw_sprite_ui_uniform(THEME.node_deprecated_badge, 1, _boxx + grid_size - ui(12), yy + ui(6));
}
if(is_instanceof(_node, NodeObject)) {
var fav = array_exists(global.FAV_NODES, _node.node);
if(fav) draw_sprite_ui_uniform(THEME.star, 0, _boxx + grid_size - ui(10), yy + grid_size - ui(10), 0.7, COLORS._main_accent, 1.);
_node.drawGrid(_boxx, yy, _m[0], _m[1], grid_size);
} else {
var spr_x = _boxx + grid_size / 2;
var spr_y = yy + grid_size / 2;
if(variable_struct_exists(_node, "getSpr")) _node.getSpr();
if(sprite_exists(_node.spr))
draw_sprite_ui_uniform(_node.spr, 0, spr_x, spr_y, 0.5);
if(is_instanceof(_node, NodeAction))
draw_sprite_ui_uniform(THEME.play_action, 0, _boxx + grid_size - 16, yy + grid_size - 16, 1, COLORS.add_node_blend_action);
}
var _name = _node.getName();
@ -486,24 +476,26 @@ event_inherited();
}
}
var len = array_length(group_labels);
if(len) {
gpu_set_blendmode(bm_subtract);
draw_set_color(c_white);
draw_rectangle(0, 0, content_pane.surface_w, ui(16 + 24 / 2), false);
gpu_set_blendmode(bm_normal);
}
if(ADD_NODE_PAGE > -1 && PREFERENCES.dialog_add_node_grouping) {
var len = array_length(group_labels);
if(len) {
gpu_set_blendmode(bm_subtract);
draw_set_color(c_white);
draw_rectangle(0, 0, content_pane.surface_w, ui(16 + 24 / 2), false);
gpu_set_blendmode(bm_normal);
}
for( var i = 0; i < len; i++ ) {
var lb = group_labels[i];
var _yy = max(lb.y, i == len - 1? ui(8) : min(ui(8), group_labels[i + 1].y - ui(32)));
BLEND_OVERRIDE;
draw_sprite_stretched_ext(THEME.group_label, 0, ui(16), _yy, content_pane.surface_w - ui(32), ui(24), c_white, 0.3);
BLEND_NORMAL;
for( var i = 0; i < len; i++ ) {
var lb = group_labels[i];
var _yy = max(lb.y, i == len - 1? ui(8) : min(ui(8), group_labels[i + 1].y - ui(32)));
draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text);
draw_text(ui(16 + 16), _yy + ui(12), lb.text);
BLEND_OVERRIDE;
draw_sprite_stretched_ext(THEME.group_label, 0, ui(16), _yy, content_pane.surface_w - ui(32), ui(24), c_white, 0.3);
BLEND_NORMAL;
draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text);
draw_text(ui(16 + 16), _yy + ui(12), lb.text);
}
}
hh += curr_height;
@ -540,78 +532,67 @@ event_inherited();
if(++bg_ind % 2) {
BLEND_OVERRIDE;
draw_sprite_stretched_ext(THEME.node_bg, 0, ui(4), yy, list_width - ui(8), list_height, c_white, 0.2);
draw_sprite_stretched_ext(THEME.node_bg, 0, ui(16), yy, list_width - ui(32), list_height, c_white, 0.1);
BLEND_NORMAL;
}
if(_hover && point_in_rectangle(_m[0], _m[1], 0, yy, list_width, yy + list_height - 1)) {
if(_node.getTooltip() != "") {
node_tooltip = _node;
node_tooltip_x = content_pane.x + 0;
node_tooltip_x = content_pane.x + ui(16);
node_tooltip_y = content_pane.y + yy
}
draw_sprite_stretched_ext(THEME.node_active, 0, ui(4), yy, list_width - ui(8), list_height, COLORS._main_accent, 1);
draw_sprite_stretched_ext(THEME.node_active, 0, ui(16), yy, list_width - ui(32), list_height, COLORS._main_accent, 1);
if(mouse_press(mb_left, sFOCUS))
buildNode(_node);
else if(mouse_press(mb_right, sFOCUS))
rightClick(_node);
}
var tx = list_height + ui(52);
if(is_instanceof(_node, NodeObject)) {
var fav = array_exists(global.FAV_NODES, _node.node);
if(fav) draw_sprite_ui_uniform(THEME.star, 0, ui(20), yy + list_height / 2, 0.7, COLORS._main_accent, 1.);
}
var spr_x = list_height / 2 + ui(32);
var spr_y = yy + list_height / 2;
if(variable_struct_exists(_node, "getSpr")) _node.getSpr();
if(sprite_exists(_node.spr)) {
var ss = (list_height - ui(8)) / max(sprite_get_width(_node.spr), sprite_get_height(_node.spr));
draw_sprite_ext(_node.spr, 0, spr_x, spr_y, ss, ss, 0, c_white, 1);
}
if(is_instanceof(_node, NodeAction))
draw_sprite_ui_uniform(THEME.play_action, 0, spr_x + list_height / 2 - 8, spr_y + list_height / 2 - 8, 0.5, COLORS.add_node_blend_action);
tx = _node.drawList(0, yy, _m[0], _m[1], list_height);
} else {
var spr_x = list_height / 2 + ui(44);
var spr_y = yy + list_height / 2;
var tx = list_height + ui(40);
if(_node.new_node) {
draw_sprite_ui_uniform(THEME.node_new_badge, 0, tx + ui(16), yy + list_height / 2 + ui(1),, COLORS._main_accent);
draw_sprite_ui_uniform(THEME.node_new_badge, 1, tx + ui(16), yy + list_height / 2 + ui(1));
tx += ui(40);
if(variable_struct_exists(_node, "getSpr")) _node.getSpr();
if(sprite_exists(_node.spr)) {
var ss = (list_height - ui(8)) / max(sprite_get_width(_node.spr), sprite_get_height(_node.spr));
draw_sprite_ext(_node.spr, 0, spr_x, spr_y, ss, ss, 0, c_white, 1);
}
if(is_instanceof(_node, NodeAction))
draw_sprite_ui_uniform(THEME.play_action, 0, spr_x + list_height / 2 - 8, spr_y + list_height / 2 - 8, 0.5, COLORS.add_node_blend_action);
draw_set_text(f_p2, fa_left, fa_center, COLORS._main_text);
draw_text_add(tx, yy + list_height / 2, _node.getName());
}
if(struct_try_get(_node, "deprecated")) {
draw_sprite_ui_uniform(THEME.node_deprecated_badge, 0, tx + ui(16), yy + list_height / 2 + ui(1),, COLORS._main_value_negative);
draw_sprite_ui_uniform(THEME.node_deprecated_badge, 1, tx + ui(16), yy + list_height / 2 + ui(1));
tx += ui(40);
}
draw_set_text(f_p2, fa_left, fa_center, COLORS._main_text);
draw_text_add(tx, yy + list_height / 2, _node.getName());
yy += list_height;
hh += list_height;
}
gpu_set_blendmode(bm_subtract);
draw_set_color(c_white);
draw_rectangle(0, 0, content_pane.surface_w, ui(16 + 24 / 2), false);
gpu_set_blendmode(bm_normal);
if(ADD_NODE_PAGE > -1 && PREFERENCES.dialog_add_node_grouping) {
gpu_set_blendmode(bm_subtract);
draw_set_color(c_white);
draw_rectangle(0, 0, content_pane.surface_w, ui(16 + 24 / 2), false);
gpu_set_blendmode(bm_normal);
var len = array_length(group_labels);
for( var i = 0; i < len; i++ ) {
var lb = group_labels[i];
var _yy = max(lb.y, i == len - 1? ui(8) : min(ui(8), group_labels[i + 1].y - ui(32)));
var len = array_length(group_labels);
for( var i = 0; i < len; i++ ) {
var lb = group_labels[i];
var _yy = max(lb.y, i == len - 1? ui(8) : min(ui(8), group_labels[i + 1].y - ui(32)));
BLEND_OVERRIDE;
draw_sprite_stretched(THEME.group_label, 0, ui(16), _yy, content_pane.surface_w - ui(32), ui(24));
BLEND_NORMAL;
BLEND_OVERRIDE;
draw_sprite_stretched_ext(THEME.group_label, 0, ui(16), _yy, content_pane.surface_w - ui(32), ui(24), c_white, 0.3);
BLEND_NORMAL;
draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text);
draw_text(ui(16 + 16), _yy + ui(12), lb.text);
draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text);
draw_text(ui(16 + 16), _yy + ui(12), lb.text);
}
}
}
@ -767,32 +748,6 @@ event_inherited();
else
draw_sprite_stretched_ext(THEME.node_bg, 0, _boxx, yy, grid_size, grid_size, COLORS.dialog_add_node_collection, 1);
BLEND_NORMAL;
if(variable_struct_exists(_node, "getSpr")) _node.getSpr();
if(sprite_exists(_node.spr)) {
var _si = current_time * PREFERENCES.collection_preview_speed / 3000;
var _sw = sprite_get_width(_node.spr);
var _sh = sprite_get_height(_node.spr);
var _ss = ui(32) / max(_sw, _sh);
var _sox = sprite_get_xoffset(_node.spr);
var _soy = sprite_get_yoffset(_node.spr);
var _sx = _boxx + grid_size / 2;
var _sy = yy + grid_size / 2;
_sx += _sw * _ss / 2 - _sox * _ss;
_sy += _sh * _ss / 2 - _soy * _ss;
draw_sprite_ext(_node.spr, _si, _sx, _sy, _ss, _ss, 0, c_white, 1);
}
if(is_instanceof(_node, NodeAction))
draw_sprite_ui_uniform(THEME.play_action, 0, _boxx + grid_size - 16, yy + grid_size - 16, 1, COLORS.add_node_blend_action);
draw_set_text(f_p2, fa_center, fa_top, COLORS._main_text);
var txt = _node.getName();
name_height = max(name_height, string_height_ext(txt, -1, grid_width) + ui(8));
draw_text_ext_add(_boxx + grid_size / 2, yy + grid_size + 4, txt, -1, grid_width);
if(_hover && point_in_rectangle(_m[0], _m[1], _nx, yy, _nx + grid_width, yy + grid_size)) {
node_selecting = i;
@ -817,10 +772,38 @@ event_inherited();
} else
draw_sprite_ui_uniform(THEME.info, 0, _boxx + ui(8), yy + ui(8), 0.7, COLORS._main_icon, 0.5);
}
if(is_instanceof(_node, NodeObject)) {
var fav = struct_has(_node, "node") && array_exists(global.FAV_NODES, _node.node);
if(fav) draw_sprite_ui_uniform(THEME.star, 0, _boxx + grid_size - ui(10), yy + grid_size - ui(10), 0.7, COLORS._main_accent, 1.);
_node.drawGrid(_boxx, yy, _m[0], _m[1], grid_size);
} else {
if(variable_struct_exists(_node, "getSpr")) _node.getSpr();
if(sprite_exists(_node.spr)) {
var _si = current_time * PREFERENCES.collection_preview_speed / 3000;
var _sw = sprite_get_width(_node.spr);
var _sh = sprite_get_height(_node.spr);
var _ss = ui(32) / max(_sw, _sh);
var _sox = sprite_get_xoffset(_node.spr);
var _soy = sprite_get_yoffset(_node.spr);
var _sx = _boxx + grid_size / 2;
var _sy = yy + grid_size / 2;
_sx += _sw * _ss / 2 - _sox * _ss;
_sy += _sh * _ss / 2 - _soy * _ss;
draw_sprite_ext(_node.spr, _si, _sx, _sy, _ss, _ss, 0, c_white, 1);
}
if(is_instanceof(_node, NodeAction))
draw_sprite_ui_uniform(THEME.play_action, 0, _boxx + grid_size - 16, yy + grid_size - 16, 1, COLORS.add_node_blend_action);
}
var _name = _node.getName();
draw_set_text(f_p2, fa_center, fa_top, COLORS._main_text);
draw_text_ext_add(_boxx + grid_size / 2, yy + grid_size + 4, _name, -1, grid_width);
name_height = max(name_height, string_height_ext(_name, -1, grid_width) + ui(8));
if(node_focusing == i)
search_pane.scroll_y_to = -max(0, hh - search_pane.h);
@ -854,35 +837,6 @@ event_inherited();
BLEND_NORMAL;
}
if(variable_struct_exists(_node, "getSpr")) _node.getSpr();
if(sprite_exists(_node.spr)) {
var _si = current_time * PREFERENCES.collection_preview_speed / 3000;
var _sw = sprite_get_width(_node.spr);
var _sh = sprite_get_height(_node.spr);
var _ss = (list_height - ui(8)) / max(_sw, _sh);
var _sox = sprite_get_xoffset(_node.spr);
var _soy = sprite_get_yoffset(_node.spr);
var _sx = list_height / 2 + ui(32);
var _sy = yy + list_height / 2;
_sx += _sw * _ss / 2 - _sox * _ss;
_sy += _sh * _ss / 2 - _soy * _ss;
draw_sprite_ext(_node.spr, _si, _sx, _sy, _ss, _ss, 0, c_white, 1);
if(is_instanceof(_node, NodeAction))
draw_sprite_ui_uniform(THEME.play_action, 0, _sx + list_height / 2 - 8, _sy + list_height / 2 - 8, 0.5, COLORS.add_node_blend_action);
}
if(is_instanceof(_node, NodeObject)) {
var fav = struct_has(_node, "node") && array_exists(global.FAV_NODES, _node.node);
if(fav) draw_sprite_ui_uniform(THEME.star, 0, ui(20), yy + list_height / 2, 0.7, COLORS._main_accent, 1.);
}
draw_set_text(f_p2, fa_left, fa_center, COLORS._main_text);
draw_text_add(list_height + ui(40), yy + list_height / 2, _node.getName());
if(_hover && point_in_rectangle(_m[0], _m[1], 0, yy, list_width, yy + list_height - 1)) {
if(struct_has(_node, "tooltip") && _node.getTooltip() != "") {
node_tooltip = _node;
@ -902,9 +856,36 @@ event_inherited();
if(keyboard_check_pressed(vk_enter))
buildNode(_node, _param);
}
if(is_instanceof(_node, NodeObject)) {
_node.drawList(0, yy, _m[0], _m[1], list_height);
} else {
if(variable_struct_exists(_node, "getSpr")) _node.getSpr();
if(sprite_exists(_node.spr)) {
var _si = current_time * PREFERENCES.collection_preview_speed / 3000;
var _sw = sprite_get_width(_node.spr);
var _sh = sprite_get_height(_node.spr);
var _ss = (list_height - ui(8)) / max(_sw, _sh);
var _sox = sprite_get_xoffset(_node.spr);
var _soy = sprite_get_yoffset(_node.spr);
if(node_focusing == i)
search_pane.scroll_y_to = -max(0, hh - search_pane.h);
var _sx = list_height / 2 + ui(32);
var _sy = yy + list_height / 2;
_sx += _sw * _ss / 2 - _sox * _ss;
_sy += _sh * _ss / 2 - _soy * _ss;
draw_sprite_ext(_node.spr, _si, _sx, _sy, _ss, _ss, 0, c_white, 1);
if(is_instanceof(_node, NodeAction))
draw_sprite_ui_uniform(THEME.play_action, 0, _sx + list_height / 2 - 8, _sy + list_height / 2 - 8, 0.5, COLORS.add_node_blend_action);
}
draw_set_text(f_p2, fa_left, fa_center, COLORS._main_text);
draw_text_add(list_height + ui(40), yy + list_height / 2, _node.getName());
}
if(node_focusing == i) search_pane.scroll_y_to = -max(0, hh - search_pane.h);
hh += list_height;
yy += list_height;

View file

@ -226,6 +226,45 @@ event_inherited();
PREF_SAVE();
})
));
ds_list_add(pref_global, __txt("Libraries"));
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
__txtx("pref_directory_ImageMagick", "ImageMagick path*"),
"ImageMagick_path",
new textBox(TEXTBOX_INPUT.text, function(txt) { PREFERENCES.ImageMagick_path = txt; PREF_SAVE(); })
.setSideButton(button(function() { PREFERENCES.ImageMagick_path = get_directory(PREFERENCES.ImageMagick_path); PREF_SAVE(); }, THEME.button_path_icon))
.setFont(f_p2)
.setEmpty(),
));
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
__txtx("pref_directory_webp", "Webp path*"),
"webp_path",
new textBox(TEXTBOX_INPUT.text, function(txt) { PREFERENCES.webp_path = txt; PREF_SAVE(); })
.setSideButton(button(function() { PREFERENCES.webp_path = get_directory(PREFERENCES.webp_path); PREF_SAVE(); }, THEME.button_path_icon))
.setFont(f_p2)
.setEmpty(),
));
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
__txtx("pref_directory_gifski", "Gifski path*"),
"gifski_path",
new textBox(TEXTBOX_INPUT.text, function(txt) { PREFERENCES.gifski_path = txt; PREF_SAVE(); })
.setSideButton(button(function() { PREFERENCES.gifski_path = get_directory(PREFERENCES.gifski_path); PREF_SAVE(); }, THEME.button_path_icon))
.setFont(f_p2)
.setEmpty(),
));
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
__txtx("pref_directory_FFmpeg", "FFmpeg path*"),
"ffmpeg_path",
new textBox(TEXTBOX_INPUT.text, function(txt) { PREFERENCES.gifski_path = txt; PREF_SAVE(); })
.setSideButton(button(function() { PREFERENCES.ffmpeg_path = get_directory(PREFERENCES.ffmpeg_path); PREF_SAVE(); }, THEME.button_path_icon))
.setFont(f_p2)
.setEmpty(),
));
#endregion
#region interface

View file

@ -28,7 +28,7 @@ if !ready exit;
draw_set_text(f_code, fa_left, fa_top, COLORS._main_text);
var _hh = string_height_ext(ctxt[1], -1, dialog_w - ui(64));
draw_sprite_stretched(THEME.ui_panel_inner_bg, 1, dialog_x + ui(24), py - ui(8), dialog_w - ui(48), _hh + ui(16));
draw_sprite_stretched(THEME.ui_panel_bg, 1, dialog_x + ui(24), py - ui(8), dialog_w - ui(48), _hh + ui(16));
draw_text_ext(dialog_x + ui(32), py, ctxt[1], -1, dialog_w - ui(64));
py += _hh + ui(16);

View file

@ -1,14 +1,26 @@
/// @description
if(tb == noone) exit;
if(slide_da == -1) {
var _dist = point_distance(slide_dx, slide_dy, mouse_mx, mouse_my);
var _dirr = point_direction(slide_dx, slide_dy, mouse_mx, mouse_my);
if(_dist > 16) {
if(_dirr < 45) slide_da = 0;
else if(_dirr < 135) slide_da = 1;
else if(_dirr < 225) slide_da = 0;
else if(_dirr < 315) slide_da = 1;
else slide_da = 0;
}
tb = noone;
exit;
}
if(!MOUSE_WRAPPING) {
var _adx = mouse_mx - slide_dx;
var _ady = slide_dy - mouse_my;
if(slide_da == -1 && abs(_ady - _adx) > 8) slide_da = abs(_adx) > abs(_ady);
else if(slide_da == 0 && abs(_ady) > abs(_adx) + 8 && abs(mouse_my - slide_dy) > 64) slide_da = 1;
else if(slide_da == 1 && abs(_adx) > abs(_ady) + 8 && abs(mouse_mx - slide_dx) > 64) slide_da = 0;
var _s = tb.slide_speed;
if(key_mod_press(CTRL)) _s *= 10;
if(key_mod_press(ALT)) _s /= 10;

View file

@ -0,0 +1,38 @@
enum SHADER_UNIFORM {
integer,
float,
color,
}
function addShaderProp(_type = undefined, _key = undefined) {
INLINE
var _ind = ds_list_size(inputs) - 1;
shader_data[_ind] = _type == undefined? 0 : { type: _type, key: _key };
}
function Node_Shader(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor {
name = "";
shader = noone;
shader_data = [];
outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
static setShader = function(_data) { #region
for( var i = 0, n = array_length(shader_data); i < n; i++ ) {
var _dat = shader_data[i];
if(_dat == 0) continue;
var _val = _data[i];
switch(_dat.type) {
case SHADER_UNIFORM.integer : shader_set_i(_dat.key, _val); break;
case SHADER_UNIFORM.float : shader_set_f(_dat.key, _val); break;
case SHADER_UNIFORM.color : shader_set_color(_dat.key, _val); break;
}
}
} #endregion
static processData = function(_outSurf, _data, _output_index, _array_index) { #region
return _outSurf;
} #endregion
}

View file

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

View file

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "generator",
"path": "folders/nodes/data/generator.yy",
},
"resourceVersion": "1.0",
"name": "node_gradient",
"tags": [],
"resourceType": "GMScript",
}

View file

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "generator",
"path": "folders/nodes/data/generator.yy",
},
"resourceVersion": "1.0",
"name": "node_perlin",
"tags": [],
"resourceType": "GMScript",
}

View file

@ -0,0 +1,25 @@
function Node_Shader_Generator(_x, _y, _group = noone) : Node_Shader(_x, _y, _group) constructor {
name = "";
inputs[| 0] = nodeValue("Dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, DEF_SURF )
.setDisplay(VALUE_DISPLAY.vector);
addShaderProp(SHADER_UNIFORM.float, "u_resolution");
attribute_surface_depth();
static generateShader = function(_outSurf, _data) { #region
var _dim = _data[0];
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth());
surface_set_shader(_outSurf, shader);
setShader(_data);
draw_sprite_ext(s_fx_pixel, 0, 0, 0, _dim[0], _dim[1], 0, c_white, 1);
surface_reset_shader();
return _outSurf;
} #endregion
static processData = function(_outSurf, _data, _output_index, _array_index) { #region
return generateShader(_outSurf, _data);
} #endregion
}

View file

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

View file

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "generator",
"path": "folders/nodes/data/generator.yy",
},
"resourceVersion": "1.0",
"name": "node_gradient",
"tags": [],
"resourceType": "GMScript",
}

View file

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "generator",
"path": "folders/nodes/data/generator.yy",
},
"resourceVersion": "1.0",
"name": "node_perlin",
"tags": [],
"resourceType": "GMScript",
}

View file

@ -0,0 +1,26 @@
function Node_Shader_Processor(_x, _y, _group = noone) : Node_Shader(_x, _y, _group) constructor {
name = "";
inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, DEF_SURF )
.setDisplay(VALUE_DISPLAY.vector);
addShaderProp();
attribute_surface_depth();
static processData = function(_outSurf, _data, _output_index, _array_index) { #region
var _surf = _data[0];
if(!is_surface(_surf)) return _outSurf;
var _sw = surface_get_width_safe(_surf);
var _sh = surface_get_height_safe(_surf);
_outSurf = surface_verify(_outSurf, _sw, _sh, attrDepth());
surface_set_shader(_outSurf, shader);
setShader(_data);
draw_surface_safe(_surf);
surface_reset_shader();
return _outSurf;
} #endregion
}

View file

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

View file

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "generator",
"path": "folders/nodes/data/generator.yy",
},
"resourceVersion": "1.0",
"name": "node_gradient",
"tags": [],
"resourceType": "GMScript",
}

View file

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "generator",
"path": "folders/nodes/data/generator.yy",
},
"resourceVersion": "1.0",
"name": "node_perlin",
"tags": [],
"resourceType": "GMScript",
}

View file

@ -87,7 +87,7 @@ function areaBox(_onModify, _unit = noone) : widget() constructor {
static setSlideSpeed = function(speed) { #region
for(var i = 0; i < 4; i++)
tb[i].slide_speed = speed;
tb[i].setSlidable(speed);
} #endregion
static setInteract = function(interactable = noone) { #region

View file

@ -27,7 +27,7 @@ function cornerBox(_onModify, _unit = noone) : widget() constructor {
static setSlideSpeed = function(speed) {
for(var i = 0; i < 4; i++)
tb[i].slide_speed = speed;
tb[i].setSlidable(speed);
}
static setInteract = function(interactable = noone) {

View file

@ -8,7 +8,7 @@ function filepath_resolve(path) {
var _path = path;
_path = string_replace_all(_path, "%DIR%/", DIRECTORY);
_path = string_replace_all(_path, "%APP%/", working_directory);
_path = string_replace_all(_path, "%APP%/", program_directory);
return _path;
}

View file

@ -73,7 +73,7 @@ function matrixGrid(_type, _size, _onModify, _unit = noone) : widget() construct
static setSlideSpeed = function(speed) {
for(var i = 0; i < inputs; i++)
tb[i].slide_speed = speed;
tb[i].setSlidable(speed);
}
static drawParam = function(params) {

View file

@ -7,7 +7,7 @@ function Node_3D_Camera_Set(_x, _y, _group = noone) : Node_3D_Camera(_x, _y, _gr
inputs[| in_cam + 0] = nodeValue("Horizontal angle", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 45 )
.setDisplay(VALUE_DISPLAY.rotation);
inputs[| in_cam + 1] = nodeValue("Vertical angle", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 45 )
inputs[| in_cam + 1] = nodeValue("Vertical angle", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 215 )
.setDisplay(VALUE_DISPLAY.slider, { range: [0, 90, 1] });
inputs[| in_cam + 2] = nodeValue("Color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_white )

View file

@ -32,8 +32,9 @@ function Node_3D_Mesh_Extrude(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _gr
var _matN = _mat.clone();
var _nSurf = surface_create(surface_get_width(_surf), surface_get_height(_surf));
surface_set_shader(_nSurf, sh_d3d_extrude_extends);
shader_set_f("dimension", surface_get_width(_surf), surface_get_height(_surf));
shader_set_dim("dimension", _surf);
draw_surface_safe(_surf);
surface_reset_shader();

View file

@ -1,92 +1,19 @@
function Node_3D_Transform_Scene(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constructor {
name = "Transform Scene";
function Node_3D_Transform(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) constructor {
name = "Transform";
inputs[| 0] = nodeValue("Scene", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Scene, noone)
inputs[| in_d3d + 0] = nodeValue("Mesh", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Mesh, noone)
.setVisible(true, true);
inputs[| 1] = nodeValue("Position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [])
.setArrayDepth(2);
outputs[| 0] = nodeValue("Mesh", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3Mesh, noone);
inputs[| 2] = nodeValue("Rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [])
.setArrayDepth(2);
inputs[| 3] = nodeValue("Scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [])
.setArrayDepth(2);
inputs[| 4] = nodeValue("Positioning type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Additive", "Override" ]);
inputs[| 5] = nodeValue("Rotating type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Additive", "Override" ]);
inputs[| 6] = nodeValue("Scaling type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Additive", "Multiplicative", "Override" ]);
outputs[| 0] = nodeValue("Scene", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3Scene, noone);
input_display_list = [ 0,
["Transform", false], 1, 2, 3,
["Settings", true], 4, 5, 6,
input_display_list = [ in_d3d + 0,
["Transform", false], 0, 1, 2,
];
static processData = function(_output, _data, _output_index, _array_index = 0) { #region
var _scn = _data[0];
if(!is_instanceof(_scn, __3dGroup)) return noone;
var _mesh = _data[in_d3d + 0].clone();
setTransform(_mesh, _data);
var _nscn = _scn.clone(false);
_temp_data = _data;
array_foreach(_nscn.objects, function(_object, _index) {
var _pos = array_safe_get(_temp_data[1], _index, 0);
if(is_array(_pos)) {
if(_temp_data[4] == 0) {
_object.transform.position.x += _pos[0];
_object.transform.position.y += _pos[1];
_object.transform.position.z += _pos[2];
} else if(_temp_data[4] == 1) {
_object.transform.position.x = _pos[0];
_object.transform.position.y = _pos[1];
_object.transform.position.z = _pos[2];
}
}
var _rot = array_safe_get(_temp_data[2], _index, 0);
if(is_array(_rot)) {
var _rotQ = new BBMOD_Quaternion().FromEuler(_rot[0], _rot[1], _rot[2]);
if(_temp_data[5] == 0)
_object.transform.rotation = _object.transform.rotation.Mul(_rotQ);
else if(_temp_data[5] == 1)
_object.transform.rotation = _rotQ;
}
var _sca = array_safe_get(_temp_data[3], _index, 0);
if(is_array(_sca)) {
if(_temp_data[6] == 0) {
_object.transform.scale.x += _sca[0];
_object.transform.scale.y += _sca[1];
_object.transform.scale.z += _sca[2];
} else if(_temp_data[6] == 1) {
_object.transform.scale.x *= _sca[0];
_object.transform.scale.y *= _sca[1];
_object.transform.scale.z *= _sca[2];
} else if(_temp_data[6] == 2) {
_object.transform.scale.x = _sca[0];
_object.transform.scale.y = _sca[1];
_object.transform.scale.z = _sca[2];
}
}
});
return _nscn;
return _mesh;
} #endregion
static getPreviewObject = function() { #region
var _obj = outputs[| 0].getValue();
if(is_array(_obj)) _obj = array_safe_get(_obj, preview_index, noone);
return _obj;
} #endregion
}

View file

@ -0,0 +1,92 @@
function Node_3D_Transform_Scene(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constructor {
name = "Transform Scene";
inputs[| 0] = nodeValue("Scene", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Scene, noone)
.setVisible(true, true);
inputs[| 1] = nodeValue("Position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [])
.setArrayDepth(2);
inputs[| 2] = nodeValue("Rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [])
.setArrayDepth(2);
inputs[| 3] = nodeValue("Scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [])
.setArrayDepth(2);
inputs[| 4] = nodeValue("Positioning type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Additive", "Override" ]);
inputs[| 5] = nodeValue("Rotating type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Additive", "Override" ]);
inputs[| 6] = nodeValue("Scaling type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Additive", "Multiplicative", "Override" ]);
outputs[| 0] = nodeValue("Scene", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3Scene, noone);
input_display_list = [ 0,
["Transform", false], 1, 2, 3,
["Settings", true], 4, 5, 6,
];
static processData = function(_output, _data, _output_index, _array_index = 0) { #region
var _scn = _data[0];
if(!is_instanceof(_scn, __3dGroup)) return noone;
var _nscn = _scn.clone(false);
_temp_data = _data;
array_foreach(_nscn.objects, function(_object, _index) {
var _pos = array_safe_get(_temp_data[1], _index, 0);
if(is_array(_pos)) {
if(_temp_data[4] == 0) {
_object.transform.position.x += _pos[0];
_object.transform.position.y += _pos[1];
_object.transform.position.z += _pos[2];
} else if(_temp_data[4] == 1) {
_object.transform.position.x = _pos[0];
_object.transform.position.y = _pos[1];
_object.transform.position.z = _pos[2];
}
}
var _rot = array_safe_get(_temp_data[2], _index, 0);
if(is_array(_rot)) {
var _rotQ = new BBMOD_Quaternion().FromEuler(_rot[0], _rot[1], _rot[2]);
if(_temp_data[5] == 0)
_object.transform.rotation = _object.transform.rotation.Mul(_rotQ);
else if(_temp_data[5] == 1)
_object.transform.rotation = _rotQ;
}
var _sca = array_safe_get(_temp_data[3], _index, 0);
if(is_array(_sca)) {
if(_temp_data[6] == 0) {
_object.transform.scale.x += _sca[0];
_object.transform.scale.y += _sca[1];
_object.transform.scale.z += _sca[2];
} else if(_temp_data[6] == 1) {
_object.transform.scale.x *= _sca[0];
_object.transform.scale.y *= _sca[1];
_object.transform.scale.z *= _sca[2];
} else if(_temp_data[6] == 2) {
_object.transform.scale.x = _sca[0];
_object.transform.scale.y = _sca[1];
_object.transform.scale.z = _sca[2];
}
}
});
return _nscn;
} #endregion
static getPreviewObject = function() { #region
var _obj = outputs[| 0].getValue();
if(is_array(_obj)) _obj = array_safe_get(_obj, preview_index, noone);
return _obj;
} #endregion
}

View file

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

View file

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "variable",
"path": "folders/nodes/data/variable.yy",
},
"resourceVersion": "1.0",
"name": "node_counter",
"tags": [],
"resourceType": "GMScript",
}

View file

@ -8,11 +8,15 @@ function Node_3D_UV_Remap(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _grou
inputs[| in_d3d + 1] = nodeValue("Target subobject", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, -1)
.setArrayDepth(1);
inputs[| in_d3d + 2] = nodeValue("Bake UV", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.button, { name: "Bake", onClick: function() { attributes.bakedUV = !attributes.bakedUV; triggerRender(); } });
outputs[| 0] = nodeValue("Mesh", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3Mesh, noone);
input_display_list = [
["Transform", false], 0, 1, 2,
["UV", false], in_d3d + 0, in_d3d + 1,
["Bake", false], in_d3d + 2,
];
remap_position = [ 0, 0, 0 ];
@ -21,6 +25,15 @@ function Node_3D_UV_Remap(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _grou
remap_normal_y = [ 0, 0, 0 ];
remap_scale = [ 1, 1, 1 ];
attributes.bakedUV = false;
attributes.bakedUVdata = [];
modify_object_index = 0;
static step = function() { #region
inputs[| in_d3d + 2].editWidget.text = attributes.bakedUV? "Unbake" : "Bake";
} #endregion
static modify_object = function(_object, _data, _matrix) { #region
if(_object.VF != global.VF_POS_NORM_TEX_COL) return _object;
@ -33,6 +46,10 @@ function Node_3D_UV_Remap(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _grou
var _fil = _data[in_d3d + 1];
if(_fil != -1 && !is_array(_fil)) _fil = [ _fil ];
var _vertex_index = 0;
if(!attributes.bakedUV) attributes.bakedUVdata[modify_object_index] = [];
var _baked_vertex = attributes.bakedUVdata[modify_object_index];
for( var i = 0, n = array_length(_object.VB); i < n; i++ ) {
if(_fil != -1 && !array_exists(_fil, i)) {
_obj.VB[i] = _object.VB[i];
@ -64,9 +81,14 @@ function Node_3D_UV_Remap(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _grou
var _v4 = new BBMOD_Vec4(_x, _y, _z, 1);
var _vt = _mat.Transform(_v4);
var _posOnMap = d3d_point_project_plane_uv(remap_position, remap_normal, [_vt.X, _vt.Y, _vt.Z], remap_normal_x, remap_normal_y);
_posOnMap[0] = _posOnMap[0] / remap_scale[0] + 0.5;
_posOnMap[1] = _posOnMap[1] / remap_scale[1] + 0.5;
if(attributes.bakedUV) {
_posOnMap = _baked_vertex[_vertex_index];
} else {
var _posOnMap = d3d_point_project_plane_uv(remap_position, remap_normal, [_vt.X, _vt.Y, _vt.Z], remap_normal_x, remap_normal_y);
_posOnMap[0] = _posOnMap[0] / remap_scale[0] + 0.5;
_posOnMap[1] = _posOnMap[1] / remap_scale[1] + 0.5;
_baked_vertex[_vertex_index] = _posOnMap;
}
buffer_seek(buff, buffer_seek_relative, -12);
@ -74,11 +96,13 @@ function Node_3D_UV_Remap(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _grou
buffer_write(buff, buffer_f32, _posOnMap[1]);
buffer_seek(buff, buffer_seek_relative, 4);
_vertex_index++;
}
_obj.VB[i] = vertex_create_buffer_from_buffer(buff, global.VF_POS_NORM_TEX_COL);
}
modify_object_index++;
return _obj;
} #endregion
@ -115,6 +139,7 @@ function Node_3D_UV_Remap(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _grou
remap_position = _data[0];
remap_scale = _data[2];
modify_object_index = 0;
return modify(_data[in_d3d + 0], _data);
} #endregion

View file

@ -560,6 +560,16 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc
return noone;
} #endregion
static enable = function() { #region
active = true; timeline_item.active = true;
for( var i = 0, n = ds_list_size(nodes); i < n; i++ ) nodes[| i].enable();
} #endregion
static disable = function() { #region
active = false; timeline_item.active = false;
for( var i = 0, n = ds_list_size(nodes); i < n; i++ ) nodes[| i].disable();
} #endregion
static processSerialize = function(_map) { #region
_map[? "instance_base"] = instanceBase? instanceBase.node_id : noone;
} #endregion

View file

@ -527,6 +527,8 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
doUpdate();
} #endregion
static postupdate = function(frame = CURRENT_FRAME) {}
static doUpdate = function(frame = CURRENT_FRAME) { #region
if(PROJECT.safeMode) return;
if(NODE_EXTRACT) return;
@ -558,6 +560,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
}
}
postupdate(frame);
cached_manual = false;
if(!use_cache && PROJECT.onion_skin.enabled) {
@ -1260,8 +1263,8 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
static getAnimationCacheExist = function(frame) { return cacheExist(frame); }
static enable = function() { INLINE active = true; }
static disable = function() { INLINE active = false; }
static enable = function() { INLINE active = true; timeline_item.active = true; }
static disable = function() { INLINE active = false; timeline_item.active = false; }
static destroy = function(_merge = false) { #region
if(!active) return;
@ -1273,7 +1276,6 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
if(PANEL_INSPECTOR.inspecting == self) PANEL_INSPECTOR.inspecting = noone;
PANEL_PREVIEW.removeNodePreview(self);
timeline_item.removeSelf();
for(var i = 0; i < ds_list_size(outputs); i++) {
var jun = outputs[| i];
@ -1774,11 +1776,11 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
createNewInput();
} #endregion
static attributeDeserialize = function(attr) {
static attributeDeserialize = function(attr) { #region
if(struct_has(attributes, "use_project_dimension") && !struct_has(attr, "use_project_dimension"))
attributes.use_project_dimension = false;
struct_override(attributes, attr);
}
} #endregion
static postDeserialize = function() {}
static processDeserialize = function() {}

View file

@ -77,7 +77,8 @@ function Node_Display_Text(_x, _y, _group = noone) : Node(_x, _y, _group) constr
_tw = string_width(_bch) * _s;
_th = string_height(_bch) * _s;
draw_sprite_stretched_points(THEME.node_bg, 0, _tx - 4, _y - 4, _tx + _tw + 4, _y + _th + 4);
draw_sprite_stretched_points(THEME.ui_panel_bg, 0, _tx - 4, _y - 4, _tx + _tw + 4, _y + _th + 4, COLORS._main_icon_light);
draw_sprite_stretched_points(THEME.ui_panel_fg, 0, _tx - 4, _y - 4, _tx + _tw + 4, _y + _th + 4);
draw_set_color(_cc);
draw_text_transformed(_tx, _y, _bch, _s, _s, 0);

View file

@ -112,11 +112,20 @@ function valueAnimator(_val, _prop, _sep_axis = false) constructor {
}
if(prop.display_type == VALUE_DISPLAY.d3quarternion) {
var _qf = new BBMOD_Quaternion(_f[0], _f[1], _f[2], _f[3]);
var _qt = new BBMOD_Quaternion(_t[0], _t[1], _t[2], _t[3]);
var _ql = _qf.Slerp(_qt, _lrp);
return _ql.ToArray();
if(prop.display_data.angle_display == 0) {
var _qf = new BBMOD_Quaternion(_f[0], _f[1], _f[2], _f[3]);
var _qt = new BBMOD_Quaternion(_t[0], _t[1], _t[2], _t[3]);
var _ql = _qf.Slerp(_qt, _lrp);
return _ql.ToArray();
} else {
return [
lerp(_f[0], _t[0], _lrp),
lerp(_f[1], _t[1], _lrp),
lerp(_f[2], _t[2], _lrp),
0,
];
}
}
if(prop.type == VALUE_TYPE.color) {

View file

@ -83,7 +83,7 @@ function Node_Number(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co
for( var i = 0; i < 1; i++ ) {
inputs[| i].setType(int? VALUE_TYPE.integer : VALUE_TYPE.float);
inputs[| i].editWidget.slide_speed = int? 1 : 0.1;
inputs[| i].editWidget.setSlidable(int? 0.1 : 0.01);
}
outputs[| 0].setType(int? VALUE_TYPE.integer : VALUE_TYPE.float);
@ -330,7 +330,7 @@ function Node_Vector2(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
for( var i = 0; i < 2; i++ ) {
inputs[| i].setType(int? VALUE_TYPE.integer : VALUE_TYPE.float);
inputs[| i].editWidget.slide_speed = int? 1 : 0.1;
inputs[| i].editWidget.setSlidable(int? 0.1 : 0.01);
}
inputs[| 4].setVisible(disp == 1, disp == 1);
@ -515,7 +515,7 @@ function Node_Vector3(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
var int = getInputData(3);
for( var i = 0; i < 3; i++ ) {
inputs[| i].setType(int? VALUE_TYPE.integer : VALUE_TYPE.float);
inputs[| i].editWidget.slide_speed = int? 1 : 0.1;
inputs[| i].editWidget.setSlidable(int? 0.1 : 0.01);
}
outputs[| 0].setType(int? VALUE_TYPE.integer : VALUE_TYPE.float);
@ -574,7 +574,7 @@ function Node_Vector4(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
var int = getInputData(4);
for( var i = 0; i < 4; i++ ) {
inputs[| i].setType(int? VALUE_TYPE.integer : VALUE_TYPE.float);
inputs[| i].editWidget.slide_speed = int? 1 : 0.1;
inputs[| i].editWidget.setSlidable(int? 0.1 : 0.01);
}
outputs[| 0].setType(int? VALUE_TYPE.integer : VALUE_TYPE.float);

View file

@ -47,14 +47,14 @@ function Node_PB_Draw_Round_Rectangle(_x, _y, _group = noone) : Node_PB_Draw(_x,
inputs[| 4].setType(VALUE_TYPE.float);
inputs[| 5].setType(VALUE_TYPE.float);
inputs[| 4].editWidget.slide_speed = 0.01;
inputs[| 5].editWidget.setSlideSpeed(0.01);
inputs[| 4].editWidget.setSlideSpeed(0.001);
inputs[| 5].editWidget.setSlideSpeed(0.001);
} else {
inputs[| 4].setType(VALUE_TYPE.integer);
inputs[| 5].setType(VALUE_TYPE.integer);
inputs[| 4].editWidget.slide_speed = 1;
inputs[| 5].editWidget.setSlideSpeed(1);
inputs[| 4].editWidget.setSlideSpeed(0.01);
inputs[| 5].editWidget.setSlideSpeed(0.01);
}
}

View file

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "generator",
"path": "folders/nodes/data/generator.yy",
},
"resourceVersion": "1.0",
"name": "node_gradient",
"tags": [],
"resourceType": "GMScript",
}

View file

@ -0,0 +1,64 @@
function Node_Perlin_Extra(_x, _y, _group = noone) : Node_Shader_Generator(_x, _y, _group) constructor {
name = "Extra Perlins";
shader = sh_perlin_extra;
inputs[| 1] = nodeValue("Position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector)
.setUnitRef(function(index) { return getDimension(index); });
addShaderProp(SHADER_UNIFORM.float, "position");
inputs[| 2] = nodeValue("Scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 4, 4 ])
.setDisplay(VALUE_DISPLAY.vector);
addShaderProp(SHADER_UNIFORM.float, "scale");
inputs[| 3] = nodeValue("Iteration", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 2);
addShaderProp(SHADER_UNIFORM.integer, "iteration");
inputs[| 4] = nodeValue("Tile", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true);
addShaderProp(SHADER_UNIFORM.integer, "tile");
inputs[| 5] = nodeValue("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, irandom(99999));
addShaderProp(SHADER_UNIFORM.float, "seed");
inputs[| 6] = nodeValue("Color mode", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_button, [ "Greyscale", "RGB", "HSV" ]);
addShaderProp(SHADER_UNIFORM.integer, "colored");
inputs[| 7] = nodeValue("Color R range", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 1 ])
.setDisplay(VALUE_DISPLAY.slider_range);
addShaderProp(SHADER_UNIFORM.float, "colorRanR");
inputs[| 8] = nodeValue("Color G range", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 1 ])
.setDisplay(VALUE_DISPLAY.slider_range);
addShaderProp(SHADER_UNIFORM.float, "colorRanG");
inputs[| 9] = nodeValue("Color B range", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 1 ])
.setDisplay(VALUE_DISPLAY.slider_range);
addShaderProp(SHADER_UNIFORM.float, "colorRanB");
inputs[| 10] = nodeValue("Noise type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Absolute worley", "Fluid", "Noisy perlin", "Camo" ]);
addShaderProp(SHADER_UNIFORM.integer, "type");
input_display_list = [
["Output", true], 0, 5,
["Noise", false], 10, 1, 2, 3, 4,
["Render", false], 6, 7, 8, 9,
];
static step = function() { #region
var _col = getInputData(6);
inputs[| 7].setVisible(_col != 0);
inputs[| 8].setVisible(_col != 0);
inputs[| 9].setVisible(_col != 0);
inputs[| 7].name = _col == 1? "Color R range" : "Color H range";
inputs[| 8].name = _col == 1? "Color G range" : "Color S range";
inputs[| 9].name = _col == 1? "Color B range" : "Color V range";
} #endregion
static processData = function(_outSurf, _data, _output_index, _array_index) { #region
return generateShader(_outSurf, _data);
} #endregion
}

View file

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

View file

@ -1,13 +1,6 @@
function Node_Perlin_Smear(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor {
name = "Smear noise";
shader = sh_perlin_smear;
uniform_dim = shader_get_uniform(shader, "u_resolution");
uniform_pos = shader_get_uniform(shader, "position");
uniform_sca = shader_get_uniform(shader, "scale");
uniform_ite = shader_get_uniform(shader, "iteration");
uniform_bri = shader_get_uniform(shader, "bright");
inputs[| 0] = nodeValue("Dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, DEF_SURF )
.setDisplay(VALUE_DISPLAY.vector);
@ -36,16 +29,14 @@ function Node_Perlin_Smear(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth());
surface_set_target(_outSurf);
shader_set(shader);
shader_set_uniform_f_array_safe(uniform_dim, _dim);
shader_set_uniform_f_array_safe(uniform_pos, _pos);
shader_set_uniform_f_array_safe(uniform_sca, _sca);
shader_set_uniform_f(uniform_bri, _bri);
shader_set_uniform_i(uniform_ite, _ite);
surface_set_shader(_outSurf, sh_perlin_smear);
shader_set_f("u_resolution", _dim);
shader_set_f("position", _pos);
shader_set_f("scale", _sca);
shader_set_f("bright", _bri);
shader_set_i("iteration", _ite);
draw_sprite_ext(s_fx_pixel, 0, 0, 0, _dim[0], _dim[1], 0, c_white, 1);
shader_reset();
surface_reset_target();
surface_reset_shader();
return _outSurf;
}

View file

@ -11,6 +11,8 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio
show_in_recent = true;
is_patreon_extra = false;
var pth = DIRECTORY + "Nodes/tooltip/" + node + ".png";
if(file_exists(pth))
tooltip_spr = sprite_add(pth, 0, false, false, 0, 0);
@ -24,20 +26,29 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio
}
static setVersion = function(version) {
INLINE
new_node = version == VERSION;
return self;
}
static isDeprecated = function() {
INLINE
deprecated = true;
return self;
}
static hideRecent = function() {
INLINE
show_in_recent = false;
return self;
}
static patreonExtra = function() {
INLINE
is_patreon_extra = true;
return self;
}
static getName = function() { return __txt_node_name(node, name); }
static getTooltip = function() { return __txt_node_tooltip(node, tooltip); }
@ -55,6 +66,89 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio
if(!LOADING && !APPENDING) _node.doUpdate();
return _node;
}
static drawGrid = function(_x, _y, _mx, _my, grid_size) { #region
var spr_x = _x + grid_size / 2;
var spr_y = _y + grid_size / 2;
draw_sprite_ui_uniform(spr, 0, spr_x, spr_y, 0.5);
if(new_node) {
draw_sprite_ui_uniform(THEME.node_new_badge, 0, _x + grid_size - ui(12), _y + ui(6),, COLORS._main_accent);
draw_sprite_ui_uniform(THEME.node_new_badge, 1, _x + grid_size - ui(12), _y + ui(6));
}
if(deprecated) {
draw_sprite_ui_uniform(THEME.node_deprecated_badge, 0, _x + grid_size - ui(12), _y + ui(6),, COLORS._main_value_negative);
draw_sprite_ui_uniform(THEME.node_deprecated_badge, 1, _x + grid_size - ui(12), _y + ui(6));
}
var fav = array_exists(global.FAV_NODES, node);
if(fav) draw_sprite_ui_uniform(THEME.star, 0, _x + grid_size - ui(10), _y + grid_size - ui(10), 0.7, COLORS._main_accent, 1.);
if(IS_PATREON && is_patreon_extra) {
var spr_x = _x + grid_size - 4;
var spr_y = _y + 4;
BLEND_SUBTRACT
gpu_set_colorwriteenable(0, 0, 0, 1);
draw_sprite_ext(s_patreon_supporter, 0, spr_x, spr_y, 1, 1, 0, c_white, 1);
gpu_set_colorwriteenable(1, 1, 1, 1);
BLEND_NORMAL
draw_sprite_ext(s_patreon_supporter, 1, spr_x, spr_y, 1, 1, 0, COLORS._main_accent, 1);
if(point_in_circle(_mx, _my, spr_x, spr_y, 10)) TOOLTIP = "Supporter exclusive";
}
} #endregion
static drawList = function(_x, _y, _mx, _my, list_height) { #region
var fav = array_exists(global.FAV_NODES, node);
if(fav) draw_sprite_ui_uniform(THEME.star, 0, ui(32), yy + list_height / 2, 0.7, COLORS._main_accent, 1.);
var spr_x = list_height / 2 + ui(44);
var spr_y = _y + list_height / 2;
var ss = (list_height - ui(8)) / max(sprite_get_width(spr), sprite_get_height(spr));
draw_sprite_ext(spr, 0, spr_x, spr_y, ss, ss, 0, c_white, 1);
var tx = list_height + ui(52);
if(new_node) {
draw_sprite_ui_uniform(THEME.node_new_badge, 0, tx + ui(16), _y + list_height / 2 + ui(1),, COLORS._main_accent);
draw_sprite_ui_uniform(THEME.node_new_badge, 1, tx + ui(16), _y + list_height / 2 + ui(1));
tx += ui(40);
}
if(deprecated) {
draw_sprite_ui_uniform(THEME.node_deprecated_badge, 0, tx + ui(16), _y + list_height / 2 + ui(1),, COLORS._main_value_negative);
draw_sprite_ui_uniform(THEME.node_deprecated_badge, 1, tx + ui(16), _y + list_height / 2 + ui(1));
tx += ui(40);
}
var _txt = getName();
draw_set_text(f_p2, fa_left, fa_center, COLORS._main_text);
draw_text_add(tx, _y + list_height / 2, _txt);
tx += string_width(_txt);
if(IS_PATREON && is_patreon_extra) {
var spr_x = tx + 8;
var spr_y = _y + list_height / 2 - 4;
BLEND_SUBTRACT
gpu_set_colorwriteenable(0, 0, 0, 1);
draw_sprite_ext(s_patreon_supporter, 0, spr_x, spr_y, 1, 1, 0, c_white, 1);
gpu_set_colorwriteenable(1, 1, 1, 1);
BLEND_NORMAL
draw_sprite_ext(s_patreon_supporter, 1, spr_x, spr_y, 1, 1, 0, COLORS._main_accent, 1);
if(point_in_circle(_mx, _my, spr_x, spr_y, 10)) TOOLTIP = "Supporter exclusive";
}
return tx;
} #endregion
} #endregion
#region nodes
@ -455,6 +549,7 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio
addNodeObject(generator, "Simplex Noise", s_node_noise_simplex, "Node_Noise_Simplex", [1, Node_Noise_Simplex], ["perlin"], "Generate simplex noise, similiar to perlin noise with better fidelity but non-tilable.").setVersion(1080);
addNodeObject(generator, "Cellular Noise", s_node_noise_cell, "Node_Cellular", [1, Node_Cellular], ["voronoi", "worley"], "Generate voronoi pattern.");
addNodeObject(generator, "Anisotropic Noise", s_node_noise_aniso, "Node_Noise_Aniso", [1, Node_Noise_Aniso],, "Generate anisotropic noise.");
/**/ addNodeObject(generator, "Extra Perlins", s_node_noise_aniso, "Node_Perlin_Extra", [1, Node_Perlin_Extra], ["noise"], "Random perlin noise made with different algorithms.").patreonExtra();
ds_list_add(generator, "Patterns");
addNodeObject(generator, "Stripe", s_node_stripe, "Node_Stripe", [1, Node_Stripe],, "Generate stripe pattern.");

View file

@ -70,6 +70,10 @@ function Node_Render_Sprite_Sheet(_x, _y, _group = noone) : Node(_x, _y, _group)
update_on_frame = grup == 0;
} #endregion
static postupdate = function(frame = CURRENT_FRAME) {
if(LAST_FRAME) array_remove(RENDERING, node_id);
}
static update = function(frame = CURRENT_FRAME) { #region
var inpt = getInputData(0);
var grup = getInputData(1);
@ -249,9 +253,6 @@ function Node_Render_Sprite_Sheet(_x, _y, _group = noone) : Node(_x, _y, _group)
if(drawn) array_safe_set(anim_drawn, CURRENT_FRAME, true);
outputs[| 1].setValue(_atl);
if(LAST_FRAME)
array_remove(RENDERING, node_id);
} #endregion
static onInspector1Update = function(updateAll = true) { #region

View file

@ -809,9 +809,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
return setValueDirect(val);
} );
editWidget.slidable = true;
if(type == VALUE_TYPE.integer) editWidget.slide_speed = 1;
if(type == VALUE_TYPE.integer) editWidget.setSlidable();
if(struct_has(display_data, "slide_speed")) editWidget.slide_speed = display_data.slide_speed;
if(struct_has(display_data, "slide_speed")) editWidget.setSlidable(display_data.slide_speed);
if(struct_has(display_data, "unit")) editWidget.unit = display_data.unit;
if(struct_has(display_data, "side_button")) editWidget.side_button = display_data.side_button;
@ -1347,6 +1347,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
} #endregion
if(display_type == VALUE_DISPLAY.d3quarternion) { #region
if(!applyUnit) return value;
var dispType = struct_try_get(nodeFrom.display_data, "angle_display");
switch(dispType) {
case QUARTERNION_DISPLAY.quarterion : return value;
@ -1399,8 +1400,6 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
static getValue = function(_time = CURRENT_FRAME, applyUnit = true, arrIndex = 0, useCache = false, log = false) { #region
if(type == VALUE_TYPE.trigger)
useCache = false;
if(value_tag == "dimension" && node.attributes.use_project_dimension)
return PROJECT.attributes.surface_dimension;
global.cache_call++;
if(useCache && use_cache) {
@ -1442,6 +1441,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
} #endregion
static __getAnimValue = function(_time = CURRENT_FRAME) { #region
if(value_tag == "dimension" && node.attributes.use_project_dimension)
return PROJECT.attributes.surface_dimension;
if(sep_axis) {
var val = [];
for( var i = 0, n = array_length(animators); i < n; i++ )
@ -1706,6 +1708,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
static setValueDirect = function(val = 0, index = noone, record = true, time = CURRENT_FRAME, _update = true) { #region
var updated = false;
var _val;
if(sep_axis) {
if(index == noone) {
@ -1715,11 +1718,11 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
updated = animators[index].setValue(val, connect_type == JUNCTION_CONNECT.input && record, time);
} else {
if(index != noone) {
var _val = variable_clone(animator.getValue(time));
_val = variable_clone(animator.getValue(time));
_val[index] = val;
updated = animator.setValue(_val, connect_type == JUNCTION_CONNECT.input && record, time);
} else
updated = animator.setValue(val, connect_type == JUNCTION_CONNECT.input && record, time);
_val = val;
updated = animator.setValue(_val, connect_type == JUNCTION_CONNECT.input && record, time);
}
if(type == VALUE_TYPE.gradient) updated = true;

View file

@ -35,7 +35,7 @@ function paddingBox(_onModify, _unit = noone) : widget() constructor {
static setSlideSpeed = function(speed) {
for(var i = 0; i < 4; i++)
tb[i].slide_speed = speed;
tb[i].setSlidable(speed);
}
static setInteract = function(interactable = noone) {

View file

@ -443,6 +443,8 @@ function Panel_Animation() : PanelContent() constructor {
for( var i = 0, n = array_length(folder.contents); i < n; i++ ) {
var _cont = folder.contents[i];
if(!_cont.active) continue;
var _content = {
item: _cont,
parent: _cont.parent,

View file

@ -250,14 +250,8 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
addHotkey("Graph", "Copy", "C", MOD_KEY.ctrl, function() { PANEL_GRAPH.doCopy(); });
addHotkey("Graph", "Paste", "V", MOD_KEY.ctrl, function() { PANEL_GRAPH.doPaste(); });
addHotkey("Graph", "Pan", "", MOD_KEY.alt, function() {
if(PREFERENCES.alt_picker) return;
PANEL_GRAPH.graph_dragging_key = true;
});
addHotkey("Graph", "Zoom", "", MOD_KEY.alt | MOD_KEY.ctrl, function() {
if(PREFERENCES.alt_picker) return;
PANEL_GRAPH.graph_zooming_key = true;
});
addHotkey("Graph", "Pan", "", MOD_KEY.ctrl, function() { PANEL_GRAPH.graph_dragging_key = true; });
addHotkey("Graph", "Zoom", "", MOD_KEY.alt | MOD_KEY.ctrl, function() { PANEL_GRAPH.graph_zooming_key = true; });
#endregion
#region ++++ node setters ++++

View file

@ -742,7 +742,7 @@ function Panel_Menu() : PanelContent() constructor {
var _ib = COLORS._main_text_sub;
if(pHOVER && point_in_rectangle(mx, my, _cx - 12, _cy - 12, _cx + 12, _cy + 12)) {
TOOLTIP = "Verified supporter";
TOOLTIP = "Supporter";
_ib = COLORS._main_accent;
}

View file

@ -273,14 +273,8 @@ function Panel_Preview() : PanelContent() constructor {
addHotkey("Preview", "Preview window", "P", MOD_KEY.ctrl, function() { create_preview_window(PANEL_PREVIEW.getNodePreview()); });
addHotkey("Preview", "Toggle grid", "G", MOD_KEY.ctrl, function() { PROJECT.previewGrid.show = !PROJECT.previewGrid.show; });
addHotkey("Preview", "Pan", "", MOD_KEY.alt, function() {
if(PREFERENCES.alt_picker) return;
PANEL_PREVIEW.canvas_dragging_key = true;
});
addHotkey("Preview", "Zoom", "", MOD_KEY.alt | MOD_KEY.ctrl, function() {
if(PREFERENCES.alt_picker) return;
PANEL_PREVIEW.canvas_zooming_key = true;
});
addHotkey("Preview", "Pan", "", MOD_KEY.ctrl, function() { PANEL_PREVIEW.canvas_dragging_key = true; });
addHotkey("Preview", "Zoom", "", MOD_KEY.alt | MOD_KEY.ctrl, function() { PANEL_PREVIEW.canvas_zooming_key = true; });
#endregion
function setNodePreview(node) { #region

View file

@ -4,6 +4,8 @@
PREFERENCES.ui_framerate = 60;
PREFERENCES.path_resolution = 32;
PREFERENCES.node_recents_amount = 20;
PREFERENCES.double_click_delay = 0.25;
PREFERENCES.mouse_wheel_speed = 1.00;

View file

@ -34,7 +34,7 @@ function quarternionBox(_onModify) : widget() constructor {
static setSlideSpeed = function(speed) {
for(var i = 0; i < size; i++)
tb[i].slide_speed = speed;
tb[i].setSlidable(speed);
}
static setInteract = function(interactable) {
@ -82,9 +82,13 @@ function quarternionBox(_onModify) : widget() constructor {
var bx = _x;
disp_w = disp_w == noone? ww : lerp_float(disp_w, ww, 3);
var _dispDat = _data;
for(var i = 0; i < size; i++) {
var _a = _dispDat[i];
tb[i].setFocusHover(clickable && active, hover);
tb[i].draw(bx + ui(24), _y, disp_w - ui(24), _h, _data[i], _m);
tb[i].draw(bx + ui(24), _y, disp_w - ui(24), _h, _a, _m);
draw_set_text(f_p0, fa_left, fa_center, COLORS._main_text_inner);
draw_text(bx + ui(8), _y + _h / 2, axis[i]);

View file

@ -31,8 +31,8 @@ function rangeBox(_type, _onModify) : widget() constructor {
}
static setSlideSpeed = function(speed) {
tb[0].slide_speed = speed;
tb[1].slide_speed = speed;
tb[0].setSlidable(speed);
tb[1].setSlidable(speed);
}
static setInteract = function(interactable = noone) {

View file

@ -11,9 +11,7 @@ function rotator(_onModify, _step = -1) : widget() constructor {
spr_bg = THEME.rotator_bg;
spr_knob = THEME.rotator_knob;
tb_value = new textBox(TEXTBOX_INPUT.number, onModify);
tb_value.slidable = true;
tb_value.slide_speed = 1;
tb_value = new textBox(TEXTBOX_INPUT.number, onModify).setSlidable();
halign = fa_center;

View file

@ -6,13 +6,9 @@ function rotatorRange(_onModify) : widget() constructor {
drag_sa = 0;
drag_sc = 0;
tb_min = new textBox(TEXTBOX_INPUT.number, function(val) { return onModify(0, val); } );
tb_min.slidable = true;
tb_min.slide_speed = 1;
tb_min = new textBox(TEXTBOX_INPUT.number, function(val) { return onModify(0, val); } ).setSlidable();
tb_max = new textBox(TEXTBOX_INPUT.number, function(val) { return onModify(1, val); } );
tb_max.slidable = true;
tb_max.slide_speed = 1;
tb_max = new textBox(TEXTBOX_INPUT.number, function(val) { return onModify(1, val); } ).setSlidable();
static setInteract = function(interactable = noone) {
self.interactable = interactable;

View file

@ -197,6 +197,7 @@ function SAVE_COLLECTION(_node, _path, save_surface = true, metadata = noone, co
var _name = filename_name_only(_path);
var _mpath = $"{_dir}/{_name}.meta";
_meta.version = SAVE_VERSION;
json_save_struct(_mpath, _meta, true);
}

View file

@ -32,7 +32,7 @@ function slider(_min, _max, _step, _onModify = noone, _onRelease = noone) : widg
tb_value = new textBox(TEXTBOX_INPUT.number, onApply);
static setSlideSpeed = function(speed) {
tb_value.slide_speed = speed;
tb_value.setSlidable(speed);
}
static setInteract = function(interactable = noone) {

View file

@ -17,8 +17,8 @@ function sliderRange(_min, _max, _step, _onModify) : widget() constructor {
tb_value_max.slidable = true;
static setSlideSpeed = function(speed) {
tb_value_min.slide_speed = speed;
tb_value_max.slide_speed = speed;
tb_value_min.setSlidable(speed);
tb_value_max.setSlidable(speed);
}
static setInteract = function(interactable = noone) {

View file

@ -97,19 +97,6 @@ function surfaceBox(_onModify, def_path = "") : widget() constructor {
draw_sprite_ui_uniform(THEME.scroll_box_arrow, 0, _x + _w - ui(20), _y + _h / 2, 1, COLORS._main_icon);
}
//if(_type == VALUE_TYPE.atlas) {
// draw_sprite_stretched_ext(THEME.ui_panel_inner_bg, 1, _x, _y + _h + ui(8), _w, ui(40), COLORS.node_composite_bg_blend, 1);
// var set_y = _y + _h + ui(16);
// var set_w = ui(64);
// var set_h = ui(24);
// draw_set_text(f_p0, fa_left, fa_center, COLORS._main_text);
// draw_text_add(_x + ui(16), set_y + set_h / 2, __txt("Crop atlas"));
// cb_atlas_crop.drawParam(new widgetParam(_x + _w - set_w, set_y, set_w, set_h, display_data.atlas_crop,, _m, _rx, _ry));
//}
if(WIDGET_CURRENT == self)
draw_sprite_stretched_ext(THEME.widget_selecting, 0, _x - ui(3), _y - ui(3), _w + ui(6), _h + ui(6), COLORS._main_accent, 1);

View file

@ -13,9 +13,9 @@ function __test_update_current_collections() {
var _node = _st.content[| i];
print(" > Updating " + _node.path);
var _map = json_load(_node.path);
_map[? "version"] = SAVE_VERSION;
json_save(_node.meta_path, _map);
var _map = json_load_struct(_node.path);
_map.version = SAVE_VERSION;
json_save_struct(_node.meta_path, _map);
}
for( var i = 0; i < ds_list_size(_st.subDir); i++ )

View file

@ -42,9 +42,10 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
text_surface = surface_create(1, 1);
static setSlidable = function(slidable = true, slideStep = slide_speed) { #region
self.slidable = slidable;
slide_speed = slideStep;
static setSlidable = function(slideStep = slide_speed) { #region
slidable = true;
slide_speed = slideStep;
return self;
} #endregion
@ -498,8 +499,8 @@ function textBox(_input, _onModify) : textInput(_input, _onModify) constructor {
} #endregion
if(sliding > 0) { #region
var dx = _m[0] - slide_mx;
var dy = -(_m[1] - slide_my);
var dx = _m[0] - slide_mx;
var dy = _m[1] - slide_my;
if(sliding == 1 && (abs(dx) > 16 || abs(dy) > 16)) {
sliding = 2;

View file

@ -1,5 +1,6 @@
function timelineItem() constructor {
show = true;
active = true;
color = -1;
color_cur = CDEF.main_grey;

View file

@ -58,7 +58,7 @@ function vectorBox(_size, _onModify, _unit = noone) : widget() constructor {
static setSlideSpeed = function(speed) {
for(var i = 0; i < size; i++)
tb[i].slide_speed = speed;
tb[i].setSlidable(speed);
return self;
}

View file

@ -35,7 +35,7 @@ function vectorRangeBox(_size, _type, _onModify, _unit = noone) : widget() const
static setSlideSpeed = function(speed) {
for(var i = 0; i < size; i++)
tb[i].slide_speed = speed;
tb[i].setSlidable(speed);
}
static setInteract = function(interactable = noone) {

View file

@ -0,0 +1,11 @@
{
"type": 1,
"parent": {
"name": "shader",
"path": "folders/shader.yy",
},
"resourceVersion": "1.0",
"name": "sh_perlin",
"tags": [],
"resourceType": "GMShader",
}

View file

@ -0,0 +1,143 @@
//
// Simple passthrough fragment shader
//
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform int type;
uniform vec2 position;
uniform vec2 u_resolution;
uniform vec2 scale;
uniform int iteration;
uniform float seed;
uniform int tile;
uniform int colored;
uniform vec2 colorRanR;
uniform vec2 colorRanG;
uniform vec2 colorRanB;
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 random (in vec2 st, float seed) { return fract(sin(dot(st.xy + vec2(21.4564, 46.8564), vec2(12.9898, 78.233))) * (43758.5453123 + seed)); }
float randomFloat (in vec2 st, float seed) { #region
float sedSt = floor(seed);
float sedFr = fract(seed);
//sedFr = sedFr * sedFr * (3.0 - 2.0 * sedFr);
return mix(random(st, sedSt), random(st, sedSt + 1.), sedFr);
} #endregion
vec2 random2 (in vec2 st, float seed) { return vec2(randomFloat(st, seed), randomFloat(st, seed + 1.864354564)); }
float noise (in vec2 st, in vec2 scale) { #region
vec2 cellMin = floor(st);
vec2 cellMax = floor(st) + vec2(1., 1.);
if(tile == 1) {
cellMin = mod(cellMin, scale);
cellMax = mod(cellMax, scale);
}
vec2 f = fract(st);
vec2 u = f * f * (3.0 - 2.0 * f);
float a = 0., b = 0., c = 0., d = 0.;
if(type == 0) {
a = dot( random2(vec2(cellMin.x, cellMin.y) * 2. - 1., seed), f - vec2(0., 0.) );
b = dot( random2(vec2(cellMax.x, cellMin.y) * 2. - 1., seed), f - vec2(1., 0.) );
c = dot( random2(vec2(cellMin.x, cellMax.y) * 2. - 1., seed), f - vec2(0., 1.) );
d = dot( random2(vec2(cellMax.x, cellMax.y) * 2. - 1., seed), f - vec2(1., 1.) );
return abs(mix(mix(a, b, u.x), mix(c, d, u.x), u.y));
} else if(type == 1 || type == 2 || type == 3) {
a = randomFloat(vec2(cellMin.x, cellMin.y), seed);
b = randomFloat(vec2(cellMax.x, cellMin.y), seed);
c = randomFloat(vec2(cellMin.x, cellMax.y), seed);
d = randomFloat(vec2(cellMax.x, cellMax.y), seed);
float _m = mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
return _m;
}
return 0.;
} #endregion
float perlin(in vec2 st) { #region
float amp = pow(2., float(iteration) - 1.) / (pow(2., float(iteration)) - 1.);
if(type == 0) amp = pow(2., float(iteration) + 1.) / (pow(2., float(iteration)) - 1.);
if(type == 3) amp *= 1.25;
float n = 0., m = 0.;
vec2 pos = st;
vec2 sc = scale;
float it = float(iteration);
if(type == 3) it *= 3.;
for(float i = 0.; i < it; i++) {
float _n = noise(pos, sc);
if(type == 3) {
m += _n * amp;
if(mod(i, 3.) == 2.) {
n += smoothstep(0.4, 0.6, m) * amp;
m = 0.;
sc /= 1.5;
amp /= .75;
pos /= 1.5;
} else {
sc *= 1.5;
amp *= .75;
pos *= 1.5;
}
} else
n += _n * amp;
pos += random2(vec2(float(i)), 0.574186) * sc;
if(type == 0) {
sc *= 2.;
amp *= .5;
pos *= 2.;
} else if(type == 1) {
sc *= 2.;
amp *= .5;
pos *= 1. + _n;
} else if(type == 2) {
sc *= 2.;
amp *= .5;
pos += random2(vec2(n), seed) / sc;
pos *= 2.;
}
}
return n;
} #endregion
void main() { #region
if(colored == 0) {
vec2 pos = (v_vTexcoord + position) * scale;
gl_FragColor = vec4(vec3(perlin(pos)), 1.0);
} else if(colored == 1) {
float randR = colorRanR[0] + perlin((v_vTexcoord + position) * scale) * (colorRanR[1] - colorRanR[0]);
float randG = colorRanG[0] + perlin((v_vTexcoord + position + vec2(1.7227, 4.55529)) * scale) * (colorRanG[1] - colorRanG[0]);
float randB = colorRanB[0] + perlin((v_vTexcoord + position + vec2(6.9950, 6.82063)) * scale) * (colorRanB[1] - colorRanB[0]);
gl_FragColor = vec4(randR, randG, randB, 1.0);
} else if(colored == 2) {
float randH = colorRanR[0] + perlin((v_vTexcoord + position) * scale) * (colorRanR[1] - colorRanR[0]);
float randS = colorRanG[0] + perlin((v_vTexcoord + position + vec2(1.7227, 4.55529)) * scale) * (colorRanG[1] - colorRanG[0]);
float randV = colorRanB[0] + perlin((v_vTexcoord + position + vec2(6.9950, 6.82063)) * scale) * (colorRanB[1] - colorRanB[0]);
gl_FragColor = vec4(hsv2rgb(vec3(randH, randS, randV)), 1.0);
}
} #endregion

View file

@ -0,0 +1,19 @@
//
// Simple passthrough vertex shader
//
attribute vec3 in_Position; // (x,y,z)
//attribute vec3 in_Normal; // (x,y,z) unused in this shader.
attribute vec4 in_Colour; // (r,g,b,a)
attribute vec2 in_TextureCoord; // (u,v)
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main()
{
vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
v_vColour = in_Colour;
v_vTexcoord = in_TextureCoord;
}

View file

@ -0,0 +1,10 @@
{
"resourceType": "GMShader",
"resourceVersion": "1.0",
"name": "sh_perlin_extra",
"parent": {
"name": "noise",
"path": "folders/shader/generator/noise.yy",
},
"type": 1,
}

View file

@ -16,38 +16,43 @@ uniform vec2 colorRanR;
uniform vec2 colorRanG;
uniform vec2 colorRanB;
vec3 hsv2rgb(vec3 c) {
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 random (in vec2 st, float seed) {
return fract(sin(dot(st.xy + vec2(21.4564, 46.8564), vec2(12.9898, 78.233))) * (43758.5453123 + seed));
}
float noise (in vec2 st, in vec2 scale) {
vec2 cellMin = tile == 1? mod(floor(st), scale) : floor(st);
vec2 cellMax = tile == 1? mod(floor(st) + vec2(1., 1.), scale) : floor(st) + vec2(1., 1.);
vec2 f = fract(st);
// Four corners in 2D of a tile
float random (in vec2 st, float seed) { return fract(sin(dot(st.xy + vec2(21.4564, 46.8564), vec2(12.9898, 78.233))) * (43758.5453123 + seed)); }
float randomFloat (in vec2 st, float seed) { #region
float sedSt = floor(seed);
float sedFr = fract(seed);
float a = mix(random(vec2(cellMin.x, cellMin.y), sedSt), random(vec2(cellMin.x, cellMin.y), sedSt + 1.), sedFr);
float b = mix(random(vec2(cellMax.x, cellMin.y), sedSt), random(vec2(cellMax.x, cellMin.y), sedSt + 1.), sedFr);
float c = mix(random(vec2(cellMin.x, cellMax.y), sedSt), random(vec2(cellMin.x, cellMax.y), sedSt + 1.), sedFr);
float d = mix(random(vec2(cellMax.x, cellMax.y), sedSt), random(vec2(cellMax.x, cellMax.y), sedSt + 1.), sedFr);
return mix(random(st, sedSt), random(st, sedSt + 1.), sedFr);
} #endregion
// Cubic Hermine Curve. Same as SmoothStep()
vec2 u = f * f * (3.0 - 2.0 * f);
vec2 random2 (in vec2 st, float seed) { return vec2(random(st, seed), random(st, seed + 1.864354564)); }
// Mix 4 coorners percentages
return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
}
float noise (in vec2 st, in vec2 scale) { #region
vec2 cellMin = floor(st);
vec2 cellMax = floor(st) + vec2(1., 1.);
if(tile == 1) {
cellMin = mod(cellMin, scale);
cellMax = mod(cellMax, scale);
}
vec2 f = fract(st);
vec2 u = f * f * (3.0 - 2.0 * f);
float a = randomFloat(vec2(cellMin.x, cellMin.y), seed);
float b = randomFloat(vec2(cellMax.x, cellMin.y), seed);
float c = randomFloat(vec2(cellMin.x, cellMax.y), seed);
float d = randomFloat(vec2(cellMax.x, cellMax.y), seed);
return abs(mix(mix(a, b, u.x), mix(c, d, u.x), u.y));
} #endregion
float perlin(in vec2 st) {
float perlin(in vec2 st) { #region
float amp = pow(2., float(iteration) - 1.) / (pow(2., float(iteration)) - 1.);
float n = 0.;
vec2 pos = st;
@ -56,15 +61,18 @@ float perlin(in vec2 st) {
for(int i = 0; i < iteration; i++) {
n += noise(pos, sc) * amp;
pos.x += random(vec2(float(i)), 0.574186) * sc;
pos.y += random(vec2(float(i)), 0.821458) * sc;
sc *= 2.;
amp *= .5;
pos *= 2.;
}
return n;
}
} #endregion
void main() {
void main() { #region
if(colored == 0) {
vec2 pos = (v_vTexcoord + position) * scale;
gl_FragColor = vec4(vec3(perlin(pos)), 1.0);
@ -81,4 +89,4 @@ void main() {
gl_FragColor = vec4(hsv2rgb(vec3(randH, randS, randV)), 1.0);
}
}
} #endregion