|
@@ -1,664 +1,661 @@
|
|
|
+/**
|
|
|
+ * @author mrdoob / http://mrdoob.com/
|
|
|
+ */
|
|
|
+
|
|
|
import { WebGLUniforms } from './WebGLUniforms';
|
|
|
import { WebGLShader } from './WebGLShader';
|
|
|
import { ShaderChunk } from '../shaders/ShaderChunk';
|
|
|
import { NoToneMapping, AddOperation, MixOperation, MultiplyOperation, EquirectangularRefractionMapping, CubeRefractionMapping, SphericalReflectionMapping, EquirectangularReflectionMapping, CubeUVRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, CineonToneMapping, Uncharted2ToneMapping, ReinhardToneMapping, LinearToneMapping, GammaEncoding, RGBDEncoding, RGBM16Encoding, RGBM7Encoding, RGBEEncoding, sRGBEncoding, LinearEncoding } from '../../constants';
|
|
|
|
|
|
-var WebGLProgram;
|
|
|
-
|
|
|
-WebGLProgram = ( function () {
|
|
|
-
|
|
|
- var programIdCount = 0;
|
|
|
-
|
|
|
- function getEncodingComponents( encoding ) {
|
|
|
-
|
|
|
- switch ( encoding ) {
|
|
|
-
|
|
|
- case LinearEncoding:
|
|
|
- return [ 'Linear','( value )' ];
|
|
|
- case sRGBEncoding:
|
|
|
- return [ 'sRGB','( value )' ];
|
|
|
- case RGBEEncoding:
|
|
|
- return [ 'RGBE','( value )' ];
|
|
|
- case RGBM7Encoding:
|
|
|
- return [ 'RGBM','( value, 7.0 )' ];
|
|
|
- case RGBM16Encoding:
|
|
|
- return [ 'RGBM','( value, 16.0 )' ];
|
|
|
- case RGBDEncoding:
|
|
|
- return [ 'RGBD','( value, 256.0 )' ];
|
|
|
- case GammaEncoding:
|
|
|
- return [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];
|
|
|
- default:
|
|
|
- throw new Error( 'unsupported encoding: ' + encoding );
|
|
|
-
|
|
|
- }
|
|
|
+var programIdCount = 0;
|
|
|
+
|
|
|
+function getEncodingComponents( encoding ) {
|
|
|
+
|
|
|
+ switch ( encoding ) {
|
|
|
+
|
|
|
+ case LinearEncoding:
|
|
|
+ return [ 'Linear','( value )' ];
|
|
|
+ case sRGBEncoding:
|
|
|
+ return [ 'sRGB','( value )' ];
|
|
|
+ case RGBEEncoding:
|
|
|
+ return [ 'RGBE','( value )' ];
|
|
|
+ case RGBM7Encoding:
|
|
|
+ return [ 'RGBM','( value, 7.0 )' ];
|
|
|
+ case RGBM16Encoding:
|
|
|
+ return [ 'RGBM','( value, 16.0 )' ];
|
|
|
+ case RGBDEncoding:
|
|
|
+ return [ 'RGBD','( value, 256.0 )' ];
|
|
|
+ case GammaEncoding:
|
|
|
+ return [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];
|
|
|
+ default:
|
|
|
+ throw new Error( 'unsupported encoding: ' + encoding );
|
|
|
|
|
|
}
|
|
|
|
|
|
- function getTexelDecodingFunction( functionName, encoding ) {
|
|
|
-
|
|
|
- var components = getEncodingComponents( encoding );
|
|
|
- return "vec4 " + functionName + "( vec4 value ) { return " + components[ 0 ] + "ToLinear" + components[ 1 ] + "; }";
|
|
|
+}
|
|
|
|
|
|
- }
|
|
|
+function getTexelDecodingFunction( functionName, encoding ) {
|
|
|
|
|
|
- function getTexelEncodingFunction( functionName, encoding ) {
|
|
|
+ var components = getEncodingComponents( encoding );
|
|
|
+ return "vec4 " + functionName + "( vec4 value ) { return " + components[ 0 ] + "ToLinear" + components[ 1 ] + "; }";
|
|
|
|
|
|
- var components = getEncodingComponents( encoding );
|
|
|
- return "vec4 " + functionName + "( vec4 value ) { return LinearTo" + components[ 0 ] + components[ 1 ] + "; }";
|
|
|
+}
|
|
|
|
|
|
- }
|
|
|
+function getTexelEncodingFunction( functionName, encoding ) {
|
|
|
|
|
|
- function getToneMappingFunction( functionName, toneMapping ) {
|
|
|
+ var components = getEncodingComponents( encoding );
|
|
|
+ return "vec4 " + functionName + "( vec4 value ) { return LinearTo" + components[ 0 ] + components[ 1 ] + "; }";
|
|
|
|
|
|
- var toneMappingName;
|
|
|
+}
|
|
|
|
|
|
- switch ( toneMapping ) {
|
|
|
+function getToneMappingFunction( functionName, toneMapping ) {
|
|
|
|
|
|
- case LinearToneMapping:
|
|
|
- toneMappingName = "Linear";
|
|
|
- break;
|
|
|
+ var toneMappingName;
|
|
|
|
|
|
- case ReinhardToneMapping:
|
|
|
- toneMappingName = "Reinhard";
|
|
|
- break;
|
|
|
+ switch ( toneMapping ) {
|
|
|
|
|
|
- case Uncharted2ToneMapping:
|
|
|
- toneMappingName = "Uncharted2";
|
|
|
- break;
|
|
|
+ case LinearToneMapping:
|
|
|
+ toneMappingName = "Linear";
|
|
|
+ break;
|
|
|
|
|
|
- case CineonToneMapping:
|
|
|
- toneMappingName = "OptimizedCineon";
|
|
|
- break;
|
|
|
+ case ReinhardToneMapping:
|
|
|
+ toneMappingName = "Reinhard";
|
|
|
+ break;
|
|
|
|
|
|
- default:
|
|
|
- throw new Error( 'unsupported toneMapping: ' + toneMapping );
|
|
|
+ case Uncharted2ToneMapping:
|
|
|
+ toneMappingName = "Uncharted2";
|
|
|
+ break;
|
|
|
|
|
|
- }
|
|
|
+ case CineonToneMapping:
|
|
|
+ toneMappingName = "OptimizedCineon";
|
|
|
+ break;
|
|
|
|
|
|
- return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }";
|
|
|
+ default:
|
|
|
+ throw new Error( 'unsupported toneMapping: ' + toneMapping );
|
|
|
|
|
|
}
|
|
|
|
|
|
- function generateExtensions( extensions, parameters, rendererExtensions ) {
|
|
|
+ return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }";
|
|
|
|
|
|
- extensions = extensions || {};
|
|
|
+}
|
|
|
|
|
|
- var chunks = [
|
|
|
- ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',
|
|
|
- ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',
|
|
|
- ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',
|
|
|
- ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '',
|
|
|
- ];
|
|
|
+function generateExtensions( extensions, parameters, rendererExtensions ) {
|
|
|
|
|
|
- return chunks.filter( filterEmptyLine ).join( '\n' );
|
|
|
+ extensions = extensions || {};
|
|
|
|
|
|
- }
|
|
|
+ var chunks = [
|
|
|
+ ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',
|
|
|
+ ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',
|
|
|
+ ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',
|
|
|
+ ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '',
|
|
|
+ ];
|
|
|
|
|
|
- function generateDefines( defines ) {
|
|
|
+ return chunks.filter( filterEmptyLine ).join( '\n' );
|
|
|
|
|
|
- var chunks = [];
|
|
|
+}
|
|
|
|
|
|
- for ( var name in defines ) {
|
|
|
+function generateDefines( defines ) {
|
|
|
|
|
|
- var value = defines[ name ];
|
|
|
+ var chunks = [];
|
|
|
|
|
|
- if ( value === false ) continue;
|
|
|
+ for ( var name in defines ) {
|
|
|
|
|
|
- chunks.push( '#define ' + name + ' ' + value );
|
|
|
+ var value = defines[ name ];
|
|
|
|
|
|
- }
|
|
|
+ if ( value === false ) continue;
|
|
|
|
|
|
- return chunks.join( '\n' );
|
|
|
+ chunks.push( '#define ' + name + ' ' + value );
|
|
|
|
|
|
}
|
|
|
|
|
|
- function fetchAttributeLocations( gl, program, identifiers ) {
|
|
|
+ return chunks.join( '\n' );
|
|
|
|
|
|
- var attributes = {};
|
|
|
+}
|
|
|
|
|
|
- var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );
|
|
|
+function fetchAttributeLocations( gl, program, identifiers ) {
|
|
|
|
|
|
- for ( var i = 0; i < n; i ++ ) {
|
|
|
+ var attributes = {};
|
|
|
|
|
|
- var info = gl.getActiveAttrib( program, i );
|
|
|
- var name = info.name;
|
|
|
+ var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );
|
|
|
|
|
|
- // console.log("THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:", name, i );
|
|
|
+ for ( var i = 0; i < n; i ++ ) {
|
|
|
|
|
|
- attributes[ name ] = gl.getAttribLocation( program, name );
|
|
|
+ var info = gl.getActiveAttrib( program, i );
|
|
|
+ var name = info.name;
|
|
|
|
|
|
- }
|
|
|
+ // console.log("THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:", name, i );
|
|
|
|
|
|
- return attributes;
|
|
|
+ attributes[ name ] = gl.getAttribLocation( program, name );
|
|
|
|
|
|
}
|
|
|
|
|
|
- function filterEmptyLine( string ) {
|
|
|
+ return attributes;
|
|
|
|
|
|
- return string !== '';
|
|
|
+}
|
|
|
|
|
|
- }
|
|
|
+function filterEmptyLine( string ) {
|
|
|
|
|
|
- function replaceLightNums( string, parameters ) {
|
|
|
+ return string !== '';
|
|
|
|
|
|
- return string
|
|
|
- .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )
|
|
|
- .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )
|
|
|
- .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )
|
|
|
- .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );
|
|
|
+}
|
|
|
|
|
|
- }
|
|
|
+function replaceLightNums( string, parameters ) {
|
|
|
|
|
|
- function parseIncludes( string ) {
|
|
|
+ return string
|
|
|
+ .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )
|
|
|
+ .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )
|
|
|
+ .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )
|
|
|
+ .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );
|
|
|
|
|
|
- var pattern = /#include +<([\w\d.]+)>/g;
|
|
|
+}
|
|
|
|
|
|
- function replace( match, include ) {
|
|
|
+function parseIncludes( string ) {
|
|
|
|
|
|
- var replace = ShaderChunk[ include ];
|
|
|
+ var pattern = /#include +<([\w\d.]+)>/g;
|
|
|
|
|
|
- if ( replace === undefined ) {
|
|
|
+ function replace( match, include ) {
|
|
|
|
|
|
- throw new Error( 'Can not resolve #include <' + include + '>' );
|
|
|
+ var replace = ShaderChunk[ include ];
|
|
|
|
|
|
- }
|
|
|
+ if ( replace === undefined ) {
|
|
|
|
|
|
- return parseIncludes( replace );
|
|
|
+ throw new Error( 'Can not resolve #include <' + include + '>' );
|
|
|
|
|
|
}
|
|
|
|
|
|
- return string.replace( pattern, replace );
|
|
|
+ return parseIncludes( replace );
|
|
|
|
|
|
}
|
|
|
|
|
|
- function unrollLoops( string ) {
|
|
|
+ return string.replace( pattern, replace );
|
|
|
|
|
|
- var pattern = /for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;
|
|
|
+}
|
|
|
|
|
|
- function replace( match, start, end, snippet ) {
|
|
|
+function unrollLoops( string ) {
|
|
|
|
|
|
- var unroll = '';
|
|
|
+ var pattern = /for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;
|
|
|
|
|
|
- for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {
|
|
|
+ function replace( match, start, end, snippet ) {
|
|
|
|
|
|
- unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' );
|
|
|
+ var unroll = '';
|
|
|
|
|
|
- }
|
|
|
+ for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {
|
|
|
|
|
|
- return unroll;
|
|
|
+ unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' );
|
|
|
|
|
|
}
|
|
|
|
|
|
- return string.replace( pattern, replace );
|
|
|
+ return unroll;
|
|
|
|
|
|
}
|
|
|
|
|
|
- return function WebGLProgram( renderer, code, material, parameters ) {
|
|
|
+ return string.replace( pattern, replace );
|
|
|
|
|
|
- var gl = renderer.context;
|
|
|
+}
|
|
|
|
|
|
- var extensions = material.extensions;
|
|
|
- var defines = material.defines;
|
|
|
+function WebGLProgram( renderer, code, material, parameters ) {
|
|
|
|
|
|
- var vertexShader = material.__webglShader.vertexShader;
|
|
|
- var fragmentShader = material.__webglShader.fragmentShader;
|
|
|
+ var gl = renderer.context;
|
|
|
|
|
|
- var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';
|
|
|
+ var extensions = material.extensions;
|
|
|
+ var defines = material.defines;
|
|
|
|
|
|
- if ( parameters.shadowMapType === PCFShadowMap ) {
|
|
|
+ var vertexShader = material.__webglShader.vertexShader;
|
|
|
+ var fragmentShader = material.__webglShader.fragmentShader;
|
|
|
|
|
|
- shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';
|
|
|
+ var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';
|
|
|
|
|
|
- } else if ( parameters.shadowMapType === PCFSoftShadowMap ) {
|
|
|
+ if ( parameters.shadowMapType === PCFShadowMap ) {
|
|
|
|
|
|
- shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';
|
|
|
+ shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';
|
|
|
|
|
|
- }
|
|
|
-
|
|
|
- var envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
|
|
|
- var envMapModeDefine = 'ENVMAP_MODE_REFLECTION';
|
|
|
- var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
|
|
|
+ } else if ( parameters.shadowMapType === PCFSoftShadowMap ) {
|
|
|
|
|
|
- if ( parameters.envMap ) {
|
|
|
+ shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';
|
|
|
|
|
|
- switch ( material.envMap.mapping ) {
|
|
|
+ }
|
|
|
|
|
|
- case CubeReflectionMapping:
|
|
|
- case CubeRefractionMapping:
|
|
|
- envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
|
|
|
- break;
|
|
|
+ var envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
|
|
|
+ var envMapModeDefine = 'ENVMAP_MODE_REFLECTION';
|
|
|
+ var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
|
|
|
|
|
|
- case CubeUVReflectionMapping:
|
|
|
- case CubeUVRefractionMapping:
|
|
|
- envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';
|
|
|
- break;
|
|
|
+ if ( parameters.envMap ) {
|
|
|
|
|
|
- case EquirectangularReflectionMapping:
|
|
|
- case EquirectangularRefractionMapping:
|
|
|
- envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';
|
|
|
- break;
|
|
|
+ switch ( material.envMap.mapping ) {
|
|
|
|
|
|
- case SphericalReflectionMapping:
|
|
|
- envMapTypeDefine = 'ENVMAP_TYPE_SPHERE';
|
|
|
- break;
|
|
|
+ case CubeReflectionMapping:
|
|
|
+ case CubeRefractionMapping:
|
|
|
+ envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
|
|
|
+ break;
|
|
|
|
|
|
- }
|
|
|
+ case CubeUVReflectionMapping:
|
|
|
+ case CubeUVRefractionMapping:
|
|
|
+ envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';
|
|
|
+ break;
|
|
|
|
|
|
- switch ( material.envMap.mapping ) {
|
|
|
+ case EquirectangularReflectionMapping:
|
|
|
+ case EquirectangularRefractionMapping:
|
|
|
+ envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';
|
|
|
+ break;
|
|
|
|
|
|
- case CubeRefractionMapping:
|
|
|
- case EquirectangularRefractionMapping:
|
|
|
- envMapModeDefine = 'ENVMAP_MODE_REFRACTION';
|
|
|
- break;
|
|
|
+ case SphericalReflectionMapping:
|
|
|
+ envMapTypeDefine = 'ENVMAP_TYPE_SPHERE';
|
|
|
+ break;
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- switch ( material.combine ) {
|
|
|
+ switch ( material.envMap.mapping ) {
|
|
|
|
|
|
- case MultiplyOperation:
|
|
|
- envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
|
|
|
- break;
|
|
|
+ case CubeRefractionMapping:
|
|
|
+ case EquirectangularRefractionMapping:
|
|
|
+ envMapModeDefine = 'ENVMAP_MODE_REFRACTION';
|
|
|
+ break;
|
|
|
|
|
|
- case MixOperation:
|
|
|
- envMapBlendingDefine = 'ENVMAP_BLENDING_MIX';
|
|
|
- break;
|
|
|
+ }
|
|
|
|
|
|
- case AddOperation:
|
|
|
- envMapBlendingDefine = 'ENVMAP_BLENDING_ADD';
|
|
|
- break;
|
|
|
+ switch ( material.combine ) {
|
|
|
|
|
|
- }
|
|
|
+ case MultiplyOperation:
|
|
|
+ envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
|
|
|
+ break;
|
|
|
|
|
|
- }
|
|
|
+ case MixOperation:
|
|
|
+ envMapBlendingDefine = 'ENVMAP_BLENDING_MIX';
|
|
|
+ break;
|
|
|
|
|
|
- var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;
|
|
|
+ case AddOperation:
|
|
|
+ envMapBlendingDefine = 'ENVMAP_BLENDING_ADD';
|
|
|
+ break;
|
|
|
|
|
|
- // console.log( 'building new program ' );
|
|
|
+ }
|
|
|
|
|
|
- //
|
|
|
+ }
|
|
|
|
|
|
- var customExtensions = generateExtensions( extensions, parameters, renderer.extensions );
|
|
|
+ var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;
|
|
|
|
|
|
- var customDefines = generateDefines( defines );
|
|
|
+ // console.log( 'building new program ' );
|
|
|
|
|
|
- //
|
|
|
+ //
|
|
|
|
|
|
- var program = gl.createProgram();
|
|
|
+ var customExtensions = generateExtensions( extensions, parameters, renderer.extensions );
|
|
|
|
|
|
- var prefixVertex, prefixFragment;
|
|
|
+ var customDefines = generateDefines( defines );
|
|
|
|
|
|
- if ( (material && material.isRawShaderMaterial) ) {
|
|
|
+ //
|
|
|
|
|
|
- prefixVertex = [
|
|
|
+ var program = gl.createProgram();
|
|
|
|
|
|
- customDefines
|
|
|
+ var prefixVertex, prefixFragment;
|
|
|
|
|
|
- ].filter( filterEmptyLine ).join( '\n' );
|
|
|
+ if ( (material && material.isRawShaderMaterial) ) {
|
|
|
|
|
|
- prefixFragment = [
|
|
|
+ prefixVertex = [
|
|
|
|
|
|
- customDefines
|
|
|
+ customDefines
|
|
|
|
|
|
- ].filter( filterEmptyLine ).join( '\n' );
|
|
|
+ ].filter( filterEmptyLine ).join( '\n' );
|
|
|
|
|
|
- } else {
|
|
|
+ prefixFragment = [
|
|
|
|
|
|
- prefixVertex = [
|
|
|
+ customDefines
|
|
|
|
|
|
- 'precision ' + parameters.precision + ' float;',
|
|
|
- 'precision ' + parameters.precision + ' int;',
|
|
|
+ ].filter( filterEmptyLine ).join( '\n' );
|
|
|
|
|
|
- '#define SHADER_NAME ' + material.__webglShader.name,
|
|
|
+ } else {
|
|
|
|
|
|
- customDefines,
|
|
|
+ prefixVertex = [
|
|
|
|
|
|
- parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',
|
|
|
+ 'precision ' + parameters.precision + ' float;',
|
|
|
+ 'precision ' + parameters.precision + ' int;',
|
|
|
|
|
|
- '#define GAMMA_FACTOR ' + gammaFactorDefine,
|
|
|
+ '#define SHADER_NAME ' + material.__webglShader.name,
|
|
|
|
|
|
- '#define MAX_BONES ' + parameters.maxBones,
|
|
|
+ customDefines,
|
|
|
|
|
|
- parameters.map ? '#define USE_MAP' : '',
|
|
|
- parameters.envMap ? '#define USE_ENVMAP' : '',
|
|
|
- parameters.envMap ? '#define ' + envMapModeDefine : '',
|
|
|
- parameters.lightMap ? '#define USE_LIGHTMAP' : '',
|
|
|
- parameters.aoMap ? '#define USE_AOMAP' : '',
|
|
|
- parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
|
|
|
- parameters.bumpMap ? '#define USE_BUMPMAP' : '',
|
|
|
- parameters.normalMap ? '#define USE_NORMALMAP' : '',
|
|
|
- parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',
|
|
|
- parameters.specularMap ? '#define USE_SPECULARMAP' : '',
|
|
|
- parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
|
|
|
- parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
|
|
|
- parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
|
|
|
- parameters.vertexColors ? '#define USE_COLOR' : '',
|
|
|
+ parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',
|
|
|
|
|
|
- parameters.flatShading ? '#define FLAT_SHADED' : '',
|
|
|
+ '#define GAMMA_FACTOR ' + gammaFactorDefine,
|
|
|
|
|
|
- parameters.skinning ? '#define USE_SKINNING' : '',
|
|
|
- parameters.useVertexTexture ? '#define BONE_TEXTURE' : '',
|
|
|
+ '#define MAX_BONES ' + parameters.maxBones,
|
|
|
|
|
|
- parameters.morphTargets ? '#define USE_MORPHTARGETS' : '',
|
|
|
- parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',
|
|
|
- parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
|
|
|
- parameters.flipSided ? '#define FLIP_SIDED' : '',
|
|
|
+ parameters.map ? '#define USE_MAP' : '',
|
|
|
+ parameters.envMap ? '#define USE_ENVMAP' : '',
|
|
|
+ parameters.envMap ? '#define ' + envMapModeDefine : '',
|
|
|
+ parameters.lightMap ? '#define USE_LIGHTMAP' : '',
|
|
|
+ parameters.aoMap ? '#define USE_AOMAP' : '',
|
|
|
+ parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
|
|
|
+ parameters.bumpMap ? '#define USE_BUMPMAP' : '',
|
|
|
+ parameters.normalMap ? '#define USE_NORMALMAP' : '',
|
|
|
+ parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',
|
|
|
+ parameters.specularMap ? '#define USE_SPECULARMAP' : '',
|
|
|
+ parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
|
|
|
+ parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
|
|
|
+ parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
|
|
|
+ parameters.vertexColors ? '#define USE_COLOR' : '',
|
|
|
|
|
|
- '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,
|
|
|
+ parameters.flatShading ? '#define FLAT_SHADED' : '',
|
|
|
|
|
|
- parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',
|
|
|
- parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',
|
|
|
+ parameters.skinning ? '#define USE_SKINNING' : '',
|
|
|
+ parameters.useVertexTexture ? '#define BONE_TEXTURE' : '',
|
|
|
|
|
|
- parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',
|
|
|
+ parameters.morphTargets ? '#define USE_MORPHTARGETS' : '',
|
|
|
+ parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',
|
|
|
+ parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
|
|
|
+ parameters.flipSided ? '#define FLIP_SIDED' : '',
|
|
|
|
|
|
- parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
|
|
|
- parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
|
|
|
+ '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,
|
|
|
|
|
|
- 'uniform mat4 modelMatrix;',
|
|
|
- 'uniform mat4 modelViewMatrix;',
|
|
|
- 'uniform mat4 projectionMatrix;',
|
|
|
- 'uniform mat4 viewMatrix;',
|
|
|
- 'uniform mat3 normalMatrix;',
|
|
|
- 'uniform vec3 cameraPosition;',
|
|
|
+ parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',
|
|
|
+ parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',
|
|
|
|
|
|
- 'attribute vec3 position;',
|
|
|
- 'attribute vec3 normal;',
|
|
|
- 'attribute vec2 uv;',
|
|
|
+ parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',
|
|
|
|
|
|
- '#ifdef USE_COLOR',
|
|
|
+ parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
|
|
|
+ parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
|
|
|
|
|
|
- ' attribute vec3 color;',
|
|
|
+ 'uniform mat4 modelMatrix;',
|
|
|
+ 'uniform mat4 modelViewMatrix;',
|
|
|
+ 'uniform mat4 projectionMatrix;',
|
|
|
+ 'uniform mat4 viewMatrix;',
|
|
|
+ 'uniform mat3 normalMatrix;',
|
|
|
+ 'uniform vec3 cameraPosition;',
|
|
|
|
|
|
- '#endif',
|
|
|
+ 'attribute vec3 position;',
|
|
|
+ 'attribute vec3 normal;',
|
|
|
+ 'attribute vec2 uv;',
|
|
|
|
|
|
- '#ifdef USE_MORPHTARGETS',
|
|
|
+ '#ifdef USE_COLOR',
|
|
|
|
|
|
- ' attribute vec3 morphTarget0;',
|
|
|
- ' attribute vec3 morphTarget1;',
|
|
|
- ' attribute vec3 morphTarget2;',
|
|
|
- ' attribute vec3 morphTarget3;',
|
|
|
+ ' attribute vec3 color;',
|
|
|
|
|
|
- ' #ifdef USE_MORPHNORMALS',
|
|
|
+ '#endif',
|
|
|
|
|
|
- ' attribute vec3 morphNormal0;',
|
|
|
- ' attribute vec3 morphNormal1;',
|
|
|
- ' attribute vec3 morphNormal2;',
|
|
|
- ' attribute vec3 morphNormal3;',
|
|
|
+ '#ifdef USE_MORPHTARGETS',
|
|
|
|
|
|
- ' #else',
|
|
|
+ ' attribute vec3 morphTarget0;',
|
|
|
+ ' attribute vec3 morphTarget1;',
|
|
|
+ ' attribute vec3 morphTarget2;',
|
|
|
+ ' attribute vec3 morphTarget3;',
|
|
|
|
|
|
- ' attribute vec3 morphTarget4;',
|
|
|
- ' attribute vec3 morphTarget5;',
|
|
|
- ' attribute vec3 morphTarget6;',
|
|
|
- ' attribute vec3 morphTarget7;',
|
|
|
+ ' #ifdef USE_MORPHNORMALS',
|
|
|
|
|
|
- ' #endif',
|
|
|
+ ' attribute vec3 morphNormal0;',
|
|
|
+ ' attribute vec3 morphNormal1;',
|
|
|
+ ' attribute vec3 morphNormal2;',
|
|
|
+ ' attribute vec3 morphNormal3;',
|
|
|
|
|
|
- '#endif',
|
|
|
+ ' #else',
|
|
|
|
|
|
- '#ifdef USE_SKINNING',
|
|
|
+ ' attribute vec3 morphTarget4;',
|
|
|
+ ' attribute vec3 morphTarget5;',
|
|
|
+ ' attribute vec3 morphTarget6;',
|
|
|
+ ' attribute vec3 morphTarget7;',
|
|
|
|
|
|
- ' attribute vec4 skinIndex;',
|
|
|
- ' attribute vec4 skinWeight;',
|
|
|
+ ' #endif',
|
|
|
|
|
|
- '#endif',
|
|
|
+ '#endif',
|
|
|
|
|
|
- '\n'
|
|
|
+ '#ifdef USE_SKINNING',
|
|
|
|
|
|
- ].filter( filterEmptyLine ).join( '\n' );
|
|
|
+ ' attribute vec4 skinIndex;',
|
|
|
+ ' attribute vec4 skinWeight;',
|
|
|
|
|
|
- prefixFragment = [
|
|
|
+ '#endif',
|
|
|
|
|
|
- customExtensions,
|
|
|
+ '\n'
|
|
|
|
|
|
- 'precision ' + parameters.precision + ' float;',
|
|
|
- 'precision ' + parameters.precision + ' int;',
|
|
|
+ ].filter( filterEmptyLine ).join( '\n' );
|
|
|
|
|
|
- '#define SHADER_NAME ' + material.__webglShader.name,
|
|
|
+ prefixFragment = [
|
|
|
|
|
|
- customDefines,
|
|
|
+ customExtensions,
|
|
|
|
|
|
- parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',
|
|
|
+ 'precision ' + parameters.precision + ' float;',
|
|
|
+ 'precision ' + parameters.precision + ' int;',
|
|
|
|
|
|
- '#define GAMMA_FACTOR ' + gammaFactorDefine,
|
|
|
+ '#define SHADER_NAME ' + material.__webglShader.name,
|
|
|
|
|
|
- ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
|
|
|
- ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',
|
|
|
+ customDefines,
|
|
|
|
|
|
- parameters.map ? '#define USE_MAP' : '',
|
|
|
- parameters.envMap ? '#define USE_ENVMAP' : '',
|
|
|
- parameters.envMap ? '#define ' + envMapTypeDefine : '',
|
|
|
- parameters.envMap ? '#define ' + envMapModeDefine : '',
|
|
|
- parameters.envMap ? '#define ' + envMapBlendingDefine : '',
|
|
|
- parameters.lightMap ? '#define USE_LIGHTMAP' : '',
|
|
|
- parameters.aoMap ? '#define USE_AOMAP' : '',
|
|
|
- parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
|
|
|
- parameters.bumpMap ? '#define USE_BUMPMAP' : '',
|
|
|
- parameters.normalMap ? '#define USE_NORMALMAP' : '',
|
|
|
- parameters.specularMap ? '#define USE_SPECULARMAP' : '',
|
|
|
- parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
|
|
|
- parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
|
|
|
- parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
|
|
|
- parameters.vertexColors ? '#define USE_COLOR' : '',
|
|
|
+ parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',
|
|
|
|
|
|
- parameters.flatShading ? '#define FLAT_SHADED' : '',
|
|
|
+ '#define GAMMA_FACTOR ' + gammaFactorDefine,
|
|
|
|
|
|
- parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
|
|
|
- parameters.flipSided ? '#define FLIP_SIDED' : '',
|
|
|
+ ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
|
|
|
+ ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',
|
|
|
|
|
|
- '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,
|
|
|
+ parameters.map ? '#define USE_MAP' : '',
|
|
|
+ parameters.envMap ? '#define USE_ENVMAP' : '',
|
|
|
+ parameters.envMap ? '#define ' + envMapTypeDefine : '',
|
|
|
+ parameters.envMap ? '#define ' + envMapModeDefine : '',
|
|
|
+ parameters.envMap ? '#define ' + envMapBlendingDefine : '',
|
|
|
+ parameters.lightMap ? '#define USE_LIGHTMAP' : '',
|
|
|
+ parameters.aoMap ? '#define USE_AOMAP' : '',
|
|
|
+ parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
|
|
|
+ parameters.bumpMap ? '#define USE_BUMPMAP' : '',
|
|
|
+ parameters.normalMap ? '#define USE_NORMALMAP' : '',
|
|
|
+ parameters.specularMap ? '#define USE_SPECULARMAP' : '',
|
|
|
+ parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
|
|
|
+ parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
|
|
|
+ parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
|
|
|
+ parameters.vertexColors ? '#define USE_COLOR' : '',
|
|
|
|
|
|
- parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',
|
|
|
- parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',
|
|
|
+ parameters.flatShading ? '#define FLAT_SHADED' : '',
|
|
|
|
|
|
- parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : '',
|
|
|
+ parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
|
|
|
+ parameters.flipSided ? '#define FLIP_SIDED' : '',
|
|
|
|
|
|
- parameters.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS" : '',
|
|
|
+ '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,
|
|
|
|
|
|
- parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
|
|
|
- parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
|
|
|
+ parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',
|
|
|
+ parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',
|
|
|
|
|
|
- parameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',
|
|
|
+ parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : '',
|
|
|
|
|
|
- 'uniform mat4 viewMatrix;',
|
|
|
- 'uniform vec3 cameraPosition;',
|
|
|
+ parameters.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS" : '',
|
|
|
|
|
|
- ( parameters.toneMapping !== NoToneMapping ) ? "#define TONE_MAPPING" : '',
|
|
|
- ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below
|
|
|
- ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( "toneMapping", parameters.toneMapping ) : '',
|
|
|
+ parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
|
|
|
+ parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
|
|
|
|
|
|
- ( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below
|
|
|
- parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',
|
|
|
- parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',
|
|
|
- parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',
|
|
|
- parameters.outputEncoding ? getTexelEncodingFunction( "linearToOutputTexel", parameters.outputEncoding ) : '',
|
|
|
+ parameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',
|
|
|
|
|
|
- parameters.depthPacking ? "#define DEPTH_PACKING " + material.depthPacking : '',
|
|
|
+ 'uniform mat4 viewMatrix;',
|
|
|
+ 'uniform vec3 cameraPosition;',
|
|
|
|
|
|
- '\n'
|
|
|
+ ( parameters.toneMapping !== NoToneMapping ) ? "#define TONE_MAPPING" : '',
|
|
|
+ ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below
|
|
|
+ ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( "toneMapping", parameters.toneMapping ) : '',
|
|
|
|
|
|
- ].filter( filterEmptyLine ).join( '\n' );
|
|
|
+ ( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below
|
|
|
+ parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',
|
|
|
+ parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',
|
|
|
+ parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',
|
|
|
+ parameters.outputEncoding ? getTexelEncodingFunction( "linearToOutputTexel", parameters.outputEncoding ) : '',
|
|
|
|
|
|
- }
|
|
|
+ parameters.depthPacking ? "#define DEPTH_PACKING " + material.depthPacking : '',
|
|
|
|
|
|
- vertexShader = parseIncludes( vertexShader, parameters );
|
|
|
- vertexShader = replaceLightNums( vertexShader, parameters );
|
|
|
+ '\n'
|
|
|
|
|
|
- fragmentShader = parseIncludes( fragmentShader, parameters );
|
|
|
- fragmentShader = replaceLightNums( fragmentShader, parameters );
|
|
|
+ ].filter( filterEmptyLine ).join( '\n' );
|
|
|
|
|
|
- if ( (material && material.isShaderMaterial) === false ) {
|
|
|
+ }
|
|
|
|
|
|
- vertexShader = unrollLoops( vertexShader );
|
|
|
- fragmentShader = unrollLoops( fragmentShader );
|
|
|
+ vertexShader = parseIncludes( vertexShader, parameters );
|
|
|
+ vertexShader = replaceLightNums( vertexShader, parameters );
|
|
|
|
|
|
- }
|
|
|
+ fragmentShader = parseIncludes( fragmentShader, parameters );
|
|
|
+ fragmentShader = replaceLightNums( fragmentShader, parameters );
|
|
|
|
|
|
- var vertexGlsl = prefixVertex + vertexShader;
|
|
|
- var fragmentGlsl = prefixFragment + fragmentShader;
|
|
|
+ if ( (material && material.isShaderMaterial) === false ) {
|
|
|
|
|
|
- // console.log( '*VERTEX*', vertexGlsl );
|
|
|
- // console.log( '*FRAGMENT*', fragmentGlsl );
|
|
|
+ vertexShader = unrollLoops( vertexShader );
|
|
|
+ fragmentShader = unrollLoops( fragmentShader );
|
|
|
|
|
|
- var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );
|
|
|
- var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );
|
|
|
+ }
|
|
|
|
|
|
- gl.attachShader( program, glVertexShader );
|
|
|
- gl.attachShader( program, glFragmentShader );
|
|
|
+ var vertexGlsl = prefixVertex + vertexShader;
|
|
|
+ var fragmentGlsl = prefixFragment + fragmentShader;
|
|
|
|
|
|
- // Force a particular attribute to index 0.
|
|
|
+ // console.log( '*VERTEX*', vertexGlsl );
|
|
|
+ // console.log( '*FRAGMENT*', fragmentGlsl );
|
|
|
|
|
|
- if ( material.index0AttributeName !== undefined ) {
|
|
|
+ var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );
|
|
|
+ var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );
|
|
|
|
|
|
- gl.bindAttribLocation( program, 0, material.index0AttributeName );
|
|
|
+ gl.attachShader( program, glVertexShader );
|
|
|
+ gl.attachShader( program, glFragmentShader );
|
|
|
|
|
|
- } else if ( parameters.morphTargets === true ) {
|
|
|
+ // Force a particular attribute to index 0.
|
|
|
|
|
|
- // programs with morphTargets displace position out of attribute 0
|
|
|
- gl.bindAttribLocation( program, 0, 'position' );
|
|
|
+ if ( material.index0AttributeName !== undefined ) {
|
|
|
|
|
|
- }
|
|
|
+ gl.bindAttribLocation( program, 0, material.index0AttributeName );
|
|
|
|
|
|
- gl.linkProgram( program );
|
|
|
+ } else if ( parameters.morphTargets === true ) {
|
|
|
|
|
|
- var programLog = gl.getProgramInfoLog( program );
|
|
|
- var vertexLog = gl.getShaderInfoLog( glVertexShader );
|
|
|
- var fragmentLog = gl.getShaderInfoLog( glFragmentShader );
|
|
|
+ // programs with morphTargets displace position out of attribute 0
|
|
|
+ gl.bindAttribLocation( program, 0, 'position' );
|
|
|
|
|
|
- var runnable = true;
|
|
|
- var haveDiagnostics = true;
|
|
|
+ }
|
|
|
|
|
|
- // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );
|
|
|
- // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );
|
|
|
+ gl.linkProgram( program );
|
|
|
|
|
|
- if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {
|
|
|
+ var programLog = gl.getProgramInfoLog( program );
|
|
|
+ var vertexLog = gl.getShaderInfoLog( glVertexShader );
|
|
|
+ var fragmentLog = gl.getShaderInfoLog( glFragmentShader );
|
|
|
|
|
|
- runnable = false;
|
|
|
+ var runnable = true;
|
|
|
+ var haveDiagnostics = true;
|
|
|
|
|
|
- console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );
|
|
|
+ // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );
|
|
|
+ // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );
|
|
|
|
|
|
- } else if ( programLog !== '' ) {
|
|
|
+ if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {
|
|
|
|
|
|
- console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );
|
|
|
+ runnable = false;
|
|
|
|
|
|
- } else if ( vertexLog === '' || fragmentLog === '' ) {
|
|
|
+ console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );
|
|
|
|
|
|
- haveDiagnostics = false;
|
|
|
+ } else if ( programLog !== '' ) {
|
|
|
|
|
|
- }
|
|
|
+ console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );
|
|
|
|
|
|
- if ( haveDiagnostics ) {
|
|
|
+ } else if ( vertexLog === '' || fragmentLog === '' ) {
|
|
|
|
|
|
- this.diagnostics = {
|
|
|
+ haveDiagnostics = false;
|
|
|
|
|
|
- runnable: runnable,
|
|
|
- material: material,
|
|
|
+ }
|
|
|
|
|
|
- programLog: programLog,
|
|
|
+ if ( haveDiagnostics ) {
|
|
|
|
|
|
- vertexShader: {
|
|
|
+ this.diagnostics = {
|
|
|
|
|
|
- log: vertexLog,
|
|
|
- prefix: prefixVertex
|
|
|
+ runnable: runnable,
|
|
|
+ material: material,
|
|
|
|
|
|
- },
|
|
|
+ programLog: programLog,
|
|
|
|
|
|
- fragmentShader: {
|
|
|
+ vertexShader: {
|
|
|
|
|
|
- log: fragmentLog,
|
|
|
- prefix: prefixFragment
|
|
|
+ log: vertexLog,
|
|
|
+ prefix: prefixVertex
|
|
|
|
|
|
- }
|
|
|
+ },
|
|
|
|
|
|
- };
|
|
|
+ fragmentShader: {
|
|
|
|
|
|
- }
|
|
|
+ log: fragmentLog,
|
|
|
+ prefix: prefixFragment
|
|
|
|
|
|
- // clean up
|
|
|
+ }
|
|
|
|
|
|
- gl.deleteShader( glVertexShader );
|
|
|
- gl.deleteShader( glFragmentShader );
|
|
|
+ };
|
|
|
|
|
|
- // set up caching for uniform locations
|
|
|
+ }
|
|
|
|
|
|
- var cachedUniforms;
|
|
|
+ // clean up
|
|
|
|
|
|
- this.getUniforms = function() {
|
|
|
+ gl.deleteShader( glVertexShader );
|
|
|
+ gl.deleteShader( glFragmentShader );
|
|
|
|
|
|
- if ( cachedUniforms === undefined ) {
|
|
|
+ // set up caching for uniform locations
|
|
|
|
|
|
- cachedUniforms =
|
|
|
- new WebGLUniforms( gl, program, renderer );
|
|
|
+ var cachedUniforms;
|
|
|
|
|
|
- }
|
|
|
+ this.getUniforms = function() {
|
|
|
|
|
|
- return cachedUniforms;
|
|
|
+ if ( cachedUniforms === undefined ) {
|
|
|
|
|
|
- };
|
|
|
+ cachedUniforms =
|
|
|
+ new WebGLUniforms( gl, program, renderer );
|
|
|
|
|
|
- // set up caching for attribute locations
|
|
|
+ }
|
|
|
|
|
|
- var cachedAttributes;
|
|
|
+ return cachedUniforms;
|
|
|
|
|
|
- this.getAttributes = function() {
|
|
|
+ };
|
|
|
|
|
|
- if ( cachedAttributes === undefined ) {
|
|
|
+ // set up caching for attribute locations
|
|
|
|
|
|
- cachedAttributes = fetchAttributeLocations( gl, program );
|
|
|
+ var cachedAttributes;
|
|
|
|
|
|
- }
|
|
|
+ this.getAttributes = function() {
|
|
|
|
|
|
- return cachedAttributes;
|
|
|
+ if ( cachedAttributes === undefined ) {
|
|
|
|
|
|
- };
|
|
|
+ cachedAttributes = fetchAttributeLocations( gl, program );
|
|
|
|
|
|
- // free resource
|
|
|
+ }
|
|
|
|
|
|
- this.destroy = function() {
|
|
|
+ return cachedAttributes;
|
|
|
|
|
|
- gl.deleteProgram( program );
|
|
|
- this.program = undefined;
|
|
|
+ };
|
|
|
|
|
|
- };
|
|
|
+ // free resource
|
|
|
|
|
|
- // DEPRECATED
|
|
|
+ this.destroy = function() {
|
|
|
|
|
|
- Object.defineProperties( this, {
|
|
|
+ gl.deleteProgram( program );
|
|
|
+ this.program = undefined;
|
|
|
|
|
|
- uniforms: {
|
|
|
- get: function() {
|
|
|
+ };
|
|
|
|
|
|
- console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );
|
|
|
- return this.getUniforms();
|
|
|
+ // DEPRECATED
|
|
|
|
|
|
- }
|
|
|
- },
|
|
|
+ Object.defineProperties( this, {
|
|
|
|
|
|
- attributes: {
|
|
|
- get: function() {
|
|
|
+ uniforms: {
|
|
|
+ get: function() {
|
|
|
|
|
|
- console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );
|
|
|
- return this.getAttributes();
|
|
|
+ console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );
|
|
|
+ return this.getUniforms();
|
|
|
|
|
|
- }
|
|
|
}
|
|
|
+ },
|
|
|
|
|
|
- } );
|
|
|
+ attributes: {
|
|
|
+ get: function() {
|
|
|
|
|
|
+ console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );
|
|
|
+ return this.getAttributes();
|
|
|
|
|
|
- //
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- this.id = programIdCount ++;
|
|
|
- this.code = code;
|
|
|
- this.usedTimes = 1;
|
|
|
- this.program = program;
|
|
|
- this.vertexShader = glVertexShader;
|
|
|
- this.fragmentShader = glFragmentShader;
|
|
|
+ } );
|
|
|
|
|
|
- return this;
|
|
|
|
|
|
- };
|
|
|
+ //
|
|
|
+
|
|
|
+ this.id = programIdCount ++;
|
|
|
+ this.code = code;
|
|
|
+ this.usedTimes = 1;
|
|
|
+ this.program = program;
|
|
|
+ this.vertexShader = glVertexShader;
|
|
|
+ this.fragmentShader = glFragmentShader;
|
|
|
|
|
|
-} )();
|
|
|
+ return this;
|
|
|
|
|
|
+}
|
|
|
|
|
|
-export { WebGLProgram };
|
|
|
+export { WebGLProgram };
|