var CONTROL_MODE={ORBIT:0,POINT:1}; YGG.CameraControls=function(D,K){function z(){return Math.pow(.95,a.zoomSpeed)}function L(b,e){var c=new THREE.Vector3;c.setFromMatrixColumn(e,0);c.multiplyScalar(-b);w.add(c)}function M(b,e){var c=new THREE.Vector3;!0===a.screenSpacePanning?c.setFromMatrixColumn(e,1):(c.setFromMatrixColumn(e,0),c.crossVectors(a.camera.up,c));c.multiplyScalar(b);w.add(c)}function N(b,e){var c=new THREE.Vector3,l=a.domElement===document?a.domElement.body:a.domElement;a.camera.isPerspectiveCamera?(c.copy(a.camera.position).sub(a.target), c=c.length(),c*=Math.tan(a.camera.fov/2*Math.PI/180),L(2*b*c/l.clientHeight,a.camera.matrix),M(2*e*c/l.clientHeight,a.camera.matrix)):a.camera.isOrthographicCamera?(L(b*(a.camera.right-a.camera.left)/a.camera.zoom/l.clientWidth,a.camera.matrix),M(e*(a.camera.top-a.camera.bottom)/a.camera.zoom/l.clientHeight,a.camera.matrix)):(console.warn("WARNING: CameraControls.js encountered an unknown camera type - pan disabled."),a.enablePan=!1)}function A(b){if(a.camera.isPerspectiveCamera)switch(m){case CONTROL_MODE.ORBIT:B/= b;break;case CONTROL_MODE.POINT:a.fakeZoom/=b,x=!0}else a.camera.isOrthographicCamera?(a.camera.zoom=Math.max(a.minZoom,Math.min(a.maxZoom,a.camera.zoom*b)),a.camera.updateProjectionMatrix(),C=!0):(console.warn("WARNING: CameraControls.js zoom and fake zoom only use in camera - dolly/zoom disabled."),a.enableZoom=!1)}function E(b){if(a.camera.isPerspectiveCamera)switch(m){case CONTROL_MODE.ORBIT:B*=b;break;case CONTROL_MODE.POINT:a.fakeZoom*=b,x=!0}else a.camera.isOrthographicCamera?(a.camera.zoom= Math.max(a.minZoom,Math.min(a.maxZoom,a.camera.zoom/b)),a.camera.updateProjectionMatrix(),C=!0):(console.warn("WARNING: CameraControls.js zoom and fake zoom only use in camera - dolly/zoom disabled."),a.enableZoom=!1)}function O(b){if(!1!==a.enabled){b.preventDefault();a.domElement.focus?a.domElement.focus():window.focus();switch(b.button){case a.mouseButtons.LEFT:if(b.ctrlKey||b.metaKey||b.shiftKey){if(!1===a.enablePan)return;a.isDrag=!0;n.set(b.clientX,b.clientY);g=f.PAN}else{if(!1===a.enableRotate)return; p.set(b.clientX,b.clientY);g=f.ROTATE}break;case a.mouseButtons.MIDDLE:if(!1===a.enableZoom)return;q.set(b.clientX,b.clientY);g=f.DOLLY;break;case a.mouseButtons.RIGHT:if(!1===a.enablePan)return;n.set(b.clientX,b.clientY);g=f.PAN}g!==f.NONE&&(document.addEventListener("mousemove",F,!1),document.addEventListener("mouseup",G,!1),a.dispatchEvent(H))}}function F(b){if(!1!==a.enabled)switch(b.preventDefault(),g){case f.ROTATE:if(!1===a.enableRotate)break;r.set(b.clientX,b.clientY);k.subVectors(r,p).multiplyScalar(a.rotateSpeed); var e=a.domElement===document?a.domElement.body:a.domElement;b=k.x/e.clientWidth;e=k.y/e.clientHeight;h.theta-=2*Math.PI*b;h.phi-=2*Math.PI*e;!a.isDrag&&(Math.abs(b)>a.MIN_DRAG_DISTANCE||Math.abs(e)>a.MIN_DRAG_DISTANCE)&&(a.isDrag=!0);p.copy(r);a.update();break;case f.DOLLY:if(!1===a.enableZoom)break;t.set(b.clientX,b.clientY);y.subVectors(t,q);0y.y&&E(z());a.isDrag||(a.isDrag=!0);q.copy(t);a.update();break;case f.PAN:!1!==a.enablePan&&(u.set(b.clientX,b.clientY),v.subVectors(u,n).multiplyScalar(a.panSpeed), N(v.x,v.y),a.isDrag||(a.isDrag=!0),n.copy(u),a.update())}}function G(b){!1!==a.enabled&&(document.removeEventListener("mousemove",F,!1),document.removeEventListener("mouseup",G,!1),a.dispatchEvent(I),g=f.NONE,b.button==a.mouseButtons.LEFT&&(a.onMouseUpCallback(b),a.isDrag=!1))}function P(b){!1===a.enabled||!1===a.enableZoom||g!==f.NONE&&g!==f.ROTATE||(b.preventDefault(),b.stopPropagation(),a.dispatchEvent(H),0>b.deltaY?E(z()):0a.MIN_DRAG_DISTANCE_TOUCH&&(a.isDrag=!0));p.copy(r);a.update();break;case 2:a.isDrag||(a.isDrag=!0);if(!1===a.enableZoom&&!1===a.enablePan)break;if(g!==f.TOUCH_DOLLY_PAN)break;if(a.enableZoom){var e=b.touches[0].pageX-b.touches[1].pageX,c=b.touches[0].pageY-b.touches[1].pageY;t.set(0,Math.sqrt(e*e+c*c));y.set(0,Math.pow(t.y/q.y,a.zoomSpeed));A(y.y);a.isDrag||(a.isDrag=!0);q.copy(t)}a.enablePan&&(u.set(.5*(b.touches[0].pageX+b.touches[1].pageX), .5*(b.touches[0].pageY+b.touches[1].pageY)),v.subVectors(u,n).multiplyScalar(a.panSpeed),N(v.x,v.y),a.isDrag||(a.isDrag=!0),n.copy(u));a.update();break;default:g=f.NONE}}function S(b){!1!==a.enabled&&(a.dispatchEvent(I),g=f.NONE,0==b.touches.length&&(a.onTouchEndCallback(b),a.isDrag=!1))}function T(b){!1!==a.enabled&&b.preventDefault()}var f={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY_PAN:4},U={type:"change"},H={type:"start"},I={type:"end"},a=this,g=f.NONE,m=CONTROL_MODE.ORBIT,d=new THREE.Spherical, h=new THREE.Spherical,w=new THREE.Vector3,B=1,C=!1,x=!1,p=new THREE.Vector2,r=new THREE.Vector2,k=new THREE.Vector2,n=new THREE.Vector2,u=new THREE.Vector2,v=new THREE.Vector2,q=new THREE.Vector2,t=new THREE.Vector2,y=new THREE.Vector2;this.mouseButtons={LEFT:THREE.MOUSE.LEFT,MIDDLE:THREE.MOUSE.MIDDLE,RIGHT:THREE.MOUSE.RIGHT};this.MIN_DRAG_DISTANCE=2E-4;this.MIN_DRAG_DISTANCE_TOUCH=.005;this.onMouseUpCallback=function(){};this.onTouchStartCallback=function(){};this.onTouchEndCallback=function(){}; this.summaryDistance=0;this.camera=D;this.domElement=void 0!==K?K:document;this.enabled=!0;this.isDrag=!1;this.target=new THREE.Vector3;this.defaultPointFOV=D.fov;this.fakeZoom=1;this.minDistance=0;this.maxDistance=Infinity;this.minZoom=0;this.maxZoom=Infinity;this.minFakeZoom=.43;this.maxFakeZoom=1;this.minPolarAngle=0;this.maxPolarAngle=Math.PI;this.minAzimuthAngle=-Infinity;this.maxAzimuthAngle=Infinity;this.enableDamping=!1;this.dampingFactor=.25;this.enableZoom=!0;this.zoomSpeed=1;this.enableRotate= !0;this.rotateSpeed=1;this.enablePan=!0;this.panSpeed=1;this.screenSpacePanning=!1;this.keyPanSpeed=7;this.autoRotate=!1;this.autoRotateSpeed=2;this.target0=this.target.clone();this.position0=this.camera.position.clone();this.zoom0=this.camera.zoom;this.dispose=function(){a.domElement.removeEventListener("contextmenu",T,!1);a.domElement.removeEventListener("mousedown",O,!1);a.domElement.removeEventListener("wheel",P,!1);a.domElement.removeEventListener("touchstart",Q,!1);a.domElement.removeEventListener("touchend", S,!1);a.domElement.removeEventListener("touchmove",R,!1);document.removeEventListener("mousemove",F,!1);document.removeEventListener("mouseup",G,!1)};this.setControlMode=function(b){switch(b){case CONTROL_MODE.ORBIT:m=CONTROL_MODE.ORBIT;a.minPolarAngle=0;a.maxPolarAngle=Math.PI;a.rotateSpeed=1;break;case CONTROL_MODE.POINT:m=CONTROL_MODE.POINT,a.minPolarAngle=0,a.maxPolarAngle=Math.PI,a.rotateSpeed=.3}};this.setOnMouseUpCallback=function(b){a.onMouseUpCallback=b};this.setOnTouchStartCallback=function(b){a.onTouchStartCallback= b};this.setOnTouchEndCallback=function(b){a.onTouchEndCallback=b};this.isDragging=function(){return a.isDrag};this.getPolarAngle=function(){return d.phi};this.getAzimuthalAngle=function(){return d.theta};this.getSpherical=function(){return d};this.setSpherical=function(b){d.copy(b)};this.zoomIn=function(b){A(b);a.update()};this.zoomOut=function(b){E(b);a.update()};this.saveState=function(){a.target0.copy(a.target);a.position0.copy(a.camera.position);a.zoom0=a.camera.zoom};this.reset=function(){a.target.copy(a.target0); a.camera.position.copy(a.position0);a.camera.zoom=a.zoom0;a.camera.updateProjectionMatrix();a.dispatchEvent(U);a.update();g=f.NONE};this.update=function(){var b=new THREE.Vector3,e=(new THREE.Quaternion).setFromUnitVectors(D.up,new THREE.Vector3(0,1,0)),c=e.clone().inverse(),l=new THREE.Vector3,V=new THREE.Quaternion,J=a.camera.position;a.autoRotate&&g===f.NONE&&(h.theta-=2*Math.PI/60/60*a.autoRotateSpeed);m==CONTROL_MODE.ORBIT?(b.copy(J).sub(a.target),b.applyQuaternion(e),d.setFromVector3(b),d.theta+= h.theta,d.phi+=h.phi):(d.theta-=h.theta,d.phi-=h.phi);d.theta=Math.max(a.minAzimuthAngle,Math.min(a.maxAzimuthAngle,d.theta));d.phi=Math.max(a.minPolarAngle,Math.min(a.maxPolarAngle,d.phi));d.makeSafe();m==CONTROL_MODE.ORBIT&&(d.radius*=B,a.target.add(w));d.radius=Math.max(a.minDistance,Math.min(a.maxDistance,d.radius));m==CONTROL_MODE.ORBIT?(b.setFromSpherical(d),b.applyQuaternion(c),J.copy(a.target).add(b)):(b.setFromSphericalCoords(-1*d.radius,d.phi,d.theta),b.applyQuaternion(c),a.target.copy(J).add(b), x&&(a.fakeZoom=Math.max(a.minFakeZoom,Math.min(a.maxFakeZoom,a.fakeZoom)),a.camera.fov=a.defaultPointFOV*a.fakeZoom,a.camera.updateProjectionMatrix()));a.camera.lookAt(a.target);!0===a.enableDamping?(h.theta*=1-a.dampingFactor,h.phi*=1-a.dampingFactor,w.multiplyScalar(1-a.dampingFactor)):(h.set(0,0,0),w.set(0,0,0));B=1;if(x||C||1E-6