Randoloot/scripts/planets/surface_clouds.gd
2026-10-18 14:46:34 +02:00

53 lines
2.0 KiB
GDScript

extends Node2D
## Terrain scrolls at 1x; this elevated mist moves at 1.22x and 1.34x.
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
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 y in range(-3,4):
for x in range(-3,4):
var mist := Sprite2D.new()
mist.texture = TEXTURE
mist.material = mist_material
mist.scale = Vector2.ONE*rng.randf_range(1050,1550)/TEXTURE.get_width()
mist.rotation = rng.randf_range(-PI,PI)
mist.modulate = Color(0.9,0.95,1.0,rng.randf_range(0.24,0.34))
clouds.add_child(mist)
var shadow := Sprite2D.new()
shadow.texture = TEXTURE
shadow.material = mist_material
shadow.scale = mist.scale
shadow.rotation = mist.rotation
shadow.modulate = Color(0.02,0.04,0.06,0.055)
shadows.add_child(shadow)
_banks.append({"mist":mist,"shadow":shadow,"origin":Vector2(x*800,y*800)+Vector2(rng.randf_range(-240,240),rng.randf_range(-240,240)),"parallax":1.22 if (x+y)%2 == 0 else 1.34,"speed":rng.randf_range(5,10)})
_process(0)
func _process(delta: float) -> void:
_time += delta
var camera := get_viewport().get_camera_2d()
var center := camera.get_screen_center_position() if camera != null else Vector2.ZERO
for bank in _banks:
var drift := Vector2(float(bank.speed)*_time,float(bank.speed)*_time*0.3)
var drifting: Vector2 = bank.origin+drift
var location: Vector2 = Vector2(wrapf(drifting.x,-2800,2800),wrapf(drifting.y,-2800,2800))+center*(1.0-float(bank.parallax))
bank.mist.position = location
bank.shadow.position = location+Vector2(35,45)