From 308447d481237bc88d901761011ff0537802e5ee Mon Sep 17 00:00:00 2001 From: Voyager Date: Fri, 31 Jul 2026 14:00:19 -0400 Subject: [PATCH] Replace world shadows with player blob shadows --- player/materials/player_blob_shadow.gdshader | 13 ++++ .../materials/player_blob_shadow.gdshader.uid | 1 + player/materials/player_blob_shadow.tres | 7 ++ player/player.tscn | 27 +++++++- player/player_ground_shadow.gd | 66 +++++++++++++++++++ player/player_ground_shadow.gd.uid | 1 + world/environment/netfishing_environment.tres | 2 +- world/test_world.tscn | 4 +- 8 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 player/materials/player_blob_shadow.gdshader create mode 100644 player/materials/player_blob_shadow.gdshader.uid create mode 100644 player/materials/player_blob_shadow.tres create mode 100644 player/player_ground_shadow.gd create mode 100644 player/player_ground_shadow.gd.uid diff --git a/player/materials/player_blob_shadow.gdshader b/player/materials/player_blob_shadow.gdshader new file mode 100644 index 0000000..c1a5089 --- /dev/null +++ b/player/materials/player_blob_shadow.gdshader @@ -0,0 +1,13 @@ +shader_type spatial; +render_mode blend_mix, depth_draw_never, cull_disabled, unshaded; + +uniform vec4 shadow_color : source_color = vec4(0.035, 0.105, 0.125, 0.18); +uniform float inner_softness : hint_range(0.0, 0.8, 0.01) = 0.05; + +void fragment() { + vec2 centered_uv = (UV - vec2(0.5)) * 2.0; + float radial_distance = dot(centered_uv, centered_uv); + float falloff = 1.0 - smoothstep(inner_softness, 1.0, radial_distance); + ALBEDO = shadow_color.rgb; + ALPHA = shadow_color.a * falloff; +} diff --git a/player/materials/player_blob_shadow.gdshader.uid b/player/materials/player_blob_shadow.gdshader.uid new file mode 100644 index 0000000..d7cd853 --- /dev/null +++ b/player/materials/player_blob_shadow.gdshader.uid @@ -0,0 +1 @@ +uid://cd16fw0yye48e diff --git a/player/materials/player_blob_shadow.tres b/player/materials/player_blob_shadow.tres new file mode 100644 index 0000000..249429f --- /dev/null +++ b/player/materials/player_blob_shadow.tres @@ -0,0 +1,7 @@ +[gd_resource type="ShaderMaterial" load_steps=2 format=3] + +[ext_resource type="Shader" path="res://player/materials/player_blob_shadow.gdshader" id="1_shader"] + +[resource] +render_priority = 1 +shader = ExtResource("1_shader") diff --git a/player/player.tscn b/player/player.tscn index 977040d..c0bbc9f 100644 --- a/player/player.tscn +++ b/player/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=18 format=3] +[gd_scene load_steps=21 format=3] [ext_resource type="Script" path="res://player/player.gd" id="1_script"] [ext_resource type="Script" path="res://inventory/fish_inventory.gd" id="2_inventory"] @@ -10,6 +10,8 @@ [ext_resource type="Script" path="res://progression/player_fishing_upgrades.gd" id="8_upgrades"] [ext_resource type="Script" path="res://progression/player_item_effects.gd" id="9_effects"] [ext_resource type="Script" path="res://progression/player_cooler_capacity.gd" id="10_capacity"] +[ext_resource type="Script" path="res://player/player_ground_shadow.gd" id="11_ground_shadow"] +[ext_resource type="Material" path="res://player/materials/player_blob_shadow.tres" id="12_blob_shadow"] [sub_resource type="CapsuleShape3D" id="PlayerShape"] radius = 0.45 @@ -37,6 +39,10 @@ height = 1.2 albedo_color = Color(0.22, 0.12, 0.06, 1) roughness = 0.8 +[sub_resource type="QuadMesh" id="GroundShadowMesh"] +material = ExtResource("12_blob_shadow") +size = Vector2(1.15, 0.72) + [node name="Player" type="CharacterBody3D"] collision_layer = 2 collision_mask = 1 @@ -49,6 +55,25 @@ shape = SubResource("PlayerShape") [node name="Visuals" type="Node3D" parent="."] unique_name_in_owner = true +[node name="GroundShadow" type="Node3D" parent="."] +script = ExtResource("11_ground_shadow") + +[node name="GroundProbe" type="RayCast3D" parent="GroundShadow"] +unique_name_in_owner = true +position = Vector3(0, 0.45, 0) +target_position = Vector3(0, -4.5, 0) +collision_mask = 9 +collide_with_areas = true + +[node name="GroundShadowPlacement" type="Node3D" parent="GroundShadow"] +unique_name_in_owner = true + +[node name="GroundShadowVisual" type="MeshInstance3D" parent="GroundShadow/GroundShadowPlacement"] +unique_name_in_owner = true +rotation_degrees = Vector3(-90, 0, 0) +cast_shadow = 0 +mesh = SubResource("GroundShadowMesh") + [node name="MeshInstance3D" type="MeshInstance3D" parent="Visuals"] position = Vector3(0, 0.9, 0) mesh = SubResource("PlayerMesh") diff --git a/player/player_ground_shadow.gd b/player/player_ground_shadow.gd new file mode 100644 index 0000000..9a4bb6f --- /dev/null +++ b/player/player_ground_shadow.gd @@ -0,0 +1,66 @@ +class_name PlayerGroundShadow +extends Node3D + +@export_range(0.0, 0.1, 0.001) var surface_offset: float = 0.018 +@export_range(0.0, 0.5, 0.01) var full_opacity_height: float = 0.12 +@export_range(0.5, 4.0, 0.05) var fade_end_height: float = 2.0 +@export_range(1.0, 20.0, 0.5) var fade_speed: float = 10.0 +@export_range(0.25, 1.0, 0.01) var airborne_scale: float = 0.72 + +@onready var _player := get_parent() as Player +@onready var _ground_probe: RayCast3D = %GroundProbe +@onready var _placement: Node3D = %GroundShadowPlacement +@onready var _visual: MeshInstance3D = %GroundShadowVisual + +var _opacity: float = 0.0 +var _visual_scale: float = 1.0 + + +func _ready() -> void: + _visual.visible = false + + +func _physics_process(delta: float) -> void: + _ground_probe.force_raycast_update() + var target_opacity := 0.0 + var target_scale := airborne_scale + var can_place := ( + _player != null + and _player.is_remote_presentation_visible() + and not _player.is_water_recovery_active() + and _ground_probe.is_colliding() + and not (_ground_probe.get_collider() is PlayerWaterTrigger) + ) + if can_place: + var hit_position: Vector3 = _ground_probe.get_collision_point() + var hit_normal: Vector3 = _ground_probe.get_collision_normal().normalized() + var height := maxf(global_position.y - hit_position.y, 0.0) + var height_fade := 1.0 - smoothstep( + full_opacity_height, + fade_end_height, + height, + ) + target_opacity = height_fade + target_scale = lerpf(airborne_scale, 1.0, height_fade) + _place_on_surface(hit_position, hit_normal) + _opacity = move_toward(_opacity, target_opacity, fade_speed * delta) + _visual_scale = move_toward( + _visual_scale, + target_scale, + fade_speed * 0.35 * delta, + ) + _placement.scale = Vector3.ONE * _visual_scale + _visual.visible = _opacity > 0.001 + _visual.transparency = 1.0 - _opacity + + +func _place_on_surface(position: Vector3, normal: Vector3) -> void: + var tangent := Vector3.RIGHT - normal * Vector3.RIGHT.dot(normal) + if tangent.length_squared() < 0.001: + tangent = Vector3.FORWARD - normal * Vector3.FORWARD.dot(normal) + tangent = tangent.normalized() + var bitangent := tangent.cross(normal).normalized() + _placement.global_transform = Transform3D( + Basis(tangent, normal, bitangent), + position + normal * surface_offset, + ) diff --git a/player/player_ground_shadow.gd.uid b/player/player_ground_shadow.gd.uid new file mode 100644 index 0000000..1dd7974 --- /dev/null +++ b/player/player_ground_shadow.gd.uid @@ -0,0 +1 @@ +uid://i8vkdcyckug3 diff --git a/world/environment/netfishing_environment.tres b/world/environment/netfishing_environment.tres index dcaad2b..6381310 100644 --- a/world/environment/netfishing_environment.tres +++ b/world/environment/netfishing_environment.tres @@ -8,7 +8,7 @@ sky = ExtResource("1_sky") background_energy_multiplier = 0.85 ambient_light_source = 3 ambient_light_sky_contribution = 1.0 -ambient_light_energy = 0.8 +ambient_light_energy = 0.9 reflected_light_source = 2 fog_enabled = true fog_light_color = Color(0.54902, 0.74902, 0.764706, 1) diff --git a/world/test_world.tscn b/world/test_world.tscn index 4191f65..9b03a5d 100644 --- a/world/test_world.tscn +++ b/world/test_world.tscn @@ -25,8 +25,8 @@ environment = ExtResource("4_environment") [node name="Sun" type="DirectionalLight3D" parent="Environment"] rotation_degrees = Vector3(-54, -32, 0) light_color = Color(1, 0.945098, 0.721569, 1) -light_energy = 0.68 -shadow_enabled = true +light_energy = 0.58 +shadow_enabled = false shadow_opacity = 0.58 shadow_blur = 2.0