(function(){ 'use strict'; /** * Image loader with progress based on {@link https://github.com/mrdoob/three.js/blob/master/src/loaders/ImageLoader.js} * @memberOf PANOLENS.Utils * @namespace */ PANOLENS.Utils.ImageLoader = {}; /** * Load an image with XMLHttpRequest to provide progress checking * @param {string} url - An image url * @param {function} onLoad - On load callback * @param {function} onProgress - In progress callback * @param {function} onError - On error callback * @return {HTMLImageElement} - DOM image element */ PANOLENS.Utils.ImageLoader.load = function ( url, onLoad, onProgress, onError ) { var cached, request, arrayBufferView, blob, urlCreator, image, reference; // Reference key for ( var iconName in PANOLENS.DataImage ) { if ( PANOLENS.DataImage.hasOwnProperty( iconName ) && url === PANOLENS.DataImage[ iconName ] ) { reference = iconName; } } // Cached cached = THREE.Cache.get( reference ? reference : url ); if ( cached !== undefined ) { if ( onLoad ) { setTimeout( function () { if ( onProgress ) { onProgress( { loaded: 1, total: 1 } ); } onLoad( cached ); }, 0 ); } return cached; } // Construct a new XMLHttpRequest urlCreator = window.URL || window.webkitURL; image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); // Add to cache THREE.Cache.add( reference ? reference : url, image ); function onImageLoaded () { urlCreator.revokeObjectURL( image.src ); onLoad && onLoad( image ); } if ( url.indexOf( 'data:' ) === 0 ) { image.addEventListener( 'load', onImageLoaded, false ); image.src = url; return image; } image.crossOrigin = this.crossOrigin !== undefined ? this.crossOrigin : ''; request = new XMLHttpRequest(); request.open( 'GET', url, true ); request.responseType = 'arraybuffer'; request.onprogress = function ( event ) { if ( event.lengthComputable ) { onProgress && onProgress( { loaded: event.loaded, total: event.total } ); } }; request.onloadend = function( event ) { arrayBufferView = new Uint8Array( this.response ); blob = new Blob( [ arrayBufferView ] ); image.addEventListener( 'load', onImageLoaded, false ); image.src = urlCreator.createObjectURL( blob ); }; request.send(null); }; // Enable cache THREE.Cache.enabled = true; })();