|
@@ -36,11 +36,6 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
var transparentObjects = [];
|
|
var transparentObjects = [];
|
|
var transparentObjectsLastIndex = -1;
|
|
var transparentObjectsLastIndex = -1;
|
|
|
|
|
|
- var opaqueImmediateObjects = [];
|
|
|
|
- var opaqueImmediateObjectsLastIndex = -1;
|
|
|
|
- var transparentImmediateObjects = [];
|
|
|
|
- var transparentImmediateObjectsLastIndex = -1;
|
|
|
|
-
|
|
|
|
var morphInfluences = new Float32Array( 8 );
|
|
var morphInfluences = new Float32Array( 8 );
|
|
|
|
|
|
|
|
|
|
@@ -82,8 +77,6 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var _this = this,
|
|
var _this = this,
|
|
|
|
|
|
- _programs = [],
|
|
|
|
-
|
|
|
|
// internal state cache
|
|
// internal state cache
|
|
|
|
|
|
_currentProgram = null,
|
|
_currentProgram = null,
|
|
@@ -131,7 +124,6 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
_infoMemory = {
|
|
_infoMemory = {
|
|
|
|
|
|
- programs: 0,
|
|
|
|
geometries: 0,
|
|
geometries: 0,
|
|
textures: 0
|
|
textures: 0
|
|
|
|
|
|
@@ -150,10 +142,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
render: _infoRender,
|
|
render: _infoRender,
|
|
memory: _infoMemory,
|
|
memory: _infoMemory,
|
|
- programs: _programs
|
|
|
|
|
|
+ programs: null
|
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+
|
|
// initialize
|
|
// initialize
|
|
|
|
|
|
var _gl;
|
|
var _gl;
|
|
@@ -215,6 +208,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
var objects = new THREE.WebGLObjects( _gl, properties, this.info );
|
|
var objects = new THREE.WebGLObjects( _gl, properties, this.info );
|
|
var programCache = new THREE.WebGLPrograms( this, capabilities );
|
|
var programCache = new THREE.WebGLPrograms( this, capabilities );
|
|
|
|
|
|
|
|
+ this.info.programs = programCache.programs;
|
|
|
|
+
|
|
var bufferRenderer = new THREE.WebGLBufferRenderer( _gl, extensions, _infoRender );
|
|
var bufferRenderer = new THREE.WebGLBufferRenderer( _gl, extensions, _infoRender );
|
|
var indexedBufferRenderer = new THREE.WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );
|
|
var indexedBufferRenderer = new THREE.WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );
|
|
|
|
|
|
@@ -589,41 +584,13 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
function releaseMaterialProgramReference( material ) {
|
|
function releaseMaterialProgramReference( material ) {
|
|
|
|
|
|
- var program = properties.get( material ).program.program;
|
|
|
|
-
|
|
|
|
- if ( program === undefined ) return;
|
|
|
|
|
|
+ var programInfo = properties.get( material ).program;
|
|
|
|
|
|
material.program = undefined;
|
|
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 );
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
@@ -831,7 +798,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- if ( group === undefined ) {
|
|
|
|
|
|
+ if ( group === null ) {
|
|
|
|
|
|
var count;
|
|
var count;
|
|
|
|
|
|
@@ -1129,9 +1096,6 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
opaqueObjectsLastIndex = -1;
|
|
opaqueObjectsLastIndex = -1;
|
|
transparentObjectsLastIndex = -1;
|
|
transparentObjectsLastIndex = -1;
|
|
|
|
|
|
- opaqueImmediateObjectsLastIndex = -1;
|
|
|
|
- transparentImmediateObjectsLastIndex = -1;
|
|
|
|
-
|
|
|
|
sprites.length = 0;
|
|
sprites.length = 0;
|
|
lensFlares.length = 0;
|
|
lensFlares.length = 0;
|
|
|
|
|
|
@@ -1140,9 +1104,6 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
opaqueObjects.length = opaqueObjectsLastIndex + 1;
|
|
opaqueObjects.length = opaqueObjectsLastIndex + 1;
|
|
transparentObjects.length = transparentObjectsLastIndex + 1;
|
|
transparentObjects.length = transparentObjectsLastIndex + 1;
|
|
|
|
|
|
- opaqueImmediateObjects.length = opaqueImmediateObjectsLastIndex + 1;
|
|
|
|
- transparentImmediateObjects.length = transparentImmediateObjectsLastIndex + 1;
|
|
|
|
-
|
|
|
|
if ( _this.sortObjects === true ) {
|
|
if ( _this.sortObjects === true ) {
|
|
|
|
|
|
opaqueObjects.sort( painterSortStable );
|
|
opaqueObjects.sort( painterSortStable );
|
|
@@ -1178,22 +1139,16 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
renderObjects( opaqueObjects, camera, lights, fog, overrideMaterial );
|
|
renderObjects( opaqueObjects, camera, lights, fog, overrideMaterial );
|
|
renderObjects( transparentObjects, camera, lights, fog, overrideMaterial );
|
|
renderObjects( transparentObjects, camera, lights, fog, overrideMaterial );
|
|
|
|
|
|
- renderObjectsImmediate( opaqueImmediateObjects, camera, lights, fog, overrideMaterial );
|
|
|
|
- renderObjectsImmediate( transparentImmediateObjects, camera, lights, fog, overrideMaterial );
|
|
|
|
-
|
|
|
|
} else {
|
|
} else {
|
|
|
|
|
|
// opaque pass (front-to-back order)
|
|
// opaque pass (front-to-back order)
|
|
|
|
|
|
state.setBlending( THREE.NoBlending );
|
|
state.setBlending( THREE.NoBlending );
|
|
-
|
|
|
|
renderObjects( opaqueObjects, camera, lights, fog );
|
|
renderObjects( opaqueObjects, camera, lights, fog );
|
|
- renderObjectsImmediate( opaqueImmediateObjects, camera, lights, fog );
|
|
|
|
|
|
|
|
// transparent pass (back-to-front order)
|
|
// transparent pass (back-to-front order)
|
|
|
|
|
|
renderObjects( transparentObjects, camera, lights, fog );
|
|
renderObjects( transparentObjects, camera, lights, fog );
|
|
- renderObjectsImmediate( transparentImmediateObjects, camera, lights, fog );
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1220,40 +1175,6 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
- function pushImmediateRenderItem( object ) {
|
|
|
|
-
|
|
|
|
- var array, index;
|
|
|
|
-
|
|
|
|
- // allocate the next position in the appropriate array
|
|
|
|
-
|
|
|
|
- if ( object.material.transparent ) {
|
|
|
|
-
|
|
|
|
- array = transparentImmediateObjects;
|
|
|
|
- index = ++ transparentImmediateObjectsLastIndex;
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- array = opaqueImmediateObjects;
|
|
|
|
- index = ++ opaqueImmediateObjectsLastIndex;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // recycle existing position or grow the array
|
|
|
|
-
|
|
|
|
- if ( index < array.length ) {
|
|
|
|
-
|
|
|
|
- array[ index ] = object;
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- // assert( index === array.length );
|
|
|
|
- array.push( object );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
function pushRenderItem( object, geometry, material, z, group ) {
|
|
function pushRenderItem( object, geometry, material, z, group ) {
|
|
|
|
|
|
var array, index;
|
|
var array, index;
|
|
@@ -1321,7 +1242,14 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
} else if ( object instanceof THREE.ImmediateRenderObject ) {
|
|
} else if ( object instanceof THREE.ImmediateRenderObject ) {
|
|
|
|
|
|
- pushImmediateRenderItem( object );
|
|
|
|
|
|
+ if ( _this.sortObjects === true ) {
|
|
|
|
+
|
|
|
|
+ _vector3.setFromMatrixPosition( object.matrixWorld );
|
|
|
|
+ _vector3.applyProjection( _projScreenMatrix );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ pushRenderItem( object, null, object.material, _vector3.z, null );
|
|
|
|
|
|
} else if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.Points ) {
|
|
} else if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.Points ) {
|
|
|
|
|
|
@@ -1366,7 +1294,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
} else {
|
|
} else {
|
|
|
|
|
|
- pushRenderItem( object, geometry, material, _vector3.z );
|
|
|
|
|
|
+ pushRenderItem( object, geometry, material, _vector3.z, null );
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1400,36 +1328,25 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
|
|
object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
|
|
object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
|
|
object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
|
|
|
|
|
|
- _this.renderBufferDirect( camera, lights, fog, geometry, material, object, group );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- function renderObjectsImmediate( renderList, camera, lights, fog, overrideMaterial ) {
|
|
|
|
-
|
|
|
|
- var material = overrideMaterial;
|
|
|
|
|
|
+ if ( object instanceof THREE.ImmediateRenderObject ) {
|
|
|
|
|
|
- for ( var i = 0, l = renderList.length; i < l; i ++ ) {
|
|
|
|
|
|
+ setMaterial( material );
|
|
|
|
|
|
- var object = renderList[ i ];
|
|
|
|
|
|
+ var program = setProgram( camera, lights, fog, material, object );
|
|
|
|
|
|
- object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
|
|
|
|
- object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
|
|
|
|
|
|
+ _currentGeometryProgram = '';
|
|
|
|
|
|
- if ( overrideMaterial === undefined ) material = object.material;
|
|
|
|
|
|
+ object.render( function ( object ) {
|
|
|
|
|
|
- setMaterial( material );
|
|
|
|
|
|
+ _this.renderBufferImmediate( object, program, material );
|
|
|
|
|
|
- var program = setProgram( camera, lights, fog, material, object );
|
|
|
|
|
|
+ } );
|
|
|
|
|
|
- _currentGeometryProgram = '';
|
|
|
|
-
|
|
|
|
- object.render( function ( object ) {
|
|
|
|
|
|
+ } else {
|
|
|
|
|
|
- _this.renderBufferImmediate( object, program, material );
|
|
|
|
|
|
+ _this.renderBufferDirect( camera, lights, fog, geometry, material, object, group );
|
|
|
|
|
|
- } );
|
|
|
|
|
|
+ }
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1442,15 +1359,15 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
var parameters = programCache.getParameters( material, lights, fog, object );
|
|
var parameters = programCache.getParameters( material, lights, fog, object );
|
|
var code = programCache.getProgramCode( material, parameters );
|
|
var code = programCache.getProgramCode( material, parameters );
|
|
|
|
|
|
-
|
|
|
|
|
|
+ var program = materialProperties.program;
|
|
var programChange = true;
|
|
var programChange = true;
|
|
|
|
|
|
- if ( ! materialProperties.program ) {
|
|
|
|
|
|
+ if ( program === undefined ) {
|
|
|
|
|
|
// new material
|
|
// new material
|
|
material.addEventListener( 'dispose', onMaterialDispose );
|
|
material.addEventListener( 'dispose', onMaterialDispose );
|
|
|
|
|
|
- } else if ( materialProperties.program.code !== code ) {
|
|
|
|
|
|
+ } else if ( program.code !== code ) {
|
|
|
|
|
|
// changed glsl or parameters
|
|
// changed glsl or parameters
|
|
releaseMaterialProgramReference( material );
|
|
releaseMaterialProgramReference( material );
|
|
@@ -1467,41 +1384,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();
|
|
var attributes = program.getAttributes();
|
|
|
|
|
|
if ( material.morphTargets ) {
|
|
if ( material.morphTargets ) {
|