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
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
f51f4e83fd
commit
331caf417a
@@ -27,3 +27,29 @@ Das Skript sucht den Ink-Compiler in dieser Reihenfolge:
|
||||
1. `$INKLECATE` (Pfad zum Binary)
|
||||
2. `tools/inklecate` (mitgeliefert)
|
||||
3. `inklecate` im `PATH`
|
||||
|
||||
## build-models.sh
|
||||
|
||||
Exportiert die Blender-Welten zu den `.glb`, die das Spiel lädt.
|
||||
|
||||
```sh
|
||||
./tools/build-models.sh # nur Geändertes neu bauen
|
||||
./tools/build-models.sh -f # alles neu bauen
|
||||
```
|
||||
|
||||
Workflow für die Autorin: `.blend` in den jeweiligen Map-Ordner legen —
|
||||
`assets/maps/<map>/<name>.blend` — Skript laufen lassen, fertig. Die
|
||||
`.glb` landen direkt daneben (`assets/maps/<map>/<name>.glb`) und werden
|
||||
mit ins Repo eingecheckt, damit ein frischer Clone ohne Blender spielbar
|
||||
ist. Ein `.glb` ohne `.blend` daneben (z.B. `props/testscene.glb`) bleibt
|
||||
unangetastet.
|
||||
|
||||
**Automatisch beim Build:** `cargo build`/`cargo run` ruft dieses Skript
|
||||
über `build.rs` selbst auf, sobald sich eine `.blend` geändert hat.
|
||||
|
||||
Blender wird über `$BLENDER` oder den `PATH` gefunden. Fehlt es, wird der
|
||||
Schritt übersprungen (kein Fehler — die committeten `.glb` reichen).
|
||||
Bundeln geht nicht, dafür ist Blender zu groß.
|
||||
|
||||
Tipp: in Blender „File → External Data → Pack Resources", dann liegen die
|
||||
Texturen in der `.blend` und der Export ist self-contained.
|
||||
|
||||
Executable
+86
@@ -0,0 +1,86 @@
|
||||
#!/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 ]
|
||||
Reference in New Issue
Block a user