UNPKG

@gltf-transform/core

Version:

glTF 2.0 SDK for JavaScript and TypeScript, on Web and Node.js.

88 lines (76 loc) 2.77 kB
import { RefSet } from 'property-graph'; import { BufferViewUsage, type Nullable, PropertyType } from '../constants.js'; import type { Accessor } from './accessor.js'; import { ExtensibleProperty, type IExtensibleProperty } from './extensible-property.js'; import type { Node } from './node.js'; interface ISkin extends IExtensibleProperty { skeleton: Node; inverseBindMatrices: Accessor; joints: RefSet<Node>; } /** * *Collection of {@link Node} joints and inverse bind matrices used with skinned {@link Mesh} * instances.* * * Reference * - [glTF → Skins](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#skins) * * @category Properties */ export class Skin extends ExtensibleProperty<ISkin> { public declare propertyType: PropertyType.SKIN; protected init(): void { this.propertyType = PropertyType.SKIN; } protected getDefaults(): Nullable<ISkin> { return Object.assign(super.getDefaults() as IExtensibleProperty, { skeleton: null, inverseBindMatrices: null, joints: new RefSet<Node>(), }); } /** * {@link Node} used as a skeleton root. The node must be the closest common root of the joints * hierarchy or a direct or indirect parent node of the closest common root. */ public getSkeleton(): Node | null { return this.getRef('skeleton'); } /** * {@link Node} used as a skeleton root. The node must be the closest common root of the joints * hierarchy or a direct or indirect parent node of the closest common root. */ public setSkeleton(skeleton: Node | null): this { return this.setRef('skeleton', skeleton); } /** * {@link Accessor} containing the floating-point 4x4 inverse-bind matrices. The default is * that each matrix is a 4x4 identity matrix, which implies that inverse-bind matrices were * pre-applied. */ public getInverseBindMatrices(): Accessor | null { return this.getRef('inverseBindMatrices'); } /** * {@link Accessor} containing the floating-point 4x4 inverse-bind matrices. The default is * that each matrix is a 4x4 identity matrix, which implies that inverse-bind matrices were * pre-applied. */ public setInverseBindMatrices(inverseBindMatrices: Accessor | null): this { return this.setRef('inverseBindMatrices', inverseBindMatrices, { usage: BufferViewUsage.INVERSE_BIND_MATRICES, }); } /** Adds a joint {@link Node} to this {@link Skin}. */ public addJoint(joint: Node): this { return this.addRef('joints', joint); } /** Removes a joint {@link Node} from this {@link Skin}. */ public removeJoint(joint: Node): this { return this.removeRef('joints', joint); } /** Lists joints ({@link Node}s used as joints or bones) in this {@link Skin}. */ public listJoints(): Node[] { return this.listRefs('joints'); } }