HDRCubeTextureLoader.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. ( function () {
  2. class HDRCubeTextureLoader extends THREE.Loader {
  3. constructor( manager ) {
  4. super( manager );
  5. this.hdrLoader = new THREE.RGBELoader();
  6. this.type = THREE.HalfFloatType;
  7. }
  8. load( urls, onLoad, onProgress, onError ) {
  9. if ( ! Array.isArray( urls ) ) {
  10. console.warn( 'THREE.HDRCubeTextureLoader signature has changed. Use .setDataType() instead.' );
  11. this.setDataType( urls );
  12. urls = onLoad;
  13. onLoad = onProgress;
  14. onProgress = onError;
  15. onError = arguments[ 4 ];
  16. }
  17. const texture = new THREE.CubeTexture();
  18. texture.type = this.type;
  19. switch ( texture.type ) {
  20. case THREE.FloatType:
  21. texture.encoding = THREE.LinearEncoding;
  22. texture.minFilter = THREE.LinearFilter;
  23. texture.magFilter = THREE.LinearFilter;
  24. texture.generateMipmaps = false;
  25. break;
  26. case THREE.HalfFloatType:
  27. texture.encoding = THREE.LinearEncoding;
  28. texture.minFilter = THREE.LinearFilter;
  29. texture.magFilter = THREE.LinearFilter;
  30. texture.generateMipmaps = false;
  31. break;
  32. }
  33. const scope = this;
  34. let loaded = 0;
  35. function loadHDRData( i, onLoad, onProgress, onError ) {
  36. new THREE.FileLoader( scope.manager ).setPath( scope.path ).setResponseType( 'arraybuffer' ).setWithCredentials( scope.withCredentials ).load( urls[ i ], function ( buffer ) {
  37. loaded ++;
  38. const texData = scope.hdrLoader.parse( buffer );
  39. if ( ! texData ) return;
  40. if ( texData.data !== undefined ) {
  41. const dataTexture = new THREE.DataTexture( texData.data, texData.width, texData.height );
  42. dataTexture.type = texture.type;
  43. dataTexture.encoding = texture.encoding;
  44. dataTexture.format = texture.format;
  45. dataTexture.minFilter = texture.minFilter;
  46. dataTexture.magFilter = texture.magFilter;
  47. dataTexture.generateMipmaps = texture.generateMipmaps;
  48. texture.images[ i ] = dataTexture;
  49. }
  50. if ( loaded === 6 ) {
  51. texture.needsUpdate = true;
  52. if ( onLoad ) onLoad( texture );
  53. }
  54. }, onProgress, onError );
  55. }
  56. for ( let i = 0; i < urls.length; i ++ ) {
  57. loadHDRData( i, onLoad, onProgress, onError );
  58. }
  59. return texture;
  60. }
  61. setDataType( value ) {
  62. this.type = value;
  63. this.hdrLoader.setDataType( value );
  64. return this;
  65. }
  66. }
  67. THREE.HDRCubeTextureLoader = HDRCubeTextureLoader;
  68. } )();