Opt-in (InspectSceneModelParams.checkGeometryQuality).
Five geometry-quality checks the SDK's createGeometry
lifecycle gate doesn't enforce — these are quality concerns,
not data-shape errors:
GEOMETRY_ZERO_VOLUME_AABB — AABB collapsed to a point or
a line segment (one or more axes have zero extent). Likely
a single-point / single-line geometry that won't render
visibly.
GEOMETRY_DEGENERATE_TRIANGLES — one or more triangles
have repeated indices (e.g. [7, 7, 12]) or near-zero
cross-product magnitude. Render nothing but cost vertex /
fragment work.
GEOMETRY_UNUSED_VERTICES — positions exist that no
indices / edgeIndices entry references. Wasted vertex
buffer + per-vertex shader work for non-indexed renders.
GEOMETRY_DUPLICATE_VERTICES — two or more vertex slots are
byte-identical across every populated attribute (positions,
normals, UVs). Coalescing them shrinks the vertex buffer
without altering any rendered surface — vertex splitting
for genuine seam / crease cases produces different
normals or UVs, so those slots wouldn't match.
GEOMETRY_NON_WATERTIGHT — primitive is SolidPrimitive
but at least one triangle edge is shared by != 2 faces. The
geometry isn't actually a closed manifold; downstream
pipelines that rely on solid semantics (back-face culling
decisions, IFC inside / outside, BVH closed-cell
containment) will misbehave.
GEOMETRY_INCONSISTENT_WINDING — two or more adjacent
triangles traverse a shared edge in the same direction
(manifold meshes have each edge traversed in opposite
directions by its two faces). Causes backface-cull
artefacts: faces randomly disappear depending on the camera
side. Independent of GEOMETRY_NON_WATERTIGHT — both can
fire on the same mesh.
GEOMETRY_AABB_NOT_TIGHT — the actual u16 range used in
positionsCompressed covers less than
minAabbFill
of the available [0, 65535] quantisation grid on at
least one axis. Wasted precision; loaders sometimes emit
a generous AABB and never re-tighten it.
GEOMETRY_DUPLICATE_INDICES — the same triangle (same
three vertex ids, in any rotation / winding) appears more
than once in indices. Causes invisible overdraw. Distinct
from GEOMETRY_DUPLICATE_VERTICES (different vertex slots
with identical attribute bytes).
Pure read pass — no mutation. Each issue carries a
highlight.objectIds payload built from
findSceneObjectsForGeometry so the example UI can
locate the affected SceneObjects in the Viewer.
Opt-in (InspectSceneModelParams.checkGeometryQuality). Five geometry-quality checks the SDK's
createGeometrylifecycle gate doesn't enforce — these are quality concerns, not data-shape errors:GEOMETRY_ZERO_VOLUME_AABB— AABB collapsed to a point or a line segment (one or more axes have zero extent). Likely a single-point / single-line geometry that won't render visibly.GEOMETRY_DEGENERATE_TRIANGLES— one or more triangles have repeated indices (e.g.[7, 7, 12]) or near-zero cross-product magnitude. Render nothing but cost vertex / fragment work.GEOMETRY_UNUSED_VERTICES— positions exist that noindices/edgeIndicesentry references. Wasted vertex buffer + per-vertex shader work for non-indexed renders.GEOMETRY_DUPLICATE_VERTICES— two or more vertex slots are byte-identical across every populated attribute (positions, normals, UVs). Coalescing them shrinks the vertex buffer without altering any rendered surface — vertex splitting for genuine seam / crease cases produces different normals or UVs, so those slots wouldn't match.GEOMETRY_NON_WATERTIGHT— primitive isSolidPrimitivebut at least one triangle edge is shared by != 2 faces. The geometry isn't actually a closed manifold; downstream pipelines that rely on solid semantics (back-face culling decisions, IFC inside / outside, BVH closed-cell containment) will misbehave.GEOMETRY_INCONSISTENT_WINDING— two or more adjacent triangles traverse a shared edge in the same direction (manifold meshes have each edge traversed in opposite directions by its two faces). Causes backface-cull artefacts: faces randomly disappear depending on the camera side. Independent ofGEOMETRY_NON_WATERTIGHT— both can fire on the same mesh.GEOMETRY_AABB_NOT_TIGHT— the actual u16 range used inpositionsCompressedcovers less than minAabbFill of the available[0, 65535]quantisation grid on at least one axis. Wasted precision; loaders sometimes emit a generous AABB and never re-tighten it.GEOMETRY_DUPLICATE_INDICES— the same triangle (same three vertex ids, in any rotation / winding) appears more than once inindices. Causes invisible overdraw. Distinct fromGEOMETRY_DUPLICATE_VERTICES(different vertex slots with identical attribute bytes).Pure read pass — no mutation. Each issue carries a
highlight.objectIdspayload built from findSceneObjectsForGeometry so the example UI can locate the affected SceneObjects in the Viewer.