From 37d6676dbca5e30e8a817ef20514e9a1525c9d9c Mon Sep 17 00:00:00 2001 From: Tanasart Date: Thu, 16 Nov 2023 08:49:52 +0700 Subject: [PATCH] Frame selections --- PixelComposer.resource_order | 2 + PixelComposer.yyp | 3 + objects/o_dialog_add_node/Create_0.gml | 29 ++++-- scripts/node_data/node_data.gml | 2 +- scripts/node_frame/node_frame.gml | 3 +- scripts/node_pc_balls/node_pc_balls.gml | 97 ++++++++++++++++++ scripts/node_pc_balls/node_pc_balls.yy | 11 ++ .../node_perlin_extra/node_perlin_extra.gml | 6 +- scripts/node_registry/node_registry.gml | 8 +- scripts/panel_collection/panel_collection.gml | 13 ++- scripts/panel_graph/panel_graph.gml | 17 ++- shaders/sh_perlin_extra/sh_perlin_extra.fsh | 7 +- .../5ae9f0ed-a137-4815-82ce-948069e175e0.png | Bin 0 -> 4567 bytes .../13a61b1b-f8ef-4199-a2cb-e3a78caa9d2a.png | Bin 0 -> 4567 bytes .../s_node_perlin_extra.yy | 74 +++++++++++++ 15 files changed, 253 insertions(+), 19 deletions(-) create mode 100644 scripts/node_pc_balls/node_pc_balls.gml create mode 100644 scripts/node_pc_balls/node_pc_balls.yy create mode 100644 sprites/s_node_perlin_extra/5ae9f0ed-a137-4815-82ce-948069e175e0.png create mode 100644 sprites/s_node_perlin_extra/layers/5ae9f0ed-a137-4815-82ce-948069e175e0/13a61b1b-f8ef-4199-a2cb-e3a78caa9d2a.png create mode 100644 sprites/s_node_perlin_extra/s_node_perlin_extra.yy diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index c69efdb20..e3ac2806d 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -240,6 +240,7 @@ {"name":"button","order":34,"path":"folders/widgets/button.yy",}, {"name":"rotator","order":35,"path":"folders/widgets/rotator.yy",}, {"name":"text","order":36,"path":"folders/widgets/text.yy",}, + {"name":"PC effects","order":24,"path":"folders/nodes/data/PC effects.yy",}, ], "ResourceOrderSettings": [ {"name":"s_node_corner","order":16,"path":"sprites/s_node_corner/s_node_corner.yy",}, @@ -1116,6 +1117,7 @@ {"name":"sh_pb_shade_half","order":5,"path":"shaders/sh_pb_shade_half/sh_pb_shade_half.yy",}, {"name":"node_polar","order":4,"path":"scripts/node_polar/node_polar.yy",}, {"name":"s_node_twirl","order":41,"path":"sprites/s_node_twirl/s_node_twirl.yy",}, + {"name":"s_node_perlin_extra","order":31,"path":"sprites/s_node_perlin_extra/s_node_perlin_extra.yy",}, {"name":"sh_2d_light","order":28,"path":"shaders/sh_2d_light/sh_2d_light.yy",}, {"name":"node_image_animated","order":2,"path":"scripts/node_image_animated/node_image_animated.yy",}, {"name":"s_node_transform_array","order":17,"path":"sprites/s_node_transform_array/s_node_transform_array.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index e4bf053d8..c996f990d 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -275,6 +275,7 @@ {"resourceType":"GMFolder","resourceVersion":"1.0","name":"button","folderPath":"folders/widgets/button.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"rotator","folderPath":"folders/widgets/rotator.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"text","folderPath":"folders/widgets/text.yy",}, + {"resourceType":"GMFolder","resourceVersion":"1.0","name":"PC effects","folderPath":"folders/nodes/data/PC effects.yy",}, ], "IncludedFiles": [ {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ApolloHelp.html","ConfigValues":{"Itch":{"CopyToMask":"0",},},"CopyToMask":-1,"filePath":"datafiles",}, @@ -1799,6 +1800,7 @@ {"id":{"name":"sh_pb_shade_half","path":"shaders/sh_pb_shade_half/sh_pb_shade_half.yy",},}, {"id":{"name":"node_polar","path":"scripts/node_polar/node_polar.yy",},}, {"id":{"name":"s_node_twirl","path":"sprites/s_node_twirl/s_node_twirl.yy",},}, + {"id":{"name":"s_node_perlin_extra","path":"sprites/s_node_perlin_extra/s_node_perlin_extra.yy",},}, {"id":{"name":"sh_2d_light","path":"shaders/sh_2d_light/sh_2d_light.yy",},}, {"id":{"name":"instance_variable_set","path":"scripts/instance_variable_set/instance_variable_set.yy",},}, {"id":{"name":"node_image_animated","path":"scripts/node_image_animated/node_image_animated.yy",},}, @@ -1878,6 +1880,7 @@ {"id":{"name":"_f_p0b","path":"fonts/_f_p0b/_f_p0b.yy",},}, {"id":{"name":"s_node_armature_pose","path":"sprites/s_node_armature_pose/s_node_armature_pose.yy",},}, {"id":{"name":"sh_fd_visualize_pressure_glsl","path":"shaders/sh_fd_visualize_pressure_glsl/sh_fd_visualize_pressure_glsl.yy",},}, + {"id":{"name":"node_pc_balls","path":"scripts/node_pc_balls/node_pc_balls.yy",},}, {"id":{"name":"s_node_rigidSim_force","path":"sprites/s_node_rigidSim_force/s_node_rigidSim_force.yy",},}, {"id":{"name":"fd_rectangle_set_acceleration","path":"scripts/fd_rectangle_set_acceleration/fd_rectangle_set_acceleration.yy",},}, {"id":{"name":"s_node_vec2","path":"sprites/s_node_vec2/s_node_vec2.yy",},}, diff --git a/objects/o_dialog_add_node/Create_0.gml b/objects/o_dialog_add_node/Create_0.gml index 54f377565..a81dee540 100644 --- a/objects/o_dialog_add_node/Create_0.gml +++ b/objects/o_dialog_add_node/Create_0.gml @@ -265,13 +265,11 @@ event_inherited(); var name = ""; if(i == -1) { - //draw_set_text(f_p0b, fa_left, fa_center, COLORS._main_text_accent); name = "All"; } else { var cat = category[| i]; name = cat.name; - //draw_set_text(f_p0, fa_left, fa_center, COLORS._main_text); - + if(array_length(cat.filter)) { if(!array_exists(cat.filter, context)) { if(ADD_NODE_PAGE == i) @@ -282,9 +280,12 @@ event_inherited(); } } - BLEND_OVERRIDE; + var _hov = false; + BLEND_OVERRIDE if(sHOVER && catagory_pane.hover && point_in_rectangle(_m[0], _m[1], 0, _y + hh, category_width - ui(32), _y + hh + hg - 1)) { draw_sprite_stretched_ext(THEME.ui_panel_bg, 0, 0, _y + hh, category_width - ui(32), hg, CDEF.main_white, 1); + _hov = true; + if(i != ADD_NODE_PAGE && mouse_click(mb_left, sFOCUS)) { setPage(i); content_pane.scroll_y = 0; @@ -292,13 +293,29 @@ event_inherited(); content_pane.scroll_y_to = 0; } } - BLEND_NORMAL; + BLEND_NORMAL if(i == ADD_NODE_PAGE) draw_set_text(f_p0b, fa_left, fa_center, COLORS._main_text_accent); else draw_set_text(f_p0, fa_left, fa_center, COLORS._main_text_inner); + var _is_extra = name == "Extra"; name = __txt(name); - draw_text(ui(8), _y + hh + hg / 2, name); + + var _tx = ui(8); + var _ty = _y + hh + hg / 2; + draw_text(_tx, _ty, name); + + if(_is_extra) { + var _cx = _tx + string_width(name) + ui(4); + var _cy = _ty - string_height(name) / 2 + ui(6); + + gpu_set_colorwriteenable(1, 1, 1, 0); + draw_sprite_ext(s_patreon_supporter, 0, _cx, _cy, 1, 1, 0, _hov? COLORS._main_icon_dark : COLORS.panel_bg_clear, 1); + gpu_set_colorwriteenable(1, 1, 1, 1); + + draw_sprite_ext(s_patreon_supporter, 1, _cx, _cy, 1, 1, 0, i == ADD_NODE_PAGE? COLORS._main_text_accent : COLORS._main_text_inner, 1); + } + hh += hg; } diff --git a/scripts/node_data/node_data.gml b/scripts/node_data/node_data.gml index 2f2386fee..ddf11f988 100644 --- a/scripts/node_data/node_data.gml +++ b/scripts/node_data/node_data.gml @@ -1166,7 +1166,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x static groupCheck = function(_x, _y, _s, _mx, _my) {} - static drawNodeBG = function(_x, _y, _mx, _my, _s, display_parameter = noone) {} + static drawNodeBG = function(_x, _y, _mx, _my, _s, display_parameter = noone) { return false; } static drawNode = function(_x, _y, _mx, _my, _s, display_parameter = noone) { #region if(draw_graph_culled) return; diff --git a/scripts/node_frame/node_frame.gml b/scripts/node_frame/node_frame.gml index 9b4ab5b98..09cf1eaaa 100644 --- a/scripts/node_frame/node_frame.gml +++ b/scripts/node_frame/node_frame.gml @@ -118,7 +118,8 @@ function Node_Frame(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { size_dragging_my = mouse_my; } } - return noone; + + return point_in_rectangle(_mx, _my, xx, yy, x1, y1); } #endregion static pointIn = function(_x, _y, _mx, _my, _s) { #region diff --git a/scripts/node_pc_balls/node_pc_balls.gml b/scripts/node_pc_balls/node_pc_balls.gml new file mode 100644 index 000000000..f895f4a90 --- /dev/null +++ b/scripts/node_pc_balls/node_pc_balls.gml @@ -0,0 +1,97 @@ +function Node_PC_Balls(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor { + name = "Pixel Cloud"; + + shader = sh_pixel_cloud; + uniform_sed = shader_get_uniform(shader, "seed"); + uniform_str = shader_get_uniform(shader, "strength"); + uniform_dis = shader_get_uniform(shader, "dist"); + + uniform_map_use = shader_get_uniform(shader, "useMap"); + uniform_map = shader_get_sampler_index(shader, "strengthMap"); + + uniform_grad_blend = shader_get_uniform(shader, "gradient_blend"); + uniform_grad = shader_get_uniform(shader, "gradient_color"); + uniform_grad_time = shader_get_uniform(shader, "gradient_time"); + uniform_grad_key = shader_get_uniform(shader, "gradient_keys"); + + uniform_alpha = shader_get_uniform(shader, "alpha_curve"); + uniform_alamo = shader_get_uniform(shader, "curve_amount"); + uniform_rnd = shader_get_uniform(shader, "randomAmount"); + + inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0); + + inputs[| 1] = nodeValue("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, irandom(100000)); + + inputs[| 2] = nodeValue("Strength", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.1) + .setDisplay(VALUE_DISPLAY.slider, { range: [ 0, 2, 0.01] }); + + inputs[| 3] = nodeValue("Strength map", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0); + + inputs[| 4] = nodeValue("Color over lifetime", self, JUNCTION_CONNECT.input, VALUE_TYPE.gradient, new gradientObject(c_white) ); + + inputs[| 5] = nodeValue("Distance", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1); + + inputs[| 6] = nodeValue("Alpha over lifetime", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, CURVE_DEF_11); + + inputs[| 7] = nodeValue("Random blending", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.1) + .setDisplay(VALUE_DISPLAY.slider); + + inputs[| 8] = nodeValue("Active", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true); + active_index = 8; + + input_display_list = [ 8, + ["Input", true], 0, 1, + ["Movement", false], 5, 2, 3, + ["Color", true], 4, 6, 7 + ] + + outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); + + attribute_surface_depth(); + + static processData = function(_outSurf, _data, _output_index, _array_index) { + var _sed = _data[1]; + var _str = _data[2]; + var _map = _data[3]; + var _gra = _data[4]; + var _dis = _data[5]; + var _alp = _data[6]; + var _rnd = _data[7]; + + var _grad = _gra.toArray(); + var _grad_color = _grad[0]; + var _grad_time = _grad[1]; + + surface_set_target(_outSurf); + DRAW_CLEAR + BLEND_OVERRIDE; + + shader_set(shader); + shader_set_uniform_f(uniform_sed, _sed); + shader_set_uniform_f(uniform_str, _str); + shader_set_uniform_f(uniform_dis, _dis); + if(is_surface(_map)) { + shader_set_uniform_i(uniform_map_use, 1); + texture_set_stage(uniform_map, surface_get_texture(_map)); + } else { + shader_set_uniform_i(uniform_map_use, 0); + } + + shader_set_uniform_i(uniform_grad_blend, _gra.type); + shader_set_uniform_f_array_safe(uniform_grad, _grad_color); + shader_set_uniform_f_array_safe(uniform_grad_time, _grad_time); + shader_set_uniform_i(uniform_grad_key, array_length(_gra.keys)); + + shader_set_uniform_f_array_safe(uniform_alpha, _alp); + shader_set_uniform_i(uniform_alamo, array_length(_alp)); + shader_set_uniform_f(uniform_rnd, _rnd); + + draw_surface_safe(_data[0], 0, 0); + shader_reset(); + + BLEND_NORMAL; + surface_reset_target(); + + return _outSurf; + } +} \ No newline at end of file diff --git a/scripts/node_pc_balls/node_pc_balls.yy b/scripts/node_pc_balls/node_pc_balls.yy new file mode 100644 index 000000000..b9b10ccf6 --- /dev/null +++ b/scripts/node_pc_balls/node_pc_balls.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "node_pc_balls", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "PC effects", + "path": "folders/nodes/data/PC effects.yy", + }, +} \ No newline at end of file diff --git a/scripts/node_perlin_extra/node_perlin_extra.gml b/scripts/node_perlin_extra/node_perlin_extra.gml index d268e4331..775bf6b87 100644 --- a/scripts/node_perlin_extra/node_perlin_extra.gml +++ b/scripts/node_perlin_extra/node_perlin_extra.gml @@ -40,9 +40,13 @@ function Node_Perlin_Extra(_x, _y, _group = noone) : Node_Shader_Generator(_x, _ .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Absolute worley", "Fluid", "Noisy perlin", "Camo" ]); addShaderProp(SHADER_UNIFORM.integer, "type"); + inputs[| 11] = nodeValue("Parameter A", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0) + .setDisplay(VALUE_DISPLAY.slider); + addShaderProp(SHADER_UNIFORM.float, "param"); + input_display_list = [ ["Output", true], 0, 5, - ["Noise", false], 10, 1, 2, 3, 4, + ["Noise", false], 10, 1, 2, 3, 4, 11, ["Render", false], 6, 7, 8, 9, ]; diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index c59d3b332..54307e233 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -46,6 +46,8 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio static patreonExtra = function() { INLINE is_patreon_extra = true; + + ds_list_add(global.SUPPORTER_NODES, self); return self; } @@ -206,6 +208,8 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio global.RECENT_NODES = file_exists(recPath)? json_load_struct(recPath) : []; if(!is_array(global.RECENT_NODES)) global.RECENT_NODES = []; + global.SUPPORTER_NODES = ds_list_create(); + var group = ds_list_create(); #region addNodeCatagory("Group", group, ["Node_Group"]); ds_list_add(group, "Groups"); @@ -549,7 +553,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(); + addNodeObject(generator, "Extra Perlins", s_node_perlin_extra, "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."); @@ -814,6 +818,8 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio addNodeCatagory("Custom", customs); __initNodeCustom(customs); + if(IS_PATREON) addNodeCatagory("Extra", global.SUPPORTER_NODES); + //var vct = ds_list_create(); //addNodeCatagory("VCT", vct); // addNodeObject(vct, "Biterator", s_node_print, "Node_Biterator", [1, Node_Biterator]); diff --git a/scripts/panel_collection/panel_collection.gml b/scripts/panel_collection/panel_collection.gml index b1ddce456..d58291055 100644 --- a/scripts/panel_collection/panel_collection.gml +++ b/scripts/panel_collection/panel_collection.gml @@ -314,10 +314,21 @@ function Panel_Collection() : PanelContent() constructor { folderPane = new scrollPane(group_w - ui(8), content_h, function(_y, _m) { #region draw_clear_alpha(COLORS.panel_bg_clear, 1); - //draw_sprite_stretched(THEME.ui_panel_bg, 1, ui(8), 0, folderPane.surface_w - ui(8), folderPane.surface_h); var hh = ui(8); _y += ui(8); + if(pHOVER && folderPane.hover && point_in_rectangle(_m[0], _m[1], ui(32), _y - ui(2), group_w - ui(32), _y + ui(24))) { + draw_sprite_stretched_ext(THEME.ui_panel_bg, 0, ui(32), _y - ui(2), group_w - ui(64), ui(24), CDEF.main_white, 1); + if(mouse_press(mb_left, pFOCUS)) + setContext(root); + } + + draw_set_alpha(0.25 + (context == root) * 0.5); + draw_set_text(f_p2, fa_center, fa_top, context == root? COLORS._main_text_accent : COLORS._main_text_inner); + draw_text(group_w / 2, _y, __txt("uncategorized")); + draw_set_alpha(1); + _y += ui(24); + for(var i = 0; i < ds_list_size(root.subDir); i++) { var hg = root.subDir[| i].draw(self, ui(8 + in_dialog * 8), _y, _m, folderPane.w - ui(20), pHOVER && folderPane.hover, pFOCUS, root); hh += hg; diff --git a/scripts/panel_graph/panel_graph.gml b/scripts/panel_graph/panel_graph.gml index 851f5eb0d..fac1ec038 100644 --- a/scripts/panel_graph/panel_graph.gml +++ b/scripts/panel_graph/panel_graph.gml @@ -73,6 +73,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { selection_block = 0; nodes_selecting = []; nodes_select_drag = 0; + nodes_select_frame = 0; nodes_select_mx = 0; nodes_select_my = 0; @@ -724,6 +725,8 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { var log = false; var t = current_time; + var frame_hovering = noone; + for(var i = 0; i < ds_list_size(nodes_list); i++) { nodes_list[| i].cullCheck(gr_x, gr_y, graph_s, -32, -32, w + 32, h + 64); nodes_list[| i].preDraw(gr_x, gr_y, graph_s, gr_x, gr_y); @@ -731,8 +734,10 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { printIf(log, "Predraw time: " + string(current_time - t)); t = current_time; #region draw frame - for(var i = 0; i < ds_list_size(nodes_list); i++) - nodes_list[| i].drawNodeBG(gr_x, gr_y, mx, my, graph_s, display_parameter); + for(var i = 0; i < ds_list_size(nodes_list); i++) { + if(nodes_list[| i].drawNodeBG(gr_x, gr_y, mx, my, graph_s, display_parameter)) + frame_hovering = nodes_list[| i]; + } #endregion printIf(log, "Frame draw time: " + string(current_time - t)); t = current_time; @@ -1064,7 +1069,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { for(var i = 0; i < ds_list_size(nodes_list); i++) { var _node = nodes_list[| i]; - if(is_instanceof(_node, Node_Frame)) continue; + if(is_instanceof(_node, Node_Frame) && !nodes_select_frame) continue; var _x = (_node.x + graph_x) * graph_s; var _y = (_node.y + graph_y) * graph_s; var _w = _node.w * graph_s; @@ -1096,7 +1101,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { if(mouse_release(mb_left)) nodes_junction_d = noone; } - + if(mouse_on_graph && mouse_press(mb_left, pFOCUS) && !graph_dragging_key && !graph_zooming_key) { if(junction_hovering && junction_hovering.draw_line_shift_hover) { nodes_select_mx = mx; @@ -1105,7 +1110,9 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { nodes_junction_dx = junction_hovering.draw_line_shift_x; nodes_junction_dy = junction_hovering.draw_line_shift_y; } else if(array_empty(nodes_selecting) && !value_focus && !drag_locking) { - nodes_select_drag = 1; + nodes_select_drag = 1; + nodes_select_frame = frame_hovering == noone; + nodes_select_mx = mx; nodes_select_my = my; } diff --git a/shaders/sh_perlin_extra/sh_perlin_extra.fsh b/shaders/sh_perlin_extra/sh_perlin_extra.fsh index 4cf8138dc..eba32f037 100644 --- a/shaders/sh_perlin_extra/sh_perlin_extra.fsh +++ b/shaders/sh_perlin_extra/sh_perlin_extra.fsh @@ -11,6 +11,7 @@ uniform vec2 u_resolution; uniform vec2 scale; uniform int iteration; uniform float seed; +uniform float param; uniform int tile; uniform int colored; @@ -88,7 +89,7 @@ float perlin(in vec2 st) { #region if(type == 3) { m += _n * amp; if(mod(i, 3.) == 2.) { - n += smoothstep(0.4, 0.6, m) * amp; + n += smoothstep(0.5 - param, 0.5 + param, m) * amp; m = 0.; sc /= 1.5; @@ -111,12 +112,12 @@ float perlin(in vec2 st) { #region } else if(type == 1) { sc *= 2.; amp *= .5; - pos *= 1. + _n; + pos *= 1. + _n + param; } else if(type == 2) { sc *= 2.; amp *= .5; pos += random2(vec2(n), seed) / sc; - pos *= 2.; + pos *= (2. + param); } } diff --git a/sprites/s_node_perlin_extra/5ae9f0ed-a137-4815-82ce-948069e175e0.png b/sprites/s_node_perlin_extra/5ae9f0ed-a137-4815-82ce-948069e175e0.png new file mode 100644 index 0000000000000000000000000000000000000000..93d518cd2e13ccbc2d2fab4eb6e53270007cdd39 GIT binary patch literal 4567 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","resourceVersion":"1.0","Keyframes":[],}, + "eventStubScript": null, + "eventToFunction": {}, + "length": 1.0, + "lockOrigin": false, + "moments": {"resourceType":"KeyframeStore","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","resourceVersion":"1.0","Keyframes":[ + {"resourceType":"Keyframe","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"5ae9f0ed-a137-4815-82ce-948069e175e0","path":"sprites/s_node_perlin_extra/s_node_perlin_extra.yy",},},},"Disabled":false,"id":"f209861b-34aa-4a7b-8f3f-e4d4990f027e","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, +} \ No newline at end of file