提交 08ce26f2 编写于 作者: M Mr.doob

WebGLUniforms: Remove WebGLRenderer dependency.

上级 de338cfb
...@@ -145,10 +145,6 @@ function WebGLRenderer( parameters ) { ...@@ -145,10 +145,6 @@ function WebGLRenderer( parameters ) {
// //
_usedTextureUnits = 0,
//
_width = _canvas.width, _width = _canvas.width,
_height = _canvas.height, _height = _canvas.height,
...@@ -1635,7 +1631,7 @@ function WebGLRenderer( parameters ) { ...@@ -1635,7 +1631,7 @@ function WebGLRenderer( parameters ) {
function setProgram( camera, fog, material, object ) { function setProgram( camera, fog, material, object ) {
_usedTextureUnits = 0; textures.resetTextureUnits();
var materialProperties = properties.get( material ); var materialProperties = properties.get( material );
var lights = currentRenderState.state.lights; var lights = currentRenderState.state.lights;
...@@ -1822,7 +1818,7 @@ function WebGLRenderer( parameters ) { ...@@ -1822,7 +1818,7 @@ function WebGLRenderer( parameters ) {
} }
p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture ); p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );
p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize ); p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );
} else { } else {
...@@ -1952,13 +1948,13 @@ function WebGLRenderer( parameters ) { ...@@ -1952,13 +1948,13 @@ function WebGLRenderer( parameters ) {
if ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1; if ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1;
if ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2; if ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2;
WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this, textures ); WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );
} }
if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) { if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {
WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this, textures ); WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );
material.uniformsNeedUpdate = false; material.uniformsNeedUpdate = false;
} }
...@@ -2421,114 +2417,6 @@ function WebGLRenderer( parameters ) { ...@@ -2421,114 +2417,6 @@ function WebGLRenderer( parameters ) {
} }
// Textures
function allocTextureUnit() {
var textureUnit = _usedTextureUnits;
if ( textureUnit >= capabilities.maxTextures ) {
console.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );
}
_usedTextureUnits += 1;
return textureUnit;
}
this.allocTextureUnit = allocTextureUnit;
// this.setTexture2D = setTexture2D;
this.setTexture2D = ( function () {
var warned = false;
// backwards compatibility: peel texture.texture
return function setTexture2D( texture, slot ) {
if ( texture && texture.isWebGLRenderTarget ) {
if ( ! warned ) {
console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." );
warned = true;
}
texture = texture.texture;
}
textures.setTexture2D( texture, slot );
};
}() );
this.setTexture = ( function () {
var warned = false;
return function setTexture( texture, slot ) {
if ( ! warned ) {
console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." );
warned = true;
}
textures.setTexture2D( texture, slot );
};
}() );
this.setTextureCube = ( function () {
var warned = false;
return function setTextureCube( texture, slot ) {
// backwards compatibility: peel texture.texture
if ( texture && texture.isWebGLRenderTargetCube ) {
if ( ! warned ) {
console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." );
warned = true;
}
texture = texture.texture;
}
// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture
// TODO: unify these code paths
if ( ( texture && texture.isCubeTexture ) ||
( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {
// CompressedTexture can have Array in image :/
// this function alone should take care of cube textures
textures.setTextureCube( texture, slot );
} else {
// assumed: texture property of THREE.WebGLRenderTargetCube
textures.setTextureCubeDynamic( texture, slot );
}
};
}() );
// //
this.setFramebuffer = function ( value ) { this.setFramebuffer = function ( value ) {
......
...@@ -670,7 +670,7 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters, ...@@ -670,7 +670,7 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters,
if ( cachedUniforms === undefined ) { if ( cachedUniforms === undefined ) {
cachedUniforms = new WebGLUniforms( gl, program, renderer, textures ); cachedUniforms = new WebGLUniforms( gl, program, textures );
} }
......
...@@ -265,7 +265,31 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, ...@@ -265,7 +265,31 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
// //
var textureUnits = 0;
function resetTextureUnits() {
textureUnits = 0;
}
function allocateTextureUnit() {
var textureUnit = textureUnits;
if ( textureUnit >= capabilities.maxTextures ) {
console.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );
}
textureUnits += 1;
return textureUnit;
}
//
function setTexture2D( texture, slot ) { function setTexture2D( texture, slot ) {
...@@ -1077,6 +1101,69 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, ...@@ -1077,6 +1101,69 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
} }
// backwards compatibility
var warnedTexture2D = false;
var warnedTextureCube = false;
function safeSetTexture2D( texture, slot ) {
if ( texture && texture.isWebGLRenderTarget ) {
if ( warnedTexture2D === false ) {
console.warn( "THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead." );
warnedTexture2D = true;
}
texture = texture.texture;
}
setTexture2D( texture, slot );
}
function safeSetTextureCube( texture, slot ) {
if ( texture && texture.isWebGLRenderTargetCube ) {
if ( warnedTextureCube === false ) {
console.warn( "THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead." );
warnedTextureCube = true;
}
texture = texture.texture;
}
// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture
// TODO: unify these code paths
if ( ( texture && texture.isCubeTexture ) ||
( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {
// CompressedTexture can have Array in image :/
// this function alone should take care of cube textures
setTextureCube( texture, slot );
} else {
// assumed: texture property of THREE.WebGLRenderTargetCube
setTextureCubeDynamic( texture, slot );
}
}
//
this.allocateTextureUnit = allocateTextureUnit;
this.resetTextureUnits = resetTextureUnits;
this.setTexture2D = setTexture2D; this.setTexture2D = setTexture2D;
this.setTexture2DArray = setTexture2DArray; this.setTexture2DArray = setTexture2DArray;
this.setTexture3D = setTexture3D; this.setTexture3D = setTexture3D;
...@@ -1086,7 +1173,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, ...@@ -1086,7 +1173,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
this.updateRenderTargetMipmap = updateRenderTargetMipmap; this.updateRenderTargetMipmap = updateRenderTargetMipmap;
this.updateMultisampleRenderTarget = updateMultisampleRenderTarget; this.updateMultisampleRenderTarget = updateMultisampleRenderTarget;
} this.safeSetTexture2D = safeSetTexture2D;
this.safeSetTextureCube = safeSetTextureCube;
}
export { WebGLTextures }; export { WebGLTextures };
import { WebGLProgram } from './WebGLProgram'; import { WebGLProgram } from './WebGLProgram';
import { WebGLRenderer } from './../WebGLRenderer';
import { WebGLTextures } from './WebGLTextures'; import { WebGLTextures } from './WebGLTextures';
export class WebGLUniforms { export class WebGLUniforms {
constructor(gl: any, program: WebGLProgram, renderer: WebGLRenderer, textures: WebGLTextures); constructor(gl: any, program: WebGLProgram);
renderer: WebGLRenderer; setValue(gl: any, name: string, value: any, textures: WebGLTextures): void;
setValue(gl: any, name: string, value: any): void;
set(gl: any, object: any, name: string): void;
setOptional(gl: any, object: any, name: string): void; setOptional(gl: any, object: any, name: string): void;
static upload(gl: any, seq: any, values: any[], renderer: WebGLRenderer, textures: WebGLTextures): void; static upload(gl: any, seq: any, values: any[], textures: WebGLTextures): void;
static seqWithValue(seq: any, values: any[]): any[]; static seqWithValue(seq: any, values: any[]): any[];
static splitDynamic(seq: any, values: any[]): any[]; static splitDynamic(seq: any, values: any[]): any[];
static evalDynamic(seq: any, values: any[], object: any, camera: any): any[]; static evalDynamic(seq: any, values: any[], object: any, camera: any): any[];
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* Uniforms of a program. * Uniforms of a program.
* Those form a tree structure with a special top-level container for the root, * Those form a tree structure with a special top-level container for the root,
* which you get by calling 'new WebGLUniforms( gl, program, renderer )'. * which you get by calling 'new WebGLUniforms( gl, program )'.
* *
* *
* Properties of inner nodes including the top-level container: * Properties of inner nodes including the top-level container:
...@@ -16,15 +16,15 @@ ...@@ -16,15 +16,15 @@
* *
* Methods of all nodes except the top-level container: * Methods of all nodes except the top-level container:
* *
* .setValue( gl, value, [renderer] ) * .setValue( gl, value, [textures] )
* *
* uploads a uniform value(s) * uploads a uniform value(s)
* the 'renderer' parameter is needed for sampler uniforms * the 'textures' parameter is needed for sampler uniforms
* *
* *
* Static methods of the top-level container (renderer factorizations): * Static methods of the top-level container (textures factorizations):
* *
* .upload( gl, seq, values, renderer ) * .upload( gl, seq, values, textures )
* *
* sets uniforms in 'seq' to 'values[id].value' * sets uniforms in 'seq' to 'values[id].value'
* *
...@@ -33,16 +33,12 @@ ...@@ -33,16 +33,12 @@
* filters 'seq' entries with corresponding entry in values * filters 'seq' entries with corresponding entry in values
* *
* *
* Methods of the top-level container (renderer factorizations): * Methods of the top-level container (textures factorizations):
* *
* .setValue( gl, name, value ) * .setValue( gl, name, value, textures )
* *
* sets uniform with name 'name' to 'value' * sets uniform with name 'name' to 'value'
* *
* .set( gl, obj, prop )
*
* sets uniform from object and property with same name than uniform
*
* .setOptional( gl, obj, prop ) * .setOptional( gl, obj, prop )
* *
* like .set for an optional property of the object * like .set for an optional property of the object
...@@ -59,15 +55,6 @@ var emptyTexture2dArray = new DataTexture2DArray(); ...@@ -59,15 +55,6 @@ var emptyTexture2dArray = new DataTexture2DArray();
var emptyTexture3d = new DataTexture3D(); var emptyTexture3d = new DataTexture3D();
var emptyCubeTexture = new CubeTexture(); var emptyCubeTexture = new CubeTexture();
// --- Base for inner nodes (including the root) ---
function UniformContainer() {
this.seq = [];
this.map = {};
}
// --- Utilities --- // --- Utilities ---
// Array Caches (provide typed arrays for temporary by size) // Array Caches (provide typed arrays for temporary by size)
...@@ -144,7 +131,7 @@ function copyArray( a, b ) { ...@@ -144,7 +131,7 @@ function copyArray( a, b ) {
// Texture unit allocation // Texture unit allocation
function allocTexUnits( renderer, n ) { function allocTexUnits( textures, n ) {
var r = arrayCacheI32[ n ]; var r = arrayCacheI32[ n ];
...@@ -156,7 +143,7 @@ function allocTexUnits( renderer, n ) { ...@@ -156,7 +143,7 @@ function allocTexUnits( renderer, n ) {
} }
for ( var i = 0; i !== n; ++ i ) for ( var i = 0; i !== n; ++ i )
r[ i ] = renderer.allocTextureUnit(); r[ i ] = textures.allocateTextureUnit();
return r; return r;
...@@ -376,10 +363,10 @@ function setValue4fm( gl, v ) { ...@@ -376,10 +363,10 @@ function setValue4fm( gl, v ) {
// Single texture (2D / Cube) // Single texture (2D / Cube)
function setValueT1( gl, v, renderer ) { function setValueT1( gl, v, textures ) {
var cache = this.cache; var cache = this.cache;
var unit = renderer.allocTextureUnit(); var unit = textures.allocateTextureUnit();
if ( cache[ 0 ] !== unit ) { if ( cache[ 0 ] !== unit ) {
...@@ -388,14 +375,14 @@ function setValueT1( gl, v, renderer ) { ...@@ -388,14 +375,14 @@ function setValueT1( gl, v, renderer ) {
} }
renderer.setTexture2D( v || emptyTexture, unit ); textures.safeSetTexture2D( v || emptyTexture, unit );
} }
function setValueT2DArray1( gl, v, renderer, textures ) { function setValueT2DArray1( gl, v, textures ) {
var cache = this.cache; var cache = this.cache;
var unit = renderer.allocTextureUnit(); var unit = textures.allocateTextureUnit();
if ( cache[ 0 ] !== unit ) { if ( cache[ 0 ] !== unit ) {
...@@ -408,10 +395,10 @@ function setValueT2DArray1( gl, v, renderer, textures ) { ...@@ -408,10 +395,10 @@ function setValueT2DArray1( gl, v, renderer, textures ) {
} }
function setValueT3D1( gl, v, renderer, textures ) { function setValueT3D1( gl, v, textures ) {
var cache = this.cache; var cache = this.cache;
var unit = renderer.allocTextureUnit(); var unit = textures.allocateTextureUnit();
if ( cache[ 0 ] !== unit ) { if ( cache[ 0 ] !== unit ) {
...@@ -424,10 +411,10 @@ function setValueT3D1( gl, v, renderer, textures ) { ...@@ -424,10 +411,10 @@ function setValueT3D1( gl, v, renderer, textures ) {
} }
function setValueT6( gl, v, renderer ) { function setValueT6( gl, v, textures ) {
var cache = this.cache; var cache = this.cache;
var unit = renderer.allocTextureUnit(); var unit = textures.allocateTextureUnit();
if ( cache[ 0 ] !== unit ) { if ( cache[ 0 ] !== unit ) {
...@@ -436,7 +423,7 @@ function setValueT6( gl, v, renderer ) { ...@@ -436,7 +423,7 @@ function setValueT6( gl, v, renderer ) {
} }
renderer.setTextureCube( v || emptyCubeTexture, unit ); textures.safeSetTextureCube( v || emptyCubeTexture, unit );
} }
...@@ -616,12 +603,12 @@ function setValueM4a( gl, v ) { ...@@ -616,12 +603,12 @@ function setValueM4a( gl, v ) {
// Array of textures (2D / Cube) // Array of textures (2D / Cube)
function setValueT1a( gl, v, renderer ) { function setValueT1a( gl, v, textures ) {
var cache = this.cache; var cache = this.cache;
var n = v.length; var n = v.length;
var units = allocTexUnits( renderer, n ); var units = allocTexUnits( textures, n );
if ( arraysEqual( cache, units ) === false ) { if ( arraysEqual( cache, units ) === false ) {
...@@ -632,18 +619,18 @@ function setValueT1a( gl, v, renderer ) { ...@@ -632,18 +619,18 @@ function setValueT1a( gl, v, renderer ) {
for ( var i = 0; i !== n; ++ i ) { for ( var i = 0; i !== n; ++ i ) {
renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); textures.safeSetTexture2D( v[ i ] || emptyTexture, units[ i ] );
} }
} }
function setValueT6a( gl, v, renderer ) { function setValueT6a( gl, v, textures ) {
var cache = this.cache; var cache = this.cache;
var n = v.length; var n = v.length;
var units = allocTexUnits( renderer, n ); var units = allocTexUnits( textures, n );
if ( arraysEqual( cache, units ) === false ) { if ( arraysEqual( cache, units ) === false ) {
...@@ -654,7 +641,7 @@ function setValueT6a( gl, v, renderer ) { ...@@ -654,7 +641,7 @@ function setValueT6a( gl, v, renderer ) {
for ( var i = 0; i !== n; ++ i ) { for ( var i = 0; i !== n; ++ i ) {
renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); textures.safeSetTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );
} }
...@@ -730,18 +717,19 @@ function StructuredUniform( id ) { ...@@ -730,18 +717,19 @@ function StructuredUniform( id ) {
this.id = id; this.id = id;
UniformContainer.call( this ); // mix-in this.seq = [];
this.map = {};
} }
StructuredUniform.prototype.setValue = function ( gl, value, renderer ) { StructuredUniform.prototype.setValue = function ( gl, value, textures ) {
var seq = this.seq; var seq = this.seq;
for ( var i = 0, n = seq.length; i !== n; ++ i ) { for ( var i = 0, n = seq.length; i !== n; ++ i ) {
var u = seq[ i ]; var u = seq[ i ];
u.setValue( gl, value[ u.id ], renderer ); u.setValue( gl, value[ u.id ], textures );
} }
...@@ -821,12 +809,10 @@ function parseUniform( activeInfo, addr, container ) { ...@@ -821,12 +809,10 @@ function parseUniform( activeInfo, addr, container ) {
// Root Container // Root Container
function WebGLUniforms( gl, program, renderer, textures ) { function WebGLUniforms( gl, program ) {
UniformContainer.call( this ); this.seq = [];
this.map = {};
this.renderer = renderer;
this.textures = textures;
var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );
...@@ -841,11 +827,11 @@ function WebGLUniforms( gl, program, renderer, textures ) { ...@@ -841,11 +827,11 @@ function WebGLUniforms( gl, program, renderer, textures ) {
} }
WebGLUniforms.prototype.setValue = function ( gl, name, value ) { WebGLUniforms.prototype.setValue = function ( gl, name, value, textures ) {
var u = this.map[ name ]; var u = this.map[ name ];
if ( u !== undefined ) u.setValue( gl, value, this.renderer, this.textures ); if ( u !== undefined ) u.setValue( gl, value, textures );
}; };
...@@ -860,7 +846,7 @@ WebGLUniforms.prototype.setOptional = function ( gl, object, name ) { ...@@ -860,7 +846,7 @@ WebGLUniforms.prototype.setOptional = function ( gl, object, name ) {
// Static interface // Static interface
WebGLUniforms.upload = function ( gl, seq, values, renderer, textures ) { WebGLUniforms.upload = function ( gl, seq, values, textures ) {
for ( var i = 0, n = seq.length; i !== n; ++ i ) { for ( var i = 0, n = seq.length; i !== n; ++ i ) {
...@@ -870,7 +856,7 @@ WebGLUniforms.upload = function ( gl, seq, values, renderer, textures ) { ...@@ -870,7 +856,7 @@ WebGLUniforms.upload = function ( gl, seq, values, renderer, textures ) {
if ( v.needsUpdate !== false ) { if ( v.needsUpdate !== false ) {
// note: always updating when .needsUpdate is undefined // note: always updating when .needsUpdate is undefined
u.setValue( gl, v.value, renderer, textures ); u.setValue( gl, v.value, textures );
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册