UNPKG

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
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); } }