@extrabinoss/three-plot 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/three-plot.js +273 -248
- package/dist/three-plot.umd.cjs +13 -13
- package/package.json +1 -1
package/dist/three-plot.umd.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(p,h){typeof exports=="object"&&typeof module<"u"?h(exports,require("three")):typeof define=="function"&&define.amd?define(["exports","three"],h):(p=typeof globalThis<"u"?globalThis:p||self,h(p.ThreePlot={},p.THREE))})(this,(function(p,h){"use strict";function Z(o){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const e in o)if(e!=="default"){const i=Object.getOwnPropertyDescriptor(o,e);Object.defineProperty(t,e,i.get?i:{enumerable:!0,get:()=>o[e]})}}return t.default=o,Object.freeze(t)}const r=Z(h),L={type:"change"},S={type:"start"},U={type:"end"},v=new h.Ray,R=new h.Plane,q=Math.cos(70*h.MathUtils.DEG2RAD),d=new h.Vector3,g=2*Math.PI,c={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},M=1e-6;class K extends h.Controls{constructor(t,e=null){super(t,e),this.state=c.NONE,this.target=new h.Vector3,this.cursor=new h.Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:h.MOUSE.ROTATE,MIDDLE:h.MOUSE.DOLLY,RIGHT:h.MOUSE.PAN},this.touches={ONE:h.TOUCH.ROTATE,TWO:h.TOUCH.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._domElementKeyEvents=null,this._lastPosition=new h.Vector3,this._lastQuaternion=new h.Quaternion,this._lastTargetPosition=new h.Vector3,this._quat=new h.Quaternion().setFromUnitVectors(t.up,new h.Vector3(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new h.Spherical,this._sphericalDelta=new h.Spherical,this._scale=1,this._panOffset=new h.Vector3,this._rotateStart=new h.Vector2,this._rotateEnd=new h.Vector2,this._rotateDelta=new h.Vector2,this._panStart=new h.Vector2,this._panEnd=new h.Vector2,this._panDelta=new h.Vector2,this._dollyStart=new h.Vector2,this._dollyEnd=new h.Vector2,this._dollyDelta=new h.Vector2,this._dollyDirection=new h.Vector3,this._mouse=new h.Vector2,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=B.bind(this),this._onPointerDown=G.bind(this),this._onPointerUp=H.bind(this),this._onContextMenu=st.bind(this),this._onMouseWheel=J.bind(this),this._onKeyDown=tt.bind(this),this._onTouchStart=et.bind(this),this._onTouchMove=it.bind(this),this._onMouseDown=Q.bind(this),this._onMouseMove=$.bind(this),this._interceptControlDown=nt.bind(this),this._interceptControlUp=ot.bind(this),this.domElement!==null&&this.connect(this.domElement),this.update()}connect(t){super.connect(t),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.ownerDocument.removeEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction="auto"}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(t){t.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=t}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(L),this.update(),this.state=c.NONE}update(t=null){const e=this.object.position;d.copy(e).sub(this.target),d.applyQuaternion(this._quat),this._spherical.setFromVector3(d),this.autoRotate&&this.state===c.NONE&&this._rotateLeft(this._getAutoRotationAngle(t)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let i=this.minAzimuthAngle,s=this.maxAzimuthAngle;isFinite(i)&&isFinite(s)&&(i<-Math.PI?i+=g:i>Math.PI&&(i-=g),s<-Math.PI?s+=g:s>Math.PI&&(s-=g),i<=s?this._spherical.theta=Math.max(i,Math.min(s,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(i+s)/2?Math.max(i,this._spherical.theta):Math.min(s,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let n=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const a=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),n=a!=this._spherical.radius}if(d.setFromSpherical(this._spherical),d.applyQuaternion(this._quatInverse),e.copy(this.target).add(d),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let a=null;if(this.object.isPerspectiveCamera){const l=d.length();a=this._clampDistance(l*this._scale);const u=l-a;this.object.position.addScaledVector(this._dollyDirection,u),this.object.updateMatrixWorld(),n=!!u}else if(this.object.isOrthographicCamera){const l=new h.Vector3(this._mouse.x,this._mouse.y,0);l.unproject(this.object);const u=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),n=u!==this.object.zoom;const f=new h.Vector3(this._mouse.x,this._mouse.y,0);f.unproject(this.object),this.object.position.sub(f).add(l),this.object.updateMatrixWorld(),a=d.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;a!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(a).add(this.object.position):(v.origin.copy(this.object.position),v.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(v.direction))<q?this.object.lookAt(this.target):(R.setFromNormalAndCoplanarPoint(this.object.up,this.target),v.intersectPlane(R,this.target))))}else if(this.object.isOrthographicCamera){const a=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),a!==this.object.zoom&&(this.object.updateProjectionMatrix(),n=!0)}return this._scale=1,this._performCursorZoom=!1,n||this._lastPosition.distanceToSquared(this.object.position)>M||8*(1-this._lastQuaternion.dot(this.object.quaternion))>M||this._lastTargetPosition.distanceToSquared(this.target)>M?(this.dispatchEvent(L),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(t){return t!==null?g/60*this.autoRotateSpeed*t:g/60/60*this.autoRotateSpeed}_getZoomScale(t){const e=Math.abs(t*.01);return Math.pow(.95,this.zoomSpeed*e)}_rotateLeft(t){this._sphericalDelta.theta-=t}_rotateUp(t){this._sphericalDelta.phi-=t}_panLeft(t,e){d.setFromMatrixColumn(e,0),d.multiplyScalar(-t),this._panOffset.add(d)}_panUp(t,e){this.screenSpacePanning===!0?d.setFromMatrixColumn(e,1):(d.setFromMatrixColumn(e,0),d.crossVectors(this.object.up,d)),d.multiplyScalar(t),this._panOffset.add(d)}_pan(t,e){const i=this.domElement;if(this.object.isPerspectiveCamera){const s=this.object.position;d.copy(s).sub(this.target);let n=d.length();n*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*t*n/i.clientHeight,this.object.matrix),this._panUp(2*e*n/i.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(t*(this.object.right-this.object.left)/this.object.zoom/i.clientWidth,this.object.matrix),this._panUp(e*(this.object.top-this.object.bottom)/this.object.zoom/i.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(t,e){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const i=this.domElement.getBoundingClientRect(),s=t-i.left,n=e-i.top,a=i.width,l=i.height;this._mouse.x=s/a*2-1,this._mouse.y=-(n/l)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(t){return Math.max(this.minDistance,Math.min(this.maxDistance,t))}_handleMouseDownRotate(t){this._rotateStart.set(t.clientX,t.clientY)}_handleMouseDownDolly(t){this._updateZoomParameters(t.clientX,t.clientX),this._dollyStart.set(t.clientX,t.clientY)}_handleMouseDownPan(t){this._panStart.set(t.clientX,t.clientY)}_handleMouseMoveRotate(t){this._rotateEnd.set(t.clientX,t.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(g*this._rotateDelta.x/e.clientHeight),this._rotateUp(g*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(t){this._dollyEnd.set(t.clientX,t.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(t){this._panEnd.set(t.clientX,t.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(t){this._updateZoomParameters(t.clientX,t.clientY),t.deltaY<0?this._dollyIn(this._getZoomScale(t.deltaY)):t.deltaY>0&&this._dollyOut(this._getZoomScale(t.deltaY)),this.update()}_handleKeyDown(t){let e=!1;switch(t.code){case this.keys.UP:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(g*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),e=!0;break;case this.keys.BOTTOM:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(-g*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),e=!0;break;case this.keys.LEFT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(g*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),e=!0;break;case this.keys.RIGHT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(-g*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),e=!0;break}e&&(t.preventDefault(),this.update())}_handleTouchStartRotate(t){if(this._pointers.length===1)this._rotateStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),i=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._rotateStart.set(i,s)}}_handleTouchStartPan(t){if(this._pointers.length===1)this._panStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),i=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panStart.set(i,s)}}_handleTouchStartDolly(t){const e=this._getSecondPointerPosition(t),i=t.pageX-e.x,s=t.pageY-e.y,n=Math.sqrt(i*i+s*s);this._dollyStart.set(0,n)}_handleTouchStartDollyPan(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enablePan&&this._handleTouchStartPan(t)}_handleTouchStartDollyRotate(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enableRotate&&this._handleTouchStartRotate(t)}_handleTouchMoveRotate(t){if(this._pointers.length==1)this._rotateEnd.set(t.pageX,t.pageY);else{const i=this._getSecondPointerPosition(t),s=.5*(t.pageX+i.x),n=.5*(t.pageY+i.y);this._rotateEnd.set(s,n)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(g*this._rotateDelta.x/e.clientHeight),this._rotateUp(g*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(t){if(this._pointers.length===1)this._panEnd.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),i=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panEnd.set(i,s)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(t){const e=this._getSecondPointerPosition(t),i=t.pageX-e.x,s=t.pageY-e.y,n=Math.sqrt(i*i+s*s);this._dollyEnd.set(0,n),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const a=(t.pageX+e.x)*.5,l=(t.pageY+e.y)*.5;this._updateZoomParameters(a,l)}_handleTouchMoveDollyPan(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enablePan&&this._handleTouchMovePan(t)}_handleTouchMoveDollyRotate(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enableRotate&&this._handleTouchMoveRotate(t)}_addPointer(t){this._pointers.push(t.pointerId)}_removePointer(t){delete this._pointerPositions[t.pointerId];for(let e=0;e<this._pointers.length;e++)if(this._pointers[e]==t.pointerId){this._pointers.splice(e,1);return}}_isTrackingPointer(t){for(let e=0;e<this._pointers.length;e++)if(this._pointers[e]==t.pointerId)return!0;return!1}_trackPointer(t){let e=this._pointerPositions[t.pointerId];e===void 0&&(e=new h.Vector2,this._pointerPositions[t.pointerId]=e),e.set(t.pageX,t.pageY)}_getSecondPointerPosition(t){const e=t.pointerId===this._pointers[0]?this._pointers[1]:this._pointers[0];return this._pointerPositions[e]}_customWheelEvent(t){const e=t.deltaMode,i={clientX:t.clientX,clientY:t.clientY,deltaY:t.deltaY};switch(e){case 1:i.deltaY*=16;break;case 2:i.deltaY*=100;break}return t.ctrlKey&&!this._controlActive&&(i.deltaY*=10),i}}function G(o){this.enabled!==!1&&(this._pointers.length===0&&(this.domElement.setPointerCapture(o.pointerId),this.domElement.ownerDocument.addEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.addEventListener("pointerup",this._onPointerUp)),!this._isTrackingPointer(o)&&(this._addPointer(o),o.pointerType==="touch"?this._onTouchStart(o):this._onMouseDown(o)))}function B(o){this.enabled!==!1&&(o.pointerType==="touch"?this._onTouchMove(o):this._onMouseMove(o))}function H(o){switch(this._removePointer(o),this._pointers.length){case 0:this.domElement.releasePointerCapture(o.pointerId),this.domElement.ownerDocument.removeEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.removeEventListener("pointerup",this._onPointerUp),this.dispatchEvent(U),this.state=c.NONE;break;case 1:const t=this._pointers[0],e=this._pointerPositions[t];this._onTouchStart({pointerId:t,pageX:e.x,pageY:e.y});break}}function Q(o){let t;switch(o.button){case 0:t=this.mouseButtons.LEFT;break;case 1:t=this.mouseButtons.MIDDLE;break;case 2:t=this.mouseButtons.RIGHT;break;default:t=-1}switch(t){case h.MOUSE.DOLLY:if(this.enableZoom===!1)return;this._handleMouseDownDolly(o),this.state=c.DOLLY;break;case h.MOUSE.ROTATE:if(o.ctrlKey||o.metaKey||o.shiftKey){if(this.enablePan===!1)return;this._handleMouseDownPan(o),this.state=c.PAN}else{if(this.enableRotate===!1)return;this._handleMouseDownRotate(o),this.state=c.ROTATE}break;case h.MOUSE.PAN:if(o.ctrlKey||o.metaKey||o.shiftKey){if(this.enableRotate===!1)return;this._handleMouseDownRotate(o),this.state=c.ROTATE}else{if(this.enablePan===!1)return;this._handleMouseDownPan(o),this.state=c.PAN}break;default:this.state=c.NONE}this.state!==c.NONE&&this.dispatchEvent(S)}function $(o){switch(this.state){case c.ROTATE:if(this.enableRotate===!1)return;this._handleMouseMoveRotate(o);break;case c.DOLLY:if(this.enableZoom===!1)return;this._handleMouseMoveDolly(o);break;case c.PAN:if(this.enablePan===!1)return;this._handleMouseMovePan(o);break}}function J(o){this.enabled===!1||this.enableZoom===!1||this.state!==c.NONE||(o.preventDefault(),this.dispatchEvent(S),this._handleMouseWheel(this._customWheelEvent(o)),this.dispatchEvent(U))}function tt(o){this.enabled!==!1&&this._handleKeyDown(o)}function et(o){switch(this._trackPointer(o),this._pointers.length){case 1:switch(this.touches.ONE){case h.TOUCH.ROTATE:if(this.enableRotate===!1)return;this._handleTouchStartRotate(o),this.state=c.TOUCH_ROTATE;break;case h.TOUCH.PAN:if(this.enablePan===!1)return;this._handleTouchStartPan(o),this.state=c.TOUCH_PAN;break;default:this.state=c.NONE}break;case 2:switch(this.touches.TWO){case h.TOUCH.DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchStartDollyPan(o),this.state=c.TOUCH_DOLLY_PAN;break;case h.TOUCH.DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchStartDollyRotate(o),this.state=c.TOUCH_DOLLY_ROTATE;break;default:this.state=c.NONE}break;default:this.state=c.NONE}this.state!==c.NONE&&this.dispatchEvent(S)}function it(o){switch(this._trackPointer(o),this.state){case c.TOUCH_ROTATE:if(this.enableRotate===!1)return;this._handleTouchMoveRotate(o),this.update();break;case c.TOUCH_PAN:if(this.enablePan===!1)return;this._handleTouchMovePan(o),this.update();break;case c.TOUCH_DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchMoveDollyPan(o),this.update();break;case c.TOUCH_DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchMoveDollyRotate(o),this.update();break;default:this.state=c.NONE}}function st(o){this.enabled!==!1&&o.preventDefault()}function nt(o){o.key==="Control"&&(this._controlActive=!0,this.domElement.getRootNode().addEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function ot(o){o.key==="Control"&&(this._controlActive=!1,this.domElement.getRootNode().removeEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}var I=`precision highp float;
|
|
1
|
+
(function(f,n){typeof exports=="object"&&typeof module<"u"?n(exports,require("three")):typeof define=="function"&&define.amd?define(["exports","three"],n):(f=typeof globalThis<"u"?globalThis:f||self,n(f.ThreePlot={},f.THREE))})(this,(function(f,n){"use strict";const z={type:"change"},w={type:"start"},L={type:"end"},P=new n.Ray,j=new n.Plane,V=Math.cos(70*n.MathUtils.DEG2RAD),u=new n.Vector3,p=2*Math.PI,l={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},S=1e-6;class H extends n.Controls{constructor(t,e=null){super(t,e),this.state=l.NONE,this.target=new n.Vector3,this.cursor=new n.Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:n.MOUSE.ROTATE,MIDDLE:n.MOUSE.DOLLY,RIGHT:n.MOUSE.PAN},this.touches={ONE:n.TOUCH.ROTATE,TWO:n.TOUCH.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._domElementKeyEvents=null,this._lastPosition=new n.Vector3,this._lastQuaternion=new n.Quaternion,this._lastTargetPosition=new n.Vector3,this._quat=new n.Quaternion().setFromUnitVectors(t.up,new n.Vector3(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new n.Spherical,this._sphericalDelta=new n.Spherical,this._scale=1,this._panOffset=new n.Vector3,this._rotateStart=new n.Vector2,this._rotateEnd=new n.Vector2,this._rotateDelta=new n.Vector2,this._panStart=new n.Vector2,this._panEnd=new n.Vector2,this._panDelta=new n.Vector2,this._dollyStart=new n.Vector2,this._dollyEnd=new n.Vector2,this._dollyDelta=new n.Vector2,this._dollyDirection=new n.Vector3,this._mouse=new n.Vector2,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=q.bind(this),this._onPointerDown=Z.bind(this),this._onPointerUp=K.bind(this),this._onContextMenu=et.bind(this),this._onMouseWheel=Q.bind(this),this._onKeyDown=$.bind(this),this._onTouchStart=J.bind(this),this._onTouchMove=tt.bind(this),this._onMouseDown=G.bind(this),this._onMouseMove=B.bind(this),this._interceptControlDown=it.bind(this),this._interceptControlUp=st.bind(this),this.domElement!==null&&this.connect(this.domElement),this.update()}connect(t){super.connect(t),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.ownerDocument.removeEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction="auto"}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(t){t.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=t}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(z),this.update(),this.state=l.NONE}update(t=null){const e=this.object.position;u.copy(e).sub(this.target),u.applyQuaternion(this._quat),this._spherical.setFromVector3(u),this.autoRotate&&this.state===l.NONE&&this._rotateLeft(this._getAutoRotationAngle(t)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let i=this.minAzimuthAngle,s=this.maxAzimuthAngle;isFinite(i)&&isFinite(s)&&(i<-Math.PI?i+=p:i>Math.PI&&(i-=p),s<-Math.PI?s+=p:s>Math.PI&&(s-=p),i<=s?this._spherical.theta=Math.max(i,Math.min(s,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(i+s)/2?Math.max(i,this._spherical.theta):Math.min(s,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let o=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const r=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),o=r!=this._spherical.radius}if(u.setFromSpherical(this._spherical),u.applyQuaternion(this._quatInverse),e.copy(this.target).add(u),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let r=null;if(this.object.isPerspectiveCamera){const h=u.length();r=this._clampDistance(h*this._scale);const c=h-r;this.object.position.addScaledVector(this._dollyDirection,c),this.object.updateMatrixWorld(),o=!!c}else if(this.object.isOrthographicCamera){const h=new n.Vector3(this._mouse.x,this._mouse.y,0);h.unproject(this.object);const c=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),o=c!==this.object.zoom;const d=new n.Vector3(this._mouse.x,this._mouse.y,0);d.unproject(this.object),this.object.position.sub(d).add(h),this.object.updateMatrixWorld(),r=u.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;r!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(r).add(this.object.position):(P.origin.copy(this.object.position),P.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(P.direction))<V?this.object.lookAt(this.target):(j.setFromNormalAndCoplanarPoint(this.object.up,this.target),P.intersectPlane(j,this.target))))}else if(this.object.isOrthographicCamera){const r=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),r!==this.object.zoom&&(this.object.updateProjectionMatrix(),o=!0)}return this._scale=1,this._performCursorZoom=!1,o||this._lastPosition.distanceToSquared(this.object.position)>S||8*(1-this._lastQuaternion.dot(this.object.quaternion))>S||this._lastTargetPosition.distanceToSquared(this.target)>S?(this.dispatchEvent(z),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(t){return t!==null?p/60*this.autoRotateSpeed*t:p/60/60*this.autoRotateSpeed}_getZoomScale(t){const e=Math.abs(t*.01);return Math.pow(.95,this.zoomSpeed*e)}_rotateLeft(t){this._sphericalDelta.theta-=t}_rotateUp(t){this._sphericalDelta.phi-=t}_panLeft(t,e){u.setFromMatrixColumn(e,0),u.multiplyScalar(-t),this._panOffset.add(u)}_panUp(t,e){this.screenSpacePanning===!0?u.setFromMatrixColumn(e,1):(u.setFromMatrixColumn(e,0),u.crossVectors(this.object.up,u)),u.multiplyScalar(t),this._panOffset.add(u)}_pan(t,e){const i=this.domElement;if(this.object.isPerspectiveCamera){const s=this.object.position;u.copy(s).sub(this.target);let o=u.length();o*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*t*o/i.clientHeight,this.object.matrix),this._panUp(2*e*o/i.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(t*(this.object.right-this.object.left)/this.object.zoom/i.clientWidth,this.object.matrix),this._panUp(e*(this.object.top-this.object.bottom)/this.object.zoom/i.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(t,e){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const i=this.domElement.getBoundingClientRect(),s=t-i.left,o=e-i.top,r=i.width,h=i.height;this._mouse.x=s/r*2-1,this._mouse.y=-(o/h)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(t){return Math.max(this.minDistance,Math.min(this.maxDistance,t))}_handleMouseDownRotate(t){this._rotateStart.set(t.clientX,t.clientY)}_handleMouseDownDolly(t){this._updateZoomParameters(t.clientX,t.clientX),this._dollyStart.set(t.clientX,t.clientY)}_handleMouseDownPan(t){this._panStart.set(t.clientX,t.clientY)}_handleMouseMoveRotate(t){this._rotateEnd.set(t.clientX,t.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(p*this._rotateDelta.x/e.clientHeight),this._rotateUp(p*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(t){this._dollyEnd.set(t.clientX,t.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(t){this._panEnd.set(t.clientX,t.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(t){this._updateZoomParameters(t.clientX,t.clientY),t.deltaY<0?this._dollyIn(this._getZoomScale(t.deltaY)):t.deltaY>0&&this._dollyOut(this._getZoomScale(t.deltaY)),this.update()}_handleKeyDown(t){let e=!1;switch(t.code){case this.keys.UP:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(p*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),e=!0;break;case this.keys.BOTTOM:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(-p*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),e=!0;break;case this.keys.LEFT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(p*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),e=!0;break;case this.keys.RIGHT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(-p*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),e=!0;break}e&&(t.preventDefault(),this.update())}_handleTouchStartRotate(t){if(this._pointers.length===1)this._rotateStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),i=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._rotateStart.set(i,s)}}_handleTouchStartPan(t){if(this._pointers.length===1)this._panStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),i=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panStart.set(i,s)}}_handleTouchStartDolly(t){const e=this._getSecondPointerPosition(t),i=t.pageX-e.x,s=t.pageY-e.y,o=Math.sqrt(i*i+s*s);this._dollyStart.set(0,o)}_handleTouchStartDollyPan(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enablePan&&this._handleTouchStartPan(t)}_handleTouchStartDollyRotate(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enableRotate&&this._handleTouchStartRotate(t)}_handleTouchMoveRotate(t){if(this._pointers.length==1)this._rotateEnd.set(t.pageX,t.pageY);else{const i=this._getSecondPointerPosition(t),s=.5*(t.pageX+i.x),o=.5*(t.pageY+i.y);this._rotateEnd.set(s,o)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(p*this._rotateDelta.x/e.clientHeight),this._rotateUp(p*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(t){if(this._pointers.length===1)this._panEnd.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),i=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panEnd.set(i,s)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(t){const e=this._getSecondPointerPosition(t),i=t.pageX-e.x,s=t.pageY-e.y,o=Math.sqrt(i*i+s*s);this._dollyEnd.set(0,o),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const r=(t.pageX+e.x)*.5,h=(t.pageY+e.y)*.5;this._updateZoomParameters(r,h)}_handleTouchMoveDollyPan(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enablePan&&this._handleTouchMovePan(t)}_handleTouchMoveDollyRotate(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enableRotate&&this._handleTouchMoveRotate(t)}_addPointer(t){this._pointers.push(t.pointerId)}_removePointer(t){delete this._pointerPositions[t.pointerId];for(let e=0;e<this._pointers.length;e++)if(this._pointers[e]==t.pointerId){this._pointers.splice(e,1);return}}_isTrackingPointer(t){for(let e=0;e<this._pointers.length;e++)if(this._pointers[e]==t.pointerId)return!0;return!1}_trackPointer(t){let e=this._pointerPositions[t.pointerId];e===void 0&&(e=new n.Vector2,this._pointerPositions[t.pointerId]=e),e.set(t.pageX,t.pageY)}_getSecondPointerPosition(t){const e=t.pointerId===this._pointers[0]?this._pointers[1]:this._pointers[0];return this._pointerPositions[e]}_customWheelEvent(t){const e=t.deltaMode,i={clientX:t.clientX,clientY:t.clientY,deltaY:t.deltaY};switch(e){case 1:i.deltaY*=16;break;case 2:i.deltaY*=100;break}return t.ctrlKey&&!this._controlActive&&(i.deltaY*=10),i}}function Z(a){this.enabled!==!1&&(this._pointers.length===0&&(this.domElement.setPointerCapture(a.pointerId),this.domElement.ownerDocument.addEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.addEventListener("pointerup",this._onPointerUp)),!this._isTrackingPointer(a)&&(this._addPointer(a),a.pointerType==="touch"?this._onTouchStart(a):this._onMouseDown(a)))}function q(a){this.enabled!==!1&&(a.pointerType==="touch"?this._onTouchMove(a):this._onMouseMove(a))}function K(a){switch(this._removePointer(a),this._pointers.length){case 0:this.domElement.releasePointerCapture(a.pointerId),this.domElement.ownerDocument.removeEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.removeEventListener("pointerup",this._onPointerUp),this.dispatchEvent(L),this.state=l.NONE;break;case 1:const t=this._pointers[0],e=this._pointerPositions[t];this._onTouchStart({pointerId:t,pageX:e.x,pageY:e.y});break}}function G(a){let t;switch(a.button){case 0:t=this.mouseButtons.LEFT;break;case 1:t=this.mouseButtons.MIDDLE;break;case 2:t=this.mouseButtons.RIGHT;break;default:t=-1}switch(t){case n.MOUSE.DOLLY:if(this.enableZoom===!1)return;this._handleMouseDownDolly(a),this.state=l.DOLLY;break;case n.MOUSE.ROTATE:if(a.ctrlKey||a.metaKey||a.shiftKey){if(this.enablePan===!1)return;this._handleMouseDownPan(a),this.state=l.PAN}else{if(this.enableRotate===!1)return;this._handleMouseDownRotate(a),this.state=l.ROTATE}break;case n.MOUSE.PAN:if(a.ctrlKey||a.metaKey||a.shiftKey){if(this.enableRotate===!1)return;this._handleMouseDownRotate(a),this.state=l.ROTATE}else{if(this.enablePan===!1)return;this._handleMouseDownPan(a),this.state=l.PAN}break;default:this.state=l.NONE}this.state!==l.NONE&&this.dispatchEvent(w)}function B(a){switch(this.state){case l.ROTATE:if(this.enableRotate===!1)return;this._handleMouseMoveRotate(a);break;case l.DOLLY:if(this.enableZoom===!1)return;this._handleMouseMoveDolly(a);break;case l.PAN:if(this.enablePan===!1)return;this._handleMouseMovePan(a);break}}function Q(a){this.enabled===!1||this.enableZoom===!1||this.state!==l.NONE||(a.preventDefault(),this.dispatchEvent(w),this._handleMouseWheel(this._customWheelEvent(a)),this.dispatchEvent(L))}function $(a){this.enabled!==!1&&this._handleKeyDown(a)}function J(a){switch(this._trackPointer(a),this._pointers.length){case 1:switch(this.touches.ONE){case n.TOUCH.ROTATE:if(this.enableRotate===!1)return;this._handleTouchStartRotate(a),this.state=l.TOUCH_ROTATE;break;case n.TOUCH.PAN:if(this.enablePan===!1)return;this._handleTouchStartPan(a),this.state=l.TOUCH_PAN;break;default:this.state=l.NONE}break;case 2:switch(this.touches.TWO){case n.TOUCH.DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchStartDollyPan(a),this.state=l.TOUCH_DOLLY_PAN;break;case n.TOUCH.DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchStartDollyRotate(a),this.state=l.TOUCH_DOLLY_ROTATE;break;default:this.state=l.NONE}break;default:this.state=l.NONE}this.state!==l.NONE&&this.dispatchEvent(w)}function tt(a){switch(this._trackPointer(a),this.state){case l.TOUCH_ROTATE:if(this.enableRotate===!1)return;this._handleTouchMoveRotate(a),this.update();break;case l.TOUCH_PAN:if(this.enablePan===!1)return;this._handleTouchMovePan(a),this.update();break;case l.TOUCH_DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchMoveDollyPan(a),this.update();break;case l.TOUCH_DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchMoveDollyRotate(a),this.update();break;default:this.state=l.NONE}}function et(a){this.enabled!==!1&&a.preventDefault()}function it(a){a.key==="Control"&&(this._controlActive=!0,this.domElement.getRootNode().addEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function st(a){a.key==="Control"&&(this._controlActive=!1,this.domElement.getRootNode().removeEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}var U=`precision highp float;
|
|
2
2
|
|
|
3
3
|
attribute float instanceIndex;
|
|
4
4
|
|
|
@@ -113,7 +113,7 @@ void main() {
|
|
|
113
113
|
currentScreen += normal * position.y * effectiveLineWidth * 2.0;
|
|
114
114
|
|
|
115
115
|
gl_Position = vec4((currentScreen / uResolution * 2.0 - 1.0), 0.0, 1.0);
|
|
116
|
-
}`,
|
|
116
|
+
}`,nt=`precision highp float;
|
|
117
117
|
uniform vec3 uColor;
|
|
118
118
|
uniform vec3 uOutlineColor;
|
|
119
119
|
uniform float uOutlineWidth;
|
|
@@ -158,10 +158,10 @@ void main() {
|
|
|
158
158
|
vec3 color = mix(uOutlineColor, baseColor, innerAlpha);
|
|
159
159
|
|
|
160
160
|
gl_FragColor = vec4(color, alpha);
|
|
161
|
-
}`;class x{instancedMesh;geometry;material;params;static customInjection="";constructor(t,e=new
|
|
162
|
-
y = ${
|
|
161
|
+
}`;class x{instancedMesh;geometry;material;params;static customInjection="";constructor(t,e=new n.Color(65416)){this.params={count:t,frequency:.1,amplitude:20,width:400,presetIndex:0,color:e.clone(),lodFactor:1,pointSize:2};const i=new n.PlaneGeometry(1,1);this.geometry=new n.InstancedBufferGeometry,this.geometry.index=i.index,i.attributes.position&&this.geometry.setAttribute("position",i.attributes.position);const s=new Float32Array(t);for(let c=0;c<t;c++)s[c]=c;this.geometry.setAttribute("instanceIndex",new n.InstancedBufferAttribute(s,1));const o=/else\s*{\s*y\s*=\s*0\.0;\s*}/g,r=U.replace(o,x.customInjection||"else { y = 0.0; }");this.material=new n.ShaderMaterial({uniforms:{uTime:{value:0},uCount:{value:Number(t)},uFrequency:{value:this.params.frequency},uAmplitude:{value:this.params.amplitude},uPlotWidth:{value:400},uPreset:{value:Number(this.params.presetIndex)},uColor:{value:e.clone()},uLodFactor:{value:1},uResolution:{value:new n.Vector2(100,100)},uLineWidth:{value:2},uOutlineColor:{value:new n.Color(0)},uOutlineWidth:{value:0},uDashScale:{value:0},uOffset:{value:new n.Vector2(0,0)}},vertexShader:r,fragmentShader:nt,transparent:!1,depthWrite:!1,depthTest:!1,blending:n.AdditiveBlending}),this.instancedMesh=new n.InstancedMesh(this.geometry,this.material,t),this.instancedMesh.frustumCulled=!1;const h=new n.Object3D;h.updateMatrix();for(let c=0;c<t;c++)this.instancedMesh.setMatrixAt(c,h.matrix)}setParams(t){return this.params={...this.params,...t},this}color(t){return this.setParams({color:t})}amplitude(t){return this.setParams({amplitude:t})}frequency(t){return this.setParams({frequency:t})}width(t){return this.setParams({width:t})}offset(t,e){return this.setParams({offset:{x:t,y:e}})}preset(t){return this.setParams({presetIndex:t})}injectPresets(t){let e="",i=8;t.forEach((r,h)=>{e+=`else if (preset == ${i}) { // ${h}
|
|
162
|
+
y = ${r};
|
|
163
163
|
}
|
|
164
|
-
`,i++}),e+="else { y = 0.0; }",x.customInjection=e;const s=/else\s*{\s*y\s*=\s*0\.0;\s*}/g,
|
|
164
|
+
`,i++}),e+="else { y = 0.0; }",x.customInjection=e;const s=/else\s*{\s*y\s*=\s*0\.0;\s*}/g,o=U.replace(s,e);this.material.vertexShader!==o&&(this.material.vertexShader=o,this.material.needsUpdate=!0)}update(t,e){const i=this.material.uniforms;if(!i)return;e&&i.uResolution.value.set(e.pixelWidth,e.pixelHeight);const s=this.params,o=s.autoUpdate!==!1?t:0;this.updateUniform(i.uTime,o),this.updateUniform(i.uFrequency,s.frequency),this.updateUniform(i.uAmplitude,s.amplitude),this.updateUniform(i.uPlotWidth,s.width??400),this.updateUniform(i.uPreset,Number(s.presetIndex)),this.updateUniform(i.uLodFactor,s.lodFactor??1),this.updateUniform(i.uLineWidth,s.pointSize??2),s.color!==void 0&&i.uColor.value.set(s.color),s.borderColor!==void 0&&i.uOutlineColor.value.set(s.borderColor),this.updateUniform(i.uOutlineWidth,s.borderWidth??0),this.updateUniform(i.uDashScale,s.dashScale??0),s.offset&&i.uOffset.value.set(s.offset.x,s.offset.y);const r=this.calculateEffectiveCount(s,e);this.updateUniform(i.uCount,r),this.instancedMesh.count=Math.max(0,r)}updateUniform(t,e){t.value!==e&&(t.value=e)}calculateEffectiveCount(t,e){if(!e)return t.count;const o=(t.width??400)/Math.max(e.maxX-e.minX,.001),r=Math.ceil(e.pixelWidth*2*o);return Math.min(t.count,r)}get mesh(){return this.instancedMesh}getDrawStats(){return{total:this.params.count,visible:this.instancedMesh.count}}dispose(){this.geometry.dispose(),Array.isArray(this.material)?this.material.forEach(t=>t.dispose()):this.material.dispose()}}var I=`precision highp float;
|
|
165
165
|
attribute float pIndex;
|
|
166
166
|
uniform float uTime;
|
|
167
167
|
uniform float uCount;
|
|
@@ -238,7 +238,7 @@ void main() {
|
|
|
238
238
|
vec4 mvPosition = modelViewMatrix * worldPos;
|
|
239
239
|
gl_PointSize = uPointSize;
|
|
240
240
|
gl_Position = projectionMatrix * mvPosition;
|
|
241
|
-
}`,
|
|
241
|
+
}`,ot=`precision mediump float;
|
|
242
242
|
uniform vec3 uColor;
|
|
243
243
|
|
|
244
244
|
void main() {
|
|
@@ -251,17 +251,17 @@ void main() {
|
|
|
251
251
|
|
|
252
252
|
float alpha = smoothstep(1.0, 0.5, r);
|
|
253
253
|
gl_FragColor = vec4(uColor, alpha);
|
|
254
|
-
}`;class
|
|
255
|
-
y = ${
|
|
254
|
+
}`;class _{points;geometry;material;params;static customInjection="";constructor(t,e=new n.Color(65416)){this.params={count:t,frequency:.1,amplitude:20,width:400,presetIndex:0,color:e.clone(),lodFactor:1,pointSize:5,adaptive:!0,autoSubsampling:!0,autoCulling:!0},this.geometry=this.initGeometry(t),this.material=this.initMaterial(t,e),this.points=new n.Points(this.geometry,this.material),this.points.frustumCulled=!1}initGeometry(t){const e=new n.BufferGeometry,i=new Float32Array(t);for(let s=0;s<t;s++)i[s]=s;return e.setAttribute("pIndex",new n.BufferAttribute(i,1)),e.setDrawRange(0,t),e}initMaterial(t,e){const i=/else\s*{\s*y\s*=\s*0\.0;\s*}/g,s=I.replace(i,_.customInjection||"else { y = 0.0; }");return new n.ShaderMaterial({uniforms:{uTime:{value:0},uCount:{value:Number(t)},uFrequency:{value:this.params.frequency},uAmplitude:{value:this.params.amplitude},uPlotWidth:{value:400},uPreset:{value:Number(this.params.presetIndex)},uPointSize:{value:this.params.pointSize},uColor:{value:e.clone()},uAdaptive:{value:1},uLodFactor:{value:1},uOffset:{value:new n.Vector2(0,0)}},vertexShader:s,fragmentShader:ot,transparent:!1,depthWrite:!1,depthTest:!1,blending:n.AdditiveBlending})}setParams(t){return this.params={...this.params,...t},this}color(t){return this.setParams({color:t})}amplitude(t){return this.setParams({amplitude:t})}frequency(t){return this.setParams({frequency:t})}width(t){return this.setParams({width:t})}offset(t,e){return this.setParams({offset:{x:t,y:e}})}preset(t){return this.setParams({presetIndex:t})}size(t){return this.setParams({pointSize:t})}adaptive(t){return this.setParams({adaptive:t})}injectPresets(t){let e="",i=8;t.forEach((r,h)=>{e+=`else if (preset == ${i}) { // ${h}
|
|
255
|
+
y = ${r};
|
|
256
256
|
}
|
|
257
|
-
`,i++}),e+="else { y = 0.0; }",
|
|
257
|
+
`,i++}),e+="else { y = 0.0; }",_.customInjection=e;const s=/else\s*{\s*y\s*=\s*0\.0;\s*}/g,o=I.replace(s,e);this.material.vertexShader!==o&&(this.material.vertexShader=o,this.material.needsUpdate=!0)}update(t,e){const i=this.material.uniforms;if(!i)return;const s=this.params,o=s.autoUpdate!==!1?t:0;this.updateUniform(i.uTime,o),this.updateUniform(i.uFrequency,s.frequency),this.updateUniform(i.uAmplitude,s.amplitude),this.updateUniform(i.uPlotWidth,s.width??400),this.updateUniform(i.uPreset,Number(s.presetIndex)),this.updateUniform(i.uLodFactor,s.lodFactor??1),this.updateUniform(i.uAdaptive,s.adaptive?1:0),s.color!==void 0&&i.uColor.value.set(s.color),s.offset&&i.uOffset.value.set(s.offset.x,s.offset.y);const r=this.calculateEffectiveCount(s,e),{drawStart:h,drawCount:c}=this.calculateDrawRange(r,s,e),d=this.calculatePointSize(s.pointSize??5,s.count,s.adaptive??!0);this.updateUniform(i.uPointSize,d),this.updateUniform(i.uCount,r),this.geometry.setDrawRange(h,c)}updateUniform(t,e){t.value!==e&&(t.value=e)}calculateEffectiveCount(t,e){if(!(t.autoSubsampling??!0)||!e)return t.count;const i=t.pointsPerPixel||2,o=(t.width??400)/Math.max(e.maxX-e.minX,.001);return Math.min(t.count,Math.ceil(e.pixelWidth*i*o))}calculateDrawRange(t,e,i){if(!(e.autoCulling??!0)||!i)return{drawStart:0,drawCount:t};const s=e.width??400,o=-(s*.5),r=(i.minX-o)/s,h=(i.maxX-o)/s,c=Math.max(0,Math.floor(r*(t-1))),d=Math.min(t-1,Math.ceil(h*(t-1)));return{drawStart:c,drawCount:Math.max(1,d-c+1)}}calculatePointSize(t,e,i){return i?Math.max(.1,t*Math.sqrt(1e5/e)):t}get mesh(){return this.points}getDrawStats(){return{total:this.params.count,visible:this.geometry.drawRange.count}}dispose(){this.geometry.dispose(),Array.isArray(this.material)?this.material.forEach(t=>t.dispose()):this.material.dispose()}}var at=`varying vec2 vUv;
|
|
258
258
|
varying vec3 vWorldPos;
|
|
259
259
|
|
|
260
260
|
void main() {
|
|
261
261
|
vUv = uv;
|
|
262
262
|
vWorldPos = (modelMatrix * vec4(position, 1.0)).xyz;
|
|
263
263
|
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
264
|
-
}`,
|
|
264
|
+
}`,rt=`precision highp float;
|
|
265
265
|
|
|
266
266
|
varying vec3 vWorldPos;
|
|
267
267
|
|
|
@@ -358,7 +358,7 @@ void main() {
|
|
|
358
358
|
if (finalAlpha < 0.01) discard;
|
|
359
359
|
|
|
360
360
|
gl_FragColor = vec4(uColor, finalAlpha * 0.8);
|
|
361
|
-
}`;const
|
|
361
|
+
}`;const ht=`
|
|
362
362
|
attribute vec4 aUvOffset;
|
|
363
363
|
attribute vec3 aColor;
|
|
364
364
|
varying vec2 vUv;
|
|
@@ -369,7 +369,7 @@ void main() {
|
|
|
369
369
|
vColor = aColor;
|
|
370
370
|
gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
|
|
371
371
|
}
|
|
372
|
-
`,
|
|
372
|
+
`,lt=`
|
|
373
373
|
varying vec2 vUv;
|
|
374
374
|
varying vec3 vColor;
|
|
375
375
|
uniform sampler2D uMap;
|
|
@@ -402,4 +402,4 @@ void main() {
|
|
|
402
402
|
if (opacity < 0.01) discard;
|
|
403
403
|
gl_FragColor = vec4(vColor, opacity);
|
|
404
404
|
}
|
|
405
|
-
`;class Y{mesh;material;charMap=new Map;fontData=null;instances=[];capacity;constructor(t=100){this.capacity=t,this.material=new r.ShaderMaterial({vertexShader:ct,fragmentShader:ut,uniforms:{uMap:{value:null}},transparent:!0,side:r.DoubleSide,depthWrite:!1}),this.mesh=this.createMesh(this.capacity)}createMesh(t){const e=new r.PlaneGeometry(1,1);e.setAttribute("aUvOffset",new r.InstancedBufferAttribute(new Float32Array(t*4),4)),e.setAttribute("aColor",new r.InstancedBufferAttribute(new Float32Array(t*3),3));const i=new r.InstancedMesh(e,this.material,t);return i.count=0,i.frustumCulled=!1,i}grow(t){const e=Math.max(Math.ceil(t*1.05),t+10),i=this.mesh,s=this.createMesh(e);i.parent&&(i.parent.add(s),i.parent.remove(i)),i.geometry.dispose(),this.mesh=s,this.capacity=e}async load(t,e){const[i,s]=await Promise.all([fetch(t).then(n=>n.json()),new r.TextureLoader().loadAsync(e)]);this.fontData=i,this.fontData&&this.fontData.chars&&this.fontData.chars.forEach(n=>this.charMap.set(n.char,n)),s.minFilter=r.LinearFilter,s.magFilter=r.LinearFilter,s.generateMipmaps=!1,this.material.uniforms.uMap&&(this.material.uniforms.uMap.value=s)}addText(t,e,i,s=.1,n="#ffffff",a="left"){return this.instances.push({text:t,position:new r.Vector3(e,i,0),scale:s,color:new r.Color(n),align:a}),this}clear(){this.instances=[]}update(){if(!this.fontData)return;let t=0;for(const _ of this.instances)t+=_.text.length;t>this.capacity&&this.grow(t);let e=0;const i=this.mesh.instanceMatrix.array,s=this.mesh.geometry.getAttribute("aUvOffset"),n=s.array,a=this.mesh.geometry.getAttribute("aColor"),l=a.array,u=this.fontData.common.scaleW,f=this.fontData.common.scaleH,mt=this.charMap;for(const _ of this.instances){const D=_.text,ft=D.length,P=_.scale,A=_.position,k=_.color;let O=0;const V=this.calculateWidth(D)*P;let C=0;_.align==="center"?C=-V/2:_.align==="right"&&(C=-V);for(let z=0;z<ft&&!(e>=this.capacity);z++){const j=D[z];if(j===void 0)continue;const y=mt.get(j);if(!y){j===" "&&(O+=20);continue}const m=e*16,pt=y.width*P,gt=y.height*P,yt=A.x+C+(O+y.xoffset+y.width/2)*P,_t=A.y-(y.yoffset+y.height/2)*P;i[m+0]=pt,i[m+1]=0,i[m+2]=0,i[m+3]=0,i[m+4]=0,i[m+5]=gt,i[m+6]=0,i[m+7]=0,i[m+8]=0,i[m+9]=0,i[m+10]=1,i[m+11]=0,i[m+12]=yt,i[m+13]=_t,i[m+14]=A.z,i[m+15]=1;const w=e*4;n[w+0]=y.x/u,n[w+1]=1-(y.y+y.height)/f,n[w+2]=y.width/u,n[w+3]=y.height/f;const E=e*3;l[E+0]=k.r,l[E+1]=k.g,l[E+2]=k.b,O+=y.xadvance,e++}}this.mesh.count=e,this.mesh.instanceMatrix.needsUpdate=!0,s.needsUpdate=!0,a.needsUpdate=!0}calculateWidth(t){if(!this.fontData)return 0;let e=0;const i=this.charMap;for(let s=0;s<t.length;s++){const n=t[s];n!==void 0&&(e+=i.get(n)?.xadvance??20)}return e}getStats(){return{count:this.mesh.count,capacity:this.capacity}}get meshObj(){return this.mesh}}class T{engine;params={offset:{x:0,y:0}};constructor(t=100){this.engine=new Y(t)}async load(t,e){await this.engine.load(t,e)}add(t,e,i,s=.1,n="#ffffff",a="left"){return this.engine.addText(t,e,i,s,n,a),this}setParams(t){return this.params={...this.params,...t},this}update(t,e){this.engine.update()}get mesh(){return this.engine.meshObj}getDrawStats(){const t=this.engine.getStats();return{total:t.capacity,visible:t.count}}clear(){return this.engine.clear(),this}dispose(){this.engine.meshObj.geometry.dispose(),Array.isArray(this.engine.meshObj.material)?this.engine.meshObj.material.forEach(t=>t.dispose()):this.engine.meshObj.material.dispose()}}class X{meshObj;geometry;material;params;textEngine;constructor(t="#ffffff"){this.params={color:new r.Color(t),offset:{x:0,y:0},tickStep:50,tickSize:8,subTicks:0,subTickSize:4,minX:-200,maxX:200,minY:-50,maxY:50,labelSize:.06,labelColor:"#888888",showLabels:!1,labelPrecision:0,thickness:1.5},this.geometry=new r.PlaneGeometry(4e3,4e3),this.material=new r.ShaderMaterial({uniforms:{uColor:{value:this.params.color},uOffset:{value:new r.Vector2(0,0)},uTickStep:{value:50},uTickSize:{value:8},uSubTicks:{value:0},uSubTickSize:{value:4},uRangeX:{value:new r.Vector2(-200,200)},uRangeY:{value:new r.Vector2(-50,50)},uZoom:{value:1},uThickness:{value:1.5}},vertexShader:ht,fragmentShader:lt,transparent:!0,depthWrite:!1,blending:r.AdditiveBlending}),this.meshObj=new r.Mesh(this.geometry,this.material),this.meshObj.position.z=-.1}setParams(t){return this.params={...this.params,...t},this}color(t){return this.setParams({color:t})}offset(t,e){return this.setParams({offset:{x:t,y:e}})}ticks(t,e=8){return this.setParams({tickStep:t,tickSize:e})}subTicks(t,e=4){return this.setParams({subTicks:t,subTickSize:e})}precision(t){return this.setParams({labelPrecision:t})}rangeY(t,e){return this.setParams({minY:t,maxY:e})}rangeX(t,e){return this.setParams({minX:t,maxX:e})}thickness(t){return this.setParams({thickness:t})}labels(t,e=.06,i="#888"){return this.textEngine=t,this.setParams({showLabels:!0,labelSize:e,labelColor:i})}displayLabels(t){return this.setParams({showLabels:t})}update(t,e){const i=this.material.uniforms;if(!i)return;const s=this.params;s.color!==void 0&&i.uColor.value.set(s.color),i.uOffset.value.set(s.offset.x,s.offset.y),i.uRangeX.value.set(s.minX,s.maxX),i.uRangeY.value.set(s.minY,s.maxY),this.updateUniform(i.uTickStep,s.tickStep),this.updateUniform(i.uTickSize,s.tickSize),this.updateUniform(i.uSubTicks,s.subTicks),this.updateUniform(i.uSubTickSize,s.subTickSize),this.updateUniform(i.uZoom,e.zoom),this.updateUniform(i.uThickness,s.thickness),this.meshObj.position.x=e.minX+(e.maxX-e.minX)/2,this.meshObj.position.y=s.offset.y,s.showLabels&&this.textEngine&&this.renderLabels()}renderLabels(){if(!this.textEngine)return;const t=this.params,e=this.textEngine,i=t.offset.x,s=t.offset.y,n=t.labelPrecision,a=t.minX+i-4;e.add(t.maxY.toFixed(n),a,s+t.maxY,t.labelSize,t.labelColor,"right"),e.add(0 .toFixed(n),a,s,t.labelSize,t.labelColor,"right"),e.add(t.minY.toFixed(n),a,s+t.minY,t.labelSize,t.labelColor,"right");const l=t.tickStep,u=Math.ceil(t.minX/l)*l;for(let f=u;f<=t.maxX;f+=l)Math.abs(f-t.minX)<10||e.add(f.toFixed(n),f+i,s-8,t.labelSize*.8,t.labelColor,"center")}updateUniform(t,e){t.value!==e&&(t.value=e)}get mesh(){return this.meshObj}getDrawStats(){return{total:1,visible:1}}dispose(){this.geometry.dispose(),this.material.dispose()}}class F{params;textEngine;dummyMesh;constructor(){this.params={minX:-200,maxX:200,minY:-50,maxY:50,color:"#ffffff",size:.08,precision:1,showMin:!0,showMax:!0,showRangeX:!1,position:"right",offset:{x:0,y:0}},this.dummyMesh=new r.Object3D}setParams(t){return this.params={...this.params,...t},this}rangeY(t,e){return this.setParams({minY:t,maxY:e})}rangeX(t,e){return this.setParams({minX:t,maxX:e})}color(t){return this.setParams({color:t})}size(t){return this.setParams({size:t})}precision(t){return this.setParams({precision:t})}side(t){return this.setParams({position:t})}showMinMax(t,e){return this.setParams({showMin:t,showMax:e})}showRangeX(t){return this.setParams({showRangeX:t})}use(t){return this.textEngine=t,this}update(t,e){if(!this.textEngine)return;const i=this.params,s=this.textEngine,n=i.precision,a=i.offset;if(i.position==="left"||i.position==="both"){const l=i.minX+a.x-5;i.showMax&&s.add(i.maxY.toFixed(n),l,i.maxY+a.y,i.size,i.color,"right"),i.showMin&&s.add(i.minY.toFixed(n),l,i.minY+a.y,i.size,i.color,"right")}if(i.position==="right"||i.position==="both"){const l=i.maxX+a.x+5;i.showMax&&s.add(i.maxY.toFixed(n),l,i.maxY+a.y,i.size,i.color,"left"),i.showMin&&s.add(i.minY.toFixed(n),l,i.minY+a.y,i.size,i.color,"left")}i.showRangeX&&(s.add(i.minX.toFixed(n),i.minX+a.x,i.minY+a.y-12,i.size*.8,i.color,"center"),s.add(i.maxX.toFixed(n),i.maxX+a.x,i.minY+a.y-12,i.size*.8,i.color,"center"))}get mesh(){return this.dummyMesh}getDrawStats(){return{total:0,visible:0}}dispose(){}}class N{scene;camera;renderer;controls;container;animationId=null;resizeObserver;isExternalRenderer=!1;autoRender=!0;plots=new Set;textPlots=new Set;fontConfig;customPresets=new Map;onUpdate;constructor(t,e={}){this.container=t,this.autoRender=e.autoRender!==!1,this.fontConfig=e.font,this.scene=e.scene||new r.Scene,e.scene||(this.scene.background=new r.Color(657930));const i=this.container.clientWidth,s=this.container.clientHeight,n=i/s,a=250;this.camera=e.camera||new r.OrthographicCamera(-a*n,a*n,a,-a,.1,2e3),e.camera||this.camera.position.set(0,0,500),e.renderer?(this.renderer=e.renderer,this.isExternalRenderer=!0):(this.renderer=new r.WebGLRenderer({antialias:e.antialias??!1,alpha:e.alpha??!1,powerPreference:"high-performance"}),this.renderer.setPixelRatio(Math.min(window.devicePixelRatio,2)),this.renderer.setSize(i,s),this.container.appendChild(this.renderer.domElement)),this.controls=new K(this.camera,this.renderer.domElement),this.controls.enableDamping=!0,this.controls.enableRotate=!1,this.controls.mouseButtons={LEFT:r.MOUSE.PAN,MIDDLE:r.MOUSE.DOLLY,RIGHT:r.MOUSE.ROTATE},this.resizeObserver=new ResizeObserver(()=>this.onResize()),this.resizeObserver.observe(this.container),this.autoRender&&this.animate()}registerPreset(t,e){return this.customPresets.set(t,e),this.plots.forEach(i=>{i.injectPresets&&i.injectPresets(this.customPresets)}),this}add(t,e,i){let s;return t==="line"?s=new x(e,new r.Color(i||"#00ff88")):t==="point"?s=new b(e,new r.Color(i||"#00ff88")):t==="axis"?s=new X(e||"#ffffff"):t==="legend"?s=new F:t==="text"&&(s=new T(e||100),this.fontConfig&&this.fontConfig.json&&this.fontConfig.texture&&s.load(this.fontConfig.json,this.fontConfig.texture),this.textPlots.add(s)),t!=="text"&&(this.plots.add(s),s.injectPresets&&this.customPresets.size>0&&s.injectPresets(this.customPresets)),this.scene.add(s.mesh),s}line(t,e){return this.add("line",t,e)}point(t,e){return this.add("point",t,e)}axis(t){return this.add("axis",t)}legend(){return this.add("legend",null)}text(t){return this.add("text",t)}remove(t){return this.plots.delete(t),t instanceof T&&this.textPlots.delete(t),this.scene.remove(t.mesh),t.dispose(),this}clear(){return this.plots.forEach(t=>{this.scene.remove(t.mesh),t.dispose()}),this.textPlots.forEach(t=>{this.scene.remove(t.mesh),t.dispose()}),this.plots.clear(),this.textPlots.clear(),this}onResize(){const t=this.container.clientWidth,e=this.container.clientHeight,i=t/e,s=250;this.camera.left=-s*i,this.camera.right=s*i,this.camera.top=s,this.camera.bottom=-s,this.camera.updateProjectionMatrix(),this.renderer.setSize(t,e)}getViewportStats(){const t=this.container.clientWidth,e=this.container.clientHeight,i=this.camera.zoom,s=this.camera.position.x+this.camera.left/i,n=this.camera.position.x+this.camera.right/i;return{pixelWidth:t,pixelHeight:e,minX:s,maxX:n,zoom:i}}getRendererInfo(){return{frame:this.renderer.info.render.frame,calls:this.renderer.info.render.calls,points:this.renderer.info.render.points,triangles:this.renderer.info.render.triangles}}render(){const t=performance.now(),e=this.getViewportStats();this.onUpdate&&this.onUpdate(t),this.plots.forEach(i=>i.update(t/1e3,e)),this.textPlots.forEach(i=>i.update(t/1e3,e)),this.controls.update(),this.renderer.render(this.scene,this.camera)}animate(){this.autoRender&&(this.animationId=requestAnimationFrame(()=>this.animate()),this.render())}destroy(){this.animationId!==null&&cancelAnimationFrame(this.animationId),this.resizeObserver.disconnect(),this.clear(),this.isExternalRenderer||(this.renderer.dispose(),this.renderer.domElement.remove()),this.controls.dispose()}}const dt={init(o,t){return new N(o,t)},version:"1.2.0"};p.AxisPlot=X,p.LegendPlot=F,p.LinePlot=x,p.MSDFText=Y,p.PlotContainer=N,p.PointPlot=b,p.TextPlot=T,p.ThreePlot=dt,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})}));
|
|
405
|
+
`;class W{mesh;material;charMap=new Map;fontData=null;instances=[];capacity;constructor(t=100){this.capacity=t,this.material=new n.ShaderMaterial({vertexShader:ht,fragmentShader:lt,uniforms:{uMap:{value:null}},transparent:!0,side:n.DoubleSide,depthWrite:!1}),this.mesh=this.createMesh(this.capacity)}createMesh(t){const e=new n.PlaneGeometry(1,1);e.setAttribute("aUvOffset",new n.InstancedBufferAttribute(new Float32Array(t*4),4)),e.setAttribute("aColor",new n.InstancedBufferAttribute(new Float32Array(t*3),3));const i=new n.InstancedMesh(e,this.material,t);return i.count=0,i.frustumCulled=!1,i}grow(t){const e=Math.max(Math.ceil(t*1.05),t+10),i=this.mesh,s=this.createMesh(e);i.parent&&(i.parent.add(s),i.parent.remove(i)),i.geometry.dispose(),this.mesh=s,this.capacity=e}async load(t,e){const[i,s]=await Promise.all([fetch(t).then(o=>o.json()),new n.TextureLoader().loadAsync(e)]);this.fontData=i,this.fontData&&this.fontData.chars&&this.fontData.chars.forEach(o=>this.charMap.set(o.char,o)),s.minFilter=n.LinearFilter,s.magFilter=n.LinearFilter,s.generateMipmaps=!1,this.material.uniforms.uMap&&(this.material.uniforms.uMap.value=s)}addText(t,e,i,s=.1,o="#ffffff",r="left"){return this.instances.push({text:t,position:new n.Vector3(e,i,0),scale:s,color:new n.Color(o),align:r}),this}clear(){this.instances=[]}update(){if(!this.fontData)return;let t=0;for(const y of this.instances)t+=y.text.length;t>this.capacity&&this.grow(t);let e=0;const i=this.mesh.instanceMatrix.array,s=this.mesh.geometry.getAttribute("aUvOffset"),o=s.array,r=this.mesh.geometry.getAttribute("aColor"),h=r.array,c=this.fontData.common.scaleW,d=this.fontData.common.scaleH,ut=this.charMap;for(const y of this.instances){const M=y.text,dt=M.length,b=y.scale,E=y.position,D=y.color;let A=0;const N=this.calculateWidth(M)*b;let k=0;y.align==="center"?k=-N/2:y.align==="right"&&(k=-N);for(let O=0;O<dt&&!(e>=this.capacity);O++){const C=M[O];if(C===void 0)continue;const g=ut.get(C);if(!g){C===" "&&(A+=20);continue}const m=e*16,mt=g.width*b,ft=g.height*b,pt=E.x+k+(A+g.xoffset+g.width/2)*b,gt=E.y-(g.yoffset+g.height/2)*b;i[m+0]=mt,i[m+1]=0,i[m+2]=0,i[m+3]=0,i[m+4]=0,i[m+5]=ft,i[m+6]=0,i[m+7]=0,i[m+8]=0,i[m+9]=0,i[m+10]=1,i[m+11]=0,i[m+12]=pt,i[m+13]=gt,i[m+14]=E.z,i[m+15]=1;const v=e*4;o[v+0]=g.x/c,o[v+1]=1-(g.y+g.height)/d,o[v+2]=g.width/c,o[v+3]=g.height/d;const R=e*3;h[R+0]=D.r,h[R+1]=D.g,h[R+2]=D.b,A+=g.xadvance,e++}}this.mesh.count=e,this.mesh.instanceMatrix.needsUpdate=!0,s.needsUpdate=!0,r.needsUpdate=!0}calculateWidth(t){if(!this.fontData)return 0;let e=0;const i=this.charMap;for(let s=0;s<t.length;s++){const o=t[s];o!==void 0&&(e+=i.get(o)?.xadvance??20)}return e}getStats(){return{count:this.mesh.count,capacity:this.capacity}}get meshObj(){return this.mesh}}class T{engine;params={offset:{x:0,y:0}};constructor(t=100){this.engine=new W(t)}async load(t,e){await this.engine.load(t,e)}add(t,e,i,s=.1,o="#ffffff",r="left"){return this.engine.addText(t,e,i,s,o,r),this}setParams(t){return this.params={...this.params,...t},this}update(t,e){this.engine.update()}get mesh(){return this.engine.meshObj}getDrawStats(){const t=this.engine.getStats();return{total:t.capacity,visible:t.count}}clear(){return this.engine.clear(),this}dispose(){this.engine.meshObj.geometry.dispose(),Array.isArray(this.engine.meshObj.material)?this.engine.meshObj.material.forEach(t=>t.dispose()):this.engine.meshObj.material.dispose()}}class Y{meshObj;geometry;material;params;textEngine;constructor(t="#ffffff"){this.params={color:new n.Color(t),offset:{x:0,y:0},tickStep:50,tickSize:8,subTicks:0,subTickSize:4,minX:-200,maxX:200,minY:-50,maxY:50,labelSize:.06,labelColor:"#888888",showLabels:!1,labelPrecision:0,thickness:1.5},this.geometry=new n.PlaneGeometry(4e3,4e3),this.material=new n.ShaderMaterial({uniforms:{uColor:{value:this.params.color},uOffset:{value:new n.Vector2(0,0)},uTickStep:{value:50},uTickSize:{value:8},uSubTicks:{value:0},uSubTickSize:{value:4},uRangeX:{value:new n.Vector2(-200,200)},uRangeY:{value:new n.Vector2(-50,50)},uZoom:{value:1},uThickness:{value:1.5}},vertexShader:at,fragmentShader:rt,transparent:!0,depthWrite:!1,blending:n.AdditiveBlending}),this.meshObj=new n.Mesh(this.geometry,this.material),this.meshObj.position.z=-.1}setParams(t){return this.params={...this.params,...t},this}color(t){return this.setParams({color:t})}offset(t,e){return this.setParams({offset:{x:t,y:e}})}ticks(t,e=8){return this.setParams({tickStep:t,tickSize:e})}subTicks(t,e=4){return this.setParams({subTicks:t,subTickSize:e})}precision(t){return this.setParams({labelPrecision:t})}rangeY(t,e){return this.setParams({minY:t,maxY:e})}rangeX(t,e){return this.setParams({minX:t,maxX:e})}thickness(t){return this.setParams({thickness:t})}labels(t,e=.06,i="#888"){return this.textEngine=t,this.setParams({showLabels:!0,labelSize:e,labelColor:i})}displayLabels(t){return this.setParams({showLabels:t})}update(t,e){const i=this.material.uniforms;if(!i)return;const s=this.params;s.color!==void 0&&i.uColor.value.set(s.color),i.uOffset.value.set(s.offset.x,s.offset.y),i.uRangeX.value.set(s.minX,s.maxX),i.uRangeY.value.set(s.minY,s.maxY),this.updateUniform(i.uTickStep,s.tickStep),this.updateUniform(i.uTickSize,s.tickSize),this.updateUniform(i.uSubTicks,s.subTicks),this.updateUniform(i.uSubTickSize,s.subTickSize),this.updateUniform(i.uZoom,e.zoom),this.updateUniform(i.uThickness,s.thickness),this.meshObj.position.x=e.minX+(e.maxX-e.minX)/2,this.meshObj.position.y=s.offset.y,s.showLabels&&this.textEngine&&this.renderLabels()}renderLabels(){if(!this.textEngine)return;const t=this.params,e=this.textEngine,i=t.offset.x,s=t.offset.y,o=t.labelPrecision,r=t.minX+i-4;e.add(t.maxY.toFixed(o),r,s+t.maxY,t.labelSize,t.labelColor,"right"),e.add(0 .toFixed(o),r,s,t.labelSize,t.labelColor,"right"),e.add(t.minY.toFixed(o),r,s+t.minY,t.labelSize,t.labelColor,"right");const h=t.tickStep,c=Math.ceil(t.minX/h)*h;for(let d=c;d<=t.maxX;d+=h)Math.abs(d-t.minX)<10||e.add(d.toFixed(o),d+i,s-8,t.labelSize*.8,t.labelColor,"center")}updateUniform(t,e){t.value!==e&&(t.value=e)}get mesh(){return this.meshObj}getDrawStats(){return{total:1,visible:1}}dispose(){this.geometry.dispose(),this.material.dispose()}}class X{params;textEngine;dummyMesh;constructor(){this.params={minX:-200,maxX:200,minY:-50,maxY:50,color:"#ffffff",size:.08,precision:1,showMin:!0,showMax:!0,showRangeX:!1,position:"right",offset:{x:0,y:0}},this.dummyMesh=new n.Object3D}setParams(t){return this.params={...this.params,...t},this}rangeY(t,e){return this.setParams({minY:t,maxY:e})}rangeX(t,e){return this.setParams({minX:t,maxX:e})}color(t){return this.setParams({color:t})}size(t){return this.setParams({size:t})}precision(t){return this.setParams({precision:t})}side(t){return this.setParams({position:t})}showMinMax(t,e){return this.setParams({showMin:t,showMax:e})}showRangeX(t){return this.setParams({showRangeX:t})}use(t){return this.textEngine=t,this}update(t,e){if(!this.textEngine)return;const i=this.params,s=this.textEngine,o=i.precision,r=i.offset;if(i.position==="left"||i.position==="both"){const h=i.minX+r.x-5;i.showMax&&s.add(i.maxY.toFixed(o),h,i.maxY+r.y,i.size,i.color,"right"),i.showMin&&s.add(i.minY.toFixed(o),h,i.minY+r.y,i.size,i.color,"right")}if(i.position==="right"||i.position==="both"){const h=i.maxX+r.x+5;i.showMax&&s.add(i.maxY.toFixed(o),h,i.maxY+r.y,i.size,i.color,"left"),i.showMin&&s.add(i.minY.toFixed(o),h,i.minY+r.y,i.size,i.color,"left")}i.showRangeX&&(s.add(i.minX.toFixed(o),i.minX+r.x,i.minY+r.y-12,i.size*.8,i.color,"center"),s.add(i.maxX.toFixed(o),i.maxX+r.x,i.minY+r.y-12,i.size*.8,i.color,"center"))}get mesh(){return this.dummyMesh}getDrawStats(){return{total:0,visible:0}}dispose(){}}class F{scene;camera;renderer;controls;container;animationId=null;resizeObserver;isExternalRenderer=!1;autoRender=!0;plots=new Set;textPlots=new Set;fontConfig;customPresets=new Map;onUpdate;constructor(t,e={}){this.container=t,this.autoRender=e.autoRender!==!1,this.fontConfig=e.font,this.scene=e.scene||new n.Scene,!e.scene&&!this.scene.background&&(this.scene.background=new n.Color(657930));const i=this.container.clientWidth,s=this.container.clientHeight,o=i/s,r=250;if(e.camera)this.camera=e.camera;else{const h=new n.OrthographicCamera(-r*o,r*o,r,-r,.1,2e3);h.position.set(0,0,500),this.camera=h}if(e.renderer)this.renderer=e.renderer,this.isExternalRenderer=!0;else try{this.renderer=new n.WebGLRenderer({antialias:e.antialias??!1,alpha:e.alpha??!1}),this.renderer.setPixelRatio(Math.min(window.devicePixelRatio,2)),this.renderer.setSize(i,s),this.container.appendChild(this.renderer.domElement)}catch(h){throw console.error("ThreePlot: Failed to create WebGL context",h),new Error("WebGL not supported or context creation failed")}e.controls!==!1&&(this.controls=new H(this.camera,this.renderer.domElement),this.controls.enableDamping=!0,this.controls.enableRotate=!1,this.controls.mouseButtons={LEFT:n.MOUSE.PAN,MIDDLE:n.MOUSE.DOLLY,RIGHT:n.MOUSE.ROTATE}),this.isExternalRenderer||(this.resizeObserver=new ResizeObserver(()=>this.onResize()),this.resizeObserver.observe(this.container)),this.autoRender&&this.animate()}registerPreset(t,e){return this.customPresets.set(t,e),this.plots.forEach(i=>{i.injectPresets&&i.injectPresets(this.customPresets)}),this}add(t,e,i){let s;return t==="line"?s=new x(e,new n.Color(i||"#00ff88")):t==="point"?s=new _(e,new n.Color(i||"#00ff88")):t==="axis"?s=new Y(e||"#ffffff"):t==="legend"?s=new X:t==="text"&&(s=new T(e||100),this.fontConfig&&this.fontConfig.json&&this.fontConfig.texture&&s.load(this.fontConfig.json,this.fontConfig.texture),this.textPlots.add(s)),t!=="text"&&(this.plots.add(s),s.injectPresets&&this.customPresets.size>0&&s.injectPresets(this.customPresets)),this.scene.add(s.mesh),s}line(t,e){return this.add("line",t,e)}point(t,e){return this.add("point",t,e)}axis(t){return this.add("axis",t)}legend(){return this.add("legend",null)}text(t){return this.add("text",t)}remove(t){return this.plots.delete(t),t instanceof T&&this.textPlots.delete(t),this.scene.remove(t.mesh),t.dispose(),this}clear(){return this.plots.forEach(t=>{this.scene.remove(t.mesh),t.dispose()}),this.textPlots.forEach(t=>{this.scene.remove(t.mesh),t.dispose()}),this.plots.clear(),this.textPlots.clear(),this}onResize(){const t=this.container.clientWidth,e=this.container.clientHeight,i=t/e,s=250;this.camera instanceof n.OrthographicCamera?(this.camera.left=-s*i,this.camera.right=s*i,this.camera.top=s,this.camera.bottom=-s,this.camera.updateProjectionMatrix()):this.camera instanceof n.PerspectiveCamera&&(this.camera.aspect=i,this.camera.updateProjectionMatrix()),this.renderer.setSize(t,e)}getViewportStats(){const t=this.container.clientWidth,e=this.container.clientHeight;let i=-100,s=100,o=1;if(this.camera instanceof n.OrthographicCamera)o=this.camera.zoom,i=this.camera.position.x+this.camera.left/o,s=this.camera.position.x+this.camera.right/o;else if(this.camera instanceof n.PerspectiveCamera){const r=this.camera.position.z,h=this.camera.fov*Math.PI/180,d=2*Math.tan(h/2)*r*(t/e);i=this.camera.position.x-d/2,s=this.camera.position.x+d/2,o=1}return{pixelWidth:t,pixelHeight:e,minX:i,maxX:s,zoom:o}}getRendererInfo(){return{frame:this.renderer.info.render.frame,calls:this.renderer.info.render.calls,points:this.renderer.info.render.points,triangles:this.renderer.info.render.triangles}}render(){const t=performance.now(),e=this.getViewportStats();this.onUpdate&&this.onUpdate(t),this.plots.forEach(i=>i.update(t/1e3,e)),this.textPlots.forEach(i=>i.update(t/1e3,e)),this.controls&&this.controls.update(),this.renderer.render(this.scene,this.camera)}animate(){this.autoRender&&(this.animationId=requestAnimationFrame(()=>this.animate()),this.render())}destroy(){this.animationId!==null&&cancelAnimationFrame(this.animationId),this.resizeObserver&&this.resizeObserver.disconnect(),this.clear(),this.isExternalRenderer||(this.renderer.dispose(),this.renderer.domElement.remove()),this.controls&&this.controls.dispose()}}const ct={init(a,t){return new F(a,t)},isSupported(){try{const a=document.createElement("canvas");return!!(window.WebGLRenderingContext&&(a.getContext("webgl")||a.getContext("experimental-webgl")))}catch{return!1}},version:"1.2.0"};f.AxisPlot=Y,f.LegendPlot=X,f.LinePlot=x,f.MSDFText=W,f.PlotContainer=F,f.PointPlot=_,f.TextPlot=T,f.ThreePlot=ct,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})}));
|