mdx-m3-viewer
Version:
A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.
69 lines (57 loc) • 2.63 kB
text/typescript
import ShaderProgram from '../../gl/program';
import Scene from '../../scene';
import MdxModel from './model';
import MdxModelInstance from './modelinstance';
import { renderEmitter } from './geometryemitterfuncs';
/**
* A group of emitters that are going to be rendered together.
*/
export default class EmitterGroup {
model: MdxModel;
objects: number[] = [];
constructor(model: MdxModel) {
this.model = model;
}
render(instance: MdxModelInstance) {
let scene = <Scene>instance.scene;
let nodes = instance.nodes;
let model = instance.model;
let viewer = model.viewer;
let gl = viewer.gl;
let instancedArrays = <ANGLE_instanced_arrays>viewer.webgl.extensions.ANGLE_instanced_arrays;
let mdxCache = viewer.sharedCache.get('mdx');
let shader = <ShaderProgram>mdxCache.particlesShader;
let uniforms = shader.uniforms;
let attribs = shader.attribs;
let rectBuffer = <WebGLBuffer>mdxCache.rectBuffer;
gl.depthMask(false);
gl.enable(gl.BLEND);
gl.disable(gl.CULL_FACE);
gl.enable(gl.DEPTH_TEST);
shader.use();
gl.uniformMatrix4fv(uniforms.u_VP, false, scene.camera.viewProjectionMatrix);
gl.uniform1i(uniforms.u_texture, 0);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_position, 0);
gl.bindBuffer(gl.ARRAY_BUFFER, rectBuffer);
gl.vertexAttribPointer(attribs.a_position, 1, gl.UNSIGNED_BYTE, false, 0, 0);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_p0, 1);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_p1, 1);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_p2, 1);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_p3, 1);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_health, 1);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_color, 1);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_tail, 1);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_leftRightTop, 1);
for (let index of this.objects) {
renderEmitter(nodes[index].object, shader);
}
instancedArrays.vertexAttribDivisorANGLE(attribs.a_leftRightTop, 0);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_tail, 0);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_color, 0);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_health, 0);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_p3, 0);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_p2, 0);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_p1, 0);
instancedArrays.vertexAttribDivisorANGLE(attribs.a_p0, 0);
}
}