diff --git a/Game/GigLine/Content/Hollywood/DemoMap.umap b/Game/GigLine/Content/Hollywood/DemoMap.umap index f5cf00b..125570e 100644 --- a/Game/GigLine/Content/Hollywood/DemoMap.umap +++ b/Game/GigLine/Content/Hollywood/DemoMap.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:02c0472158a947e60eda4375729a5dcb7b5e90441dbe6659cc3816be00fe2726 -size 45507 +oid sha256:4c4090fdb335a9a2b3fe7a893e47fee03d76d166b0575fdf3f37221704f70ba9 +size 55060 diff --git a/Game/GigLine/Content/Hollywood/Frontage/SM_Budget_6822.uasset b/Game/GigLine/Content/Hollywood/Frontage/SM_Budget_6822.uasset new file mode 100644 index 0000000..9661c46 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Frontage/SM_Budget_6822.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1bb6098774accc3e36af4181af7ec06d410eb37be9364a41d4e97d9d5a83ff84 +size 78275 diff --git a/Game/GigLine/Content/Hollywood/Frontage/SM_ElCapitanTheatre.uasset b/Game/GigLine/Content/Hollywood/Frontage/SM_ElCapitanTheatre.uasset new file mode 100644 index 0000000..0c38133 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Frontage/SM_ElCapitanTheatre.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67a085ec074462ed795dfe72de148920fe38964e1306d3ad11b6e7750b16b979 +size 79379 diff --git a/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6806.uasset b/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6806.uasset new file mode 100644 index 0000000..f22cfdf --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6806.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db77df53b738d2b6baa8b599264ccbae54eff2325c4571d1ca3cf5b825bd37cc +size 79009 diff --git a/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6902.uasset b/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6902.uasset new file mode 100644 index 0000000..7191936 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6902.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3260ec732add81c7204779c970782d183d187c4bf57ae6b8c4e9d98d1ea895bc +size 78338 diff --git a/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6922.uasset b/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6922.uasset new file mode 100644 index 0000000..b947d66 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Frontage/SM_Hollywood_6922.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40a625b37f9d70cb1f0810664536c3aa6ea70cb75feb036e5e983b3b7ccf0d40 +size 78904 diff --git a/Game/GigLine/Content/Hollywood/Frontage/SM_LeeDrug_6800.uasset b/Game/GigLine/Content/Hollywood/Frontage/SM_LeeDrug_6800.uasset new file mode 100644 index 0000000..b2a6acc --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Frontage/SM_LeeDrug_6800.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fa537e3f28b642345d376b4049e43e9aaa6b1bff88adc7ce9557e51295b9338 +size 78097 diff --git a/Game/GigLine/Content/Hollywood/Frontage/roof.uasset b/Game/GigLine/Content/Hollywood/Frontage/roof.uasset new file mode 100644 index 0000000..0d09ea0 --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Frontage/roof.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92a1385f09610af4d800482533ccfa5b9e7a6f6a6f120d75e583a62529e7be13 +size 56504 diff --git a/Game/GigLine/Content/Hollywood/Frontage/wall.uasset b/Game/GigLine/Content/Hollywood/Frontage/wall.uasset new file mode 100644 index 0000000..d9f281b --- /dev/null +++ b/Game/GigLine/Content/Hollywood/Frontage/wall.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c29cc8f69eb7443e8753f0ecc6893695674121c0a8985509b3dc69d4019a8d4 +size 56504 diff --git a/Game/GigLine/Content/Hollywood/North/SM_Madame_Tussauds.uasset b/Game/GigLine/Content/Hollywood/North/SM_Madame_Tussauds.uasset index 2e3a0cd..dfc957a 100644 --- a/Game/GigLine/Content/Hollywood/North/SM_Madame_Tussauds.uasset +++ b/Game/GigLine/Content/Hollywood/North/SM_Madame_Tussauds.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:868500cd65335a232f1705bd816d73a1d19a4887cc81f0b8664be83dee623d0d -size 79991 +oid sha256:9e62e32b685cecfc0d5a9071e4fc1a2fa634768f5f68be73eb8b52b3011960a0 +size 79860 diff --git a/Game/GigLine/Content/Hollywood/North/SM_TCL_Chinese_Theatre.uasset b/Game/GigLine/Content/Hollywood/North/SM_TCL_Chinese_Theatre.uasset index 0d91800..823a712 100644 --- a/Game/GigLine/Content/Hollywood/North/SM_TCL_Chinese_Theatre.uasset +++ b/Game/GigLine/Content/Hollywood/North/SM_TCL_Chinese_Theatre.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:383ca11bb66d07b0cb6375dd0cfaab876a1e992d7b37777b877b7593bd660b44 -size 80424 +oid sha256:b2ee1d5bd60aa0368f9ec110efdd4618c8b0ac924bbd06af34e31ce5d302ef17 +size 80261 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset b/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset index 71d83e2..1cd0afe 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d3ce9d98468f5bb8dcfc530ad2d1567790c0e446fdf46c272a9fd6da09e9e808 +oid sha256:8a80b14b851004748983d1409c12d2f505600078134113cab2f53f48f5b48339 size 7876 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset b/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset index a0603b3..955f0ab 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f5f7213ec007a363d456ffb1376305a510e1113d95427f77633098700ca64a7b +oid sha256:f62893f52fdde9f16c7716d3eedfce3e90dad531c0679a014ce3f99895d3f9d5 size 7881 diff --git a/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset b/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset index dd97e69..9a12b00 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4255a288970bcec6521a2ca3a2c718e240295336fda55f4fb6144ffc517fa27c +oid sha256:cb8aabbf86e9649f2d57bd8687d49f7c871e2853037eae325bdcb9c52512abd6 size 7896 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset b/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset index 9a86660..d68fc4d 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6111173ab3a2a530cd42edc931d0e4d6f539527403b9cca016c064629a47184b +oid sha256:adea68105cb7a3987e64a342d5a0aefe7dcd025c5aded71cdad6e535ad919f2d size 7871 diff --git a/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset b/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset index 874df3b..1a1eff9 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fc5c41a2c161635471d1dc74de3cedbe6fd11b4eaffbe6e397734e640831013a +oid sha256:0bf845145364d552eac6aee056cdb3c5c522661c662c5bc27a9d46982cba7fc8 size 7901 diff --git a/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset b/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset index 8ded297..703aa07 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0209f2cef5ce37668e642f9d937242878381326b6d1d437167dea3f601aa3a02 +oid sha256:08984db88f47a5760d87fc46e60581ec5917a994443f7e9be3dedd97aa1c3c58 size 7886 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset b/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset index 4b309bf..cb5efd9 100644 --- a/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset +++ b/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8bf3cbcc33ccc1d5fc1e72c1c31d2bc32077bf6f00002963ad99b12486e98ebf +oid sha256:ec26dc022aa25a6c39a904f16a56de9c54b9b13b81f50489db23353f7725986a size 7871 diff --git a/Game/GigLine/Content/Test/ReviewMap.umap b/Game/GigLine/Content/Test/ReviewMap.umap index 6e70625..479119f 100644 --- a/Game/GigLine/Content/Test/ReviewMap.umap +++ b/Game/GigLine/Content/Test/ReviewMap.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4c46349a4d52e479d9580b1d1a45ff8bec3afc8ada802908a0f2387cbf887c84 +oid sha256:f2213b57c70a6b5779389e9ba8e5397a13fdd8dff9e3de1635504abd9eff3a43 size 28715 diff --git a/MEMORY.md b/MEMORY.md index 4536527..61c7a65 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -191,3 +191,11 @@ Scope: facts and traps that cost time to establish. Planned work lives in [TODO. - **A fresh git worktree has no compiled game binaries.** `Binaries/` is gitignored, so `UnrealEditor-Cmd` on a new worktree exits "abnormally (error code: 1)" before running the Python script, with no Python error in the log. Run `Engine/Build/BatchFiles/Linux/Build.sh GigLineEditor Linux Development -project=/Game/GigLine/GigLine.uproject` first. - `/tmp/gigline/*.txt` result files are **shared across worktrees**. Reading `/tmp/gigline/demo-map.txt` after a run can show another worktree's stale output — check the file mtime, or use a per-worktree result path. - **Flat Constant3Vector materials read as plastic.** Giving each surface a roughness plus a world-space-noise blend between two shades (WorldPosition → Multiply → Noise → Lerp between two Constant3Vectors → BaseColor) is enough to stop the blockout looking like a toy; no textures required. + +## 2026-11-07 — The Y-side bug (found when the frontage was added) + +- **UE convention in this project: south = +Y, north = −Y.** Ground truth is the street mesh: `Sidewalk_North` is Y −1912..−1053 and `Sidewalk_South` Y +718..+1447. +- The hero facade had been placed at **Y −1450 (north side)** and X −12024..−9420 — 26 m east of the 6840 footprint and on the wrong side of the street. It only looked right because it stood alone in an empty field; the approved screenshots were of a building with no context. +- The two north-side buildings (TCL, Tussaud's) were similarly on the **south** side: `export_north_buildings.py` mirrored Y, which put them where the frontage belongs. +- Fix: hero at X −13336 / Y +1307 (the frontage gap between 6902 and 6838); frontage and north buildings exported **without** a Y mirror (the FBX preset already maps Blender −Y south to UE +Y south). +- Lesson: **place a building only against a neighbour or the street mesh, never in isolation.** A single object in an empty map hides any number of placement errors; adding the adjacent frontage immediately exposed this one. diff --git a/Screenshots/README.md b/Screenshots/README.md index 6006d1e..e164d33 100644 --- a/Screenshots/README.md +++ b/Screenshots/README.md @@ -23,8 +23,8 @@ and exits — about a minute. The camera list lives in ## Shot list -All shots ☑ approved 2026-11-07, including the material look pass that changed -every demo surface. +All shots ☑ approved 2026-11-07, including the block frontage pass that added +the neighbouring buildings and corrected the hero and north-building placement. | # | File | Preview | Map | View | What it shows | | --- | --- | --- | --- | --- | --- | @@ -38,10 +38,10 @@ every demo surface. | 8 | `review-hero-portals.png` | [hero portals](review-hero-portals.png) | Review | 8 m, eye height | Three genuine 1.2 m portal recesses with flights and plinth | | 9 | `review-hero-facade-front.png` | [hero facade front](review-hero-facade-front.png) | Review | road side, straight-on | Hero façade elevation and column rhythm | | 10 | `review-hero-facade-oblique.png` | [hero facade oblique](review-hero-facade-oblique.png) | Review | north-west | Body depth and column line standing proud of the mass | -| 11 | `demo/review-demo-spawn-view.png` | [spawn view](demo/review-demo-spawn-view.png) | Demo | spawn point | Spawn view from the north sidewalk: the hero façade across the road under fixed daytime light | -| 12 | `demo/review-demo-street-level.png` | [street level](demo/review-demo-street-level.png) | Demo | eye height, north side | The façade colonnade and columns, sunlit with cast shadows | -| 13 | `demo/review-demo-crossing.png` | [crossing](demo/review-demo-crossing.png) | Demo | along the crosswalk | The designated mid-block crossing at s=130 m (UE X -14956): three continental zebra bars on the asphalt, kerbs flushed to ramps | -| 14 | `demo/review-demo-north-buildings.png` | [north buildings](demo/review-demo-north-buildings.png) | Demo | across the Blvd | North-side background buildings (TCL, Tussaud's), lit against the sky | +| 11 | `demo/review-demo-spawn-view.png` | [spawn view](demo/review-demo-spawn-view.png) | Demo | north sidewalk | The whole block: hero façade between its neighbours, both sidewalks and the road | +| 12 | `demo/review-demo-street-level.png` | [street level](demo/review-demo-street-level.png) | Demo | eye height, north side | The hero colonnade with the adjacent frontage buildings either side | +| 13 | `demo/review-demo-crossing.png` | [crossing](demo/review-demo-crossing.png) | Demo | along the crosswalk | The designated mid-block crossing at s=130 m (UE X -14956): three zebra bars on the asphalt, with the south frontage and the hero colonnade behind | +| 14 | `demo/review-demo-north-buildings.png` | [north buildings](demo/review-demo-north-buildings.png) | Demo | across the Blvd | North-side buildings (TCL, Tussaud's) seen from the south side across the road | ## Scene conventions diff --git a/Screenshots/demo/review-demo-crossing.png b/Screenshots/demo/review-demo-crossing.png index 434d0fb..e64461e 100644 --- a/Screenshots/demo/review-demo-crossing.png +++ b/Screenshots/demo/review-demo-crossing.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:676b50cd950b4ea3417073d1b604f64c9317c453f83db9eabfb5662d6821f867 -size 2534457 +oid sha256:365f965ca8f4e137d6255d6a2d41325ea373dfbc476e539d4e26f936a7087bee +size 2812073 diff --git a/Screenshots/demo/review-demo-north-buildings.png b/Screenshots/demo/review-demo-north-buildings.png index cd094da..59af2ef 100644 --- a/Screenshots/demo/review-demo-north-buildings.png +++ b/Screenshots/demo/review-demo-north-buildings.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bbe1fe758d2e10266204507da00f27c366deda7dfd1ee1f8888cacb097940465 -size 2766034 +oid sha256:488bb12d2f543bae0afdb5922e2c8413b9b3f67e1ae06cb0c61c59b18d33628f +size 1887759 diff --git a/Screenshots/demo/review-demo-spawn-view.png b/Screenshots/demo/review-demo-spawn-view.png index 4784f39..8ac491e 100644 --- a/Screenshots/demo/review-demo-spawn-view.png +++ b/Screenshots/demo/review-demo-spawn-view.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:513a6f2ca281001b80295d0c82c533c48fdd8496938d7f835f9856db721383c6 -size 1588985 +oid sha256:2a64934a3561434a7c537c599dd3516758f4bcb80f641ae86a7f27b1dd80d352 +size 2587251 diff --git a/Screenshots/demo/review-demo-street-level.png b/Screenshots/demo/review-demo-street-level.png index f702ef0..2e036a0 100644 --- a/Screenshots/demo/review-demo-street-level.png +++ b/Screenshots/demo/review-demo-street-level.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:581898cdd897101711c72520f786021b24800c8f3c0731300692d4a898919734 -size 2241154 +oid sha256:f48d436c950038ce8095f31adea51e71ca0a6b718e83875c40d138cf636d5151 +size 2376114 diff --git a/Screenshots/review-character.png b/Screenshots/review-character.png index 39e2532..0d5979f 100644 --- a/Screenshots/review-character.png +++ b/Screenshots/review-character.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:737d7cacd9573cf9d41b9add8c6182b94d804c0f2a6f5e29ac317c9f55da135e -size 2496192 +oid sha256:39e0b952cbf9401149770e34d3b164dfd1004d5764c586bb212f5e8c7f50cece +size 2531999 diff --git a/Screenshots/review-ground-contact.png b/Screenshots/review-ground-contact.png index ae72e1f..0892e8a 100644 --- a/Screenshots/review-ground-contact.png +++ b/Screenshots/review-ground-contact.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5009a7639444b00f471fff091b0ba9cb354469b0a07134bf9a78a5b768ed54f8 -size 1742167 +oid sha256:dee5e0e6b7b288fbc2dd49fa84fca943b3f7f13748153f857b8d46a72ca5a5a2 +size 1744202 diff --git a/Screenshots/review-hero-facade-front.png b/Screenshots/review-hero-facade-front.png index 2824ce4..81f3c62 100644 --- a/Screenshots/review-hero-facade-front.png +++ b/Screenshots/review-hero-facade-front.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8f958d6988ca97321cfaf03415a67cbec4a34b75c20a524d3e3b9f59d2bd01cc -size 2110749 +oid sha256:1388166f0c25cb0aa2a114ed1cad2bba61c3804a0fbd134c72df138b72a9389f +size 1556209 diff --git a/Screenshots/review-hero-facade-oblique.png b/Screenshots/review-hero-facade-oblique.png index 441206e..e0e86ff 100644 --- a/Screenshots/review-hero-facade-oblique.png +++ b/Screenshots/review-hero-facade-oblique.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a710d8ff8e5ff2cfc744d3f06c1aecec7568e1e813b4a7e83f72c04d8e323913 -size 1965431 +oid sha256:61e3559e2ed6492f6935677861855b75e786e360c68230f6f9fb9100c2e843ce +size 1295450 diff --git a/Screenshots/review-hero-portals.png b/Screenshots/review-hero-portals.png index b13c180..989aca9 100644 --- a/Screenshots/review-hero-portals.png +++ b/Screenshots/review-hero-portals.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:db1188759bda61be3362aa513ba06887aff39ae5b4bba590c8ba17fd0aa48455 -size 1778180 +oid sha256:34aabcfff4906c0e0b62f560fe0999f9cded88c0918d58f9376ecc904cd90fa2 +size 1308245 diff --git a/Screenshots/review-npc-prefab.png b/Screenshots/review-npc-prefab.png index 193bb32..0cfdbe6 100644 --- a/Screenshots/review-npc-prefab.png +++ b/Screenshots/review-npc-prefab.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:786e237feeda93652b73524d1cbf22869e71fa320ca664354efbf8142b34602e -size 1739520 +oid sha256:8de51f6bfdfc41cb7f54c200489632da5913613e58a8c58ceca48b2ccf9fc6db +size 1729429 diff --git a/Screenshots/review-overview.png b/Screenshots/review-overview.png index 3102ec8..a43c9e6 100644 --- a/Screenshots/review-overview.png +++ b/Screenshots/review-overview.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:90630d97e51c5c97b1e09738a95074e9f85294d9465a819f0833c785c33c24f6 -size 2604622 +oid sha256:69b6517bef0c3598dc91b6dc9780998150d6a4db52bee82d737e37e78b2ca839 +size 2568994 diff --git a/Screenshots/review-player-placement.png b/Screenshots/review-player-placement.png index 1700256..bb8bec9 100644 --- a/Screenshots/review-player-placement.png +++ b/Screenshots/review-player-placement.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4b1925e2e85c39d66d7a245b63f7dd2e12e08a8e8058b23cf54fd87141549bbb -size 1986975 +oid sha256:4bc7e549fb4d3aa7fe337b3f05d326f9acf5a4223ce8644d658db13a720eca2e +size 2022265 diff --git a/Screenshots/review-scale-cubes.png b/Screenshots/review-scale-cubes.png index 2248d25..1de1d4f 100644 --- a/Screenshots/review-scale-cubes.png +++ b/Screenshots/review-scale-cubes.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6cd0241d169bf92c043b08d30385792e7c2ac2c6d297f5697323deb499d1bf7f -size 1903735 +oid sha256:0c0615bc4f1970d36ab5d78cc842ace96514072208181b05b25d6cedf0576dfd +size 1935018 diff --git a/Screenshots/review-shadow-compare.png b/Screenshots/review-shadow-compare.png index c7a8dea..55e5415 100644 --- a/Screenshots/review-shadow-compare.png +++ b/Screenshots/review-shadow-compare.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e71421e8c29fa36c4506bfcb9d99848329840d2eb0ac02946071672b04464257 -size 1711217 +oid sha256:6e2b1c1a9930ddfaa4cc715ce627b604581d9fc8624f415af4f2af79f777e684 +size 1710785 diff --git a/TODO.md b/TODO.md index 2c7a4be..612d625 100644 --- a/TODO.md +++ b/TODO.md @@ -78,13 +78,13 @@ The MPFB character asset is planned as the NPC template (see `ROADMAP.md`). Keep - [x] Keep the character as a reusable NPC prefab: a visible body, a collision capsule, and a head-height check that the camera does not clip at 1.60 m — for when NPCs/pedestrians are wired in (`0.2.0+`), not the `0.1.0` player. Done 2026-11-07: `AGigLineNPCPerson` (C++), ACharacter with capsule half-height 83 cm / total 1.66 m (head at ~1.66 m, so a 1.60 m camera does not clip), the MPFB human on the built-in mesh as the visible body, `AutoPossessAI` for pedestrians; confirmed spawned feet-on-Z-0 and rendered in `Screenshots/review-npc-prefab` (☑ approved 2026-11-07). - [x] Screenshots use stable camera names (no index prefix), so inserting a shot no longer renumbers/ orphans files; `AGigLineShotActor` + `Screenshots/README.md` updated. -### Asset production - active - 01a1b26b-3c94-707f-9665-2f6b4a79b564 (branch `materials-lookdev-0.1.0`) +### Asset production - active - 01a1b26b-3c94-707f-9665-2f6b4a79b564 (branch `frontage-block-0.1.0`) - [x] Establish a consistent scale test, named export presets, and repeatable import settings. Scale test = the three-cube calibration scene (`Art/blender/scaletest/`, regenerable via `Tools/scale_test_export.py`); named export preset `ue_metric_v1` (FBX settings in that script); named import preset `ue_metric_v1` (`FbxImportUI` settings in `Tools/ue_scale_test_import.py`). Both scripts are the templates for production asset export/import. - [A] Collect reference photography for manual façade work. Local only, never committed: `Art/reference/` is gitignored. **72 images in eleven folders**: hero façades to 4k, the El Capitan Theatre exterior series, premiere-night staging, Ovation Hollywood, the north side, and the Lee Drug neighbour. Gaps largely closed by the Flickr/web-search pass: the hero entrance is now documented (three portals with individual short flights — the inherited "eight steps, 12 m wide" is overturned), and the 6806–6822 retail run appears in an oblique 2013 frame. Still missing: a clean isolated frame of the door recess and a night frame of 6840 itself. - [x] Download reference photography for the two north-side buildings inside the 50 m buffer — TCL Chinese Theatre (OSM way 424105908, 6925 Hollywood Blvd) and Madame Tussaud's (way 424105889, 6933 Hollywood Blvd). Done 2026-11-06 with `Tools/commons_fetch.py` against the Wikimedia Commons API: eleven frames in the local `Art/reference/north-chinese/` and `Art/reference/north-tussauds/`, provenance in each `sidecar.json`, nothing committed. - [x] Model hero façade for the El Capitan Entertainment Centre site. **Second pass built 2026-11-07** (proportions recalibrated from the 2009 photograph: entablature 3.4 m, parapet 2.2 m, architrave and cornice bands, square pedestals — the first pass had 5.7 m of blank wall above the capitals and read as a warehouse). **First pass built 2026-11-07** (`Tools/hero_facade_build.py` → `Art/blender/hero/hero-facade-2026-11-07.blend` + JSON part report with evidence per part → `Tools/ue_hero_facade_import.py` → `/Game/Hollywood/ElCapitan/SM_HeroFacade`, 1892 tris, 4 materials, placed on the measured building line). Six columns at 4.96 m over the 25.75 m frontage, plinth, three portal flights (5 risers, not the old 8), entablature 2.2 m, parapet 1.6 m with motto band and medallions. **Screenshot approved** (`Screenshots/review-hero-portals`, `review-hero-facade-front/oblique`). Next pass: banner and window placement, then materials. -- [ ] Model surrounding block frontage. +- [x] Model surrounding block frontage. **Done 2026-11-07, screenshots approved.** The five remaining south-side buildings verified for the block (`Geo/verification/2026-11-06-el-capitan-block.md`) are exported in place from the OSM blockout by `Tools/export_block_frontage.py` -> `Tools/ue_import_block_frontage.py` -> `/Game/Hollywood/Frontage/`, and staged by the demo builder: 6922, 6902, 6838 El Capitan Theatre, 6822 Budget, 6806-6820, 6800 Lee Drug. **Adding them exposed a pre-existing placement bug**: UE south is +Y (the south sidewalk is Y +718..+1447) but the hero facade sat at Y -1450 (north side) and X -12024..-9420, i.e. 26 m east of its own footprint and on the wrong side of the street; the two north-side buildings were likewise on the south side. The hero is now at X -13336 / Y +1307 (inside the frontage gap between 6902 and 6838) and the north buildings are back on the north side (Y -1802..-9431). The sun was raised to pitch -62 so both frontages read instead of one being silhouetted. - [x] Model simplified background buildings directly across Hollywood Boulevard. Done 2026-11-07, the two in-scope north-side buildings — TCL Chinese Theatre (SM_TCL_Chinese_Theatre) and Madame Tussaud's (SM_Madame_Tussauds) — taken from the verified OSM blockout volumes and exported with `ue_metric_v1`, with a Y-mirror so they land north of Hollywood Blvd across the street from the hero (TCL spans Unreal Y 1802..9431, Tussaud's 1888..7586; road centreline ≈ 0, hero façade at Y −1450). Staged in the DemoMap as `North_TCL_Chinese` / `North_Madame_Tussauds`; demo shot `review-03-demo-north-buildings` captured. Simple flat facade materials (surfaces are the `0.1.4` patch). - [A] Build sidewalks, roads, and collision meshes. Terrain, road, sidewalks and kerbs exist (`Art/blender/terrain/`, `street/`) and are assembled in `site/site-2026-11-06.blend`; collision and details (crossing markings, kerb radii, aprons) are not built. Ground must follow the DEM: 3.94 m fall along the block, ~2 % crown between the gutters at ±10–11 m from the centreline, north sidewalk higher than south. Kerb height is an unresolved assumption — the DEM does not resolve it (`Geo/verification/2026-11-06-cross-sections.md`). - [x] Materials and look development for all exported assets. **Done 2026-11-07, screenshots approved.** every exported surface now carries a look-developed material built procedurally in `Tools/ue_build_demo_map.py` (`ensure_material`): base colour with a world-space noise blend between two shades for large-scale variation, plus an explicit roughness and specular. Set is `M_Asphalt` 0.92, `M_Concrete` 0.88, `M_KerbConcrete` 0.85, `M_Ground` 0.98, `M_RoadPaint` 0.62, `M_FacadeStone` 0.72 (hero façade) and `M_Stucco` 0.86 (TCL, Tussaud's), assigned by mesh and by actor label. Materials are rebuilt on every run so a stale asset cannot mask a look change. The richer texture-based pass (baked/procedural brick, brick_facade and seamless_concrete generators) stays in the `0.1.4` façade patch. diff --git a/Tools/export_block_frontage.py b/Tools/export_block_frontage.py new file mode 100644 index 0000000..50e7670 --- /dev/null +++ b/Tools/export_block_frontage.py @@ -0,0 +1,98 @@ +# Export the south-side block frontage from the OSM blockout. +# +# blender -b --factory-startup Art/blender/blockout/blockout-2026-11-06.blend \ +# --python Tools/export_block_frontage.py -- --out /tmp/gigline/frontage +# +# The building set is the one verified in +# `Geo/verification/2026-11-06-el-capitan-block.md` ("South frontage, west to +# east"), minus 6840 which is modelled by hand as SM_HeroFacade. Everything is +# already in the shared project frame (metres, X east / Y north / Z up, origin +# Hollywood x Highland), so each object exports at its own world position with no +# transform: these are south-side buildings and need no Y mirror. +# +# The block runs from Highland (X 0) to Orange Drive (X -279.6 m). Objects that +# are OSM `element` placeholders are named by their verified address instead, so +# the Unreal asset names say what the building is. + +import argparse +import os +import sys + +import bpy + +# blockout object name -> (asset name, note). Addresses from the verification doc. +BUILDINGS = { + # Way 424024151, 6922, commercial 12 levels - the west end of the frontage. + "element.020": ("SM_Hollywood_6922", "6922, west end of the frontage"), + # Way 206486872, 6902, retail, height 13.8. + "element": ("SM_Hollywood_6902", "6902, retail, H 13.8"), + # Way 424024148, 6838, El Capitan Theatre - distinct from 6840. + "El Capitan Theatre": ("SM_ElCapitanTheatre", "6838, cinema, 6 levels"), + # Way 424024144, 6822, Budget car rental. + "Budget": ("SM_Budget_6822", "6822, car rental, H 5.5"), + # Way 424024150, 6806-6820, retail, height 12.1. + "element.019": ("SM_Hollywood_6806", "6806-6820, retail, H 12.1"), + # Way 424024149, 6800, Lee Drug Building. + "Lee Drug Building": ("SM_LeeDrug_6800", "6800, Lee Drug Building, H 12.1"), +} + + +def main(): + argv = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [] + ap = argparse.ArgumentParser() + ap.add_argument("--out", default="/tmp/gigline/frontage") + args = ap.parse_args(argv) + os.makedirs(args.out, exist_ok=True) + + print(f"[frontage] scene objects: {len(bpy.data.objects)}") + exported = 0 + for obj_name, (asset_name, note) in BUILDINGS.items(): + obj = bpy.data.objects.get(obj_name) + if obj is None or obj.type != "MESH": + print(f"[frontage] MISSING blockout object {obj_name!r}") + continue + + mesh = obj.data + if not mesh.materials: + mat = bpy.data.materials.new(f"M_{asset_name}") + mat.diffuse_color = (0.72, 0.70, 0.66, 1.0) + mat.use_nodes = False + mesh.materials.append(mat) + + # No Y mirror: the FBX preset lands Blender -Y (south) on Unreal +Y, + # which is the south side of the street (south sidewalk Y +718..+1447). + new_mesh = obj.data + new_obj = obj + + bpy.ops.object.select_all(action="DESELECT") + new_obj.select_set(True) + bpy.context.view_layer.objects.active = new_obj + + path = os.path.join(args.out, asset_name + ".fbx") + bpy.ops.export_scene.fbx( + filepath=path, + use_selection=True, + object_types={"MESH"}, + apply_unit_scale=True, + apply_scale_options="FBX_SCALE_NONE", + axis_forward="-Y", + axis_up="Z", + use_space_transform=True, + use_mesh_modifiers=True, + mesh_smooth_type="OFF", + path_mode="AUTO", + bake_space_transform=False, + ) + world = new_obj.matrix_world + zs = [(world @ v.co).z for v in new_mesh.vertices] + ys = [(world @ v.co).y for v in new_mesh.vertices] + xs = [(world @ v.co).x for v in new_mesh.vertices] + print(f"[frontage] {asset_name:22} {note:34} " + f"X {min(xs):7.1f}..{max(xs):6.1f} Y {min(ys):6.1f}..{max(ys):6.1f} " + f"H {max(zs):5.1f} verts {len(new_mesh.vertices):5} -> {path}") + exported += 1 + + print(f"[frontage] exported {exported} of {len(BUILDINGS)} frontage buildings") + + +main() diff --git a/Tools/export_north_buildings.py b/Tools/export_north_buildings.py index 671ad88..6224772 100644 --- a/Tools/export_north_buildings.py +++ b/Tools/export_north_buildings.py @@ -40,27 +40,11 @@ def main(): mat.use_nodes = False mesh.materials.append(mat) - # The blockout sits with the hero (6840, south side) at negative Y. The two - # in-scope north buildings must land ACROSS Hollywood Blvd at positive Y in - # Unreal. Mirror the exported geometry across the road centreline (Y=0) and - # reverse winding; the FBX exporter does not do this for us. - new_mesh = mesh.copy() - new_obj = obj.copy() - new_obj.data = new_mesh - new_obj.matrix_world = obj.matrix_world.copy() - bpy.context.collection.objects.link(new_obj) - import mathutils as mu - world = new_obj.matrix_world - inv = world.inverted() - for v in new_mesh.vertices: - wp = world @ v.co - wp.y = -wp.y - v.co = inv @ wp - for poly in new_mesh.polygons: - verts = list(poly.vertices) - verts.reverse() - poly.vertices = verts - new_mesh.update() + # No copy and no Y mirror: the FBX preset already lands Blender +Y + # (north) on Unreal -Y, and UE north is -Y here (north sidewalk + # Y -1912..-1053). The old mirror put both buildings on the south side. + new_obj = obj + new_mesh = mesh bpy.ops.object.select_all(action="DESELECT") new_obj.select_set(True) bpy.context.view_layer.objects.active = new_obj @@ -80,6 +64,7 @@ def main(): path_mode="AUTO", bake_space_transform=False, ) + world = new_obj.matrix_world zs = [(world @ v.co).z for v in new_mesh.vertices] print(f"[north] {name:22} verts {len(new_mesh.vertices):5} z {min(zs):+.2f}..{max(zs):+.2f} m " f"-> {path}") diff --git a/Tools/ue_build_demo_map.py b/Tools/ue_build_demo_map.py index 2b08281..5a9b9d8 100644 --- a/Tools/ue_build_demo_map.py +++ b/Tools/ue_build_demo_map.py @@ -146,7 +146,7 @@ def build(): log(f"could not create {MAP}") return - removed = clear(("Demo_", "PlayerStart", "Hero_Facade")) + removed = clear(("Demo_", "PlayerStart", "Hero_Facade", "Frontage_")) log(f"cleared {removed} previous demo actors") # --- lighting: fixed daytime ------------------------------------------ @@ -162,7 +162,7 @@ def build(): # 3. Ambience. A height fog gives the street depth and hides the terrain # edge that otherwise reads as a black band at the horizon. sun = spawn(unreal.DirectionalLight, unreal.Vector(0, 0, 2000), "Demo_Sun", - unreal.Rotator(pitch=-50.0, yaw=120.0, roll=0.0)) + unreal.Rotator(pitch=-62.0, yaw=120.0, roll=0.0)) if sun: comp = sun.get_component_by_class(unreal.DirectionalLightComponent) if comp: @@ -181,7 +181,7 @@ def build(): comp.set_mobility(unreal.ComponentMobility.MOVABLE) except Exception as exc: # noqa: BLE001 log(f"sun mobility not set: {exc!r}") - log("staged: Demo_Sun (pitch -50, yaw 120, intensity 4, warm)") + log("staged: Demo_Sun (pitch -62, yaw 120, intensity 4, warm; higher sun so both frontages read)") sky = spawn(unreal.SkyLight, unreal.Vector(0, 0, 2000), "Demo_SkyLight") if sky: @@ -246,9 +246,14 @@ def build(): log("staged: Demo_PostProcess (fixed exposure, min=max brightness 1.0)") # --- hero facade on the measured building line ------------------------ + # Hero placement, corrected 2026-11-07 when the neighbouring frontage was + # added: UE south is +Y (the south sidewalk is Y +718..+1447) and the block + # frontage sits at X -24276..-12082 with a gap at -14591..-12082 for 6840. + # The old (-10722.5, -1443) put the facade 26 m east of its footprint and on + # the NORTH side of the street, which only looked right while it stood alone. hero = unreal.EditorAssetLibrary.load_asset("/Game/Hollywood/ElCapitan/SM_HeroFacade") if hero: - actor = spawn(unreal.StaticMeshActor, unreal.Vector(-10722.5, -1443.0, 0.0), "Hero_Facade") + actor = spawn(unreal.StaticMeshActor, unreal.Vector(-13336.0, 1307.0, 0.0), "Hero_Facade") if actor: actor.static_mesh_component.set_static_mesh(hero) actor.static_mesh_component.set_mobility(unreal.ComponentMobility.MOVABLE) @@ -323,14 +328,47 @@ def build(): assigned += 1 log(f"assigned look materials to {assigned} facade/background actors") + # --- surrounding block frontage --------------------------------------- + # The other five south-side buildings verified for the block + # (Geo/verification/2026-11-06-el-capitan-block.md), exported in place from + # the OSM blockout with a Y mirror so they sit on the south side with the + # hero. The 6840 site itself is the hand-modelled SM_HeroFacade above. + FRONTAGE = ( + ("SM_Hollywood_6922", "6922"), + ("SM_Hollywood_6902", "6902"), + ("SM_ElCapitanTheatre", "6838 El Capitan Theatre"), + ("SM_Budget_6822", "6822 Budget"), + ("SM_Hollywood_6806", "6806-6820"), + ("SM_LeeDrug_6800", "6800 Lee Drug"), + ) + staged_frontage = 0 + for asset_name, label in FRONTAGE: + mesh = unreal.EditorAssetLibrary.load_asset(f"/Game/Hollywood/Frontage/{asset_name}") + if mesh is None: + log(f"MISSING frontage {asset_name} — run Tools/ue_import_block_frontage.py") + continue + actor = spawn(unreal.StaticMeshActor, unreal.Vector(0, 0, 0), f"Frontage_{asset_name}") + if actor: + comp = actor.static_mesh_component + comp.set_static_mesh(mesh) + comp.set_mobility(unreal.ComponentMobility.MOVABLE) + # The two theatre buildings read as stone; the retail run as stucco. + mat_name = "M_FacadeStone" if "Theatre" in asset_name else "M_Stucco" + if mat_name in built: + comp.set_material(0, built[mat_name]) + staged_frontage += 1 + log(f"staged {staged_frontage} frontage buildings") + # --- player start: north sidewalk, facing the hero frontage ------------- # Signs were measured from the imported meshes rather than assumed: the FBX # preset flips north, so in Unreal the road spans Y -1382..+1047, the NORTH # sidewalk is at Y -1912..-1053 and the SOUTH sidewalk at Y +718..+1447. The # facade stands at Y -1450. Stand on the north sidewalk and look north (-Y). - spawn(unreal.PlayerStart, unreal.Vector(-10722.5, -3500.0, 120.0), "Demo_PlayerStart", - unreal.Rotator(pitch=0.0, yaw=0.0, roll=0.0)) - log("staged: Demo_PlayerStart on the north sidewalk facing south") + # North sidewalk (Y -1912..-1053), facing south (+Y) across the road at the + # hero on the south side. Yaw 90 looks along +Y. + spawn(unreal.PlayerStart, unreal.Vector(-13336.0, -1700.0, 120.0), "Demo_PlayerStart", + unreal.Rotator(pitch=0.0, yaw=90.0, roll=0.0)) + log("staged: Demo_PlayerStart on the north sidewalk facing south (+Y)") # A lockable LFS .umap checks out read-only, which makes save_map silently # return False — chmod u+w first or the staged actors never persist. diff --git a/Tools/ue_build_review_map.py b/Tools/ue_build_review_map.py index 55a9baf..c7a774b 100644 --- a/Tools/ue_build_review_map.py +++ b/Tools/ue_build_review_map.py @@ -163,8 +163,10 @@ try: # from the north sidewalk, and the oblique street view from further west. # Hero placement in Unreal centimetres (see Geo/manifests/local-origin.md): # front plane on the building line, body behind it. - hero_x = -12024.5 + 1302.0 - hero_y = -1450.0 + 7.0 + # Corrected 2026-11-07 with the block frontage: UE south is +Y (south + # sidewalk Y +718..+1447) and 6840 occupies the frontage gap X -14591..-12082. + hero_x = -13336.0 + hero_y = 1307.0 hero = unreal.EditorAssetLibrary.load_asset("/Game/Hollywood/ElCapitan/SM_HeroFacade") # The imported mesh spans Y -7..+1250 cm in local space (front plane at -7, the # body behind it) and is centred on X, so the actor sits at building line + 7 cm. @@ -274,12 +276,12 @@ try: demo_shots = [ # 14 m back so the 14.5 m elevation fits: at 2 m the camera sees only # the colonnade's underside. - ("demo-spawn-view", unreal.Vector(-10722.5, -3500, 165), unreal.Vector(-10722.5, -1450, 700)), + ("demo-spawn-view", unreal.Vector(-13336, -3100, 420), unreal.Vector(-13336, 1300, 620)), # Street level, from the north sidewalk: the old camera sat at Y -400, # inside the facade body (which spans Y -1457..-200), so it looked at # the unlit back face. Y -2600 is on the sidewalk in front of the lit # elevation. - ("demo-street-level", unreal.Vector(-10850, -2600, 170), unreal.Vector(-10722.5, -1450, 400)), + ("demo-street-level", unreal.Vector(-13420, -1650, 170), unreal.Vector(-13336, 1300, 400)), # The designated mid-block crossing. Street arc length runs from the # west end (s=0 at X -27966 cm), so s=130.1 m is UE X -14956, not the # -24291 the old camera used (that is the s=36.6 crossing). Camera sits @@ -288,7 +290,7 @@ try: ("demo-crossing", unreal.Vector(-15250, -2500, 400), unreal.Vector(-14956, 400, 150)), # the two north-side background buildings (TCL, Tussaud's) seen from # the south sidewalk, across Hollywood Blvd: their frontage and mass. - ("demo-north-buildings", unreal.Vector(-22800, -1000, 400), unreal.Vector(-22800, 3000, 300)), + ("demo-north-buildings", unreal.Vector(-22800, 2600, 420), unreal.Vector(-22800, -4200, 300)), ] seq = spawn(unreal.GigLineShotActor, unreal.Vector(0, 0, 300), "ShotSequencer") if seq: diff --git a/Tools/ue_import_block_frontage.py b/Tools/ue_import_block_frontage.py new file mode 100644 index 0000000..8f22e45 --- /dev/null +++ b/Tools/ue_import_block_frontage.py @@ -0,0 +1,92 @@ +# Import the south-side block frontage FBX set into Unreal. +# +# blender ... --python Tools/export_block_frontage.py -- --out /tmp/gigline/frontage +# /Engine/Binaries/Linux/UnrealEditor-Cmd -run=pythonscript \ +# -script=/Tools/ue_import_block_frontage.py -nullrhi -unattended -nopause -stdout +# +# Each mesh already sits at its world position in the project frame (the FBX was +# exported without moving the object), so the actor is spawned at the origin and +# the geometry carries the offset. Destination: /Game/Hollywood/Frontage/. +# +# Staging into the DemoMap is done by Tools/ue_build_demo_map.py, which also +# assigns the look materials; this script only produces the assets. + +import glob +import os + +import unreal + +SRC = "/tmp/gigline/frontage" +DEST = "/Game/Hollywood/Frontage" +RESULT = "/tmp/gigline/frontage-import.txt" +lines = [] + + +def log(msg): + lines.append(str(msg)) + unreal.log(str(msg)) + + +def import_fbx(path, name): + task = unreal.AssetImportTask() + task.filename = path + task.destination_path = DEST + task.destination_name = name + task.automated = True + task.save = True + task.replace_existing = True + + ui = unreal.FbxImportUI() + ui.import_mesh = True + ui.import_materials = True + ui.import_textures = False + ui.import_as_skeletal = False + smd = ui.static_mesh_import_data + smd.import_uniform_scale = 1.0 + smd.combine_meshes = True + smd.convert_scene_unit = False + smd.force_front_x_axis = False + smd.normal_import_method = unreal.FBXNormalImportMethod.FBXNIM_IMPORT_NORMALS + task.options = ui + unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task]) + + mesh = unreal.EditorAssetLibrary.load_asset(f"{DEST}/{name}") + if mesh is None: + log(f"MISSING after import: {DEST}/{name}") + return + # Buildings are solids the player can walk into the side of: simple + complex + # so the blockout blocks the player without expensive per-triangle queries. + try: + body = mesh.get_editor_property("body_setup") + body.set_editor_property("collision_trace_flag", + unreal.CollisionTraceFlag.CTF_USE_SIMPLE_AND_COMPLEX) + mesh.set_editor_property("body_setup", body) + except Exception as exc: # noqa: BLE001 + log(f"{name}: collision flag not set ({exc!r})") + box = mesh.get_bounding_box() + mn, mx = box.min, box.max + # World-space placement, in Unreal centimetres, straight from the mesh bounds. + log(f"{name:22} X {mn.x:8.0f}..{mx.x:8.0f} Y {mn.y:7.0f}..{mx.y:7.0f} " + f"Z {mn.z:5.0f}..{mx.z:5.0f}") + + +def main(): + files = sorted(glob.glob(os.path.join(SRC, "*.fbx"))) + if not files: + log(f"no FBX in {SRC}; run Tools/export_block_frontage.py first") + return + for path in files: + name = os.path.splitext(os.path.basename(path))[0] + import_fbx(path, name) + unreal.EditorLoadingAndSavingUtils.save_dirty_packages(True, True) + + +try: + main() +except Exception as exc: # noqa: BLE001 + import traceback + log(f"FAILED: {type(exc).__name__}: {exc}") + log(traceback.format_exc()) + +with open(RESULT, "w") as f: + f.write("\n".join(lines) + "\n")