UNPKG

mdx-m3-viewer

Version:

A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.

96 lines (73 loc) 2.46 kB
import BinaryStream from '../../../common/binarystream'; import Corner from './corner'; /** * war3map.w3e - the environment file. */ export default class War3MapW3e { version: number = 0; tileset: string = 'A'; haveCustomTileset: number = 0; groundTilesets: string[] = []; cliffTilesets: string[] = []; mapSize: Int32Array = new Int32Array(2); centerOffset: Float32Array = new Float32Array(2); corners: Corner[][] = []; constructor(buffer?: ArrayBuffer) { if (buffer) { this.load(buffer); } } load(buffer: ArrayBuffer) { let stream = new BinaryStream(buffer); if (stream.read(4) !== 'W3E!') { return false; } this.version = stream.readInt32(); this.tileset = stream.read(1); this.haveCustomTileset = stream.readInt32(); for (let i = 0, l = stream.readInt32(); i < l; i++) { this.groundTilesets[i] = stream.read(4); } for (let i = 0, l = stream.readInt32(); i < l; i++) { this.cliffTilesets[i] = stream.read(4); } stream.readInt32Array(this.mapSize); stream.readFloat32Array(this.centerOffset); for (let row = 0, rows = this.mapSize[1]; row < rows; row++) { this.corners[row] = []; for (let column = 0, columns = this.mapSize[0]; column < columns; column++) { let corner = new Corner(); corner.load(stream); this.corners[row][column] = corner; } } return true; } save() { let buffer = new ArrayBuffer(this.getByteLength()); let stream = new BinaryStream(buffer); stream.write('W3E!'); stream.writeInt32(this.version); stream.write(this.tileset); stream.writeInt32(this.haveCustomTileset); stream.writeUint32(this.groundTilesets.length); for (let groundTileset of this.groundTilesets) { stream.write(groundTileset); } stream.writeUint32(this.cliffTilesets.length); for (let cliffTileset of this.cliffTilesets) { stream.write(cliffTileset); } stream.writeInt32Array(this.mapSize); stream.writeFloat32Array(this.centerOffset); for (let row of this.corners) { for (let corner of row) { corner.save(stream); } } return buffer; } getByteLength() { return 37 + (this.groundTilesets.length * 4) + (this.cliffTilesets.length * 4) + (this.mapSize[0] * this.mapSize[1] * 7); } }