diff --git a/3rdparty/chroma.min.js b/3rdparty/chroma.min.js
new file mode 100644
index 0000000..0c204c3
--- /dev/null
+++ b/3rdparty/chroma.min.js
@@ -0,0 +1,21 @@
+/** echo * @license echo * while read i do echo * done echo
+*/
+!function(){var Color,K,PITHIRD,TWOPI,X,Y,Z,bezier,brewer,chroma,clip_rgb,colors,cos,css2rgb,hex2rgb,hsi2rgb,hsl2rgb,hsv2rgb,lab2lch,lab2rgb,lab_xyz,lch2lab,lch2rgb,limit,luminance,luminance_x,rgb2hex,rgb2hsi,rgb2hsl,rgb2hsv,rgb2lab,rgb2lch,rgb_xyz,root,type,unpack,xyz_lab,xyz_rgb,_ref;chroma=function(x,y,z,m){return new Color(x,y,z,m)};if(typeof module!=="undefined"&&module!==null&&module.exports!=null){module.exports=chroma}if(typeof define==="function"&&define.amd){define([],function(){return chroma})}else{root=typeof exports!=="undefined"&&exports!==null?exports:this;root.chroma=chroma}chroma.color=function(x,y,z,m){return new Color(x,y,z,m)};chroma.hsl=function(h,s,l,a){return new Color(h,s,l,a,"hsl")};chroma.hsv=function(h,s,v,a){return new Color(h,s,v,a,"hsv")};chroma.rgb=function(r,g,b,a){return new Color(r,g,b,a,"rgb")};chroma.hex=function(x){return new Color(x)};chroma.css=function(x){return new Color(x)};chroma.lab=function(l,a,b){return new Color(l,a,b,"lab")};chroma.lch=function(l,c,h){return new Color(l,c,h,"lch")};chroma.hsi=function(h,s,i){return new Color(h,s,i,"hsi")};chroma.gl=function(r,g,b,a){return new Color(r*255,g*255,b*255,a,"gl")};chroma.interpolate=function(a,b,f,m){if(a==null||b==null){return"#000"}if(type(a)==="string"){a=new Color(a)}if(type(b)==="string"){b=new Color(b)}return a.interpolate(f,b,m)};chroma.mix=chroma.interpolate;chroma.contrast=function(a,b){var l1,l2;if(type(a)==="string"){a=new Color(a)}if(type(b)==="string"){b=new Color(b)}l1=a.luminance();l2=b.luminance();if(l1>l2){return(l1+.05)/(l2+.05)}else{return(l2+.05)/(l1+.05)}};chroma.luminance=function(color){return chroma(color).luminance()};chroma._Color=Color;Color=function(){function Color(){var a,arg,args,m,me,me_rgb,x,y,z,_i,_len,_ref,_ref1,_ref2,_ref3,_ref4;me=this;args=[];for(_i=0,_len=arguments.length;_i<_len;_i++){arg=arguments[_i];if(arg!=null){args.push(arg)}}if(args.length===0){_ref=[255,0,255,1,"rgb"],x=_ref[0],y=_ref[1],z=_ref[2],a=_ref[3],m=_ref[4]}else if(type(args[0])==="array"){if(args[0].length===3){_ref1=args[0],x=_ref1[0],y=_ref1[1],z=_ref1[2];a=1}else if(args[0].length===4){_ref2=args[0],x=_ref2[0],y=_ref2[1],z=_ref2[2],a=_ref2[3]}else{throw"unknown input argument"}m=(_ref3=args[1])!=null?_ref3:"rgb"}else if(type(args[0])==="string"){x=args[0];m="hex"}else if(type(args[0])==="object"){_ref4=args[0]._rgb,x=_ref4[0],y=_ref4[1],z=_ref4[2],a=_ref4[3];m="rgb"}else if(args.length>=3){x=args[0];y=args[1];z=args[2]}if(args.length===3){m="rgb";a=1}else if(args.length===4){if(type(args[3])==="string"){m=args[3];a=1}else if(type(args[3])==="number"){m="rgb";a=args[3]}}else if(args.length===5){a=args[3];m=args[4]}if(a==null){a=1}if(m==="rgb"){me._rgb=[x,y,z,a]}else if(m==="gl"){me._rgb=[x*255,y*255,z*255,a]}else if(m==="hsl"){me._rgb=hsl2rgb(x,y,z);me._rgb[3]=a}else if(m==="hsv"){me._rgb=hsv2rgb(x,y,z);me._rgb[3]=a}else if(m==="hex"){me._rgb=hex2rgb(x)}else if(m==="lab"){me._rgb=lab2rgb(x,y,z);me._rgb[3]=a}else if(m==="lch"){me._rgb=lch2rgb(x,y,z);me._rgb[3]=a}else if(m==="hsi"){me._rgb=hsi2rgb(x,y,z);me._rgb[3]=a}me_rgb=clip_rgb(me._rgb)}Color.prototype.rgb=function(){return this._rgb.slice(0,3)};Color.prototype.rgba=function(){return this._rgb};Color.prototype.hex=function(){return rgb2hex(this._rgb)};Color.prototype.toString=function(){return this.name()};Color.prototype.hsl=function(){return rgb2hsl(this._rgb)};Color.prototype.hsv=function(){return rgb2hsv(this._rgb)};Color.prototype.lab=function(){return rgb2lab(this._rgb)};Color.prototype.lch=function(){return rgb2lch(this._rgb)};Color.prototype.hsi=function(){return rgb2hsi(this._rgb)};Color.prototype.gl=function(){return[this._rgb[0]/255,this._rgb[1]/255,this._rgb[2]/255,this._rgb[3]]};Color.prototype.luminance=function(lum,mode){var cur_lum,eps,max_iter,test;if(mode==null){mode="rgb"}if(!arguments.length){return luminance(this._rgb)}if(lum===0){this._rgb=[0,0,0,this._rgb[3]]}if(lum===1){this._rgb=[255,255,255,this._rgb[3]]}cur_lum=luminance(this._rgb);eps=1e-7;max_iter=20;test=function(l,h){var lm,m;m=l.interpolate(.5,h,mode);lm=m.luminance();if(Math.abs(lum-lm)lum){return test(l,m)}return test(m,h)};this._rgb=(cur_lum>lum?test(new Color("black"),this):test(this,new Color("white"))).rgba();return this};Color.prototype.name=function(){var h,k;h=this.hex();for(k in chroma.colors){if(h===chroma.colors[k]){return k}}return h};Color.prototype.alpha=function(alpha){if(arguments.length){this._rgb[3]=alpha;return this}return this._rgb[3]};Color.prototype.css=function(mode){var hsl,me,rgb,rnd;if(mode==null){mode="rgb"}me=this;rgb=me._rgb;if(mode.length===3&&rgb[3]<1){mode+="a"}if(mode==="rgb"){return mode+"("+rgb.slice(0,3).map(Math.round).join(",")+")"}else if(mode==="rgba"){return mode+"("+rgb.slice(0,3).map(Math.round).join(",")+","+rgb[3]+")"}else if(mode==="hsl"||mode==="hsla"){hsl=me.hsl();rnd=function(a){return Math.round(a*100)/100};hsl[0]=rnd(hsl[0]);hsl[1]=rnd(hsl[1]*100)+"%";hsl[2]=rnd(hsl[2]*100)+"%";if(mode.length===4){hsl[3]=rgb[3]}return mode+"("+hsl.join(",")+")"}};Color.prototype.interpolate=function(f,col,m){var dh,hue,hue0,hue1,lbv,lbv0,lbv1,me,res,sat,sat0,sat1,xyz0,xyz1;me=this;if(m==null){m="rgb"}if(type(col)==="string"){col=new Color(col)}if(m==="hsl"||m==="hsv"||m==="lch"||m==="hsi"){if(m==="hsl"){xyz0=me.hsl();xyz1=col.hsl()}else if(m==="hsv"){xyz0=me.hsv();xyz1=col.hsv()}else if(m==="hsi"){xyz0=me.hsi();xyz1=col.hsi()}else if(m==="lch"){xyz0=me.lch();xyz1=col.lch()}if(m.substr(0,1)==="h"){hue0=xyz0[0],sat0=xyz0[1],lbv0=xyz0[2];hue1=xyz1[0],sat1=xyz1[1],lbv1=xyz1[2]}else{lbv0=xyz0[0],sat0=xyz0[1],hue0=xyz0[2];lbv1=xyz1[0],sat1=xyz1[1],hue1=xyz1[2]}if(!isNaN(hue0)&&!isNaN(hue1)){if(hue1>hue0&&hue1-hue0>180){dh=hue1-(hue0+360)}else if(hue1180){dh=hue1+360-hue0}else{dh=hue1-hue0}hue=hue0+f*dh}else if(!isNaN(hue0)){hue=hue0;if((lbv1===1||lbv1===0)&&m!=="hsv"){sat=sat0}}else if(!isNaN(hue1)){hue=hue1;if((lbv0===1||lbv0===0)&&m!=="hsv"){sat=sat1}}else{hue=Number.NaN}if(sat==null){sat=sat0+f*(sat1-sat0)}lbv=lbv0+f*(lbv1-lbv0);if(m.substr(0,1)==="h"){res=new Color(hue,sat,lbv,m)}else{res=new Color(lbv,sat,hue,m)}}else if(m==="rgb"){xyz0=me._rgb;xyz1=col._rgb;res=new Color(xyz0[0]+f*(xyz1[0]-xyz0[0]),xyz0[1]+f*(xyz1[1]-xyz0[1]),xyz0[2]+f*(xyz1[2]-xyz0[2]),m)}else if(m==="lab"){xyz0=me.lab();xyz1=col.lab();res=new Color(xyz0[0]+f*(xyz1[0]-xyz0[0]),xyz0[1]+f*(xyz1[1]-xyz0[1]),xyz0[2]+f*(xyz1[2]-xyz0[2]),m)}else{throw"color mode "+m+" is not supported"}res.alpha(me.alpha()+f*(col.alpha()-me.alpha()));return res};Color.prototype.premultiply=function(){var a,rgb;rgb=this.rgb();a=this.alpha();return chroma(rgb[0]*a,rgb[1]*a,rgb[2]*a,a)};Color.prototype.darken=function(amount){var lch,me;if(amount==null){amount=20}me=this;lch=me.lch();lch[0]-=amount;return chroma.lch(lch).alpha(me.alpha())};Color.prototype.darker=function(amount){return this.darken(amount)};Color.prototype.brighten=function(amount){if(amount==null){amount=20}return this.darken(-amount)};Color.prototype.brighter=function(amount){return this.brighten(amount)};Color.prototype.saturate=function(amount){var lch,me;if(amount==null){amount=20}me=this;lch=me.lch();lch[1]+=amount;return chroma.lch(lch).alpha(me.alpha())};Color.prototype.desaturate=function(amount){if(amount==null){amount=20}return this.saturate(-amount)};return Color}();clip_rgb=function(rgb){var i;for(i in rgb){if(i<3){if(rgb[i]<0){rgb[i]=0}if(rgb[i]>255){rgb[i]=255}}else if(i===3){if(rgb[i]<0){rgb[i]=0}if(rgb[i]>1){rgb[i]=1}}}return rgb};css2rgb=function(css){var hsl,i,m,rgb,_i,_j,_k,_l;css=css.toLowerCase();if(chroma.colors!=null&&chroma.colors[css]){return hex2rgb(chroma.colors[css])}if(m=css.match(/rgb\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*\)/)){rgb=m.slice(1,4);for(i=_i=0;_i<=2;i=++_i){rgb[i]=+rgb[i]}rgb[3]=1}else if(m=css.match(/rgba\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*,\s*([01]|[01]?\.\d+)\)/)){rgb=m.slice(1,5);for(i=_j=0;_j<=3;i=++_j){rgb[i]=+rgb[i]}}else if(m=css.match(/rgb\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/)){rgb=m.slice(1,4);for(i=_k=0;_k<=2;i=++_k){rgb[i]=Math.round(rgb[i]*2.55)}rgb[3]=1}else if(m=css.match(/rgba\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/)){rgb=m.slice(1,5);for(i=_l=0;_l<=2;i=++_l){rgb[i]=Math.round(rgb[i]*2.55)}rgb[3]=+rgb[3]}else if(m=css.match(/hsl\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/)){hsl=m.slice(1,4);hsl[1]*=.01;hsl[2]*=.01;rgb=hsl2rgb(hsl);rgb[3]=1}else if(m=css.match(/hsla\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/)){hsl=m.slice(1,4);hsl[1]*=.01;hsl[2]*=.01;rgb=hsl2rgb(hsl);rgb[3]=+m[4]}return rgb};hex2rgb=function(hex){var a,b,g,r,rgb,u;if(hex.match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/)){if(hex.length===4||hex.length===7){hex=hex.substr(1)}if(hex.length===3){hex=hex.split("");hex=hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]}u=parseInt(hex,16);r=u>>16;g=u>>8&255;b=u&255;return[r,g,b,1]}if(hex.match(/^#?([A-Fa-f0-9]{8})$/)){if(hex.length===9){hex=hex.substr(1)}u=parseInt(hex,16);r=u>>24&255;g=u>>16&255;b=u>>8&255;a=u&255;return[r,g,b,a]}if(rgb=css2rgb(hex)){return rgb}throw"unknown color: "+hex};hsi2rgb=function(h,s,i){var b,g,r,_ref;_ref=unpack(arguments),h=_ref[0],s=_ref[1],i=_ref[2];h/=360;if(h<1/3){b=(1-s)/3;r=(1+s*cos(TWOPI*h)/cos(PITHIRD-TWOPI*h))/3;g=1-(b+r)}else if(h<2/3){h-=1/3;r=(1-s)/3;g=(1+s*cos(TWOPI*h)/cos(PITHIRD-TWOPI*h))/3;b=1-(r+g)}else{h-=2/3;g=(1-s)/3;b=(1+s*cos(TWOPI*h)/cos(PITHIRD-TWOPI*h))/3;r=1-(g+b)}r=limit(i*r*3);g=limit(i*g*3);b=limit(i*b*3);return[r*255,g*255,b*255]};hsl2rgb=function(){var b,c,g,h,i,l,r,s,t1,t2,t3,_i,_ref,_ref1;_ref=unpack(arguments),h=_ref[0],s=_ref[1],l=_ref[2];if(s===0){r=g=b=l*255}else{t3=[0,0,0];c=[0,0,0];t2=l<.5?l*(1+s):l+s-l*s;t1=2*l-t2;h/=360;t3[0]=h+1/3;t3[1]=h;t3[2]=h-1/3;for(i=_i=0;_i<=2;i=++_i){if(t3[i]<0){t3[i]+=1}if(t3[i]>1){t3[i]-=1}if(6*t3[i]<1){c[i]=t1+(t2-t1)*6*t3[i]}else if(2*t3[i]<1){c[i]=t2}else if(3*t3[i]<2){c[i]=t1+(t2-t1)*(2/3-t3[i])*6}else{c[i]=t1}}_ref1=[Math.round(c[0]*255),Math.round(c[1]*255),Math.round(c[2]*255)],r=_ref1[0],g=_ref1[1],b=_ref1[2]}return[r,g,b]};hsv2rgb=function(){var b,f,g,h,i,p,q,r,s,t,v,_ref,_ref1,_ref2,_ref3,_ref4,_ref5,_ref6;_ref=unpack(arguments),h=_ref[0],s=_ref[1],v=_ref[2];v*=255;if(s===0){r=g=b=v}else{if(h===360){h=0}if(h>360){h-=360}if(h<0){h+=360}h/=60;i=Math.floor(h);f=h-i;p=v*(1-s);q=v*(1-s*f);t=v*(1-s*(1-f));switch(i){case 0:_ref1=[v,t,p],r=_ref1[0],g=_ref1[1],b=_ref1[2];break;case 1:_ref2=[q,v,p],r=_ref2[0],g=_ref2[1],b=_ref2[2];break;case 2:_ref3=[p,v,t],r=_ref3[0],g=_ref3[1],b=_ref3[2];break;case 3:_ref4=[p,q,v],r=_ref4[0],g=_ref4[1],b=_ref4[2];break;case 4:_ref5=[t,p,v],r=_ref5[0],g=_ref5[1],b=_ref5[2];break;case 5:_ref6=[v,p,q],r=_ref6[0],g=_ref6[1],b=_ref6[2]}}r=Math.round(r);g=Math.round(g);b=Math.round(b);return[r,g,b]};K=18;X=.95047;Y=1;Z=1.08883;lab2lch=function(){var a,b,c,h,l,_ref;_ref=unpack(arguments),l=_ref[0],a=_ref[1],b=_ref[2];c=Math.sqrt(a*a+b*b);h=Math.atan2(b,a)/Math.PI*180;return[l,c,h]};lab2rgb=function(l,a,b){var g,r,x,y,z,_ref,_ref1;if(l!==void 0&&l.length===3){_ref=l,l=_ref[0],a=_ref[1],b=_ref[2]}if(l!==void 0&&l.length===3){_ref1=l,l=_ref1[0],a=_ref1[1],b=_ref1[2]}y=(l+16)/116;x=y+a/500;z=y-b/200;x=lab_xyz(x)*X;y=lab_xyz(y)*Y;z=lab_xyz(z)*Z;r=xyz_rgb(3.2404542*x-1.5371385*y-.4985314*z);g=xyz_rgb(-.969266*x+1.8760108*y+.041556*z);b=xyz_rgb(.0556434*x-.2040259*y+1.0572252*z);return[limit(r,0,255),limit(g,0,255),limit(b,0,255),1]};lab_xyz=function(x){if(x>.206893034){return x*x*x}else{return(x-4/29)/7.787037}};xyz_rgb=function(r){return Math.round(255*(r<=.00304?12.92*r:1.055*Math.pow(r,1/2.4)-.055))};lch2lab=function(){var c,h,l,_ref;_ref=unpack(arguments),l=_ref[0],c=_ref[1],h=_ref[2];h=h*Math.PI/180;return[l,Math.cos(h)*c,Math.sin(h)*c]};lch2rgb=function(l,c,h){var L,a,b,g,r,_ref,_ref1;_ref=lch2lab(l,c,h),L=_ref[0],a=_ref[1],b=_ref[2];_ref1=lab2rgb(L,a,b),r=_ref1[0],g=_ref1[1],b=_ref1[2];return[limit(r,0,255),limit(g,0,255),limit(b,0,255)]};luminance=function(r,g,b){var _ref;_ref=unpack(arguments),r=_ref[0],g=_ref[1],b=_ref[2];r=luminance_x(r);g=luminance_x(g);b=luminance_x(b);return.2126*r+.7152*g+.0722*b};luminance_x=function(x){x/=255;if(x<=.03928){return x/12.92}else{return Math.pow((x+.055)/1.055,2.4)}};rgb2hex=function(){var b,g,r,str,u,_ref;_ref=unpack(arguments),r=_ref[0],g=_ref[1],b=_ref[2];u=r<<16|g<<8|b;str="000000"+u.toString(16);return"#"+str.substr(str.length-6)};rgb2hsi=function(){var TWOPI,b,g,h,i,min,r,s,_ref;_ref=unpack(arguments),r=_ref[0],g=_ref[1],b=_ref[2];TWOPI=Math.PI*2;r/=255;g/=255;b/=255;min=Math.min(r,g,b);i=(r+g+b)/3;s=1-min/i;if(s===0){h=0}else{h=(r-g+(r-b))/2;h/=Math.sqrt((r-g)*(r-g)+(r-b)*(g-b));h=Math.acos(h);if(b>g){h=TWOPI-h}h/=TWOPI}return[h*360,s,i]};rgb2hsl=function(r,g,b){var h,l,max,min,s,_ref;if(r!==void 0&&r.length>=3){_ref=r,r=_ref[0],g=_ref[1],b=_ref[2]}r/=255;g/=255;b/=255;min=Math.min(r,g,b);max=Math.max(r,g,b);l=(max+min)/2;if(max===min){s=0;h=Number.NaN}else{s=l<.5?(max-min)/(max+min):(max-min)/(2-max-min)}if(r===max){h=(g-b)/(max-min)}else if(g===max){h=2+(b-r)/(max-min)}else if(b===max){h=4+(r-g)/(max-min)}h*=60;if(h<0){h+=360}return[h,s,l]};rgb2hsv=function(){var b,delta,g,h,max,min,r,s,v,_ref;_ref=unpack(arguments),r=_ref[0],g=_ref[1],b=_ref[2];min=Math.min(r,g,b);max=Math.max(r,g,b);delta=max-min;v=max/255;if(max===0){h=Number.NaN;s=0}else{s=delta/max;if(r===max){h=(g-b)/delta}if(g===max){h=2+(b-r)/delta}if(b===max){h=4+(r-g)/delta}h*=60;if(h<0){h+=360}}return[h,s,v]};rgb2lab=function(){var b,g,r,x,y,z,_ref;_ref=unpack(arguments),r=_ref[0],g=_ref[1],b=_ref[2];r=rgb_xyz(r);g=rgb_xyz(g);b=rgb_xyz(b);x=xyz_lab((.4124564*r+.3575761*g+.1804375*b)/X);y=xyz_lab((.2126729*r+.7151522*g+.072175*b)/Y);z=xyz_lab((.0193339*r+.119192*g+.9503041*b)/Z);return[116*y-16,500*(x-y),200*(y-z)]};rgb_xyz=function(r){if((r/=255)<=.04045){return r/12.92}else{return Math.pow((r+.055)/1.055,2.4)}};xyz_lab=function(x){if(x>.008856){return Math.pow(x,1/3)}else{return 7.787037*x+4/29}};rgb2lch=function(){var a,b,g,l,r,_ref,_ref1;_ref=unpack(arguments),r=_ref[0],g=_ref[1],b=_ref[2];_ref1=rgb2lab(r,g,b),l=_ref1[0],a=_ref1[1],b=_ref1[2];return lab2lch(l,a,b)};chroma.scale=function(colors,positions){var classifyValue,f,getClass,getColor,resetCache,setColors,setDomain,tmap,_colorCache,_colors,_correctLightness,_domain,_fixed,_max,_min,_mode,_nacol,_numClasses,_out,_pos,_spread;_mode="rgb";_nacol=chroma("#ccc");_spread=0;_fixed=false;_domain=[0,1];_colors=[];_out=false;_pos=[];_min=0;_max=1;_correctLightness=false;_numClasses=0;_colorCache={};setColors=function(colors,positions){var c,col,_i,_j,_ref,_ref1,_ref2;if(colors==null){colors=["#ddd","#222"]}if(colors!=null&&type(colors)==="string"&&((_ref=chroma.brewer)!=null?_ref[colors]:void 0)!=null){colors=chroma.brewer[colors]}if(type(colors)==="array"){colors=colors.slice(0);for(c=_i=0,_ref1=colors.length-1;0<=_ref1?_i<=_ref1:_i>=_ref1;c=0<=_ref1?++_i:--_i){col=colors[c];if(type(col)==="string"){colors[c]=chroma(col)}}if(positions!=null){_pos=positions}else{_pos=[];for(c=_j=0,_ref2=colors.length-1;0<=_ref2?_j<=_ref2:_j>=_ref2;c=0<=_ref2?++_j:--_j){_pos.push(c/(colors.length-1))}}}resetCache();return _colors=colors};setDomain=function(domain){if(domain==null){domain=[]}_domain=domain;_min=domain[0];_max=domain[domain.length-1];resetCache();if(domain.length===2){return _numClasses=0}else{return _numClasses=domain.length-1}};getClass=function(value){var i,n;if(_domain!=null){n=_domain.length-1;i=0;while(i=_domain[i]){i++}return i-1}return 0};tmap=function(t){return t};classifyValue=function(value){var i,maxc,minc,n,val;val=value;if(_domain.length>2){n=_domain.length-1;i=getClass(value);minc=_domain[0]+(_domain[1]-_domain[0])*(0+_spread*.5);maxc=_domain[n-1]+(_domain[n]-_domain[n-1])*(1-_spread*.5);val=_min+(_domain[i]+(_domain[i+1]-_domain[i])*.5-minc)/(maxc-minc)*(_max-_min)}return val};getColor=function(val,bypassMap){var c,col,f0,i,k,p,t,_i,_ref;if(bypassMap==null){bypassMap=false}if(isNaN(val)){return _nacol}if(!bypassMap){if(_domain.length>2){c=getClass(val);t=c/(_numClasses-1)}else{t=f0=_min!==_max?(val-_min)/(_max-_min):0;t=f0=(val-_min)/(_max-_min);t=Math.min(1,Math.max(0,t))}}else{t=val}if(!bypassMap){t=tmap(t)}k=Math.floor(t*1e4);if(_colorCache[k]){col=_colorCache[k]}else{if(type(_colors)==="array"){for(i=_i=0,_ref=_pos.length-1;0<=_ref?_i<=_ref:_i>=_ref;i=0<=_ref?++_i:--_i){p=_pos[i];if(t<=p){col=_colors[i];break}if(t>=p&&i===_pos.length-1){col=_colors[i];break}if(t>p&&t<_pos[i+1]){t=(t-p)/(_pos[i+1]-p);col=chroma.interpolate(_colors[i],_colors[i+1],t,_mode);break}}}else if(type(_colors)==="function"){col=_colors(t)}_colorCache[k]=col}return col};resetCache=function(){return _colorCache={}};setColors(colors,positions);f=function(v){var c;c=getColor(v);if(_out&&c[_out]){return c[_out]()}else{return c}};f.domain=function(domain,classes,mode,key){var d;if(mode==null){mode="e"}if(!arguments.length){return _domain}if(classes!=null){d=chroma.analyze(domain,key);if(classes===0){domain=[d.min,d.max]}else{domain=chroma.limits(d,mode,classes)}}setDomain(domain);return f};f.mode=function(_m){if(!arguments.length){return _mode}_mode=_m;resetCache();return f};f.range=function(colors,_pos){setColors(colors,_pos);return f};f.out=function(_o){_out=_o;return f};f.spread=function(val){if(!arguments.length){return _spread}_spread=val;return f};f.correctLightness=function(v){if(!arguments.length){return _correctLightness}_correctLightness=v;resetCache();if(_correctLightness){tmap=function(t){var L0,L1,L_actual,L_diff,L_ideal,max_iter,pol,t0,t1;L0=getColor(0,true).lab()[0];L1=getColor(1,true).lab()[0];pol=L0>L1;L_actual=getColor(t,true).lab()[0];L_ideal=L0+(L1-L0)*t;L_diff=L_actual-L_ideal;t0=0;t1=1;max_iter=20;while(Math.abs(L_diff)>.01&&max_iter-->0){!function(){if(pol){L_diff*=-1}if(L_diff<0){t0=t;t+=(t1-t)*.5}else{t1=t;t+=(t0-t)*.5}L_actual=getColor(t,true).lab()[0];return L_diff=L_actual-L_ideal}()}return t}}else{tmap=function(t){return t}}return f};f.colors=function(out){var i,samples,_i,_j,_len,_ref;if(out==null){out="hex"}colors=[];samples=[];if(_domain.length>2){for(i=_i=1,_ref=_domain.length;1<=_ref?_i<_ref:_i>_ref;i=1<=_ref?++_i:--_i){samples.push((_domain[i-1]+_domain[i])*.5)}}else{samples=_domain}for(_j=0,_len=samples.length;_j<_len;_j++){i=samples[_j];colors.push(f(i)[out]())}return colors};return f};if((_ref=chroma.scales)==null){chroma.scales={}}chroma.scales.cool=function(){return chroma.scale([chroma.hsl(180,1,.9),chroma.hsl(250,.7,.4)])};chroma.scales.hot=function(){return chroma.scale(["#000","#f00","#ff0","#fff"],[0,.25,.75,1]).mode("rgb")};chroma.analyze=function(data,key,filter){var add,k,r,val,visit,_i,_len;r={min:Number.MAX_VALUE,max:Number.MAX_VALUE*-1,sum:0,values:[],count:0};if(filter==null){filter=function(){return true}}add=function(val){if(val!=null&&!isNaN(val)){r.values.push(val);r.sum+=val;if(valr.max){r.max=val}r.count+=1}};visit=function(val,k){if(filter(val,k)){if(key!=null&&type(key)==="function"){return add(key(val))}else if(key!=null&&type(key)==="string"||type(key)==="number"){return add(val[key])}else{return add(val)}}};if(type(data)==="array"){for(_i=0,_len=data.length;_i<_len;_i++){val=data[_i];visit(val)}}else{for(k in data){val=data[k];visit(val,k)}}r.domain=[r.min,r.max];r.limits=function(mode,num){return chroma.limits(r,mode,num)};return r};chroma.limits=function(data,mode,num){var assignments,best,centroids,cluster,clusterSizes,dist,i,j,kClusters,limits,max,max_log,min,min_log,mindist,n,nb_iters,newCentroids,p,pb,pr,repeat,sum,tmpKMeansBreaks,value,values,_i,_j,_k,_l,_m,_n,_o,_p,_q,_r,_ref1,_ref10,_ref11,_ref12,_ref13,_ref14,_ref15,_ref2,_ref3,_ref4,_ref5,_ref6,_ref7,_ref8,_ref9,_s,_t,_u,_v,_w;if(mode==null){mode="equal"}if(num==null){num=7}if(type(data)==="array"){data=chroma.analyze(data)}min=data.min;max=data.max;sum=data.sum;values=data.values.sort(function(a,b){return a-b});limits=[];if(mode.substr(0,1)==="c"){limits.push(min);limits.push(max)}if(mode.substr(0,1)==="e"){limits.push(min);for(i=_i=1,_ref1=num-1;1<=_ref1?_i<=_ref1:_i>=_ref1;i=1<=_ref1?++_i:--_i){limits.push(min+i/num*(max-min))}limits.push(max)}else if(mode.substr(0,1)==="l"){if(min<=0){throw"Logarithmic scales are only possible for values > 0"}min_log=Math.LOG10E*Math.log(min);max_log=Math.LOG10E*Math.log(max);limits.push(min);for(i=_j=1,_ref2=num-1;1<=_ref2?_j<=_ref2:_j>=_ref2;i=1<=_ref2?++_j:--_j){limits.push(Math.pow(10,min_log+i/num*(max_log-min_log)))}limits.push(max)}else if(mode.substr(0,1)==="q"){limits.push(min);for(i=_k=1,_ref3=num-1;1<=_ref3?_k<=_ref3:_k>=_ref3;i=1<=_ref3?++_k:--_k){p=values.length*i/num;pb=Math.floor(p);if(pb===p){limits.push(values[pb])}else{pr=p-pb;limits.push(values[pb]*pr+values[pb+1]*(1-pr))}}limits.push(max)}else if(mode.substr(0,1)==="k"){n=values.length;assignments=new Array(n);clusterSizes=new Array(num);repeat=true;nb_iters=0;centroids=null;centroids=[];centroids.push(min);for(i=_l=1,_ref4=num-1;1<=_ref4?_l<=_ref4:_l>=_ref4;i=1<=_ref4?++_l:--_l){centroids.push(min+i/num*(max-min))}centroids.push(max);while(repeat){for(j=_m=0,_ref5=num-1;0<=_ref5?_m<=_ref5:_m>=_ref5;j=0<=_ref5?++_m:--_m){clusterSizes[j]=0}for(i=_n=0,_ref6=n-1;0<=_ref6?_n<=_ref6:_n>=_ref6;i=0<=_ref6?++_n:--_n){value=values[i];mindist=Number.MAX_VALUE;for(j=_o=0,_ref7=num-1;0<=_ref7?_o<=_ref7:_o>=_ref7;j=0<=_ref7?++_o:--_o){dist=Math.abs(centroids[j]-value);if(dist=_ref8;j=0<=_ref8?++_p:--_p){newCentroids[j]=null}for(i=_q=0,_ref9=n-1;0<=_ref9?_q<=_ref9:_q>=_ref9;i=0<=_ref9?++_q:--_q){cluster=assignments[i];if(newCentroids[cluster]===null){newCentroids[cluster]=values[i]}else{newCentroids[cluster]+=values[i]}}for(j=_r=0,_ref10=num-1;0<=_ref10?_r<=_ref10:_r>=_ref10;j=0<=_ref10?++_r:--_r){newCentroids[j]*=1/clusterSizes[j]}repeat=false;for(j=_s=0,_ref11=num-1;0<=_ref11?_s<=_ref11:_s>=_ref11;j=0<=_ref11?++_s:--_s){if(newCentroids[j]!==centroids[i]){repeat=true;break}}centroids=newCentroids;nb_iters++;if(nb_iters>200){repeat=false}}kClusters={};for(j=_t=0,_ref12=num-1;0<=_ref12?_t<=_ref12:_t>=_ref12;j=0<=_ref12?++_t:--_t){kClusters[j]=[]}for(i=_u=0,_ref13=n-1;0<=_ref13?_u<=_ref13:_u>=_ref13;i=0<=_ref13?++_u:--_u){cluster=assignments[i];kClusters[cluster].push(values[i])}tmpKMeansBreaks=[];for(j=_v=0,_ref14=num-1;0<=_ref14?_v<=_ref14:_v>=_ref14;j=0<=_ref14?++_v:--_v){tmpKMeansBreaks.push(kClusters[j][0]);tmpKMeansBreaks.push(kClusters[j][kClusters[j].length-1])}tmpKMeansBreaks=tmpKMeansBreaks.sort(function(a,b){return a-b});limits.push(tmpKMeansBreaks[0]);for(i=_w=1,_ref15=tmpKMeansBreaks.length-1;_w<=_ref15;i=_w+=2){if(!isNaN(tmpKMeansBreaks[i])){limits.push(tmpKMeansBreaks[i])}}}return limits};/**
+ ColorBrewer colors for chroma.js
+
+ Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The
+ Pennsylvania State University.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software distributed
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations under the License.
+
+ @preserve
+ */
+chroma.brewer=brewer={OrRd:["#fff7ec","#fee8c8","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#b30000","#7f0000"],PuBu:["#fff7fb","#ece7f2","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#045a8d","#023858"],BuPu:["#f7fcfd","#e0ecf4","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#810f7c","#4d004b"],Oranges:["#fff5eb","#fee6ce","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#a63603","#7f2704"],BuGn:["#f7fcfd","#e5f5f9","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#006d2c","#00441b"],YlOrBr:["#ffffe5","#fff7bc","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#993404","#662506"],YlGn:["#ffffe5","#f7fcb9","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#006837","#004529"],Reds:["#fff5f0","#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#a50f15","#67000d"],RdPu:["#fff7f3","#fde0dd","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177","#49006a"],Greens:["#f7fcf5","#e5f5e0","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#006d2c","#00441b"],YlGnBu:["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#253494","#081d58"],Purples:["#fcfbfd","#efedf5","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#54278f","#3f007d"],GnBu:["#f7fcf0","#e0f3db","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#0868ac","#084081"],Greys:["#ffffff","#f0f0f0","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525","#000000"],YlOrRd:["#ffffcc","#ffeda0","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#bd0026","#800026"],PuRd:["#f7f4f9","#e7e1ef","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#980043","#67001f"],Blues:["#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#08519c","#08306b"],PuBuGn:["#fff7fb","#ece2f0","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016c59","#014636"],Spectral:["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2"],RdYlGn:["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"],RdBu:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"],PiYG:["#8e0152","#c51b7d","#de77ae","#f1b6da","#fde0ef","#f7f7f7","#e6f5d0","#b8e186","#7fbc41","#4d9221","#276419"],PRGn:["#40004b","#762a83","#9970ab","#c2a5cf","#e7d4e8","#f7f7f7","#d9f0d3","#a6dba0","#5aae61","#1b7837","#00441b"],RdYlBu:["#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"],BrBG:["#543005","#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e","#003c30"],RdGy:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#ffffff","#e0e0e0","#bababa","#878787","#4d4d4d","#1a1a1a"],PuOr:["#7f3b08","#b35806","#e08214","#fdb863","#fee0b6","#f7f7f7","#d8daeb","#b2abd2","#8073ac","#542788","#2d004b"],Set2:["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854","#ffd92f","#e5c494","#b3b3b3"],Accent:["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0","#f0027f","#bf5b17","#666666"],Set1:["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf","#999999"],Set3:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd","#ccebc5","#ffed6f"],Dark2:["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02","#a6761d","#666666"],Paired:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a","#ffff99","#b15928"],Pastel2:["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9","#fff2ae","#f1e2cc","#cccccc"],Pastel1:["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd","#fddaec","#f2f2f2"]};chroma.colors=colors={indigo:"#4b0082",gold:"#ffd700",hotpink:"#ff69b4",firebrick:"#b22222",indianred:"#cd5c5c",yellow:"#ffff00",mistyrose:"#ffe4e1",darkolivegreen:"#556b2f",olive:"#808000",darkseagreen:"#8fbc8f",pink:"#ffc0cb",tomato:"#ff6347",lightcoral:"#f08080",orangered:"#ff4500",navajowhite:"#ffdead",lime:"#00ff00",palegreen:"#98fb98",darkslategrey:"#2f4f4f",greenyellow:"#adff2f",burlywood:"#deb887",seashell:"#fff5ee",mediumspringgreen:"#00fa9a",fuchsia:"#ff00ff",papayawhip:"#ffefd5",blanchedalmond:"#ffebcd",chartreuse:"#7fff00",dimgray:"#696969",black:"#000000",peachpuff:"#ffdab9",springgreen:"#00ff7f",aquamarine:"#7fffd4",white:"#ffffff",orange:"#ffa500",lightsalmon:"#ffa07a",darkslategray:"#2f4f4f",brown:"#a52a2a",ivory:"#fffff0",dodgerblue:"#1e90ff",peru:"#cd853f",lawngreen:"#7cfc00",chocolate:"#d2691e",crimson:"#dc143c",forestgreen:"#228b22",darkgrey:"#a9a9a9",lightseagreen:"#20b2aa",cyan:"#00ffff",mintcream:"#f5fffa",silver:"#c0c0c0",antiquewhite:"#faebd7",mediumorchid:"#ba55d3",skyblue:"#87ceeb",gray:"#808080",darkturquoise:"#00ced1",goldenrod:"#daa520",darkgreen:"#006400",floralwhite:"#fffaf0",darkviolet:"#9400d3",darkgray:"#a9a9a9",moccasin:"#ffe4b5",saddlebrown:"#8b4513",grey:"#808080",darkslateblue:"#483d8b",lightskyblue:"#87cefa",lightpink:"#ffb6c1",mediumvioletred:"#c71585",slategrey:"#708090",red:"#ff0000",deeppink:"#ff1493",limegreen:"#32cd32",darkmagenta:"#8b008b",palegoldenrod:"#eee8aa",plum:"#dda0dd",turquoise:"#40e0d0",lightgrey:"#d3d3d3",lightgoldenrodyellow:"#fafad2",darkgoldenrod:"#b8860b",lavender:"#e6e6fa",maroon:"#800000",yellowgreen:"#9acd32",sandybrown:"#f4a460",thistle:"#d8bfd8",violet:"#ee82ee",navy:"#000080",magenta:"#ff00ff",dimgrey:"#696969",tan:"#d2b48c",rosybrown:"#bc8f8f",olivedrab:"#6b8e23",blue:"#0000ff",lightblue:"#add8e6",ghostwhite:"#f8f8ff",honeydew:"#f0fff0",cornflowerblue:"#6495ed",slateblue:"#6a5acd",linen:"#faf0e6",darkblue:"#00008b",powderblue:"#b0e0e6",seagreen:"#2e8b57",darkkhaki:"#bdb76b",snow:"#fffafa",sienna:"#a0522d",mediumblue:"#0000cd",royalblue:"#4169e1",lightcyan:"#e0ffff",green:"#008000",mediumpurple:"#9370db",midnightblue:"#191970",cornsilk:"#fff8dc",paleturquoise:"#afeeee",bisque:"#ffe4c4",slategray:"#708090",darkcyan:"#008b8b",khaki:"#f0e68c",wheat:"#f5deb3",teal:"#008080",darkorchid:"#9932cc",deepskyblue:"#00bfff",salmon:"#fa8072",darkred:"#8b0000",steelblue:"#4682b4",palevioletred:"#db7093",lightslategray:"#778899",aliceblue:"#f0f8ff",lightslategrey:"#778899",lightgreen:"#90ee90",orchid:"#da70d6",gainsboro:"#dcdcdc",mediumseagreen:"#3cb371",lightgray:"#d3d3d3",mediumturquoise:"#48d1cc",lemonchiffon:"#fffacd",cadetblue:"#5f9ea0",lightyellow:"#ffffe0",lavenderblush:"#fff0f5",coral:"#ff7f50",purple:"#800080",aqua:"#00ffff",whitesmoke:"#f5f5f5",mediumslateblue:"#7b68ee",darkorange:"#ff8c00",mediumaquamarine:"#66cdaa",darksalmon:"#e9967a",beige:"#f5f5dc",blueviolet:"#8a2be2",azure:"#f0ffff",lightsteelblue:"#b0c4de",oldlace:"#fdf5e6"};type=function(){var classToType,name,_i,_len,_ref1;classToType={};_ref1="Boolean Number String Function Array Date RegExp Undefined Null".split(" ");for(_i=0,_len=_ref1.length;_i<_len;_i++){name=_ref1[_i];classToType["[object "+name+"]"]=name.toLowerCase()}return function(obj){var strType;strType=Object.prototype.toString.call(obj);return classToType[strType]||"object"}}();limit=function(x,min,max){if(min==null){min=0}if(max==null){max=1}if(xmax){x=max}return x};unpack=function(args){if(args.length>=3){return args}else{return args[0]}};TWOPI=Math.PI*2;PITHIRD=Math.PI/3;cos=Math.cos;bezier=function(colors){var I,I0,I1,c,lab0,lab1,lab2,lab3,_ref1,_ref2,_ref3;colors=function(){var _i,_len,_results;_results=[];for(_i=0,_len=colors.length;_i<_len;_i++){c=colors[_i];_results.push(chroma(c))}return _results}();if(colors.length===2){_ref1=function(){var _i,_len,_results;_results=[];for(_i=0,_len=colors.length;_i<_len;_i++){c=colors[_i];_results.push(c.lab())}return _results}(),lab0=_ref1[0],lab1=_ref1[1];I=function(t){var i,lab;lab=function(){var _i,_results;_results=[];for(i=_i=0;_i<=2;i=++_i){_results.push(lab0[i]+t*(lab1[i]-lab0[i]))}return _results}();return chroma.lab.apply(chroma,lab)}}else if(colors.length===3){_ref2=function(){var _i,_len,_results;_results=[];for(_i=0,_len=colors.length;_i<_len;_i++){c=colors[_i];_results.push(c.lab())}return _results}(),lab0=_ref2[0],lab1=_ref2[1],lab2=_ref2[2];I=function(t){var i,lab;lab=function(){var _i,_results;_results=[];for(i=_i=0;_i<=2;i=++_i){_results.push((1-t)*(1-t)*lab0[i]+2*(1-t)*t*lab1[i]+t*t*lab2[i])}return _results}();return chroma.lab.apply(chroma,lab)}}else if(colors.length===4){_ref3=function(){var _i,_len,_results;_results=[];for(_i=0,_len=colors.length;_i<_len;_i++){c=colors[_i];_results.push(c.lab())}return _results}(),lab0=_ref3[0],lab1=_ref3[1],lab2=_ref3[2],lab3=_ref3[3];I=function(t){var i,lab;lab=function(){var _i,_results;_results=[];for(i=_i=0;_i<=2;i=++_i){_results.push((1-t)*(1-t)*(1-t)*lab0[i]+3*(1-t)*(1-t)*t*lab1[i]+3*(1-t)*t*t*lab2[i]+t*t*t*lab3[i])}return _results}();return chroma.lab.apply(chroma,lab)}}else if(colors.length===5){I0=bezier(colors.slice(0,3));I1=bezier(colors.slice(2,5));I=function(t){if(t<.5){return I0(t*2)}else{return I1((t-.5)*2)}}}return I};chroma.interpolate.bezier=bezier}.call(this);
\ No newline at end of file
diff --git a/Gruntfile.js b/Gruntfile.js
index 6d87b0f..8f8b7cd 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -113,7 +113,7 @@ module.exports = function(grunt) {
var docsFiles = srcFiles.concat(extraFiles, 'README.md');
var libFiles = srcFiles.concat(thirdPartyFiles);
- var fullLibFiles = [].concat(extraFiles, srcFiles, thirdPartyFiles);
+ var fullLibFiles = [].concat(srcFiles, extraFiles, thirdPartyFiles);
grunt.initConfig({
jsdoc: {
diff --git a/dist/twgl-full.js b/dist/twgl-full.js
index cf3c40e..85e6c99 100644
--- a/dist/twgl-full.js
+++ b/dist/twgl-full.js
@@ -27,6 +27,6 @@
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/(function(root,factory){if(typeof define==="function"&&define.amd){define([],factory)}else{var lib=factory.call(root);root.twgl=root.twgl||{};root.twgl.v3=lib}})(this,function(){"use strict";var VecType=Float32Array;function create(){return new VecType(3)}function add(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]+b[0];dst[1]=a[1]+b[1];dst[2]=a[2]+b[2];return dst}function subtract(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]-b[0];dst[1]=a[1]-b[1];dst[2]=a[2]-b[2];return dst}function lerp(a,b,t,dst){dst=dst||new VecType(3);dst[0]=(1-t)*a[0]+t*b[0];dst[1]=(1-t)*a[1]+t*b[1];dst[2]=(1-t)*a[2]+t*b[2];return dst}function mulScalar(v,k,dst){dst=dst||new VecType(3);dst[0]=v[0]*k;dst[1]=v[1]*k;dst[2]=v[2]*k;return dst}function divScalar(v,k,dst){dst=dst||new VecType(3);dst[0]=v[0]/k;dst[1]=v[1]/k;dst[2]=v[2]/k;return dst}function cross(a,b,dst){dst=dst||new VecType(3);dst[0]=a[1]*b[2]-a[2]*b[1];dst[1]=a[2]*b[0]-a[0]*b[2];dst[2]=a[0]*b[1]-a[1]*b[0];return dst}function dot(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]}function length(v){return Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])}function lengthSq(a){return a[0]*a[0]+a[1]*a[1]+a[2]*a[2]}function normalize(a,dst){dst=dst||new VecType(3);var lenSq=a[0]*a[0]+a[1]*a[1]+a[2]*a[2];var len=Math.sqrt(lenSq);if(len>1e-5){dst[0]=a[0]/len;dst[1]=a[1]/len;dst[2]=a[2]/len}else{dst[0]=0;dst[1]=0;dst[2]=0}return dst}function negate(v,dst){dst=dst||new VecType(3);dst[0]=-v[0];dst[1]=-v[1];dst[2]=-v[2];return dst}function copy(v,dst){dst=dst||new VecType(3);dst[0]=v[0];dst[1]=v[1];dst[2]=v[2];return dst}function multiply(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]*b[0];dst[1]=a[1]*b[1];dst[2]=a[2]*b[2];return dst}function divide(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]/b[0];dst[1]=a[1]/b[1];dst[2]=a[2]/b[2];return dst}return{add:add,copy:copy,create:create,cross:cross,divide:divide,divScalar:divScalar,dot:dot,lerp:lerp,length:length,lengthSq:lengthSq,mulScalar:mulScalar,multiply:multiply,negate:negate,normalize:normalize,subtract:subtract}});(function(root,factory){if(typeof define==="function"&&define.amd){define(["./v3"],factory)}else{var lib=factory.call(root);root.twgl=root.twgl||{};root.twgl.m4=lib}})(this,function(v3){"use strict";var v3=v3||this.twgl.v3;if(!v3){throw"need v3.js"}var MatType=Float32Array;var tempV3a=v3.create();var tempV3b=v3.create();var tempV3c=v3.create();function negate(m,dst){dst=dst||new MatType(16);dst[0]=-m[0];dst[1]=-m[1];dst[2]=-m[2];dst[3]=-m[3];dst[4]=-m[4];dst[5]=-m[5];dst[6]=-m[6];dst[7]=-m[7];dst[8]=-m[8];dst[9]=-m[9];dst[10]=-m[10];dst[11]=-m[11];dst[12]=-m[12];dst[13]=-m[13];dst[14]=-m[14];dst[15]=-m[15];return dst}function copy(m,dst){dst=dst||new MatType(16);dst[0]=m[0];dst[1]=m[1];dst[2]=m[2];dst[3]=m[3];dst[4]=m[4];dst[5]=m[5];dst[6]=m[6];dst[7]=m[7];dst[8]=m[8];dst[9]=m[9];dst[10]=m[10];dst[11]=m[11];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15];return dst}function identity(dst){dst=dst||new MatType(16);dst[0]=1;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=1;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function transpose(m,dst){dst=dst||new MatType(16);if(dst===m){var t;t=m[1];m[1]=m[4];m[4]=t;t=m[2];m[2]=m[8];m[8]=t;t=m[3];m[3]=m[12];m[12]=t;t=m[6];m[6]=m[9];m[9]=t;t=m[7];m[7]=m[13];m[13]=t;t=m[11];m[11]=m[14];m[14]=t;return dst}var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];dst[0]=m00;dst[1]=m10;dst[2]=m20;dst[3]=m30;dst[4]=m01;dst[5]=m11;dst[6]=m21;dst[7]=m31;dst[8]=m02;dst[9]=m12;dst[10]=m22;dst[11]=m32;dst[12]=m03;dst[13]=m13;dst[14]=m23;dst[15]=m33;return dst}function inverse(m,dst){dst=dst||new MatType(16);var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];var tmp_0=m22*m33;var tmp_1=m32*m23;var tmp_2=m12*m33;var tmp_3=m32*m13;var tmp_4=m12*m23;var tmp_5=m22*m13;var tmp_6=m02*m33;var tmp_7=m32*m03;var tmp_8=m02*m23;var tmp_9=m22*m03;var tmp_10=m02*m13;var tmp_11=m12*m03;var tmp_12=m20*m31;var tmp_13=m30*m21;var tmp_14=m10*m31;var tmp_15=m30*m11;var tmp_16=m10*m21;var tmp_17=m20*m11;var tmp_18=m00*m31;var tmp_19=m30*m01;var tmp_20=m00*m21;var tmp_21=m20*m01;var tmp_22=m00*m11;var tmp_23=m10*m01;var t0=tmp_0*m11+tmp_3*m21+tmp_4*m31-(tmp_1*m11+tmp_2*m21+tmp_5*m31);var t1=tmp_1*m01+tmp_6*m21+tmp_9*m31-(tmp_0*m01+tmp_7*m21+tmp_8*m31);var t2=tmp_2*m01+tmp_7*m11+tmp_10*m31-(tmp_3*m01+tmp_6*m11+tmp_11*m31);var t3=tmp_5*m01+tmp_8*m11+tmp_11*m21-(tmp_4*m01+tmp_9*m11+tmp_10*m21);var d=1/(m00*t0+m10*t1+m20*t2+m30*t3);dst[0]=d*t0;dst[1]=d*t1;dst[2]=d*t2;dst[3]=d*t3;dst[4]=d*(tmp_1*m10+tmp_2*m20+tmp_5*m30-(tmp_0*m10+tmp_3*m20+tmp_4*m30));dst[5]=d*(tmp_0*m00+tmp_7*m20+tmp_8*m30-(tmp_1*m00+tmp_6*m20+tmp_9*m30));dst[6]=d*(tmp_3*m00+tmp_6*m10+tmp_11*m30-(tmp_2*m00+tmp_7*m10+tmp_10*m30));dst[7]=d*(tmp_4*m00+tmp_9*m10+tmp_10*m20-(tmp_5*m00+tmp_8*m10+tmp_11*m20));dst[8]=d*(tmp_12*m13+tmp_15*m23+tmp_16*m33-(tmp_13*m13+tmp_14*m23+tmp_17*m33));dst[9]=d*(tmp_13*m03+tmp_18*m23+tmp_21*m33-(tmp_12*m03+tmp_19*m23+tmp_20*m33));dst[10]=d*(tmp_14*m03+tmp_19*m13+tmp_22*m33-(tmp_15*m03+tmp_18*m13+tmp_23*m33));dst[11]=d*(tmp_17*m03+tmp_20*m13+tmp_23*m23-(tmp_16*m03+tmp_21*m13+tmp_22*m23));dst[12]=d*(tmp_14*m22+tmp_17*m32+tmp_13*m12-(tmp_16*m32+tmp_12*m12+tmp_15*m22));dst[13]=d*(tmp_20*m32+tmp_12*m02+tmp_19*m22-(tmp_18*m22+tmp_21*m32+tmp_13*m02));dst[14]=d*(tmp_18*m12+tmp_23*m32+tmp_15*m02-(tmp_22*m32+tmp_14*m02+tmp_19*m12));dst[15]=d*(tmp_22*m22+tmp_16*m02+tmp_21*m12-(tmp_20*m12+tmp_23*m22+tmp_17*m02));return dst}function multiply(a,b,dst){dst=dst||new MatType(16);var a00=a[0];var a01=a[1];var a02=a[2];var a03=a[3];var a10=a[4+0];var a11=a[4+1];var a12=a[4+2];var a13=a[4+3];var a20=a[8+0];var a21=a[8+1];var a22=a[8+2];var a23=a[8+3];var a30=a[12+0];var a31=a[12+1];var a32=a[12+2];var a33=a[12+3];var b00=b[0];var b01=b[1];var b02=b[2];var b03=b[3];var b10=b[4+0];var b11=b[4+1];var b12=b[4+2];var b13=b[4+3];var b20=b[8+0];var b21=b[8+1];var b22=b[8+2];var b23=b[8+3];var b30=b[12+0];var b31=b[12+1];var b32=b[12+2];var b33=b[12+3];dst[0]=a00*b00+a01*b10+a02*b20+a03*b30;dst[1]=a00*b01+a01*b11+a02*b21+a03*b31;dst[2]=a00*b02+a01*b12+a02*b22+a03*b32;dst[3]=a00*b03+a01*b13+a02*b23+a03*b33;dst[4]=a10*b00+a11*b10+a12*b20+a13*b30;dst[5]=a10*b01+a11*b11+a12*b21+a13*b31;dst[6]=a10*b02+a11*b12+a12*b22+a13*b32;dst[7]=a10*b03+a11*b13+a12*b23+a13*b33;dst[8]=a20*b00+a21*b10+a22*b20+a23*b30;dst[9]=a20*b01+a21*b11+a22*b21+a23*b31;dst[10]=a20*b02+a21*b12+a22*b22+a23*b32;dst[11]=a20*b03+a21*b13+a22*b23+a23*b33;dst[12]=a30*b00+a31*b10+a32*b20+a33*b30;dst[13]=a30*b01+a31*b11+a32*b21+a33*b31;dst[14]=a30*b02+a31*b12+a32*b22+a33*b32;dst[15]=a30*b03+a31*b13+a32*b23+a33*b33;return dst}function setTranslation(a,dst){dst=dst||identity();dst[12]=v[0];dst[13]=v[1];dst[14]=v[2];dst[15]=1;return dst}function getTranslation(m,dst){dst=dst||v3.create();dst[0]=m[12];dst[1]=m[13];dst[2]=m[14];return dst}function getAxis(m,axis,dst){dst=dst||v3.create();var off=axis*4;dst[0]=m[off+0];dst[1]=m[off+1];dst[2]=m[off+2];return dst}function perspective(fieldOfViewYInRadians,aspect,zNear,zFar,dst){dst=dst||new MatType(16);var f=Math.tan(Math.PI*.5-.5*fieldOfViewYInRadians);var rangeInv=1/(zNear-zFar);dst[0]=f/aspect;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=f;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=(zNear+zFar)*rangeInv;dst[11]=-1;dst[12]=0;dst[13]=0;dst[14]=zNear*zFar*rangeInv*2;dst[15]=0;return dst}function ortho(left,right,bottom,top,near,far,dst){dst=dst||new MatType(16);dst[0]=2/(right-left);dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=2/(top-bottom);dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=-1/(far-near);dst[11]=0;dst[12]=(right+left)/(left-right);dst[13]=(top+bottom)/(bottom-top);dst[14]=-near/(near-far);dst[15]=1;return dst}function frustum(left,right,bottom,top,near,far,dst){dst=dst||new MatType(16);var dx=right-left;var dy=top-bottom;var dz=near-far;dst[0]=2*near/dx;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=2*near/dy;dst[6]=0;dst[7]=0;dst[8]=(left+right)/dx;dst[9]=(top+bottom)/dy;dst[10]=far/dz;dst[11]=-1;dst[12]=0;dst[13]=0;dst[14]=near*far/dz;dst[15]=0;return dst}function lookAt(eye,target,up,dst){dst=dst||new MatType(16);var xAxis=tempV3a;var yAxis=tempV3b;var zAxis=tempV3c;v3.normalize(v3.subtract(eye,target,zAxis),zAxis);v3.cross(up,zAxis,xAxis);v3.cross(zAxis,xAxis,yAxis);dst[0]=xAxis[0];dst[1]=xAxis[1];dst[2]=xAxis[2];dst[3]=0;dst[4]=yAxis[0];dst[5]=yAxis[1];dst[6]=yAxis[2];dst[7]=0;dst[8]=zAxis[0];dst[9]=zAxis[1];dst[10]=zAxis[2];dst[11]=0;dst[12]=eye[0];dst[13]=eye[1];dst[14]=eye[2];dst[15]=1;return dst}function translation(v,dst){dst=dst||new MatType(16);dst[0]=1;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=1;dst[11]=0;dst[12]=v[0];dst[13]=v[1];dst[14]=v[2];dst[15]=1;return dst}function translate(m,v,dst){dst=dst||new MatType(16);var v0=v[0];var v1=v[1];var v2=v[2];var m00=m[0];var m01=m[1];var m02=m[2];var m03=m[3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];if(m!==dst){dst[0]=m00;dst[1]=m01;dst[2]=m02;dst[3]=m03;dst[4]=m10;dst[5]=m11;dst[6]=m12;dst[7]=m13;dst[8]=m20;dst[9]=m21;dst[10]=m22;dst[11]=m23}dst[12]=m00*v0+m10*v1+m20*v2+m30;dst[13]=m01*v0+m11*v1+m21*v2+m31;dst[14]=m02*v0+m12*v1+m22*v2+m32;dst[15]=m03*v0+m13*v1+m23*v2+m33;return dst}function rotationX(angleInRadians,dst){dst=dst||new MatType(16);var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=1;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=c;dst[6]=s;dst[7]=0;dst[8]=0;dst[9]=-s;dst[10]=c;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function rotateX(m,angleInRadians,dst){dst=dst||new MatType(16);var m10=m[4];var m11=m[5];var m12=m[6];var m13=m[7];var m20=m[8];var m21=m[9];var m22=m[10];var m23=m[11];var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[4]=c*m10+s*m20;dst[5]=c*m11+s*m21;dst[6]=c*m12+s*m22;dst[7]=c*m13+s*m23;dst[8]=c*m20-s*m10;dst[9]=c*m21-s*m11;dst[10]=c*m22-s*m12;dst[11]=c*m23-s*m13;if(m!==dst){dst[0]=m[0];dst[1]=m[1];dst[2]=m[2];dst[3]=m[3];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function rotationY(angleInRadians,dst){dst=dst||new MatType(16);var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c;dst[1]=0;dst[2]=-s;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=s;dst[9]=0;dst[10]=c;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function rotateY(m,angleInRadians,dst){dst=dst||new MatType(16);var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c*m00-s*m20;dst[1]=c*m01-s*m21;dst[2]=c*m02-s*m22;dst[3]=c*m03-s*m23;dst[8]=c*m20+s*m00;dst[9]=c*m21+s*m01;dst[10]=c*m22+s*m02;dst[11]=c*m23+s*m03;if(m!==dst){dst[4]=m[4];dst[5]=m[5];dst[6]=m[6];dst[7]=m[7];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function rotationZ(angleInRadians,dst){dst=dst||new MatType(16);var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c;dst[1]=s;dst[2]=0;dst[3]=0;dst[4]=-s;dst[5]=c;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=1;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function rotateZ(m,angleInRadians,dst){dst=dst||new MatType(16);var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c*m00+s*m10;dst[1]=c*m01+s*m11;dst[2]=c*m02+s*m12;dst[3]=c*m03+s*m13;dst[4]=c*m10-s*m00;dst[5]=c*m11-s*m01;dst[6]=c*m12-s*m02;dst[7]=c*m13-s*m03;if(m!==dst){dst[8]=m[8];dst[9]=m[9];dst[10]=m[10];dst[11]=m[11];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function axisRotation(axis,angleInRadians,dst){dst=dst||new MatType(16);var x=axis[0];var y=axis[1];var z=axis[2];var n=Math.sqrt(x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;var yy=y*y;var zz=z*z;var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);var oneMinusCosine=1-c;dst[0]=xx+(1-xx)*c;dst[1]=x*y*oneMinusCosine+z*s;dst[2]=x*z*oneMinusCosine-y*s;dst[3]=0;dst[4]=x*y*oneMinusCosine-z*s;dst[5]=yy+(1-yy)*c;dst[6]=y*z*oneMinusCosine+x*s;dst[7]=0;dst[8]=x*z*oneMinusCosine+y*s;dst[9]=y*z*oneMinusCosine-x*s;dst[10]=zz+(1-zz)*c;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function axisRotate(m,axis,angleInRadians,dst){dst=dst||new MatType(16);var x=axis[0];var y=axis[1];var z=axis[2];var n=Math.sqrt(x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;var yy=y*y;var zz=z*z;var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);var oneMinusCosine=1-c;var r00=xx+(1-xx)*c;var r01=x*y*oneMinusCosine+z*s;var r02=x*z*oneMinusCosine-y*s;var r10=x*y*oneMinusCosine-z*s;var r11=yy+(1-yy)*c;var r12=y*z*oneMinusCosine+x*s;var r20=x*z*oneMinusCosine+y*s;var r21=y*z*oneMinusCosine-x*s;var r22=zz+(1-zz)*c;var m00=m[0];var m01=m[1];var m02=m[2];var m03=m[3];var m10=m[4];var m11=m[5];var m12=m[6];var m13=m[7];var m20=m[8];var m21=m[9];var m22=m[10];var m23=m[11];var m30=m[12];var m31=m[13];var m32=m[14];var m33=m[15];dst[0]=r00*m00+r01*m10+r02*m20;dst[1]=r00*m01+r01*m11+r02*m21;dst[2]=r00*m02+r01*m12+r02*m22;dst[3]=r00*m03+r01*m13+r02*m23;dst[4]=r10*m00+r11*m10+r12*m20;dst[5]=r10*m01+r11*m11+r12*m21;dst[6]=r10*m02+r11*m12+r12*m22;dst[7]=r10*m03+r11*m13+r12*m23;dst[8]=r20*m00+r21*m10+r22*m20;dst[9]=r20*m01+r21*m11+r22*m21;dst[10]=r20*m02+r21*m12+r22*m22;dst[11]=r20*m03+r21*m13+r22*m23;if(m!==dst){dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function scaling(v,dst){dst=dst||new MatType(16);dst[0]=v[0];dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=v[1];dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=v[2];dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function scale(m,v,dst){dst=dst||new MatType(16);var v0=v[0];var v1=v[1];var v2=v[2];dst[0]=v0*m[0*4+0];dst[1]=v0*m[0*4+1];dst[2]=v0*m[0*4+2];dst[3]=v0*m[0*4+3];dst[4]=v1*m[1*4+0];dst[5]=v1*m[1*4+1];dst[6]=v1*m[1*4+2];dst[7]=v1*m[1*4+3];dst[8]=v2*m[2*4+0];dst[9]=v2*m[2*4+1];dst[10]=v2*m[2*4+2];dst[11]=v2*m[2*4+3];if(m!==dst){dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return m}function transformPoint(m,v,dst){dst=dst||v3.create();var v0=v[0];var v1=v[1];var v2=v[2];var d=v0*m[0*4+3]+v1*m[1*4+3]+v2*m[2*4+3]+m[3*4+3];dst[0]=(v0*m[0*4+0]+v1*m[1*4+0]+v2*m[2*4+0]+m[3*4+0])/d;dst[1]=(v0*m[0*4+1]+v1*m[1*4+1]+v2*m[2*4+1]+m[3*4+1])/d;dst[2]=(v0*m[0*4+2]+v1*m[1*4+2]+v2*m[2*4+2]+m[3*4+2])/d;return dst}function transformDirection(m,v,dst){dst=dst||v3.create();var v0=v[0];var v1=v[1];var v2=v[2];dst[0]=v0*m[0*4+0]+v1*m[1*4+0]+v2*m[2*4+0];dst[1]=v0*m[0*4+1]+v1*m[1*4+1]+v2*m[2*4+1];dst[2]=v0*m[0*4+2]+v1*m[1*4+2]+v2*m[2*4+2];return dst}function transformNormal(m,v,dst){dst=dst||v3.create();var mi=m4.inverse(m);var v0=v[0];var v1=v[1];var v2=v[2];dst[0]=v0*mi[0*4+0]+v1*mi[0*4+1]+v2*mi[0*4+2];dst[1]=v0*mi[1*4+0]+v1*mi[1*4+1]+v2*mi[1*4+2];dst[2]=v0*mi[2*4+0]+v1*mi[2*4+1]+v2*mi[2*4+2];return dst}return{axisRotate:axisRotate,axisRotation:axisRotation,create:identity,copy:copy,frustum:frustum,getAxis:getAxis,getTranslation:getTranslation,identity:identity,inverse:inverse,lookAt:lookAt,multiply:multiply,negate:negate,ortho:ortho,perspective:perspective,rotateX:rotateX,rotateY:rotateY,rotateZ:rotateZ,rotationX:rotationX,rotationY:rotationY,rotationZ:rotationZ,scale:scale,scaling:scaling,setTranslation:setTranslation,transformDirection:transformDirection,transformNormal:transformNormal,transformPoint:transformPoint,translate:translate,translation:translation,transpose:transpose}});(function(root,factory){if(typeof define==="function"&&define.amd){define(["./twgl","./m4"],factory)}else{root.twgl=root.twgl||{};root.twgl.primitives=factory.call(root)}})(this,function(webglUtils,m4){"use strict";webglUtils=webglUtils||this.twgl;m4=m4||this;function createPlaneVertices(width,depth,subdivisionsWidth,subdivisionsDepth,matrix){width=width||1;depth=depth||1;subdivisionsWidth=subdivisionsWidth||1;subdivisionsDepth=subdivisionsDepth||1;matrix=matrix||m4.identity();var numVertices=(subdivisionsWidth+1)*(subdivisionsDepth+1);var positions=webglUtils.createAugmentedTypedArray(3,numVertices);var normals=webglUtils.createAugmentedTypedArray(3,numVertices);var texcoords=webglUtils.createAugmentedTypedArray(2,numVertices);for(var z=0;z<=subdivisionsDepth;z++){for(var x=0;x<=subdivisionsWidth;x++){var u=x/subdivisionsWidth;var v=z/subdivisionsDepth;positions.push(width*u-width*.5,0,depth*v-depth*.5);normals.push(0,1,0);texcoords.push(u,v)}}var numVertsAcross=subdivisionsWidth+1;var indices=webglUtils.createAugmentedTypedArray(3,subdivisionsWidth*subdivisionsDepth*2,Uint16Array);for(var z=0;z 0")}opt_startLatitudeInRadians=opt_startLatitudeInRadians||0;opt_endLatitudeInRadians=opt_endLatitudeInRadians||Math.PI;opt_startLongitudeInRadians=opt_startLongitudeInRadians||0;opt_endLongitudeInRadians=opt_endLongitudeInRadians||Math.PI*2;var latRange=opt_endLatitudeInRadians-opt_startLatitudeInRadians;var longRange=opt_endLongitudeInRadians-opt_startLongitudeInRadians;var numVertices=(subdivisionsAxis+1)*(subdivisionsHeight+1);var positions=webglUtils.createAugmentedTypedArray(3,numVertices);var normals=webglUtils.createAugmentedTypedArray(3,numVertices);var texCoords=webglUtils.createAugmentedTypedArray(2,numVertices);for(var y=0;y<=subdivisionsHeight;y++){for(var x=0;x<=subdivisionsAxis;x++){var u=x/subdivisionsAxis;var v=y/subdivisionsHeight;var theta=longRange*u;var phi=latRange*v;var sinTheta=Math.sin(theta);var cosTheta=Math.cos(theta);var sinPhi=Math.sin(phi);var cosPhi=Math.cos(phi);var ux=cosTheta*sinPhi;var uy=cosPhi;var uz=sinTheta*sinPhi;positions.push(radius*ux,radius*uy,radius*uz);normals.push(ux,uy,uz);texCoords.push(1-u,v)}}var numVertsAround=subdivisionsAxis+1;var indices=webglUtils.createAugmentedTypedArray(3,subdivisionsAxis*subdivisionsHeight*2,Uint16Array);for(var x=0;xverticalSubdivisions){y=height;v=1;ringRadius=topRadius}else{ringRadius=bottomRadius+(topRadius-bottomRadius)*(yy/verticalSubdivisions)}if(yy==-2||yy==verticalSubdivisions+2){ringRadius=0;v=0}y-=height/2;for(var ii=0;iiverticalSubdivisions?0:sin*cosSlant,yy<0?-1:yy>verticalSubdivisions?1:sinSlant,yy<0||yy>verticalSubdivisions?0:cos*cosSlant);texCoords.push(ii/radialSubdivisions,1-v)}}for(var yy=0;yy=0){reorientPositions(array,matrix)}else if(name.indexOf("tan")>=0||name.indexOf("binorm")>=0){reorientDirections(array,matrix)}else if(name.indexOf("norm")>=0){reorientNormals(array,matrix)}});return arrays}function randInt(range){return Math.random()*range|0}function makeRandomVertexColors(vertices,options){options=options||{};var numElements=vertices.position.numElements;var vcolors=webglUtils.createAugmentedTypedArray(4,numElements,Uint8Array);var rand=options.rand||function(ndx,channel){return channel<3?randInt(256):255};vertices.color=vcolors;if(vertices.indices){for(var ii=0;ii1&&uniformInfo.name.substr(-3)=="[0]";if(type==gl.FLOAT&&isArray)return function(v){gl.uniform1fv(location,v)};if(type==gl.FLOAT)return function(v){gl.uniform1f(location,v)};if(type==gl.FLOAT_VEC2)return function(v){gl.uniform2fv(location,v)};if(type==gl.FLOAT_VEC3)return function(v){gl.uniform3fv(location,v)};if(type==gl.FLOAT_VEC4)return function(v){gl.uniform4fv(location,v)};if(type==gl.INT&&isArray)return function(v){gl.uniform1iv(location,v)};if(type==gl.INT)return function(v){gl.uniform1i(location,v)};if(type==gl.INT_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.INT_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.INT_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.BOOL)return function(v){gl.uniform1iv(location,v)};if(type==gl.BOOL_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.BOOL_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.BOOL_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.FLOAT_MAT2)return function(v){gl.uniformMatrix2fv(location,false,v)};if(type==gl.FLOAT_MAT3)return function(v){gl.uniformMatrix3fv(location,false,v)};if(type==gl.FLOAT_MAT4)return function(v){gl.uniformMatrix4fv(location,false,v)};if((type==gl.SAMPLER_2D||type==gl.SAMPLER_CUBE)&&isArray){var units=[];for(var ii=0;ii=0){numComponents=2}else if(name.indexOf("color")>=0){numComponents=4}else{numComponents=3}if(length%numComponents>0){throw"can not guess numComponents. You should specify it."}return numComponents}function makeTypedArray(array,name){if(isArrayBuffer(array)){return array}if(Array.isArray(array)){array={data:array}}var type=array.type;if(!type){if(name==="indices"){type=Uint16Array}else{type=Float32Array}}return new type(array.data)}function createAttribsFromArrays(gl,arrays,opt_mapping){var mapping=opt_mapping||createMapping(arrays);var attribs={};Object.keys(mapping).forEach(function(attribName){var bufferName=mapping[attribName];var array=makeTypedArray(arrays[bufferName],bufferName);attribs[attribName]={buffer:createBufferFromTypedArray(gl,array),numComponents:array.numComponents||guessNumComponentsFromName(bufferName),type:getGLTypeForTypedArray(gl,array),normalize:getNormalizationForTypedArray(array)}});return attribs}var positionKeys=["position","positions","a_position"];function getNumElementsFromNonIndexedArrays(arrays){var key;for(var ii=0;ii0){throw"numComponents "+numComponent+" not correct for length "+length}return numElements}function createBufferInfoFromArrays(gl,arrays,opt_mapping){var bufferInfo={attribs:createAttribsFromArrays(gl,arrays,opt_mapping)};var indices=arrays.indices;if(indices){indices=makeTypedArray(indices,"indices");bufferInfo.indices=createBufferFromTypedArray(gl,indices,gl.ELEMENT_ARRAY_BUFFER);bufferInfo.numElements=indices.length}else{bufferInfo.numElements=getNumElementsFromNonIndexedArrays(arrays)}return bufferInfo}function createBuffersFromArrays(gl,arrays){var buffers={};Object.keys(arrays).forEach(function(key){var type=key=="indices"?gl.ELEMENT_ARRAY_BUFFER:gl.ARRAY_BUFFER;var array=makeTypedArray(arrays[key],name);buffers[key]=createBufferFromTypedArray(gl,array,type)});return buffers}function drawBufferInfo(gl,type,bufferInfo,count,offset){var indices=bufferInfo.indices;var numElements=count===undefined?bufferInfo.numElements:count;offset=offset===undefined?offset:0;if(indices){gl.drawElements(type,numElements,gl.UNSIGNED_SHORT,offset)}else{gl.drawArrays(type,offset,numElements)}}function drawObjectList(objectsToDraw){var lastUsedProgramInfo=null;var lastUsedBufferInfo=null;objectsToDraw.forEach(function(object){var programInfo=object.programInfo;var bufferInfo=object.bufferInfo;if(programInfo!==lastUsedProgramInfo){lastUsedProgramInfo=programInfo;gl.useProgram(programInfo.program)}if(bufferInfo!=lastUsedBufferInfo){lastUsedBufferInfo=bufferInfo;setBuffersAndAttributes(gl,programInfo,bufferInfo)}setUniforms(programInfo,object.uniforms);drawBufferInfo(gl,gl.TRIANGLES,bufferInfo)})}return{createAugmentedTypedArray:createAugmentedTypedArray,createAttribsFromArrays:createAttribsFromArrays,createBuffersFromArrays:createBuffersFromArrays,createBufferInfoFromArrays:createBufferInfoFromArrays,createAttributeSetters:createAttributeSetters,createProgram:createProgram,createProgramFromScripts:createProgramFromScripts,createProgramFromSources:createProgramFromSources,createProgramInfo:createProgramInfo,createUniformSetters:createUniformSetters,drawBufferInfo:drawBufferInfo,drawObjectList:drawObjectList,getWebGLContext:getWebGLContext,resizeCanvasToDisplaySize:resizeCanvasToDisplaySize,setAttributes:setAttributes,setBuffersAndAttributes:setBuffersAndAttributes,setUniforms:setUniforms}});(function(root,factory){if(typeof define==="function"&&define.amd){define([],factory)}else{var lib=factory.call(root);root.twgl=root.twgl||{};root.twgl.v3=lib}})(this,function(){"use strict";var VecType=Float32Array;function create(){return new VecType(3)}function add(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]+b[0];dst[1]=a[1]+b[1];dst[2]=a[2]+b[2];return dst}function subtract(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]-b[0];dst[1]=a[1]-b[1];dst[2]=a[2]-b[2];return dst}function lerp(a,b,t,dst){dst=dst||new VecType(3);dst[0]=(1-t)*a[0]+t*b[0];dst[1]=(1-t)*a[1]+t*b[1];dst[2]=(1-t)*a[2]+t*b[2];return dst}function mulScalar(v,k,dst){dst=dst||new VecType(3);dst[0]=v[0]*k;dst[1]=v[1]*k;dst[2]=v[2]*k;return dst}function divScalar(v,k,dst){dst=dst||new VecType(3);dst[0]=v[0]/k;dst[1]=v[1]/k;dst[2]=v[2]/k;return dst}function cross(a,b,dst){dst=dst||new VecType(3);dst[0]=a[1]*b[2]-a[2]*b[1];dst[1]=a[2]*b[0]-a[0]*b[2];dst[2]=a[0]*b[1]-a[1]*b[0];return dst}function dot(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]}function length(v){return Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])}function lengthSq(a){return a[0]*a[0]+a[1]*a[1]+a[2]*a[2]}function normalize(a,dst){dst=dst||new VecType(3);var lenSq=a[0]*a[0]+a[1]*a[1]+a[2]*a[2];var len=Math.sqrt(lenSq);if(len>1e-5){dst[0]=a[0]/len;dst[1]=a[1]/len;dst[2]=a[2]/len}else{dst[0]=0;dst[1]=0;dst[2]=0}return dst}function negate(v,dst){dst=dst||new VecType(3);dst[0]=-v[0];dst[1]=-v[1];dst[2]=-v[2];return dst}function copy(v,dst){dst=dst||new VecType(3);dst[0]=v[0];dst[1]=v[1];dst[2]=v[2];return dst}function multiply(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]*b[0];dst[1]=a[1]*b[1];dst[2]=a[2]*b[2];return dst}function divide(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]/b[0];dst[1]=a[1]/b[1];dst[2]=a[2]/b[2];return dst}return{add:add,copy:copy,create:create,cross:cross,divide:divide,divScalar:divScalar,dot:dot,lerp:lerp,length:length,lengthSq:lengthSq,mulScalar:mulScalar,multiply:multiply,negate:negate,normalize:normalize,subtract:subtract}});(function(root,factory){if(typeof define==="function"&&define.amd){define(["./v3"],factory)}else{var lib=factory.call(root);root.twgl=root.twgl||{};root.twgl.m4=lib}})(this,function(v3){"use strict";var v3=v3||this.twgl.v3;if(!v3){throw"need v3.js"}var MatType=Float32Array;var tempV3a=v3.create();var tempV3b=v3.create();var tempV3c=v3.create();function negate(m,dst){dst=dst||new MatType(16);dst[0]=-m[0];dst[1]=-m[1];dst[2]=-m[2];dst[3]=-m[3];dst[4]=-m[4];dst[5]=-m[5];dst[6]=-m[6];dst[7]=-m[7];dst[8]=-m[8];dst[9]=-m[9];dst[10]=-m[10];dst[11]=-m[11];dst[12]=-m[12];dst[13]=-m[13];dst[14]=-m[14];dst[15]=-m[15];return dst}function copy(m,dst){dst=dst||new MatType(16);dst[0]=m[0];dst[1]=m[1];dst[2]=m[2];dst[3]=m[3];dst[4]=m[4];dst[5]=m[5];dst[6]=m[6];dst[7]=m[7];dst[8]=m[8];dst[9]=m[9];dst[10]=m[10];dst[11]=m[11];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15];return dst}function identity(dst){dst=dst||new MatType(16);dst[0]=1;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=1;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function transpose(m,dst){dst=dst||new MatType(16);if(dst===m){var t;t=m[1];m[1]=m[4];m[4]=t;t=m[2];m[2]=m[8];m[8]=t;t=m[3];m[3]=m[12];m[12]=t;t=m[6];m[6]=m[9];m[9]=t;t=m[7];m[7]=m[13];m[13]=t;t=m[11];m[11]=m[14];m[14]=t;return dst}var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];dst[0]=m00;dst[1]=m10;dst[2]=m20;dst[3]=m30;dst[4]=m01;dst[5]=m11;dst[6]=m21;dst[7]=m31;dst[8]=m02;dst[9]=m12;dst[10]=m22;dst[11]=m32;dst[12]=m03;dst[13]=m13;dst[14]=m23;dst[15]=m33;return dst}function inverse(m,dst){dst=dst||new MatType(16);var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];var tmp_0=m22*m33;var tmp_1=m32*m23;var tmp_2=m12*m33;var tmp_3=m32*m13;var tmp_4=m12*m23;var tmp_5=m22*m13;var tmp_6=m02*m33;var tmp_7=m32*m03;var tmp_8=m02*m23;var tmp_9=m22*m03;var tmp_10=m02*m13;var tmp_11=m12*m03;var tmp_12=m20*m31;var tmp_13=m30*m21;var tmp_14=m10*m31;var tmp_15=m30*m11;var tmp_16=m10*m21;var tmp_17=m20*m11;var tmp_18=m00*m31;var tmp_19=m30*m01;var tmp_20=m00*m21;var tmp_21=m20*m01;var tmp_22=m00*m11;var tmp_23=m10*m01;var t0=tmp_0*m11+tmp_3*m21+tmp_4*m31-(tmp_1*m11+tmp_2*m21+tmp_5*m31);var t1=tmp_1*m01+tmp_6*m21+tmp_9*m31-(tmp_0*m01+tmp_7*m21+tmp_8*m31);var t2=tmp_2*m01+tmp_7*m11+tmp_10*m31-(tmp_3*m01+tmp_6*m11+tmp_11*m31);var t3=tmp_5*m01+tmp_8*m11+tmp_11*m21-(tmp_4*m01+tmp_9*m11+tmp_10*m21);var d=1/(m00*t0+m10*t1+m20*t2+m30*t3);dst[0]=d*t0;dst[1]=d*t1;dst[2]=d*t2;dst[3]=d*t3;dst[4]=d*(tmp_1*m10+tmp_2*m20+tmp_5*m30-(tmp_0*m10+tmp_3*m20+tmp_4*m30));dst[5]=d*(tmp_0*m00+tmp_7*m20+tmp_8*m30-(tmp_1*m00+tmp_6*m20+tmp_9*m30));dst[6]=d*(tmp_3*m00+tmp_6*m10+tmp_11*m30-(tmp_2*m00+tmp_7*m10+tmp_10*m30));dst[7]=d*(tmp_4*m00+tmp_9*m10+tmp_10*m20-(tmp_5*m00+tmp_8*m10+tmp_11*m20));dst[8]=d*(tmp_12*m13+tmp_15*m23+tmp_16*m33-(tmp_13*m13+tmp_14*m23+tmp_17*m33));dst[9]=d*(tmp_13*m03+tmp_18*m23+tmp_21*m33-(tmp_12*m03+tmp_19*m23+tmp_20*m33));dst[10]=d*(tmp_14*m03+tmp_19*m13+tmp_22*m33-(tmp_15*m03+tmp_18*m13+tmp_23*m33));dst[11]=d*(tmp_17*m03+tmp_20*m13+tmp_23*m23-(tmp_16*m03+tmp_21*m13+tmp_22*m23));dst[12]=d*(tmp_14*m22+tmp_17*m32+tmp_13*m12-(tmp_16*m32+tmp_12*m12+tmp_15*m22));dst[13]=d*(tmp_20*m32+tmp_12*m02+tmp_19*m22-(tmp_18*m22+tmp_21*m32+tmp_13*m02));dst[14]=d*(tmp_18*m12+tmp_23*m32+tmp_15*m02-(tmp_22*m32+tmp_14*m02+tmp_19*m12));dst[15]=d*(tmp_22*m22+tmp_16*m02+tmp_21*m12-(tmp_20*m12+tmp_23*m22+tmp_17*m02));return dst}function multiply(a,b,dst){dst=dst||new MatType(16);var a00=a[0];var a01=a[1];var a02=a[2];var a03=a[3];var a10=a[4+0];var a11=a[4+1];var a12=a[4+2];var a13=a[4+3];var a20=a[8+0];var a21=a[8+1];var a22=a[8+2];var a23=a[8+3];var a30=a[12+0];var a31=a[12+1];var a32=a[12+2];var a33=a[12+3];var b00=b[0];var b01=b[1];var b02=b[2];var b03=b[3];var b10=b[4+0];var b11=b[4+1];var b12=b[4+2];var b13=b[4+3];var b20=b[8+0];var b21=b[8+1];var b22=b[8+2];var b23=b[8+3];var b30=b[12+0];var b31=b[12+1];var b32=b[12+2];var b33=b[12+3];dst[0]=a00*b00+a01*b10+a02*b20+a03*b30;dst[1]=a00*b01+a01*b11+a02*b21+a03*b31;dst[2]=a00*b02+a01*b12+a02*b22+a03*b32;dst[3]=a00*b03+a01*b13+a02*b23+a03*b33;dst[4]=a10*b00+a11*b10+a12*b20+a13*b30;dst[5]=a10*b01+a11*b11+a12*b21+a13*b31;dst[6]=a10*b02+a11*b12+a12*b22+a13*b32;dst[7]=a10*b03+a11*b13+a12*b23+a13*b33;dst[8]=a20*b00+a21*b10+a22*b20+a23*b30;dst[9]=a20*b01+a21*b11+a22*b21+a23*b31;dst[10]=a20*b02+a21*b12+a22*b22+a23*b32;dst[11]=a20*b03+a21*b13+a22*b23+a23*b33;dst[12]=a30*b00+a31*b10+a32*b20+a33*b30;dst[13]=a30*b01+a31*b11+a32*b21+a33*b31;dst[14]=a30*b02+a31*b12+a32*b22+a33*b32;dst[15]=a30*b03+a31*b13+a32*b23+a33*b33;return dst}function setTranslation(a,dst){dst=dst||identity();dst[12]=v[0];dst[13]=v[1];dst[14]=v[2];dst[15]=1;return dst}function getTranslation(m,dst){dst=dst||v3.create();dst[0]=m[12];dst[1]=m[13];dst[2]=m[14];return dst}function getAxis(m,axis,dst){dst=dst||v3.create();var off=axis*4;dst[0]=m[off+0];dst[1]=m[off+1];dst[2]=m[off+2];return dst}function perspective(fieldOfViewYInRadians,aspect,zNear,zFar,dst){dst=dst||new MatType(16);var f=Math.tan(Math.PI*.5-.5*fieldOfViewYInRadians);var rangeInv=1/(zNear-zFar);dst[0]=f/aspect;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=f;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=(zNear+zFar)*rangeInv;dst[11]=-1;dst[12]=0;dst[13]=0;dst[14]=zNear*zFar*rangeInv*2;dst[15]=0;return dst}function ortho(left,right,bottom,top,near,far,dst){dst=dst||new MatType(16);dst[0]=2/(right-left);dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=2/(top-bottom);dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=-1/(far-near);dst[11]=0;dst[12]=(right+left)/(left-right);dst[13]=(top+bottom)/(bottom-top);dst[14]=-near/(near-far);dst[15]=1;return dst}function frustum(left,right,bottom,top,near,far,dst){dst=dst||new MatType(16);var dx=right-left;var dy=top-bottom;var dz=near-far;dst[0]=2*near/dx;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=2*near/dy;dst[6]=0;dst[7]=0;dst[8]=(left+right)/dx;dst[9]=(top+bottom)/dy;dst[10]=far/dz;dst[11]=-1;dst[12]=0;dst[13]=0;dst[14]=near*far/dz;dst[15]=0;return dst}function lookAt(eye,target,up,dst){dst=dst||new MatType(16);var xAxis=tempV3a;var yAxis=tempV3b;var zAxis=tempV3c;v3.normalize(v3.subtract(eye,target,zAxis),zAxis);v3.cross(up,zAxis,xAxis);v3.cross(zAxis,xAxis,yAxis);dst[0]=xAxis[0];dst[1]=xAxis[1];dst[2]=xAxis[2];dst[3]=0;dst[4]=yAxis[0];dst[5]=yAxis[1];dst[6]=yAxis[2];dst[7]=0;dst[8]=zAxis[0];dst[9]=zAxis[1];dst[10]=zAxis[2];dst[11]=0;dst[12]=eye[0];dst[13]=eye[1];dst[14]=eye[2];dst[15]=1;return dst}function translation(v,dst){dst=dst||new MatType(16);dst[0]=1;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=1;dst[11]=0;dst[12]=v[0];dst[13]=v[1];dst[14]=v[2];dst[15]=1;return dst}function translate(m,v,dst){dst=dst||new MatType(16);var v0=v[0];var v1=v[1];var v2=v[2];var m00=m[0];var m01=m[1];var m02=m[2];var m03=m[3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];if(m!==dst){dst[0]=m00;dst[1]=m01;dst[2]=m02;dst[3]=m03;dst[4]=m10;dst[5]=m11;dst[6]=m12;dst[7]=m13;dst[8]=m20;dst[9]=m21;dst[10]=m22;dst[11]=m23}dst[12]=m00*v0+m10*v1+m20*v2+m30;dst[13]=m01*v0+m11*v1+m21*v2+m31;dst[14]=m02*v0+m12*v1+m22*v2+m32;dst[15]=m03*v0+m13*v1+m23*v2+m33;return dst}function rotationX(angleInRadians,dst){dst=dst||new MatType(16);var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=1;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=c;dst[6]=s;dst[7]=0;dst[8]=0;dst[9]=-s;dst[10]=c;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function rotateX(m,angleInRadians,dst){dst=dst||new MatType(16);var m10=m[4];var m11=m[5];var m12=m[6];var m13=m[7];var m20=m[8];var m21=m[9];var m22=m[10];var m23=m[11];var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[4]=c*m10+s*m20;dst[5]=c*m11+s*m21;dst[6]=c*m12+s*m22;dst[7]=c*m13+s*m23;dst[8]=c*m20-s*m10;dst[9]=c*m21-s*m11;dst[10]=c*m22-s*m12;dst[11]=c*m23-s*m13;if(m!==dst){dst[0]=m[0];dst[1]=m[1];dst[2]=m[2];dst[3]=m[3];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function rotationY(angleInRadians,dst){dst=dst||new MatType(16);var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c;dst[1]=0;dst[2]=-s;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=s;dst[9]=0;dst[10]=c;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function rotateY(m,angleInRadians,dst){dst=dst||new MatType(16);var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c*m00-s*m20;dst[1]=c*m01-s*m21;dst[2]=c*m02-s*m22;dst[3]=c*m03-s*m23;dst[8]=c*m20+s*m00;dst[9]=c*m21+s*m01;dst[10]=c*m22+s*m02;dst[11]=c*m23+s*m03;if(m!==dst){dst[4]=m[4];dst[5]=m[5];dst[6]=m[6];dst[7]=m[7];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function rotationZ(angleInRadians,dst){dst=dst||new MatType(16);var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c;dst[1]=s;dst[2]=0;dst[3]=0;dst[4]=-s;dst[5]=c;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=1;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function rotateZ(m,angleInRadians,dst){dst=dst||new MatType(16);var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c*m00+s*m10;dst[1]=c*m01+s*m11;dst[2]=c*m02+s*m12;dst[3]=c*m03+s*m13;dst[4]=c*m10-s*m00;dst[5]=c*m11-s*m01;dst[6]=c*m12-s*m02;dst[7]=c*m13-s*m03;if(m!==dst){dst[8]=m[8];dst[9]=m[9];dst[10]=m[10];dst[11]=m[11];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function axisRotation(axis,angleInRadians,dst){dst=dst||new MatType(16);var x=axis[0];var y=axis[1];var z=axis[2];var n=Math.sqrt(x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;var yy=y*y;var zz=z*z;var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);var oneMinusCosine=1-c;dst[0]=xx+(1-xx)*c;dst[1]=x*y*oneMinusCosine+z*s;dst[2]=x*z*oneMinusCosine-y*s;dst[3]=0;dst[4]=x*y*oneMinusCosine-z*s;dst[5]=yy+(1-yy)*c;dst[6]=y*z*oneMinusCosine+x*s;dst[7]=0;dst[8]=x*z*oneMinusCosine+y*s;dst[9]=y*z*oneMinusCosine-x*s;dst[10]=zz+(1-zz)*c;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function axisRotate(m,axis,angleInRadians,dst){dst=dst||new MatType(16);var x=axis[0];var y=axis[1];var z=axis[2];var n=Math.sqrt(x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;var yy=y*y;var zz=z*z;var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);var oneMinusCosine=1-c;var r00=xx+(1-xx)*c;var r01=x*y*oneMinusCosine+z*s;var r02=x*z*oneMinusCosine-y*s;var r10=x*y*oneMinusCosine-z*s;var r11=yy+(1-yy)*c;var r12=y*z*oneMinusCosine+x*s;var r20=x*z*oneMinusCosine+y*s;var r21=y*z*oneMinusCosine-x*s;var r22=zz+(1-zz)*c;var m00=m[0];var m01=m[1];var m02=m[2];var m03=m[3];var m10=m[4];var m11=m[5];var m12=m[6];var m13=m[7];var m20=m[8];var m21=m[9];var m22=m[10];var m23=m[11];var m30=m[12];var m31=m[13];var m32=m[14];var m33=m[15];dst[0]=r00*m00+r01*m10+r02*m20;dst[1]=r00*m01+r01*m11+r02*m21;dst[2]=r00*m02+r01*m12+r02*m22;dst[3]=r00*m03+r01*m13+r02*m23;dst[4]=r10*m00+r11*m10+r12*m20;dst[5]=r10*m01+r11*m11+r12*m21;dst[6]=r10*m02+r11*m12+r12*m22;dst[7]=r10*m03+r11*m13+r12*m23;dst[8]=r20*m00+r21*m10+r22*m20;dst[9]=r20*m01+r21*m11+r22*m21;dst[10]=r20*m02+r21*m12+r22*m22;dst[11]=r20*m03+r21*m13+r22*m23;if(m!==dst){dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function scaling(v,dst){dst=dst||new MatType(16);dst[0]=v[0];dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=v[1];dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=v[2];dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function scale(m,v,dst){dst=dst||new MatType(16);var v0=v[0];var v1=v[1];var v2=v[2];dst[0]=v0*m[0*4+0];dst[1]=v0*m[0*4+1];dst[2]=v0*m[0*4+2];dst[3]=v0*m[0*4+3];dst[4]=v1*m[1*4+0];dst[5]=v1*m[1*4+1];dst[6]=v1*m[1*4+2];dst[7]=v1*m[1*4+3];dst[8]=v2*m[2*4+0];dst[9]=v2*m[2*4+1];dst[10]=v2*m[2*4+2];dst[11]=v2*m[2*4+3];if(m!==dst){dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return m}function transformPoint(m,v,dst){dst=dst||v3.create();var v0=v[0];var v1=v[1];var v2=v[2];var d=v0*m[0*4+3]+v1*m[1*4+3]+v2*m[2*4+3]+m[3*4+3];dst[0]=(v0*m[0*4+0]+v1*m[1*4+0]+v2*m[2*4+0]+m[3*4+0])/d;dst[1]=(v0*m[0*4+1]+v1*m[1*4+1]+v2*m[2*4+1]+m[3*4+1])/d;dst[2]=(v0*m[0*4+2]+v1*m[1*4+2]+v2*m[2*4+2]+m[3*4+2])/d;return dst}function transformDirection(m,v,dst){dst=dst||v3.create();var v0=v[0];var v1=v[1];var v2=v[2];dst[0]=v0*m[0*4+0]+v1*m[1*4+0]+v2*m[2*4+0];dst[1]=v0*m[0*4+1]+v1*m[1*4+1]+v2*m[2*4+1];dst[2]=v0*m[0*4+2]+v1*m[1*4+2]+v2*m[2*4+2];return dst}function transformNormal(m,v,dst){dst=dst||v3.create();var mi=m4.inverse(m);var v0=v[0];var v1=v[1];var v2=v[2];dst[0]=v0*mi[0*4+0]+v1*mi[0*4+1]+v2*mi[0*4+2];dst[1]=v0*mi[1*4+0]+v1*mi[1*4+1]+v2*mi[1*4+2];dst[2]=v0*mi[2*4+0]+v1*mi[2*4+1]+v2*mi[2*4+2];return dst}return{axisRotate:axisRotate,axisRotation:axisRotation,create:identity,copy:copy,frustum:frustum,getAxis:getAxis,getTranslation:getTranslation,identity:identity,inverse:inverse,lookAt:lookAt,multiply:multiply,negate:negate,ortho:ortho,perspective:perspective,rotateX:rotateX,rotateY:rotateY,rotateZ:rotateZ,rotationX:rotationX,rotationY:rotationY,rotationZ:rotationZ,scale:scale,scaling:scaling,setTranslation:setTranslation,transformDirection:transformDirection,transformNormal:transformNormal,transformPoint:transformPoint,translate:translate,translation:translation,transpose:transpose}});(function(root,factory){if(typeof define==="function"&&define.amd){define(["./twgl","./m4"],factory)}else{root.twgl=root.twgl||{};root.twgl.primitives=factory.call(root)}})(this,function(twgl,m4){"use strict";twgl=twgl||this.twgl;m4=m4||twgl.m4;function augmentTypedArray(typedArray,numComponents){var cursor=0;typedArray.push=function(){for(var ii=0;ii 0")}opt_startLatitudeInRadians=opt_startLatitudeInRadians||0;opt_endLatitudeInRadians=opt_endLatitudeInRadians||Math.PI;opt_startLongitudeInRadians=opt_startLongitudeInRadians||0;opt_endLongitudeInRadians=opt_endLongitudeInRadians||Math.PI*2;var latRange=opt_endLatitudeInRadians-opt_startLatitudeInRadians;var longRange=opt_endLongitudeInRadians-opt_startLongitudeInRadians;
-function createProgramFromScripts(gl,shaderScriptIds,opt_attribs,opt_locations,opt_errorCallback){var shaders=[];for(var ii=0;ii1&&uniformInfo.name.substr(-3)=="[0]";if(type==gl.FLOAT&&isArray)return function(v){gl.uniform1fv(location,v)};if(type==gl.FLOAT)return function(v){gl.uniform1f(location,v)};if(type==gl.FLOAT_VEC2)return function(v){gl.uniform2fv(location,v)};if(type==gl.FLOAT_VEC3)return function(v){gl.uniform3fv(location,v)};if(type==gl.FLOAT_VEC4)return function(v){gl.uniform4fv(location,v)};if(type==gl.INT&&isArray)return function(v){gl.uniform1iv(location,v)};if(type==gl.INT)return function(v){gl.uniform1i(location,v)};if(type==gl.INT_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.INT_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.INT_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.BOOL)return function(v){gl.uniform1iv(location,v)};if(type==gl.BOOL_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.BOOL_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.BOOL_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.FLOAT_MAT2)return function(v){gl.uniformMatrix2fv(location,false,v)};if(type==gl.FLOAT_MAT3)return function(v){gl.uniformMatrix3fv(location,false,v)};if(type==gl.FLOAT_MAT4)return function(v){gl.uniformMatrix4fv(location,false,v)};if((type==gl.SAMPLER_2D||type==gl.SAMPLER_CUBE)&&isArray){var units=[];for(var ii=0;ii=0){numComponents=2}else if(name.indexOf("color")>=0){numComponents=4}else{numComponents=3}if(length%numComponents>0){throw"can not guess numComponents. You should specify it."}return numComponents}function makeTypedArray(array,name){if(isArrayBuffer(array)){return array}if(Array.isArray(array)){array={data:array}}if(!array.numComponents){array.numComponents=guessNumComponentsFromName(name,array.length)}var type=array.type;if(!type){if(name==="indices"){type=Uint16Array}}var numElements=array.data.length/array.numComponents;if(numElements%1){console.warn("numComponents = ",array.numComponents,"doesn't match length = ",array.length,"of data given")}var typedArray=createAugmentedTypedArray(array.numComponents,numElements,type);typedArray.push(array.data);return typedArray}function createAttribsFromArrays(gl,arrays,opt_mapping){var mapping=opt_mapping||createMapping(arrays);var attribs={};Object.keys(mapping).forEach(function(attribName){var bufferName=mapping[attribName];var array=makeTypedArray(arrays[bufferName],bufferName);attribs[attribName]={buffer:createBufferFromTypedArray(gl,array),numComponents:array.numComponents||guessNumComponentsFromName(bufferName),type:getGLTypeForTypedArray(gl,array),normalize:getNormalizationForTypedArray(array)}});return attribs}function getNumElementsFromNonIndexedArrays(arrays){var key=Object.keys(arrays)[0];var array=arrays[key];if(isArrayBuffer(array)){return array.numElements}else{return array.data.length/array.numComponents}}function createBufferInfoFromArrays(gl,arrays,opt_mapping){var bufferInfo={attribs:createAttribsFromArrays(gl,arrays,opt_mapping)};var indices=arrays.indices;if(indices){indices=makeTypedArray(indices,"indices");bufferInfo.indices=createBufferFromTypedArray(gl,indices,gl.ELEMENT_ARRAY_BUFFER);bufferInfo.numElements=indices.length}else{bufferInfo.numElements=getNumElementsFromNonIndexedArrays(arrays)}return bufferInfo}function createBuffersFromArrays(gl,arrays){var buffers={};Object.keys(arrays).forEach(function(key){var type=key=="indices"?gl.ELEMENT_ARRAY_BUFFER:gl.ARRAY_BUFFER;var array=makeTypedArray(arrays[key],name);buffers[key]=createBufferFromTypedArray(gl,array,type)});return buffers}function drawBufferInfo(gl,type,bufferInfo,count,offset){var indices=bufferInfo.indices;var numElements=count===undefined?bufferInfo.numElements:count;offset=offset===undefined?offset:0;if(indices){gl.drawElements(type,numElements,gl.UNSIGNED_SHORT,offset)}else{gl.drawArrays(type,offset,numElements)}}function drawObjectList(objectsToDraw){var lastUsedProgramInfo=null;var lastUsedBufferInfo=null;objectsToDraw.forEach(function(object){var programInfo=object.programInfo;var bufferInfo=object.bufferInfo;if(programInfo!==lastUsedProgramInfo){lastUsedProgramInfo=programInfo;gl.useProgram(programInfo.program)}if(bufferInfo!=lastUsedBufferInfo){lastUsedBufferInfo=bufferInfo;setBuffersAndAttributes(gl,programInfo,bufferInfo)}setUniforms(programInfo,object.uniforms);drawBufferInfo(gl,gl.TRIANGLES,bufferInfo)})}return{createAugmentedTypedArray:createAugmentedTypedArray,createAttribsFromArrays:createAttribsFromArrays,createBuffersFromArrays:createBuffersFromArrays,createBufferInfoFromArrays:createBufferInfoFromArrays,createAttributeSetters:createAttributeSetters,createProgram:createProgram,createProgramFromScripts:createProgramFromScripts,createProgramFromSources:createProgramFromSources,createProgramInfo:createProgramInfo,createUniformSetters:createUniformSetters,drawBufferInfo:drawBufferInfo,drawObjectList:drawObjectList,getWebGLContext:getWebGLContext,resizeCanvasToDisplaySize:resizeCanvasToDisplaySize,setAttributes:setAttributes,setBuffersAndAttributes:setBuffersAndAttributes,setUniforms:setUniforms}});
\ No newline at end of file
+var numVertices=(subdivisionsAxis+1)*(subdivisionsHeight+1);var positions=createAugmentedTypedArray(3,numVertices);var normals=createAugmentedTypedArray(3,numVertices);var texCoords=createAugmentedTypedArray(2,numVertices);for(var y=0;y<=subdivisionsHeight;y++){for(var x=0;x<=subdivisionsAxis;x++){var u=x/subdivisionsAxis;var v=y/subdivisionsHeight;var theta=longRange*u;var phi=latRange*v;var sinTheta=Math.sin(theta);var cosTheta=Math.cos(theta);var sinPhi=Math.sin(phi);var cosPhi=Math.cos(phi);var ux=cosTheta*sinPhi;var uy=cosPhi;var uz=sinTheta*sinPhi;positions.push(radius*ux,radius*uy,radius*uz);normals.push(ux,uy,uz);texCoords.push(1-u,v)}}var numVertsAround=subdivisionsAxis+1;var indices=createAugmentedTypedArray(3,subdivisionsAxis*subdivisionsHeight*2,Uint16Array);for(var x=0;xverticalSubdivisions){y=height;v=1;ringRadius=topRadius}else{ringRadius=bottomRadius+(topRadius-bottomRadius)*(yy/verticalSubdivisions)}if(yy==-2||yy==verticalSubdivisions+2){ringRadius=0;v=0}y-=height/2;for(var ii=0;iiverticalSubdivisions?0:sin*cosSlant,yy<0?-1:yy>verticalSubdivisions?1:sinSlant,yy<0||yy>verticalSubdivisions?0:cos*cosSlant);texCoords.push(ii/radialSubdivisions,1-v)}}for(var yy=0;yy=0){reorientPositions(array,matrix)}else if(name.indexOf("tan")>=0||name.indexOf("binorm")>=0){reorientDirections(array,matrix)}else if(name.indexOf("norm")>=0){reorientNormals(array,matrix)}});return arrays}function randInt(range){return Math.random()*range|0}function makeRandomVertexColors(vertices,options){options=options||{};var numElements=vertices.position.numElements;var vcolors=createAugmentedTypedArray(4,numElements,Uint8Array);var rand=options.rand||function(ndx,channel){return channel<3?randInt(256):255};vertices.color=vcolors;if(vertices.indices){for(var ii=0;ii1e-5){dst[0]=a[0]/len;dst[1]=a[1]/len;dst[2]=a[2]/len}else{dst[0]=0;dst[1]=0;dst[2]=0}return dst}function negate(v,dst){dst=dst||new VecType(3);dst[0]=-v[0];dst[1]=-v[1];dst[2]=-v[2];return dst}function copy(v,dst){dst=dst||new VecType(3);dst[0]=v[0];dst[1]=v[1];dst[2]=v[2];return dst}function multiply(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]*b[0];dst[1]=a[1]*b[1];dst[2]=a[2]*b[2];return dst}function divide(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]/b[0];dst[1]=a[1]/b[1];dst[2]=a[2]/b[2];return dst}return{add:add,copy:copy,create:create,cross:cross,divide:divide,divScalar:divScalar,dot:dot,lerp:lerp,length:length,lengthSq:lengthSq,mulScalar:mulScalar,multiply:multiply,negate:negate,normalize:normalize,subtract:subtract}});(function(root,factory){if(typeof define==="function"&&define.amd){define(["./v3"],factory)}else{var lib=factory.call(root);root.twgl=root.twgl||{};root.twgl.m4=lib}})(this,function(v3){"use strict";var v3=v3||this.twgl.v3;if(!v3){throw"need v3.js"}var MatType=Float32Array;var tempV3a=v3.create();var tempV3b=v3.create();var tempV3c=v3.create();function negate(m,dst){dst=dst||new MatType(16);dst[0]=-m[0];dst[1]=-m[1];dst[2]=-m[2];dst[3]=-m[3];dst[4]=-m[4];dst[5]=-m[5];dst[6]=-m[6];dst[7]=-m[7];dst[8]=-m[8];dst[9]=-m[9];dst[10]=-m[10];dst[11]=-m[11];dst[12]=-m[12];dst[13]=-m[13];dst[14]=-m[14];dst[15]=-m[15];return dst}function copy(m,dst){dst=dst||new MatType(16);dst[0]=m[0];dst[1]=m[1];dst[2]=m[2];dst[3]=m[3];dst[4]=m[4];dst[5]=m[5];dst[6]=m[6];dst[7]=m[7];dst[8]=m[8];dst[9]=m[9];dst[10]=m[10];dst[11]=m[11];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15];return dst}function identity(dst){dst=dst||new MatType(16);dst[0]=1;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=1;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function transpose(m,dst){dst=dst||new MatType(16);if(dst===m){var t;t=m[1];m[1]=m[4];m[4]=t;t=m[2];m[2]=m[8];m[8]=t;t=m[3];m[3]=m[12];m[12]=t;t=m[6];m[6]=m[9];m[9]=t;t=m[7];m[7]=m[13];m[13]=t;t=m[11];m[11]=m[14];m[14]=t;return dst}var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];dst[0]=m00;dst[1]=m10;dst[2]=m20;dst[3]=m30;dst[4]=m01;dst[5]=m11;dst[6]=m21;dst[7]=m31;dst[8]=m02;dst[9]=m12;dst[10]=m22;dst[11]=m32;dst[12]=m03;dst[13]=m13;dst[14]=m23;dst[15]=m33;return dst}function inverse(m,dst){dst=dst||new MatType(16);var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];var tmp_0=m22*m33;var tmp_1=m32*m23;var tmp_2=m12*m33;var tmp_3=m32*m13;var tmp_4=m12*m23;var tmp_5=m22*m13;var tmp_6=m02*m33;var tmp_7=m32*m03;var tmp_8=m02*m23;var tmp_9=m22*m03;var tmp_10=m02*m13;var tmp_11=m12*m03;var tmp_12=m20*m31;var tmp_13=m30*m21;var tmp_14=m10*m31;var tmp_15=m30*m11;var tmp_16=m10*m21;var tmp_17=m20*m11;var tmp_18=m00*m31;var tmp_19=m30*m01;var tmp_20=m00*m21;var tmp_21=m20*m01;var tmp_22=m00*m11;var tmp_23=m10*m01;var t0=tmp_0*m11+tmp_3*m21+tmp_4*m31-(tmp_1*m11+tmp_2*m21+tmp_5*m31);var t1=tmp_1*m01+tmp_6*m21+tmp_9*m31-(tmp_0*m01+tmp_7*m21+tmp_8*m31);var t2=tmp_2*m01+tmp_7*m11+tmp_10*m31-(tmp_3*m01+tmp_6*m11+tmp_11*m31);var t3=tmp_5*m01+tmp_8*m11+tmp_11*m21-(tmp_4*m01+tmp_9*m11+tmp_10*m21);var d=1/(m00*t0+m10*t1+m20*t2+m30*t3);dst[0]=d*t0;dst[1]=d*t1;dst[2]=d*t2;dst[3]=d*t3;dst[4]=d*(tmp_1*m10+tmp_2*m20+tmp_5*m30-(tmp_0*m10+tmp_3*m20+tmp_4*m30));dst[5]=d*(tmp_0*m00+tmp_7*m20+tmp_8*m30-(tmp_1*m00+tmp_6*m20+tmp_9*m30));dst[6]=d*(tmp_3*m00+tmp_6*m10+tmp_11*m30-(tmp_2*m00+tmp_7*m10+tmp_10*m30));dst[7]=d*(tmp_4*m00+tmp_9*m10+tmp_10*m20-(tmp_5*m00+tmp_8*m10+tmp_11*m20));dst[8]=d*(tmp_12*m13+tmp_15*m23+tmp_16*m33-(tmp_13*m13+tmp_14*m23+tmp_17*m33));dst[9]=d*(tmp_13*m03+tmp_18*m23+tmp_21*m33-(tmp_12*m03+tmp_19*m23+tmp_20*m33));dst[10]=d*(tmp_14*m03+tmp_19*m13+tmp_22*m33-(tmp_15*m03+tmp_18*m13+tmp_23*m33));dst[11]=d*(tmp_17*m03+tmp_20*m13+tmp_23*m23-(tmp_16*m03+tmp_21*m13+tmp_22*m23));dst[12]=d*(tmp_14*m22+tmp_17*m32+tmp_13*m12-(tmp_16*m32+tmp_12*m12+tmp_15*m22));dst[13]=d*(tmp_20*m32+tmp_12*m02+tmp_19*m22-(tmp_18*m22+tmp_21*m32+tmp_13*m02));dst[14]=d*(tmp_18*m12+tmp_23*m32+tmp_15*m02-(tmp_22*m32+tmp_14*m02+tmp_19*m12));dst[15]=d*(tmp_22*m22+tmp_16*m02+tmp_21*m12-(tmp_20*m12+tmp_23*m22+tmp_17*m02));return dst}function multiply(a,b,dst){dst=dst||new MatType(16);var a00=a[0];var a01=a[1];var a02=a[2];var a03=a[3];var a10=a[4+0];var a11=a[4+1];var a12=a[4+2];var a13=a[4+3];var a20=a[8+0];var a21=a[8+1];var a22=a[8+2];var a23=a[8+3];var a30=a[12+0];var a31=a[12+1];var a32=a[12+2];var a33=a[12+3];var b00=b[0];var b01=b[1];var b02=b[2];var b03=b[3];var b10=b[4+0];var b11=b[4+1];var b12=b[4+2];var b13=b[4+3];var b20=b[8+0];var b21=b[8+1];var b22=b[8+2];var b23=b[8+3];var b30=b[12+0];var b31=b[12+1];var b32=b[12+2];var b33=b[12+3];dst[0]=a00*b00+a01*b10+a02*b20+a03*b30;dst[1]=a00*b01+a01*b11+a02*b21+a03*b31;dst[2]=a00*b02+a01*b12+a02*b22+a03*b32;dst[3]=a00*b03+a01*b13+a02*b23+a03*b33;dst[4]=a10*b00+a11*b10+a12*b20+a13*b30;dst[5]=a10*b01+a11*b11+a12*b21+a13*b31;dst[6]=a10*b02+a11*b12+a12*b22+a13*b32;dst[7]=a10*b03+a11*b13+a12*b23+a13*b33;dst[8]=a20*b00+a21*b10+a22*b20+a23*b30;dst[9]=a20*b01+a21*b11+a22*b21+a23*b31;dst[10]=a20*b02+a21*b12+a22*b22+a23*b32;dst[11]=a20*b03+a21*b13+a22*b23+a23*b33;dst[12]=a30*b00+a31*b10+a32*b20+a33*b30;dst[13]=a30*b01+a31*b11+a32*b21+a33*b31;dst[14]=a30*b02+a31*b12+a32*b22+a33*b32;dst[15]=a30*b03+a31*b13+a32*b23+a33*b33;return dst}function setTranslation(a,dst){dst=dst||identity();dst[12]=v[0];dst[13]=v[1];dst[14]=v[2];dst[15]=1;return dst}function getTranslation(m,dst){dst=dst||v3.create();dst[0]=m[12];dst[1]=m[13];dst[2]=m[14];return dst}function getAxis(m,axis,dst){dst=dst||v3.create();var off=axis*4;dst[0]=m[off+0];dst[1]=m[off+1];dst[2]=m[off+2];return dst}function perspective(fieldOfViewYInRadians,aspect,zNear,zFar,dst){dst=dst||new MatType(16);var f=Math.tan(Math.PI*.5-.5*fieldOfViewYInRadians);var rangeInv=1/(zNear-zFar);dst[0]=f/aspect;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=f;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=(zNear+zFar)*rangeInv;dst[11]=-1;dst[12]=0;dst[13]=0;dst[14]=zNear*zFar*rangeInv*2;dst[15]=0;return dst}function ortho(left,right,bottom,top,near,far,dst){dst=dst||new MatType(16);dst[0]=2/(right-left);dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=2/(top-bottom);dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=-1/(far-near);dst[11]=0;dst[12]=(right+left)/(left-right);dst[13]=(top+bottom)/(bottom-top);dst[14]=-near/(near-far);dst[15]=1;return dst}function frustum(left,right,bottom,top,near,far,dst){dst=dst||new MatType(16);var dx=right-left;var dy=top-bottom;var dz=near-far;dst[0]=2*near/dx;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=2*near/dy;dst[6]=0;dst[7]=0;dst[8]=(left+right)/dx;dst[9]=(top+bottom)/dy;dst[10]=far/dz;dst[11]=-1;dst[12]=0;dst[13]=0;dst[14]=near*far/dz;dst[15]=0;return dst}function lookAt(eye,target,up,dst){dst=dst||new MatType(16);var xAxis=tempV3a;var yAxis=tempV3b;var zAxis=tempV3c;v3.normalize(v3.subtract(eye,target,zAxis),zAxis);v3.cross(up,zAxis,xAxis);v3.cross(zAxis,xAxis,yAxis);dst[0]=xAxis[0];dst[1]=xAxis[1];dst[2]=xAxis[2];dst[3]=0;dst[4]=yAxis[0];dst[5]=yAxis[1];dst[6]=yAxis[2];dst[7]=0;dst[8]=zAxis[0];dst[9]=zAxis[1];dst[10]=zAxis[2];dst[11]=0;dst[12]=eye[0];dst[13]=eye[1];dst[14]=eye[2];dst[15]=1;return dst}function translation(v,dst){dst=dst||new MatType(16);dst[0]=1;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=1;dst[11]=0;dst[12]=v[0];dst[13]=v[1];dst[14]=v[2];dst[15]=1;return dst}function translate(m,v,dst){dst=dst||new MatType(16);var v0=v[0];var v1=v[1];var v2=v[2];var m00=m[0];var m01=m[1];var m02=m[2];var m03=m[3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];if(m!==dst){dst[0]=m00;dst[1]=m01;dst[2]=m02;dst[3]=m03;dst[4]=m10;dst[5]=m11;dst[6]=m12;dst[7]=m13;dst[8]=m20;dst[9]=m21;dst[10]=m22;dst[11]=m23}dst[12]=m00*v0+m10*v1+m20*v2+m30;dst[13]=m01*v0+m11*v1+m21*v2+m31;dst[14]=m02*v0+m12*v1+m22*v2+m32;dst[15]=m03*v0+m13*v1+m23*v2+m33;return dst}function rotationX(angleInRadians,dst){dst=dst||new MatType(16);var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=1;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=c;dst[6]=s;dst[7]=0;dst[8]=0;dst[9]=-s;dst[10]=c;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function rotateX(m,angleInRadians,dst){dst=dst||new MatType(16);var m10=m[4];var m11=m[5];var m12=m[6];var m13=m[7];var m20=m[8];var m21=m[9];var m22=m[10];var m23=m[11];var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[4]=c*m10+s*m20;dst[5]=c*m11+s*m21;dst[6]=c*m12+s*m22;dst[7]=c*m13+s*m23;dst[8]=c*m20-s*m10;dst[9]=c*m21-s*m11;dst[10]=c*m22-s*m12;dst[11]=c*m23-s*m13;if(m!==dst){dst[0]=m[0];dst[1]=m[1];dst[2]=m[2];dst[3]=m[3];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function rotationY(angleInRadians,dst){dst=dst||new MatType(16);var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c;dst[1]=0;dst[2]=-s;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=s;dst[9]=0;dst[10]=c;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function rotateY(m,angleInRadians,dst){dst=dst||new MatType(16);var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c*m00-s*m20;dst[1]=c*m01-s*m21;dst[2]=c*m02-s*m22;dst[3]=c*m03-s*m23;dst[8]=c*m20+s*m00;dst[9]=c*m21+s*m01;dst[10]=c*m22+s*m02;dst[11]=c*m23+s*m03;if(m!==dst){dst[4]=m[4];dst[5]=m[5];dst[6]=m[6];dst[7]=m[7];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function rotationZ(angleInRadians,dst){dst=dst||new MatType(16);var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c;dst[1]=s;dst[2]=0;dst[3]=0;dst[4]=-s;dst[5]=c;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=1;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function rotateZ(m,angleInRadians,dst){dst=dst||new MatType(16);var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c*m00+s*m10;dst[1]=c*m01+s*m11;dst[2]=c*m02+s*m12;dst[3]=c*m03+s*m13;dst[4]=c*m10-s*m00;dst[5]=c*m11-s*m01;dst[6]=c*m12-s*m02;dst[7]=c*m13-s*m03;if(m!==dst){dst[8]=m[8];dst[9]=m[9];dst[10]=m[10];dst[11]=m[11];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function axisRotation(axis,angleInRadians,dst){dst=dst||new MatType(16);var x=axis[0];var y=axis[1];var z=axis[2];var n=Math.sqrt(x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;var yy=y*y;var zz=z*z;var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);var oneMinusCosine=1-c;dst[0]=xx+(1-xx)*c;dst[1]=x*y*oneMinusCosine+z*s;dst[2]=x*z*oneMinusCosine-y*s;dst[3]=0;dst[4]=x*y*oneMinusCosine-z*s;dst[5]=yy+(1-yy)*c;dst[6]=y*z*oneMinusCosine+x*s;dst[7]=0;dst[8]=x*z*oneMinusCosine+y*s;dst[9]=y*z*oneMinusCosine-x*s;dst[10]=zz+(1-zz)*c;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function axisRotate(m,axis,angleInRadians,dst){dst=dst||new MatType(16);var x=axis[0];var y=axis[1];var z=axis[2];var n=Math.sqrt(x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;var yy=y*y;var zz=z*z;var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);var oneMinusCosine=1-c;var r00=xx+(1-xx)*c;var r01=x*y*oneMinusCosine+z*s;var r02=x*z*oneMinusCosine-y*s;var r10=x*y*oneMinusCosine-z*s;var r11=yy+(1-yy)*c;var r12=y*z*oneMinusCosine+x*s;var r20=x*z*oneMinusCosine+y*s;var r21=y*z*oneMinusCosine-x*s;var r22=zz+(1-zz)*c;var m00=m[0];var m01=m[1];var m02=m[2];var m03=m[3];var m10=m[4];var m11=m[5];var m12=m[6];var m13=m[7];var m20=m[8];var m21=m[9];var m22=m[10];var m23=m[11];var m30=m[12];var m31=m[13];var m32=m[14];var m33=m[15];dst[0]=r00*m00+r01*m10+r02*m20;dst[1]=r00*m01+r01*m11+r02*m21;dst[2]=r00*m02+r01*m12+r02*m22;dst[3]=r00*m03+r01*m13+r02*m23;dst[4]=r10*m00+r11*m10+r12*m20;dst[5]=r10*m01+r11*m11+r12*m21;dst[6]=r10*m02+r11*m12+r12*m22;dst[7]=r10*m03+r11*m13+r12*m23;dst[8]=r20*m00+r21*m10+r22*m20;dst[9]=r20*m01+r21*m11+r22*m21;dst[10]=r20*m02+r21*m12+r22*m22;dst[11]=r20*m03+r21*m13+r22*m23;if(m!==dst){dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function scaling(v,dst){dst=dst||new MatType(16);dst[0]=v[0];dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=v[1];dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=v[2];dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function scale(m,v,dst){dst=dst||new MatType(16);var v0=v[0];var v1=v[1];var v2=v[2];dst[0]=v0*m[0*4+0];dst[1]=v0*m[0*4+1];dst[2]=v0*m[0*4+2];dst[3]=v0*m[0*4+3];dst[4]=v1*m[1*4+0];dst[5]=v1*m[1*4+1];dst[6]=v1*m[1*4+2];dst[7]=v1*m[1*4+3];dst[8]=v2*m[2*4+0];dst[9]=v2*m[2*4+1];dst[10]=v2*m[2*4+2];dst[11]=v2*m[2*4+3];if(m!==dst){dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return m}function transformPoint(m,v,dst){dst=dst||v3.create();var v0=v[0];var v1=v[1];var v2=v[2];var d=v0*m[0*4+3]+v1*m[1*4+3]+v2*m[2*4+3]+m[3*4+3];dst[0]=(v0*m[0*4+0]+v1*m[1*4+0]+v2*m[2*4+0]+m[3*4+0])/d;dst[1]=(v0*m[0*4+1]+v1*m[1*4+1]+v2*m[2*4+1]+m[3*4+1])/d;dst[2]=(v0*m[0*4+2]+v1*m[1*4+2]+v2*m[2*4+2]+m[3*4+2])/d;return dst}function transformDirection(m,v,dst){dst=dst||v3.create();var v0=v[0];var v1=v[1];var v2=v[2];dst[0]=v0*m[0*4+0]+v1*m[1*4+0]+v2*m[2*4+0];dst[1]=v0*m[0*4+1]+v1*m[1*4+1]+v2*m[2*4+1];dst[2]=v0*m[0*4+2]+v1*m[1*4+2]+v2*m[2*4+2];return dst}function transformNormal(m,v,dst){dst=dst||v3.create();var mi=m4.inverse(m);var v0=v[0];var v1=v[1];var v2=v[2];dst[0]=v0*mi[0*4+0]+v1*mi[0*4+1]+v2*mi[0*4+2];dst[1]=v0*mi[1*4+0]+v1*mi[1*4+1]+v2*mi[1*4+2];dst[2]=v0*mi[2*4+0]+v1*mi[2*4+1]+v2*mi[2*4+2];return dst}return{axisRotate:axisRotate,axisRotation:axisRotation,create:identity,copy:copy,frustum:frustum,getAxis:getAxis,getTranslation:getTranslation,identity:identity,inverse:inverse,lookAt:lookAt,multiply:multiply,negate:negate,ortho:ortho,perspective:perspective,rotateX:rotateX,rotateY:rotateY,rotateZ:rotateZ,rotationX:rotationX,rotationY:rotationY,rotationZ:rotationZ,scale:scale,scaling:scaling,setTranslation:setTranslation,transformDirection:transformDirection,transformNormal:transformNormal,transformPoint:transformPoint,translate:translate,translation:translation,transpose:transpose}});(function(root,factory){if(typeof define==="function"&&define.amd){define(["./twgl","./m4"],factory)}else{root.twgl=root.twgl||{};root.twgl.primitives=factory.call(root)}})(this,function(webglUtils,m4){"use strict";webglUtils=webglUtils||this.twgl;m4=m4||this;function createPlaneVertices(width,depth,subdivisionsWidth,subdivisionsDepth,matrix){width=width||1;depth=depth||1;subdivisionsWidth=subdivisionsWidth||1;subdivisionsDepth=subdivisionsDepth||1;matrix=matrix||m4.identity();var numVertices=(subdivisionsWidth+1)*(subdivisionsDepth+1);var positions=webglUtils.createAugmentedTypedArray(3,numVertices);var normals=webglUtils.createAugmentedTypedArray(3,numVertices);var texcoords=webglUtils.createAugmentedTypedArray(2,numVertices);for(var z=0;z<=subdivisionsDepth;z++){for(var x=0;x<=subdivisionsWidth;x++){var u=x/subdivisionsWidth;var v=z/subdivisionsDepth;positions.push(width*u-width*.5,0,depth*v-depth*.5);normals.push(0,1,0);texcoords.push(u,v)}}var numVertsAcross=subdivisionsWidth+1;var indices=webglUtils.createAugmentedTypedArray(3,subdivisionsWidth*subdivisionsDepth*2,Uint16Array);for(var z=0;z 0")}opt_startLatitudeInRadians=opt_startLatitudeInRadians||0;opt_endLatitudeInRadians=opt_endLatitudeInRadians||Math.PI;opt_startLongitudeInRadians=opt_startLongitudeInRadians||0;opt_endLongitudeInRadians=opt_endLongitudeInRadians||Math.PI*2;var latRange=opt_endLatitudeInRadians-opt_startLatitudeInRadians;var longRange=opt_endLongitudeInRadians-opt_startLongitudeInRadians;var numVertices=(subdivisionsAxis+1)*(subdivisionsHeight+1);var positions=webglUtils.createAugmentedTypedArray(3,numVertices);var normals=webglUtils.createAugmentedTypedArray(3,numVertices);var texCoords=webglUtils.createAugmentedTypedArray(2,numVertices);for(var y=0;y<=subdivisionsHeight;y++){for(var x=0;x<=subdivisionsAxis;x++){var u=x/subdivisionsAxis;var v=y/subdivisionsHeight;var theta=longRange*u;var phi=latRange*v;var sinTheta=Math.sin(theta);var cosTheta=Math.cos(theta);var sinPhi=Math.sin(phi);var cosPhi=Math.cos(phi);var ux=cosTheta*sinPhi;var uy=cosPhi;var uz=sinTheta*sinPhi;positions.push(radius*ux,radius*uy,radius*uz);normals.push(ux,uy,uz);texCoords.push(1-u,v)}}var numVertsAround=subdivisionsAxis+1;var indices=webglUtils.createAugmentedTypedArray(3,subdivisionsAxis*subdivisionsHeight*2,Uint16Array);for(var x=0;xverticalSubdivisions){y=height;v=1;ringRadius=topRadius}else{ringRadius=bottomRadius+(topRadius-bottomRadius)*(yy/verticalSubdivisions)}if(yy==-2||yy==verticalSubdivisions+2){ringRadius=0;v=0}y-=height/2;for(var ii=0;iiverticalSubdivisions?0:sin*cosSlant,yy<0?-1:yy>verticalSubdivisions?1:sinSlant,yy<0||yy>verticalSubdivisions?0:cos*cosSlant);texCoords.push(ii/radialSubdivisions,1-v)}}for(var yy=0;yy=0){reorientPositions(array,matrix)}else if(name.indexOf("tan")>=0||name.indexOf("binorm")>=0){reorientDirections(array,matrix)}else if(name.indexOf("norm")>=0){reorientNormals(array,matrix)}});return arrays}function randInt(range){return Math.random()*range|0}function makeRandomVertexColors(vertices,options){options=options||{};var numElements=vertices.position.numElements;var vcolors=webglUtils.createAugmentedTypedArray(4,numElements,Uint8Array);var rand=options.rand||function(ndx,channel){return channel<3?randInt(256):255};vertices.color=vcolors;if(vertices.indices){for(var ii=0;ii1&&uniformInfo.name.substr(-3)=="[0]";if(type==gl.FLOAT&&isArray)return function(v){gl.uniform1fv(location,v)};if(type==gl.FLOAT)return function(v){gl.uniform1f(location,v)};if(type==gl.FLOAT_VEC2)return function(v){gl.uniform2fv(location,v)};if(type==gl.FLOAT_VEC3)return function(v){gl.uniform3fv(location,v)};if(type==gl.FLOAT_VEC4)return function(v){gl.uniform4fv(location,v)};if(type==gl.INT&&isArray)return function(v){gl.uniform1iv(location,v)};if(type==gl.INT)return function(v){gl.uniform1i(location,v)};if(type==gl.INT_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.INT_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.INT_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.BOOL)return function(v){gl.uniform1iv(location,v)};if(type==gl.BOOL_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.BOOL_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.BOOL_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.FLOAT_MAT2)return function(v){gl.uniformMatrix2fv(location,false,v)};if(type==gl.FLOAT_MAT3)return function(v){gl.uniformMatrix3fv(location,false,v)};if(type==gl.FLOAT_MAT4)return function(v){gl.uniformMatrix4fv(location,false,v)};if((type==gl.SAMPLER_2D||type==gl.SAMPLER_CUBE)&&isArray){var units=[];for(var ii=0;ii=0){numComponents=2}else if(name.indexOf("color")>=0){numComponents=4}else{numComponents=3}if(length%numComponents>0){throw"can not guess numComponents. You should specify it."}return numComponents}function makeTypedArray(array,name){if(isArrayBuffer(array)){return array}if(Array.isArray(array)){array={data:array}}var type=array.type;if(!type){if(name==="indices"){type=Uint16Array}else{type=Float32Array}}return new type(array.data)}function createAttribsFromArrays(gl,arrays,opt_mapping){var mapping=opt_mapping||createMapping(arrays);var attribs={};Object.keys(mapping).forEach(function(attribName){var bufferName=mapping[attribName];var array=makeTypedArray(arrays[bufferName],bufferName);attribs[attribName]={buffer:createBufferFromTypedArray(gl,array),numComponents:array.numComponents||guessNumComponentsFromName(bufferName),type:getGLTypeForTypedArray(gl,array),normalize:getNormalizationForTypedArray(array)}});return attribs}var positionKeys=["position","positions","a_position"];function getNumElementsFromNonIndexedArrays(arrays){var key;for(var ii=0;ii0){throw"numComponents "+numComponent+" not correct for length "+length}return numElements}function createBufferInfoFromArrays(gl,arrays,opt_mapping){var bufferInfo={attribs:createAttribsFromArrays(gl,arrays,opt_mapping)};var indices=arrays.indices;if(indices){indices=makeTypedArray(indices,"indices");bufferInfo.indices=createBufferFromTypedArray(gl,indices,gl.ELEMENT_ARRAY_BUFFER);bufferInfo.numElements=indices.length}else{bufferInfo.numElements=getNumElementsFromNonIndexedArrays(arrays)}return bufferInfo}function createBuffersFromArrays(gl,arrays){var buffers={};Object.keys(arrays).forEach(function(key){var type=key=="indices"?gl.ELEMENT_ARRAY_BUFFER:gl.ARRAY_BUFFER;var array=makeTypedArray(arrays[key],name);buffers[key]=createBufferFromTypedArray(gl,array,type)});return buffers}function drawBufferInfo(gl,type,bufferInfo,count,offset){var indices=bufferInfo.indices;var numElements=count===undefined?bufferInfo.numElements:count;offset=offset===undefined?offset:0;if(indices){gl.drawElements(type,numElements,gl.UNSIGNED_SHORT,offset)}else{gl.drawArrays(type,offset,numElements)}}function drawObjectList(objectsToDraw){var lastUsedProgramInfo=null;var lastUsedBufferInfo=null;objectsToDraw.forEach(function(object){var programInfo=object.programInfo;var bufferInfo=object.bufferInfo;if(programInfo!==lastUsedProgramInfo){lastUsedProgramInfo=programInfo;gl.useProgram(programInfo.program)}if(bufferInfo!=lastUsedBufferInfo){lastUsedBufferInfo=bufferInfo;setBuffersAndAttributes(gl,programInfo,bufferInfo)}setUniforms(programInfo,object.uniforms);drawBufferInfo(gl,gl.TRIANGLES,bufferInfo)})}return{createAugmentedTypedArray:createAugmentedTypedArray,createAttribsFromArrays:createAttribsFromArrays,createBuffersFromArrays:createBuffersFromArrays,createBufferInfoFromArrays:createBufferInfoFromArrays,createAttributeSetters:createAttributeSetters,createProgram:createProgram,createProgramFromScripts:createProgramFromScripts,createProgramFromSources:createProgramFromSources,createProgramInfo:createProgramInfo,createUniformSetters:createUniformSetters,drawBufferInfo:drawBufferInfo,drawObjectList:drawObjectList,getWebGLContext:getWebGLContext,resizeCanvasToDisplaySize:resizeCanvasToDisplaySize,setAttributes:setAttributes,setBuffersAndAttributes:setBuffersAndAttributes,setUniforms:setUniforms}});(function(root,factory){if(typeof define==="function"&&define.amd){define([],factory)}else{var lib=factory.call(root);root.twgl=root.twgl||{};root.twgl.v3=lib}})(this,function(){"use strict";var VecType=Float32Array;function create(){return new VecType(3)}function add(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]+b[0];dst[1]=a[1]+b[1];dst[2]=a[2]+b[2];return dst}function subtract(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]-b[0];dst[1]=a[1]-b[1];dst[2]=a[2]-b[2];return dst}function lerp(a,b,t,dst){dst=dst||new VecType(3);dst[0]=(1-t)*a[0]+t*b[0];dst[1]=(1-t)*a[1]+t*b[1];dst[2]=(1-t)*a[2]+t*b[2];return dst}function mulScalar(v,k,dst){dst=dst||new VecType(3);dst[0]=v[0]*k;dst[1]=v[1]*k;dst[2]=v[2]*k;return dst}function divScalar(v,k,dst){dst=dst||new VecType(3);dst[0]=v[0]/k;dst[1]=v[1]/k;dst[2]=v[2]/k;return dst}function cross(a,b,dst){dst=dst||new VecType(3);dst[0]=a[1]*b[2]-a[2]*b[1];dst[1]=a[2]*b[0]-a[0]*b[2];dst[2]=a[0]*b[1]-a[1]*b[0];return dst}function dot(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]}function length(v){return Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])}function lengthSq(a){return a[0]*a[0]+a[1]*a[1]+a[2]*a[2]}function normalize(a,dst){dst=dst||new VecType(3);var lenSq=a[0]*a[0]+a[1]*a[1]+a[2]*a[2];var len=Math.sqrt(lenSq);if(len>1e-5){dst[0]=a[0]/len;dst[1]=a[1]/len;dst[2]=a[2]/len}else{dst[0]=0;dst[1]=0;dst[2]=0}return dst}function negate(v,dst){dst=dst||new VecType(3);dst[0]=-v[0];dst[1]=-v[1];dst[2]=-v[2];return dst}function copy(v,dst){dst=dst||new VecType(3);dst[0]=v[0];dst[1]=v[1];dst[2]=v[2];return dst}function multiply(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]*b[0];dst[1]=a[1]*b[1];dst[2]=a[2]*b[2];return dst}function divide(a,b,dst){dst=dst||new VecType(3);dst[0]=a[0]/b[0];dst[1]=a[1]/b[1];dst[2]=a[2]/b[2];return dst}return{add:add,copy:copy,create:create,cross:cross,divide:divide,divScalar:divScalar,dot:dot,lerp:lerp,length:length,lengthSq:lengthSq,mulScalar:mulScalar,multiply:multiply,negate:negate,normalize:normalize,subtract:subtract}});(function(root,factory){if(typeof define==="function"&&define.amd){define(["./v3"],factory)}else{var lib=factory.call(root);root.twgl=root.twgl||{};root.twgl.m4=lib}})(this,function(v3){"use strict";var v3=v3||this.twgl.v3;if(!v3){throw"need v3.js"}var MatType=Float32Array;var tempV3a=v3.create();var tempV3b=v3.create();var tempV3c=v3.create();function negate(m,dst){dst=dst||new MatType(16);dst[0]=-m[0];dst[1]=-m[1];dst[2]=-m[2];dst[3]=-m[3];dst[4]=-m[4];dst[5]=-m[5];dst[6]=-m[6];dst[7]=-m[7];dst[8]=-m[8];dst[9]=-m[9];dst[10]=-m[10];dst[11]=-m[11];dst[12]=-m[12];dst[13]=-m[13];dst[14]=-m[14];dst[15]=-m[15];return dst}function copy(m,dst){dst=dst||new MatType(16);dst[0]=m[0];dst[1]=m[1];dst[2]=m[2];dst[3]=m[3];dst[4]=m[4];dst[5]=m[5];dst[6]=m[6];dst[7]=m[7];dst[8]=m[8];dst[9]=m[9];dst[10]=m[10];dst[11]=m[11];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15];return dst}function identity(dst){dst=dst||new MatType(16);dst[0]=1;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=1;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function transpose(m,dst){dst=dst||new MatType(16);if(dst===m){var t;t=m[1];m[1]=m[4];m[4]=t;t=m[2];m[2]=m[8];m[8]=t;t=m[3];m[3]=m[12];m[12]=t;t=m[6];m[6]=m[9];m[9]=t;t=m[7];m[7]=m[13];m[13]=t;t=m[11];m[11]=m[14];m[14]=t;return dst}var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];dst[0]=m00;dst[1]=m10;dst[2]=m20;dst[3]=m30;dst[4]=m01;dst[5]=m11;dst[6]=m21;dst[7]=m31;dst[8]=m02;dst[9]=m12;dst[10]=m22;dst[11]=m32;dst[12]=m03;dst[13]=m13;dst[14]=m23;dst[15]=m33;return dst}function inverse(m,dst){dst=dst||new MatType(16);var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];var tmp_0=m22*m33;var tmp_1=m32*m23;var tmp_2=m12*m33;var tmp_3=m32*m13;var tmp_4=m12*m23;var tmp_5=m22*m13;var tmp_6=m02*m33;var tmp_7=m32*m03;var tmp_8=m02*m23;var tmp_9=m22*m03;var tmp_10=m02*m13;var tmp_11=m12*m03;var tmp_12=m20*m31;var tmp_13=m30*m21;var tmp_14=m10*m31;var tmp_15=m30*m11;var tmp_16=m10*m21;var tmp_17=m20*m11;var tmp_18=m00*m31;var tmp_19=m30*m01;var tmp_20=m00*m21;var tmp_21=m20*m01;var tmp_22=m00*m11;var tmp_23=m10*m01;var t0=tmp_0*m11+tmp_3*m21+tmp_4*m31-(tmp_1*m11+tmp_2*m21+tmp_5*m31);var t1=tmp_1*m01+tmp_6*m21+tmp_9*m31-(tmp_0*m01+tmp_7*m21+tmp_8*m31);var t2=tmp_2*m01+tmp_7*m11+tmp_10*m31-(tmp_3*m01+tmp_6*m11+tmp_11*m31);var t3=tmp_5*m01+tmp_8*m11+tmp_11*m21-(tmp_4*m01+tmp_9*m11+tmp_10*m21);var d=1/(m00*t0+m10*t1+m20*t2+m30*t3);dst[0]=d*t0;dst[1]=d*t1;dst[2]=d*t2;dst[3]=d*t3;dst[4]=d*(tmp_1*m10+tmp_2*m20+tmp_5*m30-(tmp_0*m10+tmp_3*m20+tmp_4*m30));dst[5]=d*(tmp_0*m00+tmp_7*m20+tmp_8*m30-(tmp_1*m00+tmp_6*m20+tmp_9*m30));dst[6]=d*(tmp_3*m00+tmp_6*m10+tmp_11*m30-(tmp_2*m00+tmp_7*m10+tmp_10*m30));dst[7]=d*(tmp_4*m00+tmp_9*m10+tmp_10*m20-(tmp_5*m00+tmp_8*m10+tmp_11*m20));dst[8]=d*(tmp_12*m13+tmp_15*m23+tmp_16*m33-(tmp_13*m13+tmp_14*m23+tmp_17*m33));dst[9]=d*(tmp_13*m03+tmp_18*m23+tmp_21*m33-(tmp_12*m03+tmp_19*m23+tmp_20*m33));dst[10]=d*(tmp_14*m03+tmp_19*m13+tmp_22*m33-(tmp_15*m03+tmp_18*m13+tmp_23*m33));dst[11]=d*(tmp_17*m03+tmp_20*m13+tmp_23*m23-(tmp_16*m03+tmp_21*m13+tmp_22*m23));dst[12]=d*(tmp_14*m22+tmp_17*m32+tmp_13*m12-(tmp_16*m32+tmp_12*m12+tmp_15*m22));dst[13]=d*(tmp_20*m32+tmp_12*m02+tmp_19*m22-(tmp_18*m22+tmp_21*m32+tmp_13*m02));dst[14]=d*(tmp_18*m12+tmp_23*m32+tmp_15*m02-(tmp_22*m32+tmp_14*m02+tmp_19*m12));dst[15]=d*(tmp_22*m22+tmp_16*m02+tmp_21*m12-(tmp_20*m12+tmp_23*m22+tmp_17*m02));return dst}function multiply(a,b,dst){dst=dst||new MatType(16);var a00=a[0];var a01=a[1];var a02=a[2];var a03=a[3];var a10=a[4+0];var a11=a[4+1];var a12=a[4+2];var a13=a[4+3];var a20=a[8+0];var a21=a[8+1];var a22=a[8+2];var a23=a[8+3];var a30=a[12+0];var a31=a[12+1];var a32=a[12+2];var a33=a[12+3];var b00=b[0];var b01=b[1];var b02=b[2];var b03=b[3];var b10=b[4+0];var b11=b[4+1];var b12=b[4+2];var b13=b[4+3];var b20=b[8+0];var b21=b[8+1];var b22=b[8+2];var b23=b[8+3];var b30=b[12+0];var b31=b[12+1];var b32=b[12+2];var b33=b[12+3];dst[0]=a00*b00+a01*b10+a02*b20+a03*b30;dst[1]=a00*b01+a01*b11+a02*b21+a03*b31;dst[2]=a00*b02+a01*b12+a02*b22+a03*b32;dst[3]=a00*b03+a01*b13+a02*b23+a03*b33;dst[4]=a10*b00+a11*b10+a12*b20+a13*b30;dst[5]=a10*b01+a11*b11+a12*b21+a13*b31;dst[6]=a10*b02+a11*b12+a12*b22+a13*b32;dst[7]=a10*b03+a11*b13+a12*b23+a13*b33;dst[8]=a20*b00+a21*b10+a22*b20+a23*b30;dst[9]=a20*b01+a21*b11+a22*b21+a23*b31;dst[10]=a20*b02+a21*b12+a22*b22+a23*b32;dst[11]=a20*b03+a21*b13+a22*b23+a23*b33;dst[12]=a30*b00+a31*b10+a32*b20+a33*b30;dst[13]=a30*b01+a31*b11+a32*b21+a33*b31;dst[14]=a30*b02+a31*b12+a32*b22+a33*b32;dst[15]=a30*b03+a31*b13+a32*b23+a33*b33;return dst}function setTranslation(a,dst){dst=dst||identity();dst[12]=v[0];dst[13]=v[1];dst[14]=v[2];dst[15]=1;return dst}function getTranslation(m,dst){dst=dst||v3.create();dst[0]=m[12];dst[1]=m[13];dst[2]=m[14];return dst}function getAxis(m,axis,dst){dst=dst||v3.create();var off=axis*4;dst[0]=m[off+0];dst[1]=m[off+1];dst[2]=m[off+2];return dst}function perspective(fieldOfViewYInRadians,aspect,zNear,zFar,dst){dst=dst||new MatType(16);var f=Math.tan(Math.PI*.5-.5*fieldOfViewYInRadians);var rangeInv=1/(zNear-zFar);dst[0]=f/aspect;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=f;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=(zNear+zFar)*rangeInv;dst[11]=-1;dst[12]=0;dst[13]=0;dst[14]=zNear*zFar*rangeInv*2;dst[15]=0;return dst}function ortho(left,right,bottom,top,near,far,dst){dst=dst||new MatType(16);dst[0]=2/(right-left);dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=2/(top-bottom);dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=-1/(far-near);dst[11]=0;dst[12]=(right+left)/(left-right);dst[13]=(top+bottom)/(bottom-top);dst[14]=-near/(near-far);dst[15]=1;return dst}function frustum(left,right,bottom,top,near,far,dst){dst=dst||new MatType(16);var dx=right-left;var dy=top-bottom;var dz=near-far;dst[0]=2*near/dx;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=2*near/dy;dst[6]=0;dst[7]=0;dst[8]=(left+right)/dx;dst[9]=(top+bottom)/dy;dst[10]=far/dz;dst[11]=-1;dst[12]=0;dst[13]=0;dst[14]=near*far/dz;dst[15]=0;return dst}function lookAt(eye,target,up,dst){dst=dst||new MatType(16);var xAxis=tempV3a;var yAxis=tempV3b;var zAxis=tempV3c;v3.normalize(v3.subtract(eye,target,zAxis),zAxis);v3.cross(up,zAxis,xAxis);v3.cross(zAxis,xAxis,yAxis);dst[0]=xAxis[0];dst[1]=xAxis[1];dst[2]=xAxis[2];dst[3]=0;dst[4]=yAxis[0];dst[5]=yAxis[1];dst[6]=yAxis[2];dst[7]=0;dst[8]=zAxis[0];dst[9]=zAxis[1];dst[10]=zAxis[2];dst[11]=0;dst[12]=eye[0];dst[13]=eye[1];dst[14]=eye[2];dst[15]=1;return dst}function translation(v,dst){dst=dst||new MatType(16);dst[0]=1;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=1;dst[11]=0;dst[12]=v[0];dst[13]=v[1];dst[14]=v[2];dst[15]=1;return dst}function translate(m,v,dst){dst=dst||new MatType(16);var v0=v[0];var v1=v[1];var v2=v[2];var m00=m[0];var m01=m[1];var m02=m[2];var m03=m[3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];if(m!==dst){dst[0]=m00;dst[1]=m01;dst[2]=m02;dst[3]=m03;dst[4]=m10;dst[5]=m11;dst[6]=m12;dst[7]=m13;dst[8]=m20;dst[9]=m21;dst[10]=m22;dst[11]=m23}dst[12]=m00*v0+m10*v1+m20*v2+m30;dst[13]=m01*v0+m11*v1+m21*v2+m31;dst[14]=m02*v0+m12*v1+m22*v2+m32;dst[15]=m03*v0+m13*v1+m23*v2+m33;return dst}function rotationX(angleInRadians,dst){dst=dst||new MatType(16);var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=1;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=c;dst[6]=s;dst[7]=0;dst[8]=0;dst[9]=-s;dst[10]=c;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function rotateX(m,angleInRadians,dst){dst=dst||new MatType(16);var m10=m[4];var m11=m[5];var m12=m[6];var m13=m[7];var m20=m[8];var m21=m[9];var m22=m[10];var m23=m[11];var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[4]=c*m10+s*m20;dst[5]=c*m11+s*m21;dst[6]=c*m12+s*m22;dst[7]=c*m13+s*m23;dst[8]=c*m20-s*m10;dst[9]=c*m21-s*m11;dst[10]=c*m22-s*m12;dst[11]=c*m23-s*m13;if(m!==dst){dst[0]=m[0];dst[1]=m[1];dst[2]=m[2];dst[3]=m[3];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function rotationY(angleInRadians,dst){dst=dst||new MatType(16);var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c;dst[1]=0;dst[2]=-s;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=s;dst[9]=0;dst[10]=c;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function rotateY(m,angleInRadians,dst){dst=dst||new MatType(16);var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c*m00-s*m20;dst[1]=c*m01-s*m21;dst[2]=c*m02-s*m22;dst[3]=c*m03-s*m23;dst[8]=c*m20+s*m00;dst[9]=c*m21+s*m01;dst[10]=c*m22+s*m02;dst[11]=c*m23+s*m03;if(m!==dst){dst[4]=m[4];dst[5]=m[5];dst[6]=m[6];dst[7]=m[7];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function rotationZ(angleInRadians,dst){dst=dst||new MatType(16);var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c;dst[1]=s;dst[2]=0;dst[3]=0;dst[4]=-s;dst[5]=c;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=1;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function rotateZ(m,angleInRadians,dst){dst=dst||new MatType(16);var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);dst[0]=c*m00+s*m10;dst[1]=c*m01+s*m11;dst[2]=c*m02+s*m12;dst[3]=c*m03+s*m13;dst[4]=c*m10-s*m00;dst[5]=c*m11-s*m01;dst[6]=c*m12-s*m02;dst[7]=c*m13-s*m03;if(m!==dst){dst[8]=m[8];dst[9]=m[9];dst[10]=m[10];dst[11]=m[11];dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function axisRotation(axis,angleInRadians,dst){dst=dst||new MatType(16);var x=axis[0];var y=axis[1];var z=axis[2];var n=Math.sqrt(x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;var yy=y*y;var zz=z*z;var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);var oneMinusCosine=1-c;dst[0]=xx+(1-xx)*c;dst[1]=x*y*oneMinusCosine+z*s;dst[2]=x*z*oneMinusCosine-y*s;dst[3]=0;dst[4]=x*y*oneMinusCosine-z*s;dst[5]=yy+(1-yy)*c;dst[6]=y*z*oneMinusCosine+x*s;dst[7]=0;dst[8]=x*z*oneMinusCosine+y*s;dst[9]=y*z*oneMinusCosine-x*s;dst[10]=zz+(1-zz)*c;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function axisRotate(m,axis,angleInRadians,dst){dst=dst||new MatType(16);var x=axis[0];var y=axis[1];var z=axis[2];var n=Math.sqrt(x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;var yy=y*y;var zz=z*z;var c=Math.cos(angleInRadians);var s=Math.sin(angleInRadians);var oneMinusCosine=1-c;var r00=xx+(1-xx)*c;var r01=x*y*oneMinusCosine+z*s;var r02=x*z*oneMinusCosine-y*s;var r10=x*y*oneMinusCosine-z*s;var r11=yy+(1-yy)*c;var r12=y*z*oneMinusCosine+x*s;var r20=x*z*oneMinusCosine+y*s;var r21=y*z*oneMinusCosine-x*s;var r22=zz+(1-zz)*c;var m00=m[0];var m01=m[1];var m02=m[2];var m03=m[3];var m10=m[4];var m11=m[5];var m12=m[6];var m13=m[7];var m20=m[8];var m21=m[9];var m22=m[10];var m23=m[11];var m30=m[12];var m31=m[13];var m32=m[14];var m33=m[15];dst[0]=r00*m00+r01*m10+r02*m20;dst[1]=r00*m01+r01*m11+r02*m21;dst[2]=r00*m02+r01*m12+r02*m22;dst[3]=r00*m03+r01*m13+r02*m23;dst[4]=r10*m00+r11*m10+r12*m20;dst[5]=r10*m01+r11*m11+r12*m21;dst[6]=r10*m02+r11*m12+r12*m22;dst[7]=r10*m03+r11*m13+r12*m23;dst[8]=r20*m00+r21*m10+r22*m20;dst[9]=r20*m01+r21*m11+r22*m21;dst[10]=r20*m02+r21*m12+r22*m22;dst[11]=r20*m03+r21*m13+r22*m23;if(m!==dst){dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return dst}function scaling(v,dst){dst=dst||new MatType(16);dst[0]=v[0];dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=v[1];dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=v[2];dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst}function scale(m,v,dst){dst=dst||new MatType(16);var v0=v[0];var v1=v[1];var v2=v[2];dst[0]=v0*m[0*4+0];dst[1]=v0*m[0*4+1];dst[2]=v0*m[0*4+2];dst[3]=v0*m[0*4+3];dst[4]=v1*m[1*4+0];dst[5]=v1*m[1*4+1];dst[6]=v1*m[1*4+2];dst[7]=v1*m[1*4+3];dst[8]=v2*m[2*4+0];dst[9]=v2*m[2*4+1];dst[10]=v2*m[2*4+2];dst[11]=v2*m[2*4+3];if(m!==dst){dst[12]=m[12];dst[13]=m[13];dst[14]=m[14];dst[15]=m[15]}return m}function transformPoint(m,v,dst){dst=dst||v3.create();var v0=v[0];var v1=v[1];var v2=v[2];var d=v0*m[0*4+3]+v1*m[1*4+3]+v2*m[2*4+3]+m[3*4+3];dst[0]=(v0*m[0*4+0]+v1*m[1*4+0]+v2*m[2*4+0]+m[3*4+0])/d;dst[1]=(v0*m[0*4+1]+v1*m[1*4+1]+v2*m[2*4+1]+m[3*4+1])/d;dst[2]=(v0*m[0*4+2]+v1*m[1*4+2]+v2*m[2*4+2]+m[3*4+2])/d;return dst}function transformDirection(m,v,dst){dst=dst||v3.create();var v0=v[0];var v1=v[1];var v2=v[2];dst[0]=v0*m[0*4+0]+v1*m[1*4+0]+v2*m[2*4+0];dst[1]=v0*m[0*4+1]+v1*m[1*4+1]+v2*m[2*4+1];dst[2]=v0*m[0*4+2]+v1*m[1*4+2]+v2*m[2*4+2];return dst}function transformNormal(m,v,dst){dst=dst||v3.create();var mi=m4.inverse(m);var v0=v[0];var v1=v[1];var v2=v[2];dst[0]=v0*mi[0*4+0]+v1*mi[0*4+1]+v2*mi[0*4+2];dst[1]=v0*mi[1*4+0]+v1*mi[1*4+1]+v2*mi[1*4+2];dst[2]=v0*mi[2*4+0]+v1*mi[2*4+1]+v2*mi[2*4+2];return dst}return{axisRotate:axisRotate,axisRotation:axisRotation,create:identity,copy:copy,frustum:frustum,getAxis:getAxis,getTranslation:getTranslation,identity:identity,inverse:inverse,lookAt:lookAt,multiply:multiply,negate:negate,ortho:ortho,perspective:perspective,rotateX:rotateX,rotateY:rotateY,rotateZ:rotateZ,rotationX:rotationX,rotationY:rotationY,rotationZ:rotationZ,scale:scale,scaling:scaling,setTranslation:setTranslation,transformDirection:transformDirection,transformNormal:transformNormal,transformPoint:transformPoint,translate:translate,translation:translation,transpose:transpose}});(function(root,factory){if(typeof define==="function"&&define.amd){define(["./twgl","./m4"],factory)}else{root.twgl=root.twgl||{};root.twgl.primitives=factory.call(root)}})(this,function(twgl,m4){"use strict";twgl=twgl||this.twgl;m4=m4||twgl.m4;function augmentTypedArray(typedArray,numComponents){var cursor=0;typedArray.push=function(){for(var ii=0;ii 0")}opt_startLatitudeInRadians=opt_startLatitudeInRadians||0;opt_endLatitudeInRadians=opt_endLatitudeInRadians||Math.PI;opt_startLongitudeInRadians=opt_startLongitudeInRadians||0;opt_endLongitudeInRadians=opt_endLongitudeInRadians||Math.PI*2;var latRange=opt_endLatitudeInRadians-opt_startLatitudeInRadians;var longRange=opt_endLongitudeInRadians-opt_startLongitudeInRadians;
-function createProgramFromScripts(gl,shaderScriptIds,opt_attribs,opt_locations,opt_errorCallback){var shaders=[];for(var ii=0;ii1&&uniformInfo.name.substr(-3)=="[0]";if(type==gl.FLOAT&&isArray)return function(v){gl.uniform1fv(location,v)};if(type==gl.FLOAT)return function(v){gl.uniform1f(location,v)};if(type==gl.FLOAT_VEC2)return function(v){gl.uniform2fv(location,v)};if(type==gl.FLOAT_VEC3)return function(v){gl.uniform3fv(location,v)};if(type==gl.FLOAT_VEC4)return function(v){gl.uniform4fv(location,v)};if(type==gl.INT&&isArray)return function(v){gl.uniform1iv(location,v)};if(type==gl.INT)return function(v){gl.uniform1i(location,v)};if(type==gl.INT_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.INT_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.INT_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.BOOL)return function(v){gl.uniform1iv(location,v)};if(type==gl.BOOL_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.BOOL_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.BOOL_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.FLOAT_MAT2)return function(v){gl.uniformMatrix2fv(location,false,v)};if(type==gl.FLOAT_MAT3)return function(v){gl.uniformMatrix3fv(location,false,v)};if(type==gl.FLOAT_MAT4)return function(v){gl.uniformMatrix4fv(location,false,v)};if((type==gl.SAMPLER_2D||type==gl.SAMPLER_CUBE)&&isArray){var units=[];for(var ii=0;ii=0){numComponents=2}else if(name.indexOf("color")>=0){numComponents=4}else{numComponents=3}if(length%numComponents>0){throw"can not guess numComponents. You should specify it."}return numComponents}function makeTypedArray(array,name){if(isArrayBuffer(array)){return array}if(Array.isArray(array)){array={data:array}}if(!array.numComponents){array.numComponents=guessNumComponentsFromName(name,array.length)}var type=array.type;if(!type){if(name==="indices"){type=Uint16Array}}var numElements=array.data.length/array.numComponents;if(numElements%1){console.warn("numComponents = ",array.numComponents,"doesn't match length = ",array.length,"of data given")}var typedArray=createAugmentedTypedArray(array.numComponents,numElements,type);typedArray.push(array.data);return typedArray}function createAttribsFromArrays(gl,arrays,opt_mapping){var mapping=opt_mapping||createMapping(arrays);var attribs={};Object.keys(mapping).forEach(function(attribName){var bufferName=mapping[attribName];var array=makeTypedArray(arrays[bufferName],bufferName);attribs[attribName]={buffer:createBufferFromTypedArray(gl,array),numComponents:array.numComponents||guessNumComponentsFromName(bufferName),type:getGLTypeForTypedArray(gl,array),normalize:getNormalizationForTypedArray(array)}});return attribs}function getNumElementsFromNonIndexedArrays(arrays){var key=Object.keys(arrays)[0];var array=arrays[key];if(isArrayBuffer(array)){return array.numElements}else{return array.data.length/array.numComponents}}function createBufferInfoFromArrays(gl,arrays,opt_mapping){var bufferInfo={attribs:createAttribsFromArrays(gl,arrays,opt_mapping)};var indices=arrays.indices;if(indices){indices=makeTypedArray(indices,"indices");bufferInfo.indices=createBufferFromTypedArray(gl,indices,gl.ELEMENT_ARRAY_BUFFER);bufferInfo.numElements=indices.length}else{bufferInfo.numElements=getNumElementsFromNonIndexedArrays(arrays)}return bufferInfo}function createBuffersFromArrays(gl,arrays){var buffers={};Object.keys(arrays).forEach(function(key){var type=key=="indices"?gl.ELEMENT_ARRAY_BUFFER:gl.ARRAY_BUFFER;var array=makeTypedArray(arrays[key],name);buffers[key]=createBufferFromTypedArray(gl,array,type)});return buffers}function drawBufferInfo(gl,type,bufferInfo,count,offset){var indices=bufferInfo.indices;var numElements=count===undefined?bufferInfo.numElements:count;offset=offset===undefined?offset:0;if(indices){gl.drawElements(type,numElements,gl.UNSIGNED_SHORT,offset)}else{gl.drawArrays(type,offset,numElements)}}function drawObjectList(objectsToDraw){var lastUsedProgramInfo=null;var lastUsedBufferInfo=null;objectsToDraw.forEach(function(object){var programInfo=object.programInfo;var bufferInfo=object.bufferInfo;if(programInfo!==lastUsedProgramInfo){lastUsedProgramInfo=programInfo;gl.useProgram(programInfo.program)}if(bufferInfo!=lastUsedBufferInfo){lastUsedBufferInfo=bufferInfo;setBuffersAndAttributes(gl,programInfo,bufferInfo)}setUniforms(programInfo,object.uniforms);drawBufferInfo(gl,gl.TRIANGLES,bufferInfo)})}return{createAugmentedTypedArray:createAugmentedTypedArray,createAttribsFromArrays:createAttribsFromArrays,createBuffersFromArrays:createBuffersFromArrays,createBufferInfoFromArrays:createBufferInfoFromArrays,createAttributeSetters:createAttributeSetters,createProgram:createProgram,createProgramFromScripts:createProgramFromScripts,createProgramFromSources:createProgramFromSources,createProgramInfo:createProgramInfo,createUniformSetters:createUniformSetters,drawBufferInfo:drawBufferInfo,drawObjectList:drawObjectList,getWebGLContext:getWebGLContext,resizeCanvasToDisplaySize:resizeCanvasToDisplaySize,setAttributes:setAttributes,setBuffersAndAttributes:setBuffersAndAttributes,setUniforms:setUniforms}});
\ No newline at end of file
+var numVertices=(subdivisionsAxis+1)*(subdivisionsHeight+1);var positions=createAugmentedTypedArray(3,numVertices);var normals=createAugmentedTypedArray(3,numVertices);var texCoords=createAugmentedTypedArray(2,numVertices);for(var y=0;y<=subdivisionsHeight;y++){for(var x=0;x<=subdivisionsAxis;x++){var u=x/subdivisionsAxis;var v=y/subdivisionsHeight;var theta=longRange*u;var phi=latRange*v;var sinTheta=Math.sin(theta);var cosTheta=Math.cos(theta);var sinPhi=Math.sin(phi);var cosPhi=Math.cos(phi);var ux=cosTheta*sinPhi;var uy=cosPhi;var uz=sinTheta*sinPhi;positions.push(radius*ux,radius*uy,radius*uz);normals.push(ux,uy,uz);texCoords.push(1-u,v)}}var numVertsAround=subdivisionsAxis+1;var indices=createAugmentedTypedArray(3,subdivisionsAxis*subdivisionsHeight*2,Uint16Array);for(var x=0;xverticalSubdivisions){y=height;v=1;ringRadius=topRadius}else{ringRadius=bottomRadius+(topRadius-bottomRadius)*(yy/verticalSubdivisions)}if(yy==-2||yy==verticalSubdivisions+2){ringRadius=0;v=0}y-=height/2;for(var ii=0;iiverticalSubdivisions?0:sin*cosSlant,yy<0?-1:yy>verticalSubdivisions?1:sinSlant,yy<0||yy>verticalSubdivisions?0:cos*cosSlant);texCoords.push(ii/radialSubdivisions,1-v)}}for(var yy=0;yy=0){reorientPositions(array,matrix)}else if(name.indexOf("tan")>=0||name.indexOf("binorm")>=0){reorientDirections(array,matrix)}else if(name.indexOf("norm")>=0){reorientNormals(array,matrix)}});return arrays}function randInt(range){return Math.random()*range|0}function makeRandomVertexColors(vertices,options){options=options||{};var numElements=vertices.position.numElements;var vcolors=createAugmentedTypedArray(4,numElements,Uint8Array);var rand=options.rand||function(ndx,channel){return channel<3?randInt(256):255};vertices.color=vcolors;if(vertices.indices){for(var ii=0;ii1&&uniformInfo.name.substr(-3)=="[0]";if(type==gl.FLOAT&&isArray)return function(v){gl.uniform1fv(location,v)};if(type==gl.FLOAT)return function(v){gl.uniform1f(location,v)};if(type==gl.FLOAT_VEC2)return function(v){gl.uniform2fv(location,v)};if(type==gl.FLOAT_VEC3)return function(v){gl.uniform3fv(location,v)};if(type==gl.FLOAT_VEC4)return function(v){gl.uniform4fv(location,v)};if(type==gl.INT&&isArray)return function(v){gl.uniform1iv(location,v)};if(type==gl.INT)return function(v){gl.uniform1i(location,v)};if(type==gl.INT_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.INT_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.INT_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.BOOL)return function(v){gl.uniform1iv(location,v)};if(type==gl.BOOL_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.BOOL_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.BOOL_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.FLOAT_MAT2)return function(v){gl.uniformMatrix2fv(location,false,v)};if(type==gl.FLOAT_MAT3)return function(v){gl.uniformMatrix3fv(location,false,v)};if(type==gl.FLOAT_MAT4)return function(v){gl.uniformMatrix4fv(location,false,v)};if((type==gl.SAMPLER_2D||type==gl.SAMPLER_CUBE)&&isArray){var units=[];for(var ii=0;ii=0){numComponents=2}else if(name.indexOf("color")>=0){numComponents=4}else{numComponents=3}if(length%numComponents>0){throw"can not guess numComponents. You should specify it."}return numComponents}function makeTypedArray(array,name){if(isArrayBuffer(array)){return array}if(Array.isArray(array)){array={data:array}}if(!array.numComponents){array.numComponents=guessNumComponentsFromName(name,array.length)}var type=array.type;if(!type){if(name==="indices"){type=Uint16Array}}var numElements=array.data.length/array.numComponents;if(numElements%1){console.warn("numComponents = ",array.numComponents,"doesn't match length = ",array.length,"of data given")}var typedArray=createAugmentedTypedArray(array.numComponents,numElements,type);typedArray.push(array.data);return typedArray}function createAttribsFromArrays(gl,arrays,opt_mapping){var mapping=opt_mapping||createMapping(arrays);var attribs={};Object.keys(mapping).forEach(function(attribName){var bufferName=mapping[attribName];var array=makeTypedArray(arrays[bufferName],bufferName);attribs[attribName]={buffer:createBufferFromTypedArray(gl,array),numComponents:array.numComponents||guessNumComponentsFromName(bufferName),type:getGLTypeForTypedArray(gl,array),normalize:getNormalizationForTypedArray(array)}});return attribs}function getNumElementsFromNonIndexedArrays(arrays){var key=Object.keys(arrays)[0];var array=arrays[key];if(isArrayBuffer(array)){return array.numElements}else{return array.data.length/array.numComponents}}function createBufferInfoFromArrays(gl,arrays,opt_mapping){var bufferInfo={attribs:createAttribsFromArrays(gl,arrays,opt_mapping)};var indices=arrays.indices;if(indices){indices=makeTypedArray(indices,"indices");bufferInfo.indices=createBufferFromTypedArray(gl,indices,gl.ELEMENT_ARRAY_BUFFER);bufferInfo.numElements=indices.length}else{bufferInfo.numElements=getNumElementsFromNonIndexedArrays(arrays)}return bufferInfo}function createBuffersFromArrays(gl,arrays){var buffers={};Object.keys(arrays).forEach(function(key){var type=key=="indices"?gl.ELEMENT_ARRAY_BUFFER:gl.ARRAY_BUFFER;var array=makeTypedArray(arrays[key],name);buffers[key]=createBufferFromTypedArray(gl,array,type)});return buffers}function drawBufferInfo(gl,type,bufferInfo,count,offset){var indices=bufferInfo.indices;var numElements=count===undefined?bufferInfo.numElements:count;offset=offset===undefined?offset:0;if(indices){gl.drawElements(type,numElements,gl.UNSIGNED_SHORT,offset)}else{gl.drawArrays(type,offset,numElements)}}function drawObjectList(objectsToDraw){var lastUsedProgramInfo=null;var lastUsedBufferInfo=null;objectsToDraw.forEach(function(object){var programInfo=object.programInfo;var bufferInfo=object.bufferInfo;if(programInfo!==lastUsedProgramInfo){lastUsedProgramInfo=programInfo;gl.useProgram(programInfo.program)}if(bufferInfo!=lastUsedBufferInfo){lastUsedBufferInfo=bufferInfo;setBuffersAndAttributes(gl,programInfo,bufferInfo)}setUniforms(programInfo,object.uniforms);drawBufferInfo(gl,gl.TRIANGLES,bufferInfo)})}return{createAugmentedTypedArray:createAugmentedTypedArray,createAttribsFromArrays:createAttribsFromArrays,createBuffersFromArrays:createBuffersFromArrays,createBufferInfoFromArrays:createBufferInfoFromArrays,createAttributeSetters:createAttributeSetters,createProgram:createProgram,createProgramFromScripts:createProgramFromScripts,createProgramFromSources:createProgramFromSources,createProgramInfo:createProgramInfo,createUniformSetters:createUniformSetters,drawBufferInfo:drawBufferInfo,drawObjectList:drawObjectList,getWebGLContext:getWebGLContext,resizeCanvasToDisplaySize:resizeCanvasToDisplaySize,setAttributes:setAttributes,setBuffersAndAttributes:setBuffersAndAttributes,setUniforms:setUniforms}});
\ No newline at end of file
+*/(function(root,factory){if(typeof define==="function"&&define.amd){define([],factory)}else{var lib=factory.call(root);root.twgl=root.twgl||{};Object.keys(lib).forEach(function(key){root.twgl[key]=lib[key]})}})(this,function(){"use strict";var error=this.console&&this.console.error?this.console.error.bind(this.console):function(){};var create3DContext=function(canvas,opt_attribs){var names=["webgl","experimental-webgl"];var context=null;for(var ii=0;ii1&&uniformInfo.name.substr(-3)=="[0]";if(type==gl.FLOAT&&isArray)return function(v){gl.uniform1fv(location,v)};if(type==gl.FLOAT)return function(v){gl.uniform1f(location,v)};if(type==gl.FLOAT_VEC2)return function(v){gl.uniform2fv(location,v)};if(type==gl.FLOAT_VEC3)return function(v){gl.uniform3fv(location,v)};if(type==gl.FLOAT_VEC4)return function(v){gl.uniform4fv(location,v)};if(type==gl.INT&&isArray)return function(v){gl.uniform1iv(location,v)};if(type==gl.INT)return function(v){gl.uniform1i(location,v)};if(type==gl.INT_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.INT_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.INT_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.BOOL)return function(v){gl.uniform1iv(location,v)};if(type==gl.BOOL_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.BOOL_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.BOOL_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.FLOAT_MAT2)return function(v){gl.uniformMatrix2fv(location,false,v)};if(type==gl.FLOAT_MAT3)return function(v){gl.uniformMatrix3fv(location,false,v)};if(type==gl.FLOAT_MAT4)return function(v){gl.uniformMatrix4fv(location,false,v)};if((type==gl.SAMPLER_2D||type==gl.SAMPLER_CUBE)&&isArray){var units=[];for(var ii=0;ii=0){numComponents=2}else if(name.indexOf("color")>=0){numComponents=4}else{numComponents=3}if(length%numComponents>0){throw"can not guess numComponents. You should specify it."}return numComponents}function makeTypedArray(array,name){if(isArrayBuffer(array)){return array}if(Array.isArray(array)){array={data:array}}var type=array.type;if(!type){if(name==="indices"){type=Uint16Array}else{type=Float32Array}}return new type(array.data)}function createAttribsFromArrays(gl,arrays,opt_mapping){var mapping=opt_mapping||createMapping(arrays);var attribs={};Object.keys(mapping).forEach(function(attribName){var bufferName=mapping[attribName];var array=makeTypedArray(arrays[bufferName],bufferName);attribs[attribName]={buffer:createBufferFromTypedArray(gl,array),numComponents:array.numComponents||guessNumComponentsFromName(bufferName),type:getGLTypeForTypedArray(gl,array),normalize:getNormalizationForTypedArray(array)}});return attribs}var positionKeys=["position","positions","a_position"];function getNumElementsFromNonIndexedArrays(arrays){var key;for(var ii=0;ii0){throw"numComponents "+numComponent+" not correct for length "+length}return numElements}function createBufferInfoFromArrays(gl,arrays,opt_mapping){var bufferInfo={attribs:createAttribsFromArrays(gl,arrays,opt_mapping)};var indices=arrays.indices;if(indices){indices=makeTypedArray(indices,"indices");bufferInfo.indices=createBufferFromTypedArray(gl,indices,gl.ELEMENT_ARRAY_BUFFER);bufferInfo.numElements=indices.length}else{bufferInfo.numElements=getNumElementsFromNonIndexedArrays(arrays)}return bufferInfo}function createBuffersFromArrays(gl,arrays){var buffers={};Object.keys(arrays).forEach(function(key){var type=key=="indices"?gl.ELEMENT_ARRAY_BUFFER:gl.ARRAY_BUFFER;var array=makeTypedArray(arrays[key],name);buffers[key]=createBufferFromTypedArray(gl,array,type)});return buffers}function drawBufferInfo(gl,type,bufferInfo,count,offset){var indices=bufferInfo.indices;var numElements=count===undefined?bufferInfo.numElements:count;offset=offset===undefined?offset:0;if(indices){gl.drawElements(type,numElements,gl.UNSIGNED_SHORT,offset)}else{gl.drawArrays(type,offset,numElements)}}function drawObjectList(objectsToDraw){var lastUsedProgramInfo=null;var lastUsedBufferInfo=null;objectsToDraw.forEach(function(object){var programInfo=object.programInfo;var bufferInfo=object.bufferInfo;if(programInfo!==lastUsedProgramInfo){lastUsedProgramInfo=programInfo;gl.useProgram(programInfo.program)}if(bufferInfo!=lastUsedBufferInfo){lastUsedBufferInfo=bufferInfo;setBuffersAndAttributes(gl,programInfo,bufferInfo)}setUniforms(programInfo,object.uniforms);drawBufferInfo(gl,gl.TRIANGLES,bufferInfo)})}return{createAugmentedTypedArray:createAugmentedTypedArray,createAttribsFromArrays:createAttribsFromArrays,createBuffersFromArrays:createBuffersFromArrays,createBufferInfoFromArrays:createBufferInfoFromArrays,createAttributeSetters:createAttributeSetters,createProgram:createProgram,createProgramFromScripts:createProgramFromScripts,createProgramFromSources:createProgramFromSources,createProgramInfo:createProgramInfo,createUniformSetters:createUniformSetters,drawBufferInfo:drawBufferInfo,drawObjectList:drawObjectList,getWebGLContext:getWebGLContext,resizeCanvasToDisplaySize:resizeCanvasToDisplaySize,setAttributes:setAttributes,setBuffersAndAttributes:setBuffersAndAttributes,setUniforms:setUniforms}});
\ No newline at end of file
diff --git a/dist/twgl.min.js b/dist/twgl.min.js
index 9fc727d..eb4f198 100644
--- a/dist/twgl.min.js
+++ b/dist/twgl.min.js
@@ -27,4 +27,4 @@
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/!function(root,factory){if("function"==typeof define&&define.amd)define([],factory);else{var lib=factory.call(root);root.twgl=root.twgl||{},Object.keys(lib).forEach(function(key){root.twgl[key]=lib[key]})}}(this,function(){"use strict";function getWebGLContext(canvas,opt_attribs){var gl=create3DContext(canvas,opt_attribs);return gl}function loadShader(gl,shaderSource,shaderType,opt_errorCallback){var errFn=opt_errorCallback||error,shader=gl.createShader(shaderType);gl.shaderSource(shader,shaderSource),gl.compileShader(shader);var compiled=gl.getShaderParameter(shader,gl.COMPILE_STATUS);if(!compiled){var lastError=gl.getShaderInfoLog(shader);return errFn("*** Error compiling shader '"+shader+"':"+lastError),gl.deleteShader(shader),null}return shader}function createProgram(gl,shaders,opt_attribs,opt_locations,opt_errorCallback){var errFn=opt_errorCallback||error,program=gl.createProgram();shaders.forEach(function(shader){gl.attachShader(program,shader)}),opt_attribs&&opt_attribs.forEach(function(attrib,ndx){gl.bindAttribLocation(program,opt_locations?opt_locations[ndx]:ndx,attrib)}),gl.linkProgram(program);var linked=gl.getProgramParameter(program,gl.LINK_STATUS);if(!linked){var lastError=gl.getProgramInfoLog(program);return errFn("Error in program linking:"+lastError),gl.deleteProgram(program),null}return program}function createShaderFromScript(gl,scriptId,opt_shaderType,opt_errorCallback){var shaderType,shaderSource="",shaderScript=document.getElementById(scriptId);if(!shaderScript)throw"*** Error: unknown script element"+scriptId;if(shaderSource=shaderScript.text,!opt_shaderType)if("x-shader/x-vertex"==shaderScript.type)shaderType=gl.VERTEX_SHADER;else if("x-shader/x-fragment"==shaderScript.type)shaderType=gl.FRAGMENT_SHADER;else if(shaderType!=gl.VERTEX_SHADER&&shaderType!=gl.FRAGMENT_SHADER)throw"*** Error: unknown shader type";return loadShader(gl,shaderSource,opt_shaderType?opt_shaderType:shaderType,opt_errorCallback)}function createProgramFromScripts(gl,shaderScriptIds,opt_attribs,opt_locations,opt_errorCallback){for(var shaders=[],ii=0;ii1&&"[0]"==uniformInfo.name.substr(-3);if(type==gl.FLOAT&&isArray)return function(v){gl.uniform1fv(location,v)};if(type==gl.FLOAT)return function(v){gl.uniform1f(location,v)};if(type==gl.FLOAT_VEC2)return function(v){gl.uniform2fv(location,v)};if(type==gl.FLOAT_VEC3)return function(v){gl.uniform3fv(location,v)};if(type==gl.FLOAT_VEC4)return function(v){gl.uniform4fv(location,v)};if(type==gl.INT&&isArray)return function(v){gl.uniform1iv(location,v)};if(type==gl.INT)return function(v){gl.uniform1i(location,v)};if(type==gl.INT_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.INT_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.INT_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.BOOL)return function(v){gl.uniform1iv(location,v)};if(type==gl.BOOL_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.BOOL_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.BOOL_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.FLOAT_MAT2)return function(v){gl.uniformMatrix2fv(location,!1,v)};if(type==gl.FLOAT_MAT3)return function(v){gl.uniformMatrix3fv(location,!1,v)};if(type==gl.FLOAT_MAT4)return function(v){gl.uniformMatrix4fv(location,!1,v)};if((type==gl.SAMPLER_2D||type==gl.SAMPLER_CUBE)&&isArray){for(var units=[],ii=0;iiii;++ii){var uniformInfo=gl.getActiveUniform(program,ii);if(!uniformInfo)break;var name=uniformInfo.name;"[0]"==name.substr(-3)&&(name=name.substr(0,name.length-3));var setter=createUniformSetter(program,uniformInfo);uniformSetters[name]=setter}return uniformSetters}function setUniforms(setters,values){setters=setters.uniformSetters||setters,Object.keys(values).forEach(function(name){var setter=setters[name];setter&&setter(values[name])})}function createAttributeSetters(gl,program){function createAttribSetter(index){return function(b){gl.bindBuffer(gl.ARRAY_BUFFER,b.buffer),gl.enableVertexAttribArray(index),gl.vertexAttribPointer(index,b.numComponents||b.size,b.type||gl.FLOAT,b.normalize||!1,b.stride||0,b.offset||0)}}for(var attribSetters={},numAttribs=gl.getProgramParameter(program,gl.ACTIVE_ATTRIBUTES),ii=0;numAttribs>ii;++ii){var attribInfo=gl.getActiveAttrib(program,ii);if(!attribInfo)break;var index=gl.getAttribLocation(program,attribInfo.name);attribSetters[attribInfo.name]=createAttribSetter(index)}return attribSetters}function setAttributes(setters,buffers){Object.keys(buffers).forEach(function(name){var setter=setters[name];setter&&setter(buffers[name])})}function setBuffersAndAttributes(gl,programInfo,buffers){setAttributes(programInfo.attribSetters||programInfo,buffers.attribs),buffers.indices&&gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,buffers.indices)}function resizeCanvasToDisplaySize(canvas,multiplier){multiplier=multiplier||1,multiplier=Math.max(1,multiplier);var width=canvas.clientWidth*multiplier|0,height=canvas.clientHeight*multiplier|0;return canvas.width!=width||canvas.height!=height?(canvas.width=width,canvas.height=height,!0):!1}function augmentTypedArray(typedArray,numComponents){var cursor=0;return typedArray.push=function(){for(var ii=0;ii=0?2:name.indexOf("color")>=0?4:3,length%numComponents>0)throw"can not guess numComponents. You should specify it.";return numComponents}function makeTypedArray(array,name){if(isArrayBuffer(array))return array;Array.isArray(array)&&(array={data:array}),array.numComponents||(array.numComponents=guessNumComponentsFromName(name,array.length));var type=array.type;type||"indices"===name&&(type=Uint16Array);var numElements=array.data.length/array.numComponents;numElements%1&&console.warn("numComponents = ",array.numComponents,"doesn't match length = ",array.length,"of data given");var typedArray=createAugmentedTypedArray(array.numComponents,numElements,type);return typedArray.push(array.data),typedArray}function createAttribsFromArrays(gl,arrays,opt_mapping){var mapping=opt_mapping||createMapping(arrays),attribs={};return Object.keys(mapping).forEach(function(attribName){var bufferName=mapping[attribName],array=makeTypedArray(arrays[bufferName],bufferName);attribs[attribName]={buffer:createBufferFromTypedArray(gl,array),numComponents:array.numComponents||guessNumComponentsFromName(bufferName),type:getGLTypeForTypedArray(gl,array),normalize:getNormalizationForTypedArray(array)}}),attribs}function getNumElementsFromNonIndexedArrays(arrays){var key=Object.keys(arrays)[0],array=arrays[key];return isArrayBuffer(array)?array.numElements:array.data.length/array.numComponents}function createBufferInfoFromArrays(gl,arrays,opt_mapping){var bufferInfo={attribs:createAttribsFromArrays(gl,arrays,opt_mapping)},indices=arrays.indices;return indices?(indices=makeTypedArray(indices,"indices"),bufferInfo.indices=createBufferFromTypedArray(gl,indices,gl.ELEMENT_ARRAY_BUFFER),bufferInfo.numElements=indices.length):bufferInfo.numElements=getNumElementsFromNonIndexedArrays(arrays),bufferInfo}function createBuffersFromArrays(gl,arrays){var buffers={};return Object.keys(arrays).forEach(function(key){var type="indices"==key?gl.ELEMENT_ARRAY_BUFFER:gl.ARRAY_BUFFER,array=makeTypedArray(arrays[key],name);buffers[key]=createBufferFromTypedArray(gl,array,type)}),buffers}function drawBufferInfo(gl,type,bufferInfo,count,offset){var indices=bufferInfo.indices,numElements=void 0===count?bufferInfo.numElements:count;offset=void 0===offset?offset:0,indices?gl.drawElements(type,numElements,gl.UNSIGNED_SHORT,offset):gl.drawArrays(type,offset,numElements)}function drawObjectList(objectsToDraw){var lastUsedProgramInfo=null,lastUsedBufferInfo=null;objectsToDraw.forEach(function(object){var programInfo=object.programInfo,bufferInfo=object.bufferInfo;programInfo!==lastUsedProgramInfo&&(lastUsedProgramInfo=programInfo,gl.useProgram(programInfo.program)),bufferInfo!=lastUsedBufferInfo&&(lastUsedBufferInfo=bufferInfo,setBuffersAndAttributes(gl,programInfo,bufferInfo)),setUniforms(programInfo,object.uniforms),drawBufferInfo(gl,gl.TRIANGLES,bufferInfo)})}var error=this.console&&this.console.error?this.console.error.bind(this.console):function(){},create3DContext=function(canvas,opt_attribs){for(var names=["webgl","experimental-webgl"],context=null,ii=0;ii1&&"[0]"==uniformInfo.name.substr(-3);if(type==gl.FLOAT&&isArray)return function(v){gl.uniform1fv(location,v)};if(type==gl.FLOAT)return function(v){gl.uniform1f(location,v)};if(type==gl.FLOAT_VEC2)return function(v){gl.uniform2fv(location,v)};if(type==gl.FLOAT_VEC3)return function(v){gl.uniform3fv(location,v)};if(type==gl.FLOAT_VEC4)return function(v){gl.uniform4fv(location,v)};if(type==gl.INT&&isArray)return function(v){gl.uniform1iv(location,v)};if(type==gl.INT)return function(v){gl.uniform1i(location,v)};if(type==gl.INT_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.INT_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.INT_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.BOOL)return function(v){gl.uniform1iv(location,v)};if(type==gl.BOOL_VEC2)return function(v){gl.uniform2iv(location,v)};if(type==gl.BOOL_VEC3)return function(v){gl.uniform3iv(location,v)};if(type==gl.BOOL_VEC4)return function(v){gl.uniform4iv(location,v)};if(type==gl.FLOAT_MAT2)return function(v){gl.uniformMatrix2fv(location,!1,v)};if(type==gl.FLOAT_MAT3)return function(v){gl.uniformMatrix3fv(location,!1,v)};if(type==gl.FLOAT_MAT4)return function(v){gl.uniformMatrix4fv(location,!1,v)};if((type==gl.SAMPLER_2D||type==gl.SAMPLER_CUBE)&&isArray){for(var units=[],ii=0;iiii;++ii){var uniformInfo=gl.getActiveUniform(program,ii);if(!uniformInfo)break;var name=uniformInfo.name;"[0]"==name.substr(-3)&&(name=name.substr(0,name.length-3));var setter=createUniformSetter(program,uniformInfo);uniformSetters[name]=setter}return uniformSetters}function setUniforms(setters,values){setters=setters.uniformSetters||setters,Object.keys(values).forEach(function(name){var setter=setters[name];setter&&setter(values[name])})}function createAttributeSetters(gl,program){function createAttribSetter(index){return function(b){gl.bindBuffer(gl.ARRAY_BUFFER,b.buffer),gl.enableVertexAttribArray(index),gl.vertexAttribPointer(index,b.numComponents||b.size,b.type||gl.FLOAT,b.normalize||!1,b.stride||0,b.offset||0)}}for(var attribSetters={},numAttribs=gl.getProgramParameter(program,gl.ACTIVE_ATTRIBUTES),ii=0;numAttribs>ii;++ii){var attribInfo=gl.getActiveAttrib(program,ii);if(!attribInfo)break;var index=gl.getAttribLocation(program,attribInfo.name);attribSetters[attribInfo.name]=createAttribSetter(index)}return attribSetters}function setAttributes(setters,buffers){Object.keys(buffers).forEach(function(name){var setter=setters[name];setter&&setter(buffers[name])})}function setBuffersAndAttributes(gl,programInfo,buffers){setAttributes(programInfo.attribSetters||programInfo,buffers.attribs),buffers.indices&&gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,buffers.indices)}function resizeCanvasToDisplaySize(canvas,multiplier){multiplier=multiplier||1,multiplier=Math.max(1,multiplier);var width=canvas.clientWidth*multiplier|0,height=canvas.clientHeight*multiplier|0;return canvas.width!=width||canvas.height!=height?(canvas.width=width,canvas.height=height,!0):!1}function augmentTypedArray(typedArray){var cursor=0;return typedArray.push=function(){for(var ii=0;ii=0?2:name.indexOf("color")>=0?4:3,length%numComponents>0)throw"can not guess numComponents. You should specify it.";return numComponents}function makeTypedArray(array,name){if(isArrayBuffer(array))return array;Array.isArray(array)&&(array={data:array});var type=array.type;return type||(type="indices"===name?Uint16Array:Float32Array),new type(array.data)}function createAttribsFromArrays(gl,arrays,opt_mapping){var mapping=opt_mapping||createMapping(arrays),attribs={};return Object.keys(mapping).forEach(function(attribName){var bufferName=mapping[attribName],array=makeTypedArray(arrays[bufferName],bufferName);attribs[attribName]={buffer:createBufferFromTypedArray(gl,array),numComponents:array.numComponents||guessNumComponentsFromName(bufferName),type:getGLTypeForTypedArray(gl,array),normalize:getNormalizationForTypedArray(array)}}),attribs}function getNumElementsFromNonIndexedArrays(arrays){for(var key,ii=0;ii0)throw"numComponents "+numComponent+" not correct for length "+length;return numElements}function createBufferInfoFromArrays(gl,arrays,opt_mapping){var bufferInfo={attribs:createAttribsFromArrays(gl,arrays,opt_mapping)},indices=arrays.indices;return indices?(indices=makeTypedArray(indices,"indices"),bufferInfo.indices=createBufferFromTypedArray(gl,indices,gl.ELEMENT_ARRAY_BUFFER),bufferInfo.numElements=indices.length):bufferInfo.numElements=getNumElementsFromNonIndexedArrays(arrays),bufferInfo}function createBuffersFromArrays(gl,arrays){var buffers={};return Object.keys(arrays).forEach(function(key){var type="indices"==key?gl.ELEMENT_ARRAY_BUFFER:gl.ARRAY_BUFFER,array=makeTypedArray(arrays[key],name);buffers[key]=createBufferFromTypedArray(gl,array,type)}),buffers}function drawBufferInfo(gl,type,bufferInfo,count,offset){var indices=bufferInfo.indices,numElements=void 0===count?bufferInfo.numElements:count;offset=void 0===offset?offset:0,indices?gl.drawElements(type,numElements,gl.UNSIGNED_SHORT,offset):gl.drawArrays(type,offset,numElements)}function drawObjectList(objectsToDraw){var lastUsedProgramInfo=null,lastUsedBufferInfo=null;objectsToDraw.forEach(function(object){var programInfo=object.programInfo,bufferInfo=object.bufferInfo;programInfo!==lastUsedProgramInfo&&(lastUsedProgramInfo=programInfo,gl.useProgram(programInfo.program)),bufferInfo!=lastUsedBufferInfo&&(lastUsedBufferInfo=bufferInfo,setBuffersAndAttributes(gl,programInfo,bufferInfo)),setUniforms(programInfo,object.uniforms),drawBufferInfo(gl,gl.TRIANGLES,bufferInfo)})}var error=this.console&&this.console.error?this.console.error.bind(this.console):function(){},create3DContext=function(canvas,opt_attribs){for(var names=["webgl","experimental-webgl"],context=null,ii=0;ii
Documentation generated by JSDoc 3.2.2
- on Mon Mar 30th 2015 using the DocStrap template.
diff --git a/docs/index.html b/docs/index.html
index 25d5e84..1a02eed 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -273,7 +273,7 @@ to make common WebGL operations easier and less verbose.
Documentation generated by JSDoc 3.2.2
- on Mon Mar 30th 2015 using the DocStrap template.
diff --git a/docs/m4.html b/docs/m4.html
index bca57fa..7bfb125 100644
--- a/docs/m4.html
+++ b/docs/m4.html
@@ -6004,7 +6004,7 @@ returns the result as a vector with 3 entries.
Documentation generated by JSDoc 3.2.2
- on Mon Mar 30th 2015 using the DocStrap template.
diff --git a/docs/module-twgl.html b/docs/module-twgl.html
index 5e4b23a..6a2301a 100644
--- a/docs/module-twgl.html
+++ b/docs/module-twgl.html
@@ -500,6 +500,155 @@ program. You can pass this to
+
+
+
+
+ <static> createAugmentedTypedArray(opt_type) → {ArrayBuffer}
+
+
+
+
+
+
+
+
creates a typed array with a push function attached
+so that you can easily push values.
+
push can take multiple arguments. If an argument is an array each element
+of the array will be added to the typed array.
+
Example:
+
var array = createAugmentedTypedArray(3, 2); // creates a Float32Array with 6 values
+array.push(1, 2, 3);
+array.push([4, 5, 6]);
+// array now contains [1, 2, 3, 4, 5, 6]
+
//FIXME * Also has numComponents and numElements properties.
+
//FIXME @param {number} numComponents number of components
+//FIXME @param {number} numElements number of elements. The total size of the array will be numComponents * numElements.
+
+
+
+
+
+
+
+
+ Parameters:
+
+
+
+
+
+
+ | Name |
+
+
+ Type |
+
+
+
+
+
+ Description |
+
+
+
+
+
+
+
+
+ opt_type |
+
+
+
+
+
+constructor
+
+
+
+ |
+
+
+
+
+
+ A constructor for the type. Default = Float32Array. |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns:
+
+
+
+
+
+
+
+ -
+ Type
+
+ -
+
+ArrayBuffer
+
+
+
+
+
+
+
+
+
@@ -4619,7 +4768,7 @@ setUniforms(programInfo, moreUniforms);
Documentation generated by JSDoc 3.2.2
- on Mon Mar 30th 2015 using the DocStrap template.
diff --git a/docs/modules.list.html b/docs/modules.list.html
index 808f95d..fe71baf 100644
--- a/docs/modules.list.html
+++ b/docs/modules.list.html
@@ -150,7 +150,7 @@
Documentation generated by JSDoc 3.2.2
- on Mon Mar 30th 2015 using the DocStrap template.
diff --git a/docs/primitives.html b/docs/primitives.html
index b3d28b1..b8c8d00 100644
--- a/docs/primitives.html
+++ b/docs/primitives.html
@@ -2808,7 +2808,7 @@ names that contains 'pos' could be reoriented as positions,
Documentation generated by JSDoc 3.2.2
- on Mon Mar 30th 2015 using the DocStrap template.
diff --git a/docs/v3.html b/docs/v3.html
index 40851fb..6ff576f 100644
--- a/docs/v3.html
+++ b/docs/v3.html
@@ -2889,7 +2889,7 @@ b have the same length.
Documentation generated by JSDoc 3.2.2
- on Mon Mar 30th 2015 using the DocStrap template.
diff --git a/examples/primitives.html b/examples/primitives.html
new file mode 100644
index 0000000..94023c6
--- /dev/null
+++ b/examples/primitives.html
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/twgl-cube.html b/examples/twgl-cube.html
index c7c8786..6369040 100644
--- a/examples/twgl-cube.html
+++ b/examples/twgl-cube.html
@@ -96,7 +96,13 @@ void main() {
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255,255,255,255]));
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([
+ 255,255,255,255,
+ 192,192,192,255,
+ 192,192,192,255,
+ 255,255,255,255]));
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
var uniforms = {
u_lightWorldPos: [1, 8, -10],
diff --git a/examples/webgl-cube.html b/examples/webgl-cube.html
index e87d404..25600fd 100644
--- a/examples/webgl-cube.html
+++ b/examples/webgl-cube.html
@@ -123,7 +123,13 @@ void main() {
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255,255,255,255]));
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([
+ 255,255,255,255,
+ 192,192,192,255,
+ 192,192,192,255,
+ 255,255,255,255]));
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
function render() {
twgl.resizeCanvasToDisplaySize(gl.canvas);
diff --git a/src/primitives.js b/src/primitives.js
index e60dbde..4d6c2b8 100644
--- a/src/primitives.js
+++ b/src/primitives.js
@@ -43,12 +43,72 @@
root.twgl = root.twgl || {};
root.twgl.primitives = factory.call(root);
}
-}(this, function (webglUtils, m4) {
+}(this, function (twgl, m4) {
"use strict";
- webglUtils = webglUtils || this.twgl;
- m4 = m4 || this;
+ twgl = twgl || this.twgl;
+ m4 = m4 || twgl.m4;
+
+ /**
+ * Add `push` to a typed array. It just keeps a 'cursor'
+ * and allows use to `push` values into the array so we
+ * don't have to manually compute offsets
+ * @param {TypedArray} typedArray TypedArray to augment
+ * @param {number} numComponents number of components.
+ */
+ function augmentTypedArray(typedArray, numComponents) {
+ var cursor = 0;
+ typedArray.push = function() {
+ for (var ii = 0; ii < arguments.length; ++ii) {
+ var value = arguments[ii];
+ if (value instanceof Array || (value.buffer && value.buffer instanceof ArrayBuffer)) {
+ for (var jj = 0; jj < value.length; ++jj) {
+ typedArray[cursor++] = value[jj];
+ }
+ } else {
+ typedArray[cursor++] = value;
+ }
+ }
+ };
+ typedArray.reset = function(opt_index) {
+ cursor = opt_index || 0;
+ };
+ typedArray.numComponents = numComponents;
+ Object.defineProperty(typedArray, 'numElements', {
+ get: function() {
+ return this.length / this.numComponents | 0;
+ },
+ });
+ return typedArray;
+ };
+
+ /**
+ * creates a typed array with a `push` function attached
+ * so that you can easily *push* values.
+ *
+ * `push` can take multiple arguments. If an argument is an array each element
+ * of the array will be added to the typed array.
+ *
+ * Example:
+ *
+ * var array = createAugmentedTypedArray(3, 2); // creates a Float32Array with 6 values
+ * array.push(1, 2, 3);
+ * array.push([4, 5, 6]);
+ * // array now contains [1, 2, 3, 4, 5, 6]
+ *
+ * Also has `numComponents` and `numElements` properties.
+ *
+ * @param {number} numComponents number of components
+ * @param {number} numElements number of elements. The total size of the array will be `numComponents * numElements`.
+ * @param {constructor} opt_type A constructor for the type. Default = `Float32Array`.
+ * @return {ArrayBuffer} A typed array.
+ * @memberOf module:twgl
+ */
+ function createAugmentedTypedArray(numComponents, numElements, opt_type) {
+ var type = opt_type || Float32Array;
+ return augmentTypedArray(new type(numComponents * numElements), numComponents);
+ };
/**
* Creates XZ plane vertices.
@@ -76,9 +136,9 @@
matrix = matrix || m4.identity();
var numVertices = (subdivisionsWidth + 1) * (subdivisionsDepth + 1);
- var positions = webglUtils.createAugmentedTypedArray(3, numVertices);
- var normals = webglUtils.createAugmentedTypedArray(3, numVertices);
- var texcoords = webglUtils.createAugmentedTypedArray(2, numVertices);
+ var positions = createAugmentedTypedArray(3, numVertices);
+ var normals = createAugmentedTypedArray(3, numVertices);
+ var texcoords = createAugmentedTypedArray(2, numVertices);
for (var z = 0; z <= subdivisionsDepth; z++) {
for (var x = 0; x <= subdivisionsWidth; x++) {
@@ -94,7 +154,7 @@
}
var numVertsAcross = subdivisionsWidth + 1;
- var indices = webglUtils.createAugmentedTypedArray(
+ var indices = createAugmentedTypedArray(
3, subdivisionsWidth * subdivisionsDepth * 2, Uint16Array);
for (var z = 0; z < subdivisionsDepth; z++) {
@@ -165,9 +225,9 @@
// spherical coordinates and generating 2 triangles for each quad on a
// ring of the sphere.
var numVertices = (subdivisionsAxis + 1) * (subdivisionsHeight + 1);
- var positions = webglUtils.createAugmentedTypedArray(3, numVertices);
- var normals = webglUtils.createAugmentedTypedArray(3, numVertices);
- var texCoords = webglUtils.createAugmentedTypedArray(2 , numVertices);
+ var positions = createAugmentedTypedArray(3, numVertices);
+ var normals = createAugmentedTypedArray(3, numVertices);
+ var texCoords = createAugmentedTypedArray(2 , numVertices);
// Generate the individual vertices in our vertex buffer.
for (var y = 0; y <= subdivisionsHeight; y++) {
@@ -191,7 +251,7 @@
}
var numVertsAround = subdivisionsAxis + 1;
- var indices = webglUtils.createAugmentedTypedArray(3, subdivisionsAxis * subdivisionsHeight * 2, Uint16Array);
+ var indices = createAugmentedTypedArray(3, subdivisionsAxis * subdivisionsHeight * 2, Uint16Array);
for (var x = 0; x < subdivisionsAxis; x++) {
for (var y = 0; y < subdivisionsHeight; y++) {
// Make triangle 1 of quad.
@@ -269,10 +329,10 @@
];
var numVertices = 6 * 4;
- var positions = webglUtils.createAugmentedTypedArray(3, numVertices);
- var normals = webglUtils.createAugmentedTypedArray(3, numVertices);
- var texCoords = webglUtils.createAugmentedTypedArray(2 , numVertices);
- var indices = webglUtils.createAugmentedTypedArray(3, 6 * 2, Uint16Array);
+ var positions = createAugmentedTypedArray(3, numVertices);
+ var normals = createAugmentedTypedArray(3, numVertices);
+ var texCoords = createAugmentedTypedArray(2 , numVertices);
+ var indices = createAugmentedTypedArray(3, 6 * 2, Uint16Array);
for (var f = 0; f < 6; ++f) {
var faceIndices = CUBE_FACE_INDICES[f];
@@ -346,10 +406,10 @@
var extra = (topCap ? 2 : 0) + (bottomCap ? 2 : 0);
var numVertices = (radialSubdivisions + 1) * (verticalSubdivisions + 1 + extra);
- var positions = webglUtils.createAugmentedTypedArray(3, numVertices);
- var normals = webglUtils.createAugmentedTypedArray(3, numVertices);
- var texCoords = webglUtils.createAugmentedTypedArray(2, numVertices);
- var indices = webglUtils.createAugmentedTypedArray(3, radialSubdivisions * (verticalSubdivisions + extra) * 2, Uint16Array);
+ var positions = createAugmentedTypedArray(3, numVertices);
+ var normals = createAugmentedTypedArray(3, numVertices);
+ var texCoords = createAugmentedTypedArray(2, numVertices);
+ var indices = createAugmentedTypedArray(3, radialSubdivisions * (verticalSubdivisions + extra) * 2, Uint16Array);
var vertsAroundEdge = radialSubdivisions + 1;
@@ -791,11 +851,11 @@
var numVerts = positions.length / 3;
var arrays = {
- position: webglUtils.createAugmentedTypedArray(3, numVerts),
- texcoord: webglUtils.createAugmentedTypedArray(2, numVerts),
- normal: webglUtils.createAugmentedTypedArray(3, numVerts),
- color: webglUtils.createAugmentedTypedArray(4, numVerts, Uint8Array),
- indices: webglUtils.createAugmentedTypedArray(3, numVerts / 3, Uint16Array),
+ position: createAugmentedTypedArray(3, numVerts),
+ texcoord: createAugmentedTypedArray(2, numVerts),
+ normal: createAugmentedTypedArray(3, numVerts),
+ color: createAugmentedTypedArray(4, numVerts, Uint8Array),
+ indices: createAugmentedTypedArray(3, numVerts / 3, Uint16Array),
};
arrays.position.push(positions);
@@ -828,7 +888,7 @@
function expandToUnindexed(channel) {
var srcBuffer = vertices[channel];
var numComponents = srcBuffer.numComponents;
- var dstBuffer = webglUtils.createAugmentedTypedArray(numComponents, numElements, srcBuffer.constructor);
+ var dstBuffer = createAugmentedTypedArray(numComponents, numElements, srcBuffer.constructor);
for (var ii = 0; ii < numElements; ++ii) {
var ndx = indices[ii];
var offset = ndx * numComponents;
@@ -1024,7 +1084,7 @@
function makeRandomVertexColors(vertices, options) {
options = options || {};
var numElements = vertices.position.numElements;
- var vcolors = webglUtils.createAugmentedTypedArray(4, numElements, Uint8Array);
+ var vcolors = createAugmentedTypedArray(4, numElements, Uint8Array);
var rand = options.rand || function(ndx, channel) {
return channel < 3 ? randInt(256) : 255;
};
@@ -1055,7 +1115,7 @@
function createBufferFunc(fn) {
return function(gl) {
var arrays = fn.apply(this, Array.prototype.slice.call(arguments, 1));
- return webglUtils.createBuffersFromArrays(gl, arrays);
+ return twgl.createBuffersFromArrays(gl, arrays);
}
};
@@ -1066,7 +1126,7 @@
function createBufferInfoFunc(fn) {
return function(gl) {
var arrays = fn.apply(null, Array.prototype.slice.call(arguments, 1));
- return webglUtils.createBufferInfoFromArrays(gl, arrays);
+ return twgl.createBufferInfoFromArrays(gl, arrays);
};
};
@@ -1074,6 +1134,7 @@
create3DFBufferInfo: createBufferInfoFunc(create3DFVertices),
create3DFBuffer: createBufferFunc(create3DFVertices),
create3DFVertices: create3DFVertices,
+ createAugmentedTypedArray: createAugmentedTypedArray,
createCubeBufferInfo: createBufferInfoFunc(createCubeVertices),
createCubeBuffers: createBufferFunc(createCubeVertices),
createCubeVertices: createCubeVertices,
@@ -1083,7 +1144,7 @@
createSphereBufferInfo: createBufferInfoFunc(createSphereVertices),
createSphereBuffers: createBufferFunc(createSphereVertices),
createSphereVertices: createSphereVertices,
- createTruncatedConeBufferInfo: createBufferFunc(createTruncatedConeVertices),
+ createTruncatedConeBufferInfo: createBufferInfoFunc(createTruncatedConeVertices),
createTruncatedConeBuffers: createBufferFunc(createTruncatedConeVertices),
createTruncatedConeVertices: createTruncatedConeVertices,
deindexVertices: deindexVertices,
diff --git a/src/twgl.js b/src/twgl.js
index 07c2b58..ad227ee 100644
--- a/src/twgl.js
+++ b/src/twgl.js
@@ -678,7 +678,7 @@
* and allows use to `push` values into the array so we
* don't have to manually compute offsets
* @param {TypedArray} typedArray TypedArray to augment
- * @param {number} numComponents number of components.
+FIXME * @param {number} numComponents number of components.
*/
function augmentTypedArray(typedArray, numComponents) {
var cursor = 0;
@@ -697,12 +697,12 @@
typedArray.reset = function(opt_index) {
cursor = opt_index || 0;
};
- typedArray.numComponents = numComponents;
- Object.defineProperty(typedArray, 'numElements', {
- get: function() {
- return this.length / this.numComponents | 0;
- },
- });
+// typedArray.numComponents = numComponents;
+// Object.defineProperty(typedArray, 'numElements', {
+// get: function() {
+// return this.length / this.numComponents | 0;
+// },
+// });
return typedArray;
};
@@ -720,17 +720,17 @@
* array.push([4, 5, 6]);
* // array now contains [1, 2, 3, 4, 5, 6]
*
- * Also has `numComponents` and `numElements` properties.
+//FIXME * Also has `numComponents` and `numElements` properties.
*
- * @param {number} numComponents number of components
- * @param {number} numElements number of elements. The total size of the array will be `numComponents * numElements`.
+//FIXME * @param {number} numComponents number of components
+//FIXME * @param {number} numElements number of elements. The total size of the array will be `numComponents * numElements`.
* @param {constructor} opt_type A constructor for the type. Default = `Float32Array`.
* @return {ArrayBuffer} A typed array.
* @memberOf module:twgl
*/
- function createAugmentedTypedArray(numComponents, numElements, opt_type) {
+ function createAugmentedTypedArray(size, opt_type) {
var type = opt_type || Float32Array;
- return augmentTypedArray(new type(numComponents * numElements), numComponents);
+ return augmentTypedArray(new type(size));
};
function createBufferFromTypedArray(gl, array, type, drawType) {
@@ -804,23 +804,25 @@
};
}
- if (!array.numComponents) {
- array.numComponents = guessNumComponentsFromName(name, array.length);
- }
+// if (!array.numComponents) {
+// array.numComponents = guessNumComponentsFromName(name, array.length);
+// }
var type = array.type;
if (!type) {
if (name === "indices") {
type = Uint16Array;
+ } else {
+ type = Float32Array;
}
}
- var numElements = array.data.length / array.numComponents;
- if (numElements % 1) {
- console.warn("numComponents = ", array.numComponents, "doesn't match length = ", array.length, "of data given");
- }
- var typedArray = createAugmentedTypedArray(array.numComponents, numElements, type);
- typedArray.push(array.data);
- return typedArray;
+// var numElements = array.data.length / array.numComponents;
+// if (numElements % 1) {
+// console.warn("numComponents = ", array.numComponents, "doesn't match length = ", array.length, "of data given");
+// }
+//FIXME var typedArray = createAugmentedTypedArray(array.length, type);
+//FIXME typedArray.push(array.data);
+ return new type(array.data);
};
/**
@@ -884,14 +886,26 @@
/**
* tries to get the number of elements from a set of arrays.
*/
+ var positionKeys = ['position', 'positions', 'a_position'];
+//FIXME
function getNumElementsFromNonIndexedArrays(arrays) {
- var key = Object.keys(arrays)[0];
- var array = arrays[key];
- if (isArrayBuffer(array)) {
- return array.numElements;
- } else {
- return array.data.length / array.numComponents;
+ var key;
+ for (var ii = 0; ii < positionKeys.length; ++ii) {
+ key = positionKeys[ii];
+ if (key in arrays) {
+ break;
+ }
}
+ if (ii == positionKeys.length) {
+ key = Object.keys(arrays)[0];
+ }
+ var length = array.length || array.data.length;
+ var numComponents = array.numComponents || guessNumComponentsFromName(key, length);
+ var numElements = length / numComponents;
+ if (length % numComponents > 0) {
+ throw "numComponents " + numComponent + " not correct for length " + length;
+ }
+ return numElements;
};
/**