diff --git a/build/three.js b/build/three.js index 966dfa4b818f7668c7daee45b15b9ff05da24e22..1587919b7c5d0f2bfb28a74ad8b8f52a8c3e0541 100644 --- a/build/three.js +++ b/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 ) { diff --git a/build/three.min.js b/build/three.min.js index 8a08dd5adfd463dacb94345a90cab41650ce4825..e2007b3430a80316d5943f52a56d6ec5a4c1b184 100644 --- a/build/three.min.js +++ b/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=0e;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;me;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