fix(content): S1 review round - retail default sides shape, mask hoist, upload order
Campaign OVERHAUL S1 review fixes (two Opus lens reviews, findings verified by the lead against the decomp): - a raw sides_type outside 0/1/2 constructs retail's default single-side shape (ConstructMesh @0x0059DFA0 loop bounds default to 1) instead of dropping the polygon; still counted as a data anomaly (corpus has none); - the positive-surface stippling mask OR runs once per polygon before the degenerate-fan guard, as retail's count loop does (pseudo-C 426859-426866); - untextured slots keep their mask accounting but bake no texture and no vertices (contract §9 item 3); the dev pak shrinks by 114 KB; - failed surface-override / Surface / texture-dependency lookups are attempted and logged once per slot, not once per candidate; - cell-shell batches upload in ascending source surface index, retail's built-EnvCell subset draw order (ConstructMesh attribute-range scan, DrawMesh @0x0059D4A0); ordinary GfxObj meshes keep storage order; - CellMesh.HasDrawableGeometry documented as the admission rule without texture-dependency resolution (a conservative superset of emission); - the stippling/surface equivalence sweep's cell half is pinned at zero again; InAscendingSurfaceOrder is marked bake/upload/test-only; - plan §5: reviewer findings are verified by the lead, one skeptic at most for a blocking finding, never more than five agents per step. Three new Content tests pin the mask hoist, the vertex-free untextured slot, and the single-side fallback. Content 213/213, Core Meshing and Conformance green, App hermetic 6,757/6,757, Release build 0/0. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
0840d5fb77
commit
e2543d0ef0
10 changed files with 265 additions and 73 deletions
|
|
@ -79,11 +79,19 @@ public class CellStructSideCandidatesTests
|
|||
[InlineData(3)]
|
||||
[InlineData(-1)]
|
||||
[InlineData(99)]
|
||||
public void UnknownSidesValue_YieldsNoCandidates(int rawSidesType)
|
||||
public void UnknownSidesValue_FallsBackToRetailSingleSideShape(int rawSidesType)
|
||||
{
|
||||
// ConstructMesh @0x0059DFA0 initializes both loop bounds to 1 and
|
||||
// widens them only on an exact 1 / 2 match, so any other raw value
|
||||
// constructs the single positive fan (S1 review finding, 2026-09-02).
|
||||
var candidates = CellStructSideCandidates.GetCandidates(rawSidesType);
|
||||
|
||||
Assert.True(candidates.IsEmpty);
|
||||
var single = Assert.Single(candidates.ToArray());
|
||||
Assert.Equal(CellStructPolygonSurfaceSide.Positive, single.SurfaceSlot);
|
||||
Assert.Equal(0, single.CopyOrdinal);
|
||||
Assert.Equal(1, single.NormalSign);
|
||||
Assert.False(single.ReverseWinding);
|
||||
Assert.False(CellStructSideCandidates.IsRetailDefinedSidesType(rawSidesType));
|
||||
}
|
||||
|
||||
// ---- exact fan index order (§3.4 "Fan index order" column) ----
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue