@ikijs/editor 0.24.1 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -40,19 +40,19 @@ leaves the document untouched.
40
40
 
41
41
  ## API
42
42
 
43
- | Area | Exports |
44
- | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
45
- | Document | `EditorDocument`, `EditCommand` |
46
- | Part edits | `AddPart`, `DeletePart`, `SetPartColor`, `SetPartWidth`, `SetPartHeight`, `SetPartOrder`, `SetPartTransform`, `SetPartBindings`, `SetPartMesh`, `SetPartDeformer` |
47
- | Deformer edits | `AddDeformer`, `DeleteDeformer`, `SetDeformerParent`, `SetDeformerTransform`, `SetDeformerBindings`, `SetDeformerPivot` (+ `X`/`Y`), `CaptureGridKeyform` |
48
- | Physics edits | `AddPhysicsRig`, `SetPhysicsRig`, `DeletePhysicsRig` |
49
- | Referential guards | `validateDeformerReparent`, `validateDeformerDelete`, `validatePartAttach` |
50
- | Atlas | `packAtlas`, `uvRectFor`, `ATLAS_PADDING`, `UV_INSET_PX` |
51
- | Grid keyforms | `computeGridOffsets`, `interpolateGridOffsets`, `upsertGridKeyform` |
52
- | Factories | `createDefaultPart`, `createDefaultMatrixDeformer`, `createDefaultWarpDeformer`, `createGridMesh` |
53
- | Pixels | `detectAlphaBbox`, `ALPHA_BBOX_THRESHOLD`, `AlphaBbox`, `ALPHA_OPAQUE`, `HEAD_BAND`, `SPECK_CORE_FRACTION`, `denseCoreOf`, `isSpeckCore`, `foregroundSpan`, `headHalfOf` |
54
- | Auto-rig | `generateIkiFromLayerSet`, `parseLayerRoles`, `partIdsOfRole`, `createLayerSetMeasurer`, `armGeometry`, `ArmGeometry`, `forearmPoseGeometry`, `ForearmPoseGeometry`, `mouthOpening`, `mouthFold`, `mouthRestShift`, `columnRuns`, `LIP_ROLES`, `LipRole`, `Opening`, `OpeningColumn`, `TurnTargets`, `DEFAULT_TURN_TARGETS`, `TurnSolveReport`, `RigStyle`, `LayerGeometryError` |
55
- | Bindings | `captureBindingEndpoint` |
43
+ | Area | Exports |
44
+ | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
45
+ | Document | `EditorDocument`, `EditCommand` |
46
+ | Part edits | `AddPart`, `DeletePart`, `SetPartColor`, `SetPartWidth`, `SetPartHeight`, `SetPartOrder`, `SetPartTransform`, `SetPartBindings`, `SetPartMesh`, `SetPartDeformer` |
47
+ | Deformer edits | `AddDeformer`, `DeleteDeformer`, `SetDeformerParent`, `SetDeformerTransform`, `SetDeformerBindings`, `SetDeformerPivot` (+ `X`/`Y`), `CaptureGridKeyform` |
48
+ | Physics edits | `AddPhysicsRig`, `SetPhysicsRig`, `DeletePhysicsRig` |
49
+ | Referential guards | `validateDeformerReparent`, `validateDeformerDelete`, `validatePartAttach` |
50
+ | Atlas | `packAtlas`, `uvRectFor`, `ATLAS_PADDING`, `UV_INSET_PX` |
51
+ | Grid keyforms | `computeGridOffsets`, `interpolateGridOffsets`, `upsertGridKeyform` |
52
+ | Factories | `createDefaultPart`, `createDefaultMatrixDeformer`, `createDefaultWarpDeformer`, `createGridMesh` |
53
+ | Pixels | `detectAlphaBbox`, `ALPHA_BBOX_THRESHOLD`, `AlphaBbox`, `ALPHA_OPAQUE`, `HEAD_BAND`, `SPECK_CORE_FRACTION`, `denseCoreOf`, `isSpeckCore`, `foregroundSpan`, `headHalfOf` |
54
+ | Auto-rig | `generateIkiFromLayerSet`, `parseLayerRoles`, `partIdsOfRole`, `createLayerSetMeasurer`, `armGeometry`, `ArmGeometry`, `forearmPoseGeometry`, `ForearmPoseGeometry`, `mouthOpening`, `mouthFold`, `mouthRestShift`, `columnRuns`, `LIP_ROLES`, `LipRole`, `Opening`, `OpeningColumn`, `TurnTargets`, `DEFAULT_TURN_TARGETS`, `TurnSolveReport`, `RigStyle`, `RigPatch`, `PatchReport`, `PatchError`, `SHUT_BY`, `LayerGeometryError` |
55
+ | Bindings | `captureBindingEndpoint` |
56
56
 
57
57
  ## Auto-rig
58
58
 
@@ -98,7 +98,9 @@ shift. With none given the profile itself renders (`DEFAULT_TURN_TARGETS`
98
98
  expresses it in the cues' units). `options.style` tunes a character from the
99
99
  profile: the whole turn, the
100
100
  features' lead, the front hair's follow and its outline's, the blink and the
101
- hair sway. The turn
101
+ hair sway. `options.patches` adds displacements to a generated rig's keyform
102
+ stops (`RigPatch`), replayed on every rig and reported through
103
+ `options.onPatchesApplied`; a refused op throws `PatchError`. The turn
102
104
  is bounded by the art: the far eye stays inside the plate's outline and, given
103
105
  `options.strandEdges`, the far iris may not slide under the bangs' side strand
104
106
  any further than it is painted — best effort, never a refusal. The report's
package/dist/index.d.mts CHANGED
@@ -690,8 +690,8 @@ interface RigStyle {
690
690
 
691
691
  /**
692
692
  * The public shapes of the auto-rig: what a host hands `generateIkiFromLayerSet`
693
- * and what the turn solve reports back. Pixel measurement lives in
694
- * `layer-measure.ts`; everything here is already-decoded geometry.
693
+ * and what the turn solve and the patch replay report back. Pixel measurement
694
+ * lives in `layer-measure.ts`; everything here is already-decoded geometry.
695
695
  */
696
696
 
697
697
  /** One role layer, as a host measured it off its decoded pixels. */
@@ -839,6 +839,68 @@ interface TurnSolveReport {
839
839
  right?: StrandOverlap;
840
840
  };
841
841
  }
842
+ /**
843
+ * One `displace` op of the rig patch layer: a displacement ADDED to one
844
+ * EXISTING keyform stop of `target` on the freshly generated rig, so it is
845
+ * replayed on every re-rig over whatever the generator now bakes. Every other
846
+ * stop and the rest pose stay as generated; between stops the engine blends
847
+ * linearly, so a fix at AngleX −30 shows at half strength at −15.
848
+ */
849
+ interface RigPatch {
850
+ /** A feature grid (`eyeWarp_L`/`_R`, `browWarp_L`/`_R`, `noseWarp`,
851
+ * `mouthWarp`) or a mesh part with warps (`face`, `hair_front`, …). The
852
+ * body warp and the matrix deformers are not patchable. */
853
+ target: string;
854
+ /** The stop. A grid's names both `ParamAngleX` and `ParamAngleY`, each one
855
+ * of its stops (−30, 0, 30), never both 0; a part's names exactly one
856
+ * parameter it has a warp keyform at, never at that parameter's default
857
+ * nor where the rig shuts the part on purpose (`SHUT_BY` at 0). */
858
+ at: Record<string, number>;
859
+ /** A rectangle in fractions of the REST layer box of `role`, origin
860
+ * top-left, x right, y DOWN; it may reach past the box (x < 0 or > 1).
861
+ * The target's points whose REST position lies inside take the whole of
862
+ * `by`. */
863
+ region: {
864
+ role: string;
865
+ x: [number, number];
866
+ y: [number, number];
867
+ };
868
+ /** In face widths (the `face` layer's crop width), screen axes: +dx toward
869
+ * the viewer's right (a character's `_L` side), +dy DOWN. */
870
+ by: {
871
+ dx: number;
872
+ dy: number;
873
+ };
874
+ /** Face widths past the region over which `by` eases to nothing; 0 or
875
+ * absent, a hard edge. */
876
+ falloff?: number;
877
+ /** Why the op exists, for whoever edits the patches next; the rig ignores
878
+ * it. */
879
+ why?: string;
880
+ }
881
+ /** What one op moved on the rig it was replayed on. */
882
+ interface PatchReport {
883
+ /** The op's index in `patches`. */
884
+ index: number;
885
+ target: string;
886
+ at: Record<string, number>;
887
+ /** Points (grid) or vertices (part) the op moved at all. */
888
+ moved: number;
889
+ /** All of the target's points or vertices. */
890
+ of: number;
891
+ /** Grid targets only: the lattice columns and rows the moved points span,
892
+ * 0 at the left and at the top. */
893
+ cols?: [number, number];
894
+ rows?: [number, number];
895
+ /** The largest move, model px. */
896
+ maxPx: number;
897
+ }
898
+ /** A patch op that is malformed or misses the rig: an unknown target, role,
899
+ * key or stop, the rest stop, a by-design closure, or a region that catches
900
+ * none of the target's points. Its message starts `patches[i]`. */
901
+ declare class PatchError extends Error {
902
+ constructor(message: string);
903
+ }
842
904
  interface HeadEdges {
843
905
  left: {
844
906
  role: string;
@@ -854,6 +916,12 @@ interface GenerateOptions {
854
916
  /** Per-character tuning from the profile's defaults (`profile.ts`). */
855
917
  style?: RigStyle;
856
918
  onTurnSolved?: (report: TurnSolveReport) => void;
919
+ /** Displacements added to the generated rig's stops (`RigPatch`), replayed
920
+ * on every rig; a refused op throws `PatchError` and rigs nothing. */
921
+ patches?: RigPatch[];
922
+ /** What each of `patches` moved, in order — called only when `patches` is
923
+ * given, and only for a model that validates. */
924
+ onPatchesApplied?: (report: PatchReport[]) => void;
857
925
  headEdges?: HeadEdges;
858
926
  strandEdges?: {
859
927
  left?: IrisStrand;
@@ -1004,6 +1072,13 @@ type LipRole = (typeof LIP_ROLES)[number];
1004
1072
  declare const LIP_INSIDE_ROLES: readonly ["mouth_tongue", "mouth_teeth"];
1005
1073
  type LipInsideRole = (typeof LIP_INSIDE_ROLES)[number];
1006
1074
  declare const isLipInsideRole: (role: string) => role is LipInsideRole;
1075
+ /**
1076
+ * The parts the auto-rig flattens on purpose, each with the parameter that
1077
+ * shuts it at 0: an eye's sclera and lower lid as ITS OWN lid closes, and the
1078
+ * lip set with its tongue and teeth as the mouth shuts. A fold check exempts
1079
+ * these closures; a patch may not land on them.
1080
+ */
1081
+ declare const SHUT_BY: ReadonlyMap<string, string>;
1007
1082
  /** The part ids a `role`'s layer becomes, back to front: every one of them
1008
1083
  * takes its texture from the layer's crop. Throws on an unknown role. */
1009
1084
  declare function partIdsOfRole(role: string): readonly string[];
@@ -1617,4 +1692,4 @@ declare function createGridMesh(cols: number, rows: number): IkiMesh;
1617
1692
  */
1618
1693
  declare function createDefaultWarpDeformer(model: IkiModel): IkiWarpDeformer;
1619
1694
 
1620
- export { ALPHA_BBOX_THRESHOLD, ALPHA_OPAQUE, ATLAS_PADDING, AddDeformer, AddPart, AddPhysicsRig, type AlphaBbox, type ApplyAtlasInput, type ArmGeometry, type AtlasAssignment, type AtlasLayout, type AtlasPlacement, type AtlasSource, CaptureGridKeyform, DEFAULT_TURN_TARGETS, type DeformerTransformChannel, DeleteDeformer, DeletePart, DeletePhysicsRig, type EditCommand, type EditTransformChannel, EditorDocument, type ForearmPoseGeometry, HEAD_BAND, type IrisStrand, LIP_INSIDE_ROLES, LIP_ROLES, LayerGeometryError, type LayerInput, type LayerSetMeasurement, type LayerSetMeasurer, type LipInsideRole, type LipRole, type Opening, type OpeningColumn, type RgbaLayer, type RigStyle, SPECK_CORE_FRACTION, SetDeformerBindings, SetDeformerParent, SetDeformerPivot, SetDeformerPivotX, SetDeformerPivotY, SetDeformerTransform, SetPartBindings, SetPartColor, SetPartDeformer, SetPartHeight, SetPartMesh, SetPartOrder, SetPartTransform, SetPartWidth, SetPhysicsRig, type StrandOverlap, type TurnDepths, type TurnSolveReport, TurnTargetError, type TurnTargets, UV_INSET_PX, armGeometry, captureBindingEndpoint, columnRuns, computeGridOffsets, createDefaultMatrixDeformer, createDefaultPart, createDefaultWarpDeformer, createGridMesh, createLayerSetMeasurer, denseCoreOf, detectAlphaBbox, forearmPoseGeometry, foregroundSpan, generateIkiFromLayerSet, headHalfOf, interpolateGridOffsets, isLipInsideRole, isSpeckCore, mouthFold, mouthOpening, mouthRestShift, packAtlas, parseLayerRoles, partIdsOfRole, upsertGridKeyform, uvRectFor, validateDeformerDelete, validateDeformerReparent, validatePartAttach };
1695
+ export { ALPHA_BBOX_THRESHOLD, ALPHA_OPAQUE, ATLAS_PADDING, AddDeformer, AddPart, AddPhysicsRig, type AlphaBbox, type ApplyAtlasInput, type ArmGeometry, type AtlasAssignment, type AtlasLayout, type AtlasPlacement, type AtlasSource, CaptureGridKeyform, DEFAULT_TURN_TARGETS, type DeformerTransformChannel, DeleteDeformer, DeletePart, DeletePhysicsRig, type EditCommand, type EditTransformChannel, EditorDocument, type ForearmPoseGeometry, HEAD_BAND, type IrisStrand, LIP_INSIDE_ROLES, LIP_ROLES, LayerGeometryError, type LayerInput, type LayerSetMeasurement, type LayerSetMeasurer, type LipInsideRole, type LipRole, type Opening, type OpeningColumn, PatchError, type PatchReport, type RgbaLayer, type RigPatch, type RigStyle, SHUT_BY, SPECK_CORE_FRACTION, SetDeformerBindings, SetDeformerParent, SetDeformerPivot, SetDeformerPivotX, SetDeformerPivotY, SetDeformerTransform, SetPartBindings, SetPartColor, SetPartDeformer, SetPartHeight, SetPartMesh, SetPartOrder, SetPartTransform, SetPartWidth, SetPhysicsRig, type StrandOverlap, type TurnDepths, type TurnSolveReport, TurnTargetError, type TurnTargets, UV_INSET_PX, armGeometry, captureBindingEndpoint, columnRuns, computeGridOffsets, createDefaultMatrixDeformer, createDefaultPart, createDefaultWarpDeformer, createGridMesh, createLayerSetMeasurer, denseCoreOf, detectAlphaBbox, forearmPoseGeometry, foregroundSpan, generateIkiFromLayerSet, headHalfOf, interpolateGridOffsets, isLipInsideRole, isSpeckCore, mouthFold, mouthOpening, mouthRestShift, packAtlas, parseLayerRoles, partIdsOfRole, upsertGridKeyform, uvRectFor, validateDeformerDelete, validateDeformerReparent, validatePartAttach };
package/dist/index.d.ts CHANGED
@@ -690,8 +690,8 @@ interface RigStyle {
690
690
 
691
691
  /**
692
692
  * The public shapes of the auto-rig: what a host hands `generateIkiFromLayerSet`
693
- * and what the turn solve reports back. Pixel measurement lives in
694
- * `layer-measure.ts`; everything here is already-decoded geometry.
693
+ * and what the turn solve and the patch replay report back. Pixel measurement
694
+ * lives in `layer-measure.ts`; everything here is already-decoded geometry.
695
695
  */
696
696
 
697
697
  /** One role layer, as a host measured it off its decoded pixels. */
@@ -839,6 +839,68 @@ interface TurnSolveReport {
839
839
  right?: StrandOverlap;
840
840
  };
841
841
  }
842
+ /**
843
+ * One `displace` op of the rig patch layer: a displacement ADDED to one
844
+ * EXISTING keyform stop of `target` on the freshly generated rig, so it is
845
+ * replayed on every re-rig over whatever the generator now bakes. Every other
846
+ * stop and the rest pose stay as generated; between stops the engine blends
847
+ * linearly, so a fix at AngleX −30 shows at half strength at −15.
848
+ */
849
+ interface RigPatch {
850
+ /** A feature grid (`eyeWarp_L`/`_R`, `browWarp_L`/`_R`, `noseWarp`,
851
+ * `mouthWarp`) or a mesh part with warps (`face`, `hair_front`, …). The
852
+ * body warp and the matrix deformers are not patchable. */
853
+ target: string;
854
+ /** The stop. A grid's names both `ParamAngleX` and `ParamAngleY`, each one
855
+ * of its stops (−30, 0, 30), never both 0; a part's names exactly one
856
+ * parameter it has a warp keyform at, never at that parameter's default
857
+ * nor where the rig shuts the part on purpose (`SHUT_BY` at 0). */
858
+ at: Record<string, number>;
859
+ /** A rectangle in fractions of the REST layer box of `role`, origin
860
+ * top-left, x right, y DOWN; it may reach past the box (x < 0 or > 1).
861
+ * The target's points whose REST position lies inside take the whole of
862
+ * `by`. */
863
+ region: {
864
+ role: string;
865
+ x: [number, number];
866
+ y: [number, number];
867
+ };
868
+ /** In face widths (the `face` layer's crop width), screen axes: +dx toward
869
+ * the viewer's right (a character's `_L` side), +dy DOWN. */
870
+ by: {
871
+ dx: number;
872
+ dy: number;
873
+ };
874
+ /** Face widths past the region over which `by` eases to nothing; 0 or
875
+ * absent, a hard edge. */
876
+ falloff?: number;
877
+ /** Why the op exists, for whoever edits the patches next; the rig ignores
878
+ * it. */
879
+ why?: string;
880
+ }
881
+ /** What one op moved on the rig it was replayed on. */
882
+ interface PatchReport {
883
+ /** The op's index in `patches`. */
884
+ index: number;
885
+ target: string;
886
+ at: Record<string, number>;
887
+ /** Points (grid) or vertices (part) the op moved at all. */
888
+ moved: number;
889
+ /** All of the target's points or vertices. */
890
+ of: number;
891
+ /** Grid targets only: the lattice columns and rows the moved points span,
892
+ * 0 at the left and at the top. */
893
+ cols?: [number, number];
894
+ rows?: [number, number];
895
+ /** The largest move, model px. */
896
+ maxPx: number;
897
+ }
898
+ /** A patch op that is malformed or misses the rig: an unknown target, role,
899
+ * key or stop, the rest stop, a by-design closure, or a region that catches
900
+ * none of the target's points. Its message starts `patches[i]`. */
901
+ declare class PatchError extends Error {
902
+ constructor(message: string);
903
+ }
842
904
  interface HeadEdges {
843
905
  left: {
844
906
  role: string;
@@ -854,6 +916,12 @@ interface GenerateOptions {
854
916
  /** Per-character tuning from the profile's defaults (`profile.ts`). */
855
917
  style?: RigStyle;
856
918
  onTurnSolved?: (report: TurnSolveReport) => void;
919
+ /** Displacements added to the generated rig's stops (`RigPatch`), replayed
920
+ * on every rig; a refused op throws `PatchError` and rigs nothing. */
921
+ patches?: RigPatch[];
922
+ /** What each of `patches` moved, in order — called only when `patches` is
923
+ * given, and only for a model that validates. */
924
+ onPatchesApplied?: (report: PatchReport[]) => void;
857
925
  headEdges?: HeadEdges;
858
926
  strandEdges?: {
859
927
  left?: IrisStrand;
@@ -1004,6 +1072,13 @@ type LipRole = (typeof LIP_ROLES)[number];
1004
1072
  declare const LIP_INSIDE_ROLES: readonly ["mouth_tongue", "mouth_teeth"];
1005
1073
  type LipInsideRole = (typeof LIP_INSIDE_ROLES)[number];
1006
1074
  declare const isLipInsideRole: (role: string) => role is LipInsideRole;
1075
+ /**
1076
+ * The parts the auto-rig flattens on purpose, each with the parameter that
1077
+ * shuts it at 0: an eye's sclera and lower lid as ITS OWN lid closes, and the
1078
+ * lip set with its tongue and teeth as the mouth shuts. A fold check exempts
1079
+ * these closures; a patch may not land on them.
1080
+ */
1081
+ declare const SHUT_BY: ReadonlyMap<string, string>;
1007
1082
  /** The part ids a `role`'s layer becomes, back to front: every one of them
1008
1083
  * takes its texture from the layer's crop. Throws on an unknown role. */
1009
1084
  declare function partIdsOfRole(role: string): readonly string[];
@@ -1617,4 +1692,4 @@ declare function createGridMesh(cols: number, rows: number): IkiMesh;
1617
1692
  */
1618
1693
  declare function createDefaultWarpDeformer(model: IkiModel): IkiWarpDeformer;
1619
1694
 
1620
- export { ALPHA_BBOX_THRESHOLD, ALPHA_OPAQUE, ATLAS_PADDING, AddDeformer, AddPart, AddPhysicsRig, type AlphaBbox, type ApplyAtlasInput, type ArmGeometry, type AtlasAssignment, type AtlasLayout, type AtlasPlacement, type AtlasSource, CaptureGridKeyform, DEFAULT_TURN_TARGETS, type DeformerTransformChannel, DeleteDeformer, DeletePart, DeletePhysicsRig, type EditCommand, type EditTransformChannel, EditorDocument, type ForearmPoseGeometry, HEAD_BAND, type IrisStrand, LIP_INSIDE_ROLES, LIP_ROLES, LayerGeometryError, type LayerInput, type LayerSetMeasurement, type LayerSetMeasurer, type LipInsideRole, type LipRole, type Opening, type OpeningColumn, type RgbaLayer, type RigStyle, SPECK_CORE_FRACTION, SetDeformerBindings, SetDeformerParent, SetDeformerPivot, SetDeformerPivotX, SetDeformerPivotY, SetDeformerTransform, SetPartBindings, SetPartColor, SetPartDeformer, SetPartHeight, SetPartMesh, SetPartOrder, SetPartTransform, SetPartWidth, SetPhysicsRig, type StrandOverlap, type TurnDepths, type TurnSolveReport, TurnTargetError, type TurnTargets, UV_INSET_PX, armGeometry, captureBindingEndpoint, columnRuns, computeGridOffsets, createDefaultMatrixDeformer, createDefaultPart, createDefaultWarpDeformer, createGridMesh, createLayerSetMeasurer, denseCoreOf, detectAlphaBbox, forearmPoseGeometry, foregroundSpan, generateIkiFromLayerSet, headHalfOf, interpolateGridOffsets, isLipInsideRole, isSpeckCore, mouthFold, mouthOpening, mouthRestShift, packAtlas, parseLayerRoles, partIdsOfRole, upsertGridKeyform, uvRectFor, validateDeformerDelete, validateDeformerReparent, validatePartAttach };
1695
+ export { ALPHA_BBOX_THRESHOLD, ALPHA_OPAQUE, ATLAS_PADDING, AddDeformer, AddPart, AddPhysicsRig, type AlphaBbox, type ApplyAtlasInput, type ArmGeometry, type AtlasAssignment, type AtlasLayout, type AtlasPlacement, type AtlasSource, CaptureGridKeyform, DEFAULT_TURN_TARGETS, type DeformerTransformChannel, DeleteDeformer, DeletePart, DeletePhysicsRig, type EditCommand, type EditTransformChannel, EditorDocument, type ForearmPoseGeometry, HEAD_BAND, type IrisStrand, LIP_INSIDE_ROLES, LIP_ROLES, LayerGeometryError, type LayerInput, type LayerSetMeasurement, type LayerSetMeasurer, type LipInsideRole, type LipRole, type Opening, type OpeningColumn, PatchError, type PatchReport, type RgbaLayer, type RigPatch, type RigStyle, SHUT_BY, SPECK_CORE_FRACTION, SetDeformerBindings, SetDeformerParent, SetDeformerPivot, SetDeformerPivotX, SetDeformerPivotY, SetDeformerTransform, SetPartBindings, SetPartColor, SetPartDeformer, SetPartHeight, SetPartMesh, SetPartOrder, SetPartTransform, SetPartWidth, SetPhysicsRig, type StrandOverlap, type TurnDepths, type TurnSolveReport, TurnTargetError, type TurnTargets, UV_INSET_PX, armGeometry, captureBindingEndpoint, columnRuns, computeGridOffsets, createDefaultMatrixDeformer, createDefaultPart, createDefaultWarpDeformer, createGridMesh, createLayerSetMeasurer, denseCoreOf, detectAlphaBbox, forearmPoseGeometry, foregroundSpan, generateIkiFromLayerSet, headHalfOf, interpolateGridOffsets, isLipInsideRole, isSpeckCore, mouthFold, mouthOpening, mouthRestShift, packAtlas, parseLayerRoles, partIdsOfRole, upsertGridKeyform, uvRectFor, validateDeformerDelete, validateDeformerReparent, validatePartAttach };