spaceship/world/Starfield.gd

28 lines
1.4 KiB
GDScript3
Raw Normal View History

extends ColorRect
# Feeds the starfield shader the camera's position split into a CELL INDEX
# plus a fraction within that cell, rather than a raw world position.
#
# Why: the fleet routinely reaches world coordinates in the tens of
# thousands. Handing those straight to the shader forces every downstream
# calculation (the division by cell_size, floor/fract, and especially the
# hash's internal multiplies) to work at large magnitudes, where a mobile
# GPU's float precision starts to break down - and no precision qualifier
# can fix that, since `highp` widens the type but the magnitudes stay huge.
# GDScript computes in double precision, so doing the split here and passing
# only small numbers (cell indices in the hundreds, fractions in [0,1])
# keeps the shader's arithmetic in a range it can represent exactly.
@onready var camera: Camera2D = get_node("../../Camera2D")
func _process(_delta: float) -> void:
var viewport_size: Vector2 = get_viewport_rect().size
var cell_size: float = material.get_shader_parameter("cell_size")
var p: Vector2 = camera.global_position / cell_size
var cell: Vector2 = Vector2(floor(p.x), floor(p.y))
material.set_shader_parameter("camera_cell", cell)
material.set_shader_parameter("camera_frac", p - cell)
material.set_shader_parameter("camera_zoom", 1.0 / camera.zoom.x)
material.set_shader_parameter("viewport_size", viewport_size)