Files
wds/tools/build-models.sh
T
irrlichtandClaude Sonnet 5 331caf417a Blender-Welten aus der .blend im Map-Ordner bauen
Analog zur Ink-Pipeline: eine .blend neben ihrer .glb im Map-Ordner
(assets/maps/<map>/<name>.blend) wird von tools/build-models.sh headless
zu <name>.glb exportiert, inkrementell per mtime. build.rs stößt das beim
cargo-Build an, sobald sich eine .blend geändert hat.

- Export: blender -b --factory-startup ... export_scene.gltf mit
  export_extras (collide/signal/role), export_apply, yup, image AUTO.
- Blender über $BLENDER oder PATH; fehlt es, wird der Schritt still
  übersprungen — die committeten .glb reichen zum Bauen/Spielen.
- Ein Export-Fehler bei vorhandenem Blender ist fatal (wie bei Ink).
- build.rs teilt sich jetzt run_script/watch-Helfer für beide Pipelines.
- Cinemaroom.blend -> assets/maps/cinema/cinema.blend verschoben und die
  .glb einmal daraus gebaut.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0196AM4UyAJEXVtPvp5DdKr8
2026-09-02 00:53:29 +02:00

87 lines
2.7 KiB
Bash
Executable File

#!/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/<map>/<name>.blend
# und führ danach dieses Skript aus:
# ./tools/build-models.sh
# Fertig — die .glb landen direkt daneben (assets/maps/<map>/<name>.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 ]