babylon-mmd
Version:
babylon.js mmd loader and runtime
141 lines (140 loc) • 4.28 kB
TypeScript
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;
}