#!/usr/bin/env bash # Render the demo-map screenshots used for visual review into /Screenshots/demo/. # # Usage: Tools/render_screenshots.sh [--verify] # # Only the **demo map** is captured: the review staging map exists to hold the # hero/camera list, not to produce review screenshots. Everything here is what a # player actually sees when the demo runs. # # --verify run Tools/visual_loop.py --verify afterwards and fail if a shot # does not show the content its expectation describes # # The PNGs are committed (see Screenshots/README.md): a reviewer must see exactly # what the build rendered. set -euo pipefail REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" ENGINE="${UE_ENGINE_DIR:-/run/media/system/DATA/Engines/UE_5.8.4}" PROJ="$REPO/Game/GigLine/GigLine.uproject" VERIFY="no" [ "${1:-}" = "--verify" ] && VERIFY="yes" run_cmdlet() { local script="$1" label="$2" echo "== $label ==" ( cd "$ENGINE" && ./Engine/Binaries/Linux/UnrealEditor-Cmd "$PROJ" \ -run=pythonscript -script="$REPO/Tools/$script" \ -nullrhi -unattended -nopause -stdout ) } # Order matters. The demo builder rebuilds the site materials, so any actor staged # by another tool must be (re)staged after it or it keeps a reference to a material # that no longer exists - that is how 604 actors ended up untextured once. run_cmdlet ue_build_demo_map.py "1/5 rebuild the demo map (materials, site, frontage)" run_cmdlet ue_apply_facade_kit.py "2/5 assemble the facade kit" run_cmdlet ue_stage_theatre_trim.py "3/5 stage the theatre trim" run_cmdlet ue_audit_scene.py "4/6 audit the scene (materials, placement, labels)" run_cmdlet ue_build_review_map.py "5/6 stage the demo shot cameras" tail -3 /tmp/ue-review-map-result.txt 2>/dev/null || true echo "== 6/6 capture the demo map ==" # The engine path is absolute: this step runs from the repo, not from $ENGINE, and a # bare ./Engine/... failed with "No such file or directory" while every commandlet # above succeeded through run_cmdlet's cd. "$ENGINE/Engine/Binaries/Linux/UnrealEditor-Cmd" "$PROJ" /Game/Hollywood/DemoMap \ -game -windowed -ResX=1920 -ResY=1080 -nopause -nosplash -stdout echo "== collect the demo screenshots ==" mkdir -p "$REPO/Screenshots/demo" rm -f "$REPO"/Screenshots/demo/review-*.png found=0 for src in \ "$REPO/Game/GigLine/Saved/Screenshots"/*/review-*.png \ "$REPO/Game/GigLine/Saved/Screenshots"/*/*/review-*.png \ "$HOME/.config/Epic/GigLine/Saved/Screenshots"/*/review-*.png; do [ -e "$src" ] || continue case "$(basename "$src")" in *demo-*) cp -f "$src" "$REPO/Screenshots/demo/"; found=1 ;; esac done [ "$found" = "1" ] || { echo "ERROR: no demo screenshots found"; exit 1; } ls -1 "$REPO/Screenshots/demo" # The scene audit is a gate: a wrong-material or misplaced actor is exactly the # kind of failure that still renders plausibly. if grep -q "failure(s) ==" /tmp/gigline/scene-audit.txt 2>/dev/null; then grep -E "FAIL|failure\(s\)" /tmp/gigline/scene-audit.txt | tail -5 grep -q "== 0 failure(s) ==" /tmp/gigline/scene-audit.txt || { echo "ERROR: scene audit failed — see /tmp/gigline/scene-audit.txt"; exit 1; } fi if [ "$VERIFY" = "yes" ]; then echo "== verify: does each shot show what it should? ==" cd "$REPO" python3 Tools/visual_loop.py --verify fi