HDRCubeTextureLoader.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /**
  2. * @author Prashant Sharma / spidersharma03
  3. * @author Ben Houston / http://clara.io / bhouston
  4. */
  5. THREE.HDRCubeTextureLoader = function (manager) {
  6. this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
  7. // override in sub classes
  8. this.hdrLoader = new THREE.RGBELoader();
  9. if( THREE.Encodings === undefined ) throw new Error( "HDRCubeMapLoader requires THREE.Encodings" );
  10. }
  11. THREE.HDRCubeTextureLoader.prototype.load = function(type, urls, onLoad, onProgress, onError) {
  12. var texture = new THREE.CubeTexture();
  13. texture.type = type;
  14. texture.encoding = (type === THREE.UnsignedByteType) ? THREE.RGBEEncoding : THREE.LinearEncoding;
  15. texture.format = (type === THREE.UnsignedByteType ) ? THREE.RGBAFormat : THREE.RGBFormat;
  16. texture.minFilter = (texture.encoding === THREE.RGBEEncoding ) ? THREE.NearestFilter : THREE.LinearFilter;
  17. texture.magFilter = (texture.encoding === THREE.RGBEEncoding ) ? THREE.NearestFilter : THREE.LinearFilter;
  18. texture.generateMipmaps = (texture.encoding !== THREE.RGBEEncoding );
  19. texture.anisotropy = 0;
  20. var scope = this.hdrLoader;
  21. var loaded = 0;
  22. function loadHDRData(i, onLoad, onProgress, onError) {
  23. var loader = new THREE.FileLoader( this.manager );
  24. loader.setResponseType( 'arraybuffer' );
  25. loader.load( urls[i], function ( buffer ) {
  26. loaded++;
  27. var texData = scope._parser( buffer );
  28. if ( ! texData ) return;
  29. if(type === THREE.FloatType) {
  30. var numElements = ( texData.data.length / 4 )*3;
  31. var floatdata = new Float32Array( numElements );
  32. for( var j=0; j<numElements; j++) {
  33. THREE.Encodings.RGBEByteToRGBFloat( texData.data, j*4, floatdata, j*3 );
  34. }
  35. texData.data = floatdata;
  36. }
  37. else if(type === THREE.HalfFloatType) {
  38. var numElements = ( texData.data.length / 4 )*3;
  39. var halfdata = new Uint16Array( numElements );
  40. for( var j=0; j<numElements; j++) {
  41. THREE.Encodings.RGBEByteToRGBHalf( texData.data, j*4, halfdata, j*3 );
  42. }
  43. texData.data = halfdata;
  44. }
  45. if ( undefined !== texData.image ) {
  46. texture[i].images = texData.image;
  47. }
  48. else if ( undefined !== texData.data ) {
  49. var dataTexture = new THREE.DataTexture(texData.data, texData.width, texData.height);
  50. dataTexture.format = texture.format;
  51. dataTexture.type = texture.type;
  52. dataTexture.encoding = texture.encoding;
  53. dataTexture.minFilter = texture.minFilter;
  54. dataTexture.magFilter = texture.magFilter;
  55. dataTexture.generateMipmaps = texture.generateMipmaps;
  56. texture.images[i] = dataTexture;
  57. }
  58. if(loaded === 6) {
  59. texture.needsUpdate = true;
  60. if ( onLoad ) onLoad( texture );
  61. }
  62. }, onProgress, onError );
  63. }
  64. for(var i=0; i<urls.length; i++) {
  65. loadHDRData(i, onLoad, onProgress, onError);
  66. }
  67. return texture;
  68. };