LOD: fige les jumeaux de fente (slit twins) + blend UV linéaire (le fold est supprimé)
- weld: Δ UV = 0.5 exact n'est plus soudé (ambigu: fente à sa plus large vs saut légitime — la colonne u=1 du cône vs le chart disque du cap tombait exactement dessus et mélangeait les charts) - collapse: les UV se blendent linéairement. Le fold par coordonnée (Δ entier → 0) figeait l'UV du sommet sur les vertices de base (bande de rayures, signalée par l'utilisateur) — il était inutile: les jumeaux de fente sont gelés, aucun repli ne traverse la fente - welded renvoie un struct Welded (clippy) - test cône: dual-chart (fan latéral bilinéaire + disque du cap), surface latérale r = λ; test seam/span réécrit selon la sémantique finale - doc: gpu-driven.md, ARCHI_CPU_GPU.md (box LOD), DRAFT.md (D10) alignés sur la sémantique finale (gel des jumeaux, blend linéaire, seuil strict) - AGENTS.md: gotcha 'ne jamais folder un saut entier de tuile' 102 tests passent, demo lance et rend sans erreur.
This commit is contained in:
+14
-9
@@ -98,15 +98,20 @@ CPU):
|
||||
cheapest-first; an interior collapse merges both incident triangles (−2 faces) and remaps the
|
||||
neighbours — no new face, so a **seam-free mesh stays closed** (no holes, no non-manifold
|
||||
"books") and a boundary collapse removes one face; duplicate corners are welded **aware of
|
||||
their attributes** (relative position tolerance 1e-6, merged only when the UVs are within half
|
||||
a tile and the normals within ~25° — a seam or a hard edge stays a separate corner, so a
|
||||
collapse can never cross a texture chart or a shading break; on a mesh with a UV seam the
|
||||
seam's lips are then *protected* — their faces never collapse while interior ones remain — so
|
||||
the surface stays geometrically complete); a survivor **moved** by a collapse gets its
|
||||
UV/color/normal **interpolated** between the collapsed endpoints (same λ as its new position —
|
||||
texture and shading stay attached to the surface and coarsen smoothly across levels, never
|
||||
across a UV seam; normals are **inherited from the source, never recomputed**, so the lighting
|
||||
is identical to level 0 whatever the source's winding), and the
|
||||
their attributes** (relative position tolerance 1e-6, merged only when the UVs are strictly
|
||||
less than half a tile apart on both coordinates — an offset of exactly ½ is ambiguous: a wrap
|
||||
seam at its widest or a legitimate half-tile jump — and the normals within ~25°; a seam or a
|
||||
hard edge therefore stays a separate corner, and the weld *records* the integer-apart pairs it
|
||||
refused); on a mesh with a UV seam those **seam twins are frozen** — every edge touching one
|
||||
is excluded from the collapse queue — so the zero-width slit stays closed at every level, and
|
||||
the rim protection (no boundary collapse while any interior edge remains) keeps the surface
|
||||
geometrically complete; a survivor **moved** by a collapse gets its UV/color/normal
|
||||
**blended linearly** between the collapsed endpoints (same λ as its new position — the chart
|
||||
is bilinear, so the blend is the exact chart value at the new point: texture and shading stay
|
||||
attached to the surface and coarsen smoothly across levels, and a seam is never crossed because
|
||||
its twins are frozen, not because a blend is rejected; normals are **inherited from the
|
||||
source, never recomputed**, so the lighting is identical to level 0 whatever the source's
|
||||
winding), and the
|
||||
levels are **packed into the mesh's single
|
||||
vertex/index buffers** (see the constraint below). Level 0 is always your exact geometry.
|
||||
2. **Per frame (CPU).** For each entity, the bounding sphere used by culling is projected to screen
|
||||
|
||||
Reference in New Issue
Block a user