diff --git a/common/vfx/materials/shaders/screen_clouds.gdshader b/common/vfx/materials/shaders/screen_clouds.gdshader new file mode 100644 index 0000000..78c000b --- /dev/null +++ b/common/vfx/materials/shaders/screen_clouds.gdshader @@ -0,0 +1,48 @@ +// Based on https://godotshaders.com/shader/screen-smoke-fog/ +shader_type canvas_item; +render_mode blend_mul; + +// Stuff related to camera position and offsets +uniform vec2 camera_position; +uniform vec2 camera_zoom = vec2(1.0); +uniform vec2 viewport_size = vec2(1920.0, 1080.0); + +// Uniforms for customization +uniform sampler2D noise_texture : repeat_enable; +uniform float cloud_speed : hint_range(0.0, 1.0) = 1.0; +uniform float cloud_delay : hint_range(0.0, 100.0) = 1.0; +uniform vec2 noise_dir = vec2(1.0,+1.0); +uniform vec3 cloud_color : source_color = vec3(0.8); +uniform float cloud_alpha : hint_range(0.0, 1.0) = 1.0; +uniform float cloud_size : hint_range(1.0, 100.0) = 10.0; +uniform float cloud_distorsion_speed : hint_range(0.0, 1.) = 0.05; +uniform float density : hint_range(0.0, 1.0) = 1.0; +uniform float blur_amount : hint_range(0.0, 1.0) = 1.0; + +void fragment() { + vec2 world_pos = (UV - 0.5) * (viewport_size) / camera_zoom + camera_position; + + //COLOR=texture(noise_texture, world_pos * (1./(cloud_size*100.))); + + float time = TIME+cloud_delay; + + vec2 time_offset = time * noise_dir * cloud_speed * 0.01; + vec2 distorsion_time_offset = time * noise_dir * (cloud_speed + vec2(cloud_distorsion_speed,cloud_distorsion_speed)) * 0.01; + + vec2 cloud_uv = world_pos * (1./(cloud_size*100.)) + time_offset; + vec2 distorsion_cloud_uv = world_pos * (1./(cloud_size*100.)) + distorsion_time_offset; + + float final_noise = ( + texture(noise_texture, cloud_uv) * 0.5 + + texture(noise_texture, distorsion_cloud_uv) * 0.5 + ).r; + + float edge = smoothstep(density - blur_amount * 0.5, density + blur_amount * 0.5, final_noise); + + COLOR = vec4(mix(cloud_color, vec3(1.0), edge), 1.0); + + //if (final_noise < density) { + //COLOR = vec4(cloud_color.r,cloud_color.g,cloud_color.b,1.); + //} else + //COLOR = vec4(1.,1.,1.,1.); +} \ No newline at end of file diff --git a/common/vfx/materials/shaders/screen_clouds.gdshader.uid b/common/vfx/materials/shaders/screen_clouds.gdshader.uid new file mode 100644 index 0000000..3b9438d --- /dev/null +++ b/common/vfx/materials/shaders/screen_clouds.gdshader.uid @@ -0,0 +1 @@ +uid://doceegdvj0pp3 diff --git a/stages/terrain/region/region.tscn b/stages/terrain/region/region.tscn index cbdcfa5..3cc8192 100644 --- a/stages/terrain/region/region.tscn +++ b/stages/terrain/region/region.tscn @@ -4,21 +4,16 @@ [ext_resource type="Shader" uid="uid://cfj18vc04cgkg" path="res://common/vfx/materials/shaders/blur_vignette.gdshader" id="2_ktnx3"] [ext_resource type="PackedScene" uid="uid://yk78ubpu5ghq" path="res://gui/game/pass_day/pass_day.tscn" id="3_ktnx3"] [ext_resource type="Shader" uid="uid://btgk5l0a6ii44" path="res://common/vfx/materials/shaders/screen_fog.gdshader" id="3_qdnee"] -[ext_resource type="Script" uid="uid://bi8fo6yp25su7" path="res://stages/terrain/region/scripts/camera_fog.gd" id="4_ovqi1"] +[ext_resource type="Script" uid="uid://bi8fo6yp25su7" path="res://stages/terrain/region/scripts/screen_post_process.gd" id="4_ovqi1"] [ext_resource type="PackedScene" uid="uid://12nak7amd1uq" path="res://gui/game/game_gui.tscn" id="4_qdnee"] +[ext_resource type="Shader" uid="uid://doceegdvj0pp3" path="res://common/vfx/materials/shaders/screen_clouds.gdshader" id="5_2w03p"] +[ext_resource type="Script" uid="uid://b366do6jdx87h" path="res://stages/terrain/region/scripts/post_process/clouds.gd" id="5_6d8m3"] [ext_resource type="PackedScene" uid="uid://bgvbgeq46wee2" path="res://entities/player/player.tscn" id="5_ovqi1"] [ext_resource type="PackedScene" uid="uid://d324mlmgls4fs" path="res://entities/interactables/truck/recharge/truck_recharge.tscn" id="7_6d8m3"] [ext_resource type="PackedScene" uid="uid://dj7gp3crtg2yt" path="res://entities/camera/camera.tscn" id="8_fwgig"] [ext_resource type="PackedScene" uid="uid://fnv0qhkh40mv" path="res://gui/game/announce/announce.tscn" id="8_mlppq"] [ext_resource type="Texture2D" uid="uid://rdrhi3r11ey6" path="res://common/icons/square-rounded.svg" id="10_ktnx3"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_qdnee"] -shader = ExtResource("2_ktnx3") -shader_parameter/blur_radius = 0.0630000029925 -shader_parameter/blur_amount = 1.0000000475 -shader_parameter/blur_inner = 0.4950000235125 -shader_parameter/blur_outer = 0.7810000370975 - [sub_resource type="FastNoiseLite" id="FastNoiseLite_ovqi1"] noise_type = 2 @@ -47,7 +42,37 @@ shader_parameter/noise_speed_2 = 0.010000000475 shader_parameter/noise_dir_1 = Vector2(1, 1) shader_parameter/noise_dir_2 = Vector2(1, -1) shader_parameter/smoke_color = Color(1, 1, 1, 1) -shader_parameter/density = 0.010000000475 +shader_parameter/density = 0.070000003325 + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_2w03p"] +noise_type = 2 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_6d8m3"] +noise = SubResource("FastNoiseLite_2w03p") +seamless = true + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_6d8m3"] +shader = ExtResource("5_2w03p") +shader_parameter/camera_position = Vector2(0, 0) +shader_parameter/camera_zoom = Vector2(1, 1) +shader_parameter/viewport_size = Vector2(1920, 1080) +shader_parameter/noise_texture = SubResource("NoiseTexture2D_6d8m3") +shader_parameter/cloud_speed = 0.10000000475 +shader_parameter/cloud_delay = 1.0 +shader_parameter/noise_dir = Vector2(1, 1) +shader_parameter/cloud_color = Color(0.59428054, 0.8206175, 0.899937, 1) +shader_parameter/cloud_alpha = 1.0 +shader_parameter/cloud_size = 87.48400410799 +shader_parameter/cloud_distorsion_speed = 0.10000000475 +shader_parameter/density = 0.3610000171475 +shader_parameter/blur_amount = 0.0400000019 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_qdnee"] +shader = ExtResource("2_ktnx3") +shader_parameter/blur_radius = 0.0630000029925 +shader_parameter/blur_amount = 1.0000000475 +shader_parameter/blur_inner = 0.4950000235125 +shader_parameter/blur_outer = 0.7810000370975 [sub_resource type="Curve" id="Curve_qdnee"] _data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.4883721, 1), 0.037164874, 0.037164874, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] @@ -88,17 +113,10 @@ script = ExtResource("1_441sk") entity_container = NodePath("Entities") [node name="PostProcess" type="CanvasLayer" parent="." unique_id=729471745] - -[node name="Vignette" type="ColorRect" parent="PostProcess" unique_id=2057271511] -material = SubResource("ShaderMaterial_qdnee") -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 +layer = 0 [node name="Fog" type="ColorRect" parent="PostProcess" unique_id=1487713892 node_paths=PackedStringArray("camera")] +visible = false material = SubResource("ShaderMaterial_mlppq") anchors_preset = 15 anchor_right = 1.0 @@ -109,8 +127,30 @@ mouse_filter = 2 script = ExtResource("4_ovqi1") camera = NodePath("../../Camera") +[node name="Clouds" type="ColorRect" parent="PostProcess" unique_id=1053740484 node_paths=PackedStringArray("camera", "region")] +material = SubResource("ShaderMaterial_6d8m3") +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("5_6d8m3") +camera = NodePath("../../Camera") +region = NodePath("../..") + +[node name="Vignette" type="ColorRect" parent="PostProcess" unique_id=2057271511] +material = SubResource("ShaderMaterial_qdnee") +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + [node name="PassDay" parent="." unique_id=1144772570 instance=ExtResource("3_ktnx3")] unique_name_in_owner = true +visible = false [node name="RegionGui" type="CanvasLayer" parent="." unique_id=2024485651] layer = 2 diff --git a/stages/terrain/region/scripts/camera_fog.gd b/stages/terrain/region/scripts/camera_fog.gd deleted file mode 100644 index d6489af..0000000 --- a/stages/terrain/region/scripts/camera_fog.gd +++ /dev/null @@ -1,10 +0,0 @@ -extends ColorRect - -@export var camera : Camera - -func _process(_delta: float) -> void: - if is_node_ready(): - if visible: - if camera: - material.set_shader_parameter( "camera_position", camera.global_position ) - # material.set_shader_parameter( "camera_offset", camera.offset ) \ No newline at end of file diff --git a/stages/terrain/region/scripts/post_process/clouds.gd b/stages/terrain/region/scripts/post_process/clouds.gd new file mode 100644 index 0000000..80284cd --- /dev/null +++ b/stages/terrain/region/scripts/post_process/clouds.gd @@ -0,0 +1,52 @@ +extends ColorRect + +@export var camera : Camera +@export var region : Region + +const PASSING_DAY_CLOUD_SPEED = 5 +const CLOUD_DELAY_ACC_LERP = 0.2 + +var in_passing_day := false +var cloud_delay := 0. +var cloud_delay_acc = 0. + +func _ready(): + if region: + update_noise() + + region.data.pass_day_proceeded.connect( + func(_d): + update_noise() + cloud_delay = 0 + + ) + else: + printerr("No region selected for clouds") + +func _process(_delta: float) -> void: + if is_node_ready(): + if region and region.data.in_passing_day_animation: + cloud_delay_acc = lerp(cloud_delay_acc,1.,CLOUD_DELAY_ACC_LERP) + else: + cloud_delay_acc = lerp(cloud_delay_acc,0.,CLOUD_DELAY_ACC_LERP) + + cloud_delay += cloud_delay_acc * PASSING_DAY_CLOUD_SPEED + + if visible: + if camera: + material.set_shader_parameter("camera_zoom", camera.zoom ) + material.set_shader_parameter("camera_position", camera.global_position ) + material.set_shader_parameter("viewport_size", get_viewport().get_visible_rect().size) + material.set_shader_parameter("cloud_delay", cloud_delay) + +func update_noise() -> void: + var texture := NoiseTexture2D.new() + texture.seamless = true + + var noise := FastNoiseLite.new() + noise.noise_type = FastNoiseLite.TYPE_CELLULAR + noise.seed = region.data.region_name.hash() + region.data.charges + + texture.noise = noise + + material.set_shader_parameter("noise_texture", texture) \ No newline at end of file diff --git a/stages/terrain/region/scripts/post_process/clouds.gd.uid b/stages/terrain/region/scripts/post_process/clouds.gd.uid new file mode 100644 index 0000000..af5f380 --- /dev/null +++ b/stages/terrain/region/scripts/post_process/clouds.gd.uid @@ -0,0 +1 @@ +uid://b366do6jdx87h diff --git a/stages/terrain/region/scripts/screen_post_process.gd b/stages/terrain/region/scripts/screen_post_process.gd new file mode 100644 index 0000000..ea02c30 --- /dev/null +++ b/stages/terrain/region/scripts/screen_post_process.gd @@ -0,0 +1,14 @@ +extends ColorRect + +@export var camera : Camera + + + + +func _process(_delta: float) -> void: + if is_node_ready(): + if visible: + if camera: + material.set_shader_parameter("camera_zoom", camera.zoom ) + material.set_shader_parameter("camera_position", camera.global_position ) + material.set_shader_parameter( "viewport_size", get_viewport().get_visible_rect().size) \ No newline at end of file diff --git a/stages/terrain/region/scripts/camera_fog.gd.uid b/stages/terrain/region/scripts/screen_post_process.gd.uid similarity index 100% rename from stages/terrain/region/scripts/camera_fog.gd.uid rename to stages/terrain/region/scripts/screen_post_process.gd.uid