Models the two retail buildings beside the hero from their own photograph rather than the generic kit: bronze cornice, mural row, lettering band, stepped Deco parapet and rounded corner tower on 6800 Lee Drug; burgundy fascia, pilasters, white-framed windows and banded parapet on 6806-6820. Reference analysis written before any geometry (Art/blender/retail/ref-analysis.md), every unmeasured proportion carried into the part report as an assumption. 6822 Budget is deferred, not guessed: no photograph of it exists and the 6.0 x 5.5 m sliver cannot be read out of the neighbour shot. Pipeline fixes found on the way: - render_screenshots.sh called ./Engine/... for the capture step while every commandlet used the absolute path; set -e killed the script at 127 *after* the maps were rebuilt, so screenshots silently stayed a day old. - the facade kit applies to every Frontage_*/North_* actor, so it pasted its own language over the new modelled facades; it now skips them, and the trim stages as RetailTrim_*. - pure bay arithmetic moved to Tools/_common.py so it is unit-testable without Blender (4 new tests, 82 total pass). Known gaps recorded in Screenshots/README.md, not hidden: the parapet reads as a blank band, murals and lettering do not resolve at review distance, the tower is a plain cylinder, and the review camera crops the east end.
77 lines
3.2 KiB
Bash
Executable File
77 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Render the demo-map screenshots used for visual review into <repo>/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
|