|
@@ -32,9 +32,9 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
var lights = [];
|
|
|
|
|
|
var opaqueObjects = [];
|
|
|
- var opaqueObjectsLastIndex = -1;
|
|
|
+ var opaqueObjectsLastIndex = - 1;
|
|
|
var transparentObjects = [];
|
|
|
- var transparentObjectsLastIndex = -1;
|
|
|
+ var transparentObjectsLastIndex = - 1;
|
|
|
|
|
|
var morphInfluences = new Float32Array( 8 );
|
|
|
|
|
@@ -558,10 +558,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
function deallocateRenderTarget( renderTarget ) {
|
|
|
|
|
|
var renderTargetProperties = properties.get( renderTarget );
|
|
|
+ var textureProperties = properties.get( renderTarget.texture );
|
|
|
|
|
|
- if ( ! renderTarget || renderTargetProperties.__webglTexture === undefined ) return;
|
|
|
+ if ( ! renderTarget || textureProperties.__webglTexture === undefined ) return;
|
|
|
|
|
|
- _gl.deleteTexture( renderTargetProperties.__webglTexture );
|
|
|
+ _gl.deleteTexture( textureProperties.__webglTexture );
|
|
|
|
|
|
if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {
|
|
|
|
|
@@ -579,6 +580,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ properties.delete( renderTarget.texture );
|
|
|
properties.delete( renderTarget );
|
|
|
|
|
|
}
|
|
@@ -601,6 +603,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
if ( programInfo !== undefined ) {
|
|
|
|
|
|
programCache.releaseProgram( programInfo );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -1091,8 +1094,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
lights.length = 0;
|
|
|
|
|
|
- opaqueObjectsLastIndex = -1;
|
|
|
- transparentObjectsLastIndex = -1;
|
|
|
+ opaqueObjectsLastIndex = - 1;
|
|
|
+ transparentObjectsLastIndex = - 1;
|
|
|
|
|
|
sprites.length = 0;
|
|
|
lensFlares.length = 0;
|
|
@@ -1157,9 +1160,15 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
// Generate mipmap if we're using any kind of mipmap filtering
|
|
|
|
|
|
- if ( renderTarget && renderTarget.generateMipmaps && renderTarget.minFilter !== THREE.NearestFilter && renderTarget.minFilter !== THREE.LinearFilter ) {
|
|
|
+ if ( renderTarget ) {
|
|
|
+
|
|
|
+ var texture = renderTarget.texture;
|
|
|
+ var isTargetPowerOfTwo = THREE.Math.isPowerOfTwo( renderTarget.width ) && THREE.Math.isPowerOfTwo( renderTarget.height );
|
|
|
+ if ( texture.generateMipmaps && isTargetPowerOfTwo && texture.minFilter !== THREE.NearestFilter && texture.minFilter !== THREE.LinearFilter ) {
|
|
|
|
|
|
- updateRenderTargetMipmap( renderTarget );
|
|
|
+ updateRenderTargetMipmap( renderTarget );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -1328,17 +1337,17 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( object instanceof THREE.ImmediateRenderObject ) {
|
|
|
|
|
|
- setMaterial( material );
|
|
|
+ setMaterial( material );
|
|
|
|
|
|
- var program = setProgram( camera, lights, fog, material, object );
|
|
|
+ var program = setProgram( camera, lights, fog, material, object );
|
|
|
|
|
|
- _currentGeometryProgram = '';
|
|
|
+ _currentGeometryProgram = '';
|
|
|
|
|
|
- object.render( function ( object ) {
|
|
|
+ object.render( function ( object ) {
|
|
|
|
|
|
- _this.renderBufferImmediate( object, program, material );
|
|
|
+ _this.renderBufferImmediate( object, program, material );
|
|
|
|
|
|
- } );
|
|
|
+ } );
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -1800,6 +1809,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( uvScaleMap !== undefined ) {
|
|
|
|
|
|
+ if ( uvScaleMap instanceof THREE.WebGLRenderTarget ) uvScaleMap = uvScaleMap.texture;
|
|
|
var offset = uvScaleMap.offset;
|
|
|
var repeat = uvScaleMap.repeat;
|
|
|
|
|
@@ -2314,7 +2324,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
} else if ( texture instanceof THREE.WebGLRenderTargetCube ) {
|
|
|
|
|
|
- setCubeTextureDynamic( texture, textureUnit );
|
|
|
+ setCubeTextureDynamic( texture.texture, textureUnit );
|
|
|
+
|
|
|
+ } else if ( texture instanceof THREE.WebGLRenderTarget ) {
|
|
|
+
|
|
|
+ _this.setTexture( texture.texture, textureUnit );
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -2356,9 +2370,13 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
setCubeTexture( texture, textureUnit );
|
|
|
|
|
|
+ } else if ( texture instanceof THREE.WebGLRenderTarget ) {
|
|
|
+
|
|
|
+ _this.setTexture( texture.texture, textureUnit );
|
|
|
+
|
|
|
} else if ( texture instanceof THREE.WebGLRenderTargetCube ) {
|
|
|
|
|
|
- setCubeTextureDynamic( texture, textureUnit );
|
|
|
+ setCubeTextureDynamic( texture.texture, textureUnit );
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -2975,7 +2993,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) {
|
|
|
|
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
|
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, properties.get( renderTarget ).__webglTexture, 0 );
|
|
|
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -3015,30 +3033,31 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {
|
|
|
|
|
|
var renderTargetProperties = properties.get( renderTarget );
|
|
|
+ var textureProperties = properties.get( renderTarget.texture );
|
|
|
|
|
|
if ( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true;
|
|
|
if ( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true;
|
|
|
|
|
|
renderTarget.addEventListener( 'dispose', onRenderTargetDispose );
|
|
|
|
|
|
- renderTargetProperties.__webglTexture = _gl.createTexture();
|
|
|
+ textureProperties.__webglTexture = _gl.createTexture();
|
|
|
|
|
|
_infoMemory.textures ++;
|
|
|
|
|
|
// Setup texture, create render and frame buffers
|
|
|
|
|
|
var isTargetPowerOfTwo = THREE.Math.isPowerOfTwo( renderTarget.width ) && THREE.Math.isPowerOfTwo( renderTarget.height ),
|
|
|
- glFormat = paramThreeToGL( renderTarget.format ),
|
|
|
- glType = paramThreeToGL( renderTarget.type );
|
|
|
+ glFormat = paramThreeToGL( renderTarget.texture.format ),
|
|
|
+ glType = paramThreeToGL( renderTarget.texture.type );
|
|
|
|
|
|
if ( isCube ) {
|
|
|
|
|
|
renderTargetProperties.__webglFramebuffer = [];
|
|
|
renderTargetProperties.__webglRenderbuffer = [];
|
|
|
|
|
|
- state.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTargetProperties.__webglTexture );
|
|
|
+ state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );
|
|
|
|
|
|
- setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget, isTargetPowerOfTwo );
|
|
|
+ setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );
|
|
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
|
@@ -3051,7 +3070,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( renderTarget.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
|
|
|
+ if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -3067,8 +3086,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- state.bindTexture( _gl.TEXTURE_2D, renderTargetProperties.__webglTexture );
|
|
|
- setTextureParameters( _gl.TEXTURE_2D, renderTarget, isTargetPowerOfTwo );
|
|
|
+ state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
|
|
|
+ setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );
|
|
|
|
|
|
state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
|
|
|
|
|
@@ -3092,7 +3111,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( renderTarget.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );
|
|
|
+ if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -3158,8 +3177,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( isCube ) {
|
|
|
|
|
|
- var renderTargetProperties = properties.get( renderTarget );
|
|
|
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, renderTargetProperties.__webglTexture, 0 );
|
|
|
+ var textureProperties = properties.get( renderTarget.texture );
|
|
|
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, 0 );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -3189,14 +3208,14 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( renderTarget.format !== THREE.RGBAFormat && paramThreeToGL( renderTarget.format ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
|
|
|
+ if ( renderTarget.texture.format !== THREE.RGBAFormat && paramThreeToGL( renderTarget.texture.format ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
|
|
|
|
|
|
console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( renderTarget.type !== THREE.UnsignedByteType && paramThreeToGL( renderTarget.type ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) ) {
|
|
|
+ if ( renderTarget.texture.type !== THREE.UnsignedByteType && paramThreeToGL( renderTarget.texture.type ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) ) {
|
|
|
|
|
|
console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );
|
|
|
return;
|
|
@@ -3205,7 +3224,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {
|
|
|
|
|
|
- _gl.readPixels( x, y, width, height, paramThreeToGL( renderTarget.format ), paramThreeToGL( renderTarget.type ), buffer );
|
|
|
+ _gl.readPixels( x, y, width, height, paramThreeToGL( renderTarget.texture.format ), paramThreeToGL( renderTarget.texture.type ), buffer );
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -3226,7 +3245,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
function updateRenderTargetMipmap( renderTarget ) {
|
|
|
|
|
|
var target = renderTarget instanceof THREE.WebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;
|
|
|
- var texture = properties.get( renderTarget ).__webglTexture;
|
|
|
+ var texture = properties.get( renderTarget.texture ).__webglTexture;
|
|
|
|
|
|
state.bindTexture( target, texture );
|
|
|
_gl.generateMipmap( target );
|