UNPKG

mdx-m3-viewer

Version:

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

160 lines (133 loc) 4.45 kB
import GenericObject from './genericobject'; import {emitterFilterMode} from './filtermode'; import replaceableIds from './replaceableids'; /** * An MDX particle emitter type 2. */ export default class ParticleEmitter2 extends GenericObject { /** * @param {MdxModel} model * @param {MdxParserParticleEmitter2} emitter * @param {number} index */ constructor(model, emitter, index) { super(model, emitter, index); this.width = emitter.width; this.length = emitter.length; this.speed = emitter.speed; this.latitude = emitter.latitude; this.gravity = emitter.gravity; this.emissionRate = emitter.emissionRate; this.squirt = emitter.squirt; this.lifeSpan = emitter.lifeSpan; this.variation = emitter.variation; this.tailLength = emitter.tailLength; this.timeMiddle = emitter.timeMiddle; let replaceableId = emitter.replaceableId; this.dimensions = [emitter.columns, emitter.rows]; this.columns = emitter.columns; this.rows = emitter.rows; this.teamColored = false; if (replaceableId === 0) { this.internalResource = model.textures[emitter.textureId]; } else if (replaceableId === 1 || replaceableId === 2) { if (replaceableId === 1) { this.internalResource = model.viewer.get('teamColors'); } else { this.internalResource = model.viewer.get('teamGlows'); } this.dimensions[0] = 14; this.dimensions[1] = 1; this.teamColored = true; this.columns = 14; this.rows = 1; } else { this.internalResource = model.viewer.load('ReplaceableTextures\\' + replaceableIds[replaceableId] + '.blp', model.pathSolver); } this.replaceableId = emitter.replaceableId; let headOrTail = emitter.headOrTail; this.head = (headOrTail === 0 || headOrTail === 2); this.tail = (headOrTail === 1 || headOrTail === 2); this.cellWidth = 1 / emitter.columns; this.cellHeight = 1 / emitter.rows; this.colors = []; this.floatColors = []; let colors = emitter.segmentColors; let alpha = emitter.segmentAlphas; for (let i = 0; i < 3; i++) { this.colors[i] = new Uint8Array([Math.min(colors[i][0], 1) * 255, Math.min(colors[i][1], 1) * 255, Math.min(colors[i][2], 1) * 255, alpha[i]]); this.floatColors[i] = new Float32Array([colors[i][0], colors[i][1], colors[i][2], alpha[i] / 255]); } this.scaling = emitter.segmentScaling; this.intervals = [...emitter.headIntervals, ...emitter.tailIntervals]; this.lineEmitter = emitter.flags & 0x20000; this.modelSpace = emitter.flags & 0x80000; this.xYQuad = emitter.flags & 0x100000; [this.blendSrc, this.blendDst] = emitterFilterMode(emitter.filterMode, this.model.viewer.gl); this.priorityPlane = emitter.priorityPlane; } /** * @param {Float32Array} out * @param {ModelInstance} instance * @return {number} */ getWidth(out, instance) { return this.getFloatValue(out, 'KP2W', instance, this.width); } /** * @param {Float32Array} out * @param {ModelInstance} instance * @return {number} */ getLength(out, instance) { return this.getFloatValue(out, 'KP2N', instance, this.length); } /** * @param {Float32Array} out * @param {ModelInstance} instance * @return {number} */ getSpeed(out, instance) { return this.getFloatValue(out, 'KP2S', instance, this.speed); } /** * @param {Float32Array} out * @param {ModelInstance} instance * @return {number} */ getLatitude(out, instance) { return this.getFloatValue(out, 'KP2L', instance, this.latitude); } /** * @param {Float32Array} out * @param {ModelInstance} instance * @return {number} */ getGravity(out, instance) { return this.getFloatValue(out, 'KP2G', instance, this.gravity); } /** * @param {Float32Array} out * @param {ModelInstance} instance * @return {number} */ getEmissionRate(out, instance) { return this.getFloatValue(out, 'KP2E', instance, this.emissionRate); } /** * @param {Float32Array} out * @param {ModelInstance} instance * @return {number} */ getVisibility(out, instance) { return this.getFloatValue(out, 'KP2V', instance, 1); } /** * @param {Float32Array} out * @param {ModelInstance} instance * @return {number} */ getVariation(out, instance) { return this.getFloatValue(out, 'KP2R', instance, this.variation); } }