116 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			116 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | import { | ||
|  | 	CubeTexture, | ||
|  | 	DataTexture, | ||
|  | 	FileLoader, | ||
|  | 	FloatType, | ||
|  | 	HalfFloatType, | ||
|  | 	LinearFilter, | ||
|  | 	LinearSRGBColorSpace, | ||
|  | 	Loader | ||
|  | } from 'three'; | ||
|  | import { RGBELoader } from '../loaders/RGBELoader.js'; | ||
|  | 
 | ||
|  | class HDRCubeTextureLoader extends Loader { | ||
|  | 
 | ||
|  | 	constructor( manager ) { | ||
|  | 
 | ||
|  | 		super( manager ); | ||
|  | 
 | ||
|  | 		this.hdrLoader = new RGBELoader(); | ||
|  | 		this.type = HalfFloatType; | ||
|  | 
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	load( urls, onLoad, onProgress, onError ) { | ||
|  | 
 | ||
|  | 		const texture = new CubeTexture(); | ||
|  | 
 | ||
|  | 		texture.type = this.type; | ||
|  | 
 | ||
|  | 		switch ( texture.type ) { | ||
|  | 
 | ||
|  | 			case FloatType: | ||
|  | 
 | ||
|  | 				texture.colorSpace = LinearSRGBColorSpace; | ||
|  | 				texture.minFilter = LinearFilter; | ||
|  | 				texture.magFilter = LinearFilter; | ||
|  | 				texture.generateMipmaps = false; | ||
|  | 				break; | ||
|  | 
 | ||
|  | 			case HalfFloatType: | ||
|  | 
 | ||
|  | 				texture.colorSpace = LinearSRGBColorSpace; | ||
|  | 				texture.minFilter = LinearFilter; | ||
|  | 				texture.magFilter = LinearFilter; | ||
|  | 				texture.generateMipmaps = false; | ||
|  | 				break; | ||
|  | 
 | ||
|  | 		} | ||
|  | 
 | ||
|  | 		const scope = this; | ||
|  | 
 | ||
|  | 		let loaded = 0; | ||
|  | 
 | ||
|  | 		function loadHDRData( i, onLoad, onProgress, onError ) { | ||
|  | 
 | ||
|  | 			new FileLoader( scope.manager ) | ||
|  | 				.setPath( scope.path ) | ||
|  | 				.setResponseType( 'arraybuffer' ) | ||
|  | 				.setWithCredentials( scope.withCredentials ) | ||
|  | 				.load( urls[ i ], function ( buffer ) { | ||
|  | 
 | ||
|  | 					loaded ++; | ||
|  | 
 | ||
|  | 					const texData = scope.hdrLoader.parse( buffer ); | ||
|  | 
 | ||
|  | 					if ( ! texData ) return; | ||
|  | 
 | ||
|  | 					if ( texData.data !== undefined ) { | ||
|  | 
 | ||
|  | 						const dataTexture = new DataTexture( texData.data, texData.width, texData.height ); | ||
|  | 
 | ||
|  | 						dataTexture.type = texture.type; | ||
|  | 						dataTexture.colorSpace = texture.colorSpace; | ||
|  | 						dataTexture.format = texture.format; | ||
|  | 						dataTexture.minFilter = texture.minFilter; | ||
|  | 						dataTexture.magFilter = texture.magFilter; | ||
|  | 						dataTexture.generateMipmaps = texture.generateMipmaps; | ||
|  | 
 | ||
|  | 						texture.images[ i ] = dataTexture; | ||
|  | 
 | ||
|  | 					} | ||
|  | 
 | ||
|  | 					if ( loaded === 6 ) { | ||
|  | 
 | ||
|  | 						texture.needsUpdate = true; | ||
|  | 						if ( onLoad ) onLoad( texture ); | ||
|  | 
 | ||
|  | 					} | ||
|  | 
 | ||
|  | 				}, onProgress, onError ); | ||
|  | 
 | ||
|  | 		} | ||
|  | 
 | ||
|  | 		for ( let i = 0; i < urls.length; i ++ ) { | ||
|  | 
 | ||
|  | 			loadHDRData( i, onLoad, onProgress, onError ); | ||
|  | 
 | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return texture; | ||
|  | 
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	setDataType( value ) { | ||
|  | 
 | ||
|  | 		this.type = value; | ||
|  | 		this.hdrLoader.setDataType( value ); | ||
|  | 
 | ||
|  | 		return this; | ||
|  | 
 | ||
|  | 	} | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | export { HDRCubeTextureLoader }; |