|
| 1 | +/* globals jQuery, normalmap */ |
| 2 | +(function() { |
| 3 | + |
| 4 | +var $ = jQuery; |
| 5 | + |
| 6 | +$.fn.normalmap = function(options){ |
| 7 | + if(this.length === 0) return; |
| 8 | + if(this[0].tagName !== 'CANVAS') { |
| 9 | + throw new Error('$.fn.normalmap only works on a single <canvas> element'); |
| 10 | + } |
| 11 | + return loadImages(this[0], options); |
| 12 | +}; |
| 13 | + |
| 14 | +function loadImages(canvas, options){ |
| 15 | + var maps = ['normalMap', 'baseColorMap', 'materialMap', 'ambientMap']; |
| 16 | + return $.when.apply($, $.map(maps, function(o){ return loadImage(options[o]); })) |
| 17 | + .then(function(){ |
| 18 | + for(var i = 0; i < arguments.length; i++){ |
| 19 | + options[maps[i]] = arguments[i]; |
| 20 | + } |
| 21 | + if(!options.repeat) { |
| 22 | + canvas.width = options.normalMap.naturalWidth; |
| 23 | + canvas.height = options.normalMap.naturalHeight; |
| 24 | + } |
| 25 | + options.canvas = canvas; |
| 26 | + var lights = normalmap(options); |
| 27 | + $(window).on('resize', lights.resize); |
| 28 | + return lights; |
| 29 | + }); |
| 30 | +} |
| 31 | + |
| 32 | +function loadImage(src){ |
| 33 | + var deferred = $.Deferred(); |
| 34 | + function trackImage(img){ |
| 35 | + img.onload = function(){ deferred.resolve(img); }; |
| 36 | + img.onerror = function(){ deferred.reject(new Error('image failed to load')); }; |
| 37 | + } |
| 38 | + if(src){ |
| 39 | + if(jQuery.type(src) === 'string'){ |
| 40 | + var img = new Image(); |
| 41 | + trackImage(img); |
| 42 | + img.crossorigin = 'anonymous'; |
| 43 | + img.src = src; |
| 44 | + } |
| 45 | + // assume image |
| 46 | + else { |
| 47 | + if(src.tagName === 'IMG' && src.complete === false) { |
| 48 | + trackImage(src); |
| 49 | + } |
| 50 | + else { |
| 51 | + deferred.resolve(src); |
| 52 | + } |
| 53 | + } |
| 54 | + } |
| 55 | + else { |
| 56 | + deferred.resolve(); |
| 57 | + } |
| 58 | + return deferred.promise(); |
| 59 | +} |
| 60 | +$.fn.normalmap._loadImage = loadImage; |
| 61 | + |
| 62 | +}()); |
0 commit comments