#!/usr/bin/env bash # # Exportiert alle Blender-Welten unter assets/maps/ zu den .glb, die das # Spiel lädt. # # Für die Autorin: Leg deine .blend in den jeweiligen Map-Ordner # assets/maps//.blend # und führ danach dieses Skript aus: # ./tools/build-models.sh # Fertig — die .glb landen direkt daneben (assets/maps//.glb). # # Standardmäßig wird nur exportiert, was sich seit dem letzten Mal geändert # hat. Mit -f / --force wird alles neu gebaut. # # Tipp: in Blender „File -> External Data -> Pack Resources", dann sind die # Texturen in der .blend und der Export ist self-contained. set -euo pipefail # Repo-Wurzel relativ zum Skript bestimmen — egal, von wo aufgerufen. script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(cd "$script_dir/.." && pwd)" maps_dir="$root/assets/maps" force=0 case "${1:-}" in -f|--force) force=1 ;; "") ;; *) echo "Unbekannte Option: $1 (nur -f/--force)" >&2; exit 2 ;; esac # blender finden: $BLENDER -> PATH. Bundeln geht nicht (zu groß) — fehlt es, # ist das kein Fehler: die committeten .glb reichen zum Bauen und Spielen. if [ -n "${BLENDER:-}" ] && [ -x "$BLENDER" ]; then blender="$BLENDER" elif command -v blender >/dev/null 2>&1; then blender="$(command -v blender)" else echo " übersprungen blender nicht gefunden (\$BLENDER oder PATH) — .glb bleiben wie committet" >&2 exit 0 fi if [ ! -d "$maps_dir" ]; then echo "Kein Map-Ordner: $maps_dir" >&2 exit 1 fi # Der Export als Python-Einzeiler. filepath ohne Endung — export_format='GLB' # hängt .glb an. export_extras trägt collide/signal/role mit. gltf_expr=' import bpy, sys out = sys.argv[-1] bpy.ops.export_scene.gltf( filepath=out, export_format="GLB", export_extras=True, export_yup=True, export_apply=True, export_image_format="AUTO", )' built=0 skipped=0 failed=0 while IFS= read -r -d '' src; do out="${src%.blend}.glb" rel="${src#"$root"/}" # Inkrementell: überspringen, wenn .glb existiert und neuer ist. if [ "$force" -eq 0 ] && [ -f "$out" ] && [ "$out" -nt "$src" ]; then printf ' aktuell %s\n' "$rel" skipped=$((skipped + 1)) continue fi if log="$("$blender" -b --factory-startup "$src" \ --python-expr "$gltf_expr" -- "${out%.glb}" 2>&1)"; then printf ' gebaut %s\n' "$rel" built=$((built + 1)) else printf ' FEHLER %s\n' "$rel" printf '%s\n' "$log" | sed 's/^/ /' failed=$((failed + 1)) fi done < <(find "$maps_dir" -type f -name '*.blend' -print0 | sort -z) echo "—— $built gebaut, $skipped aktuell, $failed fehlgeschlagen ——" [ "$failed" -eq 0 ]