diff --git a/src/loaders/FileLoader.js b/src/loaders/FileLoader.js index 90a4c8164ff1be..8ef50615e2757f 100644 --- a/src/loaders/FileLoader.js +++ b/src/loaders/FileLoader.js @@ -74,7 +74,6 @@ class FileLoader extends Loader { * @param {function(any)} onLoad - Executed when the loading process has been finished. * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress. * @param {onErrorCallback} [onError] - Executed when errors occur. - * @return {any|undefined} The cached resource if available. */ load( url, onLoad, onProgress, onError ) { @@ -98,7 +97,7 @@ class FileLoader extends Loader { }, 0 ); - return cached; + return; } diff --git a/src/loaders/ImageBitmapLoader.js b/src/loaders/ImageBitmapLoader.js index 369118b53c2ce0..fc51a88bb3721c 100644 --- a/src/loaders/ImageBitmapLoader.js +++ b/src/loaders/ImageBitmapLoader.js @@ -107,7 +107,6 @@ class ImageBitmapLoader extends Loader { * @param {function(ImageBitmap)} onLoad - Executed when the loading process has been finished. * @param {onProgressCallback} onProgress - Unsupported in this loader. * @param {onErrorCallback} onError - Executed when errors occur. - * @return {ImageBitmap|undefined} The image bitmap. */ load( url, onLoad, onProgress, onError ) { @@ -145,8 +144,6 @@ class ImageBitmapLoader extends Loader { scope.manager.itemEnd( url ); - return imageBitmap; - } } ); @@ -164,7 +161,7 @@ class ImageBitmapLoader extends Loader { }, 0 ); - return cached; + return; } @@ -189,8 +186,6 @@ class ImageBitmapLoader extends Loader { scope.manager.itemEnd( url ); - return imageBitmap; - } ).catch( function ( e ) { if ( onError ) onError( e ); diff --git a/src/renderers/shaders/UniformsUtils.js b/src/renderers/shaders/UniformsUtils.js index fe68b523726603..f63ce8c791b8c3 100644 --- a/src/renderers/shaders/UniformsUtils.js +++ b/src/renderers/shaders/UniformsUtils.js @@ -27,10 +27,7 @@ export function cloneUniforms( src ) { const property = src[ u ][ p ]; - if ( property && ( property.isColor || - property.isMatrix3 || property.isMatrix4 || - property.isVector2 || property.isVector3 || property.isVector4 || - property.isTexture || property.isQuaternion ) ) { + if ( isThreeObject( property ) ) { if ( property.isRenderTargetTexture ) { @@ -45,7 +42,23 @@ export function cloneUniforms( src ) { } else if ( Array.isArray( property ) ) { - dst[ u ][ p ] = property.slice(); + if ( isThreeObject( property[ 0 ] ) ) { + + const clonedProperty = []; + + for ( let i = 0, l = property.length; i < l; i ++ ) { + + clonedProperty[ i ] = property[ i ].clone(); + + } + + dst[ u ][ p ] = clonedProperty; + + } else { + + dst[ u ][ p ] = property.slice(); + + } } else { @@ -89,6 +102,15 @@ export function mergeUniforms( uniforms ) { } +function isThreeObject( property ) { + + return ( property && ( property.isColor || + property.isMatrix3 || property.isMatrix4 || + property.isVector2 || property.isVector3 || property.isVector4 || + property.isTexture || property.isQuaternion ) ); + +} + export function cloneUniformsGroups( src ) { const dst = []; diff --git a/test/unit/src/renderers/shaders/UniformsUtils.tests.js b/test/unit/src/renderers/shaders/UniformsUtils.tests.js index 8a259b18f16ef2..bc8589c61e646d 100644 --- a/test/unit/src/renderers/shaders/UniformsUtils.tests.js +++ b/test/unit/src/renderers/shaders/UniformsUtils.tests.js @@ -114,6 +114,29 @@ export default QUnit.module( 'Renderers', () => { } ); + QUnit.test( 'cloneUniforms clones arrays of objects', ( assert ) => { + + const uniforms = { + vector3Array: { value: [ new Vector3( 1, 2, 3 ), new Vector3( 4, 5, 6 ) ] }, + }; + + const uniformClones = UniformsUtils.clone( uniforms ); + + // Cloned array is a different reference and contains different object references + assert.ok( uniforms.vector3Array.value !== uniformClones.vector3Array.value ); + assert.ok( uniforms.vector3Array.value[ 0 ] !== uniformClones.vector3Array.value[ 0 ] ); + assert.ok( uniforms.vector3Array.value[ 1 ] !== uniformClones.vector3Array.value[ 1 ] ); + + // Values are equal after cloning + assert.ok( uniforms.vector3Array.value[ 0 ].equals( uniformClones.vector3Array.value[ 0 ] ) ); + assert.ok( uniforms.vector3Array.value[ 1 ].equals( uniformClones.vector3Array.value[ 1 ] ) ); + + // Mutating the original does not affect the clone + uniforms.vector3Array.value[ 0 ].x = 123.0; + assert.ok( ! uniforms.vector3Array.value[ 0 ].equals( uniformClones.vector3Array.value[ 0 ] ) ); + + } ); + QUnit.test( 'cloneUniforms skips render target textures', ( assert ) => { const uniforms = {