scopedvr-map-editor/tools/gen_bauteile.gd
slyphax a76c3ecae7 Bauen-Modus neu: Bauteile als normale Objekte (bau_*), Snap an Kante/Zelle/Ebene, Gebäude = Gruppe
- BauKatalog: 12 Teile (Fundament, Boden, Wände mit Tür/Fenster/Scharte, Brüstung, Pfeiler, Giebel, Dächer, Treppe) auf Basis der CC0-Geometrie des Modular Builder 0.2.0, Wandhöhe 3 m
- BuildSnap: Wände auf Zellkanten, Böden in Zellmitte, Höhe aus Ebenen statt Klickhöhe, Ersetzen (Tür in Wand)
- Gebäude kopieren/auswählen/löschen im Bauen-Tab, Kopien bekommen eigene Gruppe
- Kollision serverkonsistent über Trimesh-Dateien (Türen/Fenster echte Löcher), tools/gen_bauteile.gd erzeugt GLB, Kollision, Registry-Fragment
- Alte gebaeude-Sektion wird beim Laden migriert, altes Bauen-Werkzeug entfernt, Resize behält Gruppennamen
- Tests: test_bauen (258 Checks), Playtest läuft Treppe/Tür

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 16:30:15 +01:00

54 lines
2.2 KiB
GDScript

extends SceneTree
## Erzeugt die Bauteil-Dateien des Bauen-Modus aus src/editor/bau_katalog.gd:
## GLB (Client) · Trimesh-JSON (Server/Client/Editor) · Registry-Fragment (Server)
##
## Aufruf aus dem Editor-Repo (Pfade = Repo-Wurzeln der Geschwister-Klone):
## godot --headless --path . --script res://tools/gen_bauteile.gd -- \
## --client ../scopedvr-client --server ../scopedvr-match-server
## Danach im Match-Server: python3 tools/merge_object_library.py, und die
## erzeugte library/objects.json in Client + Editor kopieren (tools/sync_objects.sh).
## Idempotent: dieselbe Katalog-Version erzeugt byte-gleiche Dateien.
func _init() -> void:
var args := OS.get_cmdline_user_args()
var client := _arg(args, "--client")
var server := _arg(args, "--server")
if client.is_empty() or server.is_empty():
print("FEHLER: --client <Pfad> und --server <Pfad> angeben.")
quit(2)
return
var glb_dir := client.path_join("assets/objekte/military_desert/%s" % BauKatalog.KATEGORIE)
DirAccess.make_dir_recursive_absolute(glb_dir)
var kol_dirs := [
server.path_join("library/kollisions"),
client.path_join("library/kollisions"),
ProjectSettings.globalize_path("res://library/kollisions"),
]
for d in kol_dirs:
DirAccess.make_dir_recursive_absolute(d)
var fragment := {"objects": {}}
for oid in BauKatalog.oids():
var err := BauKatalog.glb_schreiben(oid, glb_dir.path_join(oid + ".glb"))
if err != OK:
print("FEHLER GLB %s: %d" % [oid, err])
quit(1)
return
var json := JSON.stringify(BauKatalog.kollisions_json(oid))
for d in kol_dirs:
var f := FileAccess.open((d as String).path_join(oid + ".json"), FileAccess.WRITE)
f.store_string(json)
f.close()
fragment["objects"][oid] = BauKatalog.registry_eintrag(oid)
print("%s: %d Dreiecke" % [oid, BauKatalog.dreiecke(oid)])
var frag_dir := server.path_join("library/objects.d")
DirAccess.make_dir_recursive_absolute(frag_dir)
var ff := FileAccess.open(frag_dir.path_join("bauteile.json"), FileAccess.WRITE)
ff.store_string(JSON.stringify(fragment, " ", false) + "\n")
ff.close()
print("Fertig: %d Bauteile." % BauKatalog.oids().size())
quit(0)
func _arg(args: PackedStringArray, key: String) -> String:
var i := args.find(key)
return args[i + 1] if i >= 0 and i + 1 < args.size() else ""