From 160e9144f92e841c3e7fda81b34a153f7dcd802e Mon Sep 17 00:00:00 2001 From: Zwitschi Date: Sun, 8 Nov 2026 17:53:31 +0100 Subject: [PATCH] fix(hero): export smoothing groups; give the facade real collision UE export hygiene (unreal-export skill checklist) plus a gameplay defect the new probe caught: - FBX export now uses mesh_smooth_type="FACE" (was OFF, which is why every import logged "No smoothing group information was found"), and the round parts are shaded with shade_smooth_by_angle(35 deg) before export, so columns and medallions read round instead of faceted. - SM_HeroFacade had complex-only collision, so capsule sweeps and line traces passed through the wall: the player could walk through the hero facade. auto_generate_collision was tried and rejected (coarse hulls bulged into the street; the QA wall probe went 0/35 -> 2/35). It now uses UseComplexAsSimple, saved on the asset, like the terrain. - New -qaselftest facade occlusion probe: 40 m traces sideways from the road centre at walking height, required only where a building is staged (explicit X spans mirroring ue_build_demo_map). Result 0/9 -> PASS, alongside transect 0 holes and wall probe 0/35. Docs: release-checks records the probe and both collision attempts; Tools/README lists the new phase; MEMORY records the smoothing/collision lessons. --- Art/blender/hero/hero-facade-2026-11-07.blend | 4 +- Docs/release-checks.md | 9 +++ Game/GigLine/Content/Hollywood/DemoMap.umap | 2 +- .../Hollywood/ElCapitan/SM_HeroFacade.uasset | 4 +- .../Content/Hollywood/Site/M_Asphalt.uasset | 2 +- .../Content/Hollywood/Site/M_Concrete.uasset | 2 +- .../Hollywood/Site/M_FacadeStone.uasset | 2 +- .../Content/Hollywood/Site/M_Ground.uasset | 2 +- .../Hollywood/Site/M_KerbConcrete.uasset | 2 +- .../Content/Hollywood/Site/M_RoadPaint.uasset | 2 +- .../Content/Hollywood/Site/M_Stucco.uasset | 2 +- .../Content/Hollywood/Site/Terrain_DEM.uasset | 2 +- Game/GigLine/Content/Test/ReviewMap.umap | 2 +- .../Source/GigLine/GigLineCharacter.cpp | 75 +++++++++++++++++++ MEMORY.md | 20 +++++ Screenshots/demo/review-demo-crossing.png | 4 +- .../demo/review-demo-north-buildings.png | 4 +- Screenshots/demo/review-demo-spawn-view.png | 4 +- Screenshots/demo/review-demo-street-level.png | 4 +- Screenshots/review-character.png | 4 +- Screenshots/review-ground-contact.png | 4 +- Screenshots/review-hero-facade-front.png | 4 +- Screenshots/review-hero-facade-oblique.png | 4 +- Screenshots/review-hero-portals.png | 4 +- Screenshots/review-npc-prefab.png | 4 +- Screenshots/review-overview.png | 4 +- Screenshots/review-player-placement.png | 4 +- Screenshots/review-scale-cubes.png | 4 +- Screenshots/review-shadow-compare.png | 4 +- Tools/README.md | 2 +- Tools/hero_facade_build.py | 11 ++- Tools/ue_hero_facade_import.py | 10 +++ 32 files changed, 166 insertions(+), 45 deletions(-) diff --git a/Art/blender/hero/hero-facade-2026-11-07.blend b/Art/blender/hero/hero-facade-2026-11-07.blend index 480949d..b97c286 100644 --- a/Art/blender/hero/hero-facade-2026-11-07.blend +++ b/Art/blender/hero/hero-facade-2026-11-07.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:85235632d76bd9527947bdbff1f242cabc3de8192c6211273a77744d99f1e2e9 -size 139428 +oid sha256:5a1fb7ce48fa6a8b82a629caa61b6678e79d001491dfc5b5a00ce49acd13d9f0 +size 139669 diff --git a/Docs/release-checks.md b/Docs/release-checks.md index 328f44d..fae4af0 100644 --- a/Docs/release-checks.md +++ b/Docs/release-checks.md @@ -95,6 +95,15 @@ Run on the packaged build (`GigLineQA`, Development, Vulkan SM5) with `-qaselfte - **Invisible-wall probe:** horizontal traces 30 m long, grounded at 160 cm above the local ground, along the road and both seam rows. Result **0/35 blocking hits inside 21 m** — no invisible walls or misplaced blockers in the street envelope. +- **Facade occlusion probe:** from the road centre, 40 m traces sideways at walking + height toward each frontage, required only where the map stages a building (the + spans are listed in `AGigLineCharacter` and mirror `Tools/ue_build_demo_map.py`). + Result **0/9 directions without a blocking wall** — the player cannot walk + through the hero or the frontage. This probe found the hero façade had **no + simple collision** at all (complex-only, so traces and capsule sweeps passed + through it); it is now `UseComplexAsSimple`. Auto-generated convex hulls were + tried first and rejected: on a 95-part, 26 m façade they bulged into the street + (the wall probe went 0/35 → 2/35). (First pass used a fixed Z 160 start; the street is at Z ~366, so the probe started inside the earth and reported every row as a dist-0 blocker. Grounding the probe fixed that measurement bug.) diff --git a/Game/GigLine/Content/Hollywood/DemoMap.umap b/Game/GigLine/Content/Hollywood/DemoMap.umap index 45119d5..c11114b 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:acdd30ea6a5ad59a1c7f42ed0d70d179e98a6431791ce6bf7a3c584c36883f94 +oid sha256:ab6fbc24a8ebaa48287b8d81e4b180000d5692134349e9bd26f46a90f5d297aa size 54508 diff --git a/Game/GigLine/Content/Hollywood/ElCapitan/SM_HeroFacade.uasset b/Game/GigLine/Content/Hollywood/ElCapitan/SM_HeroFacade.uasset index 0dbcfbd..7141801 100644 --- a/Game/GigLine/Content/Hollywood/ElCapitan/SM_HeroFacade.uasset +++ b/Game/GigLine/Content/Hollywood/ElCapitan/SM_HeroFacade.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9258231850302dd06eb27d7714b1560fe4921dd73db680cd2d6e19ebaf8c57c5 -size 128284 +oid sha256:4ddad5d7f8850af3547fe2f80c388e16e0559e266da058874f0fc36af2ac4f6b +size 129152 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset b/Game/GigLine/Content/Hollywood/Site/M_Asphalt.uasset index fadfff1..b5f45fe 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:ac1508a932d350be48d9969dd90c3e7ca5c67a89b63546a9ddae990b3e47a228 +oid sha256:492410ca526af9484ed9d2f35139b05c00072fdf93156e470c4dea697913804b size 7876 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset b/Game/GigLine/Content/Hollywood/Site/M_Concrete.uasset index d3d636e..5f25f89 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:a43bf901e9cf838ad480784f3682ee2547e8de9e317ac1115bff0f3bacc99d44 +oid sha256:01c5f65d30f0502c08ae6c3d0a6149bf22cd3cc6964386fab7823006433d09a7 size 7881 diff --git a/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset b/Game/GigLine/Content/Hollywood/Site/M_FacadeStone.uasset index 0fa6b2b..da554a9 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:296c8933f068d64587c35916b947453fc394484246cfde3fcdf0c865a076400f +oid sha256:ab055873e8dd41063966798974289109b1a402fedc9856a0e8e8f22d5575c382 size 7896 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset b/Game/GigLine/Content/Hollywood/Site/M_Ground.uasset index 8755aae..601239b 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:664b4fb977c50a4b80a6b121e8f7f9c71b1a3c6ceac95528dfc15baa8f3bf732 +oid sha256:9ceb456eaaa65eb883ff9b5601d1da6801349396ffaff50d956eca62f8978c57 size 7871 diff --git a/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset b/Game/GigLine/Content/Hollywood/Site/M_KerbConcrete.uasset index 2c48dd6..78ed54a 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:a6210dae202c33257c7817d5b9cc95198df094f2338400d8f525d8bbea9351a2 +oid sha256:95591e094b01819fe8fd4ccc36241c1c71aa9b364689e555468191f4a74992d5 size 7901 diff --git a/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset b/Game/GigLine/Content/Hollywood/Site/M_RoadPaint.uasset index f50c054..ee34264 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:c85b5214d4eca87d470bbbc6babfc92b55a9c2b0a937171a2c16c41a915e09b3 +oid sha256:514e92d6639134304adb30c845cdcc4ce5d21debc4088e78de5446ae6949dafd size 7886 diff --git a/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset b/Game/GigLine/Content/Hollywood/Site/M_Stucco.uasset index 4b11416..669842d 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:b409da289210f018dcf96757db52af5d90b2ddd9890c082a75aeec081ea8bde2 +oid sha256:12a5691b007ae60ced3f3bab90abd9a08825a460206dec097a589c94f58228ba size 7871 diff --git a/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset b/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset index ec52357..5f66af5 100644 --- a/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset +++ b/Game/GigLine/Content/Hollywood/Site/Terrain_DEM.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f7c788b5a4bb6700c50b56009c5b0aa0ff08bddfa4e093e881b04bf4521eb2a3 +oid sha256:48ff0d06e31cb7824b60c2e13b9555c20c7b03d45cfd4efcab2f72ca61fb16b9 size 335528 diff --git a/Game/GigLine/Content/Test/ReviewMap.umap b/Game/GigLine/Content/Test/ReviewMap.umap index ac2c54c..6bca92a 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:95c36b872c9c9ced0d697b1766a0aa729e5229b39ed117a4764ddaac31c00613 +oid sha256:631a70bc5f98ececab410ab698bc2047a7f65e3e2d010c679988bef28f70b430 size 28706 diff --git a/Game/GigLine/Source/GigLine/GigLineCharacter.cpp b/Game/GigLine/Source/GigLine/GigLineCharacter.cpp index 9ab855a..aafab92 100644 --- a/Game/GigLine/Source/GigLine/GigLineCharacter.cpp +++ b/Game/GigLine/Source/GigLine/GigLineCharacter.cpp @@ -416,6 +416,81 @@ void AGigLineCharacter::StartQASelfTest() TEXT("GigLine QA: wall probe %d/%d traces with blocking hit inside 21 m -> %s"), Walls, WallSamples, Walls == 0 ? TEXT("PASS") : TEXT("FAIL")); + + // Facade occlusion probe: walkable street is only half the story — + // the player must also NOT be able to walk through the buildings. + // From the road centre, fire 40 m sideways at walking height toward + // each frontage and require a blocking hit. A miss means the + // building has no collision (or only non-blocking collision) and the + // player would pass through the wall. + // Expect a wall only where the map actually stages a building. + // Spans below mirror the actors placed by Tools/ue_build_demo_map.py + // (frontage + hero) and the two north buildings; update them if + // that list changes. Gaps between buildings are legitimate misses. + struct FSpan { float Min, Max; }; + static const FSpan SouthSpans[] = { + {-24276.f, -17700.f}, // 6922 + {-17749.f, -14591.f}, // 6902 + {-14638.f, -12034.f}, // 6840 hero + {-12082.f, -8210.f}, // 6838 El Capitan Theatre + {-7854.f, -7252.f}, // 6822 Budget + {-6608.f, -3307.f}, // 6806-6820 + {-3320.f, -1437.f}, // 6800 Lee Drug + }; + static const FSpan NorthSpans[] = { + {-27071.f, -22799.f}, // Madame Tussaud's + {-22889.f, -18442.f}, // TCL Chinese Theatre + }; + auto InSpans = [](const FSpan* Spans, int32 Count, float X) + { + for (int32 i = 0; i < Count; ++i) + { + if (X >= Spans[i].Min && X <= Spans[i].Max) { return true; } + } + return false; + }; + int32 Facades = 0, FacadeSamples = 0; + for (float X0 = -19000.0f; X0 <= -3000.0f; X0 += 2000.0f) + { + for (float Dir : {1.0f, -1.0f}) // +Y south frontage, -Y north side + { + const bool bExpectWall = (Dir > 0.0f) + ? InSpans(SouthSpans, UE_ARRAY_COUNT(SouthSpans), X0) + : InSpans(NorthSpans, UE_ARRAY_COUNT(NorthSpans), X0); + if (!bExpectWall) + { + continue; + } + FHitResult GroundHit2; + FCollisionQueryParams GQ2(TEXT("GigLineFacadeGround"), false, this); + if (!W->LineTraceSingleByChannel(GroundHit2, + FVector(X0, 0.0f, 3000.f), FVector(X0, 0.0f, -1000.f), + ECC_Visibility, GQ2)) + { + continue; + } + const float ProbeZ2 = GroundHit2.ImpactPoint.Z + 160.f; + FHitResult Hit2; + FCollisionQueryParams Q2(TEXT("GigLineFacadeProbe"), false, this); + const bool bHit2 = W->LineTraceSingleByChannel(Hit2, + FVector(X0, 0.0f, ProbeZ2), + FVector(X0, Dir * 4000.f, ProbeZ2), + ECC_Visibility, Q2); + ++FacadeSamples; + const bool bBlocking = bHit2 && Hit2.GetActor() != nullptr; + if (!bBlocking) + { + ++Facades; + UE_LOG(LogTemp, Log, + TEXT("GigLine QA: facade probe miss at X %.0f dir %.0f (no blocking hit in 40 m)"), + X0, Dir); + } + } + } + UE_LOG(LogTemp, Log, + TEXT("GigLine QA: facade probe %d/%d directions without a blocking wall -> %s"), + Facades, FacadeSamples, + Facades == 0 ? TEXT("PASS") : TEXT("FAIL")); } // 7.0: verdict, then stop ticking. diff --git a/MEMORY.md b/MEMORY.md index adfec09..31ae523 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -440,3 +440,23 @@ Scope: facts and traps that cost time to establish. Planned work lives in [TODO. `review-hero-facade-front`. - Reminder: `.blend` is LFS read-only on checkout — `chmod u+w` or Blender fails with "Cannot save blend file … not writable" (this bit again here). + +## 2026-11-09 — UE export hygiene: smoothing groups + facade collision + +- **All our FBX exporters used `mesh_smooth_type="OFF"`**, which is why every Unreal + import logged "No smoothing group information was found for this mesh". The hero + now exports `"FACE"` and its round parts are shaded with + `shade_smooth_by_angle(35°)` before export: cylinders read as round instead of + faceted, and the import warning is gone (6 → 0). +- **The hero façade had no simple collision** (complex-only), so line traces and + capsule sweeps passed straight through it — the player could walk through the + wall of the demo. Caught by a new `-qaselftest` **facade occlusion probe** (40 m + sideways traces from the road centre at walking height). +- **Auto-generated convex collision on a 95-part 26 m façade is unusable**: it + produced coarse hulls that bulged into the street and the wall probe went + 0/35 → 2/35. Rejected in favour of `UseComplexAsSimple` via + `UGigLineAssetTools.set_complex_collision_as_simple` (same reason the terrain + uses it), saved on the asset. +- Probe expectations must mirror the staged buildings: the facade probe now carries + explicit X spans per frontage (and the TCL/Tussaud's spans on the north side) so + a gap between buildings is not reported as a defect. diff --git a/Screenshots/demo/review-demo-crossing.png b/Screenshots/demo/review-demo-crossing.png index 4fb56b0..53583a0 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:c7433f707fd4c67c2086010e0e5532ccd52181256a18fe463e1df5482199c51e -size 2670224 +oid sha256:6c0144a5d8ad74cc56b512099e0bccf1b4913cc0969a40e2353a5d7b6c88dc4c +size 2670411 diff --git a/Screenshots/demo/review-demo-north-buildings.png b/Screenshots/demo/review-demo-north-buildings.png index 826fcc0..3f0fd57 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:7b3f30d08aac53ff457d77c15623f0e64576a99fd35b2365fae8be20f368d196 -size 2506433 +oid sha256:bf0a8b0f98a3a8e37c6708a1ba6f37fce92d1954e5d02e8ef8051fdc669ad8f9 +size 2505075 diff --git a/Screenshots/demo/review-demo-spawn-view.png b/Screenshots/demo/review-demo-spawn-view.png index fdff3ea..0fd459c 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:b6d50f5ab3d48192c29fa8e1f55081cf07a25ed8e076a433db206fae2d071aa4 -size 2622693 +oid sha256:25fb859414e73ccc043ab5cbba352bdab1ed45e668d82d3a1c4ccdd4f6e36441 +size 2627108 diff --git a/Screenshots/demo/review-demo-street-level.png b/Screenshots/demo/review-demo-street-level.png index 509f5cc..5f559d9 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:62281b1fc62966c64b191d70e3d028cc58ac1ca3678cb0ebb293c8c8cba886e4 -size 2447844 +oid sha256:01c7e5f2385b9f4c7457b7d15745757568f5c26329b3db4ef08d44742ff5a25d +size 2448129 diff --git a/Screenshots/review-character.png b/Screenshots/review-character.png index 026cb84..85e752d 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:e2ac708b0b575a87bbdd56a19979c2115b7ff60797faf3569a92bec37f072b04 -size 2537573 +oid sha256:6984bfec9d9d04e71ae10dd0e950f4bef7c82721e8c72abe70542ae7446e644f +size 2750769 diff --git a/Screenshots/review-ground-contact.png b/Screenshots/review-ground-contact.png index 04655e3..9ed90e0 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:801b4dc81508169a309950e9dcfa8275e0106af16496b0741f5c22fc8d0445f0 -size 1751096 +oid sha256:797c379922881c6db39bb8afd710283e5c0d5928919b4214eb98ab0d2e89ebe5 +size 1817363 diff --git a/Screenshots/review-hero-facade-front.png b/Screenshots/review-hero-facade-front.png index 6aa970d..134198e 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:e01eeea0faae4f18969b5f2f5885462c5033e1d8a476060fbd60c2e55f9d8375 -size 1554786 +oid sha256:8e46779f2b62816fab2f651b3d61bd780f2d98926a2f1b3eecbf36d09fedda41 +size 1731572 diff --git a/Screenshots/review-hero-facade-oblique.png b/Screenshots/review-hero-facade-oblique.png index df386cf..b6db3e6 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:5f65120965f61e8b6c667a8524864653755012cc68fe98a36396f08780ed2dc8 -size 1308909 +oid sha256:c054e9e5edc10864f0a68f91248ec586121ba58cd57fac5509e0967859156594 +size 1399505 diff --git a/Screenshots/review-hero-portals.png b/Screenshots/review-hero-portals.png index e4e699c..d3bcd07 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:14f651aeeef6ddec8e7de0a89326b7ac7c8f713ffdf83fc67525dfd780b2b3b9 -size 1328002 +oid sha256:43bc085789469e32f656e910996dd2a9b4744cae1a0fcb8670e69d8625c94876 +size 1367381 diff --git a/Screenshots/review-npc-prefab.png b/Screenshots/review-npc-prefab.png index de225e6..3140e12 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:cff5f94a8224a3b7ee2e22db8dc157a2a6e484dd405b0f934f38e966265d881b -size 1737790 +oid sha256:645767d4184dedc7569d9a443cf7c855f1205b8dfd85c7ccbcd16068bcb26c97 +size 1802903 diff --git a/Screenshots/review-overview.png b/Screenshots/review-overview.png index e4d4b66..c45ae01 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:b809ae0e1239f3e915ac312bcee988270cb1516707b784c95fb7014704474534 -size 2627332 +oid sha256:4ca2ac170c369b2093c0b4bbb06bdf0cce318c897e75b74363a31bf56858bdab +size 2393713 diff --git a/Screenshots/review-player-placement.png b/Screenshots/review-player-placement.png index c5393bc..ff8ca06 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:7b024c12c58253aefdfa34f64463fde181382bfe4106df092c9b0e8cf6e1cb1d -size 2018349 +oid sha256:16985e7229cd275af3567e9999e45c51db14dd2d9ab6e305bd16cbb77f5076c0 +size 2212611 diff --git a/Screenshots/review-scale-cubes.png b/Screenshots/review-scale-cubes.png index 49f3d9e..ec70c6e 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:fb7a5b86453eb0d15bf34feafe69773038b30d7467e6034f6455921ca19b9862 -size 1938812 +oid sha256:9e0d634aeb2adb125981cefabd3be2f54de7e64d6ab2de0baaa00d73e5539b01 +size 2147701 diff --git a/Screenshots/review-shadow-compare.png b/Screenshots/review-shadow-compare.png index d7fa9d6..3229eca 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:b3c25931da0737b93cc89558556e87537a3ac1518e2d8290258024fd68e6f338 -size 1721081 +oid sha256:62940b77df50ddab2d2e9dd813c2f09c8fe83ec8f4cc755d4cfc47a3145800db +size 1851501 diff --git a/Tools/README.md b/Tools/README.md index 414542f..2be84e2 100644 --- a/Tools/README.md +++ b/Tools/README.md @@ -57,7 +57,7 @@ Geographic tools live in [`Geo/tools/`](../Geo/README.md) and the Blender-side b | Command | Purpose | | --- | --- | | `UnrealEditor /Game/Hollywood/DemoMap -game -qaselftest` | Headless behaviour check: drives forward input for 2 s, then resets and pauses. Logs `GigLine QA: ... PASS/FAIL` lines and a final `RESULT`. Runs only with `-qaselftest`, so normal play is unaffected. | -| `-qaselftest` phases | Walk, reset, pause/unpause, a 16-row seam transect (0 holes) and a ground-referenced wall probe (0/35), plus a frame-time capture writing `Saved/Profiling/perf-walk-frametimes.csv` and logging `GigLine PERF:`. | +| `-qaselftest` phases | Walk, reset, pause/unpause, a 16-row seam transect (0 holes), a ground-referenced wall probe (0/35) and a **facade occlusion probe** that fires sideways from the road centre and requires a blocking wall wherever a building is staged (0/9), plus a frame-time capture writing `Saved/Profiling/perf-walk-frametimes.csv` and logging `GigLine PERF:`. | | `gigline.SetupLogs` cvar | Spawn/input setup logging, **off by default** (`DefaultEngine.ini [ConsoleVariables]`); enable at runtime with `gigline.SetupLogs 1`. | ## Reference and concept generation diff --git a/Tools/hero_facade_build.py b/Tools/hero_facade_build.py index 204d0fa..7a5887a 100644 --- a/Tools/hero_facade_build.py +++ b/Tools/hero_facade_build.py @@ -74,7 +74,7 @@ def cube(name, x, y, z, dx, dy, dz, material=None): return obj -def cylinder(name, x, y, z0, z1, radius, material, vertices=24): +def cylinder(name, x, y, z0, z1, radius, material, vertices=24, smooth=True): bpy.ops.mesh.primitive_cylinder_add( vertices=vertices, radius=radius, @@ -85,6 +85,11 @@ def cylinder(name, x, y, z0, z1, radius, material, vertices=24): obj.name = name if material: obj.data.materials.append(material) + if smooth: + # Round parts must shade smoothly *around* the axis while keeping the + # caps creased. Without this the columns read as faceted prisms, and the + # FBX carries no smoothing groups at all (Unreal warns about it). + bpy.ops.object.shade_smooth_by_angle(angle=math.radians(35.0)) return obj @@ -313,7 +318,9 @@ def export_fbx(path): axis_up="Z", use_space_transform=True, use_mesh_modifiers=True, - mesh_smooth_type="OFF", + # "FACE" exports smoothing groups; without it every import logs + # "No smoothing group information was found for this mesh". + mesh_smooth_type="FACE", path_mode="AUTO", bake_space_transform=False, ) diff --git a/Tools/ue_hero_facade_import.py b/Tools/ue_hero_facade_import.py index 455aab0..b36fd6c 100644 --- a/Tools/ue_hero_facade_import.py +++ b/Tools/ue_hero_facade_import.py @@ -61,6 +61,16 @@ def measure_and_place(): if asset is None: log(f"MISSING {DEST}/SM_HeroFacade") return + # Collision: complex-as-simple, not auto-generated convex hulls. + # The facade is 95 separate parts across 26 m; Unreal's auto hull generation + # wraps them in a few coarse hulls that bulged into the street (the QA wall + # probe went 0/35 -> 2/35 after trying it). Complex-as-simple makes the real + # triangles the simple collision, so line traces and capsule sweeps block on + # the actual wall — the same approach used for the terrain, for the same + # reason. The flag lives on the asset, so save it explicitly. + unreal.GigLineAssetTools.set_complex_collision_as_simple(asset, True) + saved = unreal.EditorAssetLibrary.save_loaded_asset(asset) + log(f"collision: {unreal.GigLineAssetTools.get_collision_complexity(asset)} (saved={saved})") box = asset.get_bounding_box() mn, mx = box.min, box.max log(f"SM_HeroFacade bounds cm: size=({mx.x - mn.x:.1f}, {mx.y - mn.y:.1f}, {mx.z - mn.z:.1f}) "