diff --git a/project.godot b/project.godot index 1bb802c..ce51da1 100644 --- a/project.godot +++ b/project.godot @@ -30,4 +30,6 @@ folder_colors={ [rendering] +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" environment/defaults/default_clear_color=Color(0.0605303, 0.0605304, 0.0605303, 1) diff --git a/shaders/agent_shader.gdshader b/shaders/agent_shader.gdshader new file mode 100644 index 0000000..a35ada2 --- /dev/null +++ b/shaders/agent_shader.gdshader @@ -0,0 +1,8 @@ +shader_type canvas_item; + +uniform sampler2D sim_texture; + +void fragment() { + vec3 c = texture(sim_texture, UV).rgb; + COLOR = vec4(c, 1.0); +} diff --git a/shaders/trail_shader.gdshader.uid b/shaders/agent_shader.gdshader.uid similarity index 100% rename from shaders/trail_shader.gdshader.uid rename to shaders/agent_shader.gdshader.uid diff --git a/shaders/dissolve.gdshader b/shaders/dissolve.gdshader new file mode 100644 index 0000000..baf9398 --- /dev/null +++ b/shaders/dissolve.gdshader @@ -0,0 +1,11 @@ +shader_type canvas_item; + +uniform sampler2D sim_texture; + +uniform float decay_factor; + +void fragment() { + float c = texture(sim_texture, UV).r; + c = c * decay_factor; + COLOR = vec4(c, c, c, 1.0); +} diff --git a/shaders/dissolve.gdshader.uid b/shaders/dissolve.gdshader.uid new file mode 100644 index 0000000..ebdd462 --- /dev/null +++ b/shaders/dissolve.gdshader.uid @@ -0,0 +1 @@ +uid://bj3v35wyy32la diff --git a/shaders/trail_shader.gdshader b/shaders/trail_shader.gdshader deleted file mode 100644 index 28cbe15..0000000 --- a/shaders/trail_shader.gdshader +++ /dev/null @@ -1,8 +0,0 @@ -shader_type canvas_item; - -void fragment() { - vec3 c1 = vec3(0.0, 0.4, 0.4); - vec3 c2 = vec3(0.4, 0.0, 0.4); - vec3 cout = mix(c1, c2, UV.x); - COLOR = vec4(cout, 1.0); -} diff --git a/shaders/view_simulation.gdshader b/shaders/view_simulation.gdshader index 9b698cc..7ff2e93 100644 --- a/shaders/view_simulation.gdshader +++ b/shaders/view_simulation.gdshader @@ -1,6 +1,6 @@ shader_type canvas_item; -uniform sampler2D view_texture; +uniform sampler2D sim_texture; void fragment() { vec3 v = texture(view_texture, UV).rgb; diff --git a/slime_simulation.gd b/slime_simulation.gd index 7a757c4..668988d 100644 --- a/slime_simulation.gd +++ b/slime_simulation.gd @@ -1,12 +1,58 @@ extends Node2D -@onready var view := $View -@onready var trail_shader: ShaderMaterial = $SubViewport/Pass1.material +@export var render_width: int = 1920 +@export var render_height: int = 1080 + +@export var decay_factor: float = 0.95 + +@onready var view := $View +@onready var pass_viewport := $SubViewport +@onready var pass2_viewport := $SubViewport2 +@onready var agent_shader: ShaderMaterial = $SubViewport/Pass.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 view_texture: Texture2DRD = null func _ready(): - pass + RenderingServer.call_on_render_thread(_initialize_render.bind(render_width, render_height)) + func _process(_delta: float) -> void: - pass + next_texture = (next_texture + 1) % MAX_TEXTURES + RenderingServer.call_on_render_thread( + _render_process.bind(next_texture, frame_count, decay_factor) + ) + + frame_count = frame_count + 1 + + +# Below is for rendering + +var rd: RenderingDevice = null +var sim_texture: Texture2D = null + + +func _create_initial_sim_texture(width: int, height: int) -> ImageTexture: + var sim_image := Image.create_empty(width, height, false, Image.FORMAT_RGBF) + sim_texture = ImageTexture.create_from_image(sim_image) + + return sim_texture + + +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("decay_factor", decay_factor) + + +func _render_process(next_texture: int, frame_count: int, decay_factor: float) -> void: + if frame_count > 0: + agent_shader.set_shader_parameter("sim_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()) diff --git a/slime_simulation.tscn b/slime_simulation.tscn index 62f21bd..46f6b0c 100644 --- a/slime_simulation.tscn +++ b/slime_simulation.tscn @@ -1,20 +1,39 @@ -[gd_scene load_steps=7 format=3 uid="uid://0q5qa7yiya83"] +[gd_scene load_steps=12 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/trail_shader.gdshader" id="3_vkm4v"] +[ext_resource type="Shader" uid="uid://cwt4a55lblykn" path="res://shaders/agent_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("SubViewport") +viewport_path = NodePath("SubViewport2") + +[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"] -shader = ExtResource("3_vkm4v") +shader = ExtResource("2_pxe3a") +shader_parameter/sim_texture = SubResource("NoiseTexture2D_g2c28") [sub_resource type="QuadMesh" id="QuadMesh_s6nlv"] size = Vector2(1920, 1080) +[sub_resource type="Texture2DRD" id="Texture2DRD_s6nlv"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_g2c28"] +shader = ExtResource("3_s6nlv") +shader_parameter/sim_texture = SubResource("Texture2DRD_s6nlv") +shader_parameter/decay_factor = 0.95 + [node name="SlimeSimulation" type="Node2D"] script = ExtResource("1_s6nlv") @@ -24,13 +43,27 @@ mesh = SubResource("QuadMesh_h0wwo") texture = SubResource("ViewportTexture_s6nlv") [node name="SubViewport" type="SubViewport" parent="."] +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="Pass1" type="MeshInstance2D" parent="SubViewport"] +[node name="Pass" type="MeshInstance2D" parent="SubViewport"] material = SubResource("ShaderMaterial_evymn") position = Vector2(960, 540) mesh = SubResource("QuadMesh_s6nlv") + +[node name="SubViewport2" type="SubViewport" parent="."] +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="SubViewport2"] +material = SubResource("ShaderMaterial_g2c28") +position = Vector2(960, 540) +mesh = SubResource("QuadMesh_s6nlv") diff --git a/slime_simulation_cs/show_simulation_cs.gdshader b/slime_simulation_cs/show_simulation_cs.gdshader index 4012661..a6a8fe6 100644 --- a/slime_simulation_cs/show_simulation_cs.gdshader +++ b/slime_simulation_cs/show_simulation_cs.gdshader @@ -1,4 +1,5 @@ shader_type canvas_item; + uniform sampler2D trail_tex; void fragment() {