|
@@ -39,6 +39,8 @@ THREE.WebGLRenderer2 = function ( parameters ) {
|
|
var lineRenderer = new THREE.LineRenderer(renderer, info);
|
|
var lineRenderer = new THREE.LineRenderer(renderer, info);
|
|
var ribbonRenderer = new THREE.RibbonRenderer(renderer, info);
|
|
var ribbonRenderer = new THREE.RibbonRenderer(renderer, info);
|
|
|
|
|
|
|
|
+ var shaderBuilder = new THREE.ShaderBuilder(renderer, info);
|
|
|
|
+
|
|
// clearing
|
|
// clearing
|
|
|
|
|
|
this.autoClear = true;
|
|
this.autoClear = true;
|
|
@@ -91,9 +93,6 @@ THREE.WebGLRenderer2 = function ( parameters ) {
|
|
|
|
|
|
var _this = this,
|
|
var _this = this,
|
|
|
|
|
|
- _programs = [],
|
|
|
|
- _programs_counter = 0,
|
|
|
|
-
|
|
|
|
// internal state cache
|
|
// internal state cache
|
|
|
|
|
|
_currentProgram = null,
|
|
_currentProgram = null,
|
|
@@ -254,6 +253,7 @@ THREE.WebGLRenderer2 = function ( parameters ) {
|
|
|
|
|
|
var deallocateGeometry = function ( geometry ) {
|
|
var deallocateGeometry = function ( geometry ) {
|
|
|
|
|
|
|
|
+ var m,ml;
|
|
geometry.__webglInit = undefined;
|
|
geometry.__webglInit = undefined;
|
|
|
|
|
|
if ( geometry.__webglVertexBuffer !== undefined ) renderer.deleteBuffer( geometry.__webglVertexBuffer );
|
|
if ( geometry.__webglVertexBuffer !== undefined ) renderer.deleteBuffer( geometry.__webglVertexBuffer );
|
|
@@ -281,7 +281,7 @@ THREE.WebGLRenderer2 = function ( parameters ) {
|
|
|
|
|
|
if ( geometryGroup.numMorphTargets !== undefined ) {
|
|
if ( geometryGroup.numMorphTargets !== undefined ) {
|
|
|
|
|
|
- for ( var m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {
|
|
|
|
|
|
+ for ( m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {
|
|
|
|
|
|
renderer.deleteBuffer( geometryGroup.__webglMorphTargetsBuffers[ m ] );
|
|
renderer.deleteBuffer( geometryGroup.__webglMorphTargetsBuffers[ m ] );
|
|
|
|
|
|
@@ -291,7 +291,7 @@ THREE.WebGLRenderer2 = function ( parameters ) {
|
|
|
|
|
|
if ( geometryGroup.numMorphNormals !== undefined ) {
|
|
if ( geometryGroup.numMorphNormals !== undefined ) {
|
|
|
|
|
|
- for ( var m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) {
|
|
|
|
|
|
+ for ( m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) {
|
|
|
|
|
|
renderer.deleteBuffer( geometryGroup.__webglMorphNormalsBuffers[ m ] );
|
|
renderer.deleteBuffer( geometryGroup.__webglMorphNormalsBuffers[ m ] );
|
|
|
|
|
|
@@ -365,55 +365,8 @@ THREE.WebGLRenderer2 = function ( parameters ) {
|
|
// only deallocate GL program if this was the last use of shared program
|
|
// only deallocate GL program if this was the last use of shared program
|
|
// assumed there is only single copy of any program in the _programs list
|
|
// assumed there is only single copy of any program in the _programs list
|
|
// (that's how it's constructed)
|
|
// (that's how it's constructed)
|
|
-
|
|
|
|
- var i, il, programInfo;
|
|
|
|
- var deleteProgram = false;
|
|
|
|
-
|
|
|
|
- for ( i = 0, il = _programs.length; i < il; i ++ ) {
|
|
|
|
-
|
|
|
|
- programInfo = _programs[ i ];
|
|
|
|
-
|
|
|
|
- if ( programInfo.program === program ) {
|
|
|
|
-
|
|
|
|
- programInfo.usedTimes --;
|
|
|
|
-
|
|
|
|
- if ( programInfo.usedTimes === 0 ) {
|
|
|
|
-
|
|
|
|
- deleteProgram = true;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ( deleteProgram === true ) {
|
|
|
|
-
|
|
|
|
- // avoid using array.splice, this is costlier than creating new array from scratch
|
|
|
|
-
|
|
|
|
- var newPrograms = [];
|
|
|
|
-
|
|
|
|
- for ( i = 0, il = _programs.length; i < il; i ++ ) {
|
|
|
|
-
|
|
|
|
- programInfo = _programs[ i ];
|
|
|
|
-
|
|
|
|
- if ( programInfo.program !== program ) {
|
|
|
|
-
|
|
|
|
- newPrograms.push( programInfo );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- _programs = newPrograms;
|
|
|
|
-
|
|
|
|
- renderer.deleteProgram( program );
|
|
|
|
-
|
|
|
|
- _this.info.memory.programs --;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+ shaderBuilder.removeProgram(program)
|
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
@@ -490,12 +443,6 @@ THREE.WebGLRenderer2 = function ( parameters ) {
|
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
- function materialNeedsSmoothNormals ( material ) {
|
|
|
|
-
|
|
|
|
- return material && material.shading !== undefined && material.shading === THREE.SmoothShading;
|
|
|
|
-
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
//
|
|
//
|
|
|
|
|
|
function initDirectBuffers( geometry ) {
|
|
function initDirectBuffers( geometry ) {
|
|
@@ -2256,11 +2203,15 @@ THREE.WebGLRenderer2 = function ( parameters ) {
|
|
perPixel: material.perPixel,
|
|
perPixel: material.perPixel,
|
|
wrapAround: material.wrapAround,
|
|
wrapAround: material.wrapAround,
|
|
doubleSided: material.side === THREE.DoubleSide,
|
|
doubleSided: material.side === THREE.DoubleSide,
|
|
- flipSided: material.side === THREE.BackSide
|
|
|
|
|
|
+ flipSided: material.side === THREE.BackSide,
|
|
|
|
+
|
|
|
|
+ gammaInput : this.gammaInput,
|
|
|
|
+ gammaOutput : this.gammaOutput ,
|
|
|
|
+ physicallyBasedShading : this.physicallyBasedShading
|
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
- material.program = buildProgram( shaderID, material.fragmentShader, material.vertexShader, material.uniforms, material.attributes, material.defines, parameters );
|
|
|
|
|
|
+ material.program = shaderBuilder.buildProgram( shaderID, material.fragmentShader, material.vertexShader, material.uniforms, material.attributes, material.defines, parameters );
|
|
|
|
|
|
var attributes = material.program.attributes;
|
|
var attributes = material.program.attributes;
|
|
|
|
|
|
@@ -3250,356 +3201,6 @@ THREE.WebGLRenderer2 = function ( parameters ) {
|
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
- // Defines
|
|
|
|
-
|
|
|
|
- function generateDefines ( defines ) {
|
|
|
|
-
|
|
|
|
- var value, chunk, chunks = [];
|
|
|
|
-
|
|
|
|
- for ( var d in defines ) {
|
|
|
|
-
|
|
|
|
- value = defines[ d ];
|
|
|
|
- if ( value === false ) continue;
|
|
|
|
-
|
|
|
|
- chunk = "#define " + d + " " + value;
|
|
|
|
- chunks.push( chunk );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return chunks.join( "\n" );
|
|
|
|
-
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- // Shaders
|
|
|
|
-
|
|
|
|
- function buildProgram ( shaderID, fragmentShader, vertexShader, uniforms, attributes, defines, parameters ) {
|
|
|
|
-
|
|
|
|
- var p, pl, d, program, code;
|
|
|
|
- var chunks = [];
|
|
|
|
-
|
|
|
|
- // Generate code
|
|
|
|
-
|
|
|
|
- if ( shaderID ) {
|
|
|
|
-
|
|
|
|
- chunks.push( shaderID );
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- chunks.push( fragmentShader );
|
|
|
|
- chunks.push( vertexShader );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for ( d in defines ) {
|
|
|
|
-
|
|
|
|
- chunks.push( d );
|
|
|
|
- chunks.push( defines[ d ] );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for ( p in parameters ) {
|
|
|
|
-
|
|
|
|
- chunks.push( p );
|
|
|
|
- chunks.push( parameters[ p ] );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- code = chunks.join();
|
|
|
|
-
|
|
|
|
- // Check if code has been already compiled
|
|
|
|
-
|
|
|
|
- for ( p = 0, pl = _programs.length; p < pl; p ++ ) {
|
|
|
|
-
|
|
|
|
- var programInfo = _programs[ p ];
|
|
|
|
-
|
|
|
|
- if ( programInfo.code === code ) {
|
|
|
|
-
|
|
|
|
- //console.log( "Code already compiled." /*: \n\n" + code*/ );
|
|
|
|
-
|
|
|
|
- programInfo.usedTimes ++;
|
|
|
|
-
|
|
|
|
- return programInfo.program;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- var shadowMapTypeDefine = "SHADOWMAP_TYPE_BASIC";
|
|
|
|
-
|
|
|
|
- if ( parameters.shadowMapType === THREE.PCFShadowMap ) {
|
|
|
|
-
|
|
|
|
- shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF";
|
|
|
|
-
|
|
|
|
- } else if ( parameters.shadowMapType === THREE.PCFSoftShadowMap ) {
|
|
|
|
-
|
|
|
|
- shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF_SOFT";
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- //console.log( "building new program " );
|
|
|
|
-
|
|
|
|
- //
|
|
|
|
-
|
|
|
|
- var customDefines = generateDefines( defines );
|
|
|
|
-
|
|
|
|
- //
|
|
|
|
-
|
|
|
|
- var prefix_vertex = [
|
|
|
|
-
|
|
|
|
- "precision " + renderer.precision + " float;",
|
|
|
|
-
|
|
|
|
- customDefines,
|
|
|
|
-
|
|
|
|
- renderer.supportsVertexTextures ? "#define VERTEX_TEXTURES" : "",
|
|
|
|
-
|
|
|
|
- _this.gammaInput ? "#define GAMMA_INPUT" : "",
|
|
|
|
- _this.gammaOutput ? "#define GAMMA_OUTPUT" : "",
|
|
|
|
- _this.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_SHADOWS " + parameters.maxShadows,
|
|
|
|
-
|
|
|
|
- "#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.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.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
|
|
|
|
- parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "",
|
|
|
|
- parameters.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "",
|
|
|
|
- parameters.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "",
|
|
|
|
-
|
|
|
|
- parameters.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "",
|
|
|
|
-
|
|
|
|
- "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;",
|
|
|
|
-
|
|
|
|
- "#ifdef USE_COLOR",
|
|
|
|
-
|
|
|
|
- "attribute vec3 color;",
|
|
|
|
-
|
|
|
|
- "#endif",
|
|
|
|
-
|
|
|
|
- "#ifdef USE_MORPHTARGETS",
|
|
|
|
-
|
|
|
|
- "attribute vec3 morphTarget0;",
|
|
|
|
- "attribute vec3 morphTarget1;",
|
|
|
|
- "attribute vec3 morphTarget2;",
|
|
|
|
- "attribute vec3 morphTarget3;",
|
|
|
|
-
|
|
|
|
- "#ifdef USE_MORPHNORMALS",
|
|
|
|
-
|
|
|
|
- "attribute vec3 morphNormal0;",
|
|
|
|
- "attribute vec3 morphNormal1;",
|
|
|
|
- "attribute vec3 morphNormal2;",
|
|
|
|
- "attribute vec3 morphNormal3;",
|
|
|
|
-
|
|
|
|
- "#else",
|
|
|
|
-
|
|
|
|
- "attribute vec3 morphTarget4;",
|
|
|
|
- "attribute vec3 morphTarget5;",
|
|
|
|
- "attribute vec3 morphTarget6;",
|
|
|
|
- "attribute vec3 morphTarget7;",
|
|
|
|
-
|
|
|
|
- "#endif",
|
|
|
|
-
|
|
|
|
- "#endif",
|
|
|
|
-
|
|
|
|
- "#ifdef USE_SKINNING",
|
|
|
|
-
|
|
|
|
- "attribute vec4 skinIndex;",
|
|
|
|
- "attribute vec4 skinWeight;",
|
|
|
|
-
|
|
|
|
- "#endif",
|
|
|
|
-
|
|
|
|
- ""
|
|
|
|
-
|
|
|
|
- ].join("\n");
|
|
|
|
-
|
|
|
|
- var prefix_fragment = [
|
|
|
|
-
|
|
|
|
- "precision " + renderer.precision + " float;",
|
|
|
|
-
|
|
|
|
- ( parameters.bumpMap || parameters.normalMap ) ? "#extension GL_OES_standard_derivatives : enable" : "",
|
|
|
|
-
|
|
|
|
- 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_SHADOWS " + parameters.maxShadows,
|
|
|
|
-
|
|
|
|
- parameters.alphaTest ? "#define ALPHATEST " + parameters.alphaTest: "",
|
|
|
|
-
|
|
|
|
- _this.gammaInput ? "#define GAMMA_INPUT" : "",
|
|
|
|
- _this.gammaOutput ? "#define GAMMA_OUTPUT" : "",
|
|
|
|
- _this.physicallyBasedShading ? "#define PHYSICALLY_BASED_SHADING" : "",
|
|
|
|
-
|
|
|
|
- ( 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.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" : "",
|
|
|
|
-
|
|
|
|
- "uniform mat4 viewMatrix;",
|
|
|
|
- "uniform vec3 cameraPosition;",
|
|
|
|
- ""
|
|
|
|
-
|
|
|
|
- ].join("\n");
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- program = renderer.compileShader(prefix_vertex + vertexShader, prefix_fragment + fragmentShader);
|
|
|
|
-
|
|
|
|
- //console.log( prefix_fragment + fragmentShader );
|
|
|
|
- //console.log( prefix_vertex + vertexShader );
|
|
|
|
-
|
|
|
|
- program.uniforms = {};
|
|
|
|
- program.attributes = {};
|
|
|
|
-
|
|
|
|
- var identifiers, u, a, i;
|
|
|
|
-
|
|
|
|
- // cache uniform locations
|
|
|
|
-
|
|
|
|
- identifiers = [
|
|
|
|
-
|
|
|
|
- 'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'modelMatrix', 'cameraPosition',
|
|
|
|
- 'morphTargetInfluences'
|
|
|
|
-
|
|
|
|
- ];
|
|
|
|
-
|
|
|
|
- if ( parameters.useVertexTexture ) {
|
|
|
|
-
|
|
|
|
- identifiers.push( 'boneTexture' );
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- identifiers.push( 'boneGlobalMatrices' );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for ( u in uniforms ) {
|
|
|
|
-
|
|
|
|
- identifiers.push( u );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- cacheUniformLocations( program, identifiers );
|
|
|
|
-
|
|
|
|
- // cache attributes locations
|
|
|
|
-
|
|
|
|
- identifiers = [
|
|
|
|
-
|
|
|
|
- "position", "normal", "uv", "uv2", "tangent", "color",
|
|
|
|
- "skinIndex", "skinWeight", "lineDistance"
|
|
|
|
-
|
|
|
|
- ];
|
|
|
|
-
|
|
|
|
- for ( i = 0; i < parameters.maxMorphTargets; i ++ ) {
|
|
|
|
-
|
|
|
|
- identifiers.push( "morphTarget" + i );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for ( i = 0; i < parameters.maxMorphNormals; i ++ ) {
|
|
|
|
-
|
|
|
|
- identifiers.push( "morphNormal" + i );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for ( a in attributes ) {
|
|
|
|
-
|
|
|
|
- identifiers.push( a );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- cacheAttributeLocations( program, identifiers );
|
|
|
|
-
|
|
|
|
- program.id = _programs_counter ++;
|
|
|
|
-
|
|
|
|
- _programs.push( { program: program, code: code, usedTimes: 1 } );
|
|
|
|
-
|
|
|
|
- _this.info.memory.programs = _programs.length;
|
|
|
|
-
|
|
|
|
- return program;
|
|
|
|
-
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- // Shader parameters cache
|
|
|
|
-
|
|
|
|
- function cacheUniformLocations ( program, identifiers ) {
|
|
|
|
-
|
|
|
|
- var i, l, id;
|
|
|
|
-
|
|
|
|
- for( i = 0, l = identifiers.length; i < l; i ++ ) {
|
|
|
|
-
|
|
|
|
- id = identifiers[ i ];
|
|
|
|
- program.uniforms[ id ] = renderer.getUniformLocation( program, id );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- function cacheAttributeLocations ( program, identifiers ) {
|
|
|
|
-
|
|
|
|
- var i, l, id;
|
|
|
|
-
|
|
|
|
- for( i = 0, l = identifiers.length; i < l; i ++ ) {
|
|
|
|
-
|
|
|
|
- id = identifiers[ i ];
|
|
|
|
- program.attributes[ id ] = renderer.getAttribLocation( program, id );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
// Allocations
|
|
// Allocations
|
|
|
|
|
|
function allocateBones ( object ) {
|
|
function allocateBones ( object ) {
|