scopedvr-map-editor/tests/probe_physik_subviewport.gd
2026-11-01 19:34:05 +01:00

61 lines
2.1 KiB
GDScript

extends SceneTree
## Wegwerf-Probe (Karte t_1da96275): tickt echte Physik (CharacterBody3D +
## StaticBody-Trimesh) in einem SubViewport mit own_world_3d — so lebt der
## Playtest im Editor. Exit 0 = ja.
func _initialize() -> void:
_run.call_deferred()
func _run() -> void:
var vp := SubViewport.new()
vp.own_world_3d = true
root.add_child(vp)
var welt := Node3D.new()
vp.add_child(welt)
# Boden: Box als StaticBody (Oberkante y=0)
var boden := StaticBody3D.new()
var cs := CollisionShape3D.new()
var box := BoxShape3D.new()
box.size = Vector3(40, 0.2, 40)
cs.shape = box
boden.add_child(cs)
boden.position = Vector3(0, -0.1, 0)
welt.add_child(boden)
# Wand zum Blocken
var wand := StaticBody3D.new()
var cs2 := CollisionShape3D.new()
var box2 := BoxShape3D.new()
box2.size = Vector3(2, 3, 0.6)
cs2.shape = box2
wand.add_child(cs2)
wand.position = Vector3(0, 1.5, -5)
welt.add_child(wand)
# PlaytestBody via Autopilot
var body: CharacterBody3D = load("res://core/editor/playtest/playtest_body.gd").new()
welt.add_child(body)
body.auto_move_dir = Vector3(0, 0, -1)
body.global_position = Vector3(0, 1.2, 5)
for i in 40:
await physics_frame
print("PROBE nach Fall: feet=%.3f on_floor=%s" % [body.fuss_hoehe(), str(body.is_on_floor())])
var ok_fall: bool = body.is_on_floor() and absf(body.fuss_hoehe()) < 0.05
for i in 240:
await physics_frame
if body.global_position.z < -4.2:
break
body.auto_move_dir = Vector3.ZERO
var z: float = body.global_position.z
print("PROBE vor Wand gestoppt: z=%.3f (Wand-Fläche bei -4.7)" % z)
var ok_block: bool = z > -4.6
# RayQuery gegen den Space des SubViewports
var raum := body.get_world_3d().direct_space_state
var hit := raum.intersect_ray(PhysicsRayQueryParameters3D.create(
Vector3(0, 2, -10), Vector3(0, 0, -10)))
print("PROBE ray hit Wand: %s" % str(not hit.is_empty()))
var ok_ray: bool = not hit.is_empty()
if ok_fall and ok_block and ok_ray:
print("PROBE OK: Physik im SubViewport tickt (Fall+Block+Ray)")
quit(0)
else:
print("PROBE FAIL: fall=%s block=%s ray=%s" % [str(ok_fall), str(ok_block), str(ok_ray)])
quit(1)