Просмотр исходного кода

Reverted UniformUtils.clone() deprecation. See #10191.

Mr.doob 8 лет назад
Родитель
Сommit
8735cbab95
43 измененных файлов с 312 добавлено и 308 удалено
  1. 0 15
      docs/api/deprecated/DeprecatedList.html
  2. 7 7
      examples/js/Mirror.js
  3. 7 7
      examples/js/Ocean.js
  4. 12 12
      examples/js/ShaderSkin.js
  5. 5 6
      examples/js/ShaderTerrain.js
  6. 1 1
      examples/js/SkyShader.js
  7. 5 6
      examples/js/WaterShader.js
  8. 1 1
      examples/js/cameras/CinematicCamera.js
  9. 2 2
      examples/js/nodes/materials/PhongNode.js
  10. 2 2
      examples/js/nodes/materials/StandardNode.js
  11. 4 4
      examples/js/postprocessing/AdaptiveToneMappingPass.js
  12. 10 10
      examples/js/postprocessing/BloomPass.js
  13. 1 1
      examples/js/postprocessing/BokehPass.js
  14. 1 1
      examples/js/postprocessing/DotScreenPass.js
  15. 5 8
      examples/js/postprocessing/FilmPass.js
  16. 1 1
      examples/js/postprocessing/GlitchPass.js
  17. 100 83
      examples/js/postprocessing/OutlinePass.js
  18. 3 3
      examples/js/postprocessing/SMAAPass.js
  19. 3 3
      examples/js/postprocessing/SSAARenderPass.js
  20. 1 1
      examples/js/postprocessing/SavePass.js
  21. 2 2
      examples/js/postprocessing/ShaderPass.js
  22. 3 3
      examples/js/postprocessing/TexturePass.js
  23. 2 2
      examples/js/postprocessing/UnrealBloomPass.js
  24. 2 2
      examples/js/renderers/WebGLDeferredRenderer.js
  25. 1 1
      examples/js/utils/ShadowMapViewer.js
  26. 4 6
      examples/webgl_gpgpu_water.html
  27. 1 1
      examples/webgl_marchingcubes.html
  28. 1 1
      examples/webgl_materials_bumpmap_skin.html
  29. 1 1
      examples/webgl_materials_parallaxmap.html
  30. 1 1
      examples/webgl_materials_shaders_fresnel.html
  31. 11 10
      examples/webgl_materials_skin.html
  32. 1 1
      examples/webgl_postprocessing_dof2.html
  33. 3 3
      examples/webgl_postprocessing_godrays.html
  34. 2 2
      examples/webgl_shaders_tonemapping.html
  35. 2 2
      examples/webgl_terrain_dynamic.html
  36. 0 65
      src/Three.Legacy.js
  37. 1 0
      src/Three.js
  38. 2 1
      src/materials/ShaderMaterial.js
  39. 3 2
      src/materials/ShadowMaterial.js
  40. 4 3
      src/renderers/WebGLRenderer.js
  41. 25 24
      src/renderers/shaders/ShaderLib.js
  42. 67 0
      src/renderers/shaders/UniformsUtils.js
  43. 2 1
      src/renderers/webgl/WebGLShadowMap.js

+ 0 - 15
docs/api/deprecated/DeprecatedList.html

@@ -542,21 +542,6 @@
 
 
 
-		<h2>Shaders</h2>
-
-		<h3>[page:UniformsUtils]</h3>
-		<div>
-			UniformsUtils.merge() has been deprecated. Use Object.assign() instead.<br /><br />
-
-			UniformsUtils.clone() has been deprecated.
-		</div>
-
-
-
-
-
-
-
 		<h2>Textures</h2>
 
 		<h3>[page:ImageUtils]</h3>

+ 7 - 7
examples/js/Mirror.js

@@ -5,9 +5,9 @@
 THREE.ShaderLib[ 'mirror' ] = {
 
 	uniforms: {
-		"mirrorColor": new THREE.Uniform( new THREE.Color( 0x7F7F7F ) ),
-		"mirrorSampler": new THREE.Uniform( null ),
-		"textureMatrix" : new THREE.Uniform( new THREE.Matrix4() )
+		"mirrorColor": { value: new THREE.Color( 0x7F7F7F ) },
+		"mirrorSampler": { value: null },
+		"textureMatrix" : { value: new THREE.Matrix4() }
 	},
 
 	vertexShader: [
@@ -119,7 +119,7 @@ THREE.Mirror = function ( renderer, camera, options ) {
 	this.renderTarget2 = new THREE.WebGLRenderTarget( width, height, parameters );
 
 	var mirrorShader = THREE.ShaderLib[ "mirror" ];
-	var mirrorUniforms = Object.assign( {}, mirrorShader.uniforms );
+	var mirrorUniforms = THREE.UniformsUtils.clone( mirrorShader.uniforms );
 
 	this.material = new THREE.ShaderMaterial( {
 
@@ -129,9 +129,9 @@ THREE.Mirror = function ( renderer, camera, options ) {
 
 	} );
 
-	this.material.uniforms.mirrorSampler = new THREE.Uniform( this.renderTarget.texture );
-	this.material.uniforms.mirrorColor = new THREE.Uniform( mirrorColor );
-	this.material.uniforms.textureMatrix = new THREE.Uniform( this.textureMatrix );
+	this.material.uniforms.mirrorSampler.value = this.renderTarget.texture;
+	this.material.uniforms.mirrorColor.value = mirrorColor;
+	this.material.uniforms.textureMatrix.value = this.textureMatrix;
 
 	if ( ! THREE.Math.isPowerOfTwo( width ) || ! THREE.Math.isPowerOfTwo( height ) ) {
 

+ 7 - 7
examples/js/Ocean.js

@@ -91,7 +91,7 @@
 
 	// 1 - Horizontal wave vertices used for FFT
 	var oceanHorizontalShader = THREE.ShaderLib[ "ocean_subtransform" ];
-	var oceanHorizontalUniforms = Object.assign( {}, oceanHorizontalShader.uniforms );
+	var oceanHorizontalUniforms = THREE.UniformsUtils.clone( oceanHorizontalShader.uniforms );
 	this.materialOceanHorizontal = new THREE.ShaderMaterial( {
 		uniforms: oceanHorizontalUniforms,
 		vertexShader: fullscreeenVertexShader.vertexShader,
@@ -104,7 +104,7 @@
 
 	// 2 - Vertical wave vertices used for FFT
 	var oceanVerticalShader = THREE.ShaderLib[ "ocean_subtransform" ];
-	var oceanVerticalUniforms = Object.assign( {}, oceanVerticalShader.uniforms );
+	var oceanVerticalUniforms = THREE.UniformsUtils.clone( oceanVerticalShader.uniforms );
 	this.materialOceanVertical = new THREE.ShaderMaterial( {
 		uniforms: oceanVerticalUniforms,
 		vertexShader: fullscreeenVertexShader.vertexShader,
@@ -117,7 +117,7 @@
 
 	// 3 - Initial spectrum used to generate height map
 	var initialSpectrumShader = THREE.ShaderLib[ "ocean_initial_spectrum" ];
-	var initialSpectrumUniforms = Object.assign( {}, initialSpectrumShader.uniforms );
+	var initialSpectrumUniforms = THREE.UniformsUtils.clone( initialSpectrumShader.uniforms );
 	this.materialInitialSpectrum = new THREE.ShaderMaterial( {
 		uniforms: initialSpectrumUniforms,
 		vertexShader: fullscreeenVertexShader.vertexShader,
@@ -129,7 +129,7 @@
 
 	// 4 - Phases used to animate heightmap
 	var phaseShader = THREE.ShaderLib[ "ocean_phase" ];
-	var phaseUniforms = Object.assign( {}, phaseShader.uniforms );
+	var phaseUniforms = THREE.UniformsUtils.clone( phaseShader.uniforms );
 	this.materialPhase = new THREE.ShaderMaterial( {
 		uniforms: phaseUniforms,
 		vertexShader: fullscreeenVertexShader.vertexShader,
@@ -140,7 +140,7 @@
 
 	// 5 - Shader used to update spectrum
 	var spectrumShader = THREE.ShaderLib[ "ocean_spectrum" ];
-	var spectrumUniforms = Object.assign( {}, spectrumShader.uniforms );
+	var spectrumUniforms = THREE.UniformsUtils.clone( spectrumShader.uniforms );
 	this.materialSpectrum = new THREE.ShaderMaterial( {
 		uniforms: spectrumUniforms,
 		vertexShader: fullscreeenVertexShader.vertexShader,
@@ -152,7 +152,7 @@
 
 	// 6 - Shader used to update spectrum normals
 	var normalShader = THREE.ShaderLib[ "ocean_normals" ];
-	var normalUniforms = Object.assign( {}, normalShader.uniforms );
+	var normalUniforms = THREE.UniformsUtils.clone( normalShader.uniforms );
 	this.materialNormal = new THREE.ShaderMaterial( {
 		uniforms: normalUniforms,
 		vertexShader: fullscreeenVertexShader.vertexShader,
@@ -164,7 +164,7 @@
 
 	// 7 - Shader used to update normals
 	var oceanShader = THREE.ShaderLib[ "ocean_main" ];
-	var oceanUniforms = Object.assign( {}, oceanShader.uniforms );
+	var oceanUniforms = THREE.UniformsUtils.clone( oceanShader.uniforms );
 	this.materialOcean = new THREE.ShaderMaterial( {
 		uniforms: oceanUniforms,
 		vertexShader: oceanShader.vertexShader,

+ 12 - 12
examples/js/ShaderSkin.js

@@ -22,7 +22,10 @@ THREE.ShaderSkin = {
 
 	'skinSimple' : {
 
-		uniforms: Object.assign(
+		uniforms: THREE.UniformsUtils.merge( [
+
+			THREE.UniformsLib[ "fog" ],
+			THREE.UniformsLib[ "lights" ],
 
 			{
 
@@ -48,12 +51,9 @@ THREE.ShaderSkin = {
 
 				"uWrapRGB": { value: new THREE.Vector3( 0.75, 0.375, 0.1875 ) }
 
-			},
-
-			THREE.UniformsLib[ "fog" ],
-			THREE.UniformsLib[ "lights" ]
+			}
 
-		),
+		] ),
 
 		fragmentShader: [
 
@@ -305,7 +305,10 @@ THREE.ShaderSkin = {
 
 	'skin' : {
 
-		uniforms: Object.assign(
+		uniforms: THREE.UniformsUtils.merge( [
+
+			THREE.UniformsLib[ "fog" ],
+			THREE.UniformsLib[ "lights" ],
 
 			{
 
@@ -330,12 +333,9 @@ THREE.ShaderSkin = {
 				"uRoughness": 	  		{ value: 0.15 },
 				"uSpecularBrightness": 	{ value: 0.75 }
 
-			},
-
-			THREE.UniformsLib[ "fog" ],
-			THREE.UniformsLib[ "lights" ]
+			}
 
-		),
+		] ),
 
 		fragmentShader: [
 

+ 5 - 6
examples/js/ShaderTerrain.js

@@ -15,8 +15,10 @@ THREE.ShaderTerrain = {
 
 	'terrain' : {
 
-		uniforms: Object.assign(
+		uniforms: THREE.UniformsUtils.merge( [
 
+			THREE.UniformsLib[ "fog" ],
+			THREE.UniformsLib[ "lights" ],
 
 			{
 
@@ -47,12 +49,9 @@ THREE.ShaderTerrain = {
 
 				"uOffset": { value: new THREE.Vector2( 0, 0 ) }
 
-			},
-
-			THREE.UniformsLib[ "fog" ],
-			THREE.UniformsLib[ "lights" ]
+			}
 
-		),
+		] ),
 
 		fragmentShader: [
 

+ 1 - 1
examples/js/SkyShader.js

@@ -210,7 +210,7 @@ THREE.ShaderLib[ 'sky' ] = {
 THREE.Sky = function () {
 
 	var skyShader = THREE.ShaderLib[ "sky" ];
-	var skyUniforms = Object.assign( {}, skyShader.uniforms );
+	var skyUniforms = THREE.UniformsUtils.clone( skyShader.uniforms );
 
 	var skyMat = new THREE.ShaderMaterial( {
 		fragmentShader: skyShader.fragmentShader,

+ 5 - 6
examples/js/WaterShader.js

@@ -9,8 +9,8 @@
 
 THREE.ShaderLib[ 'water' ] = {
 
-	uniforms: Object.assign(
-		 {
+	uniforms: THREE.UniformsUtils.merge( [
+		THREE.UniformsLib[ "fog" ], {
 			"normalSampler":    { value: null },
 			"mirrorSampler":    { value: null },
 			"alpha":            { value: 1.0 },
@@ -22,9 +22,8 @@ THREE.ShaderLib[ 'water' ] = {
 			"sunDirection":     { value: new THREE.Vector3( 0.70707, 0.70707, 0 ) },
 			"eye":              { value: new THREE.Vector3() },
 			"waterColor":       { value: new THREE.Color( 0x555555 ) }
-		},
-		THREE.UniformsLib[ "fog" ]
-	),
+		}
+	] ),
 
 	vertexShader: [
 		'uniform mat4 textureMatrix;',
@@ -170,7 +169,7 @@ THREE.Water = function ( renderer, camera, scene, options ) {
 	this.renderTarget2 = new THREE.WebGLRenderTarget( width, height );
 
 	var mirrorShader = THREE.ShaderLib[ "water" ];
-	var mirrorUniforms = Object.assign( {}, mirrorShader.uniforms );
+	var mirrorUniforms = THREE.UniformsUtils.clone( mirrorShader.uniforms );
 
 	this.material = new THREE.ShaderMaterial( {
 		fragmentShader: mirrorShader.fragmentShader,

+ 1 - 1
examples/js/cameras/CinematicCamera.js

@@ -121,7 +121,7 @@ THREE.CinematicCamera.prototype.initPostProcessing = function () {
 
 		var bokeh_shader = THREE.BokehShader;
 
-		this.postprocessing.bokeh_uniforms = Object.assign( {}, bokeh_shader.uniforms );
+		this.postprocessing.bokeh_uniforms = THREE.UniformsUtils.clone( bokeh_shader.uniforms );
 
 		this.postprocessing.bokeh_uniforms[ "tColor" ].value = this.postprocessing.rtTextureColor.texture;
 		this.postprocessing.bokeh_uniforms[ "tDepth" ].value = this.postprocessing.rtTextureDepth.texture;

+ 2 - 2
examples/js/nodes/materials/PhongNode.js

@@ -29,12 +29,12 @@ THREE.PhongNode.prototype.build = function( builder ) {
 
 		var transform = this.transform ? this.transform.parseAndBuildCode( builder, 'v3', { cache : 'transform' } ) : undefined;
 
-		material.mergeUniform( Object.assign( {},
+		material.mergeUniform( THREE.UniformsUtils.merge( [
 
 			THREE.UniformsLib[ "fog" ],
 			THREE.UniformsLib[ "lights" ]
 
-		) );
+		] ) );
 
 		material.addVertexPars( [
 			"varying vec3 vViewPosition;",

+ 2 - 2
examples/js/nodes/materials/StandardNode.js

@@ -34,12 +34,12 @@ THREE.StandardNode.prototype.build = function( builder ) {
 
 		var transform = this.transform ? this.transform.parseAndBuildCode( builder, 'v3', { cache : 'transform' } ) : undefined;
 
-		material.mergeUniform( Object.assign( {},
+		material.mergeUniform( THREE.UniformsUtils.merge( [
 
 			THREE.UniformsLib[ "fog" ],
 			THREE.UniformsLib[ "lights" ]
 
-		) );
+		] ) );
 
 		material.addVertexPars( [
 			"varying vec3 vViewPosition;",

+ 4 - 4
examples/js/postprocessing/AdaptiveToneMappingPass.js

@@ -24,7 +24,7 @@ THREE.AdaptiveToneMappingPass = function ( adaptive, resolution ) {
 
 	var copyShader = THREE.CopyShader;
 
-	this.copyUniforms = Object.assign( {}, copyShader.uniforms );
+	this.copyUniforms = THREE.UniformsUtils.clone( copyShader.uniforms );
 
 	this.materialCopy = new THREE.ShaderMaterial( {
 
@@ -41,7 +41,7 @@ THREE.AdaptiveToneMappingPass = function ( adaptive, resolution ) {
 
 	this.materialLuminance = new THREE.ShaderMaterial( {
 
-		uniforms: Object.assign( {}, THREE.LuminosityShader.uniforms ),
+		uniforms: THREE.UniformsUtils.clone( THREE.LuminosityShader.uniforms ),
 		vertexShader: THREE.LuminosityShader.vertexShader,
 		fragmentShader: THREE.LuminosityShader.fragmentShader,
 		blending: THREE.NoBlending
@@ -97,7 +97,7 @@ THREE.AdaptiveToneMappingPass = function ( adaptive, resolution ) {
 
 	this.materialAdaptiveLum = new THREE.ShaderMaterial( {
 
-		uniforms: Object.assign( {}, this.adaptLuminanceShader.uniforms ),
+		uniforms: THREE.UniformsUtils.clone( this.adaptLuminanceShader.uniforms ),
 		vertexShader: this.adaptLuminanceShader.vertexShader,
 		fragmentShader: this.adaptLuminanceShader.fragmentShader,
 		defines: this.adaptLuminanceShader.defines,
@@ -109,7 +109,7 @@ THREE.AdaptiveToneMappingPass = function ( adaptive, resolution ) {
 
 	this.materialToneMap = new THREE.ShaderMaterial( {
 
-		uniforms: Object.assign( {}, THREE.ToneMapShader.uniforms ),
+		uniforms: THREE.UniformsUtils.clone( THREE.ToneMapShader.uniforms ),
 		vertexShader: THREE.ToneMapShader.vertexShader,
 		fragmentShader: THREE.ToneMapShader.fragmentShader,
 		blending: THREE.NoBlending

+ 10 - 10
examples/js/postprocessing/BloomPass.js

@@ -25,9 +25,9 @@ THREE.BloomPass = function ( strength, kernelSize, sigma, resolution ) {
 
 	var copyShader = THREE.CopyShader;
 
-	this.copyUniforms = Object.assign( {}, copyShader.uniforms );
+	this.copyUniforms = THREE.UniformsUtils.clone( copyShader.uniforms );
 
-	this.copyUniforms[ "opacity" ] = new THREE.Uniform( strength );
+	this.copyUniforms[ "opacity" ].value = strength;
 
 	this.materialCopy = new THREE.ShaderMaterial( {
 
@@ -46,10 +46,10 @@ THREE.BloomPass = function ( strength, kernelSize, sigma, resolution ) {
 
 	var convolutionShader = THREE.ConvolutionShader;
 
-	this.convolutionUniforms = Object.assign( {}, convolutionShader.uniforms );
+	this.convolutionUniforms = THREE.UniformsUtils.clone( convolutionShader.uniforms );
 
-	this.convolutionUniforms[ "uImageIncrement" ] = new THREE.Uniform( THREE.BloomPass.blurX );
-	this.convolutionUniforms[ "cKernel" ] = new THREE.Uniform( THREE.ConvolutionShader.buildKernel( sigma ) );
+	this.convolutionUniforms[ "uImageIncrement" ].value = THREE.BloomPass.blurX;
+	this.convolutionUniforms[ "cKernel" ].value = THREE.ConvolutionShader.buildKernel( sigma );
 
 	this.materialConvolution = new THREE.ShaderMaterial( {
 
@@ -85,16 +85,16 @@ THREE.BloomPass.prototype = Object.assign( Object.create( THREE.Pass.prototype )
 
 		this.quad.material = this.materialConvolution;
 
-		this.convolutionUniforms[ "tDiffuse" ] = new THREE.Uniform( readBuffer.texture );
-		this.convolutionUniforms[ "uImageIncrement" ] = new THREE.Uniform( THREE.BloomPass.blurX );
+		this.convolutionUniforms[ "tDiffuse" ].value = readBuffer.texture;
+		this.convolutionUniforms[ "uImageIncrement" ].value = THREE.BloomPass.blurX;
 
 		renderer.render( this.scene, this.camera, this.renderTargetX, true );
 
 
 		// Render quad with blured scene into texture (convolution pass 2)
 
-		this.convolutionUniforms[ "tDiffuse" ] = new THREE.Uniform( this.renderTargetX.texture );
-		this.convolutionUniforms[ "uImageIncrement" ] = new THREE.Uniform( THREE.BloomPass.blurY );
+		this.convolutionUniforms[ "tDiffuse" ].value = this.renderTargetX.texture;
+		this.convolutionUniforms[ "uImageIncrement" ].value = THREE.BloomPass.blurY;
 
 		renderer.render( this.scene, this.camera, this.renderTargetY, true );
 
@@ -102,7 +102,7 @@ THREE.BloomPass.prototype = Object.assign( Object.create( THREE.Pass.prototype )
 
 		this.quad.material = this.materialCopy;
 
-		this.copyUniforms[ "tDiffuse" ] = new THREE.Uniform( this.renderTargetY.texture );
+		this.copyUniforms[ "tDiffuse" ].value = this.renderTargetY.texture;
 
 		if ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST );
 

+ 1 - 1
examples/js/postprocessing/BokehPass.js

@@ -41,7 +41,7 @@ THREE.BokehPass = function ( scene, camera, params ) {
 	}
 
 	var bokehShader = THREE.BokehShader;
-	var bokehUniforms = Object.assign( {}, bokehShader.uniforms );
+	var bokehUniforms = THREE.UniformsUtils.clone( bokehShader.uniforms );
 
 	bokehUniforms[ "tDepth" ].value = this.renderTargetDepth.texture;
 

+ 1 - 1
examples/js/postprocessing/DotScreenPass.js

@@ -11,7 +11,7 @@ THREE.DotScreenPass = function ( center, angle, scale ) {
 
 	var shader = THREE.DotScreenShader;
 
-	this.uniforms = Object.assign( {}, shader.uniforms );
+	this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );
 
 	if ( center !== undefined ) this.uniforms[ "center" ].value.copy( center );
 	if ( angle !== undefined ) this.uniforms[ "angle" ].value = angle;

+ 5 - 8
examples/js/postprocessing/FilmPass.js

@@ -11,7 +11,7 @@ THREE.FilmPass = function ( noiseIntensity, scanlinesIntensity, scanlinesCount,
 
 	var shader = THREE.FilmShader;
 
-	this.uniforms = Object.assign( {}, shader.uniforms );
+	this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );
 
 	this.material = new THREE.ShaderMaterial( {
 
@@ -21,13 +21,10 @@ THREE.FilmPass = function ( noiseIntensity, scanlinesIntensity, scanlinesCount,
 
 	} );
 
-	this.uniforms[ "tDiffuse" ] = new THREE.Uniform();
-	this.uniforms[ "time" ] = new THREE.Uniform( 0 );
-
-	if ( grayscale !== undefined )	this.uniforms.grayscale = new THREE.Uniform( grayscale );
-	if ( noiseIntensity !== undefined ) this.uniforms.nIntensity = new THREE.Uniform( noiseIntensity );
-	if ( scanlinesIntensity !== undefined ) this.uniforms.sIntensity = new THREE.Uniform( scanlinesIntensity );
-	if ( scanlinesCount !== undefined ) this.uniforms.sCount = new THREE.Uniform( scanlinesCount );
+	if ( grayscale !== undefined )	this.uniforms.grayscale.value = grayscale;
+	if ( noiseIntensity !== undefined ) this.uniforms.nIntensity.value = noiseIntensity;
+	if ( scanlinesIntensity !== undefined ) this.uniforms.sIntensity.value = scanlinesIntensity;
+	if ( scanlinesCount !== undefined ) this.uniforms.sCount.value = scanlinesCount;
 
 	this.camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
 	this.scene  = new THREE.Scene();

+ 1 - 1
examples/js/postprocessing/GlitchPass.js

@@ -9,7 +9,7 @@ THREE.GlitchPass = function ( dt_size ) {
 	if ( THREE.DigitalGlitch === undefined ) console.error( "THREE.GlitchPass relies on THREE.DigitalGlitch" );
 
 	var shader = THREE.DigitalGlitch;
-	this.uniforms = Object.assign( {}, shader.uniforms );
+	this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );
 
 	if ( dt_size == undefined ) dt_size = 64;
 

+ 100 - 83
examples/js/postprocessing/OutlinePass.js

@@ -7,8 +7,8 @@ THREE.OutlinePass = function ( resolution, scene, camera, selectedObjects ) {
 	this.renderScene = scene;
 	this.renderCamera = camera;
 	this.selectedObjects = selectedObjects !== undefined ? selectedObjects : [];
-	this.visibleEdgeColor = new THREE.Color(1, 1, 1);
-	this.hiddenEdgeColor = new THREE.Color(0.1, 0.04, 0.02);
+	this.visibleEdgeColor = new THREE.Color( 1, 1, 1 );
+	this.hiddenEdgeColor = new THREE.Color( 0.1, 0.04, 0.02 );
 	this.edgeGlow = 0.0;
 	this.usePatternTexture = false;
 	this.edgeThickness = 1.0;
@@ -18,14 +18,14 @@ THREE.OutlinePass = function ( resolution, scene, camera, selectedObjects ) {
 
 	THREE.Pass.call( this );
 
-	this.resolution = ( resolution !== undefined ) ? new THREE.Vector2(resolution.x, resolution.y) : new THREE.Vector2(256, 256);
+	this.resolution = ( resolution !== undefined ) ? new THREE.Vector2( resolution.x, resolution.y ) : new THREE.Vector2( 256, 256 );
 
 	var pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat };
 
-	var resx = Math.round(this.resolution.x/this.downSampleRatio);
-	var resy = Math.round(this.resolution.y/this.downSampleRatio);
+	var resx = Math.round( this.resolution.x / this.downSampleRatio );
+	var resy = Math.round( this.resolution.y / this.downSampleRatio );
 
-	this.maskBufferMaterial = new THREE.MeshBasicMaterial({color:0xffffff});
+	this.maskBufferMaterial = new THREE.MeshBasicMaterial( { color: 0xffffff } );
 	this.maskBufferMaterial.side = THREE.DoubleSide;
 	this.renderTargetMaskBuffer = new THREE.WebGLRenderTarget( this.resolution.x, this.resolution.y, pars );
 	this.renderTargetMaskBuffer.texture.generateMipmaps = false;
@@ -46,24 +46,24 @@ THREE.OutlinePass = function ( resolution, scene, camera, selectedObjects ) {
 
 	this.renderTargetBlurBuffer1 = new THREE.WebGLRenderTarget( resx, resy, pars );
 	this.renderTargetBlurBuffer1.texture.generateMipmaps = false;
-	this.renderTargetBlurBuffer2 = new THREE.WebGLRenderTarget( Math.round(resx/2), Math.round(resy/2), pars );
+	this.renderTargetBlurBuffer2 = new THREE.WebGLRenderTarget( Math.round( resx / 2 ), Math.round( resy / 2 ), pars );
 	this.renderTargetBlurBuffer2.texture.generateMipmaps = false;
 
 	this.edgeDetectionMaterial = this.getEdgeDetectionMaterial();
 	this.renderTargetEdgeBuffer1 = new THREE.WebGLRenderTarget( resx, resy, pars );
 	this.renderTargetEdgeBuffer1.texture.generateMipmaps = false;
-	this.renderTargetEdgeBuffer2 = new THREE.WebGLRenderTarget( Math.round(resx/2), Math.round(resy/2), pars );
+	this.renderTargetEdgeBuffer2 = new THREE.WebGLRenderTarget( Math.round( resx / 2 ), Math.round( resy / 2 ), pars );
 	this.renderTargetEdgeBuffer2.texture.generateMipmaps = false;
 
 	var MAX_EDGE_THICKNESS = 4;
 	var MAX_EDGE_GLOW = 4;
 
-	this.separableBlurMaterial1 = this.getSeperableBlurMaterial(MAX_EDGE_THICKNESS);
-	this.separableBlurMaterial1.uniforms[ "texSize" ] = new THREE.Uniform( new THREE.Vector2(resx, resy) );
-	this.separableBlurMaterial1.uniforms[ "kernelRadius" ] = new THREE.Uniform( 1 );
-	this.separableBlurMaterial2 = this.getSeperableBlurMaterial(MAX_EDGE_GLOW);
-	this.separableBlurMaterial2.uniforms[ "texSize" ] = new THREE.Uniform(new THREE.Vector2(Math.round(resx/2), Math.round(resy/2) ) );
-	this.separableBlurMaterial2.uniforms[ "kernelRadius" ] = new THREE.Uniform( MAX_EDGE_GLOW) ;
+	this.separableBlurMaterial1 = this.getSeperableBlurMaterial( MAX_EDGE_THICKNESS );
+	this.separableBlurMaterial1.uniforms[ "texSize" ].value = new THREE.Vector2( resx, resy );
+	this.separableBlurMaterial1.uniforms[ "kernelRadius" ].value = 1;
+	this.separableBlurMaterial2 = this.getSeperableBlurMaterial( MAX_EDGE_GLOW );
+	this.separableBlurMaterial2.uniforms[ "texSize" ].value = new THREE.Vector2( Math.round( resx / 2 ), Math.round( resy / 2 ) );
+	this.separableBlurMaterial2.uniforms[ "kernelRadius" ].value = MAX_EDGE_GLOW;
 
 	// Overlay material
 	this.overlayMaterial = this.getOverlayMaterial();
@@ -74,7 +74,7 @@ THREE.OutlinePass = function ( resolution, scene, camera, selectedObjects ) {
 
 	var copyShader = THREE.CopyShader;
 
-	this.copyUniforms = Object.assign( {}, copyShader.uniforms );
+	this.copyUniforms = THREE.UniformsUtils.clone( copyShader.uniforms );
 	this.copyUniforms[ "opacity" ].value = 1.0;
 
 	this.materialCopy = new THREE.ShaderMaterial( {
@@ -94,7 +94,7 @@ THREE.OutlinePass = function ( resolution, scene, camera, selectedObjects ) {
 	this.oldClearAlpha = 1;
 
 	this.camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
-	this.scene  = new THREE.Scene();
+	this.scene = new THREE.Scene();
 
 	this.quad = new THREE.Mesh( new THREE.PlaneBufferGeometry( 2, 2 ), null );
 	this.scene.add( this.quad );
@@ -102,13 +102,15 @@ THREE.OutlinePass = function ( resolution, scene, camera, selectedObjects ) {
 	this.tempPulseColor1 = new THREE.Color();
 	this.tempPulseColor2 = new THREE.Color();
 	this.textureMatrix = new THREE.Matrix4();
+
 };
 
 THREE.OutlinePass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), {
 
 	constructor: THREE.OutlinePass,
 
-	dispose: function() {
+	dispose: function () {
+
 		this.renderTargetMaskBuffer.dispose();
 		this.renderTargetDepthBuffer.dispose();
 		this.renderTargetMaskDownSampleBuffer.dispose();
@@ -116,93 +118,102 @@ THREE.OutlinePass.prototype = Object.assign( Object.create( THREE.Pass.prototype
 		this.renderTargetBlurBuffer2.dispose();
 		this.renderTargetEdgeBuffer1.dispose();
 		this.renderTargetEdgeBuffer2.dispose();
+
 	},
 
 	setSize: function ( width, height ) {
 
-		this.renderTargetMaskBuffer.setSize(width, height );
+		this.renderTargetMaskBuffer.setSize( width, height );
 
-		var resx = Math.round(width/this.downSampleRatio);
-		var resy = Math.round(height/this.downSampleRatio);
-		this.renderTargetMaskDownSampleBuffer.setSize(resx, resy );
-		this.renderTargetBlurBuffer1.setSize(resx, resy );
-		this.renderTargetEdgeBuffer1.setSize(resx, resy );
-		this.separableBlurMaterial1.uniforms[ "texSize" ] = new THREE.Uniform( new THREE.Vector2(resx, resy) );
+		var resx = Math.round( width / this.downSampleRatio );
+		var resy = Math.round( height / this.downSampleRatio );
+		this.renderTargetMaskDownSampleBuffer.setSize( resx, resy );
+		this.renderTargetBlurBuffer1.setSize( resx, resy );
+		this.renderTargetEdgeBuffer1.setSize( resx, resy );
+		this.separableBlurMaterial1.uniforms[ "texSize" ].value = new THREE.Vector2( resx, resy );
 
-		resx = Math.round(resx/2);
-		resy = Math.round(resy/2);
+		resx = Math.round( resx / 2 );
+		resy = Math.round( resy / 2 );
 
-		this.renderTargetBlurBuffer2.setSize(resx, resy );
-		this.renderTargetEdgeBuffer2.setSize(resx, resy );
+		this.renderTargetBlurBuffer2.setSize( resx, resy );
+		this.renderTargetEdgeBuffer2.setSize( resx, resy );
+
+		this.separableBlurMaterial2.uniforms[ "texSize" ].value = new THREE.Vector2( resx, resy );
 
-		this.separableBlurMaterial2.uniforms[ "texSize" ] = new THREE.Uniform( new THREE.Vector2(resx, resy) );
 	},
 
-	changeVisibilityOfSelectedObjects: function( bVisible ) {
+	changeVisibilityOfSelectedObjects: function ( bVisible ) {
 
-		var gatherSelectedMeshesCallBack = function( object ) {
+		function gatherSelectedMeshesCallBack( object ) {
 
-			if( object instanceof THREE.Mesh ) {
-				object.visible = bVisible;
-			}
-		};
+			if ( object instanceof THREE.Mesh ) object.visible = bVisible;
 
-		for( var i=0; i<this.selectedObjects.length; i++ ) {
+		}
 
-			var selectedObject = this.selectedObjects[i];
+		for ( var i = 0; i < this.selectedObjects.length; i ++ ) {
 
+			var selectedObject = this.selectedObjects[ i ];
 			selectedObject.traverse( gatherSelectedMeshesCallBack );
+
 		}
+
 	},
 
-	changeVisibilityOfNonSelectedObjects: function( bVisible ) {
+	changeVisibilityOfNonSelectedObjects: function ( bVisible ) {
 
 		var selectedMeshes = [];
 
-		var gatherSelectedMeshesCallBack = function( object ) {
-
-			if( object instanceof THREE.Mesh ) {
+		function gatherSelectedMeshesCallBack( object ) {
 
-				selectedMeshes.push(object);
+			if ( object instanceof THREE.Mesh ) selectedMeshes.push( object );
 
-			}
-		};
-
-		for( var i=0; i<this.selectedObjects.length; i++ ) {
+		}
 
-			var selectedObject = this.selectedObjects[i];
+		for ( var i = 0; i < this.selectedObjects.length; i ++ ) {
 
+			var selectedObject = this.selectedObjects[ i ];
 			selectedObject.traverse( gatherSelectedMeshesCallBack );
+
 		}
 
-		var VisibilityChangeCallBack = function( object ) {
+		function VisibilityChangeCallBack( object ) {
 
-			if( object instanceof THREE.Mesh ) {
+			if ( object instanceof THREE.Mesh ) {
 
 				var bFound = false;
 
-				for( var i=0; i<selectedMeshes.length; i++ ) {
+				for ( var i = 0; i < selectedMeshes.length; i ++ ) {
+
+					var selectedObjectId = selectedMeshes[ i ].id;
 
-					var selectedObjectId = selectedMeshes[i].id;
+					if ( selectedObjectId === object.id ) {
 
-					if(selectedObjectId === object.id) {
 						bFound = true;
 						break;
+
 					}
 
 				}
-				if(!bFound) {
+
+				if ( ! bFound ) {
+
 					var visibility = object.visible;
-					if( !bVisible || object.bVisible )
-						object.visible = bVisible;
+
+					if ( ! bVisible || object.bVisible ) object.visible = bVisible;
+
 					object.bVisible = visibility;
+
 				}
+
 			}
-		};
+
+		}
+
 		this.renderScene.traverse( VisibilityChangeCallBack );
+
 	},
 
-	updateTextureMatrix: function() {
+	updateTextureMatrix: function () {
 
 		this.textureMatrix.set( 0.5, 0.0, 0.0, 0.5,
 														0.0, 0.5, 0.0, 0.5,
@@ -215,8 +226,7 @@ THREE.OutlinePass.prototype = Object.assign( Object.create( THREE.Pass.prototype
 
 	render: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {
 
-		if(this.selectedObjects.length === 0 )
-			return;
+		if ( this.selectedObjects.length === 0 ) return;
 
 		this.oldClearColor.copy( renderer.getClearColor() );
 		this.oldClearAlpha = renderer.getClearAlpha();
@@ -229,27 +239,27 @@ THREE.OutlinePass.prototype = Object.assign( Object.create( THREE.Pass.prototype
 		renderer.setClearColor( 0xffffff, 1 );
 
 		// Make selected objects invisible
-		this.changeVisibilityOfSelectedObjects(false);
+		this.changeVisibilityOfSelectedObjects( false );
 
 		// 1. Draw Non Selected objects in the depth buffer
 		this.renderScene.overrideMaterial = this.depthMaterial;
 		renderer.render( this.renderScene, this.renderCamera, this.renderTargetDepthBuffer, true );
 
 		// Make selected objects visible
-		this.changeVisibilityOfSelectedObjects(true);
+		this.changeVisibilityOfSelectedObjects( true );
 
 		// Update Texture Matrix for Depth compare
 		this.updateTextureMatrix();
 
 		// Make non selected objects invisible, and draw only the selected objects, by comparing the depth buffer of non selected objects
-		this.changeVisibilityOfNonSelectedObjects(false);
+		this.changeVisibilityOfNonSelectedObjects( false );
 		this.renderScene.overrideMaterial = this.prepareMaskMaterial;
-		this.prepareMaskMaterial.uniforms[ "cameraNearFar" ].value = new THREE.Vector2(this.renderCamera.near, this.renderCamera.far);
+		this.prepareMaskMaterial.uniforms[ "cameraNearFar" ].value = new THREE.Vector2( this.renderCamera.near, this.renderCamera.far );
 		this.prepareMaskMaterial.uniforms[ "depthTexture" ].value = this.renderTargetDepthBuffer.texture;
 		this.prepareMaskMaterial.uniforms[ "textureMatrix" ].value = this.textureMatrix;
 		renderer.render( this.renderScene, this.renderCamera, this.renderTargetMaskBuffer, true );
 		this.renderScene.overrideMaterial = null;
-		this.changeVisibilityOfNonSelectedObjects(true);
+		this.changeVisibilityOfNonSelectedObjects( true );
 
 		// 2. Downsample to Half resolution
 		this.quad.material = this.materialCopy;
@@ -258,16 +268,19 @@ THREE.OutlinePass.prototype = Object.assign( Object.create( THREE.Pass.prototype
 
 		this.tempPulseColor1.copy( this.visibleEdgeColor );
 		this.tempPulseColor2.copy( this.hiddenEdgeColor );
-		if( this.pulsePeriod > 0 ) {
-			var scalar = ( 1 + 0.25 ) / 2 + Math.cos( performance.now() * 0.01/ this.pulsePeriod ) * ( 1.0 - 0.25 )/2;
+
+		if ( this.pulsePeriod > 0 ) {
+
+			var scalar = ( 1 + 0.25 ) / 2 + Math.cos( performance.now() * 0.01 / this.pulsePeriod ) * ( 1.0 - 0.25 ) / 2;
 			this.tempPulseColor1.multiplyScalar( scalar );
 			this.tempPulseColor2.multiplyScalar( scalar );
+
 		}
 
 		// 3. Apply Edge Detection Pass
 		this.quad.material = this.edgeDetectionMaterial;
 		this.edgeDetectionMaterial.uniforms[ "maskTexture" ].value = this.renderTargetMaskDownSampleBuffer.texture;
-		this.edgeDetectionMaterial.uniforms[ "texSize" ].value = new THREE.Vector2(this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height);
+		this.edgeDetectionMaterial.uniforms[ "texSize" ].value = new THREE.Vector2( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height );
 		this.edgeDetectionMaterial.uniforms[ "visibleEdgeColor" ].value = this.tempPulseColor1;
 		this.edgeDetectionMaterial.uniforms[ "hiddenEdgeColor" ].value = this.tempPulseColor2;
 		renderer.render( this.scene, this.camera, this.renderTargetEdgeBuffer1, true );
@@ -308,16 +321,17 @@ THREE.OutlinePass.prototype = Object.assign( Object.create( THREE.Pass.prototype
 
 		renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );
 		renderer.autoClear = oldAutoClear;
+
 	},
 
-	getPrepareMaskMaterial: function() {
+	getPrepareMaskMaterial: function () {
 
 		return new THREE.ShaderMaterial( {
 
 			uniforms: {
 				"depthTexture": { value: null },
 				"cameraNearFar": { value: new THREE.Vector2( 0.5, 0.5 ) },
-				"textureMatrix" : { value: new THREE.Matrix4() }
+				"textureMatrix": { value: new THREE.Matrix4() }
 			},
 
 			vertexShader:
@@ -348,9 +362,10 @@ THREE.OutlinePass.prototype = Object.assign( Object.create( THREE.Pass.prototype
 					gl_FragColor = vec4(0.0, depthTest, 1.0, 1.0);\
 				}"
 		} );
+
 	},
 
-	getEdgeDetectionMaterial: function() {
+	getEdgeDetectionMaterial: function () {
 
 		return new THREE.ShaderMaterial( {
 
@@ -358,7 +373,7 @@ THREE.OutlinePass.prototype = Object.assign( Object.create( THREE.Pass.prototype
 				"maskTexture": { value: null },
 				"texSize": { value: new THREE.Vector2( 0.5, 0.5 ) },
 				"visibleEdgeColor": { value: new THREE.Vector3( 1.0, 1.0, 1.0 ) },
-				"hiddenEdgeColor":  { value: new THREE.Vector3( 1.0, 1.0, 1.0 ) }
+				"hiddenEdgeColor": { value: new THREE.Vector3( 1.0, 1.0, 1.0 ) },
 			},
 
 			vertexShader:
@@ -392,19 +407,20 @@ THREE.OutlinePass.prototype = Object.assign( Object.create( THREE.Pass.prototype
 					gl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\
 				}"
 		} );
+
 	},
 
-	getSeperableBlurMaterial: function(maxRadius) {
+	getSeperableBlurMaterial: function ( maxRadius ) {
 
 		return new THREE.ShaderMaterial( {
 
 			defines: {
-				"MAX_RADIUS" : maxRadius
+				"MAX_RADIUS": maxRadius,
 			},
 
 			uniforms: {
 				"colorTexture": { value: null },
-				"texSize": 	{ value: new THREE.Vector2( 0.5, 0.5 ) },
+				"texSize": { value: new THREE.Vector2( 0.5, 0.5 ) },
 				"direction": { value: new THREE.Vector2( 0.5, 0.5 ) },
 				"kernelRadius": { value: 1.0 }
 			},
@@ -444,9 +460,10 @@ THREE.OutlinePass.prototype = Object.assign( Object.create( THREE.Pass.prototype
 					gl_FragColor = vec4(diffuseSum/weightSum, 1.0);\
 				}"
 		} );
+
 	},
 
-	getOverlayMaterial: function() {
+	getOverlayMaterial: function () {
 
 		return new THREE.ShaderMaterial( {
 
@@ -455,9 +472,9 @@ THREE.OutlinePass.prototype = Object.assign( Object.create( THREE.Pass.prototype
 				"edgeTexture1": { value: null },
 				"edgeTexture2": { value: null },
 				"patternTexture": { value: null },
-				"edgeStrength" : { value: 1.0 },
-				"edgeGlow" : { value: 1.0 },
-				"usePatternTexture" : { value: 0.0 }
+				"edgeStrength": { value: 1.0 },
+				"edgeGlow": { value: 1.0 },
+				"usePatternTexture": { value: 0.0 }
 			},
 
 			vertexShader:
@@ -489,12 +506,12 @@ THREE.OutlinePass.prototype = Object.assign( Object.create( THREE.Pass.prototype
 						finalColor += + visibilityFactor * (1.0 - maskColor.r) * (1.0 - patternColor.r);\
 					gl_FragColor = finalColor;\
 				}",
-
-				blending: THREE.AdditiveBlending,
-				depthTest: false,
-				depthWrite: false,
-				transparent: true
+			blending: THREE.AdditiveBlending,
+			depthTest: false,
+			depthWrite: false,
+			transparent: true
 		} );
+
 	}
 
 } );

+ 3 - 3
examples/js/postprocessing/SMAAPass.js

@@ -54,7 +54,7 @@ THREE.SMAAPass = function ( width, height ) {
 		console.error( "THREE.SMAAPass relies on THREE.SMAAShader" );
 	}
 
-	this.uniformsEdges = Object.assign( {}, THREE.SMAAShader[0].uniforms );
+	this.uniformsEdges = THREE.UniformsUtils.clone( THREE.SMAAShader[0].uniforms );
 
 	this.uniformsEdges[ "resolution" ].value.set( 1 / width, 1 / height );
 
@@ -67,7 +67,7 @@ THREE.SMAAPass = function ( width, height ) {
 
 	// materials - pass 2
 
-	this.uniformsWeights = Object.assign( {}, THREE.SMAAShader[1].uniforms );
+	this.uniformsWeights = THREE.UniformsUtils.clone( THREE.SMAAShader[1].uniforms );
 
 	this.uniformsWeights[ "resolution" ].value.set( 1 / width, 1 / height );
 	this.uniformsWeights[ "tDiffuse" ].value = this.edgesRT.texture;
@@ -83,7 +83,7 @@ THREE.SMAAPass = function ( width, height ) {
 
 	// materials - pass 3
 
-	this.uniformsBlend = Object.assign( {}, THREE.SMAAShader[2].uniforms );
+	this.uniformsBlend = THREE.UniformsUtils.clone( THREE.SMAAShader[2].uniforms );
 
 	this.uniformsBlend[ "resolution" ].value.set( 1 / width, 1 / height );
 	this.uniformsBlend[ "tDiffuse" ].value = this.weightsRT.texture;

+ 3 - 3
examples/js/postprocessing/SSAARenderPass.js

@@ -27,7 +27,7 @@ THREE.SSAARenderPass = function ( scene, camera, clearColor, clearAlpha ) {
 	if ( THREE.CopyShader === undefined ) console.error( "THREE.SSAARenderPass relies on THREE.CopyShader" );
 
 	var copyShader = THREE.CopyShader;
-	this.copyUniforms = Object.assign( {}, copyShader.uniforms );
+	this.copyUniforms = THREE.UniformsUtils.clone( copyShader.uniforms );
 
 	this.copyMaterial = new THREE.ShaderMaterial(	{
 		uniforms: this.copyUniforms,
@@ -87,7 +87,7 @@ THREE.SSAARenderPass.prototype = Object.assign( Object.create( THREE.Pass.protot
 
 		var baseSampleWeight = 1.0 / jitterOffsets.length;
 		var roundingRange = 1 / 32;
-		this.copyUniforms[ "tDiffuse" ] = new THREE.Uniform( this.sampleRenderTarget.texture );
+		this.copyUniforms[ "tDiffuse" ].value = this.sampleRenderTarget.texture;
 
 		var width = readBuffer.width, height = readBuffer.height;
 
@@ -110,7 +110,7 @@ THREE.SSAARenderPass.prototype = Object.assign( Object.create( THREE.Pass.protot
 				sampleWeight += roundingRange * uniformCenteredDistribution;
 			}
 
-			this.copyUniforms[ "opacity" ] = new THREE.Uniform( sampleWeight );
+			this.copyUniforms[ "opacity" ].value = sampleWeight;
 			renderer.setClearColor( this.clearColor, this.clearAlpha );
 			renderer.render( this.scene, this.camera, this.sampleRenderTarget, true );
 			if (i === 0) {

+ 1 - 1
examples/js/postprocessing/SavePass.js

@@ -13,7 +13,7 @@ THREE.SavePass = function ( renderTarget ) {
 
 	this.textureID = "tDiffuse";
 
-	this.uniforms = Object.assign( {}, shader.uniforms );
+	this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );
 
 	this.material = new THREE.ShaderMaterial( {
 

+ 2 - 2
examples/js/postprocessing/ShaderPass.js

@@ -16,7 +16,7 @@ THREE.ShaderPass = function ( shader, textureID ) {
 
 	} else if ( shader ) {
 
-		this.uniforms = Object.assign( {}, shader.uniforms );
+		this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );
 
 		this.material = new THREE.ShaderMaterial( {
 
@@ -45,7 +45,7 @@ THREE.ShaderPass.prototype = Object.assign( Object.create( THREE.Pass.prototype
 
 		if ( this.uniforms[ this.textureID ] ) {
 
-			this.uniforms[ this.textureID ] = new THREE.Uniform( readBuffer.texture );
+			this.uniforms[ this.textureID ].value = readBuffer.texture;
 
 		}
 

+ 3 - 3
examples/js/postprocessing/TexturePass.js

@@ -14,7 +14,7 @@ THREE.TexturePass = function ( map, opacity ) {
 	this.map = map;
 	this.opacity = ( opacity !== undefined ) ? opacity : 1.0;
 
-	this.uniforms = Object.assign( {}, shader.uniforms );
+	this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );
 
 	this.material = new THREE.ShaderMaterial( {
 
@@ -47,8 +47,8 @@ THREE.TexturePass.prototype = Object.assign( Object.create( THREE.Pass.prototype
 
 		this.quad.material = this.material;
 
-		this.uniforms[ "opacity" ] = new THREE.Uniform( this.opacity );
-		this.uniforms[ "tDiffuse" ] = new THREE.Uniform( this.map );
+		this.uniforms[ "opacity" ].value = this.opacity;
+		this.uniforms[ "tDiffuse" ].value = this.map;
 		this.material.transparent = ( this.opacity < 1.0 );
 
 		renderer.render( this.scene, this.camera, this.renderToScreen ? null : readBuffer, this.clear );

+ 2 - 2
examples/js/postprocessing/UnrealBloomPass.js

@@ -49,7 +49,7 @@ THREE.UnrealBloomPass = function ( resolution, strength, radius, threshold ) {
 		console.error( "THREE.UnrealBloomPass relies on THREE.LuminosityHighPassShader" );
 
 	var highPassShader = THREE.LuminosityHighPassShader;
-	this.highPassUniforms = Object.assign( {}, highPassShader.uniforms );
+	this.highPassUniforms = THREE.UniformsUtils.clone( highPassShader.uniforms );
 
 	this.highPassUniforms[ "luminosityThreshold" ].value = threshold;
 	this.highPassUniforms[ "smoothWidth" ].value = 0.01;
@@ -101,7 +101,7 @@ THREE.UnrealBloomPass = function ( resolution, strength, radius, threshold ) {
 
 	var copyShader = THREE.CopyShader;
 
-	this.copyUniforms = Object.assign( {}, copyShader.uniforms );
+	this.copyUniforms = THREE.UniformsUtils.clone( copyShader.uniforms );
 	this.copyUniforms[ "opacity" ].value = 1.0;
 
 	this.materialCopy = new THREE.ShaderMaterial( {

+ 2 - 2
examples/js/renderers/WebGLDeferredRenderer.js

@@ -370,7 +370,7 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 
 		if ( object.material === undefined ) return;
 
-		var originalMaterial = _originalMaterialsTable[ object.uuid ]
+		var originalMaterial = _originalMaterialsTable[ object.uuid ];
 		var material = getNormalDepthMaterial( originalMaterial );
 
 		_originalMaterialsTable[ material.uuid ] = originalMaterial;
@@ -451,7 +451,7 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 
 		if ( object.material === undefined ) return;
 
-		var originalMaterial = _originalMaterialsTable[ object.uuid ]
+		var originalMaterial = _originalMaterialsTable[ object.uuid ];
 		var material = getColorMaterial( originalMaterial );
 
 		_originalMaterialsTable[ material.uuid ] = originalMaterial;

+ 1 - 1
examples/js/utils/ShadowMapViewer.js

@@ -49,7 +49,7 @@ THREE.ShadowMapViewer = function ( light ) {
 	//HUD for shadow map
 	var shader = THREE.UnpackDepthRGBAShader;
 
-	var uniforms = Object.assign( {}, shader.uniforms );
+	var uniforms = new THREE.UniformsUtils.clone( shader.uniforms );
 	var material = new THREE.ShaderMaterial( {
 		uniforms: uniforms,
 		vertexShader: shader.vertexShader,

+ 4 - 6
examples/webgl_gpgpu_water.html

@@ -339,14 +339,12 @@
 
 				// material: make a ShaderMaterial clone of MeshPhongMaterial, with customized vertex shader
 				var material = new THREE.ShaderMaterial( {
-					uniforms: Object.assign(
-
+					uniforms: THREE.UniformsUtils.merge( [
+						THREE.ShaderLib[ 'phong' ].uniforms,
 						{
 							heightmap: { value: null }
-						},
-
-						THREE.ShaderLib[ 'phong' ].uniforms
-					),
+						}
+					] ),
 					vertexShader: document.getElementById( 'waterVertexShader' ).textContent,
 					fragmentShader: THREE.ShaderChunk[ 'meshphong_frag' ]
 

+ 1 - 1
examples/webgl_marchingcubes.html

@@ -383,7 +383,7 @@
 
 			var shader = THREE.ShaderToon[ id ];
 
-			var u = Object.assign( {}, shader.uniforms );
+			var u = THREE.UniformsUtils.clone( shader.uniforms );
 
 			var vs = shader.vertexShader;
 			var fs = shader.fragmentShader;

+ 1 - 1
examples/webgl_materials_bumpmap_skin.html

@@ -211,7 +211,7 @@
 				var fragmentShader = shader.fragmentShader;
 				var vertexShader = shader.vertexShader;
 
-				var uniforms = Object.assign( {}, shader.uniforms );
+				var uniforms = THREE.UniformsUtils.clone( shader.uniforms );
 
 				uniforms[ "enableBump" ].value = true;
 				uniforms[ "enableSpecular" ].value = true;

+ 1 - 1
examples/webgl_materials_parallaxmap.html

@@ -138,7 +138,7 @@
 			function initScene() {
 
 				var shader = THREE.ParallaxShader;
-				var uniforms = Object.assign( {}, shader.uniforms );
+				var uniforms = THREE.UniformsUtils.clone( shader.uniforms );
 				var parameters = {
 					fragmentShader: shader.fragmentShader,
 					vertexShader: shader.vertexShader,

+ 1 - 1
examples/webgl_materials_shaders_fresnel.html

@@ -92,7 +92,7 @@
 				var geometry = new THREE.SphereGeometry( 100, 32, 16 );
 
 				var shader = THREE.FresnelShader;
-				var uniforms = Object.assign( {}, shader.uniforms );
+				var uniforms = THREE.UniformsUtils.clone( shader.uniforms );
 
 				uniforms[ "tCube" ].value = textureCube;
 

+ 11 - 10
examples/webgl_materials_skin.html

@@ -115,7 +115,7 @@
 
 				var shader = THREE.ShaderSkin[ "skin" ];
 
-				var uniformsUV = Object.assign( {}, shader.uniforms );
+				var uniformsUV = THREE.UniformsUtils.clone( shader.uniforms );
 
 				var textureLoader = new THREE.TextureLoader();
 
@@ -133,10 +133,11 @@
 				uniformsUV[ "uSpecularBrightness" ].value = 0.7;
 
 
-				var uniforms = Object.assign( {}, uniformsUV );
-				uniforms[ "tDiffuse" ] = new THREE.Uniform( uniformsUV[ "tDiffuse" ].value );
-				uniforms[ "tNormal" ] = new THREE.Uniform( uniformsUV[ "tNormal" ].value );
-				uniforms[ "passID" ] = new THREE.Uniform( 1 );
+				var uniforms = THREE.UniformsUtils.clone( uniformsUV );
+				uniforms[ "tDiffuse" ].value = uniformsUV[ "tDiffuse" ].value;
+				uniforms[ "tNormal" ].value = uniformsUV[ "tNormal" ].value;
+				uniforms[ "passID" ].value = 1;
+
 
 				var parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true };
 				var parametersUV = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShaderUV, uniforms: uniformsUV, lights: true };
@@ -235,12 +236,12 @@
 
 				//
 
-				uniforms[ "tBlur1" ] = new THREE.Uniform( composerScene.renderTarget2.texture );
-				uniforms[ "tBlur2" ] = new THREE.Uniform( composerUV1.renderTarget2.texture );
-				uniforms[ "tBlur3" ] = new THREE.Uniform( composerUV2.renderTarget2.texture );
-				uniforms[ "tBlur4" ] = new THREE.Uniform( composerUV3.renderTarget2.texture );
+				uniforms[ "tBlur1" ].value = composerScene.renderTarget2.texture;
+				uniforms[ "tBlur2" ].value = composerUV1.renderTarget2.texture;
+				uniforms[ "tBlur3" ].value = composerUV2.renderTarget2.texture;
+				uniforms[ "tBlur4" ].value = composerUV3.renderTarget2.texture;
 
-				uniforms[ "tBeckmann" ] = new THREE.Uniform( composerBeckmann.renderTarget1.texture );
+				uniforms[ "tBeckmann" ].value = composerBeckmann.renderTarget1.texture;
 
 				//
 

+ 1 - 1
examples/webgl_postprocessing_dof2.html

@@ -402,7 +402,7 @@ Use WEBGL Depth buffer support?
 
 				var bokeh_shader = THREE.BokehShader;
 
-				postprocessing.bokeh_uniforms = Object.assign( {}, bokeh_shader.uniforms );
+				postprocessing.bokeh_uniforms = THREE.UniformsUtils.clone( bokeh_shader.uniforms );
 
 				postprocessing.bokeh_uniforms[ "tColor" ].value = postprocessing.rtTextureColor.texture;
 				postprocessing.bokeh_uniforms[ "tDepth" ].value = postprocessing.rtTextureDepth.texture;

+ 3 - 3
examples/webgl_postprocessing_godrays.html

@@ -203,7 +203,7 @@
 				// god-ray shaders
 
 				var godraysGenShader = THREE.ShaderGodRays[ "godrays_generate" ];
-				postprocessing.godrayGenUniforms = Object.assign( {}, godraysGenShader.uniforms );
+				postprocessing.godrayGenUniforms = THREE.UniformsUtils.clone( godraysGenShader.uniforms );
 				postprocessing.materialGodraysGenerate = new THREE.ShaderMaterial( {
 
 					uniforms: postprocessing.godrayGenUniforms,
@@ -213,7 +213,7 @@
 				} );
 
 				var godraysCombineShader = THREE.ShaderGodRays[ "godrays_combine" ];
-				postprocessing.godrayCombineUniforms = Object.assign( {}, godraysCombineShader.uniforms );
+				postprocessing.godrayCombineUniforms = THREE.UniformsUtils.clone( godraysCombineShader.uniforms );
 				postprocessing.materialGodraysCombine = new THREE.ShaderMaterial( {
 
 					uniforms: postprocessing.godrayCombineUniforms,
@@ -223,7 +223,7 @@
 				} );
 
 				var godraysFakeSunShader = THREE.ShaderGodRays[ "godrays_fake_sun" ];
-				postprocessing.godraysFakeSunUniforms = Object.assign( {}, godraysFakeSunShader.uniforms );
+				postprocessing.godraysFakeSunUniforms = THREE.UniformsUtils.clone( godraysFakeSunShader.uniforms );
 				postprocessing.materialGodraysFakeSun = new THREE.ShaderMaterial( {
 
 					uniforms: postprocessing.godraysFakeSunUniforms,

+ 2 - 2
examples/webgl_shaders_tonemapping.html

@@ -135,12 +135,12 @@
 					// blending: THREE.AdditiveBlending,
 					transparent: true,
 					lights: true,
-					uniforms: Object.assign( {},
+					uniforms: THREE.UniformsUtils.merge( [
 
 						THREE.UniformsLib[ "common" ],
 						THREE.UniformsLib[ "lights" ]
 
-					),
+					] ),
 					vertexShader: [
 						"varying vec3 vViewPosition;",
 						"varying vec3 vNormal;",

+ 2 - 2
examples/webgl_terrain_dynamic.html

@@ -304,7 +304,7 @@
 
 				};
 
-				uniformsNormal = Object.assign( {}, normalShader.uniforms );
+				uniformsNormal = THREE.UniformsUtils.clone( normalShader.uniforms );
 
 				uniformsNormal.height.value = 0.05;
 				uniformsNormal.resolution.value.set( rx, ry );
@@ -335,7 +335,7 @@
 
 				var terrainShader = THREE.ShaderTerrain[ "terrain" ];
 
-				uniformsTerrain = Object.assign( {}, terrainShader.uniforms );
+				uniformsTerrain = THREE.UniformsUtils.clone( terrainShader.uniforms );
 
 				uniformsTerrain[ 'tNormal' ].value = normalMap.texture;
 				uniformsTerrain[ 'uNormalScale' ].value = 3.5;

+ 0 - 65
src/Three.Legacy.js

@@ -1298,71 +1298,6 @@ export var ImageUtils = {
 
 };
 
-export var UniformsUtils = {
-
-	merge: function ( uniforms ) {
-
-		console.warn( 'THREE.UniformsUtils.merge() has been deprecated. Use Object.assign() instead.' );
-
-		var merged = {};
-
-		for ( var u = 0; u < uniforms.length; u ++ ) {
-
-			var tmp = this.clone( uniforms[ u ] );
-
-			for ( var p in tmp ) {
-
-				merged[ p ] = tmp[ p ];
-
-			}
-
-		}
-
-		return merged;
-
-	},
-
-	clone: function ( uniforms_src ) {
-
-		console.warn( 'THREE.UniformsUtils.clone() has been deprecated.' );
-
-		var uniforms_dst = {};
-
-		for ( var u in uniforms_src ) {
-
-			uniforms_dst[ u ] = {};
-
-			for ( var p in uniforms_src[ u ] ) {
-
-				var parameter_src = uniforms_src[ u ][ p ];
-
-				if ( parameter_src && ( parameter_src.isColor ||
-					parameter_src.isMatrix3 || parameter_src.isMatrix4 ||
-					parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||
-					parameter_src.isTexture ) ) {
-
-					uniforms_dst[ u ][ p ] = parameter_src.clone();
-
-				} else if ( Array.isArray( parameter_src ) ) {
-
-					uniforms_dst[ u ][ p ] = parameter_src.slice();
-
-				} else {
-
-					uniforms_dst[ u ][ p ] = parameter_src;
-
-				}
-
-			}
-
-		}
-
-		return uniforms_dst;
-
-	}
-
-};
-
 //
 
 export function Projector() {

+ 1 - 0
src/Three.js

@@ -6,6 +6,7 @@ export { WebGLRenderer } from './renderers/WebGLRenderer.js';
 // export { WebGL2Renderer } from './renderers/WebGL2Renderer.js';
 export { ShaderLib } from './renderers/shaders/ShaderLib.js';
 export { UniformsLib } from './renderers/shaders/UniformsLib.js';
+export { UniformsUtils } from './renderers/shaders/UniformsUtils.js';
 export { ShaderChunk } from './renderers/shaders/ShaderChunk.js';
 export { FogExp2 } from './scenes/FogExp2.js';
 export { Fog } from './scenes/Fog.js';

+ 2 - 1
src/materials/ShaderMaterial.js

@@ -1,4 +1,5 @@
 import { Material } from './Material';
+import { UniformsUtils } from '../renderers/shaders/UniformsUtils';
 
 /**
  * @author alteredq / http://alteredqualia.com/
@@ -89,7 +90,7 @@ ShaderMaterial.prototype.copy = function ( source ) {
 	this.fragmentShader = source.fragmentShader;
 	this.vertexShader = source.vertexShader;
 
-	this.uniforms = Object.assign( {}, source.uniforms );
+	this.uniforms = UniformsUtils.clone( source.uniforms );
 
 	this.defines = source.defines;
 

+ 3 - 2
src/materials/ShadowMaterial.js

@@ -1,6 +1,7 @@
 import { ShaderMaterial } from './ShaderMaterial';
 import { ShaderChunk } from '../renderers/shaders/ShaderChunk';
 import { UniformsLib } from '../renderers/shaders/UniformsLib';
+import { UniformsUtils } from '../renderers/shaders/UniformsUtils';
 
 /**
  * @author mrdoob / http://mrdoob.com/
@@ -9,12 +10,12 @@ import { UniformsLib } from '../renderers/shaders/UniformsLib';
 function ShadowMaterial() {
 
 	ShaderMaterial.call( this, {
-		uniforms: Object.assign( {},
+		uniforms: UniformsUtils.merge( [
 			UniformsLib.lights,
 			{
 				opacity: { value: 1.0 }
 			}
-		),
+		] ),
 		vertexShader: ShaderChunk[ 'shadow_vert' ],
 		fragmentShader: ShaderChunk[ 'shadow_frag' ]
 	} );

+ 4 - 3
src/renderers/WebGLRenderer.js

@@ -1,6 +1,7 @@
 import { REVISION, MaxEquation, MinEquation, RGB_ETC1_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT5_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT1_Format, RGB_S3TC_DXT1_Format, SrcAlphaSaturateFactor, OneMinusDstColorFactor, DstColorFactor, OneMinusDstAlphaFactor, DstAlphaFactor, OneMinusSrcAlphaFactor, SrcAlphaFactor, OneMinusSrcColorFactor, SrcColorFactor, OneFactor, ZeroFactor, ReverseSubtractEquation, SubtractEquation, AddEquation, DepthFormat, DepthStencilFormat, LuminanceAlphaFormat, LuminanceFormat, RGBAFormat, RGBFormat, AlphaFormat, HalfFloatType, FloatType, UnsignedIntType, IntType, UnsignedShortType, ShortType, ByteType, UnsignedInt248Type, UnsignedShort565Type, UnsignedShort5551Type, UnsignedShort4444Type, UnsignedByteType, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestFilter, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, FrontFaceDirectionCW, NoBlending, BackSide, DoubleSide, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, NoColors, FlatShading, LinearToneMapping } from '../constants';
 import { Matrix4 } from '../math/Matrix4';
 import { WebGLUniforms } from './webgl/WebGLUniforms';
+import { UniformsUtils } from './shaders/UniformsUtils';
 import { ShaderLib } from './shaders/ShaderLib';
 import { LensFlarePlugin } from './webgl/plugins/LensFlarePlugin';
 import { SpritePlugin } from './webgl/plugins/SpritePlugin';
@@ -162,7 +163,7 @@ function WebGLRenderer( parameters ) {
 		_projScreenMatrix = new Matrix4(),
 
 		_vector3 = new Vector3(),
-		_matrix4 = new Matrix4(), 
+		_matrix4 = new Matrix4(),
 		_matrix42 = new Matrix4(),
 
 		// light arrays cache
@@ -1536,7 +1537,7 @@ function WebGLRenderer( parameters ) {
 
 				materialProperties.__webglShader = {
 					name: material.type,
-					uniforms: Object.assign( {}, shader.uniforms ),
+					uniforms: UniformsUtils.clone( shader.uniforms ),
 					vertexShader: shader.vertexShader,
 					fragmentShader: shader.fragmentShader
 				};
@@ -2835,4 +2836,4 @@ function WebGLRenderer( parameters ) {
 
 }
 
-export { WebGLRenderer };
+export { WebGLRenderer };

+ 25 - 24
src/renderers/shaders/ShaderLib.js

@@ -1,4 +1,5 @@
 import { ShaderChunk } from './ShaderChunk';
+import { UniformsUtils } from './UniformsUtils';
 import { Vector3 } from '../../math/Vector3';
 import { UniformsLib } from './UniformsLib';
 import { Color } from '../../math/Color';
@@ -13,12 +14,12 @@ var ShaderLib = {
 
 	basic: {
 
-		uniforms: Object.assign( {},
+		uniforms: UniformsUtils.merge( [
 			UniformsLib.common,
 			UniformsLib.aomap,
 			UniformsLib.lightmap,
 			UniformsLib.fog
-		),
+		] ),
 
 		vertexShader: ShaderChunk.meshbasic_vert,
 		fragmentShader: ShaderChunk.meshbasic_frag
@@ -27,7 +28,7 @@ var ShaderLib = {
 
 	lambert: {
 
-		uniforms: Object.assign( {},
+		uniforms: UniformsUtils.merge( [
 			UniformsLib.common,
 			UniformsLib.aomap,
 			UniformsLib.lightmap,
@@ -35,9 +36,9 @@ var ShaderLib = {
 			UniformsLib.fog,
 			UniformsLib.lights,
 			{
-				emissive : { value: new Color( 0x000000 ) }
+				emissive: { value: new Color( 0x000000 ) }
 			}
-		),
+		] ),
 
 		vertexShader: ShaderChunk.meshlambert_vert,
 		fragmentShader: ShaderChunk.meshlambert_frag
@@ -46,7 +47,7 @@ var ShaderLib = {
 
 	phong: {
 
-		uniforms: Object.assign( {},
+		uniforms: UniformsUtils.merge( [
 			UniformsLib.common,
 			UniformsLib.aomap,
 			UniformsLib.lightmap,
@@ -58,11 +59,11 @@ var ShaderLib = {
 			UniformsLib.fog,
 			UniformsLib.lights,
 			{
-				emissive : { value: new Color( 0x000000 ) },
-				specular : { value: new Color( 0x111111 ) },
+				emissive: { value: new Color( 0x000000 ) },
+				specular: { value: new Color( 0x111111 ) },
 				shininess: { value: 30 }
 			}
-		),
+		] ),
 
 		vertexShader: ShaderChunk.meshphong_vert,
 		fragmentShader: ShaderChunk.meshphong_frag
@@ -71,7 +72,7 @@ var ShaderLib = {
 
 	standard: {
 
-		uniforms: Object.assign( {},
+		uniforms: UniformsUtils.merge( [
 			UniformsLib.common,
 			UniformsLib.aomap,
 			UniformsLib.lightmap,
@@ -84,12 +85,12 @@ var ShaderLib = {
 			UniformsLib.fog,
 			UniformsLib.lights,
 			{
-				emissive : { value: new Color( 0x000000 ) },
+				emissive: { value: new Color( 0x000000 ) },
 				roughness: { value: 0.5 },
 				metalness: { value: 0 },
-				envMapIntensity : { value: 1 } // temporary
+				envMapIntensity: { value: 1 } // temporary
 			}
-		),
+		] ),
 
 		vertexShader: ShaderChunk.meshphysical_vert,
 		fragmentShader: ShaderChunk.meshphysical_frag
@@ -98,10 +99,10 @@ var ShaderLib = {
 
 	points: {
 
-		uniforms: Object.assign( {},
+		uniforms: UniformsUtils.merge( [
 			UniformsLib.points,
 			UniformsLib.fog
-		),
+		] ),
 
 		vertexShader: ShaderChunk.points_vert,
 		fragmentShader: ShaderChunk.points_frag
@@ -110,15 +111,15 @@ var ShaderLib = {
 
 	dashed: {
 
-		uniforms: Object.assign( {},
+		uniforms: UniformsUtils.merge( [
 			UniformsLib.common,
 			UniformsLib.fog,
 			{
-				scale    : { value: 1 },
-				dashSize : { value: 1 },
+				scale: { value: 1 },
+				dashSize: { value: 1 },
 				totalSize: { value: 2 }
 			}
-		),
+		] ),
 
 		vertexShader: ShaderChunk.linedashed_vert,
 		fragmentShader: ShaderChunk.linedashed_frag
@@ -127,10 +128,10 @@ var ShaderLib = {
 
 	depth: {
 
-		uniforms: Object.assign( {},
+		uniforms: UniformsUtils.merge( [
 			UniformsLib.common,
 			UniformsLib.displacementmap
-		),
+		] ),
 
 		vertexShader: ShaderChunk.depth_vert,
 		fragmentShader: ShaderChunk.depth_frag
@@ -140,7 +141,7 @@ var ShaderLib = {
 	normal: {
 
 		uniforms: {
-			opacity : { value: 1.0 }
+			opacity: { value: 1.0 }
 		},
 
 		vertexShader: ShaderChunk.normal_vert,
@@ -196,13 +197,13 @@ var ShaderLib = {
 
 ShaderLib.physical = {
 
-	uniforms: Object.assign( {},
+	uniforms: UniformsUtils.merge( [
 		ShaderLib.standard.uniforms,
 		{
 			clearCoat: { value: 0 },
 			clearCoatRoughness: { value: 0 }
 		}
-	),
+	] ),
 
 	vertexShader: ShaderChunk.meshphysical_vert,
 	fragmentShader: ShaderChunk.meshphysical_frag

+ 67 - 0
src/renderers/shaders/UniformsUtils.js

@@ -0,0 +1,67 @@
+/**
+ * Uniform Utilities
+ */
+
+var UniformsUtils = {
+
+	merge: function ( uniforms ) {
+
+		var merged = {};
+
+		for ( var u = 0; u < uniforms.length; u ++ ) {
+
+			var tmp = this.clone( uniforms[ u ] );
+
+			for ( var p in tmp ) {
+
+				merged[ p ] = tmp[ p ];
+
+			}
+
+		}
+
+		return merged;
+
+	},
+
+	clone: function ( uniforms_src ) {
+
+		var uniforms_dst = {};
+
+		for ( var u in uniforms_src ) {
+
+			uniforms_dst[ u ] = {};
+
+			for ( var p in uniforms_src[ u ] ) {
+
+				var parameter_src = uniforms_src[ u ][ p ];
+
+				if ( parameter_src && ( parameter_src.isColor ||
+					parameter_src.isMatrix3 || parameter_src.isMatrix4 ||
+					parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||
+					parameter_src.isTexture ) ) {
+
+					uniforms_dst[ u ][ p ] = parameter_src.clone();
+
+				} else if ( Array.isArray( parameter_src ) ) {
+
+					uniforms_dst[ u ][ p ] = parameter_src.slice();
+
+				} else {
+
+					uniforms_dst[ u ][ p ] = parameter_src;
+
+				}
+
+			}
+
+		}
+
+		return uniforms_dst;
+
+	}
+
+};
+
+
+export { UniformsUtils };

+ 2 - 1
src/renderers/webgl/WebGLShadowMap.js

@@ -6,6 +6,7 @@
 import { FrontSide, BackSide, DoubleSide, RGBAFormat, NearestFilter, PCFShadowMap, RGBADepthPacking } from '../../constants';
 import { WebGLRenderTarget } from '../WebGLRenderTarget';
 import { ShaderMaterial } from '../../materials/ShaderMaterial';
+import { UniformsUtils } from '../shaders/UniformsUtils';
 import { ShaderLib } from '../shaders/ShaderLib';
 import { MeshDepthMaterial } from '../../materials/MeshDepthMaterial';
 import { Vector4 } from '../../math/Vector4';
@@ -63,7 +64,7 @@ function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {
 	depthMaterialTemplate.clipping = true;
 
 	var distanceShader = ShaderLib[ "distanceRGBA" ];
-	var distanceUniforms = Object.assign( {}, distanceShader.uniforms );
+	var distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );
 
 	for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {