feat(hero): fluting and a recessed motto band; placement gets one source of truth
Hero detail: - Fluting: 20 grooves per column as thin shadow-tone cylinders set into the shaft (120 pieces) rather than boolean cuts - readable in silhouette and grazing light at a fraction of the cost. - Motto band: real recess with a moulded surround 6 cm proud and the panel 12 cm behind, replacing the 8 cm dark stripe. Hero 148 parts/3044 tris -> 271/5492, still 14.50 m. Placement bug this exposed (a real one, invisible in a render): - ue_hero_facade_import.py carried its own hero position (-12024.5, -1450) from before the 0.1.0 frontage fix, so running the importer alone moved the hero 13 m east and onto the north side of the boulevard. Only symptom: the reference score fell 0.69 -> 0.56 and the 3x3 composition correlation flipped +0.54 -> -0.08. - New Tools/ue_placement.py is the single source of truth (hero position, verified frontage spans, span validators). Both the importer and the demo builder use it; the import asserts the staged span and logs PLACEMENT ERROR otherwise. - 11 new tests, including one that fails if the stale literal returns. 78 total. Spawn-view score recovered to 0.72 (best yet); screenshots verified 4/4, packaged QA all PASS.
This commit is contained in:
1 parent
bc5da3a8ab
commit
92b477d340
17 files changed
+255
-25
No files matched your search
@@ -19,14 +19,19 @@ import unreal
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import ue_common # noqa: E402
|
||||
import ue_placement # noqa: E402
|
||||
|
||||
FBX = "/tmp/gigline/hero-facade.fbx"
|
||||
DEST = "/Game/Hollywood/ElCapitan"
|
||||
ACTOR_LABEL = "Hero_Facade"
|
||||
ACTOR_LABEL = ue_placement.HERO_ACTOR
|
||||
LEVEL = "/Game/Hollywood/DemoMap"
|
||||
|
||||
# Unreal centimetres: south-east corner of the façade, on the building line.
|
||||
PLACEMENT_CM = (-12024.5, -1450.0, 0.0)
|
||||
# Placement lives in Tools/ue_placement.py. It used to be a literal here, and it
|
||||
# drifted from ue_build_demo_map.py: this file kept the pre-0.1.0 position
|
||||
# (-12024.5, -1450) while the builder staged (-13336, 1307), so running the importer
|
||||
# on its own moved the hero 13 m east and onto the north side of the boulevard.
|
||||
PLACEMENT_CM = ue_placement.HERO_LOCATION_CM
|
||||
|
||||
RESULT = "/tmp/gigline/hero-facade-import.txt"
|
||||
lines = []
|
||||
@@ -118,6 +123,17 @@ def measure_and_place():
|
||||
comp.set_static_mesh(asset)
|
||||
comp.set_mobility(unreal.ComponentMobility.STATIC)
|
||||
log(f"placed {ACTOR_LABEL} at {PLACEMENT_CM} (cm) on {LEVEL}")
|
||||
|
||||
# Prove it landed on its verified footprint, not merely that it spawned.
|
||||
box = asset.get_bounding_box() if asset else None
|
||||
if box:
|
||||
lo = box.min.x + PLACEMENT_CM[0]
|
||||
hi = box.max.x + PLACEMENT_CM[0]
|
||||
problem = ue_placement.describe_span_failure("hero", lo, hi)
|
||||
if problem:
|
||||
log(f"PLACEMENT ERROR: {problem}")
|
||||
else:
|
||||
log(f"span ok: X {lo:.0f}..{hi:.0f}")
|
||||
_make_map_writable(LEVEL)
|
||||
saved = unreal.EditorLoadingAndSavingUtils.save_map(
|
||||
unreal.EditorLevelLibrary.get_editor_world(), LEVEL)
|
||||
|
||||
Reference in new issue
Block a user