big
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
extends Node
|
||||
class_name CloudSunSync
|
||||
|
||||
## Keeps the fullscreen sky composite tied to the real DirectionalLight3D.
|
||||
##
|
||||
## The Environment sky shader receives LIGHT0_DIRECTION automatically, but the
|
||||
## ink pass has to repaint background pixels after the screen copy. This bridge
|
||||
## gives that second shader the same moving direction and color every frame.
|
||||
|
||||
var _sun: DirectionalLight3D
|
||||
var _ink_material: ShaderMaterial
|
||||
var _palette_sun_color := Color.WHITE
|
||||
|
||||
|
||||
func configure(sun: DirectionalLight3D, ink_material: ShaderMaterial) -> void:
|
||||
_sun = sun
|
||||
_ink_material = ink_material
|
||||
var authored = ink_material.get_shader_parameter("sky_sun_color")
|
||||
if authored is Color:
|
||||
_palette_sun_color = authored
|
||||
_sync()
|
||||
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
_sync()
|
||||
|
||||
|
||||
func _sync() -> void:
|
||||
if not is_instance_valid(_sun) or not is_instance_valid(_ink_material):
|
||||
set_process(false)
|
||||
return
|
||||
|
||||
# DirectionalLight3D shines down its local -Z axis, so +Z points back
|
||||
# toward the apparent sun—the direction a sky pixel uses for illumination.
|
||||
var toward_sun := _sun.global_transform.basis.z.normalized()
|
||||
_ink_material.set_shader_parameter("sky_sun_direction", toward_sun)
|
||||
|
||||
# Preserve the authored day/sunset palette while allowing a dynamically
|
||||
# recolored sun to tint the cloud's lit face.
|
||||
var live_color := _palette_sun_color.lerp(_sun.light_color, 0.35)
|
||||
var energy_scale: float = clampf(_sun.light_energy / 1.4, 0.75, 1.25)
|
||||
_ink_material.set_shader_parameter(
|
||||
"sky_sun_color", live_color * energy_scale)
|
||||
Reference in New Issue
Block a user