From 7bbf61c57f9e9f2cf52fbffd46ec70cbb3102e78 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Fri, 26 Jan 2024 22:12:43 -0600 Subject: [PATCH] feat(model): load bones and bone animations --- src/lib/model/M2Model.ts | 20 ++++++++++++++++++-- src/lib/model/io/m2.ts | 6 +++--- src/lib/model/types.ts | 14 +++++++++++++- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/lib/model/M2Model.ts b/src/lib/model/M2Model.ts index 456d635..e4cfb5d 100644 --- a/src/lib/model/M2Model.ts +++ b/src/lib/model/M2Model.ts @@ -2,7 +2,7 @@ import { IoMode, IoSource, openStream } from '@wowserhq/io'; import * as io from '@wowserhq/io'; import * as m2Io from './io/m2.js'; import { M2_MODEL_FLAG } from './const.js'; -import { M2Track, M2TextureTransform, M2TextureWeight, M2Color } from './types.js'; +import { M2Track, M2TextureTransform, M2TextureWeight, M2Color, M2Bone } from './types.js'; import M2Texture, { M2_TEXTURE_COMBINER, M2_TEXTURE_COORD } from './M2Texture.js'; import M2Material from './M2Material.js'; import { m2typedArray } from './io/common.js'; @@ -12,10 +12,15 @@ import M2Bounds from './M2Bounds.js'; class M2Model { #name: string; #flags: number; + #vertices: ArrayBuffer; + #bounds: M2Bounds; #collisionBounds: M2Bounds; + #bones: M2Bone[] = []; + #boneIndicesById: Uint16Array; + #textures: M2Texture[] = []; #textureCombos: number[] = []; #textureCoordCombos: M2_TEXTURE_COORD[] = []; @@ -33,6 +38,14 @@ class M2Model { #sequences: M2Sequence[] = []; #loops: Uint32Array; + get bones() { + return this.#bones; + } + + get boneIndicesById() { + return this.#boneIndicesById; + } + get bounds() { return this.#bounds; } @@ -127,6 +140,9 @@ class M2Model { this.#bounds = new M2Bounds(data.bounds.extent, data.bounds.radius); this.#collisionBounds = new M2Bounds(data.collisionBounds.extent, data.collisionBounds.radius); + this.#bones = data.bones; + this.#boneIndicesById = data.boneIndicesById; + this.#textureCombos = data.textureCombos; this.#textureCoordCombos = data.textureCoordCombos; this.#textureWeightCombos = data.textureWeightCombos; @@ -179,4 +195,4 @@ class M2Model { } export default M2Model; -export { M2Model, M2Track, M2Color, M2TextureWeight, M2TextureTransform, M2_MODEL_FLAG }; +export { M2Model, M2Track, M2Bone, M2Color, M2TextureWeight, M2TextureTransform, M2_MODEL_FLAG }; diff --git a/src/lib/model/io/m2.ts b/src/lib/model/io/m2.ts index d5dfce8..cc24dfe 100644 --- a/src/lib/model/io/m2.ts +++ b/src/lib/model/io/m2.ts @@ -18,10 +18,10 @@ const m2sequence = io.struct({ }); const m2compBone = io.struct({ - keyBoneId: io.int32le, + boneId: io.int32le, flags: io.uint32le, - parentBone: io.int16le, - submeshId: io.uint16le, + parentIndex: io.int16le, + distToParent: io.uint16le, boneNameCrc: io.uint32le, translationTrack: m2track(io.float32le, 3), rotationTrack: m2track(io.int16le, 4), diff --git a/src/lib/model/types.ts b/src/lib/model/types.ts index 575ec46..8f2cac9 100644 --- a/src/lib/model/types.ts +++ b/src/lib/model/types.ts @@ -5,6 +5,18 @@ type M2Track = { sequenceKeys: T[]; }; +type M2Bone = { + boneId: number; + flags: number; + parentIndex: number; + distToParent: number; + boneNameCrc: number; + pivot: Float32Array; + translationTrack: M2Track; + rotationTrack: M2Track; + scaleTrack: M2Track; +}; + type M2Color = { colorTrack: M2Track; alphaTrack: M2Track; @@ -20,4 +32,4 @@ type M2TextureWeight = { weightTrack: M2Track; }; -export { M2Track, M2Color, M2TextureTransform, M2TextureWeight }; +export { M2Track, M2Bone, M2Color, M2TextureTransform, M2TextureWeight };