2 lines
6.0 KiB
JavaScript
2 lines
6.0 KiB
JavaScript
!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):t.Trackball=i()}(this,function(){"use strict";var t=1e-6,i="undefined"!=typeof Float32Array?Float32Array:Array;Math.PI;function e(){var t=new i(16);return i!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t}function n(i,e,n){var r,s,a,o=n[0],h=n[1],c=n[2],u=Math.sqrt(o*o+h*h+c*c);return u<t?null:(o*=u=1/u,h*=u,c*=u,r=Math.sin(e),a=1-(s=Math.cos(e)),i[0]=o*o*a+s,i[1]=h*o*a+c*r,i[2]=c*o*a-h*r,i[3]=0,i[4]=o*h*a-c*r,i[5]=h*h*a+s,i[6]=c*h*a+o*r,i[7]=0,i[8]=o*c*a+h*r,i[9]=h*c*a-o*r,i[10]=c*c*a+s,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i)}function r(){var t=new i(3);return i!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t}function s(t,e,n){var r=new i(3);return r[0]=t,r[1]=e,r[2]=n,r}function a(t,i,e){var n=i[0],r=i[1],s=i[2],a=e[0],o=e[1],h=e[2];return t[0]=r*h-s*o,t[1]=s*a-n*h,t[2]=n*o-r*a,t}var o,h=function(t){var i=t[0],e=t[1],n=t[2];return Math.sqrt(i*i+e*e+n*n)};o=r();!function(){var t,e=(t=new i(4),i!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0),t)}();function c(){var t=new i(4);return i!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t[3]=1,t}function u(i,e,n,r){var s=e[0],a=e[1],o=e[2],h=e[3],c=n[0],u=n[1],p=n[2],g=n[3],l=void 0,f=void 0,d=void 0,v=void 0,S=void 0;return(f=s*c+a*u+o*p+h*g)<0&&(f=-f,c=-c,u=-u,p=-p,g=-g),1-f>t?(l=Math.acos(f),d=Math.sin(l),v=Math.sin((1-r)*l)/d,S=Math.sin(r*l)/d):(v=1-r,S=r),i[0]=v*s+S*c,i[1]=v*a+S*u,i[2]=v*o+S*p,i[3]=v*h+S*g,i}var p,g,l,f,d,v,S,P=function(t,i){var e=i[0],n=i[1],r=i[2],s=i[3],a=e*e+n*n+r*r+s*s;return a>0&&(a=1/Math.sqrt(a),t[0]=e*a,t[1]=n*a,t[2]=r*a,t[3]=s*a),t};p=r(),g=s(1,0,0),l=s(0,1,0),f=c(),d=c(),v=new i(9),i!=Float32Array&&(v[1]=0,v[2]=0,v[3]=0,v[5]=0,v[6]=0,v[7]=0),v[0]=1,v[4]=1,v[8]=1,S=v;function y(){var t=new i(2);return i!=Float32Array&&(t[0]=0,t[1]=0),t}!function(){var t=y()}();var M=Object.freeze({homeTilt:.25,startSpin:.02,autoTick:!0,friction:.125}),m=Object.freeze({Resting:0,Coasting:1,DraggingInit:2,DraggingSpin:3,DraggingTilt:4}),b=Object.freeze({allowTilt:!0,allowSpin:!0,epsilon:3,radiansPerPixel:[.01,.01],clampTilt:Math.PI/2}),T=function(t,i){if(this.config={},Object.assign(this.config,b),Object.assign(this.config,M),Object.assign(this.config,i),this.config=Object.freeze(this.config),this.config.autoTick&&(this.tick=this.tick.bind(this),window.requestAnimationFrame(this.tick)),t){var e=this.handleEvent.bind(this);t.addEventListener("wheel",e),t.addEventListener("pointermove",e),t.addEventListener("pointerdown",e),t.addEventListener("pointerup",e)}this.startPosition=[0,0],this.currentPosition=[0,0],this.previousPosition=this.currentPosition.slice(),this.previous2Position=this.currentPosition.slice(),this.currentSpin=0,this.currentTilt=this.config.homeTilt,this.currentState=this.config.startSpin?m.Coasting:m.Resting,this.previousTime=null,this.inertiaSpeed=[this.config.startSpin,0],this.initialInertia=.125,this.idle=!1,Object.seal(this)};return T.prototype.handleEvent=function(t){if("touch"!==t.pointerType||t.isPrimary){var i=[t.clientX,t.clientY];"pointerdown"===t.type&&this.startDrag(i),"pointerup"===t.type&&this.endDrag(i),"pointermove"===t.type&&t.buttons&&this.updateDrag(i)}},T.prototype.tick=function(){this.config.autoTick&&window.requestAnimationFrame(this.tick);var i=Date.now(),e=this.currentState;null==this.previousTime&&(this.previousTime=i);var n=i-this.previousTime;this.previousTime=i;var r,s,a,o,h,c,u=e===m.DraggingSpin||e===m.DraggingInit;e===m.Coasting?(this.currentSpin+=this.inertiaSpeed[0]*n,this.currentTilt+=this.inertiaSpeed[1]*n,Math.abs(this.inertiaSpeed[0])<1e-4&&Math.abs(this.inertiaSpeed[1])<1e-4&&(this.currentState=m.Resting)):u&&(r=this.currentPosition,s=this.previous2Position,a=r[0],o=r[1],h=s[0],c=s[1],Math.abs(a-h)<=t*Math.max(1,Math.abs(a),Math.abs(h))&&Math.abs(o-c)<=t*Math.max(1,Math.abs(o),Math.abs(c)))&&(this.currentSpin+=this.inertiaSpeed[0]*n,this.currentTilt+=this.inertiaSpeed[1]*n),this.inertiaSpeed[0]*=1-this.config.friction,this.inertiaSpeed[1]*=1-this.config.friction,this.previous2Position=this.previousPosition.slice(),this.previousPosition=this.currentPosition.slice();this.idle=Math.abs(this.inertiaSpeed[0])<1e-4&&Math.abs(this.inertiaSpeed[1])<1e-4},T.prototype.startDrag=function(t){this.startPosition=t.slice(),this.currentPosition=t.slice(),this.currentState=m.DraggingInit},T.prototype.endDrag=function(t){var i;this.currentPosition=t.slice(),i=this.getAngles(),this.currentSpin=i[0],this.currentTilt=i[1],1===this.config.friction?this.currentState=m.Resting:this.currentState=m.Coasting},T.prototype.updateDrag=function(t){var i=this.getAngles(),e=i[0],n=i[1];this.currentPosition=t.slice();var r=this.getAngles(),s=r[0],a=r[1];this.inertiaSpeed[0]=this.initialInertia*(s-e),this.inertiaSpeed[1]=this.initialInertia*(a-n)},T.prototype.getMatrix=function(){var t,i,r,s,a,o,h,c,u,p,g,l,f,d,v,S,P,y,M,m,b,T,w,A=this.getAngles(),D=n(e(),A[0],[0,1,0]),x=n(e(),A[1],[1,0,0]);return t=x,r=D,s=(i=x)[0],a=i[1],o=i[2],h=i[3],c=i[4],u=i[5],p=i[6],g=i[7],l=i[8],f=i[9],d=i[10],v=i[11],S=i[12],P=i[13],y=i[14],M=i[15],m=r[0],b=r[1],T=r[2],w=r[3],t[0]=m*s+b*c+T*l+w*S,t[1]=m*a+b*u+T*f+w*P,t[2]=m*o+b*p+T*d+w*y,t[3]=m*h+b*g+T*v+w*M,m=r[4],b=r[5],T=r[6],w=r[7],t[4]=m*s+b*c+T*l+w*S,t[5]=m*a+b*u+T*f+w*P,t[6]=m*o+b*p+T*d+w*y,t[7]=m*h+b*g+T*v+w*M,m=r[8],b=r[9],T=r[10],w=r[11],t[8]=m*s+b*c+T*l+w*S,t[9]=m*a+b*u+T*f+w*P,t[10]=m*o+b*p+T*d+w*y,t[11]=m*h+b*g+T*v+w*M,m=r[12],b=r[13],T=r[14],w=r[15],t[12]=m*s+b*c+T*l+w*S,t[13]=m*a+b*u+T*f+w*P,t[14]=m*o+b*p+T*d+w*y,t[15]=m*h+b*g+T*v+w*M,t},T.prototype.isIdle=function(){return this.idle},T.prototype.getAngles=function(){var t,i,e,n=(t=y(),i=this.currentPosition,e=this.startPosition,t[0]=i[0]-e[0],t[1]=i[1]-e[1],t),r=this.config,s=this.currentSpin,a=this.currentTilt;return this.currentState===m.DraggingSpin?s+=r.radiansPerPixel[0]*n[0]:this.currentState===m.DraggingTilt?a+=r.radiansPerPixel[1]*n[1]:this.currentState===m.DraggingInit&&(s+=r.radiansPerPixel[0]*n[0],a+=r.radiansPerPixel[1]*n[1]),a=Math.min(a,r.clampTilt),[s,a=Math.max(a,-r.clampTilt)]},T});
|