-
Notifications
You must be signed in to change notification settings - Fork 33
/
Copy pathp5.easycam.min.js
1 lines (1 loc) · 15.9 KB
/
p5.easycam.min.js
1
"use strict";var Dw=function(t){const e={LIBRARY:"p5.EasyCam",VERSION:"1.2.3",AUTHOR:"p5.EasyCam authors",SOURCE:"https://github.com/freshfork/p5.EasyCam",toString:function(){return this.LIBRARY+" v"+this.VERSION+" by "+this.AUTHOR+" ("+this.SOURCE+")"}};class s{constructor(t,s){if(t instanceof p5.RendererGL){var n=t.elt.getBoundingClientRect();void 0===(s=s||{}).distance&&(s.distance=500),void 0===s.center&&(s.center=[0,0,0]),void 0===s.rotation&&(s.rotation=o.identity()),void 0===s.viewport&&(s.viewport=[0,0,t.width,t.height]),void 0===s.offset&&(s.offset=[n.x+window.scrollX,n.y+window.scrollY]),this.INFO=e,this.setCanvas(t);var r=this;this.cam=r,this.LOOK=[0,0,1],this.UP=[0,1,0],this.AXIS=new function(){this.YAW=1,this.PITCH=2,this.ROLL=4,this.ALL=this.YAW|this.PITCH|this.ROLL},this.SHIFT_CONSTRAINT=0,this.FIXED_CONSTRAINT=0,this.DRAG_CONSTRAINT=0,this.scale_rotation=.001,this.scale_pan=2e-4,this.scale_zoom=.001,this.scale_zoomwheel=20,this.distance_min_limit=.01,this.distance_min=1,this.distance_max=Number.MAX_VALUE,this.state={distance:s.distance,center:s.center.slice(),rotation:s.rotation.slice(),copy:function(t){return(t=t||{}).distance=this.distance,t.center=this.center.slice(),t.rotation=this.rotation.slice(),t}},this.state_reset=this.state.copy(),this.state_pushed=this.state.copy(),this.viewport=s.viewport.slice(),this.offset=s.offset.slice(),window.addEventListener("resize",(function(e){let s=t.elt.getBoundingClientRect();r.offset=[s.x+window.scrollX,s.y+window.scrollY]})),this.mouse={cam:r,curr:[0,0,0],prev:[0,0,0],dist:[0,0,0],mwheel:0,isPressed:!1,istouchdown:!1,ismousedown:!1,BUTTON:{LMB:1,MMB:2,RMB:4},button:0,mouseDragLeft:r.mouseDragRotate.bind(r),mouseDragCenter:r.mouseDragPan.bind(r),mouseDragRight:r.mouseDragZoom.bind(r),mouseWheelAction:r.mouseWheelZoom.bind(r),touchmoveSingle:r.mouseDragRotate.bind(r),touchmoveMulti:function(){r.mouseDragPan(),r.mouseDragZoom()},insideViewport:function(t,e){var s=r.viewport[0],i=s+r.viewport[2],a=r.viewport[1],o=a+r.viewport[3];return t>s&&t<i&&e>a&&e<o},solveConstraint:function(){var t=this.dist[0],e=this.dist[1];this.shiftKey&&!r.SHIFT_CONSTRAINT&&Math.abs(t-e)>1&&(r.SHIFT_CONSTRAINT=Math.abs(t)>Math.abs(e)?r.AXIS.YAW:r.AXIS.PITCH),r.DRAG_CONSTRAINT=r.AXIS.ALL,r.FIXED_CONSTRAINT&&(r.DRAG_CONSTRAINT=r.FIXED_CONSTRAINT),r.SHIFT_CONSTRAINT&&(r.DRAG_CONSTRAINT=r.SHIFT_CONSTRAINT)},updateInput:function(t,e,s){var i=r.mouse,a=r.P5.pixelDensity();i.prev[0]=i.curr[0],i.prev[1]=i.curr[1],i.prev[2]=i.curr[2],i.curr[0]=t,i.curr[1]=e,i.curr[2]=s,i.dist[0]=-(i.curr[0]-i.prev[0])/a,i.dist[1]=-(i.curr[1]-i.prev[1])/a,i.dist[2]=-(i.curr[2]-i.prev[2])/a},mousedown:function(t){var e=r.mouse,s=r.offset[0]-window.scrollX,i=r.offset[1]-window.scrollY;0===t.button&&(e.button|=e.BUTTON.LMB),1===t.button&&(e.button|=e.BUTTON.MMB),2===t.button&&(e.button|=e.BUTTON.RMB),e.insideViewport(t.x-s,t.y-i)&&(e.updateInput(t.x-s,t.y-i,t.y-i),e.ismousedown=e.button>0,e.isPressed=e.ismousedown,r.SHIFT_CONSTRAINT=0)},mousedrag:function(){r.P5.pixelDensity();var t=r.mouse;if(t.ismousedown){var e=r.P5.mouseX,s=r.P5.mouseY,i=s;t.updateInput(e,s,i),t.solveConstraint();var a=t.button&t.BUTTON.LMB,o=t.button&t.BUTTON.MMB,n=t.button&t.BUTTON.RMB;a&&t.mouseDragLeft&&t.mouseDragLeft(),o&&t.mouseDragCenter&&t.mouseDragCenter(),n&&t.mouseDragRight&&t.mouseDragRight()}},mouseup:function(t){var e=r.mouse;0===t.button&&(e.button&=~e.BUTTON.LMB),1===t.button&&(e.button&=~e.BUTTON.MMB),2===t.button&&(e.button&=~e.BUTTON.RMB),e.ismousedown=e.button>0,e.isPressed=e.istouchdown||e.ismousedown,r.SHIFT_CONSTRAINT=0},dblclick:function(t){var e=r.offset[0]-window.scrollX,s=r.offset[1]-window.scrollY;r.mouse.insideViewport(t.x-e,t.y-s)&&r.reset()},wheel:function(t){var e=r.offset[0]-window.scrollX,s=r.offset[1]-window.scrollY,i=r.mouse;i.insideViewport(t.x-e,t.y-s)&&(i.mwheel=.01*t.deltaY,i.mouseWheelAction&&i.mouseWheelAction())},evaluateTouches:function(t){var e,s,i,a=t.touches,o=0,n=0,h=0,c=a.length,u=r.offset[0]-window.scrollX,d=r.offset[1]-window.scrollY;for(e=0;e<c;e++)o+=a[e].clientX-u,n+=a[e].clientY-d;for(o/=c,n/=c,e=0;e<c;e++)s=o-(a[e].clientX-u),i=n-(a[e].clientY-d),h+=Math.sqrt(s*s+i*i);h/=c,r.mouse.updateInput(o,n,-h)},touchstart:function(t){t.preventDefault(),t.stopPropagation();var e=r.mouse;e.evaluateTouches(t),e.istouchdown=e.insideViewport(e.curr[0],e.curr[1]),e.isPressed=r.mouse.istouchdown||r.mouse.ismousedown,e.dbltap(t)},touchmove:function(t){t.preventDefault(),t.stopPropagation();var e=r.mouse;e.istouchdown&&(e.evaluateTouches(t),e.solveConstraint(),1===t.touches.length?e.touchmoveSingle():(e.touchmoveMulti(),e.tapcount=0))},touchend:function(t){t.preventDefault(),t.stopPropagation();var e=r.mouse;e.istouchdown=!1,e.isPressed=e.istouchdown||e.ismousedown,r.SHIFT_CONSTRAINT=0,e.tapcount>=2&&(e.insideViewport(e.curr[0],e.curr[1])&&r.reset(),e.tapcount=0)},tapcount:0,dbltap:function(t){0==r.mouse.tapcount++&&setTimeout((function(){r.mouse.tapcount=0}),350)},shiftKey:!1,keydown:function(t){var e=r.mouse;e.shiftKey||(e.shiftKey=16===t.keyCode)},keyup:function(t){var e=r.mouse;e.shiftKey&&(e.shiftKey=16!==t.keyCode,e.shiftKey||(r.SHIFT_CONSTRAINT=0))}},this.attachMouseListeners(),this.auto_update=!0,this.P5.registerMethod("pre",(function(){r.auto_update&&r.update()})),this.dampedZoom=new i((function(t){r.zoom(t*r.getZoomMult())})),this.dampedPanX=new i((function(t){r.panX(t*r.getPanMult())})),this.dampedPanY=new i((function(t){r.panY(t*r.getPanMult())})),this.dampedRotX=new i((function(t){r.rotateX(t*r.getRotationMult())})),this.dampedRotY=new i((function(t){r.rotateY(t*r.getRotationMult())})),this.dampedRotZ=new i((function(t){r.rotateZ(t*r.getRotationMult())})),this.timedRot=new a(r.setInterpolatedRotation.bind(r)),this.timedPan=new a(r.setInterpolatedCenter.bind(r)),this.timedzoom=new a(r.setInterpolatedDistance.bind(r))}else console.log("renderer needs to be an instance of p5.RendererGL")}setCanvas(t){t instanceof p5.RendererGL?(this.renderer=t,t._pInst instanceof p5?this.graphics=t:this.graphics=t._pInst,this.P5=this.graphics._pInst):(this.graphics=void 0,this.renderer=void 0)}getCanvas(){return this.renderer}attachListener(t,e,s,i){t&&t!==s.el&&(this.detachListener(s),s.el=t,s.ev=e,s.op=i,s.el.addEventListener(s.ev,s,s.op))}detachListener(t){t.el&&(t.el.removeEventListener(t.ev,t,t.op),t.el=void 0)}attachMouseListeners(t){var e=this.cam,s=e.mouse;if(t=t||e.renderer){var i={passive:!1},a=t.elt;e.attachListener(a,"mousedown",s.mousedown,i),e.attachListener(a,"mouseup",s.mouseup,i),e.attachListener(a,"dblclick",s.dblclick,i),e.attachListener(a,"wheel",s.wheel,i),e.attachListener(a,"touchstart",s.touchstart,i),e.attachListener(a,"touchend",s.touchend,i),e.attachListener(a,"touchmove",s.touchmove,i),e.attachListener(window,"keydown",s.keydown,i),e.attachListener(window,"keyup",s.keyup,i)}}removeMouseListeners(){var t=this.cam,e=t.mouse;t.detachListener(e.mousedown),t.detachListener(e.mouseup),t.detachListener(e.dblclick),t.detachListener(e.wheel),t.detachListener(e.keydown),t.detachListener(e.keyup),t.detachListener(e.touchstart),t.detachListener(e.touchend),t.detachListener(e.touchmove)}dispose(){removeMouseListeners()}getAutoUpdate(){return this.auto_update}setAutoUpdate(t){this.auto_update=t}update(){var t=this.cam;t.mouse.mousedrag();var e=!1;e|=t.dampedZoom.update(),e|=t.dampedPanX.update(),e|=t.dampedPanY.update(),e|=t.dampedRotX.update(),e|=t.dampedRotY.update(),(e|=t.dampedRotZ.update())?(t.timedRot.stop(),t.timedPan.stop(),t.timedzoom.stop()):(t.timedRot.update(),t.timedPan.update(),t.timedzoom.update()),t.apply()}apply(t){var e=this.cam;(t=t||e.renderer)&&(this.camEYE=this.getPosition(this.camEYE),this.camLAT=this.getCenter(this.camLAT),this.camRUP=this.getUpVector(this.camRUP),void 0===t._curCamera?t.camera(this.camEYE[0],this.camEYE[1],this.camEYE[2],this.camLAT[0],this.camLAT[1],this.camLAT[2],this.camRUP[0],this.camRUP[1],this.camRUP[2]):t._curCamera.camera(this.camEYE[0],this.camEYE[1],this.camEYE[2],this.camLAT[0],this.camLAT[1],this.camLAT[2],this.camRUP[0],this.camRUP[1],this.camRUP[2]))}setViewport(t){this.viewport=t.slice()}getViewport(){return this.viewport}mouseWheelZoom(){var t=this,e=t.mouse;t.dampedZoom.addForce(e.mwheel*t.scale_zoomwheel)}mouseDragZoom(){var t=this.mouse;this.dampedZoom.addForce(-t.dist[2])}mouseDragPan(){var t=this,e=t.mouse;t.dampedPanX.addForce(t.DRAG_CONSTRAINT&t.AXIS.YAW?e.dist[0]:0),t.dampedPanY.addForce(t.DRAG_CONSTRAINT&t.AXIS.PITCH?e.dist[1]:0)}mouseDragRotate(){var t=this,e=t.mouse,s=e.curr[0],i=e.curr[1],a=e.dist[0],o=e.dist[1],n=2*Math.min(Math.max((s-t.viewport[0])/t.viewport[2],0),1)-1,r=2*Math.min(Math.max((i-t.viewport[1])/t.viewport[3],0),1)-1;t.DRAG_CONSTRAINT&t.AXIS.YAW&&t.dampedRotY.addForce(+a*(1-r*r)),t.DRAG_CONSTRAINT&t.AXIS.PITCH&&t.dampedRotX.addForce(-o*(1-n*n)),t.DRAG_CONSTRAINT&t.AXIS.ROLL&&(t.dampedRotZ.addForce(-a*r),t.dampedRotZ.addForce(+o*n))}getZoomMult(){return this.state.distance*this.scale_zoom}getPanMult(){return this.state.distance*this.scale_pan}getRotationMult(){return Math.pow(Math.log10(1+this.state.distance),.5)*this.scale_rotation}zoom(t){var e=this.cam,s=e.state.distance+t;s<e.distance_min&&(s=e.distance_min,e.dampedZoom.stop()),s>e.distance_max&&(s=e.distance_max,e.dampedZoom.stop()),e.state.distance=s}panX(t){var e=this.cam.state;if(t){var s=o.applyToVec3(e.rotation,[t,0,0]);r.add(e.center,s,e.center)}}panY(t){var e=this.cam.state;if(t){var s=o.applyToVec3(e.rotation,[0,t,0]);r.add(e.center,s,e.center)}}pan(t,e){this.cam.panX(t),this.cam.panY(t)}rotateX(t){this.cam.rotate([1,0,0],t)}rotateY(t){this.cam.rotate([0,1,0],t)}rotateZ(t){this.cam.rotate([0,0,1],t)}rotate(t,e){var s=this.cam.state;if(e){var i=o.create({axis:t,angle:e});o.applyToRotation(s.rotation,i,s.rotation)}}setInterpolatedDistance(t,e,s){this.cam.state.distance=n.mix(t,e,n.smoothstep(s))}setInterpolatedCenter(t,e,s){this.cam.state.center=r.mix(t,e,n.smoothstep(s))}setInterpolatedRotation(t,e,s){this.cam.state.rotation=o.slerp(t,e,s)}setDistanceMin(t){this.distance_min=Math.max(t,this.distance_min_limit),this.zoom(0)}setDistanceMax(t){this.distance_max=t,this.zoom(0)}setDistance(t,e){this.timedzoom.start(this.state.distance,t,e,[this.dampedZoom])}getDistance(){return this.state.distance}setCenter(t,e){this.timedPan.start(this.state.center,t,e,[this.dampedPanX,this.dampedPanY])}getCenter(){return this.state.center}setRotation(t,e){this.timedRot.start(this.state.rotation,t,e,[this.dampedRotX,this.dampedRotY,this.dampedRotZ])}getRotation(){return this.state.rotation}getPosition(t){var e=this.cam,s=e.state;return t=r.assert(t),o.applyToVec3(s.rotation,e.LOOK,t),r.mult(t,s.distance,t),r.add(t,s.center,t),t}getUpVector(t){var e=this.cam,s=e.state;return t=r.assert(t),o.applyToVec3(s.rotation,e.UP,t),t}getState(){return this.state.copy()}setState(t,e){t&&(this.setDistance(t.distance,e),this.setCenter(t.center,e),this.setRotation(t.rotation,e))}pushState(){return this.state_pushed=this.getState()}popState(t){this.setState(this.state_pushed,t)}pushResetState(){return this.state_reset=this.getState()}reset(t){this.setState(this.state_reset,t)}setRotationScale(t){this.scale_rotation=t}setPanScale(t){this.scale_pan=t}setZoomScale(t){this.scale_zoom=t}setWheelScale(t){this.scale_zoomwheel=t}getRotationScale(){return this.scale_rotation}getPanScale(){return this.scale_pan}getZoomScale(){return this.scale_zoom}getWheelScale(){return this.scale_zoomwheel}setDamping(t){this.dampedZoom.damping=t,this.dampedPanX.damping=t,this.dampedPanY.damping=t,this.dampedRotX.damping=t,this.dampedRotY.damping=t,this.dampedRotZ.damping=t}setDefaultInterpolationTime(t){this.timedRot.default_duration=t,this.timedPan.default_duration=t,this.timedzoom.default_duration=t}setRotationConstraint(t,e,s){var i=this.cam;i.FIXED_CONSTRAINT=0,i.FIXED_CONSTRAINT|=t?i.AXIS.YAW:0,i.FIXED_CONSTRAINT|=e?i.AXIS.PITCH:0,i.FIXED_CONSTRAINT|=s?i.AXIS.ROLL:0}beginHUD(t,e,s){var i=this.cam;if(!(t=t||i.renderer))return;this.pushed_rendererState=t.push();var a=t.drawingContext,o=(e=void 0!==e?e:t.width,s=void 0!==s?s:t.height,Number.MAX_VALUE);a.flush(),a.disable(a.DEPTH_TEST),this.pushed_uMVMatrix=t.uMVMatrix.copy(),this.pushed_uPMatrix=t.uPMatrix.copy();const n=void 0!==window.VERSION?window.VERSION:"1.4.0",r=n.split("."),h=r[0],c=r[1];n&&h>=1&&c>=10?t.uViewMatrix.set(p5.Matrix.identity()):n&&h>=1&&c>=6?t.uMVMatrix=p5.Matrix.identity():t.resetMatrix(),t._curCamera.ortho(0,e,-s,0,-o,+o)}endHUD(t){var e=this.cam;if(t=t||e.renderer){var s=t.drawingContext;s.flush(),t.uMVMatrix.set(this.pushed_uMVMatrix),t.uPMatrix.set(this.pushed_uPMatrix),s.enable(s.DEPTH_TEST),t.pop(this.pushed_rendererState)}}}class i{constructor(t){this.value=0,this.damping=.85,this.action=t}addForce(t){this.value+=t}update(){var t=this.value*this.value>1e-6;return t?(this.action(this.value),this.value*=this.damping):this.stop(),t}stop(){this.value=0}}class a{constructor(t){this.default_duration=300,this.action=t}start(t,e,s,i){for(var a in i)i[a].stop();this.valA=t,this.valB=e,this.duration=void 0===s?this.default_duration:s,this.timer=(new Date).getTime(),this.active=this.duration>0,this.active||this.interpolate(1)}update(){if(this.active){var t=((new Date).getTime()-this.timer)/this.duration;t>.995?(this.interpolate(1),this.stop()):this.interpolate(t)}}interpolate(t){this.action(this.valA,this.valB,t)}stop(){this.active=!1}}var o={assert:function(t){return void 0===t||t.constructor!==Array?[1,0,0,0]:t},identity:function(){return[1,0,0,0]},applyToVec3:function(t,e,s){var[i,a,o]=e,[n,h,c,u]=t,d=h*i+c*a+u*o;return(s=r.assert(s))[0]=2*(n*(i*n-(c*o-u*a))+d*h)-i,s[1]=2*(n*(a*n-(u*i-h*o))+d*c)-a,s[2]=2*(n*(o*n-(h*a-c*i))+d*u)-o,s},applyToRotation(t,e,s){var[i,a,n,r]=t,[h,c,u,d]=e;return(s=o.assert(s))[0]=h*i-(c*a+u*n+d*r),s[1]=c*i+h*a+(u*r-d*n),s[2]=u*i+h*n+(d*a-c*r),s[3]=d*i+h*r+(c*n-u*a),s},slerp:function(t,e,s,i){var[a,n,r,h]=t,[c,u,d,m]=e,p=a*c+n*u+r*d+h*m;p<0&&(c=-c,u=-u,d=-d,m=-m,p=-p);var l,v,f=Math.acos(p),T=Math.sqrt(1-p*p);return T>.001?(l=Math.sin((1-s)*f)/T,v=Math.sin(s*f)/T):(l=1-s,v=s),(i=o.assert(i))[0]=l*a+v*c,i[1]=l*n+v*u,i[2]=l*r+v*d,i[3]=l*h+v*m,o.create({rotation:i,normalize:!0},i)},create:function(t,e){if(e=o.assert(e),t.axis){var s=t.axis,i=t.angle,a=r.mag(s);if(0==a)return;var n=-.5*i,h=Math.sin(n)/a;return e[0]=Math.cos(n),e[1]=h*s[0],e[2]=h*s[1],e[3]=h*s[2],e}if(t.rotation){if(e[0]=t.rotation[0],e[1]=t.rotation[1],e[2]=t.rotation[2],e[3]=t.rotation[3],t.normalize){var c=1/Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2]+e[3]*e[3]);e[0]*=c,e[1]*=c,e[2]*=c,e[3]*=c}return e}if(t.angles_xyz){var u=-.5*t.angles_xyz[0],d=-.5*t.angles_xyz[1],m=-.5*t.angles_xyz[2],p=[Math.cos(u),Math.sin(u),0,0],l=[Math.cos(d),0,Math.sin(d),0],v=[Math.cos(m),0,0,Math.sin(m)];return o.applyToRotation(l,v,e),o.applyToRotation(p,e,e),e}}},n={mix:function(t,e,s){return t*(1-s)+e*s},smoothstep:function(t){return t*t*(3-2*t)},smootherstep:function(t){return x*x*x*(x*(6*x-15)+10)}},r={assert:function(t){return void 0===t||t.constructor!==Array?[0,0,0]:t},isScalar:function(t){return void 0!==t&&t.constructor!==Array},add:function(t,e,s){return s=this.assert(s),this.isScalar(e)?(s[0]=t[0]+e,s[1]=t[1]+e,s[2]=t[2]+e):(s[0]=t[0]+e[0],s[1]=t[1]+e[1],s[2]=t[2]+e[2]),s},mult:function(t,e,s){return s=this.assert(s),this.isScalar(e)?(s[0]=t[0]*e,s[1]=t[1]*e,s[2]=t[2]*e):(s[0]=t[0]*e[0],s[1]=t[1]*e[1],s[2]=t[2]*e[2]),s},magSq:function(t){return t[0]*t[0]+t[1]*t[1]+t[2]*t[2]},mag:function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2])},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]},cross:function(t,e,s){return(s=this.assert(s))[0]=t[1]*e[2]-t[2]*e[1],s[1]=t[2]*e[0]-t[0]*e[2],s[2]=t[0]*e[1]-t[1]*e[0],s},angle:function(t,e){var s=this.mag(t)*this.mag(e);if(0===s)return 0;var i=this.dot(t,e),a=.9999*s;if(i<-a||i>a){var o=this.cross(t,e);return i>=0?Math.asin(this.mag(o)/s):Math.PI-Math.asin(this.mag(o)/s)}return Math.acos(i/s)},mix(t,e,s,i){return(i=this.assert(i))[0]=n.mix(t[0],e[0],s),i[1]=n.mix(t[1],e[1],s),i[2]=n.mix(t[2],e[2],s),i}};return s.INFO=e,Object.freeze(e),(t=void 0!==t?t:{}).EasyCam=s,t.DampedAction=i,t.Interpolation=a,t.Rotation=o,t.Vec3=r,t.Scalar=n,t}(Dw);p5&&(p5.prototype.createEasyCam=function(){var t=this._renderer,e=arguments[0];return arguments[0]instanceof p5.RendererGL&&(t=arguments[0],e=arguments[1]),new Dw.EasyCam(t,e)});