|
@@ -82,8 +82,6 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var _this = this,
|
|
|
|
|
|
- _programs = [],
|
|
|
-
|
|
|
// internal state cache
|
|
|
|
|
|
_currentProgram = null,
|
|
@@ -131,9 +129,9 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
_infoMemory = {
|
|
|
|
|
|
- programs: 0,
|
|
|
geometries: 0,
|
|
|
- textures: 0
|
|
|
+ textures: 0,
|
|
|
+ programs: 0
|
|
|
|
|
|
},
|
|
|
|
|
@@ -150,10 +148,18 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
render: _infoRender,
|
|
|
memory: _infoMemory,
|
|
|
- programs: _programs
|
|
|
+ programs: null
|
|
|
|
|
|
};
|
|
|
|
|
|
+ Object.defineProperty( _infoMemory, 'programs', { get: function() {
|
|
|
+
|
|
|
+ var programs = _this.info.programs;
|
|
|
+ return programs !== null ? programs.length : 0;
|
|
|
+
|
|
|
+ } } );
|
|
|
+
|
|
|
+
|
|
|
// initialize
|
|
|
|
|
|
var _gl;
|
|
@@ -215,6 +221,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
var objects = new THREE.WebGLObjects( _gl, properties, this.info );
|
|
|
var programCache = new THREE.WebGLPrograms( this, capabilities );
|
|
|
|
|
|
+ this.info.programs = programCache.programs;
|
|
|
+
|
|
|
var bufferRenderer = new THREE.WebGLBufferRenderer( _gl, extensions, _infoRender );
|
|
|
var indexedBufferRenderer = new THREE.WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );
|
|
|
|
|
@@ -589,41 +597,13 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
function releaseMaterialProgramReference( material ) {
|
|
|
|
|
|
- var program = properties.get( material ).program.program;
|
|
|
-
|
|
|
- if ( program === undefined ) return;
|
|
|
+ var programInfo = properties.get( material ).program;
|
|
|
|
|
|
material.program = undefined;
|
|
|
|
|
|
- for ( var i = 0, n = _programs.length; i !== n; ++ i ) {
|
|
|
-
|
|
|
- var programInfo = _programs[ i ];
|
|
|
-
|
|
|
- if ( programInfo.program === program ) {
|
|
|
-
|
|
|
- var newReferenceCount = -- programInfo.usedTimes;
|
|
|
-
|
|
|
- if ( newReferenceCount === 0 ) {
|
|
|
-
|
|
|
- // the last material that has been using the program let
|
|
|
- // go of it, so remove it from the (unordered) _programs
|
|
|
- // set and deallocate the GL resource
|
|
|
-
|
|
|
- var newLength = n - 1;
|
|
|
-
|
|
|
- _programs[ i ] = _programs[ newLength ];
|
|
|
- _programs.pop();
|
|
|
-
|
|
|
- _gl.deleteProgram( program );
|
|
|
-
|
|
|
- _infoMemory.programs = newLength;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
-
|
|
|
- }
|
|
|
+ if ( programInfo !== undefined ) {
|
|
|
|
|
|
+ programCache.releaseProgram( programInfo );
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -1442,15 +1422,15 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
var parameters = programCache.getParameters( material, lights, fog, object );
|
|
|
var code = programCache.getProgramCode( material, parameters );
|
|
|
|
|
|
-
|
|
|
+ var program = materialProperties.program;
|
|
|
var programChange = true;
|
|
|
|
|
|
- if ( ! materialProperties.program ) {
|
|
|
+ if ( program === undefined ) {
|
|
|
|
|
|
// new material
|
|
|
material.addEventListener( 'dispose', onMaterialDispose );
|
|
|
|
|
|
- } else if ( materialProperties.program.code !== code ) {
|
|
|
+ } else if ( program.code !== code ) {
|
|
|
|
|
|
// changed glsl or parameters
|
|
|
releaseMaterialProgramReference( material );
|
|
@@ -1467,41 +1447,39 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( parameters.shaderID ) {
|
|
|
+ if ( programChange ) {
|
|
|
|
|
|
- var shader = THREE.ShaderLib[ parameters.shaderID ];
|
|
|
+ if ( parameters.shaderID ) {
|
|
|
|
|
|
- materialProperties.__webglShader = {
|
|
|
- name: material.type,
|
|
|
- uniforms: THREE.UniformsUtils.clone( shader.uniforms ),
|
|
|
- vertexShader: shader.vertexShader,
|
|
|
- fragmentShader: shader.fragmentShader
|
|
|
- };
|
|
|
+ var shader = THREE.ShaderLib[ parameters.shaderID ];
|
|
|
|
|
|
- } else {
|
|
|
+ materialProperties.__webglShader = {
|
|
|
+ name: material.type,
|
|
|
+ uniforms: THREE.UniformsUtils.clone( shader.uniforms ),
|
|
|
+ vertexShader: shader.vertexShader,
|
|
|
+ fragmentShader: shader.fragmentShader
|
|
|
+ };
|
|
|
|
|
|
- materialProperties.__webglShader = {
|
|
|
- name: material.type,
|
|
|
- uniforms: material.uniforms,
|
|
|
- vertexShader: material.vertexShader,
|
|
|
- fragmentShader: material.fragmentShader
|
|
|
- };
|
|
|
+ } else {
|
|
|
|
|
|
- }
|
|
|
+ materialProperties.__webglShader = {
|
|
|
+ name: material.type,
|
|
|
+ uniforms: material.uniforms,
|
|
|
+ vertexShader: material.vertexShader,
|
|
|
+ fragmentShader: material.fragmentShader
|
|
|
+ };
|
|
|
|
|
|
- material.__webglShader = materialProperties.__webglShader;
|
|
|
+ }
|
|
|
|
|
|
- var program = programCache.getProgram( material, parameters, code );
|
|
|
+ material.__webglShader = materialProperties.__webglShader;
|
|
|
|
|
|
- if ( programChange ) {
|
|
|
+ program = programCache.acquireProgram( material, parameters, code );
|
|
|
|
|
|
- program.usedTimes ++;
|
|
|
+ materialProperties.program = program;
|
|
|
+ material.program = program;
|
|
|
|
|
|
}
|
|
|
|
|
|
- materialProperties.program = program;
|
|
|
- material.program = program;
|
|
|
-
|
|
|
var attributes = program.getAttributes();
|
|
|
|
|
|
if ( material.morphTargets ) {
|