Browse Source

Updated builds.

Mr.doob 3 years ago
parent
commit
66d8045cfe
4 changed files with 388 additions and 184 deletions
  1. 121 61
      build/three.cjs
  2. 121 61
      build/three.js
  3. 0 0
      build/three.min.js
  4. 146 62
      build/three.module.js

+ 121 - 61
build/three.cjs

@@ -8360,8 +8360,8 @@ class Mesh extends Object3D {
 		this.updateMorphTargets();
 	}
 
-	copy(source) {
-		super.copy(source);
+	copy(source, recursive) {
+		super.copy(source, recursive);
 
 		if (source.morphTargetInfluences !== undefined) {
 			this.morphTargetInfluences = source.morphTargetInfluences.slice();
@@ -16793,7 +16793,13 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
 
 			if (renderTargetProperties.__webglDepthbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer);
 			if (renderTargetProperties.__webglMultisampledFramebuffer) _gl.deleteFramebuffer(renderTargetProperties.__webglMultisampledFramebuffer);
-			if (renderTargetProperties.__webglColorRenderbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglColorRenderbuffer);
+
+			if (renderTargetProperties.__webglColorRenderbuffer) {
+				for (let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i++) {
+					if (renderTargetProperties.__webglColorRenderbuffer[i]) _gl.deleteRenderbuffer(renderTargetProperties.__webglColorRenderbuffer[i]);
+				}
+			}
+
 			if (renderTargetProperties.__webglDepthRenderbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthRenderbuffer);
 		}
 
@@ -17454,19 +17460,22 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
 
 			_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer);
 		} else {
-			// Use the first texture for MRT so far
-			const texture = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture[0] : renderTarget.texture;
-			const glFormat = utils.convert(texture.format, texture.encoding);
-			const glType = utils.convert(texture.type);
-			const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.encoding);
-			const samples = getRenderTargetSamples(renderTarget);
+			const textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [renderTarget.texture];
 
-			if (isMultisample && useMultisampledRTT(renderTarget) === false) {
-				_gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height);
-			} else if (useMultisampledRTT(renderTarget)) {
-				multisampledRTTExt.renderbufferStorageMultisampleEXT(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height);
-			} else {
-				_gl.renderbufferStorage(_gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height);
+			for (let i = 0; i < textures.length; i++) {
+				const texture = textures[i];
+				const glFormat = utils.convert(texture.format, texture.encoding);
+				const glType = utils.convert(texture.type);
+				const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.encoding);
+				const samples = getRenderTargetSamples(renderTarget);
+
+				if (isMultisample && useMultisampledRTT(renderTarget) === false) {
+					_gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height);
+				} else if (useMultisampledRTT(renderTarget)) {
+					multisampledRTTExt.renderbufferStorageMultisampleEXT(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height);
+				} else {
+					_gl.renderbufferStorage(_gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height);
+				}
 			}
 		}
 
@@ -17597,22 +17606,29 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
 				} else {
 					console.warn('THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.');
 				}
-			} else if (isWebGL2 && renderTarget.samples > 0 && useMultisampledRTT(renderTarget) === false) {
+			}
+
+			if (isWebGL2 && renderTarget.samples > 0 && useMultisampledRTT(renderTarget) === false) {
+				const textures = isMultipleRenderTargets ? texture : [texture];
 				renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();
-				renderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();
+				renderTargetProperties.__webglColorRenderbuffer = [];
+				state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer);
 
-				_gl.bindRenderbuffer(_gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer);
+				for (let i = 0; i < textures.length; i++) {
+					const texture = textures[i];
+					renderTargetProperties.__webglColorRenderbuffer[i] = _gl.createRenderbuffer();
 
-				const glFormat = utils.convert(texture.format, texture.encoding);
-				const glType = utils.convert(texture.type);
-				const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.encoding);
-				const samples = getRenderTargetSamples(renderTarget);
+					_gl.bindRenderbuffer(_gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]);
 
-				_gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height);
+					const glFormat = utils.convert(texture.format, texture.encoding);
+					const glType = utils.convert(texture.type);
+					const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.encoding);
+					const samples = getRenderTargetSamples(renderTarget);
 
-				state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer);
+					_gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height);
 
-				_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer);
+					_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]);
+				}
 
 				_gl.bindRenderbuffer(_gl.RENDERBUFFER, null);
 
@@ -17704,40 +17720,84 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
 
 	function updateMultisampleRenderTarget(renderTarget) {
 		if (isWebGL2 && renderTarget.samples > 0 && useMultisampledRTT(renderTarget) === false) {
+			const textures = renderTarget.isWebGLMultipleRenderTargets ? renderTarget.texture : [renderTarget.texture];
 			const width = renderTarget.width;
 			const height = renderTarget.height;
 			let mask = _gl.COLOR_BUFFER_BIT;
-			const invalidationArray = [_gl.COLOR_ATTACHMENT0];
+			const invalidationArray = [];
 			const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
+			const renderTargetProperties = properties.get(renderTarget);
+			const isMultipleRenderTargets = renderTarget.isWebGLMultipleRenderTargets === true; // If MRT we need to remove FBO attachments
 
-			if (renderTarget.depthBuffer) {
-				invalidationArray.push(depthStyle);
-			}
+			if (isMultipleRenderTargets) {
+				for (let i = 0; i < textures.length; i++) {
+					state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer);
 
-			const renderTargetProperties = properties.get(renderTarget);
-			const ignoreDepthValues = renderTargetProperties.__ignoreDepthValues !== undefined ? renderTargetProperties.__ignoreDepthValues : false;
+					_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null);
 
-			if (ignoreDepthValues === false) {
-				if (renderTarget.depthBuffer) mask |= _gl.DEPTH_BUFFER_BIT;
-				if (renderTarget.stencilBuffer) mask |= _gl.STENCIL_BUFFER_BIT;
+					state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer);
+
+					_gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0);
+				}
 			}
 
 			state.bindFramebuffer(_gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer);
 			state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer);
 
-			if (ignoreDepthValues === true) {
-				_gl.invalidateFramebuffer(_gl.READ_FRAMEBUFFER, [depthStyle]);
+			for (let i = 0; i < textures.length; i++) {
+				invalidationArray.push(_gl.COLOR_ATTACHMENT0 + i);
 
-				_gl.invalidateFramebuffer(_gl.DRAW_FRAMEBUFFER, [depthStyle]);
-			}
+				if (renderTarget.depthBuffer) {
+					invalidationArray.push(depthStyle);
+				}
+
+				const ignoreDepthValues = renderTargetProperties.__ignoreDepthValues !== undefined ? renderTargetProperties.__ignoreDepthValues : false;
+
+				if (ignoreDepthValues === false) {
+					if (renderTarget.depthBuffer) mask |= _gl.DEPTH_BUFFER_BIT;
+					if (renderTarget.stencilBuffer) mask |= _gl.STENCIL_BUFFER_BIT;
+				}
+
+				if (isMultipleRenderTargets) {
+					_gl.framebufferRenderbuffer(_gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]);
+				}
+
+				if (ignoreDepthValues === true) {
+					_gl.invalidateFramebuffer(_gl.READ_FRAMEBUFFER, [depthStyle]);
+
+					_gl.invalidateFramebuffer(_gl.DRAW_FRAMEBUFFER, [depthStyle]);
+				}
+
+				if (isMultipleRenderTargets) {
+					const webglTexture = properties.get(textures[i]).__webglTexture;
 
-			_gl.blitFramebuffer(0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST);
+					_gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0);
+				}
 
-			if (supportsInvalidateFramebuffer) {
-				_gl.invalidateFramebuffer(_gl.READ_FRAMEBUFFER, invalidationArray);
+				_gl.blitFramebuffer(0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST);
+
+				if (supportsInvalidateFramebuffer) {
+					_gl.invalidateFramebuffer(_gl.READ_FRAMEBUFFER, invalidationArray);
+				}
 			}
 
 			state.bindFramebuffer(_gl.READ_FRAMEBUFFER, null);
+			state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, null); // If MRT since pre-blit we removed the FBO we need to reconstruct the attachments
+
+			if (isMultipleRenderTargets) {
+				for (let i = 0; i < textures.length; i++) {
+					state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer);
+
+					_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]);
+
+					const webglTexture = properties.get(textures[i]).__webglTexture;
+
+					state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer);
+
+					_gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0);
+				}
+			}
+
 			state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer);
 		}
 	}
@@ -21172,8 +21232,8 @@ class Sprite extends Object3D {
 		});
 	}
 
-	copy(source) {
-		super.copy(source);
+	copy(source, recursive) {
+		super.copy(source, recursive);
 		if (source.center !== undefined) this.center.copy(source.center);
 		this.material = source.material;
 		return this;
@@ -21354,8 +21414,8 @@ class SkinnedMesh extends Mesh {
 		this.bindMatrixInverse = new Matrix4();
 	}
 
-	copy(source) {
-		super.copy(source);
+	copy(source, recursive) {
+		super.copy(source, recursive);
 		this.bindMode = source.bindMode;
 		this.bindMatrix.copy(source.bindMatrix);
 		this.bindMatrixInverse.copy(source.bindMatrixInverse);
@@ -21699,8 +21759,8 @@ class InstancedMesh extends Mesh {
 		this.frustumCulled = false;
 	}
 
-	copy(source) {
-		super.copy(source);
+	copy(source, recursive) {
+		super.copy(source, recursive);
 		this.instanceMatrix.copy(source.instanceMatrix);
 		if (source.instanceColor !== null) this.instanceColor = source.instanceColor.clone();
 		this.count = source.count;
@@ -21812,8 +21872,8 @@ class Line extends Object3D {
 		this.updateMorphTargets();
 	}
 
-	copy(source) {
-		super.copy(source);
+	copy(source, recursive) {
+		super.copy(source, recursive);
 		this.material = source.material;
 		this.geometry = source.geometry;
 		return this;
@@ -22068,8 +22128,8 @@ class Points extends Object3D {
 		this.updateMorphTargets();
 	}
 
-	copy(source) {
-		super.copy(source);
+	copy(source, recursive) {
+		super.copy(source, recursive);
 		this.material = source.material;
 		this.geometry = source.geometry;
 		return this;
@@ -28748,8 +28808,8 @@ class Light extends Object3D {
 	dispose() {// Empty here in base class; some subclasses override.
 	}
 
-	copy(source) {
-		super.copy(source);
+	copy(source, recursive) {
+		super.copy(source, recursive);
 		this.color.copy(source.color);
 		this.intensity = source.intensity;
 		return this;
@@ -28780,8 +28840,8 @@ class HemisphereLight extends Light {
 		this.groundColor = new Color(groundColor);
 	}
 
-	copy(source) {
-		super.copy(source);
+	copy(source, recursive) {
+		super.copy(source, recursive);
 		this.groundColor.copy(source.groundColor);
 		return this;
 	}
@@ -28948,8 +29008,8 @@ class SpotLight extends Light {
 		this.shadow.dispose();
 	}
 
-	copy(source) {
-		super.copy(source);
+	copy(source, recursive) {
+		super.copy(source, recursive);
 		this.distance = source.distance;
 		this.angle = source.angle;
 		this.penumbra = source.penumbra;
@@ -29052,8 +29112,8 @@ class PointLight extends Light {
 		this.shadow.dispose();
 	}
 
-	copy(source) {
-		super.copy(source);
+	copy(source, recursive) {
+		super.copy(source, recursive);
 		this.distance = source.distance;
 		this.decay = source.decay;
 		this.shadow = source.shadow.clone();
@@ -34375,8 +34435,8 @@ class BoxHelper extends LineSegments {
 		return this;
 	}
 
-	copy(source) {
-		LineSegments.prototype.copy.call(this, source);
+	copy(source, recursive) {
+		super.copy(source, recursive);
 		this.object = source.object;
 		return this;
 	}

+ 121 - 61
build/three.js

@@ -8362,8 +8362,8 @@
 			this.updateMorphTargets();
 		}
 
-		copy(source) {
-			super.copy(source);
+		copy(source, recursive) {
+			super.copy(source, recursive);
 
 			if (source.morphTargetInfluences !== undefined) {
 				this.morphTargetInfluences = source.morphTargetInfluences.slice();
@@ -16795,7 +16795,13 @@
 
 				if (renderTargetProperties.__webglDepthbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer);
 				if (renderTargetProperties.__webglMultisampledFramebuffer) _gl.deleteFramebuffer(renderTargetProperties.__webglMultisampledFramebuffer);
-				if (renderTargetProperties.__webglColorRenderbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglColorRenderbuffer);
+
+				if (renderTargetProperties.__webglColorRenderbuffer) {
+					for (let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i++) {
+						if (renderTargetProperties.__webglColorRenderbuffer[i]) _gl.deleteRenderbuffer(renderTargetProperties.__webglColorRenderbuffer[i]);
+					}
+				}
+
 				if (renderTargetProperties.__webglDepthRenderbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthRenderbuffer);
 			}
 
@@ -17456,19 +17462,22 @@
 
 				_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer);
 			} else {
-				// Use the first texture for MRT so far
-				const texture = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture[0] : renderTarget.texture;
-				const glFormat = utils.convert(texture.format, texture.encoding);
-				const glType = utils.convert(texture.type);
-				const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.encoding);
-				const samples = getRenderTargetSamples(renderTarget);
+				const textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [renderTarget.texture];
 
-				if (isMultisample && useMultisampledRTT(renderTarget) === false) {
-					_gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height);
-				} else if (useMultisampledRTT(renderTarget)) {
-					multisampledRTTExt.renderbufferStorageMultisampleEXT(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height);
-				} else {
-					_gl.renderbufferStorage(_gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height);
+				for (let i = 0; i < textures.length; i++) {
+					const texture = textures[i];
+					const glFormat = utils.convert(texture.format, texture.encoding);
+					const glType = utils.convert(texture.type);
+					const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.encoding);
+					const samples = getRenderTargetSamples(renderTarget);
+
+					if (isMultisample && useMultisampledRTT(renderTarget) === false) {
+						_gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height);
+					} else if (useMultisampledRTT(renderTarget)) {
+						multisampledRTTExt.renderbufferStorageMultisampleEXT(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height);
+					} else {
+						_gl.renderbufferStorage(_gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height);
+					}
 				}
 			}
 
@@ -17599,22 +17608,29 @@
 					} else {
 						console.warn('THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.');
 					}
-				} else if (isWebGL2 && renderTarget.samples > 0 && useMultisampledRTT(renderTarget) === false) {
+				}
+
+				if (isWebGL2 && renderTarget.samples > 0 && useMultisampledRTT(renderTarget) === false) {
+					const textures = isMultipleRenderTargets ? texture : [texture];
 					renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();
-					renderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();
+					renderTargetProperties.__webglColorRenderbuffer = [];
+					state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer);
 
-					_gl.bindRenderbuffer(_gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer);
+					for (let i = 0; i < textures.length; i++) {
+						const texture = textures[i];
+						renderTargetProperties.__webglColorRenderbuffer[i] = _gl.createRenderbuffer();
 
-					const glFormat = utils.convert(texture.format, texture.encoding);
-					const glType = utils.convert(texture.type);
-					const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.encoding);
-					const samples = getRenderTargetSamples(renderTarget);
+						_gl.bindRenderbuffer(_gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]);
 
-					_gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height);
+						const glFormat = utils.convert(texture.format, texture.encoding);
+						const glType = utils.convert(texture.type);
+						const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.encoding);
+						const samples = getRenderTargetSamples(renderTarget);
 
-					state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer);
+						_gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height);
 
-					_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer);
+						_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]);
+					}
 
 					_gl.bindRenderbuffer(_gl.RENDERBUFFER, null);
 
@@ -17706,40 +17722,84 @@
 
 		function updateMultisampleRenderTarget(renderTarget) {
 			if (isWebGL2 && renderTarget.samples > 0 && useMultisampledRTT(renderTarget) === false) {
+				const textures = renderTarget.isWebGLMultipleRenderTargets ? renderTarget.texture : [renderTarget.texture];
 				const width = renderTarget.width;
 				const height = renderTarget.height;
 				let mask = _gl.COLOR_BUFFER_BIT;
-				const invalidationArray = [_gl.COLOR_ATTACHMENT0];
+				const invalidationArray = [];
 				const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
+				const renderTargetProperties = properties.get(renderTarget);
+				const isMultipleRenderTargets = renderTarget.isWebGLMultipleRenderTargets === true; // If MRT we need to remove FBO attachments
 
-				if (renderTarget.depthBuffer) {
-					invalidationArray.push(depthStyle);
-				}
+				if (isMultipleRenderTargets) {
+					for (let i = 0; i < textures.length; i++) {
+						state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer);
 
-				const renderTargetProperties = properties.get(renderTarget);
-				const ignoreDepthValues = renderTargetProperties.__ignoreDepthValues !== undefined ? renderTargetProperties.__ignoreDepthValues : false;
+						_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null);
 
-				if (ignoreDepthValues === false) {
-					if (renderTarget.depthBuffer) mask |= _gl.DEPTH_BUFFER_BIT;
-					if (renderTarget.stencilBuffer) mask |= _gl.STENCIL_BUFFER_BIT;
+						state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer);
+
+						_gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0);
+					}
 				}
 
 				state.bindFramebuffer(_gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer);
 				state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer);
 
-				if (ignoreDepthValues === true) {
-					_gl.invalidateFramebuffer(_gl.READ_FRAMEBUFFER, [depthStyle]);
+				for (let i = 0; i < textures.length; i++) {
+					invalidationArray.push(_gl.COLOR_ATTACHMENT0 + i);
 
-					_gl.invalidateFramebuffer(_gl.DRAW_FRAMEBUFFER, [depthStyle]);
-				}
+					if (renderTarget.depthBuffer) {
+						invalidationArray.push(depthStyle);
+					}
+
+					const ignoreDepthValues = renderTargetProperties.__ignoreDepthValues !== undefined ? renderTargetProperties.__ignoreDepthValues : false;
+
+					if (ignoreDepthValues === false) {
+						if (renderTarget.depthBuffer) mask |= _gl.DEPTH_BUFFER_BIT;
+						if (renderTarget.stencilBuffer) mask |= _gl.STENCIL_BUFFER_BIT;
+					}
+
+					if (isMultipleRenderTargets) {
+						_gl.framebufferRenderbuffer(_gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]);
+					}
+
+					if (ignoreDepthValues === true) {
+						_gl.invalidateFramebuffer(_gl.READ_FRAMEBUFFER, [depthStyle]);
+
+						_gl.invalidateFramebuffer(_gl.DRAW_FRAMEBUFFER, [depthStyle]);
+					}
+
+					if (isMultipleRenderTargets) {
+						const webglTexture = properties.get(textures[i]).__webglTexture;
 
-				_gl.blitFramebuffer(0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST);
+						_gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0);
+					}
 
-				if (supportsInvalidateFramebuffer) {
-					_gl.invalidateFramebuffer(_gl.READ_FRAMEBUFFER, invalidationArray);
+					_gl.blitFramebuffer(0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST);
+
+					if (supportsInvalidateFramebuffer) {
+						_gl.invalidateFramebuffer(_gl.READ_FRAMEBUFFER, invalidationArray);
+					}
 				}
 
 				state.bindFramebuffer(_gl.READ_FRAMEBUFFER, null);
+				state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, null); // If MRT since pre-blit we removed the FBO we need to reconstruct the attachments
+
+				if (isMultipleRenderTargets) {
+					for (let i = 0; i < textures.length; i++) {
+						state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer);
+
+						_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]);
+
+						const webglTexture = properties.get(textures[i]).__webglTexture;
+
+						state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer);
+
+						_gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0);
+					}
+				}
+
 				state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer);
 			}
 		}
@@ -21174,8 +21234,8 @@
 			});
 		}
 
-		copy(source) {
-			super.copy(source);
+		copy(source, recursive) {
+			super.copy(source, recursive);
 			if (source.center !== undefined) this.center.copy(source.center);
 			this.material = source.material;
 			return this;
@@ -21356,8 +21416,8 @@
 			this.bindMatrixInverse = new Matrix4();
 		}
 
-		copy(source) {
-			super.copy(source);
+		copy(source, recursive) {
+			super.copy(source, recursive);
 			this.bindMode = source.bindMode;
 			this.bindMatrix.copy(source.bindMatrix);
 			this.bindMatrixInverse.copy(source.bindMatrixInverse);
@@ -21701,8 +21761,8 @@
 			this.frustumCulled = false;
 		}
 
-		copy(source) {
-			super.copy(source);
+		copy(source, recursive) {
+			super.copy(source, recursive);
 			this.instanceMatrix.copy(source.instanceMatrix);
 			if (source.instanceColor !== null) this.instanceColor = source.instanceColor.clone();
 			this.count = source.count;
@@ -21814,8 +21874,8 @@
 			this.updateMorphTargets();
 		}
 
-		copy(source) {
-			super.copy(source);
+		copy(source, recursive) {
+			super.copy(source, recursive);
 			this.material = source.material;
 			this.geometry = source.geometry;
 			return this;
@@ -22070,8 +22130,8 @@
 			this.updateMorphTargets();
 		}
 
-		copy(source) {
-			super.copy(source);
+		copy(source, recursive) {
+			super.copy(source, recursive);
 			this.material = source.material;
 			this.geometry = source.geometry;
 			return this;
@@ -28750,8 +28810,8 @@
 		dispose() {// Empty here in base class; some subclasses override.
 		}
 
-		copy(source) {
-			super.copy(source);
+		copy(source, recursive) {
+			super.copy(source, recursive);
 			this.color.copy(source.color);
 			this.intensity = source.intensity;
 			return this;
@@ -28782,8 +28842,8 @@
 			this.groundColor = new Color(groundColor);
 		}
 
-		copy(source) {
-			super.copy(source);
+		copy(source, recursive) {
+			super.copy(source, recursive);
 			this.groundColor.copy(source.groundColor);
 			return this;
 		}
@@ -28950,8 +29010,8 @@
 			this.shadow.dispose();
 		}
 
-		copy(source) {
-			super.copy(source);
+		copy(source, recursive) {
+			super.copy(source, recursive);
 			this.distance = source.distance;
 			this.angle = source.angle;
 			this.penumbra = source.penumbra;
@@ -29054,8 +29114,8 @@
 			this.shadow.dispose();
 		}
 
-		copy(source) {
-			super.copy(source);
+		copy(source, recursive) {
+			super.copy(source, recursive);
 			this.distance = source.distance;
 			this.decay = source.decay;
 			this.shadow = source.shadow.clone();
@@ -34377,8 +34437,8 @@
 			return this;
 		}
 
-		copy(source) {
-			LineSegments.prototype.copy.call(this, source);
+		copy(source, recursive) {
+			super.copy(source, recursive);
 			this.object = source.object;
 			return this;
 		}

File diff suppressed because it is too large
+ 0 - 0
build/three.min.js


+ 146 - 62
build/three.module.js

@@ -11013,9 +11013,9 @@ class Mesh extends Object3D {
 
 	}
 
-	copy( source ) {
+	copy( source, recursive ) {
 
-		super.copy( source );
+		super.copy( source, recursive );
 
 		if ( source.morphTargetInfluences !== undefined ) {
 
@@ -22678,7 +22678,17 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 			_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
 			if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );
 			if ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );
-			if ( renderTargetProperties.__webglColorRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer );
+
+			if ( renderTargetProperties.__webglColorRenderbuffer ) {
+
+				for ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {
+
+					if ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );
+
+				}
+
+			}
+
 			if ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );
 
 		}
@@ -23673,25 +23683,30 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 		} else {
 
-			// Use the first texture for MRT so far
-			const texture = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture[ 0 ] : renderTarget.texture;
+			const textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];
 
-			const glFormat = utils.convert( texture.format, texture.encoding );
-			const glType = utils.convert( texture.type );
-			const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
-			const samples = getRenderTargetSamples( renderTarget );
+			for ( let i = 0; i < textures.length; i ++ ) {
 
-			if ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {
+				const texture = textures[ i ];
+
+				const glFormat = utils.convert( texture.format, texture.encoding );
+				const glType = utils.convert( texture.type );
+				const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
+				const samples = getRenderTargetSamples( renderTarget );
 
-				_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );
+				if ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {
 
-			} else if ( useMultisampledRTT( renderTarget ) ) {
+					_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );
 
-				multisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );
+				} else if ( useMultisampledRTT( renderTarget ) ) {
 
-			} else {
+					multisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );
 
-				_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );
+				} else {
+
+					_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );
+
+				}
 
 			}
 
@@ -23891,21 +23906,34 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 				}
 
-			} else if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {
+			}
 
-				renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();
-				renderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();
+			if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {
 
-				_gl.bindRenderbuffer( 36161, renderTargetProperties.__webglColorRenderbuffer );
+				const textures = isMultipleRenderTargets ? texture : [ texture ];
 
-				const glFormat = utils.convert( texture.format, texture.encoding );
-				const glType = utils.convert( texture.type );
-				const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
-				const samples = getRenderTargetSamples( renderTarget );
-				_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );
+				renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();
+				renderTargetProperties.__webglColorRenderbuffer = [];
 
 				state.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );
-				_gl.framebufferRenderbuffer( 36160, 36064, 36161, renderTargetProperties.__webglColorRenderbuffer );
+
+				for ( let i = 0; i < textures.length; i ++ ) {
+
+					const texture = textures[ i ];
+					renderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();
+
+					_gl.bindRenderbuffer( 36161, renderTargetProperties.__webglColorRenderbuffer[ i ] );
+
+					const glFormat = utils.convert( texture.format, texture.encoding );
+					const glType = utils.convert( texture.type );
+					const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
+					const samples = getRenderTargetSamples( renderTarget );
+					_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );
+
+					_gl.framebufferRenderbuffer( 36160, 36064 + i, 36161, renderTargetProperties.__webglColorRenderbuffer[ i ] );
+
+				}
+
 				_gl.bindRenderbuffer( 36161, null );
 
 				if ( renderTarget.depthBuffer ) {
@@ -24036,47 +24064,103 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 		if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {
 
+			const textures = renderTarget.isWebGLMultipleRenderTargets ? renderTarget.texture : [ renderTarget.texture ];
 			const width = renderTarget.width;
 			const height = renderTarget.height;
 			let mask = 16384;
-			const invalidationArray = [ 36064 ];
+			const invalidationArray = [];
 			const depthStyle = renderTarget.stencilBuffer ? 33306 : 36096;
+			const renderTargetProperties = properties.get( renderTarget );
+			const isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );
 
-			if ( renderTarget.depthBuffer ) {
+			// If MRT we need to remove FBO attachments
+			if ( isMultipleRenderTargets ) {
 
-				invalidationArray.push( depthStyle );
+				for ( let i = 0; i < textures.length; i ++ ) {
 
-			}
+					state.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );
+					_gl.framebufferRenderbuffer( 36160, 36064 + i, 36161, null );
 
-			const renderTargetProperties = properties.get( renderTarget );
-			const ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : false;
+					state.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer );
+					_gl.framebufferTexture2D( 36009, 36064 + i, 3553, null, 0 );
 
-			if ( ignoreDepthValues === false ) {
-
-				if ( renderTarget.depthBuffer ) mask |= 256;
-				if ( renderTarget.stencilBuffer ) mask |= 1024;
+				}
 
 			}
 
 			state.bindFramebuffer( 36008, renderTargetProperties.__webglMultisampledFramebuffer );
 			state.bindFramebuffer( 36009, renderTargetProperties.__webglFramebuffer );
 
-			if ( ignoreDepthValues === true ) {
+			for ( let i = 0; i < textures.length; i ++ ) {
 
-				_gl.invalidateFramebuffer( 36008, [ depthStyle ] );
-				_gl.invalidateFramebuffer( 36009, [ depthStyle ] );
+				invalidationArray.push( 36064 + i );
 
-			}
+				if ( renderTarget.depthBuffer ) {
+
+					invalidationArray.push( depthStyle );
+
+				}
+
+				const ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : false;
 
-			_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, 9728 );
+				if ( ignoreDepthValues === false ) {
+
+					if ( renderTarget.depthBuffer ) mask |= 256;
+					if ( renderTarget.stencilBuffer ) mask |= 1024;
+
+				}
+
+				if ( isMultipleRenderTargets ) {
+
+					_gl.framebufferRenderbuffer( 36008, 36064, 36161, renderTargetProperties.__webglColorRenderbuffer[ i ] );
+
+				}
 
-			if ( supportsInvalidateFramebuffer ) {
+				if ( ignoreDepthValues === true ) {
+
+					_gl.invalidateFramebuffer( 36008, [ depthStyle ] );
+					_gl.invalidateFramebuffer( 36009, [ depthStyle ] );
+
+				}
+
+				if ( isMultipleRenderTargets ) {
+
+					const webglTexture = properties.get( textures[ i ] ).__webglTexture;
+					_gl.framebufferTexture2D( 36009, 36064, 3553, webglTexture, 0 );
+
+				}
+
+				_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, 9728 );
+
+				if ( supportsInvalidateFramebuffer ) {
+
+					_gl.invalidateFramebuffer( 36008, invalidationArray );
+
+				}
 
-				_gl.invalidateFramebuffer( 36008, invalidationArray );
 
 			}
 
 			state.bindFramebuffer( 36008, null );
+			state.bindFramebuffer( 36009, null );
+
+			// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments
+			if ( isMultipleRenderTargets ) {
+
+				for ( let i = 0; i < textures.length; i ++ ) {
+
+					state.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );
+					_gl.framebufferRenderbuffer( 36160, 36064 + i, 36161, renderTargetProperties.__webglColorRenderbuffer[ i ] );
+
+					const webglTexture = properties.get( textures[ i ] ).__webglTexture;
+
+					state.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer );
+					_gl.framebufferTexture2D( 36009, 36064 + i, 3553, webglTexture, 0 );
+
+				}
+
+			}
+
 			state.bindFramebuffer( 36009, renderTargetProperties.__webglMultisampledFramebuffer );
 
 		}
@@ -29002,9 +29086,9 @@ class Sprite extends Object3D {
 
 	}
 
-	copy( source ) {
+	copy( source, recursive ) {
 
-		super.copy( source );
+		super.copy( source, recursive );
 
 		if ( source.center !== undefined ) this.center.copy( source.center );
 
@@ -29257,9 +29341,9 @@ class SkinnedMesh extends Mesh {
 
 	}
 
-	copy( source ) {
+	copy( source, recursive ) {
 
-		super.copy( source );
+		super.copy( source, recursive );
 
 		this.bindMode = source.bindMode;
 		this.bindMatrix.copy( source.bindMatrix );
@@ -29751,9 +29835,9 @@ class InstancedMesh extends Mesh {
 
 	}
 
-	copy( source ) {
+	copy( source, recursive ) {
 
-		super.copy( source );
+		super.copy( source, recursive );
 
 		this.instanceMatrix.copy( source.instanceMatrix );
 
@@ -29912,9 +29996,9 @@ class Line extends Object3D {
 
 	}
 
-	copy( source ) {
+	copy( source, recursive ) {
 
-		super.copy( source );
+		super.copy( source, recursive );
 
 		this.material = source.material;
 		this.geometry = source.geometry;
@@ -30271,9 +30355,9 @@ class Points extends Object3D {
 
 	}
 
-	copy( source ) {
+	copy( source, recursive ) {
 
-		super.copy( source );
+		super.copy( source, recursive );
 
 		this.material = source.material;
 		this.geometry = source.geometry;
@@ -40013,9 +40097,9 @@ class Light extends Object3D {
 
 	}
 
-	copy( source ) {
+	copy( source, recursive ) {
 
-		super.copy( source );
+		super.copy( source, recursive );
 
 		this.color.copy( source.color );
 		this.intensity = source.intensity;
@@ -40063,9 +40147,9 @@ class HemisphereLight extends Light {
 
 	}
 
-	copy( source ) {
+	copy( source, recursive ) {
 
-		super.copy( source );
+		super.copy( source, recursive );
 
 		this.groundColor.copy( source.groundColor );
 
@@ -40306,9 +40390,9 @@ class SpotLight extends Light {
 
 	}
 
-	copy( source ) {
+	copy( source, recursive ) {
 
-		super.copy( source );
+		super.copy( source, recursive );
 
 		this.distance = source.distance;
 		this.angle = source.angle;
@@ -40451,9 +40535,9 @@ class PointLight extends Light {
 
 	}
 
-	copy( source ) {
+	copy( source, recursive ) {
 
-		super.copy( source );
+		super.copy( source, recursive );
 
 		this.distance = source.distance;
 		this.decay = source.decay;
@@ -47996,9 +48080,9 @@ class BoxHelper extends LineSegments {
 
 	}
 
-	copy( source ) {
+	copy( source, recursive ) {
 
-		LineSegments.prototype.copy.call( this, source );
+		super.copy( source, recursive );
 
 		this.object = source.object;
 

Some files were not shown because too many files changed in this diff