Initial commit
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
extends Node3D
|
||||
## Earth impostor — from Luna you are always far; show a disc inside far plane.
|
||||
|
||||
@export var real_earth_path: NodePath = ^".."
|
||||
@export var surface_path: NodePath = ^"../EarthSurface"
|
||||
@export var impostor_mesh_path: NodePath = ^"ImposterSphere"
|
||||
|
||||
@export var switch_distance: float = 150000.0
|
||||
@export var visual_distance: float = 120000.0
|
||||
@export var real_radius: float = 637100.0
|
||||
|
||||
var _real: Node3D
|
||||
var _surface: Node3D
|
||||
var _mesh: MeshInstance3D
|
||||
var _base_radius: float = 0.5
|
||||
|
||||
func _ready() -> void:
|
||||
_real = get_node_or_null(real_earth_path) as Node3D
|
||||
_surface = get_node_or_null(surface_path) as Node3D
|
||||
_mesh = get_node_or_null(impostor_mesh_path) as MeshInstance3D
|
||||
|
||||
if _mesh and _mesh.mesh is SphereMesh:
|
||||
_base_radius = maxf((_mesh.mesh as SphereMesh).radius, 0.5)
|
||||
|
||||
if _mesh:
|
||||
_mesh.visible = false
|
||||
# Keep YOUR material/texture; only force unshaded so it reads in space
|
||||
var src_mat: Material = _mesh.get_active_material(0)
|
||||
if src_mat is StandardMaterial3D:
|
||||
var mat: StandardMaterial3D = (src_mat as StandardMaterial3D).duplicate()
|
||||
mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
|
||||
_mesh.material_override = mat
|
||||
|
||||
print("EarthImposter ready | real=", _real, " surface=", _surface, " mesh=", _mesh)
|
||||
set_process(true)
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
if _real == null or _mesh == null:
|
||||
return
|
||||
|
||||
var viewer: Node3D = FloatingOrigin.focus
|
||||
if viewer == null or not is_instance_valid(viewer):
|
||||
_mesh.visible = false
|
||||
return
|
||||
|
||||
var to_body: Vector3 = _real.global_position - viewer.global_position
|
||||
var dist: float = to_body.length()
|
||||
if dist < 1.0:
|
||||
_mesh.visible = false
|
||||
return
|
||||
|
||||
# Close approach only: real surface
|
||||
if dist < switch_distance:
|
||||
_mesh.visible = false
|
||||
if _surface:
|
||||
_surface.visible = true
|
||||
return
|
||||
|
||||
# Far (normal from Luna): impostor on
|
||||
# Leave EarthSurface visible until you confirm the disc — then you can hide it
|
||||
var dir: Vector3 = to_body / dist
|
||||
_mesh.global_position = viewer.global_position + dir * visual_distance
|
||||
|
||||
var visual_radius: float = real_radius * (visual_distance / dist)
|
||||
visual_radius = clampf(visual_radius, 8000.0, 150000.0)
|
||||
_mesh.scale = Vector3.ONE * (visual_radius / _base_radius)
|
||||
_mesh.visible = true
|
||||
|
||||
Reference in New Issue
Block a user