#!/usr/bin/env bash # Editor-Sync für die Objekt-Bibliothek (Fundament A6, 19.10.2026). # # Was das Script macht: # 1. Merge im Match-Server-Sibling prüfen (tools/merge_object_library.py --check) # 2. library/objects.json in die Editor-Kopie ziehen (Editor-`note` bleibt erhalten) # 3. Thumbnails neu rendern (tools/gen_thumbs.gd, 128 px PNG nach library/thumbs/) # 4. Objekt-Zahl der Bibliothek ausgeben # # Aufruf (aus dem Editor-Repo): # tools/sync_objects.sh # normal # tools/sync_objects.sh --keine-thumbs # nur Kopie + Prüfung (schnell) # SCOPEDVR_MATCH_SERVER_DIR=/pfad tools/sync_objects.sh # # Godot: $GODOT > $HOME/bin/godot4 > godot4 im PATH. Thumbs brauchen echtes # Rendering (Display oder xvfb-run) — auf Slys PC als slyphax starten: # runuser -u slyphax -- env HOME=/home/slyphax tools/sync_objects.sh set -u DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" EDITOR_JSON="$DIR/library/objects.json" THUMBS=1 [ "${1:-}" = "--keine-thumbs" ] && THUMBS=0 # --- Match-Server-Repo finden (Sibling wie in project.godot / glb_quellen) --- MS="${SCOPEDVR_MATCH_SERVER_DIR:-}" if [ -z "$MS" ]; then for k in "$DIR/../scopedvr-match-server" "$DIR/../../scopedvr-match-server"; do [ -f "$k/library/objects.json" ] && MS="$(cd "$k" && pwd)" && break done fi if [ -z "$MS" ] || [ ! -f "$MS/library/objects.json" ]; then echo "FEHLER: Match-Server-Repo nicht gefunden — SCOPEDVR_MATCH_SERVER_DIR setzen." exit 1 fi echo "Match-Server: $MS" # --- 1. Merge-Stand prüfen (Karten sollen nie eine ungemergte Registry ziehen) --- if [ -f "$MS/tools/merge_object_library.py" ]; then if ! python3 "$MS/tools/merge_object_library.py" --check; then echo "FEHLER: objects.json passt nicht zu den Fragmenten — erst im Match-Server mergen:" echo " python3 tools/merge_object_library.py" exit 1 fi fi # --- 2. Kopie ziehen, Editor-`note` schützen (wie objects_pipeline.gd::_registry_sync) --- python3 - "$MS/library/objects.json" "$EDITOR_JSON" <<'PY' import json, sys src, dst = sys.argv[1], sys.argv[2] neu = json.load(open(src, encoding="utf-8")) try: alt = json.load(open(dst, encoding="utf-8")) if isinstance(alt.get("note"), str) and alt["note"]: neu["note"] = alt["note"] except FileNotFoundError: pass with open(dst, "w", encoding="utf-8") as fh: json.dump(neu, fh, ensure_ascii=False, indent=2) fh.write("\n") print("kopiert: %s -> %s (%d Objekte)" % (src, dst, len(neu.get("objects", {})))) PY # --- 3. Thumbs rendern --- if [ "$THUMBS" = "1" ]; then GODOT_BIN="${GODOT:-}" [ -z "$GODOT_BIN" ] && [ -x "$HOME/bin/godot4" ] && GODOT_BIN="$HOME/bin/godot4" [ -z "$GODOT_BIN" ] && command -v godot4 >/dev/null 2>&1 && GODOT_BIN="godot4" [ -z "$GODOT_BIN" ] && command -v godot >/dev/null 2>&1 && GODOT_BIN="godot" if [ -z "$GODOT_BIN" ]; then echo "WARNUNG: kein Godot gefunden — Thumbs übersprungen (GODOT=/pfad setzen)." else # Import-Lauf ZUERST: ein frischer Klon hat keine global_script_class_cache — # ohne ihn stirbt gen_thumbs mit "Identifier SvmapIO/MeshShapes not declared". echo "Import-Lauf (Klassen-Cache): $GODOT_BIN --headless --path $DIR --import" GODOT_SILENCE_ROOT_WARNING=1 "$GODOT_BIN" --headless --path "$DIR" --import >/dev/null 2>&1 || true ARGS=(--rendering-driver opengl3 --path "$DIR" --script res://tools/gen_thumbs.gd) if [ -n "${DISPLAY:-}" ] || [ -n "${WAYLAND_DISPLAY:-}" ]; then echo "Thumbs: $GODOT_BIN ${ARGS[*]}" GODOT_SILENCE_ROOT_WARNING=1 "$GODOT_BIN" "${ARGS[@]}" || { echo "FEHLER: Thumb-Lauf fehlgeschlagen."; exit 1; } else echo "Thumbs: xvfb-run -a $GODOT_BIN ${ARGS[*]}" GODOT_SILENCE_ROOT_WARNING=1 xvfb-run -a "$GODOT_BIN" "${ARGS[@]}" || { echo "FEHLER: Thumb-Lauf fehlgeschlagen."; exit 1; } fi fi fi echo "FERTIG — Bibliothek im Editor: $(python3 -c "import json;print(len(json.load(open('$EDITOR_JSON'))['objects']))") Objekte, Thumbs: $(ls "$DIR/library/thumbs" 2>/dev/null | grep -c '\.png$') PNG"