Randoloot/scripts/planets/surface_clouds.gd
2026-10-19 22:33:24 +02:00

69 lines
2.7 KiB
GDScript

extends Node2D
## Two elevated cloud decks, with weather-driven coverage, color and moving shadows.
const TEXTURE := preload("res://assets/planets/cloud_mist.png")
var seed_value := 0
var _banks: Array[Dictionary] = []
var _time := 0.0
var clouds: Node2D
var shadows: Node2D
var coverage := 0.8
var darkness := 0.0
var weather_wind := Vector2(18,6)
var _coverage := 0.8
var _darkness := 0.0
func _ready() -> void:
texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS
shadows = Node2D.new()
shadows.name = "CloudShadows"
shadows.z_index = 5
add_child(shadows)
clouds = Node2D.new()
clouds.name = "AboveLander"
clouds.z_index = 70
add_child(clouds)
var rng := RandomNumberGenerator.new()
rng.seed = seed_value ^ 0x434c4f55
var mist_material := ShaderMaterial.new()
mist_material.shader = preload("res://resources/effects/cloud_mist.gdshader")
for layer in range(2):
var radius := 3 if layer == 0 else 2
for y in range(-radius,radius+1):
for x in range(-radius,radius+1):
var mist := Sprite2D.new()
mist.texture = TEXTURE
mist.material = mist_material
mist.scale = Vector2.ONE*rng.randf_range(1250,1750)/TEXTURE.get_width() * (1.25 if layer == 1 else 1.0)
mist.rotation = rng.randf_range(-PI,PI)
clouds.add_child(mist)
var shadow := Sprite2D.new()
shadow.texture = TEXTURE
shadow.material = mist_material
shadow.scale = mist.scale
shadow.rotation = mist.rotation
shadows.add_child(shadow)
_banks.append({"mist":mist,"shadow":shadow,"origin":Vector2(x*750,y*750)+Vector2(rng.randf_range(-200,200),rng.randf_range(-200,200)),"parallax":1.22 if layer == 0 else 1.38,"speed":rng.randf_range(0.25,0.55),"layer":layer,"alpha":rng.randf_range(0.21,0.30)})
_process(0)
func set_weather(cloud_cover: float, dark: float, wind: Vector2) -> void:
coverage = clampf(cloud_cover,0.0,1.8)
darkness = clampf(dark,0.0,1.0)
weather_wind = wind
func _process(delta: float) -> void:
_time += delta
_coverage = move_toward(_coverage,coverage,delta*0.22)
_darkness = move_toward(_darkness,darkness,delta*0.12)
var camera := get_viewport().get_camera_2d()
var center := camera.get_screen_center_position() if camera != null else Vector2.ZERO
for bank in _banks:
bank.origin += weather_wind*float(bank.speed)*delta
var location := Vector2(wrapf(bank.origin.x,-2800,2800),wrapf(bank.origin.y,-2800,2800))+center*(1.0-float(bank.parallax))
bank.mist.position = location
bank.shadow.position = location+Vector2(45,60)
var color := Color("d6e0e8").lerp(Color("060b14"),_darkness*0.98)
var amount := _coverage if int(bank.layer) == 0 else _coverage*smoothstep(0.20,0.85,_darkness)*0.55
color.a = float(bank.alpha)*amount
bank.mist.modulate = color
bank.shadow.modulate = Color(0.02,0.035,0.06,amount*(0.025+_darkness*0.055))