geometry library
CPU-side geometry: vertex layouts, mesh data, shape generators and the ray arithmetic that reads them.
A library of flutter3d_core, importable on its own. A modeller's
editable mesh, the tool an agent speaks to and a bench compiled by dart compile exe all want to say MeshData without the renderer, and a caller
that imports only this library gets only this library. It was
flutter3d_geometry until the package boundary turned out to protect
nothing a library does not.
DeviceMesh is not here. It is the rest of the geometry layer by
subject matter, but it holds the one type that has met a device, so it
lives with the renderer (src/engine/geometry/device_mesh.dart) and
flutter3d_core.dart exports both.
Classes
- CapsuleShape
- Capsule: a cylinder of height closed by two hemispheres of radius.
- ConeShape
- Cone with the apex at +Y: a cylinder whose top radius is zero.
- CpuMesh
- A mesh that lives only on the CPU.
- CuboidShape
- Axis-aligned box centred on the origin.
- CylinderShape
- Cylinder or truncated cone, centred on the origin, axis along Y.
- DerivedShape
- A shape defined by delegating to another one.
- DiscShape
- Flat annulus in the XZ plane facing +Y. An innerRadius of 0 gives a disc.
- LatheShape
- A surface of revolution: a profile polyline swept around the Y axis.
- MeshBuilder
- Accumulates vertices and indices into growing typed arrays.
- MeshData
- CPU-side geometry: interleaved vertices plus indices.
- MeshGeometry
- What the scene needs to know about a mesh, without knowing where it lives.
- MorphBlend
- Blends a mesh's morph targets into a copy of its vertices.
- MorphTarget
- One shape a mesh can be blended towards, as deltas from its base vertices.
- MorphTexture
-
A mesh's morph deltas, packed the way
lib/morph.glslreads them. - PackedIndices
- Indices packed for GPU upload.
- PlaneShape
- Subdivided plane in the XZ plane, normal pointing at +Y.
- Ray
- A ray: an origin and a direction.
- Shape
- A parameterized generator of geometry.
- SphereShape
- UV sphere, a revolved meridian arc.
- TorusShape
- Torus: a closed circular profile revolved around Y.
- TriangleBvh
- A bounding-volume hierarchy over the triangles of one mesh.
- VertexAttribute
- Describes a single vertex attribute.
- VertexLayout
- An ordered set of attributes making up an interleaved vertex.
Extensions
- MeshTangents on MeshData
- Tangent generation, split out of MeshData because Lengyel's method is a self-contained algorithm that only ever touches MeshData's public surface — an extension keeps it that way rather than granting it access to private state it does not need.
Constants
- kDefaultVertexCacheSize → const int
- A FIFO post-transform vertex cache's own size on real GPUs, give or take — the number optimizeVertexCache scores triangle choices against when the caller does not name one.
- kNoHit → const double
- Returned instead of a distance when nothing was hit.
Properties
- kNeutralColor → Vector4
-
Opaque white: a vertex colour multiplies the surface, so this is the value
that changes nothing.
final
- kNeutralJoints → Vector4
-
Every vertex bound to joint zero.
final
- kNeutralTangent → Vector4
-
A unit tangent along +X with a positive bitangent sign.
final
- kNeutralWeights → Vector4
-
All the influence on the first joint.
final
Functions
-
averageCacheMissRatio(
Uint32List indices, {int cacheSize = kDefaultVertexCacheSize}) → double -
Cache misses per triangle simulating a FIFO cache of
cacheSizeentries readingindicesin order — the standard ACMR metric (Hoppe, "Optimization of Mesh Locality for Transparent Vertex Caching", 1999) for how well a triangle order reuses recently-transformed vertices. -
buildPolyline(
List< Vector3> points, {required double width, List<Vector4> ? colours, Vector4? colour}) → MeshData -
pointsas one bandwidthpixels across, coloured per point. -
optimizeTriangleOrder(
Uint32List indices, int vertexCount, {int cacheSize = kDefaultVertexCacheSize}) → Uint32List -
indicesreordered so triangles sharing recently-drawn vertices are drawn near each other, by Forsyth's greedy scoring: each step emits the unemitted triangle whose three vertices score highest, then ages every vertex still in the simulated cache and rescores the triangles that touch it. -
optimizeVertexCache(
MeshData mesh, {int cacheSize = kDefaultVertexCacheSize}) → MeshData -
meshwith its triangles and vertices reordered for GPU cache reuse: optimizeTriangleOrder on the index buffer, then optimizeVertexFetch to renumber vertices by first use in that new order — the same two-pass scheme real engines andmeshoptimizersplit into, because the two caches they target (post- and pre-transform) are optimized by different orders. -
optimizeVertexFetch(
Uint32List indices, int vertexCount) → ({Uint32List indices, Uint32List oldToNew}) -
indicesrenumbered so a vertex's new index is the order it is first referenced in — the pre-transform ("vertex fetch") half of GPU cache friendliness, meant to run on triangle-cache-ordered indices ( optimizeTriangleOrder's output) the waymeshoptimizer'soptVertexFetchfollows its ownoptVertexCache. A vertex a GPU fetches right after the one before it in memory is a vertex its prefetcher already has queued; a triangle order optimized for the post-transform cache alone can still reference vertex data scattered across the buffer. -
rayAabb(
Ray ray, Aabb3 box) → double -
Distance along
raytobox, or kNoHit. -
raySphere(
Ray ray, Vector3 centre, double radius) → double -
Distance along
rayto a sphere, or kNoHit. Inside counts as0. -
rayTriangle(
Ray ray, Vector3 a, Vector3 b, Vector3 c, {Vector2? outUv, bool cullBackFace = false}) → double - Möller–Trumbore ray/triangle intersection.