From 18145a5109e9e8ff5b076c1c67a1b45a6f51b455 Mon Sep 17 00:00:00 2001 From: Tanasart Date: Wed, 22 Nov 2023 21:25:36 +0700 Subject: [PATCH] Supporter extra nodes --- PixelComposer.resource_order | 9 ++ PixelComposer.yyp | 9 ++ objects/o_dialog_add_node/Create_0.gml | 4 +- .../o_dialog_textbox_autocomplete/Draw_64.gml | 2 +- scripts/node_caustic/node_caustic.gml | 28 +++++ scripts/node_caustic/node_caustic.yy | 11 ++ scripts/node_caustic/node_gradient.yy | 12 +++ scripts/node_noise_gabor/node_noise_gabor.gml | 18 +++- scripts/node_noise_shard/node_gradient.yy | 12 +++ scripts/node_noise_shard/node_noise_shard.gml | 28 +++++ scripts/node_noise_shard/node_noise_shard.yy | 11 ++ scripts/node_noise_wavelet/node_gradient.yy | 12 +++ .../node_noise_wavelet/node_noise_wavelet.gml | 28 +++++ .../node_noise_wavelet/node_noise_wavelet.yy | 11 ++ scripts/node_registry/node_registry.gml | 3 + scripts/pcx_ast/pcx_ast.gml | 4 + scripts/pcx_parse/pcx_parse.gml | 4 +- scripts/textArea/textArea.gml | 2 +- shaders/sh_noise_gabor/sh_noise_gabor.fsh | 21 ++-- shaders/sh_noise_shard/sh_noise_shard.fsh | 56 ++++++++++ shaders/sh_noise_shard/sh_noise_shard.vsh | 19 ++++ shaders/sh_noise_shard/sh_noise_shard.yy | 10 ++ shaders/sh_noise_wavelet/sh_noise_wavelet.fsh | 47 +++++++++ shaders/sh_noise_wavelet/sh_noise_wavelet.vsh | 19 ++++ shaders/sh_noise_wavelet/sh_noise_wavelet.yy | 10 ++ shaders/sh_water_caustic/sh_water_caustic.fsh | 99 ++++++++++++++++++ shaders/sh_water_caustic/sh_water_caustic.vsh | 19 ++++ shaders/sh_water_caustic/sh_water_caustic.yy | 10 ++ .../611b4e09-5b35-4f71-9cf6-5b44a68648c6.png | Bin 0 -> 3853 bytes .../99a9fea1-d45d-4593-bad2-24a9b95be120.png | Bin 0 -> 3853 bytes sprites/s_node_caustic/s_node_caustic.yy | 74 +++++++++++++ .../36d6f6f3-f701-4ef8-9a0a-29710ccc58de.png | Bin 0 -> 4559 bytes .../1c21ba1f-decf-4ef5-a7f7-4d930da8b6fa.png | Bin 0 -> 4559 bytes sprites/s_node_shard/s_node_shard.yy | 74 +++++++++++++ .../d9547083-0d8e-4682-9fef-b32aa1cc2d80.png | Bin 0 -> 3955 bytes .../a9920691-60ec-4d4e-a7db-3e5c529dfc36.png | Bin 0 -> 3955 bytes sprites/s_node_wavelet/s_node_wavelet.yy | 74 +++++++++++++ 37 files changed, 725 insertions(+), 15 deletions(-) create mode 100644 scripts/node_caustic/node_caustic.gml create mode 100644 scripts/node_caustic/node_caustic.yy create mode 100644 scripts/node_caustic/node_gradient.yy create mode 100644 scripts/node_noise_shard/node_gradient.yy create mode 100644 scripts/node_noise_shard/node_noise_shard.gml create mode 100644 scripts/node_noise_shard/node_noise_shard.yy create mode 100644 scripts/node_noise_wavelet/node_gradient.yy create mode 100644 scripts/node_noise_wavelet/node_noise_wavelet.gml create mode 100644 scripts/node_noise_wavelet/node_noise_wavelet.yy create mode 100644 shaders/sh_noise_shard/sh_noise_shard.fsh create mode 100644 shaders/sh_noise_shard/sh_noise_shard.vsh create mode 100644 shaders/sh_noise_shard/sh_noise_shard.yy create mode 100644 shaders/sh_noise_wavelet/sh_noise_wavelet.fsh create mode 100644 shaders/sh_noise_wavelet/sh_noise_wavelet.vsh create mode 100644 shaders/sh_noise_wavelet/sh_noise_wavelet.yy create mode 100644 shaders/sh_water_caustic/sh_water_caustic.fsh create mode 100644 shaders/sh_water_caustic/sh_water_caustic.vsh create mode 100644 shaders/sh_water_caustic/sh_water_caustic.yy create mode 100644 sprites/s_node_caustic/611b4e09-5b35-4f71-9cf6-5b44a68648c6.png create mode 100644 sprites/s_node_caustic/layers/611b4e09-5b35-4f71-9cf6-5b44a68648c6/99a9fea1-d45d-4593-bad2-24a9b95be120.png create mode 100644 sprites/s_node_caustic/s_node_caustic.yy create mode 100644 sprites/s_node_shard/36d6f6f3-f701-4ef8-9a0a-29710ccc58de.png create mode 100644 sprites/s_node_shard/layers/36d6f6f3-f701-4ef8-9a0a-29710ccc58de/1c21ba1f-decf-4ef5-a7f7-4d930da8b6fa.png create mode 100644 sprites/s_node_shard/s_node_shard.yy create mode 100644 sprites/s_node_wavelet/d9547083-0d8e-4682-9fef-b32aa1cc2d80.png create mode 100644 sprites/s_node_wavelet/layers/d9547083-0d8e-4682-9fef-b32aa1cc2d80/a9920691-60ec-4d4e-a7db-3e5c529dfc36.png create mode 100644 sprites/s_node_wavelet/s_node_wavelet.yy diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index cdcbe22ab..e6801a24e 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -532,6 +532,7 @@ {"name":"rotatorRange","order":2,"path":"scripts/rotatorRange/rotatorRange.yy",}, {"name":"node_3d_mesh_cone","order":6,"path":"scripts/node_3d_mesh_cone/node_3d_mesh_cone.yy",}, {"name":"font_loader","order":8,"path":"scripts/font_loader/font_loader.yy",}, + {"name":"sh_water_caustic","order":36,"path":"shaders/sh_water_caustic/sh_water_caustic.yy",}, {"name":"node_iterator_filter_input","order":1,"path":"scripts/node_iterator_filter_input/node_iterator_filter_input.yy",}, {"name":"point_rotate","order":1,"path":"scripts/point_rotate/point_rotate.yy",}, {"name":"s_node_vfx_variable","order":10,"path":"sprites/s_node_vfx_variable/s_node_vfx_variable.yy",}, @@ -692,6 +693,7 @@ {"name":"sh_3d_extrude_filler","order":8,"path":"shaders/sh_3d_extrude_filler/sh_3d_extrude_filler.yy",}, {"name":"quarternionBox","order":8,"path":"scripts/quarternionBox/quarternionBox.yy",}, {"name":"s_window_exit","order":2,"path":"sprites/s_window_exit/s_window_exit.yy",}, + {"name":"node_noise_shard","order":12,"path":"scripts/node_noise_shard/node_noise_shard.yy",}, {"name":"s_node_color_remove","order":7,"path":"sprites/s_node_color_remove/s_node_color_remove.yy",}, {"name":"sh_average","order":7,"path":"shaders/sh_average/sh_average.yy",}, {"name":"sh_warp_4points_pers","order":10,"path":"shaders/sh_warp_4points_pers/sh_warp_4points_pers.yy",}, @@ -789,6 +791,7 @@ {"name":"o_dialog_textbox_function_guide","order":8,"path":"objects/o_dialog_textbox_function_guide/o_dialog_textbox_function_guide.yy",}, {"name":"node_3d_material","order":6,"path":"scripts/node_3d_material/node_3d_material.yy",}, {"name":"pcx_server","order":2,"path":"scripts/pcx_server/pcx_server.yy",}, + {"name":"sh_noise_shard","order":11,"path":"shaders/sh_noise_shard/sh_noise_shard.yy",}, {"name":"s_node_array_set","order":9,"path":"sprites/s_node_array_set/s_node_array_set.yy",}, {"name":"node_dust","order":19,"path":"scripts/node_dust/node_dust.yy",}, {"name":"node_noise_cell","order":2,"path":"scripts/node_noise_cell/node_noise_cell.yy",}, @@ -948,6 +951,7 @@ {"name":"node_sprite_stack","order":3,"path":"scripts/node_sprite_stack/node_sprite_stack.yy",}, {"name":"s_node_smokeSim_vortex","order":4,"path":"sprites/s_node_smokeSim_vortex/s_node_smokeSim_vortex.yy",}, {"name":"s_node_json_file_read","order":11,"path":"sprites/s_node_json_file_read/s_node_json_file_read.yy",}, + {"name":"s_node_wavelet","order":34,"path":"sprites/s_node_wavelet/s_node_wavelet.yy",}, {"name":"s_workshop_badge_version","order":3,"path":"sprites/s_workshop_badge_version/s_workshop_badge_version.yy",}, {"name":"s_node_palette_shift","order":58,"path":"sprites/s_node_palette_shift/s_node_palette_shift.yy",}, {"name":"__strandSim","order":2,"path":"scripts/__strandSim/__strandSim.yy",}, @@ -1254,6 +1258,7 @@ {"name":"FirebaseListenerUserFunctions_Firestore","order":2,"path":"scripts/FirebaseListenerUserFunctions_Firestore/FirebaseListenerUserFunctions_Firestore.yy",}, {"name":"FirebaseSetup","order":2,"path":"extensions/FirebaseSetup/FirebaseSetup.yy",}, {"name":"json_prettify","order":7,"path":"scripts/json_prettify/json_prettify.yy",}, + {"name":"s_node_caustic","order":35,"path":"sprites/s_node_caustic/s_node_caustic.yy",}, {"name":"s_node_loop_output","order":13,"path":"sprites/s_node_loop_output/s_node_loop_output.yy",}, {"name":"s_node_smokeSim_domain_queue","order":3,"path":"sprites/s_node_smokeSim_domain_queue/s_node_smokeSim_domain_queue.yy",}, {"name":"panel_notification","order":4,"path":"scripts/panel_notification/panel_notification.yy",}, @@ -1353,6 +1358,7 @@ {"name":"node_export","order":9,"path":"scripts/node_export/node_export.yy",}, {"name":"controlPointBox","order":4,"path":"scripts/controlPointBox/controlPointBox.yy",}, {"name":"sh_vertex_pt","order":5,"path":"shaders/sh_vertex_pt/sh_vertex_pt.yy",}, + {"name":"sh_noise_wavelet","order":12,"path":"shaders/sh_noise_wavelet/sh_noise_wavelet.yy",}, {"name":"node_cache_base","order":18,"path":"scripts/node_cache_base/node_cache_base.yy",}, {"name":"fd_rectangle_set_velocity_dissipation_type","order":13,"path":"scripts/fd_rectangle_set_velocity_dissipation_type/fd_rectangle_set_velocity_dissipation_type.yy",}, {"name":"node_color_replacement","order":3,"path":"scripts/node_color_replacement/node_color_replacement.yy",}, @@ -1375,6 +1381,7 @@ {"name":"__init_global","order":8,"path":"scripts/__init_global/__init_global.yy",}, {"name":"sh_trail_filler_pass2","order":51,"path":"shaders/sh_trail_filler_pass2/sh_trail_filler_pass2.yy",}, {"name":"node_PCX_array_set","order":1,"path":"scripts/node_PCX_array_set/node_PCX_array_set.yy",}, + {"name":"node_caustic","order":23,"path":"scripts/node_caustic/node_caustic.yy",}, {"name":"s_node_regex_search","order":11,"path":"sprites/s_node_regex_search/s_node_regex_search.yy",}, {"name":"s_node_color_from_rgb","order":5,"path":"sprites/s_node_color_from_rgb/s_node_color_from_rgb.yy",}, {"name":"s_node_separate_file_path","order":14,"path":"sprites/s_node_separate_file_path/s_node_separate_file_path.yy",}, @@ -1421,6 +1428,7 @@ {"name":"libfilesystem","order":3,"path":"extensions/libfilesystem/libfilesystem.yy",}, {"name":"node_channels_hsv","order":1,"path":"scripts/node_channels_hsv/node_channels_hsv.yy",}, {"name":"sh_stripe","order":10,"path":"shaders/sh_stripe/sh_stripe.yy",}, + {"name":"s_node_shard","order":33,"path":"sprites/s_node_shard/s_node_shard.yy",}, {"name":"node_path_trim","order":6,"path":"scripts/node_path_trim/node_path_trim.yy",}, {"name":"s_node_rigidSim_deactivate","order":7,"path":"sprites/s_node_rigidSim_deactivate/s_node_rigidSim_deactivate.yy",}, {"name":"sh_blend_contrast","order":16,"path":"shaders/sh_blend_contrast/sh_blend_contrast.yy",}, @@ -1751,6 +1759,7 @@ {"name":"s_node_array_zip","order":13,"path":"sprites/s_node_array_zip/s_node_array_zip.yy",}, {"name":"fd_rectangle_get_material_width","order":15,"path":"scripts/fd_rectangle_get_material_width/fd_rectangle_get_material_width.yy",}, {"name":"FirebaseREST_Firestore_collection_query_decode","order":7,"path":"scripts/FirebaseREST_Firestore_collection_query_decode/FirebaseREST_Firestore_collection_query_decode.yy",}, + {"name":"node_noise_wavelet","order":13,"path":"scripts/node_noise_wavelet/node_noise_wavelet.yy",}, {"name":"font_sprite_loader","order":10,"path":"scripts/font_sprite_loader/font_sprite_loader.yy",}, {"name":"s_node_noise_aniso","order":9,"path":"sprites/s_node_noise_aniso/s_node_noise_aniso.yy",}, {"name":"s_node_armature_path","order":17,"path":"sprites/s_node_armature_path/s_node_armature_path.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index 07d8c269c..9e35ca413 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -1134,6 +1134,7 @@ {"id":{"name":"rotatorRange","path":"scripts/rotatorRange/rotatorRange.yy",},}, {"id":{"name":"node_3d_mesh_cone","path":"scripts/node_3d_mesh_cone/node_3d_mesh_cone.yy",},}, {"id":{"name":"font_loader","path":"scripts/font_loader/font_loader.yy",},}, + {"id":{"name":"sh_water_caustic","path":"shaders/sh_water_caustic/sh_water_caustic.yy",},}, {"id":{"name":"node_iterator_filter_input","path":"scripts/node_iterator_filter_input/node_iterator_filter_input.yy",},}, {"id":{"name":"point_rotate","path":"scripts/point_rotate/point_rotate.yy",},}, {"id":{"name":"s_node_vfx_variable","path":"sprites/s_node_vfx_variable/s_node_vfx_variable.yy",},}, @@ -1320,6 +1321,7 @@ {"id":{"name":"quarternionBox","path":"scripts/quarternionBox/quarternionBox.yy",},}, {"id":{"name":"s_window_exit","path":"sprites/s_window_exit/s_window_exit.yy",},}, {"id":{"name":"d3d_gizmo_sphere","path":"scripts/d3d_gizmo_sphere/d3d_gizmo_sphere.yy",},}, + {"id":{"name":"node_noise_shard","path":"scripts/node_noise_shard/node_noise_shard.yy",},}, {"id":{"name":"node_3d_particle","path":"scripts/node_3d_particle/node_3d_particle.yy",},}, {"id":{"name":"s_node_color_remove","path":"sprites/s_node_color_remove/s_node_color_remove.yy",},}, {"id":{"name":"sh_average","path":"shaders/sh_average/sh_average.yy",},}, @@ -1433,6 +1435,7 @@ {"id":{"name":"node_3d_material","path":"scripts/node_3d_material/node_3d_material.yy",},}, {"id":{"name":"pcx_server","path":"scripts/pcx_server/pcx_server.yy",},}, {"id":{"name":"panel_animation_settings","path":"scripts/panel_animation_settings/panel_animation_settings.yy",},}, + {"id":{"name":"sh_noise_shard","path":"shaders/sh_noise_shard/sh_noise_shard.yy",},}, {"id":{"name":"s_node_array_set","path":"sprites/s_node_array_set/s_node_array_set.yy",},}, {"id":{"name":"node_dust","path":"scripts/node_dust/node_dust.yy",},}, {"id":{"name":"node_noise_cell","path":"scripts/node_noise_cell/node_noise_cell.yy",},}, @@ -1617,6 +1620,7 @@ {"id":{"name":"node_sprite_stack","path":"scripts/node_sprite_stack/node_sprite_stack.yy",},}, {"id":{"name":"s_node_smokeSim_vortex","path":"sprites/s_node_smokeSim_vortex/s_node_smokeSim_vortex.yy",},}, {"id":{"name":"s_node_json_file_read","path":"sprites/s_node_json_file_read/s_node_json_file_read.yy",},}, + {"id":{"name":"s_node_wavelet","path":"sprites/s_node_wavelet/s_node_wavelet.yy",},}, {"id":{"name":"s_workshop_badge_version","path":"sprites/s_workshop_badge_version/s_workshop_badge_version.yy",},}, {"id":{"name":"s_node_palette_shift","path":"sprites/s_node_palette_shift/s_node_palette_shift.yy",},}, {"id":{"name":"__strandSim","path":"scripts/__strandSim/__strandSim.yy",},}, @@ -1955,6 +1959,7 @@ {"id":{"name":"node_3d_light_directional","path":"scripts/node_3d_light_directional/node_3d_light_directional.yy",},}, {"id":{"name":"FirebaseSetup","path":"extensions/FirebaseSetup/FirebaseSetup.yy",},}, {"id":{"name":"json_prettify","path":"scripts/json_prettify/json_prettify.yy",},}, + {"id":{"name":"s_node_caustic","path":"sprites/s_node_caustic/s_node_caustic.yy",},}, {"id":{"name":"s_node_loop_output","path":"sprites/s_node_loop_output/s_node_loop_output.yy",},}, {"id":{"name":"s_node_smokeSim_domain_queue","path":"sprites/s_node_smokeSim_domain_queue/s_node_smokeSim_domain_queue.yy",},}, {"id":{"name":"_p_dialog","path":"objects/_p_dialog/_p_dialog.yy",},}, @@ -2074,6 +2079,7 @@ {"id":{"name":"node_export","path":"scripts/node_export/node_export.yy",},}, {"id":{"name":"controlPointBox","path":"scripts/controlPointBox/controlPointBox.yy",},}, {"id":{"name":"sh_vertex_pt","path":"shaders/sh_vertex_pt/sh_vertex_pt.yy",},}, + {"id":{"name":"sh_noise_wavelet","path":"shaders/sh_noise_wavelet/sh_noise_wavelet.yy",},}, {"id":{"name":"node_cache_base","path":"scripts/node_cache_base/node_cache_base.yy",},}, {"id":{"name":"fd_rectangle_set_velocity_dissipation_type","path":"scripts/fd_rectangle_set_velocity_dissipation_type/fd_rectangle_set_velocity_dissipation_type.yy",},}, {"id":{"name":"node_color_replacement","path":"scripts/node_color_replacement/node_color_replacement.yy",},}, @@ -2100,6 +2106,7 @@ {"id":{"name":"sh_trail_filler_pass2","path":"shaders/sh_trail_filler_pass2/sh_trail_filler_pass2.yy",},}, {"id":{"name":"node_PCX_array_set","path":"scripts/node_PCX_array_set/node_PCX_array_set.yy",},}, {"id":{"name":"sh_color_select_side","path":"shaders/sh_color_select_side/sh_color_select_side.yy",},}, + {"id":{"name":"node_caustic","path":"scripts/node_caustic/node_caustic.yy",},}, {"id":{"name":"s_node_regex_search","path":"sprites/s_node_regex_search/s_node_regex_search.yy",},}, {"id":{"name":"s_node_color_from_rgb","path":"sprites/s_node_color_from_rgb/s_node_color_from_rgb.yy",},}, {"id":{"name":"s_node_separate_file_path","path":"sprites/s_node_separate_file_path/s_node_separate_file_path.yy",},}, @@ -2152,6 +2159,7 @@ {"id":{"name":"libfilesystem","path":"extensions/libfilesystem/libfilesystem.yy",},}, {"id":{"name":"node_channels_hsv","path":"scripts/node_channels_hsv/node_channels_hsv.yy",},}, {"id":{"name":"sh_stripe","path":"shaders/sh_stripe/sh_stripe.yy",},}, + {"id":{"name":"s_node_shard","path":"sprites/s_node_shard/s_node_shard.yy",},}, {"id":{"name":"node_path_trim","path":"scripts/node_path_trim/node_path_trim.yy",},}, {"id":{"name":"s_node_rigidSim_deactivate","path":"sprites/s_node_rigidSim_deactivate/s_node_rigidSim_deactivate.yy",},}, {"id":{"name":"sh_blend_contrast","path":"shaders/sh_blend_contrast/sh_blend_contrast.yy",},}, @@ -2536,6 +2544,7 @@ {"id":{"name":"s_node_array_zip","path":"sprites/s_node_array_zip/s_node_array_zip.yy",},}, {"id":{"name":"fd_rectangle_get_material_width","path":"scripts/fd_rectangle_get_material_width/fd_rectangle_get_material_width.yy",},}, {"id":{"name":"FirebaseREST_Firestore_collection_query_decode","path":"scripts/FirebaseREST_Firestore_collection_query_decode/FirebaseREST_Firestore_collection_query_decode.yy",},}, + {"id":{"name":"node_noise_wavelet","path":"scripts/node_noise_wavelet/node_noise_wavelet.yy",},}, {"id":{"name":"font_sprite_loader","path":"scripts/font_sprite_loader/font_sprite_loader.yy",},}, {"id":{"name":"s_node_draw_atlas","path":"sprites/s_node_draw_atlas/s_node_draw_atlas.yy",},}, {"id":{"name":"s_node_noise_aniso","path":"sprites/s_node_noise_aniso/s_node_noise_aniso.yy",},}, diff --git a/objects/o_dialog_add_node/Create_0.gml b/objects/o_dialog_add_node/Create_0.gml index 8fcc75a4f..c9356eb17 100644 --- a/objects/o_dialog_add_node/Create_0.gml +++ b/objects/o_dialog_add_node/Create_0.gml @@ -414,8 +414,8 @@ event_inherited(); var group_labels = []; var _hoverContent = _hover; - if(ADD_NODE_PAGE >= 0 && PREFERENCES.dialog_add_node_grouping) - _hoverContent &= _m[1] > ui(8 + 24); + //if(ADD_NODE_PAGE >= 0 && PREFERENCES.dialog_add_node_grouping) + // _hoverContent &= _m[1] > ui(8 + 24); if(PREFERENCES.dialog_add_node_view == 0) { #region grid var grid_size = ui(64); diff --git a/objects/o_dialog_textbox_autocomplete/Draw_64.gml b/objects/o_dialog_textbox_autocomplete/Draw_64.gml index 7efd9df67..b2d635c27 100644 --- a/objects/o_dialog_textbox_autocomplete/Draw_64.gml +++ b/objects/o_dialog_textbox_autocomplete/Draw_64.gml @@ -1,5 +1,5 @@ /// @description -active = textbox != noone; +active = textbox != noone && array_length(data); if(textbox == noone) exit; if(textbox != WIDGET_CURRENT) exit; if(array_empty(data)) exit; diff --git a/scripts/node_caustic/node_caustic.gml b/scripts/node_caustic/node_caustic.gml new file mode 100644 index 000000000..b8b07edbf --- /dev/null +++ b/scripts/node_caustic/node_caustic.gml @@ -0,0 +1,28 @@ +function Node_Caustic(_x, _y, _group = noone) : Node_Shader_Generator(_x, _y, _group) constructor { + name = "Caustic"; + shader = sh_water_caustic; + + 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("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, irandom(99999)); + addShaderProp(SHADER_UNIFORM.float, "seed"); + + inputs[| 4] = nodeValue("Progress", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0) + addShaderProp(SHADER_UNIFORM.float, "progress"); + + inputs[| 5] = nodeValue("Detail", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1.24) + .setDisplay(VALUE_DISPLAY.slider, { range: [ 0, 2, 0.01 ] }); + addShaderProp(SHADER_UNIFORM.float, "detail"); + + input_display_list = [ + ["Output", true], 0, + ["Noise", false], 1, 2, 4, 5, + ]; +} \ No newline at end of file diff --git a/scripts/node_caustic/node_caustic.yy b/scripts/node_caustic/node_caustic.yy new file mode 100644 index 000000000..657cac361 --- /dev/null +++ b/scripts/node_caustic/node_caustic.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "node_caustic", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "generator", + "path": "folders/nodes/data/generator.yy", + }, +} \ No newline at end of file diff --git a/scripts/node_caustic/node_gradient.yy b/scripts/node_caustic/node_gradient.yy new file mode 100644 index 000000000..fa813bb58 --- /dev/null +++ b/scripts/node_caustic/node_gradient.yy @@ -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", +} \ No newline at end of file diff --git a/scripts/node_noise_gabor/node_noise_gabor.gml b/scripts/node_noise_gabor/node_noise_gabor.gml index 0cdbdb538..c35b3659f 100644 --- a/scripts/node_noise_gabor/node_noise_gabor.gml +++ b/scripts/node_noise_gabor/node_noise_gabor.gml @@ -13,9 +13,25 @@ function Node_Gabor_Noise(_x, _y, _group = noone) : Node_Shader_Generator(_x, _y inputs[| 3] = nodeValue("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, irandom(99999)); addShaderProp(SHADER_UNIFORM.float, "seed"); + + inputs[| 4] = nodeValue("Density", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 2) + .setDisplay(VALUE_DISPLAY.slider, { range: [ 0, 4, 0.01 ] }); + addShaderProp(SHADER_UNIFORM.float, "alignment"); + + inputs[| 5] = nodeValue("Sharpness", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 4) + .setDisplay(VALUE_DISPLAY.slider, { range: [ 0, 5, 0.01 ] }); + addShaderProp(SHADER_UNIFORM.float, "sharpness"); + + inputs[| 6] = nodeValue("Augment", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 11, 31 ]) + .setDisplay(VALUE_DISPLAY.vector); + addShaderProp(SHADER_UNIFORM.float, "augment"); + + inputs[| 7] = nodeValue("Phase", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0) + .setDisplay(VALUE_DISPLAY.rotation); + addShaderProp(SHADER_UNIFORM.float, "rotation"); input_display_list = [ ["Output", true], 0, 3, - ["Noise", false], 1, 2, + ["Noise", false], 1, 2, 4, 7, 5, ]; } \ No newline at end of file diff --git a/scripts/node_noise_shard/node_gradient.yy b/scripts/node_noise_shard/node_gradient.yy new file mode 100644 index 000000000..fa813bb58 --- /dev/null +++ b/scripts/node_noise_shard/node_gradient.yy @@ -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", +} \ No newline at end of file diff --git a/scripts/node_noise_shard/node_noise_shard.gml b/scripts/node_noise_shard/node_noise_shard.gml new file mode 100644 index 000000000..3a642f644 --- /dev/null +++ b/scripts/node_noise_shard/node_noise_shard.gml @@ -0,0 +1,28 @@ +function Node_Shard_Noise(_x, _y, _group = noone) : Node_Shader_Generator(_x, _y, _group) constructor { + name = "Shard Noise"; + shader = sh_noise_shard; + + 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("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, irandom(99999)); + addShaderProp(SHADER_UNIFORM.float, "seed"); + + inputs[| 4] = nodeValue("Sharpness", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1) + .setDisplay(VALUE_DISPLAY.slider, { range: [ 0, 2, 0.01 ] }); + addShaderProp(SHADER_UNIFORM.float, "sharpness"); + + inputs[| 5] = nodeValue("Progress", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0) + addShaderProp(SHADER_UNIFORM.float, "progress"); + + input_display_list = [ + ["Output", true], 0, 3, + ["Noise", false], 1, 2, 5, 4, + ]; +} \ No newline at end of file diff --git a/scripts/node_noise_shard/node_noise_shard.yy b/scripts/node_noise_shard/node_noise_shard.yy new file mode 100644 index 000000000..de2b2cb0d --- /dev/null +++ b/scripts/node_noise_shard/node_noise_shard.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "node_noise_shard", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "noise", + "path": "folders/nodes/data/generator/noise.yy", + }, +} \ No newline at end of file diff --git a/scripts/node_noise_wavelet/node_gradient.yy b/scripts/node_noise_wavelet/node_gradient.yy new file mode 100644 index 000000000..fa813bb58 --- /dev/null +++ b/scripts/node_noise_wavelet/node_gradient.yy @@ -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", +} \ No newline at end of file diff --git a/scripts/node_noise_wavelet/node_noise_wavelet.gml b/scripts/node_noise_wavelet/node_noise_wavelet.gml new file mode 100644 index 000000000..93e9d493e --- /dev/null +++ b/scripts/node_noise_wavelet/node_noise_wavelet.gml @@ -0,0 +1,28 @@ +function Node_Wavelet_Noise(_x, _y, _group = noone) : Node_Shader_Generator(_x, _y, _group) constructor { + name = "Wavelet Noise"; + shader = sh_noise_wavelet; + + 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("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, irandom(99999)); + addShaderProp(SHADER_UNIFORM.float, "seed"); + + inputs[| 4] = nodeValue("Progress", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0) + addShaderProp(SHADER_UNIFORM.float, "progress"); + + inputs[| 5] = nodeValue("Detail", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1.24) + .setDisplay(VALUE_DISPLAY.slider, { range: [ 0, 2, 0.01 ] }); + addShaderProp(SHADER_UNIFORM.float, "detail"); + + input_display_list = [ + ["Output", true], 0, 3, + ["Noise", false], 1, 2, 4, 5, + ]; +} \ No newline at end of file diff --git a/scripts/node_noise_wavelet/node_noise_wavelet.yy b/scripts/node_noise_wavelet/node_noise_wavelet.yy new file mode 100644 index 000000000..978ab7083 --- /dev/null +++ b/scripts/node_noise_wavelet/node_noise_wavelet.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "node_noise_wavelet", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "noise", + "path": "folders/nodes/data/generator/noise.yy", + }, +} \ No newline at end of file diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index 22c5f605f..a311b7ea3 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -576,6 +576,9 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio addNodeObject(generator, "Anisotropic Noise", s_node_noise_aniso, "Node_Noise_Aniso", [1, Node_Noise_Aniso],, "Generate anisotropic noise."); addNodeObject(generator, "Extra Perlins", s_node_perlin_extra, "Node_Perlin_Extra", [1, Node_Perlin_Extra], ["noise"], "Random perlin noise made with different algorithms.").patreonExtra(); addNodeObject(generator, "Gabor Noise", s_node_gabor, "Node_Gabor_Noise", [1, Node_Gabor_Noise]).patreonExtra(); + addNodeObject(generator, "Shard Noise", s_node_shard, "Node_Shard_Noise", [1, Node_Shard_Noise]).patreonExtra(); + addNodeObject(generator, "Wavelet Noise", s_node_wavelet, "Node_Wavelet_Noise", [1, Node_Wavelet_Noise]).patreonExtra(); + addNodeObject(generator, "Caustic", s_node_caustic, "Node_Caustic", [1, Node_Caustic]).patreonExtra(); ds_list_add(generator, "Patterns"); addNodeObject(generator, "Stripe", s_node_stripe, "Node_Stripe", [1, Node_Stripe],, "Generate stripe pattern."); diff --git a/scripts/pcx_ast/pcx_ast.gml b/scripts/pcx_ast/pcx_ast.gml index 7b28263c6..0020a99ca 100644 --- a/scripts/pcx_ast/pcx_ast.gml +++ b/scripts/pcx_ast/pcx_ast.gml @@ -505,6 +505,10 @@ return v1; } #endregion + + static toString = function() { #region + return $"[PCX funcTree] \{ symbol: {symbol}, l: {l}, r: {r}\}"; + } #endregion } #endregion function evaluateFunction(fx, params = {}) { #region diff --git a/scripts/pcx_parse/pcx_parse.gml b/scripts/pcx_parse/pcx_parse.gml index 3f4c7b5dd..c3bc0c022 100644 --- a/scripts/pcx_parse/pcx_parse.gml +++ b/scripts/pcx_parse/pcx_parse.gml @@ -1,5 +1,5 @@ #region symbols - global.LOG_EXPRESSION = false; + global.LOG_EXPRESSION = true; global.EQUATION_PRES = ds_map_create(); global.EQUATION_PRES[? "+"] = 1; @@ -292,7 +292,7 @@ } else if (ch == ",") { while(!ds_stack_empty(op)) { var _top = ds_stack_top(op); - if(_top == "[" || _top == "(" || (is_array(_top) && _top[0] == "{")) break; + if(_top == "[" || _top == "(" || _top == "〚" || (is_array(_top) && _top[0] == "{")) break; var _top = ds_stack_pop(op); ds_stack_push(vl, buildFuncTree(_top, vl)); diff --git a/scripts/textArea/textArea.gml b/scripts/textArea/textArea.gml index c152c0eb3..8ea444770 100644 --- a/scripts/textArea/textArea.gml +++ b/scripts/textArea/textArea.gml @@ -167,7 +167,7 @@ function textArea(_input, _onModify) : textInput(_input, _onModify) constructor if(!keyboard_check_pressed(vk_enter)) return 0; - if(use_autocomplete && o_dialog_textbox_autocomplete.textbox == self) + if(use_autocomplete && o_dialog_textbox_autocomplete.active && o_dialog_textbox_autocomplete.textbox == self) return 0; return 1 + ((shift_new_line && key_mod_press(SHIFT)) || (!shift_new_line && !key_mod_press(SHIFT))); diff --git a/shaders/sh_noise_gabor/sh_noise_gabor.fsh b/shaders/sh_noise_gabor/sh_noise_gabor.fsh index f6b3db3cd..793d959f8 100644 --- a/shaders/sh_noise_gabor/sh_noise_gabor.fsh +++ b/shaders/sh_noise_gabor/sh_noise_gabor.fsh @@ -6,22 +6,27 @@ varying vec2 v_vTexcoord; varying vec4 v_vColour; uniform float seed; +uniform float alignment; +uniform float sharpness; +uniform float rotation; uniform vec2 u_resolution; uniform vec2 position; uniform vec2 scale; +uniform vec2 augment; vec2 hash(vec2 p) { return fract(sin(vec2( - dot(p, vec2(127.1, 311.7)) * (152.6178612 + seed / 10000.), - dot(p, vec2(269.5, 183.3)) * (437.5453123 + seed / 10000.) + dot(p, vec2(127.1324, 311.7874)) * (152.6178612 + seed / 10000.), + dot(p, vec2(269.8355, 183.3961)) * (437.5453123 + seed / 10000.) )) * 43758.5453); } vec3 gabor_wave(in vec2 p) { vec2 ip = floor(p); vec2 fp = fract(p); - const float fr = 2.0 * 6.283185; - const float fa = 4.0; - + float fa = sharpness; + float fr = alignment * 6.283185; + float rt = radians(rotation); + vec3 av = vec3(0.0, 0.0, 0.0); vec3 at = vec3(0.0, 0.0, 0.0); @@ -31,12 +36,12 @@ vec3 gabor_wave(in vec2 p) { vec2 h = hash(ip + o); vec2 r = fp - (o + h); - vec2 k = normalize(-1.0 + 2.0 * hash(ip + o + vec2(11., 31.)) ); + vec2 k = normalize(-1.0 + 2.0 * hash(ip + o + augment) ); float d = dot(r, r); - float l = dot(r, k); + float l = dot(r, k) + rt; float w = exp(-fa * d); - vec2 cs = vec2( cos(fr * l), sin(fr * l) ); + vec2 cs = vec2( cos(fr * l + rt), sin(fr * l + rt) ); av += w * vec3(cs.x, -2.0 * fa * r * cs.x - cs.y * fr * k ); at += w * vec3(1.0, -2.0 * fa * r); diff --git a/shaders/sh_noise_shard/sh_noise_shard.fsh b/shaders/sh_noise_shard/sh_noise_shard.fsh new file mode 100644 index 000000000..cf56a139b --- /dev/null +++ b/shaders/sh_noise_shard/sh_noise_shard.fsh @@ -0,0 +1,56 @@ +//Shard noise +//By ENDESGA + +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +uniform float seed; +uniform float progress; +uniform float sharpness; +uniform vec2 u_resolution; +uniform vec2 position; +uniform vec2 scale; + +#define tau 6.283185307179586 + +vec3 hash(vec3 p) { return fract(sin(vec3( + dot(p, vec3(127.1324, 311.7874, 829.3683)) * (152.6178612 + seed / 10000.), + dot(p, vec3(269.8355, 183.3961, 614.5965)) * (437.5453123 + seed / 10000.), + dot(p, vec3(615.2689, 264.1657, 278.1687)) * (962.6718165 + seed / 10000.) + )) * 43758.5453); } + +float shard_noise(in vec3 p, in float sharpness) { + vec3 ip = floor(p); + vec3 fp = fract(p); + + float v = 0., t = 0.; + + for (int z = -1; z <= 1; z++) + for (int y = -1; y <= 1; y++) + for (int x = -1; x <= 1; x++) { + vec3 o = vec3(x, y, z); + vec3 io = ip + o; + vec3 h = hash(io); + vec3 r = fp - (o + h); + + float w = exp2(-tau*dot(r, r)); + + // tanh deconstruction and optimization by @Xor + float s = sharpness * dot(r, hash(io + vec3(11, 31, 47)) - 0.5); + v += w * s * inversesqrt(1.0 + s * s); + t += w; + } + + return ((v / t) * .5) + .5; +} + +void main() { + vec2 pos = v_vTexcoord; + pos.x *= (u_resolution.x / u_resolution.y); + pos = (pos + position) * scale / 16.; + + float prog = progress / 100.; + vec3 uv = vec3( pos + prog, prog * .5 ); + + gl_FragColor = vec4( vec3(shard_noise(16.0 * uv, pow(sharpness, 2.) * 20.)), 1. ); +} \ No newline at end of file diff --git a/shaders/sh_noise_shard/sh_noise_shard.vsh b/shaders/sh_noise_shard/sh_noise_shard.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_noise_shard/sh_noise_shard.vsh @@ -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; +} diff --git a/shaders/sh_noise_shard/sh_noise_shard.yy b/shaders/sh_noise_shard/sh_noise_shard.yy new file mode 100644 index 000000000..0713aea27 --- /dev/null +++ b/shaders/sh_noise_shard/sh_noise_shard.yy @@ -0,0 +1,10 @@ +{ + "resourceType": "GMShader", + "resourceVersion": "1.0", + "name": "sh_noise_shard", + "parent": { + "name": "noise", + "path": "folders/shader/generator/noise.yy", + }, + "type": 1, +} \ No newline at end of file diff --git a/shaders/sh_noise_wavelet/sh_noise_wavelet.fsh b/shaders/sh_noise_wavelet/sh_noise_wavelet.fsh new file mode 100644 index 000000000..044abbf5a --- /dev/null +++ b/shaders/sh_noise_wavelet/sh_noise_wavelet.fsh @@ -0,0 +1,47 @@ +// "Wavelet Noise" +// The MIT License +// Copyright © 2020 Martijn Steinrucken +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// Email: countfrolic@gmail.com +// Twitter: @The_ArtOfCode +// YouTube: youtube.com/TheArtOfCodeIsCool +// Facebook: https://www.facebook.com/groups/theartofcode/ + +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +uniform float seed; +uniform float progress; +uniform float detail; +uniform vec2 u_resolution; +uniform vec2 position; +uniform vec2 scale; + +float WaveletNoise(vec2 p, float z, float k) { + float d = 0., s = 1., m = 0., a; + + for(float i = 0.; i < 4.; i++) { + vec2 q = p * s; + vec2 g = fract(floor(q) * vec2(123.34 + seed, 233.53 + seed)); + + g += dot(g, g + 23.234); + a = fract(g.x * g.y) * 0.0001 + z * (mod(g.x + g.y, 2.) - 1.); // add vorticity + q = (fract(q) - .5) * mat2(cos(a), -sin(a), sin(a), cos(a)); + d += sin(q.x * 10. + z) * smoothstep(.25, .0, dot(q, q)) / s; + p = p * mat2(.54, -.84, .84, .54) + i; + m += 1. / s; + s *= k; + } + return d / m; +} + +void main() { + vec2 pos = v_vTexcoord - .5; + pos.x *= (u_resolution.x / u_resolution.y); + pos = (pos + position) * scale / 16.; + + vec3 col = vec3(0.); + col += WaveletNoise(pos * 5., (2.9864 + progress), detail) * .5 + .5; + + gl_FragColor = vec4(col, 1.0); +} \ No newline at end of file diff --git a/shaders/sh_noise_wavelet/sh_noise_wavelet.vsh b/shaders/sh_noise_wavelet/sh_noise_wavelet.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_noise_wavelet/sh_noise_wavelet.vsh @@ -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; +} diff --git a/shaders/sh_noise_wavelet/sh_noise_wavelet.yy b/shaders/sh_noise_wavelet/sh_noise_wavelet.yy new file mode 100644 index 000000000..8cc7f0b88 --- /dev/null +++ b/shaders/sh_noise_wavelet/sh_noise_wavelet.yy @@ -0,0 +1,10 @@ +{ + "resourceType": "GMShader", + "resourceVersion": "1.0", + "name": "sh_noise_wavelet", + "parent": { + "name": "noise", + "path": "folders/shader/generator/noise.yy", + }, + "type": 1, +} \ No newline at end of file diff --git a/shaders/sh_water_caustic/sh_water_caustic.fsh b/shaders/sh_water_caustic/sh_water_caustic.fsh new file mode 100644 index 000000000..7c904c4af --- /dev/null +++ b/shaders/sh_water_caustic/sh_water_caustic.fsh @@ -0,0 +1,99 @@ +//Caustic noise by jaybird + +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +uniform float seed; +uniform float progress; +uniform float detail; +uniform vec2 u_resolution; +uniform vec2 position; +uniform vec2 scale; + +#region noise +vec4 mod289(vec4 x) { return x - floor(x / 289.0) * 289.0; } +vec4 permute(vec4 x) { return mod289((x * 34.0 + 1.0) * x); } + +vec4 snoise(vec3 v) { + const vec2 C = vec2(1.0 / 6.0, 1.0 / 3.0); + + // First corner + vec3 i = floor(v + dot(v, vec3(C.y))); + vec3 x0 = v - i + dot(i, vec3(C.x)); + + // Other corners + vec3 g = step(x0.yzx, x0.xyz); + vec3 l = 1.0 - g; + vec3 i1 = min(g.xyz, l.zxy); + vec3 i2 = max(g.xyz, l.zxy); + + vec3 x1 = x0 - i1 + C.x; + vec3 x2 = x0 - i2 + C.y; + vec3 x3 = x0 - 0.5; + + // Permutations + vec4 p = + permute(permute(permute(i.z + vec4(0.0, i1.z, i2.z, 1.0)) + + i.y + vec4(0.0, i1.y, i2.y, 1.0)) + + i.x + vec4(0.0, i1.x, i2.x, 1.0)); + + // Gradients: 7x7 points over a square, mapped onto an octahedron. + // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) + vec4 j = p - 49.0 * floor(p / 49.0); // mod(p,7*7) + + vec4 x_ = floor(j / 7.0); + vec4 y_ = floor(j - 7.0 * x_); + + vec4 x = (x_ * 2.0 + 0.5) / 7.0 - 1.0; + vec4 y = (y_ * 2.0 + 0.5) / 7.0 - 1.0; + + vec4 h = 1.0 - abs(x) - abs(y); + + vec4 b0 = vec4(x.xy, y.xy); + vec4 b1 = vec4(x.zw, y.zw); + + vec4 s0 = floor(b0) * 2.0 + 1.0; + vec4 s1 = floor(b1) * 2.0 + 1.0; + vec4 sh = -step(h, vec4(0.0)); + + vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; + vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww; + + vec3 g0 = vec3(a0.xy, h.x); + vec3 g1 = vec3(a0.zw, h.y); + vec3 g2 = vec3(a1.xy, h.z); + vec3 g3 = vec3(a1.zw, h.w); + + // Compute noise and gradient at P + vec4 m = max(0.6 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); + vec4 m2 = m * m; + vec4 m3 = m2 * m; + vec4 m4 = m2 * m2; + vec3 grad = + -6.0 * m3.x * x0 * dot(x0, g0) + m4.x * g0 + + -6.0 * m3.y * x1 * dot(x1, g1) + m4.y * g1 + + -6.0 * m3.z * x2 * dot(x2, g2) + m4.z * g2 + + -6.0 * m3.w * x3 * dot(x3, g3) + m4.w * g3; + vec4 px = vec4(dot(x0, g0), dot(x1, g1), dot(x2, g2), dot(x3, g3)); + return 42.0 * vec4(grad, dot(m4, px)); +} +#endregion + +void main() { + vec2 p = v_vTexcoord - .5; + p.x *= (u_resolution.x / u_resolution.y); + p = (p + position) * scale / 2.; + + vec3 pos = vec3(p.x, progress, p.y); + vec4 n = snoise( pos ); + + pos -= 0.07 * n.xyz; + n = snoise( pos ); + + pos -= 0.07 * n.xyz; + n = snoise( pos ); + + // noise [-1..+1] -> color + float intensity = exp(n.w * 3. - 1.5); + gl_FragColor = vec4(vec3(intensity), 1.); +} diff --git a/shaders/sh_water_caustic/sh_water_caustic.vsh b/shaders/sh_water_caustic/sh_water_caustic.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_water_caustic/sh_water_caustic.vsh @@ -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; +} diff --git a/shaders/sh_water_caustic/sh_water_caustic.yy b/shaders/sh_water_caustic/sh_water_caustic.yy new file mode 100644 index 000000000..20f7ebdc5 --- /dev/null +++ b/shaders/sh_water_caustic/sh_water_caustic.yy @@ -0,0 +1,10 @@ +{ + "resourceType": "GMShader", + "resourceVersion": "1.0", + "name": "sh_water_caustic", + "parent": { + "name": "generator", + "path": "folders/shader/generator.yy", + }, + "type": 1, +} \ No newline at end of file diff --git a/sprites/s_node_caustic/611b4e09-5b35-4f71-9cf6-5b44a68648c6.png b/sprites/s_node_caustic/611b4e09-5b35-4f71-9cf6-5b44a68648c6.png new file mode 100644 index 0000000000000000000000000000000000000000..886e4c253b798d09639418675928a24a4137b84a GIT binary patch literal 3853 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 W;Qy|1ui6R)HIO;Q%B04K9`j$u3izV{ literal 0 HcmV?d00001 diff --git a/sprites/s_node_caustic/layers/611b4e09-5b35-4f71-9cf6-5b44a68648c6/99a9fea1-d45d-4593-bad2-24a9b95be120.png b/sprites/s_node_caustic/layers/611b4e09-5b35-4f71-9cf6-5b44a68648c6/99a9fea1-d45d-4593-bad2-24a9b95be120.png new file mode 100644 index 0000000000000000000000000000000000000000..886e4c253b798d09639418675928a24a4137b84a GIT binary patch literal 3853 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 W;Qy|1ui6R)HIO;Q%B04K9`j$u3izV{ literal 0 HcmV?d00001 diff --git a/sprites/s_node_caustic/s_node_caustic.yy b/sprites/s_node_caustic/s_node_caustic.yy new file mode 100644 index 000000000..d88f0e3ff --- /dev/null +++ b/sprites/s_node_caustic/s_node_caustic.yy @@ -0,0 +1,74 @@ +{ + "resourceType": "GMSprite", + "resourceVersion": "1.0", + "name": "s_node_caustic", + "bbox_bottom": 63, + "bbox_left": 0, + "bbox_right": 63, + "bbox_top": 0, + "bboxMode": 0, + "collisionKind": 1, + "collisionTolerance": 0, + "DynamicTexturePage": false, + "edgeFiltering": false, + "For3D": false, + "frames": [ + {"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"611b4e09-5b35-4f71-9cf6-5b44a68648c6",}, + ], + "gridX": 0, + "gridY": 0, + "height": 64, + "HTile": false, + "layers": [ + {"resourceType":"GMImageLayer","resourceVersion":"1.0","name":"99a9fea1-d45d-4593-bad2-24a9b95be120","blendMode":0,"displayName":"default","isLocked":false,"opacity":100.0,"visible":true,}, + ], + "nineSlice": null, + "origin": 4, + "parent": { + "name": "generator", + "path": "folders/nodes/icons/generator.yy", + }, + "preMultiplyAlpha": false, + "sequence": { + "resourceType": "GMSequence", + "resourceVersion": "1.4", + "name": "s_node_caustic", + "autoRecord": true, + "backdropHeight": 768, + "backdropImageOpacity": 0.5, + "backdropImagePath": "", + "backdropWidth": 1366, + "backdropXOffset": 0.0, + "backdropYOffset": 0.0, + "events": {"resourceType":"KeyframeStore","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":"611b4e09-5b35-4f71-9cf6-5b44a68648c6","path":"sprites/s_node_caustic/s_node_caustic.yy",},},},"Disabled":false,"id":"8b99f6db-2df3-42ae-8149-9bca16fa4934","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 diff --git a/sprites/s_node_shard/36d6f6f3-f701-4ef8-9a0a-29710ccc58de.png b/sprites/s_node_shard/36d6f6f3-f701-4ef8-9a0a-29710ccc58de.png new file mode 100644 index 0000000000000000000000000000000000000000..7a95e646e790cd8241f1d6b2d469890d78f061f5 GIT binary patch literal 4559 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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":"36d6f6f3-f701-4ef8-9a0a-29710ccc58de","path":"sprites/s_node_shard/s_node_shard.yy",},},},"Disabled":false,"id":"7d558a39-9d18-4e30-a9cb-3fb2c9bc7b1d","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 diff --git a/sprites/s_node_wavelet/d9547083-0d8e-4682-9fef-b32aa1cc2d80.png b/sprites/s_node_wavelet/d9547083-0d8e-4682-9fef-b32aa1cc2d80.png new file mode 100644 index 0000000000000000000000000000000000000000..aa508985cbc13e993c6e9856e3a52c9bbc2041cf GIT binary patch literal 3955 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 literal 0 HcmV?d00001 diff --git a/sprites/s_node_wavelet/layers/d9547083-0d8e-4682-9fef-b32aa1cc2d80/a9920691-60ec-4d4e-a7db-3e5c529dfc36.png b/sprites/s_node_wavelet/layers/d9547083-0d8e-4682-9fef-b32aa1cc2d80/a9920691-60ec-4d4e-a7db-3e5c529dfc36.png new file mode 100644 index 0000000000000000000000000000000000000000..aa508985cbc13e993c6e9856e3a52c9bbc2041cf GIT binary patch literal 3955 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 literal 0 HcmV?d00001 diff --git a/sprites/s_node_wavelet/s_node_wavelet.yy b/sprites/s_node_wavelet/s_node_wavelet.yy new file mode 100644 index 000000000..b676173d6 --- /dev/null +++ b/sprites/s_node_wavelet/s_node_wavelet.yy @@ -0,0 +1,74 @@ +{ + "resourceType": "GMSprite", + "resourceVersion": "1.0", + "name": "s_node_wavelet", + "bbox_bottom": 63, + "bbox_left": 0, + "bbox_right": 63, + "bbox_top": 0, + "bboxMode": 0, + "collisionKind": 1, + "collisionTolerance": 0, + "DynamicTexturePage": false, + "edgeFiltering": false, + "For3D": false, + "frames": [ + {"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"d9547083-0d8e-4682-9fef-b32aa1cc2d80",}, + ], + "gridX": 0, + "gridY": 0, + "height": 64, + "HTile": false, + "layers": [ + {"resourceType":"GMImageLayer","resourceVersion":"1.0","name":"a9920691-60ec-4d4e-a7db-3e5c529dfc36","blendMode":0,"displayName":"default","isLocked":false,"opacity":100.0,"visible":true,}, + ], + "nineSlice": null, + "origin": 4, + "parent": { + "name": "generator", + "path": "folders/nodes/icons/generator.yy", + }, + "preMultiplyAlpha": false, + "sequence": { + "resourceType": "GMSequence", + "resourceVersion": "1.4", + "name": "s_node_wavelet", + "autoRecord": true, + "backdropHeight": 768, + "backdropImageOpacity": 0.5, + "backdropImagePath": "", + "backdropWidth": 1366, + "backdropXOffset": 0.0, + "backdropYOffset": 0.0, + "events": {"resourceType":"KeyframeStore","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":"d9547083-0d8e-4682-9fef-b32aa1cc2d80","path":"sprites/s_node_wavelet/s_node_wavelet.yy",},},},"Disabled":false,"id":"89b2c3da-1167-4ff7-a145-df1202f2a83f","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