mdx-m3-viewer
Version:
A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.
84 lines (69 loc) • 2.49 kB
JavaScript
import {GeometryEmitter, EMITTER_PARTICLE2} from './geometryemitter';
import Particle2 from './particle2';
/**
* An MDX particle emitter type 2.
*/
export default class ParticleEmitter2 extends GeometryEmitter {
/**
* @param {ParticleEmitter2View} emitterView
*/
emit(emitterView) {
if (this.modelObject.head) {
this.emitObject(emitterView, 0);
}
if (this.modelObject.tail) {
this.emitObject(emitterView, 1);
}
}
/**
* @return {Particle2}
*/
createObject() {
return new Particle2(this);
}
/**
* @param {ModelView} modelView
* @param {ShaderProgram} shader
*/
bind(modelView, shader) {
let camera = this.modelViewData.scene.camera;
let modelObject = this.modelObject;
let model = modelObject.model;
let gl = model.viewer.gl;
let uniforms = shader.uniforms;
let colors = modelObject.floatColors;
let intervals = modelObject.intervals;
let vectors;
gl.blendFunc(modelObject.blendSrc, modelObject.blendDst);
modelView.bindTexture(modelObject.internalResource, 0);
// Choose between a default rectangle or a billboarded one
if (modelObject.xYQuad) {
vectors = camera.vectors;
} else {
vectors = camera.billboardedVectors;
}
gl.uniform1f(uniforms.u_emitter, EMITTER_PARTICLE2);
gl.uniform1f(uniforms.u_lifeSpan, modelObject.lifeSpan);
gl.uniform1f(uniforms.u_timeMiddle, modelObject.timeMiddle);
gl.uniform1f(uniforms.u_columns, modelObject.columns);
gl.uniform1f(uniforms.u_rows, modelObject.rows);
gl.uniform1f(uniforms.u_teamColored, modelObject.teamColored);
gl.uniform3fv(uniforms['u_intervals[0]'], intervals[0]);
gl.uniform3fv(uniforms['u_intervals[1]'], intervals[1]);
gl.uniform3fv(uniforms['u_intervals[2]'], intervals[2]);
gl.uniform3fv(uniforms['u_intervals[3]'], intervals[3]);
gl.uniform4fv(uniforms['u_colors[0]'], colors[0]);
gl.uniform4fv(uniforms['u_colors[1]'], colors[1]);
gl.uniform4fv(uniforms['u_colors[2]'], colors[2]);
gl.uniform3fv(uniforms.u_scaling, modelObject.scaling);
if (modelObject.head) {
gl.uniform3fv(uniforms['u_vertices[0]'], vectors[0]);
gl.uniform3fv(uniforms['u_vertices[1]'], vectors[1]);
gl.uniform3fv(uniforms['u_vertices[2]'], vectors[2]);
gl.uniform3fv(uniforms['u_vertices[3]'], vectors[3]);
}
if (modelObject.tail) {
gl.uniform3fv(uniforms.u_cameraZ, camera.billboardedVectors[6]);
}
}
}