slowly descending into madness

This commit is contained in:
2025-08-04 01:20:05 +03:00
parent 62a680e260
commit fc5d420233
8 changed files with 143 additions and 50 deletions

BIN
particle_data.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

34
particle_data.png.import Normal file
View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://coag6vc2dufc8"
path="res://.godot/imported/particle_data.png-716496d42425e62be8fcb686aebac5dd.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://particle_data.png"
dest_files=["res://.godot/imported/particle_data.png-716496d42425e62be8fcb686aebac5dd.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@@ -0,0 +1,25 @@
shader_type canvas_item;
//render_mode skip_vertex_transform;
uniform sampler2D point_texture;
uniform ivec2 point_texture_size;
uniform ivec2 canvas_size;
void vertex() {
int id = INSTANCE_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;
float angle = point_data.z;
VERTEX=pos;
}
void fragment() {
COLOR=vec4(1, 1, 1, 1);
}

View File

@@ -0,0 +1 @@
uid://bq044vr2240p4

View File

@@ -7,6 +7,8 @@ uniform ivec2 point_texture_size;
uniform ivec2 canvas_size; uniform ivec2 canvas_size;
uniform float point_speed; uniform float point_speed;
varying vec4 data;
// Snippets of code drawn from https://gist.github.com/Bleuje/1e497df4505ca24c39ab3930a95700b3 // Snippets of code drawn from https://gist.github.com/Bleuje/1e497df4505ca24c39ab3930a95700b3
float gn(in vec2 coordinate, in float seed){ float gn(in vec2 coordinate, in float seed){
return fract(tan(distance(coordinate*(seed+0.118446744073709551614), vec2(0.118446744073709551614, 0.314159265358979323846264)))*0.141421356237309504880169); return fract(tan(distance(coordinate*(seed+0.118446744073709551614), vec2(0.118446744073709551614, 0.314159265358979323846264)))*0.141421356237309504880169);
@@ -17,7 +19,7 @@ float trail_at_pos(vec2 uv) {
} }
void vertex() { void vertex() {
int id = VERTEX_ID; int id = INSTANCE_ID;
int x = id % point_texture_size.x; int x = id % point_texture_size.x;
int y = id / point_texture_size.x; int y = id / point_texture_size.x;
// This feels dumb // This feels dumb
@@ -25,14 +27,12 @@ void vertex() {
vec4 point_data = texture(point_texture, uv); vec4 point_data = texture(point_texture, uv);
vec2 pos = point_data.xy; vec2 pos = point_data.xy;
pos += vec2(5000.0, 5000.0);
float angle = point_data.z; float angle = point_data.z;
//COLOR = vec4(0.2, 0.0, 0.0, 1.0)
VERTEX = pos/vec2(canvas_size); data=vec4(pos, angle, point_data.z);
//COLOR = vec4(pos, angle, point_data.z)
COLOR=vec4(1, 1, 1, 1);
} }
void fragment() { void fragment() {
COLOR=data;
} }

View File

@@ -13,12 +13,15 @@ var point_texture_height: int:
@export var decay_factor: float = 0.95 @export var decay_factor: float = 0.95
@export var rng_seed: int = 10074 @export var rng_seed: int = 10074
@onready var points: MultiMesh = $SubViewport/PointMesh.multimesh @onready var points: MultiMesh = %PointUpdateViewport/PointMesh.multimesh
@onready var points_draw: MultiMesh = %PointDrawViewport/PointMesh.multimesh
@onready var view := $View @onready var view := $View
@onready var pass_viewport := $SubViewport @onready var point_update_vp := %PointUpdateViewport
@onready var pass2_viewport := $SubViewport2 @onready var trail_update_vp := %TrailUpdateViewport
@onready var point_shader: ShaderMaterial = $SubViewport/PointMesh.material @onready var point_draw_vp := %PointDrawViewport
@onready var trail_shader: ShaderMaterial = $SubViewport2/Pass.material @onready var point_shader: ShaderMaterial = %PointUpdateViewport/PointMesh.material
@onready var trail_shader: ShaderMaterial = %TrailUpdateViewport/Pass.material
@onready var point_draw_shader: ShaderMaterial = %PointDrawViewport/PointMesh.material
var _frame_count: int = 0 var _frame_count: int = 0
var point_texture: ImageTexture = null var point_texture: ImageTexture = null
@@ -30,9 +33,9 @@ func populate_points() -> void:
var point_data_image: Image = Image.create_empty(point_texture_width, point_texture_height, false, Image.FORMAT_RGBAF) var point_data_image: Image = Image.create_empty(point_texture_width, point_texture_height, false, Image.FORMAT_RGBAF)
for i in point_count: for i in point_count:
var pos: Vector2 = Vector2( var pos: Vector2 = Vector2(
rng.randf_range(0, render_width), rng.randf_range(0, render_height) rng.randf_range(0, 1.0), rng.randf_range(0, 1.0)
) )
var angle: float = rng.randf_range(0, TAU) var angle: float = rng.randf_range(0, 1.0)
var x = i % point_texture_width var x = i % point_texture_width
@warning_ignore("integer_division") @warning_ignore("integer_division")
@@ -40,13 +43,21 @@ func populate_points() -> void:
point_data_image.set_pixel(x, y, Color(pos.x, pos.y, angle, 1.0)) 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 # Lets keep original positions at 0 instead of doing the below
var t: Transform2D = Transform2D(0, pos) var t: Transform2D = Transform2D()
points.set_instance_transform_2d(i, t) points.set_instance_transform_2d(i, t)
var render_size := Vector2i(render_width, render_height);
var point_texture_size := Vector2i(point_texture_width, point_texture_height)
point_texture = ImageTexture.create_from_image(point_data_image) 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", point_texture)
point_shader.set_shader_parameter("point_texture_size", Vector2(point_texture_width, point_texture_height)) point_shader.set_shader_parameter("point_texture_size", point_texture_size)
point_shader.set_shader_parameter("canvas_size", Vector2(1920, 1080)) point_shader.set_shader_parameter("canvas_size", render_size)
point_shader.set_shader_parameter("point_speed", point_speed) point_shader.set_shader_parameter("point_speed", point_speed)
point_draw_shader.set_shader_parameter("point_texture", point_texture)
point_draw_shader.set_shader_parameter("point_texture_size", point_texture_size)
point_draw_shader.set_shader_parameter("canvas_size", render_size)
points_draw = points
func _ready(): func _ready():
@@ -75,14 +86,16 @@ func _create_initial_sim_texture(width: int, height: int) -> ImageTexture:
func _initialize_render(_width: int, _height: int) -> void: func _initialize_render(_width: int, _height: int) -> void:
rd = RenderingServer.get_rendering_device() rd = RenderingServer.get_rendering_device()
trail_shader.set_shader_parameter("trail_texture", pass_viewport.get_texture().get_rid()) trail_shader.set_shader_parameter("trail_texture", point_update_vp.get_texture().get_rid())
trail_shader.set_shader_parameter("decay_factor", decay_factor) trail_shader.set_shader_parameter("decay_factor", decay_factor)
func _render_process(frame_count: int) -> void: func _render_process(frame_count: int) -> void:
if frame_count > 0: if frame_count > 0:
point_shader.set_shader_parameter("trail_texture", pass2_viewport.get_texture().get_rid()) point_shader.set_shader_parameter("trail_texture", trail_update_vp.get_texture().get_rid())
point_shader.set_shader_parameter("agent_texture", point_update_vp.get_texture().get_rid())
view.texture = point_texture.get_rid()
trail_shader.set_shader_parameter("decay_factor", decay_factor) trail_shader.set_shader_parameter("decay_factor", decay_factor)
#trail_shader.set_shader_parameter("trail_texture", pass_viewport.get_texture().get_rid()) #trail_shader.set_shader_parameter("trail_texture", point_update_vp.get_texture().get_rid())
# point_shader.set_shader_parameter("sim_texture", pass2_viewport.get_texture().get_rid()) # point_shader.set_shader_parameter("sim_texture", trail_update_vp.get_texture().get_rid())

View File

@@ -1,25 +1,15 @@
[gd_scene load_steps=11 format=3 uid="uid://0q5qa7yiya83"] [gd_scene load_steps=13 format=3 uid="uid://0q5qa7yiya83"]
[ext_resource type="Script" uid="uid://c6et88s5hp5c7" path="res://slime_simulation.gd" id="1_s6nlv"] [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/point_shader.gdshader" id="2_pxe3a"] [ext_resource type="Shader" uid="uid://cwt4a55lblykn" path="res://shaders/point_update_shader.gdshader" id="2_pxe3a"]
[ext_resource type="Shader" uid="uid://bq044vr2240p4" path="res://shaders/point_draw_shader.gdshader" id="3_g2c28"]
[ext_resource type="Shader" uid="uid://bj3v35wyy32la" path="res://shaders/dissolve.gdshader" id="3_s6nlv"] [ext_resource type="Shader" uid="uid://bj3v35wyy32la" path="res://shaders/dissolve.gdshader" id="3_s6nlv"]
[sub_resource type="QuadMesh" id="QuadMesh_h0wwo"] [sub_resource type="QuadMesh" id="QuadMesh_h0wwo"]
size = Vector2(1920, 1080) size = Vector2(1920, 1080)
[sub_resource type="ViewportTexture" id="ViewportTexture_s6nlv"] [sub_resource type="ViewportTexture" id="ViewportTexture_g2c28"]
viewport_path = NodePath("SubViewport") viewport_path = NodePath("TrailUpdateViewport/PointDrawViewport")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_s6nlv"]
shader = ExtResource("2_pxe3a")
shader_parameter/point_texture_size = Vector2i(0, 0)
shader_parameter/canvas_size = Vector2i(0, 0)
shader_parameter/point_speed = 0.0
[sub_resource type="PointMesh" id="PointMesh_g2c28"]
[sub_resource type="MultiMesh" id="MultiMesh_vkm4v"]
mesh = SubResource("PointMesh_g2c28")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_g2c28"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_g2c28"]
shader = ExtResource("3_s6nlv") shader = ExtResource("3_s6nlv")
@@ -28,26 +18,32 @@ shader_parameter/decay_factor = 0.99
[sub_resource type="QuadMesh" id="QuadMesh_s6nlv"] [sub_resource type="QuadMesh" id="QuadMesh_s6nlv"]
size = Vector2(1920, 1080) size = Vector2(1920, 1080)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_vkm4v"]
shader = ExtResource("3_g2c28")
shader_parameter/point_texture_size = Vector2i(0, 0)
shader_parameter/canvas_size = Vector2i(0, 0)
[sub_resource type="PointMesh" id="PointMesh_g2c28"]
[sub_resource type="MultiMesh" id="MultiMesh_vkm4v"]
mesh = SubResource("PointMesh_g2c28")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_s6nlv"]
shader = ExtResource("2_pxe3a")
shader_parameter/point_texture_size = Vector2i(0, 0)
shader_parameter/canvas_size = Vector2i(0, 0)
shader_parameter/point_speed = 0.0
[node name="SlimeSimulation" type="Node2D"] [node name="SlimeSimulation" type="Node2D"]
script = ExtResource("1_s6nlv") script = ExtResource("1_s6nlv")
[node name="View" type="MeshInstance2D" parent="."] [node name="View" type="MeshInstance2D" parent="."]
position = Vector2(960, 540) position = Vector2(960, 540)
mesh = SubResource("QuadMesh_h0wwo") mesh = SubResource("QuadMesh_h0wwo")
texture = SubResource("ViewportTexture_s6nlv") texture = SubResource("ViewportTexture_g2c28")
[node name="SubViewport" type="SubViewport" parent="."] [node name="TrailUpdateViewport" type="SubViewport" parent="."]
disable_3d = true unique_name_in_owner = true
transparent_bg = true
handle_input_locally = false
size = Vector2i(1920, 1080)
render_target_update_mode = 4
[node name="PointMesh" type="MultiMeshInstance2D" parent="SubViewport"]
material = SubResource("ShaderMaterial_s6nlv")
multimesh = SubResource("MultiMesh_vkm4v")
[node name="SubViewport2" type="SubViewport" parent="."]
disable_3d = true disable_3d = true
transparent_bg = true transparent_bg = true
handle_input_locally = false handle_input_locally = false
@@ -55,7 +51,31 @@ snap_2d_vertices_to_pixel = true
size = Vector2i(1920, 1080) size = Vector2i(1920, 1080)
render_target_update_mode = 4 render_target_update_mode = 4
[node name="Pass" type="MeshInstance2D" parent="SubViewport2"] [node name="Pass" type="MeshInstance2D" parent="TrailUpdateViewport"]
material = SubResource("ShaderMaterial_g2c28") material = SubResource("ShaderMaterial_g2c28")
position = Vector2(960, 540) position = Vector2(960, 540)
mesh = SubResource("QuadMesh_s6nlv") mesh = SubResource("QuadMesh_s6nlv")
[node name="PointDrawViewport" type="SubViewport" parent="TrailUpdateViewport"]
unique_name_in_owner = true
disable_3d = true
transparent_bg = true
handle_input_locally = false
size = Vector2i(1920, 1080)
render_target_update_mode = 4
[node name="PointMesh" type="MultiMeshInstance2D" parent="TrailUpdateViewport/PointDrawViewport"]
material = SubResource("ShaderMaterial_vkm4v")
multimesh = SubResource("MultiMesh_vkm4v")
[node name="PointUpdateViewport" type="SubViewport" parent="TrailUpdateViewport/PointDrawViewport"]
unique_name_in_owner = true
disable_3d = true
transparent_bg = true
handle_input_locally = false
size = Vector2i(1920, 1080)
render_target_update_mode = 4
[node name="PointMesh" type="MultiMeshInstance2D" parent="TrailUpdateViewport/PointDrawViewport/PointUpdateViewport"]
material = SubResource("ShaderMaterial_s6nlv")
multimesh = SubResource("MultiMesh_vkm4v")