fix: camera tracks player elevation; snap all world objects to terrain
Camera: desired_focus_position.y now directly tracks the player's global Y. The existing smooth lerp on focus_position handles interpolation, so the camera follows the player up hills and down slopes without losing vertical sight. Previously only horizontally-deadzoned XZ was tracked. jajce_world.gd: expanded terrain-snapping coverage to include all nodes under WorldObjects (ResourceNodes, StorageSites, ActivitySites) and the FortressBlockout's children. Added a type guard so non-Node3D children are safely skipped. This prevents houses, activity props, storage crates, and resource nodes from floating above or sinking below the sculpted terrain surface.
This commit is contained in:
@@ -78,6 +78,8 @@ func _physics_process(delta: float) -> void:
|
|||||||
cam_forward * (diff_forward - sign(diff_forward) * deadzone_forward)
|
cam_forward * (diff_forward - sign(diff_forward) * deadzone_forward)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
desired_focus_position.y = target_pos.y
|
||||||
|
|
||||||
focus_position = focus_position.lerp(desired_focus_position, focus_t)
|
focus_position = focus_position.lerp(desired_focus_position, focus_t)
|
||||||
|
|
||||||
zoom_smooth = lerpf(zoom_smooth, zoom, follow_t)
|
zoom_smooth = lerpf(zoom_smooth, zoom, follow_t)
|
||||||
|
|||||||
@@ -11,14 +11,25 @@ func _initialize_world_presentation() -> void:
|
|||||||
var active_camera := get_viewport().get_camera_3d()
|
var active_camera := get_viewport().get_camera_3d()
|
||||||
if active_camera != null:
|
if active_camera != null:
|
||||||
terrain.set_camera(active_camera)
|
terrain.set_camera(active_camera)
|
||||||
|
|
||||||
var groups_to_snap: Array[Node] = []
|
var groups_to_snap: Array[Node] = []
|
||||||
groups_to_snap.append_array($FoliageRoot.get_children())
|
groups_to_snap.append_array($FoliageRoot.get_children())
|
||||||
if has_node("FortressBlockout"):
|
if has_node("FortressBlockout"):
|
||||||
groups_to_snap.append($FortressBlockout)
|
groups_to_snap.append($FortressBlockout)
|
||||||
|
groups_to_snap.append_array($FortressBlockout.get_children())
|
||||||
for child in $VillageRoot.get_children():
|
for child in $VillageRoot.get_children():
|
||||||
groups_to_snap.append(child)
|
groups_to_snap.append(child)
|
||||||
|
if has_node("WorldObjects"):
|
||||||
|
var wo := $WorldObjects
|
||||||
|
for group_name in ["ResourceNodes", "StorageSites", "ActivitySites"]:
|
||||||
|
if wo.has_node(group_name):
|
||||||
|
groups_to_snap.append_array(wo.get_node(group_name).get_children())
|
||||||
|
|
||||||
for item in groups_to_snap:
|
for item in groups_to_snap:
|
||||||
var pos: Vector3 = item.global_position
|
if not item is Node3D:
|
||||||
|
continue
|
||||||
|
var node3d := item as Node3D
|
||||||
|
var pos := node3d.global_position
|
||||||
var h: float = terrain.data.get_height(pos)
|
var h: float = terrain.data.get_height(pos)
|
||||||
if not is_nan(h):
|
if not is_nan(h):
|
||||||
item.global_position.y = h
|
node3d.global_position.y = h
|
||||||
|
|||||||
Reference in New Issue
Block a user