UNPKG

mdx-m3-viewer

Version:

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

86 lines (73 loc) 2.52 kB
import {vec3} from 'gl-matrix'; import {FLOATS_PER_OBJECT, FLOAT_OFFSET_P0, FLOAT_OFFSET_HEALTH} from './geometryemitter'; const vertexHeap = vec3.create(); /** * An MDX splat or ubersplat object. */ export default class EventObjectSplUbr { /** * @param {EventObjectSplEmitter|EventObjectUbrEmitter} emitter */ constructor(emitter) { this.emitter = emitter; this.emitterView = null; this.health = 0; this.vertices = new Float32Array(12); } /** * @param {EventObjectEmitterView} emitterView */ bind(emitterView) { let modelObject = this.emitter.modelObject; let vertices = this.vertices; let scale = modelObject.scale; let node = emitterView.instance.nodes[modelObject.index]; let worldMatrix = node.worldMatrix; this.emitterView = emitterView; this.health = modelObject.lifeSpan; // Note that the order here isn't the same as particles/ribbons. vertexHeap[0] = scale; vertexHeap[1] = scale; vertexHeap[2] = 0; vec3.transformMat4(vertices.subarray(0, 2), vertexHeap, worldMatrix); vertexHeap[0] = -scale; vertexHeap[1] = scale; vertexHeap[2] = 0; vec3.transformMat4(vertices.subarray(3, 5), vertexHeap, worldMatrix); vertexHeap[0] = -scale; vertexHeap[1] = -scale; vertexHeap[2] = 0; vec3.transformMat4(vertices.subarray(6, 8), vertexHeap, worldMatrix); vertexHeap[0] = scale; vertexHeap[1] = -scale; vertexHeap[2] = 0; vec3.transformMat4(vertices.subarray(9, 11), vertexHeap, worldMatrix); } /** * @param {number} offset * @param {number} dt */ render(offset, dt) { this.health -= dt; if (this.health > 0) { let emitter = this.emitter; let floatView = emitter.floatView; let floatOffset = offset * FLOATS_PER_OBJECT; let p0Offset = floatOffset + FLOAT_OFFSET_P0; let vertices = this.vertices; floatView[p0Offset + 0] = vertices[0]; floatView[p0Offset + 1] = vertices[1]; floatView[p0Offset + 2] = vertices[2]; floatView[p0Offset + 3] = vertices[3]; floatView[p0Offset + 4] = vertices[4]; floatView[p0Offset + 5] = vertices[5]; floatView[p0Offset + 6] = vertices[6]; floatView[p0Offset + 7] = vertices[7]; floatView[p0Offset + 8] = vertices[8]; floatView[p0Offset + 9] = vertices[9]; floatView[p0Offset + 10] = vertices[10]; floatView[p0Offset + 11] = vertices[11]; floatView[floatOffset + FLOAT_OFFSET_HEALTH] = this.health; } } }