diff --git a/particle_data.png b/particle_data.png new file mode 100644 index 0000000..fb3d4fd Binary files /dev/null and b/particle_data.png differ diff --git a/particle_data.png.import b/particle_data.png.import new file mode 100644 index 0000000..ca45739 --- /dev/null +++ b/particle_data.png.import @@ -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 diff --git a/shaders/point_draw_shader.gdshader b/shaders/point_draw_shader.gdshader new file mode 100644 index 0000000..c7c4451 --- /dev/null +++ b/shaders/point_draw_shader.gdshader @@ -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); +} \ No newline at end of file diff --git a/shaders/point_draw_shader.gdshader.uid b/shaders/point_draw_shader.gdshader.uid new file mode 100644 index 0000000..68c5daf --- /dev/null +++ b/shaders/point_draw_shader.gdshader.uid @@ -0,0 +1 @@ +uid://bq044vr2240p4 diff --git a/shaders/point_shader.gdshader b/shaders/point_update_shader.gdshader similarity index 84% rename from shaders/point_shader.gdshader rename to shaders/point_update_shader.gdshader index 04bc7db..51f15cf 100644 --- a/shaders/point_shader.gdshader +++ b/shaders/point_update_shader.gdshader @@ -7,6 +7,8 @@ uniform ivec2 point_texture_size; uniform ivec2 canvas_size; uniform float point_speed; +varying vec4 data; + // 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); @@ -17,7 +19,7 @@ float trail_at_pos(vec2 uv) { } void vertex() { - int id = VERTEX_ID; + int id = INSTANCE_ID; int x = id % point_texture_size.x; int y = id / point_texture_size.x; // This feels dumb @@ -25,14 +27,12 @@ void vertex() { 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); + //COLOR = vec4(0.2, 0.0, 0.0, 1.0) + data=vec4(pos, angle, point_data.z); } void fragment() { -} + COLOR=data; +} \ No newline at end of file diff --git a/shaders/point_shader.gdshader.uid b/shaders/point_update_shader.gdshader.uid similarity index 100% rename from shaders/point_shader.gdshader.uid rename to shaders/point_update_shader.gdshader.uid diff --git a/slime_simulation.gd b/slime_simulation.gd index 98854f3..a05fe33 100644 --- a/slime_simulation.gd +++ b/slime_simulation.gd @@ -13,12 +13,15 @@ var point_texture_height: int: @export var decay_factor: float = 0.95 @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 pass_viewport := $SubViewport -@onready var pass2_viewport := $SubViewport2 -@onready var point_shader: ShaderMaterial = $SubViewport/PointMesh.material -@onready var trail_shader: ShaderMaterial = $SubViewport2/Pass.material +@onready var point_update_vp := %PointUpdateViewport +@onready var trail_update_vp := %TrailUpdateViewport +@onready var point_draw_vp := %PointDrawViewport +@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 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) for i in point_count: 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 @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)) # 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) + + 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_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_texture_size", point_texture_size) + point_shader.set_shader_parameter("canvas_size", render_size) 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(): @@ -75,14 +86,16 @@ 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("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) func _render_process(frame_count: int) -> void: 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("trail_texture", pass_viewport.get_texture().get_rid()) - # point_shader.set_shader_parameter("sim_texture", pass2_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", trail_update_vp.get_texture().get_rid()) diff --git a/slime_simulation.tscn b/slime_simulation.tscn index acf0371..d833c0e 100644 --- a/slime_simulation.tscn +++ b/slime_simulation.tscn @@ -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="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"] [sub_resource type="QuadMesh" id="QuadMesh_h0wwo"] size = Vector2(1920, 1080) -[sub_resource type="ViewportTexture" id="ViewportTexture_s6nlv"] -viewport_path = NodePath("SubViewport") - -[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="ViewportTexture" id="ViewportTexture_g2c28"] +viewport_path = NodePath("TrailUpdateViewport/PointDrawViewport") [sub_resource type="ShaderMaterial" id="ShaderMaterial_g2c28"] shader = ExtResource("3_s6nlv") @@ -28,26 +18,32 @@ shader_parameter/decay_factor = 0.99 [sub_resource type="QuadMesh" id="QuadMesh_s6nlv"] 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"] script = ExtResource("1_s6nlv") [node name="View" type="MeshInstance2D" parent="."] position = Vector2(960, 540) mesh = SubResource("QuadMesh_h0wwo") -texture = SubResource("ViewportTexture_s6nlv") +texture = SubResource("ViewportTexture_g2c28") -[node name="SubViewport" type="SubViewport" parent="."] -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="SubViewport"] -material = SubResource("ShaderMaterial_s6nlv") -multimesh = SubResource("MultiMesh_vkm4v") - -[node name="SubViewport2" type="SubViewport" parent="."] +[node name="TrailUpdateViewport" type="SubViewport" parent="."] +unique_name_in_owner = true disable_3d = true transparent_bg = true handle_input_locally = false @@ -55,7 +51,31 @@ snap_2d_vertices_to_pixel = true size = Vector2i(1920, 1080) render_target_update_mode = 4 -[node name="Pass" type="MeshInstance2D" parent="SubViewport2"] +[node name="Pass" type="MeshInstance2D" parent="TrailUpdateViewport"] material = SubResource("ShaderMaterial_g2c28") position = Vector2(960, 540) 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")