From e67a3c72ec3322e7e405d09a59eaa6e476eed47f Mon Sep 17 00:00:00 2001 From: Kasper Date: Fri, 1 Aug 2025 23:54:06 +0300 Subject: [PATCH] saving what I've done --- project.godot | 6 ++++++ shaders/agents_cs.glsl | 12 ++++++++---- shaders/decay_cs.glsl | 29 +++++++++++++++++++---------- slime_simulation.gd | 2 +- slime_simulation.tscn | 8 ++++---- 5 files changed, 38 insertions(+), 19 deletions(-) diff --git a/project.godot b/project.godot index 235c1e5..3edf9e5 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,12 @@ run/main_scene="uid://bf4ohdg0sfl8l" config/features=PackedStringArray("4.4", "Forward Plus") config/icon="res://icon.svg" +[display] + +window/size/viewport_width=1920 +window/size/viewport_height=1080 +window/stretch/mode="viewport" + [rendering] environment/defaults/default_clear_color=Color(0.0605303, 0.0605304, 0.0605303, 1) diff --git a/shaders/agents_cs.glsl b/shaders/agents_cs.glsl index c41699f..0e3d986 100644 --- a/shaders/agents_cs.glsl +++ b/shaders/agents_cs.glsl @@ -7,8 +7,8 @@ layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in; layout(r32f, binding = 0) uniform restrict readonly image2D current_trail; layout(r32f, binding = 1) uniform restrict writeonly image2D output_trail; layout(binding = 2) restrict buffer AgentBuffer { - vec2 positions[1024]; - float headings[1024]; + vec2 positions[1024 * 1024]; + float headings[1024 * 1024]; } agent_buffer; layout(push_constant, std430) uniform Params { @@ -19,13 +19,17 @@ layout(push_constant, std430) uniform Params { const float SPEED = 1.0; +float random(vec2 coords) { + return fract(sin(dot(coords.xy, vec2(12.9898,78.233))) * 43758.5453); +} + vec2 loop_position(vec2 pos) { int width = params.texture_size.x; int height = params.texture_size.y; if (pos.x > width) pos.x = mod(pos.x, width); if (pos.y > height) pos.y = mod(pos.y, height); - if (pos.x < 0) pos.x = width - pos.x; - if (pos.y < 0) pos.y = height - pos.y; + if (pos.x < 0) pos.x = width + pos.x; + if (pos.y < 0) pos.y = height + pos.y; return pos; } diff --git a/shaders/decay_cs.glsl b/shaders/decay_cs.glsl index e3326b9..77fe747 100644 --- a/shaders/decay_cs.glsl +++ b/shaders/decay_cs.glsl @@ -10,7 +10,7 @@ layout(r32f, set = 1, binding = 0) uniform restrict writeonly image2D output_ima // PushConstants layout(push_constant, std430) uniform Params { - vec2 texture_size; + ivec2 texture_size; float decay_factor; float dissipation_factor; } params; @@ -20,11 +20,16 @@ float get_dissipation_from(ivec2 uv) { return v * params.dissipation_factor; } -// ivec2 loop_position(vec2 pos) { -// int width = params.texture_size.x; -// int height = params.texture_size.y; -// return ivec2(mod(pos + params.texture_size, params.texture_size)); -// } +ivec2 loop_position(ivec2 pos) { + int width = params.texture_size.x; + int height = params.texture_size.y; + vec2 looped = pos; + if (pos.x > width) looped.x = mod(pos.x, width); + if (pos.y > height) looped.y = mod(pos.y, height); + if (pos.x < 0) looped.x = width - pos.x; + if (pos.y < 0) looped.y = height - pos.y; + return ivec2(looped); +} // The code we want to execute in each invocation void main() { @@ -33,10 +38,10 @@ void main() { ivec2 uv = ivec2(gl_GlobalInvocationID.xy); ivec2 tl = ivec2(0, 0); - ivec2 up_uv = clamp(uv - ivec2(0, 1), tl, size); - ivec2 down_uv = clamp(uv + ivec2(0, 1), tl, size); - ivec2 left_uv = clamp(uv - ivec2(1, 0), tl, size); - ivec2 right_uv = clamp(uv + ivec2(1, 0), tl, size); + ivec2 up_uv = loop_position(uv - ivec2(0, 1)); + ivec2 down_uv = loop_position(uv + ivec2(0, 1)); + ivec2 left_uv = loop_position(uv - ivec2(1, 0)); + ivec2 right_uv = loop_position(uv + ivec2(1, 0)); // Just in case the texture size is not divisable by 8. if ((uv.x > size.x) || (uv.y > size.y)) { @@ -51,6 +56,10 @@ void main() { new_v += get_dissipation_from(right_uv); new_v += get_dissipation_from(left_uv); + // Kill very old trails completely + // if (new_v < 0.001) { + // new_v = 0; + // } // new_v = clamp(new_v, 0, 1); diff --git a/slime_simulation.gd b/slime_simulation.gd index ed97e52..ca8cd19 100644 --- a/slime_simulation.gd +++ b/slime_simulation.gd @@ -12,7 +12,7 @@ extends Node2D @onready var mesh := $MeshInstance2D ## Needs to be changed from the shader as well -const AGENTS: int = 1024 +const AGENTS: int = 1024 * 1024 var texture: Texture2DRD var next_texture: int = 0 diff --git a/slime_simulation.tscn b/slime_simulation.tscn index 5e01d5c..d93a605 100644 --- a/slime_simulation.tscn +++ b/slime_simulation.tscn @@ -10,19 +10,19 @@ shader = ExtResource("2_pxe3a") shader_parameter/trail_tex = SubResource("Texture2DRD_pxe3a") [sub_resource type="QuadMesh" id="QuadMesh_pxe3a"] +size = Vector2(1920, 1080) [node name="SlimeSimulation" type="Node2D"] script = ExtResource("1_pxe3a") -texture_size = Vector2i(1152, 648) +texture_size = Vector2i(1920, 1080) decay_factor = 0.75 dissipation_factor = 0.06 -sensor_angle = 8.0 +sensor_angle = 7.0 sensor_distance = 20.0 rng_seed = 8008 [node name="MeshInstance2D" type="MeshInstance2D" parent="."] self_modulate = Color(0.581022, 0.701395, 0.890748, 1) material = SubResource("ShaderMaterial_pxe3a") -position = Vector2(576, 324) -scale = Vector2(1152, 648) +position = Vector2(960, 540) mesh = SubResource("QuadMesh_pxe3a")