optimize_glb.sh 1.5 KB

1234567891011121314151617181920212223
  1. #!/usr/bin/env bash
  2. # Web-optimize a GenRecon scene.glb into a browser-loadable walkthrough asset:
  3. # weld → simplify (meshoptimizer) → resize + webp textures. NO draco/meshopt geometry
  4. # codec, so a plain three.js GLTFLoader loads it (no extra decoder in the viewer).
  5. # BEST-EFFORT: every step falls back to the previous file, so this NEVER fails a job;
  6. # worst case it copies the raw glb through. Uses a LOCAL gltf-transform install
  7. # (a split @gltf-transform/core between separate globals dies with null.getLogger).
  8. set -uo pipefail
  9. IN="$1"; OUT="$2"
  10. RATIO="${GENRECON_SIMPLIFY_RATIO:-0.12}"
  11. TEXSZ="${GENRECON_TEX_SIZE:-2048}"
  12. export NODE_OPTIONS="--max-old-space-size=${GENRECON_GLTF_HEAP_MB:-49152}"
  13. GT="/opt/genrecon/gltftool/node_modules/.bin/gltf-transform"
  14. [ -x "$GT" ] || GT="$(command -v gltf-transform || true)"
  15. if [ -z "${GT:-}" ] || [ ! -e "$GT" ]; then echo "web-optimize: no gltf-transform, copying raw"; cp -f "$IN" "$OUT"; echo "OPTIMIZE_SKIPPED"; exit 0; fi
  16. T=$(mktemp -d); cp -f "$IN" "$T/cur.glb"
  17. try(){ local label="$1"; shift; if "$GT" "$@" 2>&1 | tail -1; then mv -f "$T/next.glb" "$T/cur.glb" 2>/dev/null && echo " $label ok"; else echo " $label skipped"; fi; }
  18. try weld weld "$T/cur.glb" "$T/next.glb"
  19. try simplify simplify "$T/cur.glb" "$T/next.glb" --ratio "$RATIO" --error 0.002
  20. try resize resize "$T/cur.glb" "$T/next.glb" --width "$TEXSZ" --height "$TEXSZ"
  21. try webp webp "$T/cur.glb" "$T/next.glb" --quality 82
  22. cp -f "$T/cur.glb" "$OUT"; rm -rf "$T"
  23. echo "OPTIMIZE_DONE $(du -h "$OUT" | cut -f1)"