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)