|
@@ -20,14 +20,28 @@ THREE.WebGLProgram = ( function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
- function cacheUniformLocations( gl, program, identifiers ) {
|
|
|
+ function fetchUniformLocations( gl, program, identifiers ) {
|
|
|
+
|
|
|
|
|
|
var uniforms = {};
|
|
|
|
|
|
- for ( var i = 0, l = identifiers.length; i < l; i ++ ) {
|
|
|
+ var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );
|
|
|
+ for ( var i = 0; i < n; i ++ ) {
|
|
|
+
|
|
|
+ var info = gl.getActiveUniform( program , i );
|
|
|
+ var name = info.name;
|
|
|
+ var location = gl.getUniformLocation( program, name );
|
|
|
+
|
|
|
+ //console.log("THREE.WebGLProgram: ACTIVE UNIFORM:", name);
|
|
|
+
|
|
|
+ var suffixPos = name.lastIndexOf( '[0]' );
|
|
|
+ if ( suffixPos !== -1 && suffixPos === name.length - 3 ) {
|
|
|
|
|
|
- var id = identifiers[ i ];
|
|
|
- uniforms[ id ] = gl.getUniformLocation( program, id );
|
|
|
+ uniforms[ name.substr( 0, suffixPos ) ] = location;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ uniforms[ name ] = location;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -35,14 +49,19 @@ THREE.WebGLProgram = ( function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
- function cacheAttributeLocations( gl, program, identifiers ) {
|
|
|
+ function fetchAttributeLocations( gl, program, identifiers ) {
|
|
|
|
|
|
var attributes = {};
|
|
|
|
|
|
- for ( var i = 0, l = identifiers.length; i < l; i ++ ) {
|
|
|
+ var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );
|
|
|
+ for ( var i = 0; i < n; i ++ ) {
|
|
|
+
|
|
|
+ var info = gl.getActiveAttrib( program , i );
|
|
|
+ var name = info.name;
|
|
|
|
|
|
- var id = identifiers[ i ];
|
|
|
- attributes[ id ] = gl.getAttribLocation( program, id );
|
|
|
+ //console.log("THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:", name);
|
|
|
+
|
|
|
+ attributes[ name ] = gl.getAttribLocation( program, name );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -154,16 +173,16 @@ THREE.WebGLProgram = ( function () {
|
|
|
|
|
|
var program = gl.createProgram();
|
|
|
|
|
|
- var prefix_vertex, prefix_fragment;
|
|
|
+ var prefixVertex, prefixFragment;
|
|
|
|
|
|
if ( material instanceof THREE.RawShaderMaterial ) {
|
|
|
|
|
|
- prefix_vertex = '';
|
|
|
- prefix_fragment = '';
|
|
|
+ prefixVertex = '';
|
|
|
+ prefixFragment = '';
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- prefix_vertex = [
|
|
|
+ prefixVertex = [
|
|
|
|
|
|
'precision ' + parameters.precision + ' float;',
|
|
|
'precision ' + parameters.precision + ' int;',
|
|
@@ -270,7 +289,7 @@ THREE.WebGLProgram = ( function () {
|
|
|
|
|
|
].filter( filterEmptyLine ).join( '\n' );
|
|
|
|
|
|
- prefix_fragment = [
|
|
|
+ prefixFragment = [
|
|
|
|
|
|
( parameters.bumpMap || parameters.normalMap || parameters.flatShading || material.derivatives ) ? '#extension GL_OES_standard_derivatives : enable' : '',
|
|
|
|
|
@@ -331,8 +350,11 @@ THREE.WebGLProgram = ( function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
- var glVertexShader = new THREE.WebGLShader( gl, gl.VERTEX_SHADER, prefix_vertex + vertexShader );
|
|
|
- var glFragmentShader = new THREE.WebGLShader( gl, gl.FRAGMENT_SHADER, prefix_fragment + fragmentShader );
|
|
|
+ var vertexGlsl = prefixVertex + vertexShader;
|
|
|
+ var fragmentGlsl = prefixFragment + fragmentShader;
|
|
|
+
|
|
|
+ var glVertexShader = new THREE.WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );
|
|
|
+ var glFragmentShader = new THREE.WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );
|
|
|
|
|
|
gl.attachShader( program, glVertexShader );
|
|
|
gl.attachShader( program, glFragmentShader );
|
|
@@ -370,91 +392,65 @@ THREE.WebGLProgram = ( function () {
|
|
|
gl.deleteShader( glVertexShader );
|
|
|
gl.deleteShader( glFragmentShader );
|
|
|
|
|
|
- // cache uniform locations
|
|
|
-
|
|
|
- var identifiers = [
|
|
|
-
|
|
|
- 'viewMatrix',
|
|
|
- 'modelViewMatrix',
|
|
|
- 'projectionMatrix',
|
|
|
- 'normalMatrix',
|
|
|
- 'modelMatrix',
|
|
|
- 'cameraPosition',
|
|
|
- 'morphTargetInfluences',
|
|
|
- 'bindMatrix',
|
|
|
- 'bindMatrixInverse'
|
|
|
-
|
|
|
- ];
|
|
|
-
|
|
|
- if ( parameters.useVertexTexture ) {
|
|
|
-
|
|
|
- identifiers.push( 'boneTexture', 'boneTextureWidth', 'boneTextureHeight' );
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- identifiers.push( 'boneGlobalMatrices' );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if ( parameters.logarithmicDepthBuffer ) {
|
|
|
-
|
|
|
- identifiers.push( 'logDepthBufFC' );
|
|
|
-
|
|
|
- }
|
|
|
+ // set up caching for uniform locations
|
|
|
|
|
|
- for ( var u in uniforms ) {
|
|
|
+ var getUniforms = function() { return this._cachedUniforms; };
|
|
|
|
|
|
- identifiers.push( u );
|
|
|
+ this.getUniforms = function() {
|
|
|
|
|
|
- }
|
|
|
-
|
|
|
- this.uniforms = cacheUniformLocations( gl, program, identifiers );
|
|
|
+ // fetch, cache, and next time just use a dumb accessor
|
|
|
+ var uniforms = fetchUniformLocations( gl, program );
|
|
|
+ this._cachedUniforms = uniforms;
|
|
|
+ this.getUniforms = getUniforms;
|
|
|
+ return uniforms;
|
|
|
|
|
|
- // cache attributes locations
|
|
|
+ };
|
|
|
|
|
|
- if ( material instanceof THREE.RawShaderMaterial ) {
|
|
|
+ // set up caching for attribute locations
|
|
|
|
|
|
- identifiers = attributes;
|
|
|
+ var getAttributes = function() { return this._cachedAttributes; };
|
|
|
|
|
|
- } else {
|
|
|
+ this.getAttributes = function() {
|
|
|
|
|
|
- identifiers = [
|
|
|
+ var attributes = fetchAttributeLocations( gl, program );
|
|
|
+ this._cachedAttributes = attributes;
|
|
|
+ this.getAttributes = getAttributes;
|
|
|
+ return attributes;
|
|
|
|
|
|
- 'position',
|
|
|
- 'normal',
|
|
|
- 'uv',
|
|
|
- 'uv2',
|
|
|
- 'tangent',
|
|
|
- 'color',
|
|
|
- 'skinIndex',
|
|
|
- 'skinWeight',
|
|
|
- 'lineDistance'
|
|
|
+ };
|
|
|
|
|
|
- ];
|
|
|
+ // DEPRECATED
|
|
|
|
|
|
- for ( var i = 0; i < parameters.maxMorphTargets; i ++ ) {
|
|
|
+ Object.defineProperties( this, {
|
|
|
|
|
|
- identifiers.push( 'morphTarget' + i );
|
|
|
+ uniforms: {
|
|
|
+ get: function() {
|
|
|
|
|
|
- }
|
|
|
+ console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );
|
|
|
+ return this.getUniforms();
|
|
|
|
|
|
- for ( var i = 0; i < parameters.maxMorphNormals; i ++ ) {
|
|
|
+ }
|
|
|
+ },
|
|
|
|
|
|
- identifiers.push( 'morphNormal' + i );
|
|
|
+ attributes: {
|
|
|
+ get: function() {
|
|
|
|
|
|
- }
|
|
|
+ console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );
|
|
|
+ return this.getAttributes();
|
|
|
|
|
|
- // ShaderMaterial attributes
|
|
|
+ }
|
|
|
+ },
|
|
|
|
|
|
- if ( Array.isArray( attributes ) ) {
|
|
|
+ attributesKeys: {
|
|
|
+ get: function() {
|
|
|
|
|
|
- identifiers = identifiers.concat( attributes );
|
|
|
+ console.warn( 'THREE.WebGLProgram: .attributesKeys has been removed.' );
|
|
|
+ return Object.keys( this.getAttributes() );
|
|
|
|
|
|
+ }
|
|
|
}
|
|
|
+ });
|
|
|
|
|
|
- }
|
|
|
-
|
|
|
- this.attributes = cacheAttributeLocations( gl, program, identifiers );
|
|
|
|
|
|
//
|
|
|
|