82 lines
3.2 KiB
GDScript
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)
|