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)