scopedvr-map-editor/tools/sync_objects.sh
2026-11-01 19:34:05 +01:00

87 lines
4 KiB
Bash
Executable file

#!/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 core/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/core/thumbs" 2>/dev/null | grep -c '\.png$') PNG"