feat(hero): stepped medallion relief, seated on the parapet face

The medallions were not just flat - they were buried. seat_on_front put
Hero_Medallion at offset 0.08 (front Y -0.42) while the 1.2 m-deep parapet stands
at Y -0.15, so both discs sat inside the parapet and never rendered. The motto
band and surround have the same burial (offset 0.06) and are a separate follow-up.

- Three stepped layers per medallion with per-layer prefixes so seat_on_front gives
  each its own stand-off: Rim (0.55 m, dark, offset 0.36 -> Y -0.14), Field
  (0.38 m, light, offset 0.43 -> Y -0.07), Boss (0.15 m, dark, offset 0.50 -> Y 0.00).
  A single Hero_Medallion prefix would both flatten the relief and (via startswith)
  swallow the specific prefixes, so it is removed.
- Moved from +/-6.2 (inside the inscription text, which spans +/-6.87) to +/-9.8.
- Fixed Tools/review/hero_iterate.sh, which still had the pre-tools-move
  'cd dirname/..' and landed in Tools/ instead of the repo root.

Rendered and judged; the advisory two-model judge (no, 0.93) no longer flags the
medallions. Owner review pending.
This commit is contained in:
zwitschi committed 2026-11-10 15:04:48 +01:00
1 parent 1d57ed477d
commit 33f8139cb2
24 files changed
+54 -34

No files matched your search

+18 -8
View File
@@ -272,13 +272,22 @@ def build():
"photographs: motto panel above the colonnade, now an inset panel with a "
"moulded surround rather than a flat stripe")
# Medallions either side of the inscription: discs on the parapet face, not
# pancakes on the coping (see disc_on_wall).
for i, x in enumerate((-6.2, 6.2), start=1):
disc_on_wall(f"Hero_Medallion_{i}", x, -1.30, HEIGHT - PARAPET_H / 2.0,
0.55, 0.04, stone_dark, vertices=20)
note("Hero_Medallion_x2", (1.1, 0.04, 1.1),
"photographs: two stone discs beside the motto, mounted on the parapet face")
# Medallions either side of the inscription: stepped round reliefs (dark rim, raised
# light field, dark central boss) so they read as round medallions at 45 m instead of
# flat, empty discs. Each layer has its own prefix so `seat_on_front` gives it its own
# stand-off; one shared prefix would seat every disc at the same offset and flatten the
# relief. They sit OUTSIDE the inscription text (which spans ~±6.9 m) on the parapet
# face, which is 0.35 m proud of FRONT_Y - at the old 0.08 offset they were buried
# inside the 1.2 m-deep parapet and never rendered.
for i, x in enumerate((-9.8, 9.8), start=1):
disc_on_wall(f"Hero_MedallionRim_{i}", x, -1.30, HEIGHT - PARAPET_H / 2.0,
0.55, 0.10, stone_dark, vertices=28)
disc_on_wall(f"Hero_MedallionField_{i}", x, -1.30, HEIGHT - PARAPET_H / 2.0,
0.38, 0.16, stone, vertices=28)
disc_on_wall(f"Hero_MedallionBoss_{i}", x, -1.30, HEIGHT - PARAPET_H / 2.0,
0.15, 0.20, stone_dark, vertices=20)
note("Hero_Medallion_x2", (1.1, 0.20, 1.1),
"photographs: two round reliefs beside the motto - dark rim, raised light field, dark boss")
# --- entrances ---------------------------------------------------------
# Three portals between column pairs, each with its own short flight. The
@@ -403,7 +412,8 @@ def build():
seat_on_front((
("Hero_Architrave", 0.05), ("Hero_Cornice", 0.05), ("Hero_Dentil", 0.05),
("Hero_Entablature", 0.03), ("Hero_MottoBand", 0.06), ("Hero_MottoSurround", 0.06),
("Hero_Medallion", 0.08), ("Hero_Banner", 0.08), ("Hero_Window", 0.03),
("Hero_MedallionRim", 0.36), ("Hero_MedallionField", 0.43), ("Hero_MedallionBoss", 0.50),
("Hero_Banner", 0.08), ("Hero_Window", 0.03),
("Hero_Portal", 0.05), ("Hero_PortalJamb", 0.08), ("Hero_PortalLintel", 0.08),
("Hero_PortalMullion", 0.04), ("Hero_PortalSign", 0.10),
# The parapet is 1.2 m deep and stands in front of the wall plane, so the inscription has to sit on
+1 -1
View File
@@ -10,7 +10,7 @@
# order is load-bearing. The Blender save happens BEFORE the FBX export, so a read-only .blend makes
# the build look successful while the old FBX is reused silently - hence the chmod at the top.
set -uo pipefail
cd "$(dirname "$0")/.." || exit 1
cd "$(dirname "$0")/../.." || exit 1
ENGINE="${ENGINE:-/run/media/system/DATA/Engines/UE_5.8.4}"
BLENDER_FILES="${BLENDER_FILES:-/var/lib/flatpak/app/org.blender.Blender/x86_64/stable/active/files}"