Explorar el Código

WebGLRenderer code clean up.

Mr.doob hace 12 años
padre
commit
3b63de5239

+ 459 - 415
build/three.js

@@ -21130,7 +21130,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 /*global THREE:false */
 
-THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
+THREE.WebGLRenderer.LowLevelRenderer = function ( parameters ) {
 
 	parameters = parameters || {};
 
@@ -21310,7 +21310,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setDefaultGLState () {
 
@@ -21331,7 +21331,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		_gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
 
-	};
+	}
 
 	// Fallback filters for non-power-of-2 textures
 
@@ -21345,67 +21345,67 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return _gl.LINEAR;
 
-	};
+	}
 
 	function getContext() {
 
 		return _gl;
 
-	};
+	}
 
 	function getDomElement(){
 
 		return _canvas;
 
-	};
+	}
 
 	function getPrecision() {
 
 		return _precision;
 
-	};
+	}
 
 	function getCurrentWidth(){
 
 		return _currentWidth;
 
-	};
+	}
 
 	function getCurrentHeight(){
 
 		return _currentHeight;
 
-	};
+	}
 
 	function supportsVertexTextures() {
 
 		return _supportsVertexTextures;
 
-	};
+	}
 
 	function supportsFloatTextures() {
 
 		return _glExtensionTextureFloat;
 
-	};
+	}
 
 	function supportsStandardDerivatives() {
 
 		return _glExtensionStandardDerivatives;
 
-	};
+	}
 
 	function supportsCompressedTextureS3TC() {
 
 		return _glExtensionCompressedTextureS3TC;
 
-	};
+	}
 
 	function getMaxAnisotropy() {
 
 		return _maxAnisotropy;
 
-	};
+	}
 
 	function setSize( width, height ) {
 
@@ -21414,7 +21414,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		setViewport( 0, 0, _canvas.width, _canvas.height );
 
-	};
+	}
 
 	function setViewport( x, y, width, height ) {
 
@@ -21426,19 +21426,19 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		_gl.viewport( _viewportX, _viewportY, _viewportWidth, _viewportHeight );
 
-	};
+	}
 
 	function setScissor( x, y, width, height ) {
 
 		_gl.scissor( x, y, width, height );
 
-	};
+	}
 
 	function enableScissorTest( enable ) {
 
 		enable ? _gl.enable( _gl.SCISSOR_TEST ) : _gl.disable( _gl.SCISSOR_TEST );
 
-	};
+	}
 
 	// Clearing
 
@@ -21449,7 +21449,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		_gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
 
-	};
+	}
 
 	function setClearColor( color, alpha ) {
 
@@ -21458,19 +21458,19 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		_gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
 
-	};
+	}
 
 	function getClearColor() {
 
 		return _clearColor;
 
-	};
+	}
 
 	function getClearAlpha() {
 
 		return _clearAlpha;
 
-	};
+	}
 
 	function clear( color, depth, stencil ) {
 
@@ -21482,115 +21482,146 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		_gl.clear( bits );
 
-	};
+	}
 
 	function clearTarget( renderTarget, color, depth, stencil ) {
 
 		setRenderTarget( renderTarget );
 		clear( color, depth, stencil );
 
-	};
+	}
 
 	function deleteBuffer(buffer){
+
 		_gl.deleteBuffer(buffer);
-	};
+
+	}
 
 	function deleteTexture(texture){
+
 		_gl.deleteTexture( texture );
-	};
+
+	}
 
 	function deleteFramebuffer(Framebuffer){
+
 		_gl.deleteFramebuffer(Framebuffer);
-	};
+
+	}
 
 	function deleteRenderbuffer(RenderBuffer){
+
 		_gl.deleteRenderbuffer(RenderBuffer);
-	};
+
+	}
 
 	function deleteProgram(RenderBuffer){
+
 		_gl.deleteProgram(RenderBuffer);
-	};
+
+	}
 
 	function createBuffer(){
+
 		return _gl.createBuffer();
-	};
+
+	}
 
 	function setStaticArrayBuffer(buffer,data){
 
 		bindArrayBuffer( buffer );
 		_gl.bufferData( _gl.ARRAY_BUFFER, data, _gl.STATIC_DRAW );
 
-	};
+	}
 
 	function setStaticIndexBuffer(buffer,data){
 
 		bindElementArrayBuffer( buffer );
 		_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, data, _gl.STATIC_DRAW );
 
-	};
+	}
 
 	function setDynamicArrayBuffer(buffer,data){
 
 		bindArrayBuffer( buffer );
 		_gl.bufferData( _gl.ARRAY_BUFFER, data, _gl.DYNAMIC_DRAW );
 
-	};
+	}
 
 	function setDynamicIndexBuffer(buffer,data){
 
 		bindElementArrayBuffer( buffer );
 		_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, data, _gl.DYNAMIC_DRAW );
 
-	};
+	}
 
 	function drawTriangles(count){
+
 		_gl.drawArrays( _gl.TRIANGLES, 0, count );
-	};
+
+	}
 
 	function drawTriangleStrip(count){
+
 		_gl.drawArrays( _gl.TRIANGLE_STRIP, 0, count );
-	};
+
+	}
 
 	function drawLines(count){
+
 		_gl.drawArrays( _gl.LINES, 0, count );
-	};
+
+	}
 
 	function drawLineStrip(count){
+
 		_gl.drawArrays( _gl.LINE_STRIP, 0, count );
-	};
+
+	}
 
 	function drawPoints(count){
+
 		_gl.drawArrays( _gl.POINTS, 0, count );
-	};
+
+	}
 
 	function drawTriangleElements(buffer,count,offset){
+
 		bindElementArrayBuffer( buffer );
 		_gl.drawElements( _gl.TRIANGLES, count, _gl.UNSIGNED_SHORT, offset ); // 2 bytes per Uint16
-	};
+
+	}
 
 	function drawLineElements(buffer,count,offset){
+
 		bindElementArrayBuffer(  buffer );
 		_gl.drawElements( _gl.LINES, count, _gl.UNSIGNED_SHORT, offset ); // 2 bytes per Uint16
-	};
 
+	}
 
 	var _boundBuffer;
+
 	function bindArrayBuffer(buffer){
+
 		if (_boundBuffer != buffer){
+
 			_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
 			_boundBuffer = buffer;
+
 		}
 
-	};
+	}
 
 	function bindElementArrayBuffer(buffer){
 
 		if (_boundBuffer != buffer){
+
 			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, buffer );
 			_boundBuffer = buffer;
+
 		}
 
-	};
+	}
 
 	function enableAttribute( attribute ) {
 
@@ -21601,7 +21632,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function disableAttributes() {
 
@@ -21616,10 +21647,12 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function getAttribLocation( program, id ){
+
 		return _gl.getAttribLocation( program, id );
+
 	}
 
 	function setFloatAttribute(index,buffer,size,offset){
@@ -21628,7 +21661,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 		enableAttribute( index );
 		_gl.vertexAttribPointer( index, size, _gl.FLOAT, false, 0, offset );
 
-	};
+	}
 
 	function getUniformLocation( program, id ){
 
@@ -21640,91 +21673,91 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		_gl.uniform1i( uniform, value );
 
-	};
+	}
 
 	function uniform1f(uniform,value){
 
 		_gl.uniform1f( uniform, value );
 
-	};
+	}
 
 	function uniform2f(uniform,value1, value2){
 
 		_gl.uniform2f( uniform, value1, value2 );
 
-	};
+	}
 
 	function uniform3f(uniform, value1, value2, value3){
 
 		_gl.uniform3f( uniform, value1, value2, value3 );
 
-	};
+	}
 
 	function uniform4f(uniform, value1, value2, value3, value4){
 
 		_gl.uniform4f( uniform, value1, value2, value3, value4);
 
-	};
+	}
 
 	function uniform1iv(uniform,value){
 
 		_gl.uniform1iv( uniform, value );
 
-	};
+	}
 
 	function uniform2iv(uniform,value){
 
 		_gl.uniform2iv( uniform, value );
 
-	};
+	}
 
 	function uniform3iv(uniform,value){
 
 		_gl.uniform3iv( uniform, value );
 
-	};
+	}
 
 	function uniform1fv(uniform,value){
 
 		_gl.uniform1fv( uniform, value );
 
-	};
+	}
 
 	function uniform2fv(uniform,value){
 
 		_gl.uniform2fv( uniform, value );
 
-	};
+	}
 
 	function uniform3fv(uniform,value){
 
 		_gl.uniform3fv( uniform, value );
 
-	};
+	}
 
 	function uniform4fv(uniform,value){
 
 		_gl.uniform3fv( uniform, value );
 
-	};
+	}
 
 	function uniformMatrix3fv(location,value){
 
 		_gl.uniformMatrix3fv( location, false, value );
 
-	};
+	}
 
 	function uniformMatrix4fv(location,value){
 
 		_gl.uniformMatrix4fv( location, false, value );
 
-	};
+	}
 
 	function useProgram(program){
 
 		_gl.useProgram( program );
 
-	};
+	}
 
 	function setFaceCulling( cullFace, frontFaceDirection ) {
 
@@ -21762,7 +21795,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setMaterialFaces( material ) {
 
@@ -21801,7 +21834,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setPolygonOffset ( polygonoffset, factor, units ) {
 
@@ -21830,7 +21863,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setBlending( blending, blendEquation, blendSrc, blendDst ) {
 
@@ -21903,7 +21936,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setDepthTest( depthTest ) {
 
@@ -21923,7 +21956,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setDepthWrite( depthWrite ) {
 
@@ -21934,7 +21967,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setTexture( texture, slot ) {
 
@@ -22041,7 +22074,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setCubeTexture ( texture, slot ) {
 
@@ -22126,7 +22159,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	// Textures
 
@@ -22134,7 +22167,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return ( value & ( value - 1 ) ) === 0;
 
-	};
+	}
 
 	function setTextureParameters ( textureType, texture, isImagePowerOfTwo ) {
 
@@ -22167,14 +22200,14 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) {
 
 		_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
 		_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, renderTarget.__webglTexture, 0 );
 
-	};
+	}
 
 	function setupRenderBuffer ( renderbuffer, renderTarget  ) {
 
@@ -22202,7 +22235,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setRenderTarget( renderTarget ) {
 
@@ -22351,7 +22384,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 		_currentWidth = width;
 		_currentHeight = height;
 
-	};
+	}
 
 	function clampToMaxSize ( image, maxSize ) {
 
@@ -22377,7 +22410,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return canvas;
 
-	};
+	}
 
 	function updateRenderTargetMipmap ( renderTarget ) {
 
@@ -22395,14 +22428,14 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setCubeTextureDynamic ( texture, slot ) {
 
 		_gl.activeTexture( _gl.TEXTURE0 + slot );
 		_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.__webglTexture );
 
-	};
+	}
 
 	// Map three.js constants to WebGL constants
 	function paramThreeToGL ( p ) {
@@ -22465,7 +22498,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return 0;
 
-	};
+	}
 
 	function compileShader(vertexShader, fragmentShader){
 
@@ -22492,7 +22525,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return program;
 
-	};
+	}
 
 	function resetState(){
 
@@ -22531,7 +22564,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return shader;
 
-	};
+	}
 
 	function addLineNumbers ( string ) {
 
@@ -22548,7 +22581,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return chunks.join( "\n" );
 
-	};
+	}
 
 	function setLineWidth ( width ) {
 
@@ -22560,511 +22593,522 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
+
+	return {
 
-	this.context = _gl;
-
-	this.autoScaleCubemaps = _autoScaleCubemaps;
-	this.supportsBoneTextures = _supportsBoneTextures;
-	this.precision = _precision;
-	this.maxVertexUniformVectors = _gl.getParameter( _gl.MAX_VERTEX_UNIFORM_VECTORS );	
-
-	// Methods
-	this.getContext = getContext;
-	this.getDomElement = getDomElement;
-	this.getPrecision = getPrecision;
-	this.getCurrentWidth = getCurrentWidth;
-	this.getCurrentHeight = getCurrentHeight;
-	this.supportsVertexTextures = supportsVertexTextures;
-	this.supportsFloatTextures = supportsFloatTextures;
-	this.supportsStandardDerivatives = supportsStandardDerivatives;
-	this.supportsCompressedTextureS3TC = supportsCompressedTextureS3TC;
-	this.getMaxAnisotropy  = getMaxAnisotropy;
-
-	this.setRenderTarget = setRenderTarget;
-	this.setSize = setSize;
-	this.setViewport = setViewport;
-	this.setScissor = setScissor;
-	this.enableScissorTest = enableScissorTest;
-
-	this.setClearColorHex = setClearColorHex;
-	this.setClearColor = setClearColor;
-	this.getClearColor = getClearColor;
-	this.getClearAlpha = getClearAlpha;
-	this.clear = clear;
-	this.clearTarget = clearTarget;
-
-	this.deleteBuffer = deleteBuffer;
-	this.deleteTexture = deleteTexture;
-	this.deleteFramebuffer = deleteFramebuffer;
-	this.deleteRenderbuffer = deleteRenderbuffer;
-	this.deleteProgram = deleteProgram;
-
-	this.createBuffer = createBuffer;
-	this.setStaticArrayBuffer = setStaticArrayBuffer;
-	this.setStaticIndexBuffer = setStaticIndexBuffer;
-	this.setDynamicArrayBuffer = setDynamicArrayBuffer;
-	this.setDynamicIndexBuffer = setDynamicIndexBuffer;
-
-	this.drawTriangles = drawTriangles;
-	this.drawTriangleStrip = drawTriangleStrip;
-	this.drawLines = drawLines;
-	this.drawLineStrip = drawLineStrip;
-	this.drawPoints = drawPoints;
-	this.drawTriangleElements = drawTriangleElements;
-	this.drawLineElements = drawLineElements;
-
-	this.bindArrayBuffer = bindArrayBuffer;
-	this.bindElementArrayBuffer = bindElementArrayBuffer;
-
-	this.enableAttribute = enableAttribute;
-	this.disableAttributes = disableAttributes;
-	this.getAttribLocation = getAttribLocation;
-	this.setFloatAttribute = setFloatAttribute;
-
-	this.getUniformLocation= getUniformLocation;
-
-	this.uniform1i = uniform1i;
-	this.uniform1f = uniform1f;
-	this.uniform2f = uniform2f;
-	this.uniform3f = uniform3f;
-	this.uniform4f = uniform4f;
-	this.uniform1iv = uniform1iv;
-	this.uniform2iv = uniform2iv;
-	this.uniform3iv = uniform3iv;
-	this.uniform1fv = uniform1fv;
-	this.uniform2fv = uniform2fv;
-	this.uniform3fv = uniform3fv;
-	this.uniform4fv = uniform4fv;
-	this.uniformMatrix3fv = uniformMatrix3fv;
-	this.uniformMatrix4fv = uniformMatrix4fv;
-
-	this.useProgram = useProgram;
-	this.compileShader = compileShader;
-
-	this.setFaceCulling = setFaceCulling;
-	this.setMaterialFaces = setMaterialFaces;
-	this.setPolygonOffset = setPolygonOffset;
-	this.setBlending = setBlending;
-	this.setDepthTest = setDepthTest;
-	this.setDepthWrite = setDepthWrite;
-
-	this.setTexture = setTexture;
-	this.setCubeTexture = setCubeTexture;
-	this.updateRenderTargetMipmap = updateRenderTargetMipmap;
-	this.setCubeTextureDynamic = setCubeTextureDynamic;
-
-	this.paramThreeToGL = paramThreeToGL;
-	this.setLineWidth = setLineWidth;
-	this.resetState = resetState;
-
-};
-
-THREE.WebGLRenderer.ShaderBuilder = function(renderer,info){
+		context: _gl,
+
+		autoScaleCubemaps: _autoScaleCubemaps,
+		supportsBoneTextures: _supportsBoneTextures,
+		precision: _precision,
+		maxVertexUniformVectors: _gl.getParameter( _gl.MAX_VERTEX_UNIFORM_VECTORS ),
+
+		// Methods
+
+		getContext: getContext,
+		getDomElement: getDomElement,
+		getPrecision: getPrecision,
+		getCurrentWidth: getCurrentWidth,
+		getCurrentHeight: getCurrentHeight,
+		supportsVertexTextures: supportsVertexTextures,
+		supportsFloatTextures: supportsFloatTextures,
+		supportsStandardDerivatives: supportsStandardDerivatives,
+		supportsCompressedTextureS3TC: supportsCompressedTextureS3TC,
+		getMaxAnisotropy: getMaxAnisotropy,
+
+		setRenderTarget: setRenderTarget,
+		setSize: setSize,
+		setViewport: setViewport,
+		setScissor: setScissor,
+		enableScissorTest: enableScissorTest,
+
+		setClearColorHex: setClearColorHex,
+		setClearColor: setClearColor,
+		getClearColor: getClearColor,
+		getClearAlpha: getClearAlpha,
+		clear: clear,
+		clearTarget: clearTarget,
+
+		deleteBuffer: deleteBuffer,
+		deleteTexture: deleteTexture,
+		deleteFramebuffer: deleteFramebuffer,
+		deleteRenderbuffer: deleteRenderbuffer,
+		deleteProgram: deleteProgram,
+
+		createBuffer: createBuffer,
+		setStaticArrayBuffer: setStaticArrayBuffer,
+		setStaticIndexBuffer: setStaticIndexBuffer,
+		setDynamicArrayBuffer: setDynamicArrayBuffer,
+		setDynamicIndexBuffer: setDynamicIndexBuffer,
+
+		drawTriangles: drawTriangles,
+		drawTriangleStrip: drawTriangleStrip,
+		drawLines: drawLines,
+		drawLineStrip: drawLineStrip,
+		drawPoints: drawPoints,
+		drawTriangleElements: drawTriangleElements,
+		drawLineElements: drawLineElements,
+
+		bindArrayBuffer: bindArrayBuffer,
+		bindElementArrayBuffer: bindElementArrayBuffer,
+
+		enableAttribute: enableAttribute,
+		disableAttributes: disableAttributes,
+		getAttribLocation: getAttribLocation,
+		setFloatAttribute: setFloatAttribute,
+
+		getUniformLocation: getUniformLocation,
+
+		uniform1i: uniform1i,
+		uniform1f: uniform1f,
+		uniform2f: uniform2f,
+		uniform3f: uniform3f,
+		uniform4f: uniform4f,
+		uniform1iv: uniform1iv,
+		uniform2iv: uniform2iv,
+		uniform3iv: uniform3iv,
+		uniform1fv: uniform1fv,
+		uniform2fv: uniform2fv,
+		uniform3fv: uniform3fv,
+		uniform4fv: uniform4fv,
+		uniformMatrix3fv: uniformMatrix3fv,
+		uniformMatrix4fv: uniformMatrix4fv,
+
+		useProgram: useProgram,
+		compileShader: compileShader,
+
+		setFaceCulling: setFaceCulling,
+		setMaterialFaces: setMaterialFaces,
+		setPolygonOffset: setPolygonOffset,
+		setBlending: setBlending,
+		setDepthTest: setDepthTest,
+		setDepthWrite: setDepthWrite,
+
+		setTexture: setTexture,
+		setCubeTexture: setCubeTexture,
+		updateRenderTargetMipmap: updateRenderTargetMipmap,
+		setCubeTextureDynamic: setCubeTextureDynamic,
+
+		paramThreeToGL: paramThreeToGL,
+		setLineWidth: setLineWidth,
+		resetState: resetState
+
+	}
+
+};
+
+THREE.WebGLRenderer.ShaderBuilder = function ( renderer, info ) {
+
 	this.renderer = renderer;
 	this.info = info;
 	this.programs = [],
 	this.programs_counter = 0;
-}
 
-THREE.WebGLRenderer.ShaderBuilder.prototype.buildProgram = function ( shaderID, fragmentShader, vertexShader, uniforms, attributes, defines, parameters ) {
+};
 
-	var renderer = this.renderer;
-	var p, pl, d, program, code;
-	var chunks = [];
+THREE.extend( THREE.WebGLRenderer.ShaderBuilder.prototype, {
 
-	// Generate code
+	buildProgram: function ( shaderID, fragmentShader, vertexShader, uniforms, attributes, defines, parameters ) {
 
-	if ( shaderID ) {
+		var renderer = this.renderer;
+		var p, pl, d, program, code;
+		var chunks = [];
 
-		chunks.push( shaderID );
+		// Generate code
 
-	} else {
+		if ( shaderID ) {
 
-		chunks.push( fragmentShader );
-		chunks.push( vertexShader );
+			chunks.push( shaderID );
 
-	}
+		} else {
 
-	for ( d in defines ) {
+			chunks.push( fragmentShader );
+			chunks.push( vertexShader );
 
-		chunks.push( d );
-		chunks.push( defines[ d ] );
+		}
 
-	}
+		for ( d in defines ) {
 
-	for ( p in parameters ) {
+			chunks.push( d );
+			chunks.push( defines[ d ] );
 
-		chunks.push( p );
-		chunks.push( parameters[ p ] );
+		}
 
-	}
+		for ( p in parameters ) {
+
+			chunks.push( p );
+			chunks.push( parameters[ p ] );
+
+		}
 
-	code = chunks.join();
+		code = chunks.join();
 
-	// Check if code has been already compiled
+		// Check if code has been already compiled
 
-	for ( p = 0, pl = this.programs.length; p < pl; p ++ ) {
+		for ( p = 0, pl = this.programs.length; p < pl; p ++ ) {
 
-		var programInfo = this.programs[ p ];
+			var programInfo = this.programs[ p ];
 
-		if ( programInfo.code === code ) {
+			if ( programInfo.code === code ) {
 
-			//console.log( "Code already compiled." /*: \n\n" + code*/ );
+				//console.log( "Code already compiled." /*: \n\n" + code*/ );
 
-			programInfo.usedTimes ++;
+				programInfo.usedTimes ++;
 
-			return programInfo.program;
+				return programInfo.program;
+
+			}
 
 		}
 
-	}
+		var shadowMapTypeDefine = "SHADOWMAP_TYPE_BASIC";
 
-	var shadowMapTypeDefine = "SHADOWMAP_TYPE_BASIC";
+		if ( parameters.shadowMapType === THREE.PCFShadowMap ) {
 
-	if ( parameters.shadowMapType === THREE.PCFShadowMap ) {
+			shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF";
 
-		shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF";
+		} else if ( parameters.shadowMapType === THREE.PCFSoftShadowMap ) {
 
-	} else if ( parameters.shadowMapType === THREE.PCFSoftShadowMap ) {
+			shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF_SOFT";
 
-		shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF_SOFT";
+		}
 
-	}
+		//console.log( "building new program " );
 
-	//console.log( "building new program " );
+		//
 
-	//
+		var customDefines = this.generateDefines( defines );
 
-	var customDefines = this.generateDefines( defines );
+		//
 
-	//
+		var prefix_vertex = [
 
-	var prefix_vertex = [
+			"precision " + renderer.precision + " float;",
 
-		"precision " + renderer.precision + " float;",
+			customDefines,
 
-		customDefines,
+			renderer.supportsVertexTextures ? "#define VERTEX_TEXTURES" : "",
 
-		renderer.supportsVertexTextures ? "#define VERTEX_TEXTURES" : "",
+			parameters.gammaInput ? "#define GAMMA_INPUT" : "",
+			parameters.gammaOutput ? "#define GAMMA_OUTPUT" : "",
+			parameters.physicallyBasedShading ? "#define PHYSICALLY_BASED_SHADING" : "",
 
-		parameters.gammaInput ? "#define GAMMA_INPUT" : "",
-		parameters.gammaOutput ? "#define GAMMA_OUTPUT" : "",
-		parameters.physicallyBasedShading ? "#define PHYSICALLY_BASED_SHADING" : "",
+			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
+			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
+			"#define MAX_SPOT_LIGHTS " + parameters.maxSpotLights,
+			"#define MAX_HEMI_LIGHTS " + parameters.maxHemiLights,
 
-		"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
-		"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
-		"#define MAX_SPOT_LIGHTS " + parameters.maxSpotLights,
-		"#define MAX_HEMI_LIGHTS " + parameters.maxHemiLights,
+			"#define MAX_SHADOWS " + parameters.maxShadows,
 
-		"#define MAX_SHADOWS " + parameters.maxShadows,
+			"#define MAX_BONES " + parameters.maxBones,
 
-		"#define MAX_BONES " + parameters.maxBones,
+			parameters.map ? "#define USE_MAP" : "",
+			parameters.envMap ? "#define USE_ENVMAP" : "",
+			parameters.lightMap ? "#define USE_LIGHTMAP" : "",
+			parameters.bumpMap ? "#define USE_BUMPMAP" : "",
+			parameters.normalMap ? "#define USE_NORMALMAP" : "",
+			parameters.specularMap ? "#define USE_SPECULARMAP" : "",
+			parameters.vertexColors ? "#define USE_COLOR" : "",
 
-		parameters.map ? "#define USE_MAP" : "",
-		parameters.envMap ? "#define USE_ENVMAP" : "",
-		parameters.lightMap ? "#define USE_LIGHTMAP" : "",
-		parameters.bumpMap ? "#define USE_BUMPMAP" : "",
-		parameters.normalMap ? "#define USE_NORMALMAP" : "",
-		parameters.specularMap ? "#define USE_SPECULARMAP" : "",
-		parameters.vertexColors ? "#define USE_COLOR" : "",
+			parameters.skinning ? "#define USE_SKINNING" : "",
+			parameters.useVertexTexture ? "#define BONE_TEXTURE" : "",
+			parameters.boneTextureWidth ? "#define N_BONE_PIXEL_X " + parameters.boneTextureWidth.toFixed( 1 ) : "",
+			parameters.boneTextureHeight ? "#define N_BONE_PIXEL_Y " + parameters.boneTextureHeight.toFixed( 1 ) : "",
 
-		parameters.skinning ? "#define USE_SKINNING" : "",
-		parameters.useVertexTexture ? "#define BONE_TEXTURE" : "",
-		parameters.boneTextureWidth ? "#define N_BONE_PIXEL_X " + parameters.boneTextureWidth.toFixed( 1 ) : "",
-		parameters.boneTextureHeight ? "#define N_BONE_PIXEL_Y " + parameters.boneTextureHeight.toFixed( 1 ) : "",
+			parameters.morphTargets ? "#define USE_MORPHTARGETS" : "",
+			parameters.morphNormals ? "#define USE_MORPHNORMALS" : "",
+			parameters.perPixel ? "#define PHONG_PER_PIXEL" : "",
+			parameters.wrapAround ? "#define WRAP_AROUND" : "",
+			parameters.doubleSided ? "#define DOUBLE_SIDED" : "",
+			parameters.flipSided ? "#define FLIP_SIDED" : "",
 
-		parameters.morphTargets ? "#define USE_MORPHTARGETS" : "",
-		parameters.morphNormals ? "#define USE_MORPHNORMALS" : "",
-		parameters.perPixel ? "#define PHONG_PER_PIXEL" : "",
-		parameters.wrapAround ? "#define WRAP_AROUND" : "",
-		parameters.doubleSided ? "#define DOUBLE_SIDED" : "",
-		parameters.flipSided ? "#define FLIP_SIDED" : "",
+			parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
+			parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "",
+			parameters.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "",
+			parameters.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "",
 
-		parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
-		parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "",
-		parameters.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "",
-		parameters.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "",
+			parameters.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "",
 
-		parameters.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "",
+			"uniform mat4 modelMatrix;",
+			"uniform mat4 modelViewMatrix;",
+			"uniform mat4 projectionMatrix;",
+			"uniform mat4 viewMatrix;",
+			"uniform mat3 normalMatrix;",
+			"uniform vec3 cameraPosition;",
 
-		"uniform mat4 modelMatrix;",
-		"uniform mat4 modelViewMatrix;",
-		"uniform mat4 projectionMatrix;",
-		"uniform mat4 viewMatrix;",
-		"uniform mat3 normalMatrix;",
-		"uniform vec3 cameraPosition;",
+			"attribute vec3 position;",
+			"attribute vec3 normal;",
+			"attribute vec2 uv;",
+			"attribute vec2 uv2;",
 
-		"attribute vec3 position;",
-		"attribute vec3 normal;",
-		"attribute vec2 uv;",
-		"attribute vec2 uv2;",
+			"#ifdef USE_COLOR",
 
-		"#ifdef USE_COLOR",
+				"attribute vec3 color;",
 
-			"attribute vec3 color;",
+			"#endif",
 
-		"#endif",
+			"#ifdef USE_MORPHTARGETS",
 
-		"#ifdef USE_MORPHTARGETS",
+				"attribute vec3 morphTarget0;",
+				"attribute vec3 morphTarget1;",
+				"attribute vec3 morphTarget2;",
+				"attribute vec3 morphTarget3;",
 
-			"attribute vec3 morphTarget0;",
-			"attribute vec3 morphTarget1;",
-			"attribute vec3 morphTarget2;",
-			"attribute vec3 morphTarget3;",
+				"#ifdef USE_MORPHNORMALS",
 
-			"#ifdef USE_MORPHNORMALS",
+					"attribute vec3 morphNormal0;",
+					"attribute vec3 morphNormal1;",
+					"attribute vec3 morphNormal2;",
+					"attribute vec3 morphNormal3;",
 
-				"attribute vec3 morphNormal0;",
-				"attribute vec3 morphNormal1;",
-				"attribute vec3 morphNormal2;",
-				"attribute vec3 morphNormal3;",
+				"#else",
 
-			"#else",
+					"attribute vec3 morphTarget4;",
+					"attribute vec3 morphTarget5;",
+					"attribute vec3 morphTarget6;",
+					"attribute vec3 morphTarget7;",
 
-				"attribute vec3 morphTarget4;",
-				"attribute vec3 morphTarget5;",
-				"attribute vec3 morphTarget6;",
-				"attribute vec3 morphTarget7;",
+				"#endif",
 
 			"#endif",
 
-		"#endif",
+			"#ifdef USE_SKINNING",
 
-		"#ifdef USE_SKINNING",
+				"attribute vec4 skinIndex;",
+				"attribute vec4 skinWeight;",
 
-			"attribute vec4 skinIndex;",
-			"attribute vec4 skinWeight;",
+			"#endif",
 
-		"#endif",
+			""
 
-		""
+		].join("\n");
 
-	].join("\n");
+		var prefix_fragment = [
 
-	var prefix_fragment = [
+			"precision " + renderer.precision + " float;",
 
-		"precision " + renderer.precision + " float;",
+			( parameters.bumpMap || parameters.normalMap ) ? "#extension GL_OES_standard_derivatives : enable" : "",
 
-		( parameters.bumpMap || parameters.normalMap ) ? "#extension GL_OES_standard_derivatives : enable" : "",
+			customDefines,
 
-		customDefines,
+			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
+			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
+			"#define MAX_SPOT_LIGHTS " + parameters.maxSpotLights,
+			"#define MAX_HEMI_LIGHTS " + parameters.maxHemiLights,
 
-		"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
-		"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
-		"#define MAX_SPOT_LIGHTS " + parameters.maxSpotLights,
-		"#define MAX_HEMI_LIGHTS " + parameters.maxHemiLights,
+			"#define MAX_SHADOWS " + parameters.maxShadows,
 
-		"#define MAX_SHADOWS " + parameters.maxShadows,
+			parameters.alphaTest ? "#define ALPHATEST " + parameters.alphaTest: "",
 
-		parameters.alphaTest ? "#define ALPHATEST " + parameters.alphaTest: "",
+			parameters.gammaInput ? "#define GAMMA_INPUT" : "",
+			parameters.gammaOutput ? "#define GAMMA_OUTPUT" : "",
 
-		parameters.gammaInput ? "#define GAMMA_INPUT" : "",
-		parameters.gammaOutput ? "#define GAMMA_OUTPUT" : "",
+			( parameters.useFog && parameters.fog ) ? "#define USE_FOG" : "",
+			( parameters.useFog && parameters.fogExp ) ? "#define FOG_EXP2" : "",
 
-		( parameters.useFog && parameters.fog ) ? "#define USE_FOG" : "",
-		( parameters.useFog && parameters.fogExp ) ? "#define FOG_EXP2" : "",
+			parameters.map ? "#define USE_MAP" : "",
+			parameters.envMap ? "#define USE_ENVMAP" : "",
+			parameters.lightMap ? "#define USE_LIGHTMAP" : "",
+			parameters.bumpMap ? "#define USE_BUMPMAP" : "",
+			parameters.normalMap ? "#define USE_NORMALMAP" : "",
+			parameters.specularMap ? "#define USE_SPECULARMAP" : "",
+			parameters.vertexColors ? "#define USE_COLOR" : "",
 
-		parameters.map ? "#define USE_MAP" : "",
-		parameters.envMap ? "#define USE_ENVMAP" : "",
-		parameters.lightMap ? "#define USE_LIGHTMAP" : "",
-		parameters.bumpMap ? "#define USE_BUMPMAP" : "",
-		parameters.normalMap ? "#define USE_NORMALMAP" : "",
-		parameters.specularMap ? "#define USE_SPECULARMAP" : "",
-		parameters.vertexColors ? "#define USE_COLOR" : "",
+			parameters.metal ? "#define METAL" : "",
+			parameters.perPixel ? "#define PHONG_PER_PIXEL" : "",
+			parameters.wrapAround ? "#define WRAP_AROUND" : "",
+			parameters.doubleSided ? "#define DOUBLE_SIDED" : "",
+			parameters.flipSided ? "#define FLIP_SIDED" : "",
 
-		parameters.metal ? "#define METAL" : "",
-		parameters.perPixel ? "#define PHONG_PER_PIXEL" : "",
-		parameters.wrapAround ? "#define WRAP_AROUND" : "",
-		parameters.doubleSided ? "#define DOUBLE_SIDED" : "",
-		parameters.flipSided ? "#define FLIP_SIDED" : "",
+			parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
+			parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "",
+			parameters.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "",
+			parameters.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "",
 
-		parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
-		parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "",
-		parameters.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "",
-		parameters.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "",
+			"uniform mat4 viewMatrix;",
+			"uniform vec3 cameraPosition;",
+			""
 
-		"uniform mat4 viewMatrix;",
-		"uniform vec3 cameraPosition;",
-		""
+		].join("\n");
 
-	].join("\n");
-	
+		program = renderer.compileShader(prefix_vertex + vertexShader, prefix_fragment + fragmentShader);
 
-	program = renderer.compileShader(prefix_vertex + vertexShader, prefix_fragment + fragmentShader);
-	
-	//console.log( prefix_fragment + fragmentShader );
-	//console.log( prefix_vertex + vertexShader );
+		//console.log( prefix_fragment + fragmentShader );
+		//console.log( prefix_vertex + vertexShader );
 
-	program.uniforms = {};
-	program.attributes = {};
+		program.uniforms = {};
+		program.attributes = {};
 
-	var identifiers, u, a, i;
+		var identifiers, u, a, i;
 
-	// cache uniform locations
+		// cache uniform locations
 
-	identifiers = [
+		identifiers = [
 
-		'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'modelMatrix', 'cameraPosition',
-		'morphTargetInfluences'
+			'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'modelMatrix', 'cameraPosition',
+			'morphTargetInfluences'
 
-	];
+		];
 
-	if ( parameters.useVertexTexture ) {
+		if ( parameters.useVertexTexture ) {
 
-		identifiers.push( 'boneTexture' );
+			identifiers.push( 'boneTexture' );
 
-	} else {
+		} else {
 
-		identifiers.push( 'boneGlobalMatrices' );
+			identifiers.push( 'boneGlobalMatrices' );
 
-	}
+		}
 
-	for ( u in uniforms ) {
+		for ( u in uniforms ) {
 
-		identifiers.push( u );
+			identifiers.push( u );
 
-	}
+		}
 
-	this.cacheUniformLocations( program, identifiers );
+		this.cacheUniformLocations( program, identifiers );
 
-	// cache attributes locations
+		// cache attributes locations
 
-	identifiers = [
+		identifiers = [
 
-		"position", "normal", "uv", "uv2", "tangent", "color",
-		"skinIndex", "skinWeight", "lineDistance"
+			"position", "normal", "uv", "uv2", "tangent", "color",
+			"skinIndex", "skinWeight", "lineDistance"
 
-	];
+		];
 
-	for ( i = 0; i < parameters.maxMorphTargets; i ++ ) {
+		for ( i = 0; i < parameters.maxMorphTargets; i ++ ) {
 
-		identifiers.push( "morphTarget" + i );
+			identifiers.push( "morphTarget" + i );
 
-	}
+		}
 
-	for ( i = 0; i < parameters.maxMorphNormals; i ++ ) {
+		for ( i = 0; i < parameters.maxMorphNormals; i ++ ) {
 
-		identifiers.push( "morphNormal" + i );
+			identifiers.push( "morphNormal" + i );
 
-	}
+		}
 
-	for ( a in attributes ) {
+		for ( a in attributes ) {
 
-		identifiers.push( a );
+			identifiers.push( a );
 
-	}
+		}
 
-	this.cacheAttributeLocations( program, identifiers );
+		this.cacheAttributeLocations( program, identifiers );
 
-	program.id = this.programs_counter ++;
+		program.id = this.programs_counter ++;
 
-	this.programs.push( { program: program, code: code, usedTimes: 1 } );
+		this.programs.push( { program: program, code: code, usedTimes: 1 } );
 
-	this.info.memory.programs = this.programs.length;
+		this.info.memory.programs = this.programs.length;
 
-	return program;
+		return program;
 
-};
+	},
 
-THREE.WebGLRenderer.ShaderBuilder.prototype.generateDefines = function( defines ) {
+	generateDefines: function ( defines ) {
 
-	var value, chunk, chunks = [];
+		var value, chunk, chunks = [];
 
-	for ( var d in defines ) {
+		for ( var d in defines ) {
 
-		value = defines[ d ];
-		if ( value === false ) continue;
+			value = defines[ d ];
+			if ( value === false ) continue;
 
-		chunk = "#define " + d + " " + value;
-		chunks.push( chunk );
+			chunk = "#define " + d + " " + value;
+			chunks.push( chunk );
 
-	}
+		}
 
-	return chunks.join( "\n" );
+		return chunks.join( "\n" );
 
-};
+	},
 
 	// Shader parameters cache
 
-THREE.WebGLRenderer.ShaderBuilder.prototype.cacheUniformLocations = function( program, identifiers ) {
+	cacheUniformLocations: function ( program, identifiers ) {
 
-	var i, l, id, renderer = this.renderer;
+		var i, l, id, renderer = this.renderer;
 
-	for( i = 0, l = identifiers.length; i < l; i ++ ) {
+		for ( i = 0, l = identifiers.length; i < l; i ++ ) {
 
-		id = identifiers[ i ];
-		program.uniforms[ id ] = renderer.getUniformLocation( program, id );
+			id = identifiers[ i ];
+			program.uniforms[ id ] = renderer.getUniformLocation( program, id );
 
-	}
+		}
 
-};
+	},
 
-THREE.WebGLRenderer.ShaderBuilder.prototype.cacheAttributeLocations = function( program, identifiers ) {
+	cacheAttributeLocations: function ( program, identifiers ) {
 
-	var i, l, id, renderer = this.renderer;
+		var i, l, id, renderer = this.renderer;
 
-	for( i = 0, l = identifiers.length; i < l; i ++ ) {
+		for( i = 0, l = identifiers.length; i < l; i ++ ) {
 
-		id = identifiers[ i ];
-		program.attributes[ id ] = renderer.getAttribLocation( program, id );
+			id = identifiers[ i ];
+			program.attributes[ id ] = renderer.getAttribLocation( program, id );
 
-	}
+		}
 
-};
+	},
+
+	removeProgram: function ( program ) {
+
+		var i, il, programInfo;
+		var deleteProgram = false;
+		var programs = this.programs;
 
-THREE.WebGLRenderer.ShaderBuilder.prototype.removeProgram = function( program ) {
+		for ( i = 0, il = programs.length; i < il; i ++ ) {
 
-	var i, il, programInfo;
-	var deleteProgram = false;
-	var programs = this.programs;
+			programInfo = programs[ i ];
 
-	for ( i = 0, il = programs.length; i < il; i ++ ) {
+			if ( programInfo.program === program ) {
 
-		programInfo = programs[ i ];
+				programInfo.usedTimes --;
 
-		if ( programInfo.program === program ) {
+				if ( programInfo.usedTimes === 0 ) {
 
-			programInfo.usedTimes --;
+					deleteProgram = true;
 
-			if ( programInfo.usedTimes === 0 ) {
+				}
 
-				deleteProgram = true;
+				break;
 
 			}
 
-			break;
-
 		}
 
-	}
+		if ( deleteProgram === true ) {
 
-	if ( deleteProgram === true ) {
+			// avoid using array.splice, this is costlier than creating new array from scratch
 
-		// avoid using array.splice, this is costlier than creating new array from scratch
+			var newPrograms = [];
 
-		var newPrograms = [];
+			for ( i = 0, il = programs.length; i < il; i ++ ) {
 
-		for ( i = 0, il = programs.length; i < il; i ++ ) {
+				programInfo = programs[ i ];
 
-			programInfo = programs[ i ];
+				if ( programInfo.program !== program ) {
 
-			if ( programInfo.program !== program ) {
+					newPrograms.push( programInfo );
 
-				newPrograms.push( programInfo );
+				}
 
 			}
 
-		}
+			programs = newPrograms;
 
-		programs = newPrograms;
+			this.renderer.deleteProgram( program );
 
-		this.renderer.deleteProgram( program );
+			this.info.memory.programs --;
 
-		this.info.memory.programs --;
+		}
 
 	}
-}
+
+} );
 
 THREE.WebGLRenderer.Object3DRenderer = function ( lowlevelrenderer, info ) {
 

+ 20 - 21
build/three.min.js

@@ -425,33 +425,32 @@ console.log("THREE.WebGLRenderer: Standard derivatives not supported.");B||conso
 l.enable(l.BLEND);l.blendEquation(l.FUNC_ADD);l.blendFunc(l.SRC_ALPHA,l.ONE_MINUS_SRC_ALPHA);l.clearColor(z.r,z.g,z.b,r);l.getParameter(l.MAX_TEXTURE_IMAGE_UNITS);a=l.getParameter(l.MAX_VERTEX_TEXTURE_IMAGE_UNITS);l.getParameter(l.MAX_TEXTURE_SIZE);var Q=l.getParameter(l.MAX_CUBE_MAP_TEXTURE_SIZE),C=B?l.getParameter(B.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0,G=0<a,a=G&&H;N&&l.getParameter(l.COMPRESSED_TEXTURE_FORMATS);w=l.getShaderPrecisionFormat(l.VERTEX_SHADER,l.HIGH_FLOAT);p=l.getShaderPrecisionFormat(l.VERTEX_SHADER,
 l.MEDIUM_FLOAT);l.getShaderPrecisionFormat(l.VERTEX_SHADER,l.LOW_FLOAT);v=l.getShaderPrecisionFormat(l.FRAGMENT_SHADER,l.HIGH_FLOAT);q=l.getShaderPrecisionFormat(l.FRAGMENT_SHADER,l.MEDIUM_FLOAT);l.getShaderPrecisionFormat(l.FRAGMENT_SHADER,l.LOW_FLOAT);l.getShaderPrecisionFormat(l.VERTEX_SHADER,l.HIGH_INT);l.getShaderPrecisionFormat(l.VERTEX_SHADER,l.MEDIUM_INT);l.getShaderPrecisionFormat(l.VERTEX_SHADER,l.LOW_INT);l.getShaderPrecisionFormat(l.FRAGMENT_SHADER,l.HIGH_INT);l.getShaderPrecisionFormat(l.FRAGMENT_SHADER,
 l.MEDIUM_INT);l.getShaderPrecisionFormat(l.FRAGMENT_SHADER,l.LOW_INT);w=0<w.precision&&0<v.precision;p=0<p.precision&&0<q.precision;"highp"===u&&!w&&(p?(u="mediump",console.warn("WebGLRenderer: highp not supported, using mediump")):(u="lowp",console.warn("WebGLRenderer: highp and mediump not supported, using lowp")));"mediump"===u&&!p&&(u="lowp",console.warn("WebGLRenderer: mediump not supported, using lowp"));var t={},I,M,J,x,K=-1,S=-1,aa=-1,Y=-1,V=-1,L=0,ka=0,qa=0,ra=0,X=null,U=null,T=null,$=null,
-ba;this.context=l;this.autoScaleCubemaps=!0;this.supportsBoneTextures=a;this.precision=u;this.maxVertexUniformVectors=l.getParameter(l.MAX_VERTEX_UNIFORM_VECTORS);this.getContext=function(){return l};this.getDomElement=function(){return s};this.getPrecision=function(){return u};this.getCurrentWidth=function(){return E};this.getCurrentHeight=function(){return D};this.supportsVertexTextures=function(){return G};this.supportsFloatTextures=function(){return H};this.supportsStandardDerivatives=function(){return F};
-this.supportsCompressedTextureS3TC=function(){return N};this.getMaxAnisotropy=function(){return C};this.setRenderTarget=j;this.setSize=function(a,b){s.width=a;s.height=b;c(0,0,s.width,s.height)};this.setViewport=c;this.setScissor=function(a,b,c,d){l.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?l.enable(l.SCISSOR_TEST):l.disable(l.SCISSOR_TEST)};this.setClearColorHex=function(a,b){z.setHex(a);r=b;l.clearColor(z.r,z.g,z.b,r)};this.setClearColor=function(a,b){z.copy(a);r=b;l.clearColor(z.r,
-z.g,z.b,r)};this.getClearColor=function(){return z};this.getClearAlpha=function(){return r};this.clear=d;this.clearTarget=function(a,b,c,e){j(a);d(b,c,e)};this.deleteBuffer=function(a){l.deleteBuffer(a)};this.deleteTexture=function(a){l.deleteTexture(a)};this.deleteFramebuffer=function(a){l.deleteFramebuffer(a)};this.deleteRenderbuffer=function(a){l.deleteRenderbuffer(a)};this.deleteProgram=function(a){l.deleteProgram(a)};this.createBuffer=function(){return l.createBuffer()};this.setStaticArrayBuffer=
-function(a,b){e(a);l.bufferData(l.ARRAY_BUFFER,b,l.STATIC_DRAW)};this.setStaticIndexBuffer=function(a,b){f(a);l.bufferData(l.ELEMENT_ARRAY_BUFFER,b,l.STATIC_DRAW)};this.setDynamicArrayBuffer=function(a,b){e(a);l.bufferData(l.ARRAY_BUFFER,b,l.DYNAMIC_DRAW)};this.setDynamicIndexBuffer=function(a,b){f(a);l.bufferData(l.ELEMENT_ARRAY_BUFFER,b,l.DYNAMIC_DRAW)};this.drawTriangles=function(a){l.drawArrays(l.TRIANGLES,0,a)};this.drawTriangleStrip=function(a){l.drawArrays(l.TRIANGLE_STRIP,0,a)};this.drawLines=
-function(a){l.drawArrays(l.LINES,0,a)};this.drawLineStrip=function(a){l.drawArrays(l.LINE_STRIP,0,a)};this.drawPoints=function(a){l.drawArrays(l.POINTS,0,a)};this.drawTriangleElements=function(a,b,c){f(a);l.drawElements(l.TRIANGLES,b,l.UNSIGNED_SHORT,c)};this.drawLineElements=function(a,b,c){f(a);l.drawElements(l.LINES,b,l.UNSIGNED_SHORT,c)};this.bindArrayBuffer=e;this.bindElementArrayBuffer=f;this.enableAttribute=g;this.disableAttributes=function(){for(var a in t)t[a]&&(l.disableVertexAttribArray(a),
-t[a]=!1)};this.getAttribLocation=function(a,b){return l.getAttribLocation(a,b)};this.setFloatAttribute=function(a,b,c,d){e(b);g(a);l.vertexAttribPointer(a,c,l.FLOAT,!1,0,d)};this.getUniformLocation=function(a,b){return l.getUniformLocation(a,b)};this.uniform1i=function(a,b){l.uniform1i(a,b)};this.uniform1f=function(a,b){l.uniform1f(a,b)};this.uniform2f=function(a,b,c){l.uniform2f(a,b,c)};this.uniform3f=function(a,b,c,d){l.uniform3f(a,b,c,d)};this.uniform4f=function(a,b,c,d,e){l.uniform4f(a,b,c,d,
-e)};this.uniform1iv=function(a,b){l.uniform1iv(a,b)};this.uniform2iv=function(a,b){l.uniform2iv(a,b)};this.uniform3iv=function(a,b){l.uniform3iv(a,b)};this.uniform1fv=function(a,b){l.uniform1fv(a,b)};this.uniform2fv=function(a,b){l.uniform2fv(a,b)};this.uniform3fv=function(a,b){l.uniform3fv(a,b)};this.uniform4fv=function(a,b){l.uniform3fv(a,b)};this.uniformMatrix3fv=function(a,b){l.uniformMatrix3fv(a,!1,b)};this.uniformMatrix4fv=function(a,b){l.uniformMatrix4fv(a,!1,b)};this.useProgram=function(a){l.useProgram(a)};
-this.compileShader=function(a,b){var c=l.createProgram(),d=n("fragment",b),e=n("vertex",a);l.attachShader(c,e);l.attachShader(c,d);l.linkProgram(c);l.getProgramParameter(c,l.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+l.getProgramParameter(c,l.VALIDATE_STATUS)+", gl error ["+l.getError()+"]");l.deleteShader(d);l.deleteShader(e);return c};this.setFaceCulling=function(a,b){a===THREE.CullFaceNone?l.disable(l.CULL_FACE):(b===THREE.FrontFaceDirectionCW?l.frontFace(l.CW):
-l.frontFace(l.CCW),a===THREE.CullFaceBack?l.cullFace(l.BACK):a===THREE.CullFaceFront?l.cullFace(l.FRONT):l.cullFace(l.FRONT_AND_BACK),l.enable(l.CULL_FACE))};this.setMaterialFaces=function(a){var b=a.side===THREE.DoubleSide,a=a.side===THREE.BackSide;K!==b&&(b?l.disable(l.CULL_FACE):l.enable(l.CULL_FACE),K=b);S!==a&&(a?l.frontFace(l.CW):l.frontFace(l.CCW),S=a)};this.setPolygonOffset=function(a,b,c){X!==a&&(a?l.enable(l.POLYGON_OFFSET_FILL):l.disable(l.POLYGON_OFFSET_FILL),X=a);if(a&&(U!==b||T!==c))l.polygonOffset(b,
-c),U=b,T=c};this.setBlending=function(a,b,c,d){a!==I&&(a===THREE.NoBlending?l.disable(l.BLEND):a===THREE.AdditiveBlending?(l.enable(l.BLEND),l.blendEquation(l.FUNC_ADD),l.blendFunc(l.SRC_ALPHA,l.ONE)):a===THREE.SubtractiveBlending?(l.enable(l.BLEND),l.blendEquation(l.FUNC_ADD),l.blendFunc(l.ZERO,l.ONE_MINUS_SRC_COLOR)):a===THREE.MultiplyBlending?(l.enable(l.BLEND),l.blendEquation(l.FUNC_ADD),l.blendFunc(l.ZERO,l.SRC_COLOR)):a===THREE.CustomBlending?l.enable(l.BLEND):(l.enable(l.BLEND),l.blendEquationSeparate(l.FUNC_ADD,
-l.FUNC_ADD),l.blendFuncSeparate(l.SRC_ALPHA,l.ONE_MINUS_SRC_ALPHA,l.ONE,l.ONE_MINUS_SRC_ALPHA)),I=a);if(a===THREE.CustomBlending){if(b!==M&&(l.blendEquation(k(b)),M=b),c!==J||d!==x)l.blendFunc(k(c),k(d)),J=c,x=d}else x=J=M=null};this.setDepthTest=function(a){aa!==a&&(a?l.enable(l.DEPTH_TEST):l.disable(l.DEPTH_TEST),aa=a)};this.setDepthWrite=function(a){Y!==a&&(l.depthMask(a),Y=a)};this.setTexture=function(a,b){if(a.needsUpdate){a.__webglInit||(a.__webglInit=!0,a.__webglTexture=l.createTexture());
-l.activeTexture(l.TEXTURE0+b);l.bindTexture(l.TEXTURE_2D,a.__webglTexture);l.pixelStorei(l.UNPACK_FLIP_Y_WEBGL,a.flipY);l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,a.premultiplyAlpha);l.pixelStorei(l.UNPACK_ALIGNMENT,a.unpackAlignment);var c=a.image,d=0===(c.width&c.width-1)&&0===(c.height&c.height-1),e=k(a.format),f=k(a.type);h(l.TEXTURE_2D,a,d);var g=a.mipmaps;if(a instanceof THREE.DataTexture)if(0<g.length&&d){for(var i=0,j=g.length;i<j;i++)c=g[i],l.texImage2D(l.TEXTURE_2D,i,e,c.width,c.height,
-0,e,f,c.data);a.generateMipmaps=!1}else l.texImage2D(l.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data);else if(a instanceof THREE.CompressedTexture){i=0;for(j=g.length;i<j;i++)c=g[i],l.compressedTexImage2D(l.TEXTURE_2D,i,e,c.width,c.height,0,c.data)}else if(0<g.length&&d){i=0;for(j=g.length;i<j;i++)c=g[i],l.texImage2D(l.TEXTURE_2D,i,e,e,f,c);a.generateMipmaps=!1}else l.texImage2D(l.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&l.generateMipmap(l.TEXTURE_2D);a.needsUpdate=!1;if(a.onUpdate)a.onUpdate()}else l.activeTexture(l.TEXTURE0+
-b),l.bindTexture(l.TEXTURE_2D,a.__webglTexture)};this.setCubeTexture=function(a,b){if(6===a.image.length)if(a.needsUpdate){a.image.__webglTextureCube||(a.image.__webglTextureCube=l.createTexture());l.activeTexture(l.TEXTURE0+b);l.bindTexture(l.TEXTURE_CUBE_MAP,a.image.__webglTextureCube);l.pixelStorei(l.UNPACK_FLIP_Y_WEBGL,a.flipY);for(var c=a instanceof THREE.CompressedTexture,d=[],e=0;6>e;e++)if(c)d[e]=a.image[e];else{var f=d,g=e,i;i=a.image[e];var j=Q;if(!(i.width<=j&&i.height<=j)){var m=Math.max(i.width,
-i.height),n=Math.floor(i.width*j/m),j=Math.floor(i.height*j/m),m=document.createElement("canvas");m.width=n;m.height=j;m.getContext("2d").drawImage(i,0,0,i.width,i.height,0,0,n,j);i=m}f[g]=i}e=d[0];f=0===(e.width&e.width-1)&&0===(e.height&e.height-1);g=k(a.format);i=k(a.type);h(l.TEXTURE_CUBE_MAP,a,f);for(e=0;6>e;e++)if(c)for(var j=d[e].mipmaps,m=0,p=j.length;m<p;m++)n=j[m],l.compressedTexImage2D(l.TEXTURE_CUBE_MAP_POSITIVE_X+e,m,g,n.width,n.height,0,n.data);else l.texImage2D(l.TEXTURE_CUBE_MAP_POSITIVE_X+
-e,0,g,g,i,d[e]);a.generateMipmaps&&f&&l.generateMipmap(l.TEXTURE_CUBE_MAP);a.needsUpdate=!1;if(a.onUpdate)a.onUpdate()}else l.activeTexture(l.TEXTURE0+b),l.bindTexture(l.TEXTURE_CUBE_MAP,a.image.__webglTextureCube)};this.updateRenderTargetMipmap=function(a){a instanceof THREE.WebGLRenderTargetCube?(l.bindTexture(l.TEXTURE_CUBE_MAP,a.__webglTexture),l.generateMipmap(l.TEXTURE_CUBE_MAP),l.bindTexture(l.TEXTURE_CUBE_MAP,null)):(l.bindTexture(l.TEXTURE_2D,a.__webglTexture),l.generateMipmap(l.TEXTURE_2D),
-l.bindTexture(l.TEXTURE_2D,null))};this.setCubeTextureDynamic=function(a,b){l.activeTexture(l.TEXTURE0+b);l.bindTexture(l.TEXTURE_CUBE_MAP,a.__webglTexture)};this.paramThreeToGL=k;this.setLineWidth=function(a){a!==V&&(l.lineWidth(a),V=a)};this.resetState=function(){S=K=Y=aa=I=-1}};THREE.WebGLRenderer.ShaderBuilder=function(a,b){this.renderer=a;this.info=b;this.programs=[];this.programs_counter=0};
-THREE.WebGLRenderer.ShaderBuilder.prototype.buildProgram=function(a,b,c,d,e,f,g){var h=this.renderer,i,j,k=[];a?k.push(a):(k.push(b),k.push(c));for(j in f)k.push(j),k.push(f[j]);for(i in g)k.push(i),k.push(g[i]);a=k.join();i=0;for(j=this.programs.length;i<j;i++)if(k=this.programs[i],k.code===a)return k.usedTimes++,k.program;i="SHADOWMAP_TYPE_BASIC";g.shadowMapType===THREE.PCFShadowMap?i="SHADOWMAP_TYPE_PCF":g.shadowMapType===THREE.PCFSoftShadowMap&&(i="SHADOWMAP_TYPE_PCF_SOFT");j=this.generateDefines(f);
+ba;return{context:l,autoScaleCubemaps:!0,supportsBoneTextures:a,precision:u,maxVertexUniformVectors:l.getParameter(l.MAX_VERTEX_UNIFORM_VECTORS),getContext:function(){return l},getDomElement:function(){return s},getPrecision:function(){return u},getCurrentWidth:function(){return E},getCurrentHeight:function(){return D},supportsVertexTextures:function(){return G},supportsFloatTextures:function(){return H},supportsStandardDerivatives:function(){return F},supportsCompressedTextureS3TC:function(){return N},
+getMaxAnisotropy:function(){return C},setRenderTarget:j,setSize:function(a,b){s.width=a;s.height=b;c(0,0,s.width,s.height)},setViewport:c,setScissor:function(a,b,c,d){l.scissor(a,b,c,d)},enableScissorTest:function(a){a?l.enable(l.SCISSOR_TEST):l.disable(l.SCISSOR_TEST)},setClearColorHex:function(a,b){z.setHex(a);r=b;l.clearColor(z.r,z.g,z.b,r)},setClearColor:function(a,b){z.copy(a);r=b;l.clearColor(z.r,z.g,z.b,r)},getClearColor:function(){return z},getClearAlpha:function(){return r},clear:d,clearTarget:function(a,
+b,c,e){j(a);d(b,c,e)},deleteBuffer:function(a){l.deleteBuffer(a)},deleteTexture:function(a){l.deleteTexture(a)},deleteFramebuffer:function(a){l.deleteFramebuffer(a)},deleteRenderbuffer:function(a){l.deleteRenderbuffer(a)},deleteProgram:function(a){l.deleteProgram(a)},createBuffer:function(){return l.createBuffer()},setStaticArrayBuffer:function(a,b){e(a);l.bufferData(l.ARRAY_BUFFER,b,l.STATIC_DRAW)},setStaticIndexBuffer:function(a,b){f(a);l.bufferData(l.ELEMENT_ARRAY_BUFFER,b,l.STATIC_DRAW)},setDynamicArrayBuffer:function(a,
+b){e(a);l.bufferData(l.ARRAY_BUFFER,b,l.DYNAMIC_DRAW)},setDynamicIndexBuffer:function(a,b){f(a);l.bufferData(l.ELEMENT_ARRAY_BUFFER,b,l.DYNAMIC_DRAW)},drawTriangles:function(a){l.drawArrays(l.TRIANGLES,0,a)},drawTriangleStrip:function(a){l.drawArrays(l.TRIANGLE_STRIP,0,a)},drawLines:function(a){l.drawArrays(l.LINES,0,a)},drawLineStrip:function(a){l.drawArrays(l.LINE_STRIP,0,a)},drawPoints:function(a){l.drawArrays(l.POINTS,0,a)},drawTriangleElements:function(a,b,c){f(a);l.drawElements(l.TRIANGLES,
+b,l.UNSIGNED_SHORT,c)},drawLineElements:function(a,b,c){f(a);l.drawElements(l.LINES,b,l.UNSIGNED_SHORT,c)},bindArrayBuffer:e,bindElementArrayBuffer:f,enableAttribute:g,disableAttributes:function(){for(var a in t)t[a]&&(l.disableVertexAttribArray(a),t[a]=!1)},getAttribLocation:function(a,b){return l.getAttribLocation(a,b)},setFloatAttribute:function(a,b,c,d){e(b);g(a);l.vertexAttribPointer(a,c,l.FLOAT,!1,0,d)},getUniformLocation:function(a,b){return l.getUniformLocation(a,b)},uniform1i:function(a,
+b){l.uniform1i(a,b)},uniform1f:function(a,b){l.uniform1f(a,b)},uniform2f:function(a,b,c){l.uniform2f(a,b,c)},uniform3f:function(a,b,c,d){l.uniform3f(a,b,c,d)},uniform4f:function(a,b,c,d,e){l.uniform4f(a,b,c,d,e)},uniform1iv:function(a,b){l.uniform1iv(a,b)},uniform2iv:function(a,b){l.uniform2iv(a,b)},uniform3iv:function(a,b){l.uniform3iv(a,b)},uniform1fv:function(a,b){l.uniform1fv(a,b)},uniform2fv:function(a,b){l.uniform2fv(a,b)},uniform3fv:function(a,b){l.uniform3fv(a,b)},uniform4fv:function(a,b){l.uniform3fv(a,
+b)},uniformMatrix3fv:function(a,b){l.uniformMatrix3fv(a,!1,b)},uniformMatrix4fv:function(a,b){l.uniformMatrix4fv(a,!1,b)},useProgram:function(a){l.useProgram(a)},compileShader:function(a,b){var c=l.createProgram(),d=n("fragment",b),e=n("vertex",a);l.attachShader(c,e);l.attachShader(c,d);l.linkProgram(c);l.getProgramParameter(c,l.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+l.getProgramParameter(c,l.VALIDATE_STATUS)+", gl error ["+l.getError()+"]");l.deleteShader(d);
+l.deleteShader(e);return c},setFaceCulling:function(a,b){a===THREE.CullFaceNone?l.disable(l.CULL_FACE):(b===THREE.FrontFaceDirectionCW?l.frontFace(l.CW):l.frontFace(l.CCW),a===THREE.CullFaceBack?l.cullFace(l.BACK):a===THREE.CullFaceFront?l.cullFace(l.FRONT):l.cullFace(l.FRONT_AND_BACK),l.enable(l.CULL_FACE))},setMaterialFaces:function(a){var b=a.side===THREE.DoubleSide,a=a.side===THREE.BackSide;K!==b&&(b?l.disable(l.CULL_FACE):l.enable(l.CULL_FACE),K=b);S!==a&&(a?l.frontFace(l.CW):l.frontFace(l.CCW),
+S=a)},setPolygonOffset:function(a,b,c){X!==a&&(a?l.enable(l.POLYGON_OFFSET_FILL):l.disable(l.POLYGON_OFFSET_FILL),X=a);if(a&&(U!==b||T!==c))l.polygonOffset(b,c),U=b,T=c},setBlending:function(a,b,c,d){a!==I&&(a===THREE.NoBlending?l.disable(l.BLEND):a===THREE.AdditiveBlending?(l.enable(l.BLEND),l.blendEquation(l.FUNC_ADD),l.blendFunc(l.SRC_ALPHA,l.ONE)):a===THREE.SubtractiveBlending?(l.enable(l.BLEND),l.blendEquation(l.FUNC_ADD),l.blendFunc(l.ZERO,l.ONE_MINUS_SRC_COLOR)):a===THREE.MultiplyBlending?
+(l.enable(l.BLEND),l.blendEquation(l.FUNC_ADD),l.blendFunc(l.ZERO,l.SRC_COLOR)):a===THREE.CustomBlending?l.enable(l.BLEND):(l.enable(l.BLEND),l.blendEquationSeparate(l.FUNC_ADD,l.FUNC_ADD),l.blendFuncSeparate(l.SRC_ALPHA,l.ONE_MINUS_SRC_ALPHA,l.ONE,l.ONE_MINUS_SRC_ALPHA)),I=a);if(a===THREE.CustomBlending){if(b!==M&&(l.blendEquation(k(b)),M=b),c!==J||d!==x)l.blendFunc(k(c),k(d)),J=c,x=d}else x=J=M=null},setDepthTest:function(a){aa!==a&&(a?l.enable(l.DEPTH_TEST):l.disable(l.DEPTH_TEST),aa=a)},setDepthWrite:function(a){Y!==
+a&&(l.depthMask(a),Y=a)},setTexture:function(a,b){if(a.needsUpdate){a.__webglInit||(a.__webglInit=!0,a.__webglTexture=l.createTexture());l.activeTexture(l.TEXTURE0+b);l.bindTexture(l.TEXTURE_2D,a.__webglTexture);l.pixelStorei(l.UNPACK_FLIP_Y_WEBGL,a.flipY);l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,a.premultiplyAlpha);l.pixelStorei(l.UNPACK_ALIGNMENT,a.unpackAlignment);var c=a.image,d=0===(c.width&c.width-1)&&0===(c.height&c.height-1),e=k(a.format),f=k(a.type);h(l.TEXTURE_2D,a,d);var g=a.mipmaps;
+if(a instanceof THREE.DataTexture)if(0<g.length&&d){for(var i=0,j=g.length;i<j;i++)c=g[i],l.texImage2D(l.TEXTURE_2D,i,e,c.width,c.height,0,e,f,c.data);a.generateMipmaps=!1}else l.texImage2D(l.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data);else if(a instanceof THREE.CompressedTexture){i=0;for(j=g.length;i<j;i++)c=g[i],l.compressedTexImage2D(l.TEXTURE_2D,i,e,c.width,c.height,0,c.data)}else if(0<g.length&&d){i=0;for(j=g.length;i<j;i++)c=g[i],l.texImage2D(l.TEXTURE_2D,i,e,e,f,c);a.generateMipmaps=!1}else l.texImage2D(l.TEXTURE_2D,
+0,e,e,f,a.image);a.generateMipmaps&&d&&l.generateMipmap(l.TEXTURE_2D);a.needsUpdate=!1;if(a.onUpdate)a.onUpdate()}else l.activeTexture(l.TEXTURE0+b),l.bindTexture(l.TEXTURE_2D,a.__webglTexture)},setCubeTexture:function(a,b){if(6===a.image.length)if(a.needsUpdate){a.image.__webglTextureCube||(a.image.__webglTextureCube=l.createTexture());l.activeTexture(l.TEXTURE0+b);l.bindTexture(l.TEXTURE_CUBE_MAP,a.image.__webglTextureCube);l.pixelStorei(l.UNPACK_FLIP_Y_WEBGL,a.flipY);for(var c=a instanceof THREE.CompressedTexture,
+d=[],e=0;6>e;e++)if(c)d[e]=a.image[e];else{var f=d,g=e,i;i=a.image[e];var j=Q;if(!(i.width<=j&&i.height<=j)){var m=Math.max(i.width,i.height),n=Math.floor(i.width*j/m),j=Math.floor(i.height*j/m),m=document.createElement("canvas");m.width=n;m.height=j;m.getContext("2d").drawImage(i,0,0,i.width,i.height,0,0,n,j);i=m}f[g]=i}e=d[0];f=0===(e.width&e.width-1)&&0===(e.height&e.height-1);g=k(a.format);i=k(a.type);h(l.TEXTURE_CUBE_MAP,a,f);for(e=0;6>e;e++)if(c)for(var j=d[e].mipmaps,m=0,p=j.length;m<p;m++)n=
+j[m],l.compressedTexImage2D(l.TEXTURE_CUBE_MAP_POSITIVE_X+e,m,g,n.width,n.height,0,n.data);else l.texImage2D(l.TEXTURE_CUBE_MAP_POSITIVE_X+e,0,g,g,i,d[e]);a.generateMipmaps&&f&&l.generateMipmap(l.TEXTURE_CUBE_MAP);a.needsUpdate=!1;if(a.onUpdate)a.onUpdate()}else l.activeTexture(l.TEXTURE0+b),l.bindTexture(l.TEXTURE_CUBE_MAP,a.image.__webglTextureCube)},updateRenderTargetMipmap:function(a){a instanceof THREE.WebGLRenderTargetCube?(l.bindTexture(l.TEXTURE_CUBE_MAP,a.__webglTexture),l.generateMipmap(l.TEXTURE_CUBE_MAP),
+l.bindTexture(l.TEXTURE_CUBE_MAP,null)):(l.bindTexture(l.TEXTURE_2D,a.__webglTexture),l.generateMipmap(l.TEXTURE_2D),l.bindTexture(l.TEXTURE_2D,null))},setCubeTextureDynamic:function(a,b){l.activeTexture(l.TEXTURE0+b);l.bindTexture(l.TEXTURE_CUBE_MAP,a.__webglTexture)},paramThreeToGL:k,setLineWidth:function(a){a!==V&&(l.lineWidth(a),V=a)},resetState:function(){S=K=Y=aa=I=-1}}};THREE.WebGLRenderer.ShaderBuilder=function(a,b){this.renderer=a;this.info=b;this.programs=[];this.programs_counter=0};
+THREE.extend(THREE.WebGLRenderer.ShaderBuilder.prototype,{buildProgram:function(a,b,c,d,e,f,g){var h=this.renderer,i,j,k=[];a?k.push(a):(k.push(b),k.push(c));for(j in f)k.push(j),k.push(f[j]);for(i in g)k.push(i),k.push(g[i]);a=k.join();i=0;for(j=this.programs.length;i<j;i++)if(k=this.programs[i],k.code===a)return k.usedTimes++,k.program;i="SHADOWMAP_TYPE_BASIC";g.shadowMapType===THREE.PCFShadowMap?i="SHADOWMAP_TYPE_PCF":g.shadowMapType===THREE.PCFSoftShadowMap&&(i="SHADOWMAP_TYPE_PCF_SOFT");j=this.generateDefines(f);
 f=["precision "+h.precision+" float;",j,h.supportsVertexTextures?"#define VERTEX_TEXTURES":"",g.gammaInput?"#define GAMMA_INPUT":"",g.gammaOutput?"#define GAMMA_OUTPUT":"",g.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"","#define MAX_DIR_LIGHTS "+g.maxDirLights,"#define MAX_POINT_LIGHTS "+g.maxPointLights,"#define MAX_SPOT_LIGHTS "+g.maxSpotLights,"#define MAX_HEMI_LIGHTS "+g.maxHemiLights,"#define MAX_SHADOWS "+g.maxShadows,"#define MAX_BONES "+g.maxBones,g.map?"#define USE_MAP":"",
 g.envMap?"#define USE_ENVMAP":"",g.lightMap?"#define USE_LIGHTMAP":"",g.bumpMap?"#define USE_BUMPMAP":"",g.normalMap?"#define USE_NORMALMAP":"",g.specularMap?"#define USE_SPECULARMAP":"",g.vertexColors?"#define USE_COLOR":"",g.skinning?"#define USE_SKINNING":"",g.useVertexTexture?"#define BONE_TEXTURE":"",g.boneTextureWidth?"#define N_BONE_PIXEL_X "+g.boneTextureWidth.toFixed(1):"",g.boneTextureHeight?"#define N_BONE_PIXEL_Y "+g.boneTextureHeight.toFixed(1):"",g.morphTargets?"#define USE_MORPHTARGETS":
 "",g.morphNormals?"#define USE_MORPHNORMALS":"",g.perPixel?"#define PHONG_PER_PIXEL":"",g.wrapAround?"#define WRAP_AROUND":"",g.doubleSided?"#define DOUBLE_SIDED":"",g.flipSided?"#define FLIP_SIDED":"",g.shadowMapEnabled?"#define USE_SHADOWMAP":"",g.shadowMapEnabled?"#define "+i:"",g.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",g.shadowMapCascade?"#define SHADOWMAP_CASCADE":"",g.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\n#ifdef USE_MORPHNORMALS\nattribute vec3 morphNormal0;\nattribute vec3 morphNormal1;\nattribute vec3 morphNormal2;\nattribute vec3 morphNormal3;\n#else\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n");
 i=["precision "+h.precision+" float;",g.bumpMap||g.normalMap?"#extension GL_OES_standard_derivatives : enable":"",j,"#define MAX_DIR_LIGHTS "+g.maxDirLights,"#define MAX_POINT_LIGHTS "+g.maxPointLights,"#define MAX_SPOT_LIGHTS "+g.maxSpotLights,"#define MAX_HEMI_LIGHTS "+g.maxHemiLights,"#define MAX_SHADOWS "+g.maxShadows,g.alphaTest?"#define ALPHATEST "+g.alphaTest:"",g.gammaInput?"#define GAMMA_INPUT":"",g.gammaOutput?"#define GAMMA_OUTPUT":"",g.useFog&&g.fog?"#define USE_FOG":"",g.useFog&&g.fogExp?
 "#define FOG_EXP2":"",g.map?"#define USE_MAP":"",g.envMap?"#define USE_ENVMAP":"",g.lightMap?"#define USE_LIGHTMAP":"",g.bumpMap?"#define USE_BUMPMAP":"",g.normalMap?"#define USE_NORMALMAP":"",g.specularMap?"#define USE_SPECULARMAP":"",g.vertexColors?"#define USE_COLOR":"",g.metal?"#define METAL":"",g.perPixel?"#define PHONG_PER_PIXEL":"",g.wrapAround?"#define WRAP_AROUND":"",g.doubleSided?"#define DOUBLE_SIDED":"",g.flipSided?"#define FLIP_SIDED":"",g.shadowMapEnabled?"#define USE_SHADOWMAP":"",
 g.shadowMapEnabled?"#define "+i:"",g.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",g.shadowMapCascade?"#define SHADOWMAP_CASCADE":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");b=h.compileShader(f+c,i+b);b.uniforms={};b.attributes={};var n,m,c="viewMatrix modelViewMatrix projectionMatrix normalMatrix modelMatrix cameraPosition morphTargetInfluences".split(" ");g.useVertexTexture?c.push("boneTexture"):c.push("boneGlobalMatrices");for(n in d)c.push(n);this.cacheUniformLocations(b,
-c);c="position normal uv uv2 tangent color skinIndex skinWeight lineDistance".split(" ");for(d=0;d<g.maxMorphTargets;d++)c.push("morphTarget"+d);for(d=0;d<g.maxMorphNormals;d++)c.push("morphNormal"+d);for(m in e)c.push(m);this.cacheAttributeLocations(b,c);b.id=this.programs_counter++;this.programs.push({program:b,code:a,usedTimes:1});this.info.memory.programs=this.programs.length;return b};
-THREE.WebGLRenderer.ShaderBuilder.prototype.generateDefines=function(a){var b,c=[],d;for(d in a)b=a[d],!1!==b&&(b="#define "+d+" "+b,c.push(b));return c.join("\n")};THREE.WebGLRenderer.ShaderBuilder.prototype.cacheUniformLocations=function(a,b){var c,d,e,f=this.renderer;c=0;for(d=b.length;c<d;c++)e=b[c],a.uniforms[e]=f.getUniformLocation(a,e)};
-THREE.WebGLRenderer.ShaderBuilder.prototype.cacheAttributeLocations=function(a,b){var c,d,e,f=this.renderer;c=0;for(d=b.length;c<d;c++)e=b[c],a.attributes[e]=f.getAttribLocation(a,e)};THREE.WebGLRenderer.ShaderBuilder.prototype.removeProgram=function(a){var b,c,d,e=!1,f=this.programs;b=0;for(c=f.length;b<c;b++)if(d=f[b],d.program===a){d.usedTimes--;0===d.usedTimes&&(e=!0);break}if(!0===e){e=[];b=0;for(c=f.length;b<c;b++)d=f[b],d.program!==a&&e.push(d);this.renderer.deleteProgram(a);this.info.memory.programs--}};THREE.WebGLRenderer.Object3DRenderer=function(a,b){this.renderer=a;this.info=b};
+c);c="position normal uv uv2 tangent color skinIndex skinWeight lineDistance".split(" ");for(d=0;d<g.maxMorphTargets;d++)c.push("morphTarget"+d);for(d=0;d<g.maxMorphNormals;d++)c.push("morphNormal"+d);for(m in e)c.push(m);this.cacheAttributeLocations(b,c);b.id=this.programs_counter++;this.programs.push({program:b,code:a,usedTimes:1});this.info.memory.programs=this.programs.length;return b},generateDefines:function(a){var b,c=[],d;for(d in a)b=a[d],!1!==b&&(b="#define "+d+" "+b,c.push(b));return c.join("\n")},
+cacheUniformLocations:function(a,b){var c,d,e,f=this.renderer;c=0;for(d=b.length;c<d;c++)e=b[c],a.uniforms[e]=f.getUniformLocation(a,e)},cacheAttributeLocations:function(a,b){var c,d,e,f=this.renderer;c=0;for(d=b.length;c<d;c++)e=b[c],a.attributes[e]=f.getAttribLocation(a,e)},removeProgram:function(a){var b,c,d,e=!1,f=this.programs;b=0;for(c=f.length;b<c;b++)if(d=f[b],d.program===a){d.usedTimes--;0===d.usedTimes&&(e=!0);break}if(!0===e){e=[];b=0;for(c=f.length;b<c;b++)d=f[b],d.program!==a&&e.push(d);
+this.renderer.deleteProgram(a);this.info.memory.programs--}}});THREE.WebGLRenderer.Object3DRenderer=function(a,b){this.renderer=a;this.info=b};
 THREE.extend(THREE.WebGLRenderer.Object3DRenderer.prototype,{getBufferMaterial:function(a,b){return a.material instanceof THREE.MeshFaceMaterial?a.material.materials[b.materialIndex]:a.material},bufferGuessUVType:function(a){return a.map||a.lightMap||a.bumpMap||a.normalMap||a.specularMap||a instanceof THREE.ShaderMaterial?!0:!1},bufferGuessNormalType:function(a){return a instanceof THREE.MeshBasicMaterial&&!a.envMap||a instanceof THREE.MeshDepthMaterial?!1:this.materialNeedsSmoothNormals(a)?THREE.SmoothShading:
 THREE.FlatShading},materialNeedsSmoothNormals:function(a){return a&&void 0!==a.shading&&a.shading===THREE.SmoothShading},bufferGuessVertexColorType:function(a){return a.vertexColors?a.vertexColors:!1},initCustomAttributes:function(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){void 0===a.__webglCustomAttributesList&&(a.__webglCustomAttributesList=[]);for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=!0;var g=1;"v2"===
 f.type?g=2:"v3"===f.type?g=3:"v4"===f.type?g=4:"c"===f.type&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=this.renderer.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=!0}a.__webglCustomAttributesList.push(f)}}},numericalSort:function(a,b){return b[0]-a[0]}});THREE.WebGLRenderer.MeshRenderer=function(a,b){THREE.WebGLRenderer.Object3DRenderer.call(this,a,b)};THREE.WebGLRenderer.MeshRenderer.prototype=Object.create(THREE.WebGLRenderer.Object3DRenderer.prototype);

+ 1 - 1
src/renderers/WebGLRendererOld.js

@@ -5,7 +5,7 @@
  * @author szimek / https://github.com/szimek/
  */
 
-THREE.WebGLRendererOld = function ( parameters ) {
+THREE.WebGLRenderer = function ( parameters ) {
 
 	console.log( 'THREE.WebGLRenderer', THREE.REVISION );
 

+ 216 - 178
src/renderers/webgl/LowLevelRenderer.js

@@ -1,7 +1,7 @@
 
 /*global THREE:false */
 
-THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
+THREE.WebGLRenderer.LowLevelRenderer = function ( parameters ) {
 
 	parameters = parameters || {};
 
@@ -181,7 +181,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setDefaultGLState () {
 
@@ -202,7 +202,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		_gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
 
-	};
+	}
 
 	// Fallback filters for non-power-of-2 textures
 
@@ -216,67 +216,67 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return _gl.LINEAR;
 
-	};
+	}
 
 	function getContext() {
 
 		return _gl;
 
-	};
+	}
 
 	function getDomElement(){
 
 		return _canvas;
 
-	};
+	}
 
 	function getPrecision() {
 
 		return _precision;
 
-	};
+	}
 
 	function getCurrentWidth(){
 
 		return _currentWidth;
 
-	};
+	}
 
 	function getCurrentHeight(){
 
 		return _currentHeight;
 
-	};
+	}
 
 	function supportsVertexTextures() {
 
 		return _supportsVertexTextures;
 
-	};
+	}
 
 	function supportsFloatTextures() {
 
 		return _glExtensionTextureFloat;
 
-	};
+	}
 
 	function supportsStandardDerivatives() {
 
 		return _glExtensionStandardDerivatives;
 
-	};
+	}
 
 	function supportsCompressedTextureS3TC() {
 
 		return _glExtensionCompressedTextureS3TC;
 
-	};
+	}
 
 	function getMaxAnisotropy() {
 
 		return _maxAnisotropy;
 
-	};
+	}
 
 	function setSize( width, height ) {
 
@@ -285,7 +285,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		setViewport( 0, 0, _canvas.width, _canvas.height );
 
-	};
+	}
 
 	function setViewport( x, y, width, height ) {
 
@@ -297,19 +297,19 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		_gl.viewport( _viewportX, _viewportY, _viewportWidth, _viewportHeight );
 
-	};
+	}
 
 	function setScissor( x, y, width, height ) {
 
 		_gl.scissor( x, y, width, height );
 
-	};
+	}
 
 	function enableScissorTest( enable ) {
 
 		enable ? _gl.enable( _gl.SCISSOR_TEST ) : _gl.disable( _gl.SCISSOR_TEST );
 
-	};
+	}
 
 	// Clearing
 
@@ -320,7 +320,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		_gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
 
-	};
+	}
 
 	function setClearColor( color, alpha ) {
 
@@ -329,19 +329,19 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		_gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
 
-	};
+	}
 
 	function getClearColor() {
 
 		return _clearColor;
 
-	};
+	}
 
 	function getClearAlpha() {
 
 		return _clearAlpha;
 
-	};
+	}
 
 	function clear( color, depth, stencil ) {
 
@@ -353,115 +353,146 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		_gl.clear( bits );
 
-	};
+	}
 
 	function clearTarget( renderTarget, color, depth, stencil ) {
 
 		setRenderTarget( renderTarget );
 		clear( color, depth, stencil );
 
-	};
+	}
 
 	function deleteBuffer(buffer){
+
 		_gl.deleteBuffer(buffer);
-	};
+
+	}
 
 	function deleteTexture(texture){
+
 		_gl.deleteTexture( texture );
-	};
+
+	}
 
 	function deleteFramebuffer(Framebuffer){
+
 		_gl.deleteFramebuffer(Framebuffer);
-	};
+
+	}
 
 	function deleteRenderbuffer(RenderBuffer){
+
 		_gl.deleteRenderbuffer(RenderBuffer);
-	};
+
+	}
 
 	function deleteProgram(RenderBuffer){
+
 		_gl.deleteProgram(RenderBuffer);
-	};
+
+	}
 
 	function createBuffer(){
+
 		return _gl.createBuffer();
-	};
+
+	}
 
 	function setStaticArrayBuffer(buffer,data){
 
 		bindArrayBuffer( buffer );
 		_gl.bufferData( _gl.ARRAY_BUFFER, data, _gl.STATIC_DRAW );
 
-	};
+	}
 
 	function setStaticIndexBuffer(buffer,data){
 
 		bindElementArrayBuffer( buffer );
 		_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, data, _gl.STATIC_DRAW );
 
-	};
+	}
 
 	function setDynamicArrayBuffer(buffer,data){
 
 		bindArrayBuffer( buffer );
 		_gl.bufferData( _gl.ARRAY_BUFFER, data, _gl.DYNAMIC_DRAW );
 
-	};
+	}
 
 	function setDynamicIndexBuffer(buffer,data){
 
 		bindElementArrayBuffer( buffer );
 		_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, data, _gl.DYNAMIC_DRAW );
 
-	};
+	}
 
 	function drawTriangles(count){
+
 		_gl.drawArrays( _gl.TRIANGLES, 0, count );
-	};
+
+	}
 
 	function drawTriangleStrip(count){
+
 		_gl.drawArrays( _gl.TRIANGLE_STRIP, 0, count );
-	};
+
+	}
 
 	function drawLines(count){
+
 		_gl.drawArrays( _gl.LINES, 0, count );
-	};
+
+	}
 
 	function drawLineStrip(count){
+
 		_gl.drawArrays( _gl.LINE_STRIP, 0, count );
-	};
+
+	}
 
 	function drawPoints(count){
+
 		_gl.drawArrays( _gl.POINTS, 0, count );
-	};
+
+	}
 
 	function drawTriangleElements(buffer,count,offset){
+
 		bindElementArrayBuffer( buffer );
 		_gl.drawElements( _gl.TRIANGLES, count, _gl.UNSIGNED_SHORT, offset ); // 2 bytes per Uint16
-	};
+
+	}
 
 	function drawLineElements(buffer,count,offset){
+
 		bindElementArrayBuffer(  buffer );
 		_gl.drawElements( _gl.LINES, count, _gl.UNSIGNED_SHORT, offset ); // 2 bytes per Uint16
-	};
 
+	}
 
 	var _boundBuffer;
+
 	function bindArrayBuffer(buffer){
+
 		if (_boundBuffer != buffer){
+
 			_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
 			_boundBuffer = buffer;
+
 		}
 
-	};
+	}
 
 	function bindElementArrayBuffer(buffer){
 
 		if (_boundBuffer != buffer){
+
 			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, buffer );
 			_boundBuffer = buffer;
+
 		}
 
-	};
+	}
 
 	function enableAttribute( attribute ) {
 
@@ -472,7 +503,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function disableAttributes() {
 
@@ -487,10 +518,12 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function getAttribLocation( program, id ){
+
 		return _gl.getAttribLocation( program, id );
+
 	}
 
 	function setFloatAttribute(index,buffer,size,offset){
@@ -499,7 +532,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 		enableAttribute( index );
 		_gl.vertexAttribPointer( index, size, _gl.FLOAT, false, 0, offset );
 
-	};
+	}
 
 	function getUniformLocation( program, id ){
 
@@ -511,91 +544,91 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		_gl.uniform1i( uniform, value );
 
-	};
+	}
 
 	function uniform1f(uniform,value){
 
 		_gl.uniform1f( uniform, value );
 
-	};
+	}
 
 	function uniform2f(uniform,value1, value2){
 
 		_gl.uniform2f( uniform, value1, value2 );
 
-	};
+	}
 
 	function uniform3f(uniform, value1, value2, value3){
 
 		_gl.uniform3f( uniform, value1, value2, value3 );
 
-	};
+	}
 
 	function uniform4f(uniform, value1, value2, value3, value4){
 
 		_gl.uniform4f( uniform, value1, value2, value3, value4);
 
-	};
+	}
 
 	function uniform1iv(uniform,value){
 
 		_gl.uniform1iv( uniform, value );
 
-	};
+	}
 
 	function uniform2iv(uniform,value){
 
 		_gl.uniform2iv( uniform, value );
 
-	};
+	}
 
 	function uniform3iv(uniform,value){
 
 		_gl.uniform3iv( uniform, value );
 
-	};
+	}
 
 	function uniform1fv(uniform,value){
 
 		_gl.uniform1fv( uniform, value );
 
-	};
+	}
 
 	function uniform2fv(uniform,value){
 
 		_gl.uniform2fv( uniform, value );
 
-	};
+	}
 
 	function uniform3fv(uniform,value){
 
 		_gl.uniform3fv( uniform, value );
 
-	};
+	}
 
 	function uniform4fv(uniform,value){
 
 		_gl.uniform3fv( uniform, value );
 
-	};
+	}
 
 	function uniformMatrix3fv(location,value){
 
 		_gl.uniformMatrix3fv( location, false, value );
 
-	};
+	}
 
 	function uniformMatrix4fv(location,value){
 
 		_gl.uniformMatrix4fv( location, false, value );
 
-	};
+	}
 
 	function useProgram(program){
 
 		_gl.useProgram( program );
 
-	};
+	}
 
 	function setFaceCulling( cullFace, frontFaceDirection ) {
 
@@ -633,7 +666,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setMaterialFaces( material ) {
 
@@ -672,7 +705,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setPolygonOffset ( polygonoffset, factor, units ) {
 
@@ -701,7 +734,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setBlending( blending, blendEquation, blendSrc, blendDst ) {
 
@@ -774,7 +807,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setDepthTest( depthTest ) {
 
@@ -794,7 +827,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setDepthWrite( depthWrite ) {
 
@@ -805,7 +838,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setTexture( texture, slot ) {
 
@@ -912,7 +945,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setCubeTexture ( texture, slot ) {
 
@@ -997,7 +1030,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	// Textures
 
@@ -1005,7 +1038,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return ( value & ( value - 1 ) ) === 0;
 
-	};
+	}
 
 	function setTextureParameters ( textureType, texture, isImagePowerOfTwo ) {
 
@@ -1038,14 +1071,14 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) {
 
 		_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
 		_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, renderTarget.__webglTexture, 0 );
 
-	};
+	}
 
 	function setupRenderBuffer ( renderbuffer, renderTarget  ) {
 
@@ -1073,7 +1106,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setRenderTarget( renderTarget ) {
 
@@ -1222,7 +1255,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 		_currentWidth = width;
 		_currentHeight = height;
 
-	};
+	}
 
 	function clampToMaxSize ( image, maxSize ) {
 
@@ -1248,7 +1281,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return canvas;
 
-	};
+	}
 
 	function updateRenderTargetMipmap ( renderTarget ) {
 
@@ -1266,14 +1299,14 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
+	}
 
 	function setCubeTextureDynamic ( texture, slot ) {
 
 		_gl.activeTexture( _gl.TEXTURE0 + slot );
 		_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.__webglTexture );
 
-	};
+	}
 
 	// Map three.js constants to WebGL constants
 	function paramThreeToGL ( p ) {
@@ -1336,7 +1369,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return 0;
 
-	};
+	}
 
 	function compileShader(vertexShader, fragmentShader){
 
@@ -1363,7 +1396,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return program;
 
-	};
+	}
 
 	function resetState(){
 
@@ -1402,7 +1435,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return shader;
 
-	};
+	}
 
 	function addLineNumbers ( string ) {
 
@@ -1419,7 +1452,7 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		return chunks.join( "\n" );
 
-	};
+	}
 
 	function setLineWidth ( width ) {
 
@@ -1431,102 +1464,107 @@ THREE.WebGLRenderer.LowLevelRenderer = function(parameters){
 
 		}
 
-	};
-
-	this.context = _gl;
-
-	this.autoScaleCubemaps = _autoScaleCubemaps;
-	this.supportsBoneTextures = _supportsBoneTextures;
-	this.precision = _precision;
-	this.maxVertexUniformVectors = _gl.getParameter( _gl.MAX_VERTEX_UNIFORM_VECTORS );	
-
-	// Methods
-	this.getContext = getContext;
-	this.getDomElement = getDomElement;
-	this.getPrecision = getPrecision;
-	this.getCurrentWidth = getCurrentWidth;
-	this.getCurrentHeight = getCurrentHeight;
-	this.supportsVertexTextures = supportsVertexTextures;
-	this.supportsFloatTextures = supportsFloatTextures;
-	this.supportsStandardDerivatives = supportsStandardDerivatives;
-	this.supportsCompressedTextureS3TC = supportsCompressedTextureS3TC;
-	this.getMaxAnisotropy  = getMaxAnisotropy;
-
-	this.setRenderTarget = setRenderTarget;
-	this.setSize = setSize;
-	this.setViewport = setViewport;
-	this.setScissor = setScissor;
-	this.enableScissorTest = enableScissorTest;
-
-	this.setClearColorHex = setClearColorHex;
-	this.setClearColor = setClearColor;
-	this.getClearColor = getClearColor;
-	this.getClearAlpha = getClearAlpha;
-	this.clear = clear;
-	this.clearTarget = clearTarget;
-
-	this.deleteBuffer = deleteBuffer;
-	this.deleteTexture = deleteTexture;
-	this.deleteFramebuffer = deleteFramebuffer;
-	this.deleteRenderbuffer = deleteRenderbuffer;
-	this.deleteProgram = deleteProgram;
-
-	this.createBuffer = createBuffer;
-	this.setStaticArrayBuffer = setStaticArrayBuffer;
-	this.setStaticIndexBuffer = setStaticIndexBuffer;
-	this.setDynamicArrayBuffer = setDynamicArrayBuffer;
-	this.setDynamicIndexBuffer = setDynamicIndexBuffer;
-
-	this.drawTriangles = drawTriangles;
-	this.drawTriangleStrip = drawTriangleStrip;
-	this.drawLines = drawLines;
-	this.drawLineStrip = drawLineStrip;
-	this.drawPoints = drawPoints;
-	this.drawTriangleElements = drawTriangleElements;
-	this.drawLineElements = drawLineElements;
-
-	this.bindArrayBuffer = bindArrayBuffer;
-	this.bindElementArrayBuffer = bindElementArrayBuffer;
-
-	this.enableAttribute = enableAttribute;
-	this.disableAttributes = disableAttributes;
-	this.getAttribLocation = getAttribLocation;
-	this.setFloatAttribute = setFloatAttribute;
-
-	this.getUniformLocation= getUniformLocation;
-
-	this.uniform1i = uniform1i;
-	this.uniform1f = uniform1f;
-	this.uniform2f = uniform2f;
-	this.uniform3f = uniform3f;
-	this.uniform4f = uniform4f;
-	this.uniform1iv = uniform1iv;
-	this.uniform2iv = uniform2iv;
-	this.uniform3iv = uniform3iv;
-	this.uniform1fv = uniform1fv;
-	this.uniform2fv = uniform2fv;
-	this.uniform3fv = uniform3fv;
-	this.uniform4fv = uniform4fv;
-	this.uniformMatrix3fv = uniformMatrix3fv;
-	this.uniformMatrix4fv = uniformMatrix4fv;
-
-	this.useProgram = useProgram;
-	this.compileShader = compileShader;
-
-	this.setFaceCulling = setFaceCulling;
-	this.setMaterialFaces = setMaterialFaces;
-	this.setPolygonOffset = setPolygonOffset;
-	this.setBlending = setBlending;
-	this.setDepthTest = setDepthTest;
-	this.setDepthWrite = setDepthWrite;
-
-	this.setTexture = setTexture;
-	this.setCubeTexture = setCubeTexture;
-	this.updateRenderTargetMipmap = updateRenderTargetMipmap;
-	this.setCubeTextureDynamic = setCubeTextureDynamic;
-
-	this.paramThreeToGL = paramThreeToGL;
-	this.setLineWidth = setLineWidth;
-	this.resetState = resetState;
+	}
+
+	return {
+
+		context: _gl,
+
+		autoScaleCubemaps: _autoScaleCubemaps,
+		supportsBoneTextures: _supportsBoneTextures,
+		precision: _precision,
+		maxVertexUniformVectors: _gl.getParameter( _gl.MAX_VERTEX_UNIFORM_VECTORS ),
+
+		// Methods
+
+		getContext: getContext,
+		getDomElement: getDomElement,
+		getPrecision: getPrecision,
+		getCurrentWidth: getCurrentWidth,
+		getCurrentHeight: getCurrentHeight,
+		supportsVertexTextures: supportsVertexTextures,
+		supportsFloatTextures: supportsFloatTextures,
+		supportsStandardDerivatives: supportsStandardDerivatives,
+		supportsCompressedTextureS3TC: supportsCompressedTextureS3TC,
+		getMaxAnisotropy: getMaxAnisotropy,
+
+		setRenderTarget: setRenderTarget,
+		setSize: setSize,
+		setViewport: setViewport,
+		setScissor: setScissor,
+		enableScissorTest: enableScissorTest,
+
+		setClearColorHex: setClearColorHex,
+		setClearColor: setClearColor,
+		getClearColor: getClearColor,
+		getClearAlpha: getClearAlpha,
+		clear: clear,
+		clearTarget: clearTarget,
+
+		deleteBuffer: deleteBuffer,
+		deleteTexture: deleteTexture,
+		deleteFramebuffer: deleteFramebuffer,
+		deleteRenderbuffer: deleteRenderbuffer,
+		deleteProgram: deleteProgram,
+
+		createBuffer: createBuffer,
+		setStaticArrayBuffer: setStaticArrayBuffer,
+		setStaticIndexBuffer: setStaticIndexBuffer,
+		setDynamicArrayBuffer: setDynamicArrayBuffer,
+		setDynamicIndexBuffer: setDynamicIndexBuffer,
+
+		drawTriangles: drawTriangles,
+		drawTriangleStrip: drawTriangleStrip,
+		drawLines: drawLines,
+		drawLineStrip: drawLineStrip,
+		drawPoints: drawPoints,
+		drawTriangleElements: drawTriangleElements,
+		drawLineElements: drawLineElements,
+
+		bindArrayBuffer: bindArrayBuffer,
+		bindElementArrayBuffer: bindElementArrayBuffer,
+
+		enableAttribute: enableAttribute,
+		disableAttributes: disableAttributes,
+		getAttribLocation: getAttribLocation,
+		setFloatAttribute: setFloatAttribute,
+
+		getUniformLocation: getUniformLocation,
+
+		uniform1i: uniform1i,
+		uniform1f: uniform1f,
+		uniform2f: uniform2f,
+		uniform3f: uniform3f,
+		uniform4f: uniform4f,
+		uniform1iv: uniform1iv,
+		uniform2iv: uniform2iv,
+		uniform3iv: uniform3iv,
+		uniform1fv: uniform1fv,
+		uniform2fv: uniform2fv,
+		uniform3fv: uniform3fv,
+		uniform4fv: uniform4fv,
+		uniformMatrix3fv: uniformMatrix3fv,
+		uniformMatrix4fv: uniformMatrix4fv,
+
+		useProgram: useProgram,
+		compileShader: compileShader,
+
+		setFaceCulling: setFaceCulling,
+		setMaterialFaces: setMaterialFaces,
+		setPolygonOffset: setPolygonOffset,
+		setBlending: setBlending,
+		setDepthTest: setDepthTest,
+		setDepthWrite: setDepthWrite,
+
+		setTexture: setTexture,
+		setCubeTexture: setCubeTexture,
+		updateRenderTargetMipmap: updateRenderTargetMipmap,
+		setCubeTextureDynamic: setCubeTextureDynamic,
+
+		paramThreeToGL: paramThreeToGL,
+		setLineWidth: setLineWidth,
+		resetState: resetState
+
+	}
 
 };

+ 241 - 235
src/renderers/webgl/ShaderBuilder.js

@@ -1,406 +1,412 @@
 
-THREE.WebGLRenderer.ShaderBuilder = function(renderer,info){
+THREE.WebGLRenderer.ShaderBuilder = function ( renderer, info ) {
+
 	this.renderer = renderer;
 	this.info = info;
 	this.programs = [],
 	this.programs_counter = 0;
-}
 
-THREE.WebGLRenderer.ShaderBuilder.prototype.buildProgram = function ( shaderID, fragmentShader, vertexShader, uniforms, attributes, defines, parameters ) {
+};
 
-	var renderer = this.renderer;
-	var p, pl, d, program, code;
-	var chunks = [];
+THREE.extend( THREE.WebGLRenderer.ShaderBuilder.prototype, {
 
-	// Generate code
+	buildProgram: function ( shaderID, fragmentShader, vertexShader, uniforms, attributes, defines, parameters ) {
 
-	if ( shaderID ) {
+		var renderer = this.renderer;
+		var p, pl, d, program, code;
+		var chunks = [];
 
-		chunks.push( shaderID );
+		// Generate code
 
-	} else {
+		if ( shaderID ) {
 
-		chunks.push( fragmentShader );
-		chunks.push( vertexShader );
+			chunks.push( shaderID );
 
-	}
+		} else {
 
-	for ( d in defines ) {
+			chunks.push( fragmentShader );
+			chunks.push( vertexShader );
 
-		chunks.push( d );
-		chunks.push( defines[ d ] );
+		}
 
-	}
+		for ( d in defines ) {
+
+			chunks.push( d );
+			chunks.push( defines[ d ] );
 
-	for ( p in parameters ) {
+		}
 
-		chunks.push( p );
-		chunks.push( parameters[ p ] );
+		for ( p in parameters ) {
 
-	}
+			chunks.push( p );
+			chunks.push( parameters[ p ] );
+
+		}
+
+		code = chunks.join();
 
-	code = chunks.join();
+		// Check if code has been already compiled
 
-	// Check if code has been already compiled
+		for ( p = 0, pl = this.programs.length; p < pl; p ++ ) {
 
-	for ( p = 0, pl = this.programs.length; p < pl; p ++ ) {
+			var programInfo = this.programs[ p ];
 
-		var programInfo = this.programs[ p ];
+			if ( programInfo.code === code ) {
 
-		if ( programInfo.code === code ) {
+				//console.log( "Code already compiled." /*: \n\n" + code*/ );
 
-			//console.log( "Code already compiled." /*: \n\n" + code*/ );
+				programInfo.usedTimes ++;
 
-			programInfo.usedTimes ++;
+				return programInfo.program;
 
-			return programInfo.program;
+			}
 
 		}
 
-	}
+		var shadowMapTypeDefine = "SHADOWMAP_TYPE_BASIC";
 
-	var shadowMapTypeDefine = "SHADOWMAP_TYPE_BASIC";
+		if ( parameters.shadowMapType === THREE.PCFShadowMap ) {
 
-	if ( parameters.shadowMapType === THREE.PCFShadowMap ) {
+			shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF";
 
-		shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF";
+		} else if ( parameters.shadowMapType === THREE.PCFSoftShadowMap ) {
 
-	} else if ( parameters.shadowMapType === THREE.PCFSoftShadowMap ) {
+			shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF_SOFT";
 
-		shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF_SOFT";
+		}
 
-	}
+		//console.log( "building new program " );
 
-	//console.log( "building new program " );
+		//
 
-	//
+		var customDefines = this.generateDefines( defines );
 
-	var customDefines = this.generateDefines( defines );
+		//
 
-	//
+		var prefix_vertex = [
 
-	var prefix_vertex = [
+			"precision " + renderer.precision + " float;",
 
-		"precision " + renderer.precision + " float;",
+			customDefines,
 
-		customDefines,
+			renderer.supportsVertexTextures ? "#define VERTEX_TEXTURES" : "",
 
-		renderer.supportsVertexTextures ? "#define VERTEX_TEXTURES" : "",
+			parameters.gammaInput ? "#define GAMMA_INPUT" : "",
+			parameters.gammaOutput ? "#define GAMMA_OUTPUT" : "",
+			parameters.physicallyBasedShading ? "#define PHYSICALLY_BASED_SHADING" : "",
 
-		parameters.gammaInput ? "#define GAMMA_INPUT" : "",
-		parameters.gammaOutput ? "#define GAMMA_OUTPUT" : "",
-		parameters.physicallyBasedShading ? "#define PHYSICALLY_BASED_SHADING" : "",
+			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
+			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
+			"#define MAX_SPOT_LIGHTS " + parameters.maxSpotLights,
+			"#define MAX_HEMI_LIGHTS " + parameters.maxHemiLights,
 
-		"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
-		"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
-		"#define MAX_SPOT_LIGHTS " + parameters.maxSpotLights,
-		"#define MAX_HEMI_LIGHTS " + parameters.maxHemiLights,
+			"#define MAX_SHADOWS " + parameters.maxShadows,
 
-		"#define MAX_SHADOWS " + parameters.maxShadows,
+			"#define MAX_BONES " + parameters.maxBones,
 
-		"#define MAX_BONES " + parameters.maxBones,
+			parameters.map ? "#define USE_MAP" : "",
+			parameters.envMap ? "#define USE_ENVMAP" : "",
+			parameters.lightMap ? "#define USE_LIGHTMAP" : "",
+			parameters.bumpMap ? "#define USE_BUMPMAP" : "",
+			parameters.normalMap ? "#define USE_NORMALMAP" : "",
+			parameters.specularMap ? "#define USE_SPECULARMAP" : "",
+			parameters.vertexColors ? "#define USE_COLOR" : "",
 
-		parameters.map ? "#define USE_MAP" : "",
-		parameters.envMap ? "#define USE_ENVMAP" : "",
-		parameters.lightMap ? "#define USE_LIGHTMAP" : "",
-		parameters.bumpMap ? "#define USE_BUMPMAP" : "",
-		parameters.normalMap ? "#define USE_NORMALMAP" : "",
-		parameters.specularMap ? "#define USE_SPECULARMAP" : "",
-		parameters.vertexColors ? "#define USE_COLOR" : "",
+			parameters.skinning ? "#define USE_SKINNING" : "",
+			parameters.useVertexTexture ? "#define BONE_TEXTURE" : "",
+			parameters.boneTextureWidth ? "#define N_BONE_PIXEL_X " + parameters.boneTextureWidth.toFixed( 1 ) : "",
+			parameters.boneTextureHeight ? "#define N_BONE_PIXEL_Y " + parameters.boneTextureHeight.toFixed( 1 ) : "",
 
-		parameters.skinning ? "#define USE_SKINNING" : "",
-		parameters.useVertexTexture ? "#define BONE_TEXTURE" : "",
-		parameters.boneTextureWidth ? "#define N_BONE_PIXEL_X " + parameters.boneTextureWidth.toFixed( 1 ) : "",
-		parameters.boneTextureHeight ? "#define N_BONE_PIXEL_Y " + parameters.boneTextureHeight.toFixed( 1 ) : "",
+			parameters.morphTargets ? "#define USE_MORPHTARGETS" : "",
+			parameters.morphNormals ? "#define USE_MORPHNORMALS" : "",
+			parameters.perPixel ? "#define PHONG_PER_PIXEL" : "",
+			parameters.wrapAround ? "#define WRAP_AROUND" : "",
+			parameters.doubleSided ? "#define DOUBLE_SIDED" : "",
+			parameters.flipSided ? "#define FLIP_SIDED" : "",
 
-		parameters.morphTargets ? "#define USE_MORPHTARGETS" : "",
-		parameters.morphNormals ? "#define USE_MORPHNORMALS" : "",
-		parameters.perPixel ? "#define PHONG_PER_PIXEL" : "",
-		parameters.wrapAround ? "#define WRAP_AROUND" : "",
-		parameters.doubleSided ? "#define DOUBLE_SIDED" : "",
-		parameters.flipSided ? "#define FLIP_SIDED" : "",
+			parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
+			parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "",
+			parameters.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "",
+			parameters.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "",
 
-		parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
-		parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "",
-		parameters.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "",
-		parameters.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "",
+			parameters.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "",
 
-		parameters.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "",
+			"uniform mat4 modelMatrix;",
+			"uniform mat4 modelViewMatrix;",
+			"uniform mat4 projectionMatrix;",
+			"uniform mat4 viewMatrix;",
+			"uniform mat3 normalMatrix;",
+			"uniform vec3 cameraPosition;",
 
-		"uniform mat4 modelMatrix;",
-		"uniform mat4 modelViewMatrix;",
-		"uniform mat4 projectionMatrix;",
-		"uniform mat4 viewMatrix;",
-		"uniform mat3 normalMatrix;",
-		"uniform vec3 cameraPosition;",
+			"attribute vec3 position;",
+			"attribute vec3 normal;",
+			"attribute vec2 uv;",
+			"attribute vec2 uv2;",
 
-		"attribute vec3 position;",
-		"attribute vec3 normal;",
-		"attribute vec2 uv;",
-		"attribute vec2 uv2;",
+			"#ifdef USE_COLOR",
 
-		"#ifdef USE_COLOR",
+				"attribute vec3 color;",
 
-			"attribute vec3 color;",
+			"#endif",
 
-		"#endif",
+			"#ifdef USE_MORPHTARGETS",
 
-		"#ifdef USE_MORPHTARGETS",
+				"attribute vec3 morphTarget0;",
+				"attribute vec3 morphTarget1;",
+				"attribute vec3 morphTarget2;",
+				"attribute vec3 morphTarget3;",
 
-			"attribute vec3 morphTarget0;",
-			"attribute vec3 morphTarget1;",
-			"attribute vec3 morphTarget2;",
-			"attribute vec3 morphTarget3;",
+				"#ifdef USE_MORPHNORMALS",
 
-			"#ifdef USE_MORPHNORMALS",
+					"attribute vec3 morphNormal0;",
+					"attribute vec3 morphNormal1;",
+					"attribute vec3 morphNormal2;",
+					"attribute vec3 morphNormal3;",
 
-				"attribute vec3 morphNormal0;",
-				"attribute vec3 morphNormal1;",
-				"attribute vec3 morphNormal2;",
-				"attribute vec3 morphNormal3;",
+				"#else",
 
-			"#else",
+					"attribute vec3 morphTarget4;",
+					"attribute vec3 morphTarget5;",
+					"attribute vec3 morphTarget6;",
+					"attribute vec3 morphTarget7;",
 
-				"attribute vec3 morphTarget4;",
-				"attribute vec3 morphTarget5;",
-				"attribute vec3 morphTarget6;",
-				"attribute vec3 morphTarget7;",
+				"#endif",
 
 			"#endif",
 
-		"#endif",
+			"#ifdef USE_SKINNING",
 
-		"#ifdef USE_SKINNING",
+				"attribute vec4 skinIndex;",
+				"attribute vec4 skinWeight;",
 
-			"attribute vec4 skinIndex;",
-			"attribute vec4 skinWeight;",
+			"#endif",
 
-		"#endif",
+			""
 
-		""
+		].join("\n");
 
-	].join("\n");
+		var prefix_fragment = [
 
-	var prefix_fragment = [
+			"precision " + renderer.precision + " float;",
 
-		"precision " + renderer.precision + " float;",
+			( parameters.bumpMap || parameters.normalMap ) ? "#extension GL_OES_standard_derivatives : enable" : "",
 
-		( parameters.bumpMap || parameters.normalMap ) ? "#extension GL_OES_standard_derivatives : enable" : "",
+			customDefines,
 
-		customDefines,
+			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
+			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
+			"#define MAX_SPOT_LIGHTS " + parameters.maxSpotLights,
+			"#define MAX_HEMI_LIGHTS " + parameters.maxHemiLights,
 
-		"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
-		"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
-		"#define MAX_SPOT_LIGHTS " + parameters.maxSpotLights,
-		"#define MAX_HEMI_LIGHTS " + parameters.maxHemiLights,
+			"#define MAX_SHADOWS " + parameters.maxShadows,
 
-		"#define MAX_SHADOWS " + parameters.maxShadows,
+			parameters.alphaTest ? "#define ALPHATEST " + parameters.alphaTest: "",
 
-		parameters.alphaTest ? "#define ALPHATEST " + parameters.alphaTest: "",
+			parameters.gammaInput ? "#define GAMMA_INPUT" : "",
+			parameters.gammaOutput ? "#define GAMMA_OUTPUT" : "",
 
-		parameters.gammaInput ? "#define GAMMA_INPUT" : "",
-		parameters.gammaOutput ? "#define GAMMA_OUTPUT" : "",
+			( parameters.useFog && parameters.fog ) ? "#define USE_FOG" : "",
+			( parameters.useFog && parameters.fogExp ) ? "#define FOG_EXP2" : "",
 
-		( parameters.useFog && parameters.fog ) ? "#define USE_FOG" : "",
-		( parameters.useFog && parameters.fogExp ) ? "#define FOG_EXP2" : "",
+			parameters.map ? "#define USE_MAP" : "",
+			parameters.envMap ? "#define USE_ENVMAP" : "",
+			parameters.lightMap ? "#define USE_LIGHTMAP" : "",
+			parameters.bumpMap ? "#define USE_BUMPMAP" : "",
+			parameters.normalMap ? "#define USE_NORMALMAP" : "",
+			parameters.specularMap ? "#define USE_SPECULARMAP" : "",
+			parameters.vertexColors ? "#define USE_COLOR" : "",
 
-		parameters.map ? "#define USE_MAP" : "",
-		parameters.envMap ? "#define USE_ENVMAP" : "",
-		parameters.lightMap ? "#define USE_LIGHTMAP" : "",
-		parameters.bumpMap ? "#define USE_BUMPMAP" : "",
-		parameters.normalMap ? "#define USE_NORMALMAP" : "",
-		parameters.specularMap ? "#define USE_SPECULARMAP" : "",
-		parameters.vertexColors ? "#define USE_COLOR" : "",
+			parameters.metal ? "#define METAL" : "",
+			parameters.perPixel ? "#define PHONG_PER_PIXEL" : "",
+			parameters.wrapAround ? "#define WRAP_AROUND" : "",
+			parameters.doubleSided ? "#define DOUBLE_SIDED" : "",
+			parameters.flipSided ? "#define FLIP_SIDED" : "",
 
-		parameters.metal ? "#define METAL" : "",
-		parameters.perPixel ? "#define PHONG_PER_PIXEL" : "",
-		parameters.wrapAround ? "#define WRAP_AROUND" : "",
-		parameters.doubleSided ? "#define DOUBLE_SIDED" : "",
-		parameters.flipSided ? "#define FLIP_SIDED" : "",
+			parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
+			parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "",
+			parameters.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "",
+			parameters.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "",
 
-		parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
-		parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "",
-		parameters.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "",
-		parameters.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "",
+			"uniform mat4 viewMatrix;",
+			"uniform vec3 cameraPosition;",
+			""
 
-		"uniform mat4 viewMatrix;",
-		"uniform vec3 cameraPosition;",
-		""
+		].join("\n");
 
-	].join("\n");
-	
+		program = renderer.compileShader(prefix_vertex + vertexShader, prefix_fragment + fragmentShader);
 
-	program = renderer.compileShader(prefix_vertex + vertexShader, prefix_fragment + fragmentShader);
-	
-	//console.log( prefix_fragment + fragmentShader );
-	//console.log( prefix_vertex + vertexShader );
+		//console.log( prefix_fragment + fragmentShader );
+		//console.log( prefix_vertex + vertexShader );
 
-	program.uniforms = {};
-	program.attributes = {};
+		program.uniforms = {};
+		program.attributes = {};
 
-	var identifiers, u, a, i;
+		var identifiers, u, a, i;
 
-	// cache uniform locations
+		// cache uniform locations
 
-	identifiers = [
+		identifiers = [
 
-		'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'modelMatrix', 'cameraPosition',
-		'morphTargetInfluences'
+			'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'modelMatrix', 'cameraPosition',
+			'morphTargetInfluences'
 
-	];
+		];
 
-	if ( parameters.useVertexTexture ) {
+		if ( parameters.useVertexTexture ) {
 
-		identifiers.push( 'boneTexture' );
+			identifiers.push( 'boneTexture' );
 
-	} else {
+		} else {
 
-		identifiers.push( 'boneGlobalMatrices' );
+			identifiers.push( 'boneGlobalMatrices' );
 
-	}
+		}
 
-	for ( u in uniforms ) {
+		for ( u in uniforms ) {
 
-		identifiers.push( u );
+			identifiers.push( u );
 
-	}
+		}
 
-	this.cacheUniformLocations( program, identifiers );
+		this.cacheUniformLocations( program, identifiers );
 
-	// cache attributes locations
+		// cache attributes locations
 
-	identifiers = [
+		identifiers = [
 
-		"position", "normal", "uv", "uv2", "tangent", "color",
-		"skinIndex", "skinWeight", "lineDistance"
+			"position", "normal", "uv", "uv2", "tangent", "color",
+			"skinIndex", "skinWeight", "lineDistance"
 
-	];
+		];
 
-	for ( i = 0; i < parameters.maxMorphTargets; i ++ ) {
+		for ( i = 0; i < parameters.maxMorphTargets; i ++ ) {
 
-		identifiers.push( "morphTarget" + i );
+			identifiers.push( "morphTarget" + i );
 
-	}
+		}
 
-	for ( i = 0; i < parameters.maxMorphNormals; i ++ ) {
+		for ( i = 0; i < parameters.maxMorphNormals; i ++ ) {
 
-		identifiers.push( "morphNormal" + i );
+			identifiers.push( "morphNormal" + i );
 
-	}
+		}
 
-	for ( a in attributes ) {
+		for ( a in attributes ) {
 
-		identifiers.push( a );
+			identifiers.push( a );
 
-	}
+		}
 
-	this.cacheAttributeLocations( program, identifiers );
+		this.cacheAttributeLocations( program, identifiers );
 
-	program.id = this.programs_counter ++;
+		program.id = this.programs_counter ++;
 
-	this.programs.push( { program: program, code: code, usedTimes: 1 } );
+		this.programs.push( { program: program, code: code, usedTimes: 1 } );
 
-	this.info.memory.programs = this.programs.length;
+		this.info.memory.programs = this.programs.length;
 
-	return program;
+		return program;
 
-};
+	},
 
-THREE.WebGLRenderer.ShaderBuilder.prototype.generateDefines = function( defines ) {
+	generateDefines: function ( defines ) {
 
-	var value, chunk, chunks = [];
+		var value, chunk, chunks = [];
 
-	for ( var d in defines ) {
+		for ( var d in defines ) {
 
-		value = defines[ d ];
-		if ( value === false ) continue;
+			value = defines[ d ];
+			if ( value === false ) continue;
 
-		chunk = "#define " + d + " " + value;
-		chunks.push( chunk );
+			chunk = "#define " + d + " " + value;
+			chunks.push( chunk );
 
-	}
+		}
 
-	return chunks.join( "\n" );
+		return chunks.join( "\n" );
 
-};
+	},
 
 	// Shader parameters cache
 
-THREE.WebGLRenderer.ShaderBuilder.prototype.cacheUniformLocations = function( program, identifiers ) {
+	cacheUniformLocations: function ( program, identifiers ) {
 
-	var i, l, id, renderer = this.renderer;
+		var i, l, id, renderer = this.renderer;
 
-	for( i = 0, l = identifiers.length; i < l; i ++ ) {
+		for ( i = 0, l = identifiers.length; i < l; i ++ ) {
 
-		id = identifiers[ i ];
-		program.uniforms[ id ] = renderer.getUniformLocation( program, id );
+			id = identifiers[ i ];
+			program.uniforms[ id ] = renderer.getUniformLocation( program, id );
 
-	}
+		}
 
-};
+	},
 
-THREE.WebGLRenderer.ShaderBuilder.prototype.cacheAttributeLocations = function( program, identifiers ) {
+	cacheAttributeLocations: function ( program, identifiers ) {
 
-	var i, l, id, renderer = this.renderer;
+		var i, l, id, renderer = this.renderer;
 
-	for( i = 0, l = identifiers.length; i < l; i ++ ) {
+		for( i = 0, l = identifiers.length; i < l; i ++ ) {
 
-		id = identifiers[ i ];
-		program.attributes[ id ] = renderer.getAttribLocation( program, id );
+			id = identifiers[ i ];
+			program.attributes[ id ] = renderer.getAttribLocation( program, id );
 
-	}
+		}
 
-};
+	},
+
+	removeProgram: function ( program ) {
+
+		var i, il, programInfo;
+		var deleteProgram = false;
+		var programs = this.programs;
 
-THREE.WebGLRenderer.ShaderBuilder.prototype.removeProgram = function( program ) {
+		for ( i = 0, il = programs.length; i < il; i ++ ) {
 
-	var i, il, programInfo;
-	var deleteProgram = false;
-	var programs = this.programs;
+			programInfo = programs[ i ];
 
-	for ( i = 0, il = programs.length; i < il; i ++ ) {
+			if ( programInfo.program === program ) {
 
-		programInfo = programs[ i ];
+				programInfo.usedTimes --;
 
-		if ( programInfo.program === program ) {
+				if ( programInfo.usedTimes === 0 ) {
 
-			programInfo.usedTimes --;
+					deleteProgram = true;
 
-			if ( programInfo.usedTimes === 0 ) {
+				}
 
-				deleteProgram = true;
+				break;
 
 			}
 
-			break;
-
 		}
 
-	}
+		if ( deleteProgram === true ) {
 
-	if ( deleteProgram === true ) {
+			// avoid using array.splice, this is costlier than creating new array from scratch
 
-		// avoid using array.splice, this is costlier than creating new array from scratch
+			var newPrograms = [];
 
-		var newPrograms = [];
+			for ( i = 0, il = programs.length; i < il; i ++ ) {
 
-		for ( i = 0, il = programs.length; i < il; i ++ ) {
+				programInfo = programs[ i ];
 
-			programInfo = programs[ i ];
+				if ( programInfo.program !== program ) {
 
-			if ( programInfo.program !== program ) {
+					newPrograms.push( programInfo );
 
-				newPrograms.push( programInfo );
+				}
 
 			}
 
-		}
+			programs = newPrograms;
 
-		programs = newPrograms;
+			this.renderer.deleteProgram( program );
 
-		this.renderer.deleteProgram( program );
+			this.info.memory.programs --;
 
-		this.info.memory.programs --;
+		}
 
 	}
-}
+
+} );

+ 1 - 1
utils/build/includes/commonOld.json

@@ -74,7 +74,7 @@
 	"src/scenes/FogExp2.js",
 	"src/renderers/CanvasRenderer.js",
 	"src/renderers/WebGLShaders.js",
-	"src/renderers/WebGLRenderer.js",
+	"src/renderers/WebGLRendererOld.js",
 	"src/renderers/WebGLRenderTarget.js",
 	"src/renderers/WebGLRenderTargetCube.js",
 	"src/renderers/renderables/RenderableVertex.js",