UNPKG

babylon-mmd

Version:
141 lines (140 loc) 4.28 kB
import type { TransformNode } from "@babylonjs/core/Meshes/transformNode"; import type { Nullable } from "@babylonjs/core/types"; import type { MmdModelMetadata } from "../../Loader/mmdModelMetadata"; import { AlignedDataSerializer } from "../../Loader/Optimized/alignedDataSerializer"; import type { ILogger } from "../ILogger"; import type { IMmdRuntimeLinkedBone } from "../IMmdRuntimeLinkedBone"; import type { MmdMesh } from "../mmdMesh"; import type { IMmdModelPhysicsCreationOptions } from "../mmdRuntime"; /** * mmd model metadata representation in binary * * boneCount: uint32 * appendTransformCount: uint32 * ikCount: uint32 * { * restPosition: float32[3] * absoluteInverseBindMatrix: float32[16] * parentBoneIndex: int32 * transformOrder: int32 * flag: uint16 * -- padding: uint16 * appendTransform: { // optional * parentIndex: int32 * ratio: float32 * } * axisLimit: { // optional * axis: float32[3] * } * ik: { // optional * target: int32 * iteration: int32 * rotationConstraint: float32 * linkCount: uint32 * { * target: int32 * hasLimitation: uint8 * -- padding: uint8 * -- padding: uint16 * limitation: { // optional * minimumAngle: float32[3] * maximumAngle: float32[3] * } * }[linkCount] * } * }[boneCount] * * morphCount: uint32 * { // if boneMorph * kind: uint8 * -- padding: uint8 * -- padding: uint16 * boneCount: uint32 * indices: int32[boneCount] * positions: float32[boneCount * 3] * rotations: float32[boneCount * 4] * } | { // if groupMorph * kind: uint8 * -- padding: uint8 * -- padding: uint16 * indexCount: uint32 * indices: int32[indexCount] * ratios: float32[indexCount] * }[morphCount] * * physicsInfoKind: uint8 // 0: no physics, 1: striped rigid bodies, 2: full physics * -- padding: uint8 * -- padding: uint16 * * { // if physicsInfoKind === 1 * rigidBodyCount: uint32 * { * boneIndex: int32 * physicsMode: uint8 * -- padding: uint8 * -- padding: uint16 * }[rigidBodyCount] * } * { // if physicsInfoKind === 2 * physicsWorldId: uint32 * kinematicSharedPhysicsWorldIdCount: uint32 * kinematicSharedPhysicsWorldIds: uint32[kinematicSharedPhysicsWorldIdCount] * modelInitialWorldMatrix: float32[16] * disableOffsetForConstraintFrame: uint8 * -- padding: uint8 * -- padding: uint16 * * rigidBodyCount: uint32 * { * boneIndex: int32 * collisionGroup: uint8 * shapeType: uint8 * collisionMask: uint16 * shapeSize: float32[4] * shapePosition: float32[3] * shapeRotation: float32[3] * mass: float32 * linearDamping: float32 * angularDamping: float32 * repulsion: float32 * friction: float32 * physicsMode: uint8 * -- padding: uint8 * -- padding: uint16 * }[rigidBodyCount] * * jointCount: uint32 * { * type: uint8 * -- padding: uint8 * -- padding: uint16 * rigidBodyIndexA: int32 * rigidBodyIndexB: int32 * position: float32[3] * rotation: float32[3] * positionMin: float32[3] * positionMax: float32[3] * rotationMin: float32[3] * rotationMax: float32[3] * springPosition: float32[3] * springRotation: float32[3] * }[jointCount] * } */ /** * @internal */ export declare class MmdMetadataEncoder { protected readonly _logger: ILogger; protected _encodePhysicsOptions: IMmdModelPhysicsCreationOptions | boolean; constructor(logger: ILogger); setEncodePhysicsOptions(options: IMmdModelPhysicsCreationOptions | boolean): void; protected _computeBonesSize(metadata: MmdModelMetadata): number; protected _computeMorphsSize(metadata: MmdModelMetadata): number; protected _computePhysicsSize(metadata: Nullable<MmdModelMetadata>): number; computeSize(mmdMesh: MmdMesh): number; protected _encodeBones(serializer: AlignedDataSerializer, metadata: MmdModelMetadata, linkedBones: IMmdRuntimeLinkedBone[]): void; protected _encodeMorphs(serializer: AlignedDataSerializer, metadata: MmdModelMetadata): Int32Array; protected _encodePhysics(serializer: AlignedDataSerializer, metadata: Nullable<MmdModelMetadata>, _rootTransform: TransformNode): void; encode(mmdMesh: MmdMesh, linkedBones: IMmdRuntimeLinkedBone[], buffer: Uint8Array): Int32Array; }