UNPKG

mdx-m3-viewer

Version:

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

89 lines (78 loc) 1.82 kB
/** * A bit stream. */ export default class BitStream { /** * @constructor * @param {ArrayBuffer|ArrayBufferView} buffer * @param {number=} byteOffset * @param {number=} byteLength */ constructor(buffer, byteOffset, byteLength) { // If given a view, use its properties. if (ArrayBuffer.isView(buffer)) { buffer = buffer.buffer; byteOffset = buffer.byteOffset; byteLength = buffer.byteLength; } if (!(buffer instanceof ArrayBuffer)) { throw new TypeError(`BitStream: expected ArrayBuffer or ArrayBufferView, got ${buffer}`); } /** @member {ArrayBuffer} */ this.buffer = buffer; /** @member {Uint8Array} */ this.uint8array = new Uint8Array(buffer, byteOffset, byteLength); /** @member {number} */ this.index = 0; /** @member {number} */ this.byteLength = buffer.byteLength; /** @member {number} */ this.bitBuffer = 0; /** @member {number} */ this.bits = 0; } /** * Peek a number of bits. * * @param {number} bits * @return {number} */ peekBits(bits) { this.loadBits(bits); return this.bitBuffer & ((1 << bits) - 1); } /** * Read a number of bits. * * @param {number} bits * @return {number} */ readBits(bits) { let data = this.peekBits(bits); this.bitBuffer >>>= bits; this.bits -= bits; return data; } /** * Skip a number of bits. * * @param {number} bits */ skipBits(bits) { this.loadBits(bits); this.bitBuffer >>>= bits; this.bits -= bits; } /** * Load more bits into the buffer. * * @param {number} bits */ loadBits(bits) { while (this.bits < bits) { this.bitBuffer += this.uint8array[this.index] << this.bits; this.bits += 8; this.index += 1; } } }