mdx-m3-viewer
Version:
A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.
144 lines (143 loc) • 6.59 kB
TypeScript
import BinaryStream from '../../common/binarystream';
import TokenStream from './tokenstream';
import Extent from './extent';
import Sequence from './sequence';
import Material from './material';
import Texture from './texture';
import TextureAnimation from './textureanimation';
import Geoset from './geoset';
import GeosetAnimation from './geosetanimation';
import GenericObject from './genericobject';
import Bone from './bone';
import Light from './light';
import Helper from './helper';
import Attachment from './attachment';
import ParticleEmitter from './particleemitter';
import ParticleEmitter2 from './particleemitter2';
import ParticleEmitterPopcorn from './particleemitterpopcorn';
import RibbonEmitter from './ribbonemitter';
import Camera from './camera';
import EventObject from './eventobject';
import CollisionShape from './collisionshape';
import FaceEffect from './faceeffect';
import UnknownChunk from './unknownchunk';
declare type MdxStaticObject = Sequence | Texture | FaceEffect;
declare type MdxDynamicObject = Material | TextureAnimation | Geoset | GeosetAnimation | Bone | Light | Helper | Attachment | ParticleEmitter | ParticleEmitter2 | RibbonEmitter | Camera | EventObject | CollisionShape | ParticleEmitterPopcorn;
declare type MdlNumberedObject = Sequence | Texture | Material | TextureAnimation;
declare type MdlObject = Geoset | GeosetAnimation | Bone | Light | Helper | Attachment | ParticleEmitter | ParticleEmitter2 | RibbonEmitter | Camera | EventObject | CollisionShape | FaceEffect;
/**
* A Warcraft 3 model.
* Supports loading from and saving to both the binary MDX and text MDL file formats.
*/
export default class Model {
/**
* 800 for Warcraft 3: RoC and TFT.
* >800 for Warcraft 3: Reforged.
*/
version: number;
name: string;
/**
* To the best of my knowledge, this should always be left empty.
*/
animationFile: string;
extent: Extent;
/**
* This is only used by the now-defunct previewer that came with Art Tools.
*/
blendTime: number;
sequences: Sequence[];
globalSequences: number[];
materials: Material[];
textures: Texture[];
textureAnimations: TextureAnimation[];
geosets: Geoset[];
geosetAnimations: GeosetAnimation[];
bones: Bone[];
lights: Light[];
helpers: Helper[];
attachments: Attachment[];
pivotPoints: Float32Array[];
particleEmitters: ParticleEmitter[];
particleEmitters2: ParticleEmitter2[];
/**
* @since 900
*/
particleEmittersPopcorn: ParticleEmitterPopcorn[];
ribbonEmitters: RibbonEmitter[];
cameras: Camera[];
eventObjects: EventObject[];
collisionShapes: CollisionShape[];
/**
* @since 900
*/
faceEffects: FaceEffect[];
/**
* @since 900
*/
bindPose: Float32Array[];
/**
* The MDX format is chunk based, and Warcraft 3 does not mind there being unknown chunks in there.
* Some 3rd party tools use this to attach metadata to models.
* When an unknown chunk is encountered, it will be added here.
* These chunks will be saved when saving as MDX.
*/
unknownChunks: UnknownChunk[];
/**
* Load the model from MDX or MDL.
* The format is detected automatically.
*/
load(buffer: ArrayBuffer | Uint8Array | string): void;
/**
* Load the model from MDX.
*/
loadMdx(buffer: ArrayBuffer | Uint8Array): void;
loadVersionChunk(stream: BinaryStream): void;
loadModelChunk(stream: BinaryStream): void;
loadStaticObjects<T extends MdxStaticObject>(out: T[], constructor: new () => T, stream: BinaryStream, count: number): void;
loadGlobalSequenceChunk(stream: BinaryStream, size: number): void;
loadDynamicObjects<T extends MdxDynamicObject>(out: T[], constructor: new () => T, stream: BinaryStream, size: number): void;
loadPivotPointChunk(stream: BinaryStream, size: number): void;
loadBindPoseChunk(stream: BinaryStream, _size: number): void;
/**
* Save the model as MDX.
*/
saveMdx(): Uint8Array;
saveVersionChunk(stream: BinaryStream): void;
saveModelChunk(stream: BinaryStream): void;
saveStaticObjectChunk(stream: BinaryStream, name: string, objects: (Sequence | Texture | FaceEffect)[], size: number): void;
saveGlobalSequenceChunk(stream: BinaryStream): void;
saveDynamicObjectChunk(stream: BinaryStream, name: string, objects: (Material | TextureAnimation | Geoset | GeosetAnimation | GenericObject | Camera)[]): void;
savePivotPointChunk(stream: BinaryStream): void;
saveBindPoseChunk(stream: BinaryStream): void;
/**
* Load the model from MDL.
*/
loadMdl(buffer: string): void;
loadVersionBlock(stream: TokenStream): void;
loadModelBlock(stream: TokenStream): void;
loadNumberedObjectBlock<T extends MdlNumberedObject>(out: T[], constructor: new () => T, name: string, stream: TokenStream): void;
loadGlobalSequenceBlock(stream: TokenStream): void;
loadObject<T extends MdlObject>(out: T[], constructor: new () => T, stream: TokenStream): void;
loadPivotPointBlock(stream: TokenStream): void;
loadBindPoseBlock(stream: TokenStream): void;
/**
* Save the model as MDL.
*/
saveMdl(): string;
saveVersionBlock(stream: TokenStream): void;
saveModelBlock(stream: TokenStream): void;
saveStaticObjectsBlock(stream: TokenStream, name: string, objects: (Sequence | Texture | Material | TextureAnimation)[]): void;
saveGlobalSequenceBlock(stream: TokenStream): void;
saveObjects(stream: TokenStream, objects: (Geoset | GeosetAnimation | Bone | Light | Helper | Attachment | ParticleEmitter | ParticleEmitter2 | RibbonEmitter | Camera | EventObject | CollisionShape | FaceEffect)[]): void;
savePivotPointBlock(stream: TokenStream): void;
saveBindPoseBlock(stream: TokenStream): void;
/**
* Calculate the size of the model as MDX.
*/
getByteLength(): number;
getObjectsByteLength(objects: (Material | TextureAnimation | Geoset | GeosetAnimation | GenericObject | Camera | UnknownChunk)[]): number;
getDynamicObjectsChunkByteLength(objects: (Material | TextureAnimation | Geoset | GeosetAnimation | GenericObject | Camera | UnknownChunk)[]): number;
getStaticObjectsChunkByteLength(objects: (Sequence | number | Texture | Float32Array | FaceEffect)[], size: number): number;
getBindPoseChunkByteLength(): number;
}
export {};