diff --git a/examples/js/loaders/EXRLoader.js b/examples/js/loaders/EXRLoader.js index 5e26c8e38dc564ab2a9a7dabc4cd2b2a1e094188..684d1e1593170cf8c6f75fdcab0577a4a87057ca 100644 --- a/examples/js/loaders/EXRLoader.js +++ b/examples/js/loaders/EXRLoader.js @@ -1150,18 +1150,36 @@ THREE.EXRLoader.prototype = Object.assign( Object.create( THREE.DataTextureLoade var width = EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1; var height = EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1; - var numChannels = EXRHeader.channels.length; + // Firefox only supports RGBA (half) float textures + // var numChannels = EXRHeader.channels.length; + var numChannels = 4; + var size = width * height * numChannels; + // Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten switch ( this.type ) { case THREE.FloatType: - var byteArray = new Float32Array( width * height * numChannels ); + var byteArray = new Float32Array( size ); + + if ( EXRHeader.channels.length < numChannels ) { + + byteArray.fill( 1, 0, size ); + + } + break; case THREE.HalfFloatType: - var byteArray = new Uint16Array( width * height * numChannels ); + var byteArray = new Uint16Array( size ); + + if ( EXRHeader.channels.length < numChannels ) { + + byteArray.fill( 0x3C00, 0, size ); // Uint16Array holds half float data, 0x3C00 is 1 + + } + break; default: @@ -1232,7 +1250,7 @@ THREE.EXRLoader.prototype = Object.assign( Object.create( THREE.DataTextureLoade var tmpBuffer = new Uint16Array( tmpBufferSize ); var tmpOffset = { value: 0 }; - decompressPIZ( tmpBuffer, tmpOffset, uInt8Array, bufferDataView, offset, tmpBufferSize, numChannels, EXRHeader.channels, width, scanlineBlockSize ); + decompressPIZ( tmpBuffer, tmpOffset, uInt8Array, bufferDataView, offset, tmpBufferSize, EXRHeader.channels.length, EXRHeader.channels, width, scanlineBlockSize ); for ( var line_y = 0; line_y < scanlineBlockSize; line_y ++ ) { @@ -1359,7 +1377,7 @@ THREE.EXRLoader.prototype = Object.assign( Object.create( THREE.DataTextureLoade width: width, height: height, data: byteArray, - format: EXRHeader.channels.length == 4 ? THREE.RGBAFormat : THREE.RGBFormat, + format: numChannels == 4 ? THREE.RGBAFormat : THREE.RGBFormat, type: this.type }; diff --git a/examples/jsm/loaders/EXRLoader.js b/examples/jsm/loaders/EXRLoader.js index d509d7ce3152ecb3bd88078170b6bf363887dca4..4ce803be163cc9a2ac7dfd1480a4ff2fac99c6c4 100644 --- a/examples/jsm/loaders/EXRLoader.js +++ b/examples/jsm/loaders/EXRLoader.js @@ -1161,18 +1161,36 @@ EXRLoader.prototype = Object.assign( Object.create( DataTextureLoader.prototype var width = EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1; var height = EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1; - var numChannels = EXRHeader.channels.length; + // Firefox only supports RGBA (half) float textures + // var numChannels = EXRHeader.channels.length; + var numChannels = 4; + var size = width * height * numChannels; + // Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten switch ( this.type ) { case FloatType: - var byteArray = new Float32Array( width * height * numChannels ); + var byteArray = new Float32Array( size ); + + if ( EXRHeader.channels.length < numChannels ) { + + byteArray.fill( 1, 0, size ); + + } + break; case HalfFloatType: - var byteArray = new Uint16Array( width * height * numChannels ); + var byteArray = new Uint16Array( size ); + + if ( EXRHeader.channels.length < numChannels ) { + + byteArray.fill( 0x3C00, 0, size ); // Uint16Array holds half float data, 0x3C00 is 1 + + } + break; default: @@ -1243,7 +1261,7 @@ EXRLoader.prototype = Object.assign( Object.create( DataTextureLoader.prototype var tmpBuffer = new Uint16Array( tmpBufferSize ); var tmpOffset = { value: 0 }; - decompressPIZ( tmpBuffer, tmpOffset, uInt8Array, bufferDataView, offset, tmpBufferSize, numChannels, EXRHeader.channels, width, scanlineBlockSize ); + decompressPIZ( tmpBuffer, tmpOffset, uInt8Array, bufferDataView, offset, tmpBufferSize, EXRHeader.channels.length, EXRHeader.channels, width, scanlineBlockSize ); for ( var line_y = 0; line_y < scanlineBlockSize; line_y ++ ) { @@ -1370,7 +1388,7 @@ EXRLoader.prototype = Object.assign( Object.create( DataTextureLoader.prototype width: width, height: height, data: byteArray, - format: EXRHeader.channels.length == 4 ? RGBAFormat : RGBFormat, + format: numChannels == 4 ? RGBAFormat : RGBFormat, type: this.type };