scopedvr-map-editor/tests/probe_d4_mapbuilder.gd
2026-10-31 15:37:09 +01:00

82 lines
3.2 KiB
GDScript

extends SceneTree
## D4-Beweis (t_691b51ce): Map-Builder platziert 3 Military-Props auf dem Boden
## und zeigt ihre Kollisionsboxen (Drahtgitter aus registry `collision.size`).
##
## xvfb-run -a /opt/data/home/bin/godot4 --rendering-driver opengl3 --path . \
## --resolution 1600x900 -s res://tests/probe_d4_mapbuilder.gd
##
## Ausgabe: /tmp/d4_mapbuilder.png + Prüfzeilen (Modus == GLB, Fußpunkt y=0)
const MapDocument := preload("res://core/svmap/map_document.gd")
const PLATZ := [
{"id": "barrel_001", "pos": [-2.2, 0.0, 0.0], "rot_y_deg": 0.0},
{"id": "box_020", "pos": [0.6, 0.0, 0.6], "rot_y_deg": 25.0},
{"id": "training_item_005", "pos": [3.6, 0.0, -0.6], "rot_y_deg": 180.0},
]
func _initialize() -> void:
var manifest: Dictionary = JSON.parse_string(FileAccess.get_file_as_string("res://library/objects.json"))
var doc: Dictionary = MapDocument.create_new("D4-Beweis", 256.0, "mittag")
doc["objects"] = PLATZ
var bauer: Node3D = load("res://src/viewport/map_view_builder.gd").new()
root.add_child(bauer)
await process_frame
bauer.rebuild(doc, manifest)
var lib: Dictionary = manifest.get("objects", {})
var fehler: Array = []
for i in PLATZ.size():
var marker: Node3D = bauer.object_markers[i]
if marker == null:
fehler.append("%s: kein Marker" % PLATZ[i]["id"])
continue
var oid := str(PLATZ[i]["id"])
var entry: Dictionary = lib.get(oid, {})
if entry.is_empty():
fehler.append("%s: nicht in der Bibliothek" % oid)
continue
var col: Dictionary = entry.get("collision", {})
var groesse: Array = col.get("size", [0.0, 0.0, 0.0])
# Kollisionsbox als Drahtgitter (Fußpunkt: Unterkante y=0).
var box := MeshInstance3D.new()
var bm := BoxMesh.new()
bm.size = Vector3(float(groesse[0]), float(groesse[1]), float(groesse[2])) + Vector3(0.01, 0.01, 0.01)
box.mesh = bm
var mat := StandardMaterial3D.new()
mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
mat.albedo_color = Color(0.15, 1.0, 0.35, 0.28)
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
mat.cull_mode = BaseMaterial3D.CULL_DISABLED
mat.wireframe = true
box.material_override = mat
box.position = Vector3(0.0, float(groesse[1]) * 0.5, 0.0)
marker.add_child(box)
var echt := bool(marker.get_meta("glb"))
var mi := marker.get_child(0) as MeshInstance3D
var mesh_aabb := mi.mesh.get_aabb() if (mi != null and mi.mesh != null) else AABB()
print("%s: ehctesGLB=%s registry=%.3f/%.3f/%.3f mesh_aabb=%.3f/%.3f/%.3f mesh_min_y=%.3f"
% [oid, str(echt), float(groesse[0]), float(groesse[1]), float(groesse[2]),
mesh_aabb.size.x, mesh_aabb.size.y, mesh_aabb.size.z, mesh_aabb.position.y])
if not echt:
fehler.append("%s: rendert nur den Platzhalter (GLB fehlt)" % oid)
var cam := Camera3D.new()
cam.fov = 45.0
cam.position = Vector3(4.5, 3.2, 7.5)
root.add_child(cam)
await process_frame
cam.look_at(Vector3(0.6, 0.7, 0.0), Vector3.UP)
cam.current = true
cam.make_current()
await process_frame
await process_frame
await RenderingServer.frame_post_draw
root.get_texture().get_image().save_png("/tmp/d4_mapbuilder.png")
for f in fehler:
print(" FEHLER: %s" % f)
print("PROBE_D4_MAPBUILDER_%s" % ("FAIL" if not fehler.is_empty() else "OK"))
quit(1 if not fehler.is_empty() else 0)