diff --git a/src/extras/renderers/plugins/SpritePlugin.js b/src/extras/renderers/plugins/SpritePlugin.js index c35fb4deb8753cd305cef85f95b0ab9aeee30557..74ea124493c92a84c020f357467f16082529171d 100644 --- a/src/extras/renderers/plugins/SpritePlugin.js +++ b/src/extras/renderers/plugins/SpritePlugin.js @@ -5,7 +5,10 @@ THREE.SpritePlugin = function () { - var _gl, _renderer, _precision, _sprite = {}; + var _gl, _renderer, _precision; + + var vertices, faces, vertexBuffer, elementBuffer; + var program, attributes, uniforms; this.init = function ( renderer ) { @@ -14,66 +17,57 @@ THREE.SpritePlugin = function () { _precision = renderer.getPrecision(); - _sprite.vertices = new Float32Array( 8 + 8 ); - _sprite.faces = new Uint16Array( 6 ); - - var i = 0; - - _sprite.vertices[ i++ ] = -0.5; _sprite.vertices[ i++ ] = -0.5; // vertex 0 - _sprite.vertices[ i++ ] = 0; _sprite.vertices[ i++ ] = 0; // uv 0 - - _sprite.vertices[ i++ ] = 0.5; _sprite.vertices[ i++ ] = -0.5; // vertex 1 - _sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = 0; // uv 1 - - _sprite.vertices[ i++ ] = 0.5; _sprite.vertices[ i++ ] = 0.5; // vertex 2 - _sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = 1; // uv 2 + vertices = new Float32Array( [ + - 0.5, - 0.5, 0, 0, + 0.5, - 0.5, 1, 0, + 0.5, 0.5, 1, 1, + - 0.5, 0.5, 0, 1 + ] ); - _sprite.vertices[ i++ ] = -0.5; _sprite.vertices[ i++ ] = 0.5; // vertex 3 - _sprite.vertices[ i++ ] = 0; _sprite.vertices[ i++ ] = 1; // uv 3 + faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); - i = 0; + vertexBuffer = _gl.createBuffer(); + elementBuffer = _gl.createBuffer(); - _sprite.faces[ i++ ] = 0; _sprite.faces[ i++ ] = 1; _sprite.faces[ i++ ] = 2; - _sprite.faces[ i++ ] = 0; _sprite.faces[ i++ ] = 2; _sprite.faces[ i++ ] = 3; + _gl.bindBuffer( _gl.ARRAY_BUFFER, vertexBuffer ); + _gl.bufferData( _gl.ARRAY_BUFFER, vertices, _gl.STATIC_DRAW ); - _sprite.vertexBuffer = _gl.createBuffer(); - _sprite.elementBuffer = _gl.createBuffer(); + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faces, _gl.STATIC_DRAW ); - _gl.bindBuffer( _gl.ARRAY_BUFFER, _sprite.vertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, _sprite.vertices, _gl.STATIC_DRAW ); + program = createProgram( THREE.ShaderSprite[ 'sprite' ], _precision ); - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer ); - _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, _sprite.faces, _gl.STATIC_DRAW ); + attributes = { + position: _gl.getAttribLocation ( program, 'position' ), + uv: _gl.getAttribLocation ( program, 'uv' ) + }; - _sprite.program = createProgram( THREE.ShaderSprite[ "sprite" ], _precision ); + uniforms = { + uvOffset: _gl.getUniformLocation( program, 'uvOffset' ), + uvScale: _gl.getUniformLocation( program, 'uvScale' ), - _sprite.attributes = {}; - _sprite.uniforms = {}; + rotation: _gl.getUniformLocation( program, 'rotation' ), + scale: _gl.getUniformLocation( program, 'scale' ), + halfViewport: _gl.getUniformLocation( program, 'halfViewport' ), - _sprite.attributes.position = _gl.getAttribLocation ( _sprite.program, "position" ); - _sprite.attributes.uv = _gl.getAttribLocation ( _sprite.program, "uv" ); + color: _gl.getUniformLocation( program, 'color' ), + map: _gl.getUniformLocation( program, 'map' ), + opacity: _gl.getUniformLocation( program, 'opacity' ), - _sprite.uniforms.uvOffset = _gl.getUniformLocation( _sprite.program, "uvOffset" ); - _sprite.uniforms.uvScale = _gl.getUniformLocation( _sprite.program, "uvScale" ); + modelViewMatrix: _gl.getUniformLocation( program, 'modelViewMatrix' ), + projectionMatrix: _gl.getUniformLocation( program, 'projectionMatrix' ), - _sprite.uniforms.rotation = _gl.getUniformLocation( _sprite.program, "rotation" ); - _sprite.uniforms.scale = _gl.getUniformLocation( _sprite.program, "scale" ); - _sprite.uniforms.halfViewport = _gl.getUniformLocation( _sprite.program, "halfViewport" ); + fogType: _gl.getUniformLocation( program, 'fogType' ), + fogDensity: _gl.getUniformLocation( program, 'fogDensity' ), + fogNear: _gl.getUniformLocation( program, 'fogNear' ), + fogFar: _gl.getUniformLocation( program, 'fogFar' ), + fogColor: _gl.getUniformLocation( program, 'fogColor' ), - _sprite.uniforms.color = _gl.getUniformLocation( _sprite.program, "color" ); - _sprite.uniforms.map = _gl.getUniformLocation( _sprite.program, "map" ); - _sprite.uniforms.opacity = _gl.getUniformLocation( _sprite.program, "opacity" ); - - _sprite.uniforms.modelViewMatrix = _gl.getUniformLocation( _sprite.program, "modelViewMatrix" ); - _sprite.uniforms.projectionMatrix = _gl.getUniformLocation( _sprite.program, "projectionMatrix" ); - - _sprite.uniforms.fogType = _gl.getUniformLocation( _sprite.program, "fogType" ); - _sprite.uniforms.fogDensity = _gl.getUniformLocation( _sprite.program, "fogDensity" ); - _sprite.uniforms.fogNear = _gl.getUniformLocation( _sprite.program, "fogNear" ); - _sprite.uniforms.fogFar = _gl.getUniformLocation( _sprite.program, "fogFar" ); - _sprite.uniforms.fogColor = _gl.getUniformLocation( _sprite.program, "fogColor" ); - - _sprite.uniforms.alphaTest = _gl.getUniformLocation( _sprite.program, "alphaTest" ); + alphaTest: _gl.getUniformLocation( program, 'alphaTest' ) + }; }; @@ -84,15 +78,12 @@ THREE.SpritePlugin = function () { if ( ! nSprites ) return; - var attributes = _sprite.attributes, - uniforms = _sprite.uniforms; - var halfViewportWidth = viewportWidth * 0.5, halfViewportHeight = viewportHeight * 0.5; // setup gl - _gl.useProgram( _sprite.program ); + _gl.useProgram( program ); _gl.enableVertexAttribArray( attributes.position ); _gl.enableVertexAttribArray( attributes.uv ); @@ -100,11 +91,11 @@ THREE.SpritePlugin = function () { _gl.disable( _gl.CULL_FACE ); _gl.enable( _gl.BLEND ); - _gl.bindBuffer( _gl.ARRAY_BUFFER, _sprite.vertexBuffer ); + _gl.bindBuffer( _gl.ARRAY_BUFFER, vertexBuffer ); _gl.vertexAttribPointer( attributes.position, 2, _gl.FLOAT, false, 2 * 8, 0 ); _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 2 * 8, 8 ); - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer ); + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); _gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); @@ -233,7 +224,7 @@ THREE.SpritePlugin = function () { var fragmentShader = _gl.createShader( _gl.FRAGMENT_SHADER ); var vertexShader = _gl.createShader( _gl.VERTEX_SHADER ); - var prefix = "precision " + precision + " float;\n"; + var prefix = 'precision ' + precision + ' float;\n'; _gl.shaderSource( fragmentShader, prefix + shader.fragmentShader ); _gl.shaderSource( vertexShader, prefix + shader.vertexShader );