Browse Source

WebGLRenderer/SpritePlugin: Support for texture-less Sprites.

Mr.doob 11 years ago
parent
commit
1900b2627f
1 changed files with 45 additions and 28 deletions
  1. 45 28
      src/extras/renderers/plugins/SpritePlugin.js

+ 45 - 28
src/extras/renderers/plugins/SpritePlugin.js

@@ -5,7 +5,7 @@
 
 
 THREE.SpritePlugin = function () {
 THREE.SpritePlugin = function () {
 
 
-	var _gl, _renderer;
+	var _gl, _renderer, _texture;
 
 
 	var vertices, faces, vertexBuffer, elementBuffer;
 	var vertices, faces, vertexBuffer, elementBuffer;
 	var program, attributes, uniforms;
 	var program, attributes, uniforms;
@@ -67,6 +67,17 @@ THREE.SpritePlugin = function () {
 			alphaTest:			_gl.getUniformLocation( program, 'alphaTest' )
 			alphaTest:			_gl.getUniformLocation( program, 'alphaTest' )
 		};
 		};
 
 
+		var canvas = document.createElement( 'canvas' );
+		canvas.width = 8;
+		canvas.height = 8;
+
+		var context = canvas.getContext( '2d' );
+		context.fillStyle = '#ffffff';
+		context.fillRect( 0, 0, canvas.width, canvas.height );
+
+		_texture = new THREE.Texture( canvas );
+		_texture.needsUpdate = true;
+
 	};
 	};
 
 
 	this.render = function ( scene, camera, viewportWidth, viewportHeight ) {
 	this.render = function ( scene, camera, viewportWidth, viewportHeight ) {
@@ -159,54 +170,60 @@ THREE.SpritePlugin = function () {
 		for( i = 0; i < nSprites; i ++ ) {
 		for( i = 0; i < nSprites; i ++ ) {
 
 
 			sprite = sprites[ i ];
 			sprite = sprites[ i ];
+
+			if ( sprite.visible === false ) continue;
+
 			material = sprite.material;
 			material = sprite.material;
 
 
-			if ( ! sprite.visible || material.opacity === 0 ) continue;
+			_gl.uniform1f( uniforms.alphaTest, material.alphaTest );
+			_gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite._modelViewMatrix.elements );
 
 
-			if ( material.map && material.map.image && material.map.image.width ) {
+			scale[ 0 ] = sprite.scale.x;
+			scale[ 1 ] = sprite.scale.y;
 
 
-				_gl.uniform1f( uniforms.alphaTest, material.alphaTest );
-				_gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite._modelViewMatrix.elements );
+			if ( scene.fog && material.fog ) {
 
 
-				scale[ 0 ] = sprite.scale.x;
-				scale[ 1 ] = sprite.scale.y;
+				fogType = sceneFogType;
 
 
-				if ( scene.fog && material.fog ) {
+			} else {
 
 
-					fogType = sceneFogType;
+				fogType = 0;
 
 
-				} else {
+			}
 
 
-					fogType = 0;
+			if ( oldFogType !== fogType ) {
 
 
-				}
+				_gl.uniform1i( uniforms.fogType, fogType );
+				oldFogType = fogType;
 
 
-				if ( oldFogType !== fogType ) {
+			}
 
 
-					_gl.uniform1i( uniforms.fogType, fogType );
-					oldFogType = fogType;
+			_gl.uniform2f( uniforms.uvScale, material.uvScale.x, material.uvScale.y );
+			_gl.uniform2f( uniforms.uvOffset, material.uvOffset.x, material.uvOffset.y );
 
 
-				}
+			_gl.uniform1f( uniforms.opacity, material.opacity );
+			_gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );
 
 
-				_gl.uniform2f( uniforms.uvScale, material.uvScale.x, material.uvScale.y );
-				_gl.uniform2f( uniforms.uvOffset, material.uvOffset.x, material.uvOffset.y );
+			_gl.uniform1f( uniforms.rotation, material.rotation );
+			_gl.uniform2fv( uniforms.scale, scale );
+			_gl.uniform2f( uniforms.halfViewport, halfViewportWidth, halfViewportHeight );
 
 
-				_gl.uniform1f( uniforms.opacity, material.opacity );
-				_gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );
+			_renderer.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );
+			_renderer.setDepthTest( material.depthTest );
+			_renderer.setDepthWrite( material.depthWrite );
 
 
-				_gl.uniform1f( uniforms.rotation, material.rotation );
-				_gl.uniform2fv( uniforms.scale, scale );
-				_gl.uniform2f( uniforms.halfViewport, halfViewportWidth, halfViewportHeight );
+			if ( material.map && material.map.image && material.map.image.width ) {
 
 
-				_renderer.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );
-				_renderer.setDepthTest( material.depthTest );
-				_renderer.setDepthWrite( material.depthWrite );
 				_renderer.setTexture( material.map, 0 );
 				_renderer.setTexture( material.map, 0 );
 
 
-				_gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );
+			} else {
+
+				_renderer.setTexture( _texture, 0 );
 
 
 			}
 			}
 
 
+			_gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );
+
 		}
 		}
 
 
 		// restore gl
 		// restore gl
@@ -223,7 +240,7 @@ THREE.SpritePlugin = function () {
 		var fragmentShader = _gl.createShader( _gl.FRAGMENT_SHADER );
 		var fragmentShader = _gl.createShader( _gl.FRAGMENT_SHADER );
 
 
 		_gl.shaderSource( vertexShader, [
 		_gl.shaderSource( vertexShader, [
-			
+
 			'precision ' + _renderer.getPrecision() + ' float;',
 			'precision ' + _renderer.getPrecision() + ' float;',
 
 
 			'uniform mat4 modelViewMatrix;',
 			'uniform mat4 modelViewMatrix;',