import type { ImportDiagnostic, RiveArtboardGraph, RiveWeightedPoint, Skin2D } from '@flighthq/types/contract'; /** * Reads a skinned path's `Weight`/`CubicWeight` records into a `Skin2D`. * * **The influences are packed, four to a word.** `values` and `indices` are each a single uint * holding four bytes — a weight of 0–255 and a bone reference — read low byte first. A zero weight is * an unused slot, which is how a fixed-width record produces `Skin2D`'s variable influence counts. * * **A weight's index names a tendon, not a bone, and the numbering starts at 1.** The runtime's bone * table reserves slot 0 for the identity, so tendon *n* sits at index *n + 1*; a tendon then names * the bone. Reading the index as a bone index directly would silently address the wrong bone in every * file with more than one. * * **The offsets bake the bind, which is what `Skin2D` stores.** Rive deforms a point as * `Σ wᵢ · (boneWorldᵢ · tendonInverseBindᵢ) · (skinWorld · p)`, blending matrices and transforming * once; `Skin2D` stores a per-influence offset already in bone space and blends positions. The two * are the same arithmetic — a matrix product is linear — so the offset this writes is * `tendonInverseBindᵢ · (skinWorld · p)`. A tendon states its **bind**, which is inverted here, and * the skin states its own transform separately. * * Storing a vertex in each influencing bone's bind-local frame is the universal inverse-bind * convention, not a quirk of this format — glTF names the same matrices `inverseBindMatrices`. The * equivalence above is therefore checkable from the arithmetic alone, which is why it is stated as a * derivation a reader can redo rather than as a claim to take on trust. */ export declare function createRiveSkin2D(artboard: Readonly, skinnableIndex: number, boneIndices: readonly number[], points: readonly Readonly[], diagnostics?: ImportDiagnostic[]): Skin2D | null; //# sourceMappingURL=riveSkin.d.ts.map