Replace world shadows with player blob shadows
This commit is contained in:
parent
0d17921d20
commit
308447d481
8 changed files with 117 additions and 4 deletions
13
player/materials/player_blob_shadow.gdshader
Normal file
13
player/materials/player_blob_shadow.gdshader
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
1
player/materials/player_blob_shadow.gdshader.uid
Normal file
1
player/materials/player_blob_shadow.gdshader.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://cd16fw0yye48e
|
||||||
7
player/materials/player_blob_shadow.tres
Normal file
7
player/materials/player_blob_shadow.tres
Normal file
|
|
@ -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")
|
||||||
|
|
@ -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://player/player.gd" id="1_script"]
|
||||||
[ext_resource type="Script" path="res://inventory/fish_inventory.gd" id="2_inventory"]
|
[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_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_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://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"]
|
[sub_resource type="CapsuleShape3D" id="PlayerShape"]
|
||||||
radius = 0.45
|
radius = 0.45
|
||||||
|
|
@ -37,6 +39,10 @@ height = 1.2
|
||||||
albedo_color = Color(0.22, 0.12, 0.06, 1)
|
albedo_color = Color(0.22, 0.12, 0.06, 1)
|
||||||
roughness = 0.8
|
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"]
|
[node name="Player" type="CharacterBody3D"]
|
||||||
collision_layer = 2
|
collision_layer = 2
|
||||||
collision_mask = 1
|
collision_mask = 1
|
||||||
|
|
@ -49,6 +55,25 @@ shape = SubResource("PlayerShape")
|
||||||
[node name="Visuals" type="Node3D" parent="."]
|
[node name="Visuals" type="Node3D" parent="."]
|
||||||
unique_name_in_owner = true
|
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"]
|
[node name="MeshInstance3D" type="MeshInstance3D" parent="Visuals"]
|
||||||
position = Vector3(0, 0.9, 0)
|
position = Vector3(0, 0.9, 0)
|
||||||
mesh = SubResource("PlayerMesh")
|
mesh = SubResource("PlayerMesh")
|
||||||
|
|
|
||||||
66
player/player_ground_shadow.gd
Normal file
66
player/player_ground_shadow.gd
Normal file
|
|
@ -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,
|
||||||
|
)
|
||||||
1
player/player_ground_shadow.gd.uid
Normal file
1
player/player_ground_shadow.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://i8vkdcyckug3
|
||||||
|
|
@ -8,7 +8,7 @@ sky = ExtResource("1_sky")
|
||||||
background_energy_multiplier = 0.85
|
background_energy_multiplier = 0.85
|
||||||
ambient_light_source = 3
|
ambient_light_source = 3
|
||||||
ambient_light_sky_contribution = 1.0
|
ambient_light_sky_contribution = 1.0
|
||||||
ambient_light_energy = 0.8
|
ambient_light_energy = 0.9
|
||||||
reflected_light_source = 2
|
reflected_light_source = 2
|
||||||
fog_enabled = true
|
fog_enabled = true
|
||||||
fog_light_color = Color(0.54902, 0.74902, 0.764706, 1)
|
fog_light_color = Color(0.54902, 0.74902, 0.764706, 1)
|
||||||
|
|
|
||||||
|
|
@ -25,8 +25,8 @@ environment = ExtResource("4_environment")
|
||||||
[node name="Sun" type="DirectionalLight3D" parent="Environment"]
|
[node name="Sun" type="DirectionalLight3D" parent="Environment"]
|
||||||
rotation_degrees = Vector3(-54, -32, 0)
|
rotation_degrees = Vector3(-54, -32, 0)
|
||||||
light_color = Color(1, 0.945098, 0.721569, 1)
|
light_color = Color(1, 0.945098, 0.721569, 1)
|
||||||
light_energy = 0.68
|
light_energy = 0.58
|
||||||
shadow_enabled = true
|
shadow_enabled = false
|
||||||
shadow_opacity = 0.58
|
shadow_opacity = 0.58
|
||||||
shadow_blur = 2.0
|
shadow_blur = 2.0
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue