UNPKG

mdx-m3-viewer

Version:

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

65 lines (55 loc) 2.35 kB
/** * A group of emitters that are going to be rendered together. */ export default class EmitterGroup { /** * @param {ModelView} modelView */ constructor(modelView) { /** @member {ModelView} */ this.modelView = modelView; /** @member {Array<ParticleEmitter2|RibbonEmitter>} */ this.objects = []; } /** * @param {ModelViewData} modelViewData */ render(modelViewData) { let viewer = this.modelView.model.viewer; let gl = viewer.gl; let instancedArrays = gl.extensions.instancedArrays; let modelView = modelViewData.modelView; let shader = viewer.shaderMap.get('MdxParticleShader'); let uniforms = shader.uniforms; let attribs = shader.attribs; gl.depthMask(0); gl.enable(gl.BLEND); gl.disable(gl.CULL_FACE); gl.enable(gl.DEPTH_TEST); viewer.webgl.useShaderProgram(shader); gl.uniformMatrix4fv(uniforms.u_mvp, false, modelViewData.scene.camera.worldProjectionMatrix); gl.uniform1i(uniforms.u_texture, 0); instancedArrays.vertexAttribDivisorANGLE(attribs.a_position, 0); gl.bindBuffer(gl.ARRAY_BUFFER, viewer.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 emitter of this.objects) { emitter.render(modelView, 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); } }