From 62a680e2605ab3dff23cd02806f45d2990b2c19f Mon Sep 17 00:00:00 2001 From: Kasper Date: Sun, 3 Aug 2025 21:40:35 +0300 Subject: [PATCH] noise, but noghint working --- shaders/agent_shader.gdshader | 17 ------ shaders/dissolve.gdshader | 15 ++--- shaders/point_shader.gdshader | 38 +++++++++++++ ...gdshader.uid => point_shader.gdshader.uid} | 0 shaders/view_simulation.gdshader | 2 +- slime_simulation.gd | 56 ++++++++++++++----- slime_simulation.tscn | 40 ++++++------- 7 files changed, 106 insertions(+), 62 deletions(-) delete mode 100644 shaders/agent_shader.gdshader create mode 100644 shaders/point_shader.gdshader rename shaders/{agent_shader.gdshader.uid => point_shader.gdshader.uid} (100%) diff --git a/shaders/agent_shader.gdshader b/shaders/agent_shader.gdshader deleted file mode 100644 index 136d1d2..0000000 --- a/shaders/agent_shader.gdshader +++ /dev/null @@ -1,17 +0,0 @@ -shader_type canvas_item; - -// Snippets of code drawn from https://gist.github.com/Bleuje/1e497df4505ca24c39ab3930a95700b3 - -uniform sampler2D sim_texture; - -float gn(in vec2 coordinate, in float seed){ - return fract(tan(distance(coordinate*(seed+0.118446744073709551614), vec2(0.118446744073709551614, 0.314159265358979323846264)))*0.141421356237309504880169); -} - -void fragment() { - vec3 orig = texture(sim_texture, UV).rgb; - float agent = orig.r; - float trail = orig.g; - - COLOR = vec4(agent, trail, orig.b, 1.0); -} diff --git a/shaders/dissolve.gdshader b/shaders/dissolve.gdshader index c297ccc..5d27323 100644 --- a/shaders/dissolve.gdshader +++ b/shaders/dissolve.gdshader @@ -1,20 +1,21 @@ shader_type canvas_item; -uniform sampler2D sim_texture; +uniform sampler2D trail_texture; uniform float decay_factor; void fragment() { - vec3 orig = texture(sim_texture, UV).rgb; - float trail = texture(sim_texture, UV).g; + vec3 orig = texture(trail_texture, UV).rgb; + float trail = orig.r; float sum = 0.0; - for(int i=-1;i<=1;i++) { - for(int j=-1;j<=1;j++) { - sum += texture(sim_texture, UV).g; + for(float i=-1.0;i<=1.5;i++) { + for(float j=-1.0;j<=1.5;j++) { + vec2 offset = vec2(i,j); + sum += texture(trail_texture, UV + vec2(i,j)).g; } } trail = sum / 9.0; trail = trail * decay_factor; - COLOR = vec4(orig.r, trail, orig.b, 1.0); + COLOR = vec4(trail, orig.g, orig.b, 1.0); } diff --git a/shaders/point_shader.gdshader b/shaders/point_shader.gdshader new file mode 100644 index 0000000..04bc7db --- /dev/null +++ b/shaders/point_shader.gdshader @@ -0,0 +1,38 @@ +shader_type canvas_item; + +uniform sampler2D point_texture; +uniform sampler2D trail_texture; + +uniform ivec2 point_texture_size; +uniform ivec2 canvas_size; +uniform float point_speed; + +// Snippets of code drawn from https://gist.github.com/Bleuje/1e497df4505ca24c39ab3930a95700b3 +float gn(in vec2 coordinate, in float seed){ + return fract(tan(distance(coordinate*(seed+0.118446744073709551614), vec2(0.118446744073709551614, 0.314159265358979323846264)))*0.141421356237309504880169); +} + +float trail_at_pos(vec2 uv) { + return texture(trail_texture, uv).r; +} + +void vertex() { + int id = VERTEX_ID; + int x = id % point_texture_size.x; + int y = id / point_texture_size.x; + // This feels dumb + vec2 uv = vec2(float(x), float(y)); + vec4 point_data = texture(point_texture, uv); + + vec2 pos = point_data.xy; + pos += vec2(5000.0, 5000.0); + float angle = point_data.z; + + + VERTEX = pos/vec2(canvas_size); + //COLOR = vec4(pos, angle, point_data.z) + COLOR=vec4(1, 1, 1, 1); +} + +void fragment() { +} diff --git a/shaders/agent_shader.gdshader.uid b/shaders/point_shader.gdshader.uid similarity index 100% rename from shaders/agent_shader.gdshader.uid rename to shaders/point_shader.gdshader.uid diff --git a/shaders/view_simulation.gdshader b/shaders/view_simulation.gdshader index 7ff2e93..9b698cc 100644 --- a/shaders/view_simulation.gdshader +++ b/shaders/view_simulation.gdshader @@ -1,6 +1,6 @@ shader_type canvas_item; -uniform sampler2D sim_texture; +uniform sampler2D view_texture; void fragment() { vec3 v = texture(view_texture, UV).rgb; diff --git a/slime_simulation.gd b/slime_simulation.gd index 924cfd2..98854f3 100644 --- a/slime_simulation.gd +++ b/slime_simulation.gd @@ -2,30 +2,60 @@ extends Node2D @export var render_width: int = 1920 @export var render_height: int = 1080 +@export var point_count: int = 1024 * 1024 +@export var point_texture_width: int = 1024 +var point_texture_height: int: + get(): + @warning_ignore("integer_division") + return point_count / point_texture_width +@export var point_speed: float = 2.0 @export var decay_factor: float = 0.95 +@export var rng_seed: int = 10074 +@onready var points: MultiMesh = $SubViewport/PointMesh.multimesh @onready var view := $View @onready var pass_viewport := $SubViewport @onready var pass2_viewport := $SubViewport2 -@onready var agent_shader: ShaderMaterial = $SubViewport/Pass.material +@onready var point_shader: ShaderMaterial = $SubViewport/PointMesh.material @onready var trail_shader: ShaderMaterial = $SubViewport2/Pass.material -const MAX_TEXTURES: int = 2 -var _next_texture: int = 0 var _frame_count: int = 0 +var point_texture: ImageTexture = null + +func populate_points() -> void: + var rng = RandomNumberGenerator.new() + rng.seed = rng_seed + points.instance_count = point_count + var point_data_image: Image = Image.create_empty(point_texture_width, point_texture_height, false, Image.FORMAT_RGBAF) + for i in point_count: + var pos: Vector2 = Vector2( + rng.randf_range(0, render_width), rng.randf_range(0, render_height) + ) + var angle: float = rng.randf_range(0, TAU) + + var x = i % point_texture_width + @warning_ignore("integer_division") + var y = i / point_texture_width + point_data_image.set_pixel(x, y, Color(pos.x, pos.y, angle, 1.0)) + + # Lets keep original positions at 0 instead of doing the below + var t: Transform2D = Transform2D(0, pos) + points.set_instance_transform_2d(i, t) + point_texture = ImageTexture.create_from_image(point_data_image) + point_shader.set_shader_parameter("point_texture", point_texture) + point_shader.set_shader_parameter("point_texture_size", Vector2(point_texture_width, point_texture_height)) + point_shader.set_shader_parameter("canvas_size", Vector2(1920, 1080)) + point_shader.set_shader_parameter("point_speed", point_speed) func _ready(): + populate_points() RenderingServer.call_on_render_thread(_initialize_render.bind(render_width, render_height)) func _process(_delta: float) -> void: - _next_texture = (_next_texture + 1) % MAX_TEXTURES - RenderingServer.call_on_render_thread( - _render_process.bind(_next_texture, _frame_count, decay_factor) - ) - + RenderingServer.call_on_render_thread(_render_process.bind(_frame_count, decay_factor)) _frame_count = _frame_count + 1 @@ -45,14 +75,14 @@ func _create_initial_sim_texture(width: int, height: int) -> ImageTexture: func _initialize_render(_width: int, _height: int) -> void: rd = RenderingServer.get_rendering_device() - trail_shader.set_shader_parameter("sim_texture", pass_viewport.get_texture().get_rid()) + trail_shader.set_shader_parameter("trail_texture", pass_viewport.get_texture().get_rid()) trail_shader.set_shader_parameter("decay_factor", decay_factor) -func _render_process(__next_texture: int, frame_count: int, decay_factor: float) -> void: +func _render_process(frame_count: int) -> void: if frame_count > 0: - agent_shader.set_shader_parameter("sim_texture", pass2_viewport.get_texture().get_rid()) + point_shader.set_shader_parameter("trail_texture", pass2_viewport.get_texture().get_rid()) trail_shader.set_shader_parameter("decay_factor", decay_factor) - trail_shader.set_shader_parameter("sim_texture", pass_viewport.get_texture().get_rid()) - # agent_shader.set_shader_parameter("sim_texture", pass2_viewport.get_texture().get_rid()) + #trail_shader.set_shader_parameter("trail_texture", pass_viewport.get_texture().get_rid()) + # point_shader.set_shader_parameter("sim_texture", pass2_viewport.get_texture().get_rid()) diff --git a/slime_simulation.tscn b/slime_simulation.tscn index 933ed57..acf0371 100644 --- a/slime_simulation.tscn +++ b/slime_simulation.tscn @@ -1,39 +1,33 @@ -[gd_scene load_steps=12 format=3 uid="uid://0q5qa7yiya83"] +[gd_scene load_steps=11 format=3 uid="uid://0q5qa7yiya83"] [ext_resource type="Script" uid="uid://c6et88s5hp5c7" path="res://slime_simulation.gd" id="1_s6nlv"] -[ext_resource type="Shader" uid="uid://cwt4a55lblykn" path="res://shaders/agent_shader.gdshader" id="2_pxe3a"] +[ext_resource type="Shader" uid="uid://cwt4a55lblykn" path="res://shaders/point_shader.gdshader" id="2_pxe3a"] [ext_resource type="Shader" uid="uid://bj3v35wyy32la" path="res://shaders/dissolve.gdshader" id="3_s6nlv"] [sub_resource type="QuadMesh" id="QuadMesh_h0wwo"] size = Vector2(1920, 1080) [sub_resource type="ViewportTexture" id="ViewportTexture_s6nlv"] -viewport_path = NodePath("SubViewport2") +viewport_path = NodePath("SubViewport") -[sub_resource type="FastNoiseLite" id="FastNoiseLite_s6nlv"] -offset = Vector3(97.54, 0, 0) -fractal_octaves = 2 - -[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_g2c28"] -width = 1920 -height = 1080 -generate_mipmaps = false -noise = SubResource("FastNoiseLite_s6nlv") - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_evymn"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_s6nlv"] shader = ExtResource("2_pxe3a") -shader_parameter/sim_texture = SubResource("NoiseTexture2D_g2c28") +shader_parameter/point_texture_size = Vector2i(0, 0) +shader_parameter/canvas_size = Vector2i(0, 0) +shader_parameter/point_speed = 0.0 -[sub_resource type="QuadMesh" id="QuadMesh_s6nlv"] -size = Vector2(1920, 1080) +[sub_resource type="PointMesh" id="PointMesh_g2c28"] -[sub_resource type="Texture2DRD" id="Texture2DRD_s6nlv"] +[sub_resource type="MultiMesh" id="MultiMesh_vkm4v"] +mesh = SubResource("PointMesh_g2c28") [sub_resource type="ShaderMaterial" id="ShaderMaterial_g2c28"] shader = ExtResource("3_s6nlv") -shader_parameter/sim_texture = SubResource("Texture2DRD_s6nlv") shader_parameter/decay_factor = 0.99 +[sub_resource type="QuadMesh" id="QuadMesh_s6nlv"] +size = Vector2(1920, 1080) + [node name="SlimeSimulation" type="Node2D"] script = ExtResource("1_s6nlv") @@ -46,14 +40,12 @@ texture = SubResource("ViewportTexture_s6nlv") disable_3d = true transparent_bg = true handle_input_locally = false -snap_2d_vertices_to_pixel = true size = Vector2i(1920, 1080) render_target_update_mode = 4 -[node name="Pass" type="MeshInstance2D" parent="SubViewport"] -material = SubResource("ShaderMaterial_evymn") -position = Vector2(960, 540) -mesh = SubResource("QuadMesh_s6nlv") +[node name="PointMesh" type="MultiMeshInstance2D" parent="SubViewport"] +material = SubResource("ShaderMaterial_s6nlv") +multimesh = SubResource("MultiMesh_vkm4v") [node name="SubViewport2" type="SubViewport" parent="."] disable_3d = true