61 lines
2.1 KiB
GDScript
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://src/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)
|