@tonybfox/threejs-tools 1.0.6 → 1.0.7

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.
@@ -0,0 +1 @@
1
+ import*as e from"three";var p={x:"#ed4358",y:"#82cc19",z:"#3185eb"},E=class extends e.EventDispatcher{constructor(t,s,i={}){super();this.viewport=new e.Vector4;this.animating=!1;this.targetPosition=new e.Vector3;this.targetQuaternion=new e.Quaternion;this.q1=new e.Quaternion;this.q2=new e.Quaternion;this.dummy=new e.Object3D;this.radius=0;this.turnRate=2*Math.PI;this.tempVecA=new e.Vector3;this.interactiveObjects=[];this.raycaster=new e.Raycaster;this.mouse=new e.Vector2;this.controls=i.controls,this.camera=this.controls?.camera??t,this.domElement=s||document.body;let a=i.center??(this.controls?this.controls.getTarget(new e.Vector3):new e.Vector3);this.options={container:i.container||document.body,size:i.size||128,position:i.position||"bottom-right",offset:i.offset||{x:20,y:20},center:a.clone(),labels:{x:i.labels?.x||"x",y:i.labels?.y||"y",z:i.labels?.z||"z",...i.labels}},this.center=this.options.center.clone(),this.scene=new e.Scene,this.scene.background=null,this.orthoCamera=new e.OrthographicCamera(-2,2,2,-2,0,4),this.orthoCamera.position.set(0,0,2),this.createAxes(),this.createSprites(),this.setupEventListeners()}syncActiveCamera(){return this.controls&&(this.camera=this.controls.camera),this.camera}getCameraPosition(t){return this.controls?this.controls.getPosition(t):t.copy(this.camera.position)}createAxes(){let t=new e.CylinderGeometry(.04,.04,.8,5).rotateZ(-Math.PI/2).translate(.4,0,0),s=new e.MeshBasicMaterial({color:p.x,toneMapped:!1}),i=new e.MeshBasicMaterial({color:p.y,toneMapped:!1}),a=new e.MeshBasicMaterial({color:p.z,toneMapped:!1});this.axes={x:new e.Mesh(t.clone(),s),y:new e.Mesh(t.clone(),i),z:new e.Mesh(t.clone(),a)},this.axes.y.rotation.z=Math.PI/2,this.axes.z.rotation.y=-Math.PI/2,this.scene.add(this.axes.x),this.scene.add(this.axes.y),this.scene.add(this.axes.z)}createSprites(){let t=this.createSprite(p.x,this.options.labels.x),s=this.createSprite(p.y,this.options.labels.y),i=this.createSprite(p.z,this.options.labels.z),a=this.createSprite(p.x),n=this.createSprite(p.y),r=this.createSprite(p.z);this.sprites={posX:t,posY:s,posZ:i,negX:a,negY:n,negZ:r},this.sprites.posX.position.set(1,0,0),this.sprites.posY.position.set(0,1,0),this.sprites.posZ.position.set(0,0,1),this.sprites.negX.position.set(-1,0,0),this.sprites.negY.position.set(0,-1,0),this.sprites.negZ.position.set(0,0,-1),this.sprites.negX.material.opacity=.2,this.sprites.negY.material.opacity=.2,this.sprites.negZ.material.opacity=.2,this.sprites.posX.userData.type="posX",this.sprites.posY.userData.type="posY",this.sprites.posZ.userData.type="posZ",this.sprites.negX.userData.type="negX",this.sprites.negY.userData.type="negY",this.sprites.negZ.userData.type="negZ",Object.values(this.sprites).forEach(o=>{this.scene.add(o),this.interactiveObjects.push(o)})}createSprite(t,s){let i=window.devicePixelRatio||1,a=128*i,n=28*i,r=document.createElement("canvas");r.width=a,r.height=a;let o=r.getContext("2d");o.imageSmoothingEnabled=!0,o.imageSmoothingQuality="high",o.scale(i,i);let c=a/(2*i),l=n/i;o.beginPath(),o.arc(c,c,l,0,2*Math.PI),o.closePath(),o.fillStyle=t,o.fill(),s&&(o.font="bold 48px Arial, sans-serif",o.textAlign="center",o.textBaseline="middle",o.fillStyle="#ffffff",o.strokeStyle="#000000",o.lineWidth=2,o.strokeText(s,c,c),o.fillText(s,c,c));let h=new e.CanvasTexture(r);return h.colorSpace=e.SRGBColorSpace,h.generateMipmaps=!1,h.minFilter=e.LinearFilter,h.magFilter=e.LinearFilter,new e.Sprite(new e.SpriteMaterial({map:h,toneMapped:!1,alphaTest:.1}))}setupEventListeners(){this.pointerDownHandler=t=>{this.handleClick(t)},this.domElement.addEventListener("pointerdown",this.pointerDownHandler)}render(t){this.renderer=t;let s=this.syncActiveCamera();this.scene.quaternion.copy(s.quaternion).invert(),this.scene.updateMatrixWorld();let i=this.options.size,a=t.domElement.width/t.getPixelRatio(),n=t.domElement.height/t.getPixelRatio(),r,o;switch(this.options.position){case"top-left":r=this.options.offset.x,o=n-i-this.options.offset.y;break;case"top-right":r=a-i-this.options.offset.x,o=n-i-this.options.offset.y;break;case"bottom-left":r=this.options.offset.x,o=this.options.offset.y;break;case"bottom-right":default:r=a-i-this.options.offset.x,o=this.options.offset.y;break}t.getViewport(this.viewport);let c=new e.Vector4;t.getScissor(c);let l=t.getScissorTest(),h=t.getRenderTarget(),m=t.getActiveCubeFace(),u=t.getActiveMipmapLevel(),d=t.autoClear;t.setRenderTarget(null),t.setViewport(r,o,i,i),t.autoClear=!1,t.setScissorTest(!0),t.setScissor(r,o,i,i),t.clearDepth(),t.render(this.scene,this.orthoCamera),t.setRenderTarget(h,m,u),t.setViewport(this.viewport.x,this.viewport.y,this.viewport.z,this.viewport.w),t.setScissor(c),t.setScissorTest(l),t.autoClear=d}handleClick(t){if(this.animating||!this.renderer)return!1;this.syncActiveCamera();let s=this.domElement.getBoundingClientRect(),i=this.options.size,a,n;switch(this.options.position){case"top-left":a=s.left+this.options.offset.x,n=s.top+this.options.offset.y;break;case"top-right":a=s.left+s.width-i-this.options.offset.x,n=s.top+this.options.offset.y;break;case"bottom-left":a=s.left+this.options.offset.x,n=s.top+s.height-i-this.options.offset.y;break;case"bottom-right":default:a=s.left+s.width-i-this.options.offset.x,n=s.top+s.height-i-this.options.offset.y;break}if(this.mouse.x=(t.clientX-a)/i*2-1,this.mouse.y=-((t.clientY-n)/i)*2+1,this.mouse.x<-1||this.mouse.x>1||this.mouse.y<-1||this.mouse.y>1)return!1;this.raycaster.setFromCamera(this.mouse,this.orthoCamera);let r=this.raycaster.intersectObjects(this.interactiveObjects);if(r.length>0){let c=r[0].object;return this.prepareAnimationData(c,this.center),this.controls?this.startControlsAnimation(this.center):(this.animating=!0,this.dispatchEvent({type:"animationStart"})),!0}return!1}prepareAnimationData(t,s){switch(t.userData.type){case"posX":this.targetPosition.set(1,0,0),this.targetQuaternion.setFromEuler(new e.Euler(0,Math.PI*.5,0));break;case"posY":this.targetPosition.set(0,1,0),this.targetQuaternion.setFromEuler(new e.Euler(-Math.PI*.5,0,0));break;case"posZ":this.targetPosition.set(0,0,1),this.targetQuaternion.setFromEuler(new e.Euler);break;case"negX":this.targetPosition.set(-1,0,0),this.targetQuaternion.setFromEuler(new e.Euler(0,-Math.PI*.5,0));break;case"negY":this.targetPosition.set(0,-1,0),this.targetQuaternion.setFromEuler(new e.Euler(Math.PI*.5,0,0));break;case"negZ":this.targetPosition.set(0,0,-1),this.targetQuaternion.setFromEuler(new e.Euler(0,Math.PI,0));break;default:console.error("ViewHelper: Invalid axis.");return}let i=this.getCameraPosition(this.tempVecA);this.radius=i.distanceTo(s),this.targetPosition.multiplyScalar(this.radius).add(s),this.dummy.position.copy(s),this.dummy.lookAt(i),this.q1.copy(this.dummy.quaternion),this.dummy.lookAt(this.targetPosition),this.q2.copy(this.dummy.quaternion)}startControlsAnimation(t){let s=this.controls;if(!s)return;s.enabled=!1,s.stop?.(),this.animating=!0,this.dispatchEvent({type:"animationStart"});let i=()=>{s.setLookAt(this.targetPosition.x,this.targetPosition.y,this.targetPosition.z,t.x,t.y,t.z,!0),setTimeout(()=>{s.enabled=!0},100)};try{Promise.resolve(i()).catch(a=>{console.warn("ViewHelper: Unable to set camera look-at.",a)}).finally(()=>{this.animating=!1,this.dispatchEvent({type:"animationEnd"})})}catch(a){console.warn("ViewHelper: Unable to set camera look-at.",a),this.animating=!1,this.dispatchEvent({type:"animationEnd"})}}update(t){if(this.syncActiveCamera(),this.controls||!this.animating)return;let s=t*this.turnRate;this.q1.rotateTowards(this.q2,s),this.camera.position.set(0,0,1).applyQuaternion(this.q1).multiplyScalar(this.radius).add(this.center),this.camera.quaternion.rotateTowards(this.targetQuaternion,s),this.q1.angleTo(this.q2)===0&&(this.animating=!1,this.dispatchEvent({type:"animationEnd"}))}setLabels(t,s,i){t!==void 0&&(this.options.labels.x=t),s!==void 0&&(this.options.labels.y=s),i!==void 0&&(this.options.labels.z=i),this.updateLabels()}updateLabels(){this.sprites.posX.material.map?.dispose(),this.sprites.posY.material.map?.dispose(),this.sprites.posZ.material.map?.dispose(),this.sprites.posX.material.dispose(),this.sprites.posY.material.dispose(),this.sprites.posZ.material.dispose();let t=this.createSprite(p.x,this.options.labels.x),s=this.createSprite(p.y,this.options.labels.y),i=this.createSprite(p.z,this.options.labels.z);this.sprites.posX.material=t.material,this.sprites.posY.material=s.material,this.sprites.posZ.material=i.material}dispose(){this.axes.x.geometry.dispose(),this.axes.y.geometry.dispose(),this.axes.z.geometry.dispose(),this.axes.x.material.dispose(),this.axes.y.material.dispose(),this.axes.z.material.dispose(),Object.values(this.sprites).forEach(t=>{t.material.map?.dispose(),t.material.dispose()}),this.pointerDownHandler&&this.domElement.removeEventListener("pointerdown",this.pointerDownHandler)}};export{E as a};
package/dist/index.cjs CHANGED
@@ -165,4 +165,4 @@
165
165
 
166
166
  gl_FragColor = vec4(finalColor, alpha);
167
167
  }
168
- `,transparent:!0,side:L.DoubleSide,depthWrite:!1});let o=new L.Mesh(i,this.gridMaterial);o.renderOrder=-1,o.rotation.x=-Math.PI/2,this.add(o)}setSubdivisions(n){this.subdivisions=n,this.gridMaterial.uniforms.uSize1.value=this.divisions/this.subdivisions,this.eventDispatcher.dispatchEvent({type:"subdivisionsChanged",subdivisions:n})}setDivisions(n){this.divisions=n,this.gridMaterial.uniforms.uSize1.value=this.divisions/this.subdivisions,this.gridMaterial.uniforms.uSize2.value=this.divisions,this.eventDispatcher.dispatchEvent({type:"divisionsChanged",divisions:n})}setColor1(n){typeof n=="number"?this.gridMaterial.uniforms.uColor1.value.setHex(n):this.gridMaterial.uniforms.uColor1.value.copy(n),this.eventDispatcher.dispatchEvent({type:"colorChanged",color:n,colorType:"color1"})}setColor2(n){typeof n=="number"?this.gridMaterial.uniforms.uColor2.value.setHex(n):this.gridMaterial.uniforms.uColor2.value.copy(n),this.eventDispatcher.dispatchEvent({type:"colorChanged",color:n,colorType:"color2"})}setFogColor(n){typeof n=="number"?this.gridMaterial.uniforms.uFogColor.value.setHex(n):this.gridMaterial.uniforms.uFogColor.value.copy(n),this.eventDispatcher.dispatchEvent({type:"colorChanged",color:n,colorType:"fog"})}setFogNear(n){let e=this.gridMaterial.uniforms.uFogFar.value,t=Math.min(n,e);this.gridMaterial.uniforms.uFogNear.value=t,this.eventDispatcher.dispatchEvent({type:"fogChanged",property:"near",value:t})}setFogFar(n){let e=this.gridMaterial.uniforms.uFogNear.value,t=Math.max(n,e);this.gridMaterial.uniforms.uFogFar.value=t,this.eventDispatcher.dispatchEvent({type:"fogChanged",property:"far",value:t})}addGridEventListener(n,e){this.eventDispatcher.addEventListener(n,e)}removeGridEventListener(n,e){this.eventDispatcher.removeEventListener(n,e)}hasGridEventListener(n,e){return this.eventDispatcher.hasEventListener(n,e)}};var E=Y(require("three")),Ze=require("three/examples/jsm/renderers/CSS2DRenderer");var ue=(i=>(i.VERTEX="vertex",i.FACE="face",i.EDGE="edge",i.DISABLED="disabled",i))(ue||{});var fe=class extends E.EventDispatcher{constructor(e,t,i={}){super();this.measurements=[];this.raycaster=new E.Raycaster;this.isInteractive=!1;this.domElement=null;this.controls=null;this.defaultTargets=[];this.activeTargets=[];this.currentMeasurement=null;this.activeInteractionOptions=null;this.pendingMeasurementOptions=null;this.previewLine=null;this.previewLabel=null;this.snapMarker=null;this.originalCursor="";this.cursorHidden=!1;this.defaultOptions={lineColor:16711680,labelColor:"#ffffff",lineWidth:2,fontSize:16,fontFamily:"Arial, sans-serif",snapMode:"vertex",snapEnabled:!0,snapDistance:.05,targets:[],isDynamic:!1};this.previewColor=65535;this.markerColor=65280;this.markerSize=.08;this.markerVisible=!0;this.isEditMode=!1;this.editingMeasurement=null;this.editingPoint=null;this.startEditSprite=null;this.endEditSprite=null;this.editSpriteMaterial=null;this.isDragging=!1;this.onMouseClick=e=>{if(!this.isInteractive)return;let t=this.getSnapResult(e);t&&(this.currentMeasurement?this.completeMeasurement(t):this.startMeasurement(t))};this.onMouseMove=e=>{if(!this.isInteractive)return;let t=this.getSnapResult(e);if(!t){this.hideSnapMarker(),this.showCursor();return}this.currentMeasurement?(this.updateSnapMarker(t.point,!0),this.hideCursor(),this.updatePreview(t.point)):(this.updateSnapMarker(t.point,!0),this.hideCursor())};this.onKeyDown=e=>{this.isInteractive&&e.key==="Escape"&&this.cancelCurrentMeasurement()};this.onEditMouseDown=e=>{if(!this.isEditMode||!this.domElement)return;let t=new E.Vector2,i=this.domElement.getBoundingClientRect();t.x=(e.clientX-i.left)/i.width*2-1,t.y=-((e.clientY-i.top)/i.height)*2+1,this.raycaster.setFromCamera(t,this.camera);let o=[this.startEditSprite,this.endEditSprite].filter(r=>r!==null),s=this.raycaster.intersectObjects(o);if(s.length>0){let r=s[0].object;this.editingPoint=r.userData.editPoint,this.isDragging=!0,this.disableControls(),this.editingPoint==="start"&&this.startEditSprite?this.startEditSprite.visible=!1:this.editingPoint==="end"&&this.endEditSprite&&(this.endEditSprite.visible=!1),this.createSnapMarker(),this.snapMarker&&(this.snapMarker.position.copy(r.position),this.snapMarker.visible=!0),this.hideCursor()}};this.onEditMouseMove=e=>{if(!this.isEditMode||!this.isDragging||!this.editingMeasurement)return;let t=this.getSnapResult(e);t&&(this.snapMarker&&(this.snapMarker.position.copy(t.point),this.snapMarker.visible=this.markerVisible),this.editingPoint==="start"?this.updateMeasurementPreview(t.point,this.editingMeasurement.end.position):this.editingPoint==="end"&&this.updateMeasurementPreview(this.editingMeasurement.start.position,t.point))};this.onEditMouseUp=e=>{if(!this.isEditMode||!this.isDragging||!this.editingMeasurement||!this.editingPoint)return;let t=this.getSnapResult(e);if(!t){this.cancelEdit();return}let i=this.editingPoint==="start"?this.editingMeasurement.start:this.editingMeasurement.end;if(i.position.copy(t.point),this.editingMeasurement.options.isDynamic&&t.object){let l=t.object.worldToLocal(t.point.clone());i.anchor={object:t.object,localPosition:l}}else i.anchor=void 0;let s=this.editingMeasurement.start.position.distanceTo(this.editingMeasurement.end.position);this.editingMeasurement.distance=s;let r=[this.editingMeasurement.start.position,this.editingMeasurement.end.position];this.editingMeasurement.line.geometry.setFromPoints(r),this.editingMeasurement.line.geometry.attributes.position.needsUpdate=!0;let a=this.editingMeasurement.start.position.clone().add(this.editingMeasurement.end.position).multiplyScalar(.5);this.editingMeasurement.label.position.copy(a),this.updateLabelText(this.editingMeasurement.label.element,s),this.startEditSprite&&(this.startEditSprite.position.copy(this.editingMeasurement.start.position),this.startEditSprite.visible=!0),this.endEditSprite&&(this.endEditSprite.position.copy(this.editingMeasurement.end.position),this.endEditSprite.visible=!0),this.removeSnapMarker(),this.showCursor(),this.enableControls(),this.dispatchEvent({type:"measurementUpdated",measurement:this.editingMeasurement}),this.isDragging=!1,this.editingPoint=null};this.scene=e,this.camera=t;let{domElement:o,controls:s}=i;o&&(this.domElement=o),s&&(this.controls=s),this.previewMaterial=new E.LineDashedMaterial({color:this.previewColor,linewidth:this.defaultOptions.lineWidth,dashSize:.1,gapSize:.05}),this.markerMaterial=new E.SpriteMaterial({map:this.createCrosshairTexture(),color:this.markerColor,transparent:!0,opacity:.8,sizeAttenuation:!1,depthTest:!1}),this.editSpriteMaterial=new E.SpriteMaterial({map:this.createDotTexture(),color:16755200,transparent:!0,opacity:.9,sizeAttenuation:!1,depthTest:!1}),this.raycaster.params.Line.threshold=.01,this.raycaster.params.Points.threshold=.01}createCrosshairTexture(){let t=document.createElement("canvas");t.width=64,t.height=64;let i=t.getContext("2d"),o=64/2,s=64/2,r=20,a=6;i.clearRect(0,0,64,64),i.strokeStyle="#ffffff",i.lineWidth=3,i.lineCap="round",i.beginPath(),i.moveTo(o-r,s),i.lineTo(o-a,s),i.moveTo(o+a,s),i.lineTo(o+r,s),i.moveTo(o,s-r),i.lineTo(o,s-a),i.moveTo(o,s+a),i.lineTo(o,s+r),i.stroke(),i.strokeStyle="#000000",i.lineWidth=5,i.globalCompositeOperation="destination-over",i.beginPath(),i.moveTo(o-r,s),i.lineTo(o-a,s),i.moveTo(o+a,s),i.lineTo(o+r,s),i.moveTo(o,s-r),i.lineTo(o,s-a),i.moveTo(o,s+a),i.lineTo(o,s+r),i.stroke();let l=new E.CanvasTexture(t);return l.needsUpdate=!0,l}createDotTexture(){let t=document.createElement("canvas");t.width=64,t.height=64;let i=t.getContext("2d"),o=64/2,s=64/2,r=12;i.clearRect(0,0,64,64),i.fillStyle="#ffffff",i.beginPath(),i.arc(o,s,r,0,Math.PI*2),i.fill(),i.strokeStyle="#000000",i.lineWidth=3,i.beginPath(),i.arc(o,s,r,0,Math.PI*2),i.stroke();let a=new E.CanvasTexture(t);return a.needsUpdate=!0,a}createMeasurementPoint(e,t,i){if(!t)return{position:e.clone()};let o=i?.clone()??t.worldToLocal(e.clone());return{position:t.localToWorld(o.clone()),anchor:{object:t,localPosition:o}}}updateMeasurementPoint(e){if(!e.anchor)return!1;let t=e.anchor.localPosition.clone();return e.anchor.object.localToWorld(t),e.position.equals(t)?!1:(e.position.copy(t),!0)}addMeasurement(e,t,i={}){let o=!!(i.startObject||i.endObject),s=this.resolveMeasurementOptions(i,i.isDynamic??o),r=this.createMeasurementPoint(e,i.startObject,i.startLocalPosition),a=this.createMeasurementPoint(t,i.endObject,i.endLocalPosition);return this.addMeasurementFromPoints(r,a,s,{id:i.id})}resolveMeasurementOptions(e={},t){let i;e.targets&&e.targets.length>0?i=e.targets:this.defaultOptions.targets.length>0?i=this.defaultOptions.targets:this.defaultTargets.length>0&&(i=this.defaultTargets);let o=i&&i.length>0?i:this.getAllMeshes(),s=e.isDynamic??t??this.defaultOptions.isDynamic;return{lineColor:e.lineColor??this.defaultOptions.lineColor,labelColor:e.labelColor??this.defaultOptions.labelColor,lineWidth:e.lineWidth??this.defaultOptions.lineWidth,fontSize:e.fontSize??this.defaultOptions.fontSize,fontFamily:e.fontFamily??this.defaultOptions.fontFamily,snapMode:e.snapMode??this.defaultOptions.snapMode,snapEnabled:e.snapEnabled??this.defaultOptions.snapEnabled,snapDistance:e.snapDistance??this.defaultOptions.snapDistance,targets:o,isDynamic:s}}getActiveMeasurementOptions(){return this.isEditMode&&this.editingMeasurement?this.editingMeasurement.options:this.activeInteractionOptions}addDynamicMeasurement(e,t,i=new E.Vector3,o=new E.Vector3){let s=e.localToWorld(i.clone()),r=t.localToWorld(o.clone());return this.addMeasurement(s,r,{startObject:e,endObject:t,startLocalPosition:i,endLocalPosition:o})}addMeasurementToObject(e,t,i=new E.Vector3){let o=t.localToWorld(i.clone());return this.addMeasurement(e,o,{endObject:t,endLocalPosition:i})}addMeasurementFromPoints(e,t,i,o){let s=o?.id||this.generateId(),r=e.position.distanceTo(t.position),a=new E.BufferGeometry().setFromPoints([e.position,t.position]),l=new E.Line(a,new E.LineBasicMaterial({color:i.lineColor,linewidth:i.lineWidth})),d=this.createLabel(r,i),p=e.position.clone().add(t.position).multiplyScalar(.5);d.position.copy(p);let u={id:s,start:e,end:t,line:l,label:d,distance:r,options:{...i,targets:[...i.targets]}};return this.scene.add(l),this.scene.add(d),this.measurements.push(u),this.dispatchEvent({type:"measurementCreated",measurement:u}),u}updateDynamicMeasurements(){let e=!1;for(let t of this.measurements){if(!t.options.isDynamic)continue;let i=!1;if(this.updateMeasurementPoint(t.start)&&(i=!0),this.updateMeasurementPoint(t.end)&&(i=!0),i){let o=t.start.position.distanceTo(t.end.position);t.distance=o;let s=[t.start.position,t.end.position];t.line.geometry.setFromPoints(s),t.line.geometry.attributes.position.needsUpdate=!0;let r=t.start.position.clone().add(t.end.position).multiplyScalar(.5);t.label.position.copy(r),this.updateLabelText(t.label.element,o),e=!0}}return e}setDynamicMode(e){this.setDefaultMeasurementOptions({isDynamic:e})}getDynamicMode(){return this.defaultOptions.isDynamic}enterEditMode(e,t){this.exitEditMode();let i;if(typeof e=="string"?i=this.measurements.find(s=>s.id===e):i=this.measurements[e],!i){console.warn("Measurement not found:",e);return}if(!this.domElement){console.warn("DOM element not set. Call setDomElement() or enableInteraction() first.");return}this.isEditMode=!0,this.editingMeasurement=i;let o=t&&t.length>0?t:i.options.targets.length>0?i.options.targets:this.getAllMeshes();this.activeTargets=o,t&&t.length>0&&(i.options.targets=[...t]),this.createEditSprites(),this.domElement.addEventListener("mousedown",this.onEditMouseDown),this.domElement.addEventListener("mousemove",this.onEditMouseMove),this.domElement.addEventListener("mouseup",this.onEditMouseUp),this.domElement.style.cursor="pointer",this.dispatchEvent({type:"editModeEntered",measurement:i})}exitEditMode(){if(!this.isEditMode)return;let e=this.editingMeasurement;this.removeEditSprites(),this.domElement&&(this.domElement.removeEventListener("mousedown",this.onEditMouseDown),this.domElement.removeEventListener("mousemove",this.onEditMouseMove),this.domElement.removeEventListener("mouseup",this.onEditMouseUp),this.domElement.style.cursor=this.isInteractive?"crosshair":"default"),this.isEditMode=!1,this.editingMeasurement=null,this.editingPoint=null,this.isDragging=!1,this.activeTargets=[],e&&this.dispatchEvent({type:"editModeExited",measurement:e})}setDomElement(e){this.domElement=e}setControls(e){this.controls=e}setTargetObjects(e){this.defaultTargets=e.length>0?e:this.getAllMeshes(),this.defaultOptions.targets=[...this.defaultTargets]}setDefaultMeasurementOptions(e){e.lineColor!==void 0&&(this.defaultOptions.lineColor=e.lineColor),e.labelColor!==void 0&&(this.defaultOptions.labelColor=e.labelColor),e.lineWidth!==void 0&&(this.defaultOptions.lineWidth=e.lineWidth),e.fontSize!==void 0&&(this.defaultOptions.fontSize=e.fontSize),e.fontFamily!==void 0&&(this.defaultOptions.fontFamily=e.fontFamily),e.snapMode!==void 0&&(this.defaultOptions.snapMode=e.snapMode),e.snapEnabled!==void 0&&(this.defaultOptions.snapEnabled=e.snapEnabled),e.snapDistance!==void 0&&(this.defaultOptions.snapDistance=e.snapDistance),e.targets!==void 0&&(this.defaultTargets=e.targets,this.defaultOptions.targets=[...e.targets],this.activeInteractionOptions&&(this.activeInteractionOptions.targets=[...e.targets],this.activeTargets=e.targets)),e.isDynamic!==void 0&&(this.defaultOptions.isDynamic=e.isDynamic,this.activeInteractionOptions&&(this.activeInteractionOptions.isDynamic=e.isDynamic)),this.activeInteractionOptions&&(e.lineColor!==void 0&&(this.activeInteractionOptions.lineColor=e.lineColor),e.labelColor!==void 0&&(this.activeInteractionOptions.labelColor=e.labelColor),e.lineWidth!==void 0&&(this.activeInteractionOptions.lineWidth=e.lineWidth),e.fontSize!==void 0&&(this.activeInteractionOptions.fontSize=e.fontSize),e.fontFamily!==void 0&&(this.activeInteractionOptions.fontFamily=e.fontFamily),e.snapMode!==void 0&&(this.activeInteractionOptions.snapMode=e.snapMode),e.snapEnabled!==void 0&&(this.activeInteractionOptions.snapEnabled=e.snapEnabled),e.snapDistance!==void 0&&(this.activeInteractionOptions.snapDistance=e.snapDistance))}disableControls(){this.controls&&(this.controls.enabled=!1)}enableControls(){this.controls&&(this.controls.enabled=!0)}enableInteraction(e={}){this.isInteractive&&this.disableInteraction();let t=this.resolveMeasurementOptions(e);this.activeInteractionOptions={...t,targets:[...t.targets]},this.activeTargets=this.activeInteractionOptions.targets.length>0?this.activeInteractionOptions.targets:this.getAllMeshes(),this.isInteractive=!0,this.domElement&&(this.domElement.addEventListener("click",this.onMouseClick),this.domElement.addEventListener("mousemove",this.onMouseMove),this.domElement.addEventListener("keydown",this.onKeyDown),this.domElement.style.cursor="crosshair"),this.createSnapMarker(),this.dispatchEvent({type:"started"})}disableInteraction(){!this.isInteractive||!this.domElement||(this.exitEditMode(),this.domElement.removeEventListener("click",this.onMouseClick),this.domElement.removeEventListener("mousemove",this.onMouseMove),this.domElement.removeEventListener("keydown",this.onKeyDown),this.showCursor(),this.domElement.style.cursor="default",this.cancelCurrentMeasurement(),this.removeSnapMarker(),this.isInteractive=!1,this.activeInteractionOptions=null,this.activeTargets=[],this.dispatchEvent({type:"ended"}))}undoLast(){if(this.measurements.length===0)return;let e=this.measurements.pop();this.removeMeasurementFromScene(e),this.dispatchEvent({type:"measurementRemoved",measurement:e})}removeMeasurement(e){let t=this.measurements.indexOf(e);t!==-1&&(this.measurements.splice(t,1),this.removeMeasurementFromScene(e),this.dispatchEvent({type:"measurementRemoved",measurement:e}))}clearAll(){let e=this.measurements.length;this.measurements.forEach(t=>{this.removeMeasurementFromScene(t)}),this.measurements=[],this.dispatchEvent({type:"measurementsCleared",count:e})}getMeasurements(){return[...this.measurements]}serializeMeasurementPoint(e){return{position:e.position.toArray(),anchorObjectId:e.anchor?.object.uuid,anchorLocalPosition:e.anchor?e.anchor.localPosition.toArray():void 0}}serialize(){return this.measurements.map(e=>({id:e.id,start:this.serializeMeasurementPoint(e.start),end:this.serializeMeasurementPoint(e.end),distance:e.distance,options:{snapMode:e.options.snapMode,snapEnabled:e.options.snapEnabled,snapDistance:e.options.snapDistance,lineColor:e.options.lineColor,labelColor:e.options.labelColor,lineWidth:e.options.lineWidth,fontSize:e.options.fontSize,fontFamily:e.options.fontFamily,isDynamic:e.options.isDynamic,targetObjectIds:e.options.targets.map(t=>t.uuid)}}))}deserialize(e){this.clearAll(),e.forEach(t=>{let i=new E.Vector3().fromArray(t.start.position),o=new E.Vector3().fromArray(t.end.position),s=t.start.anchorObjectId?this.scene.getObjectByProperty("uuid",t.start.anchorObjectId):null,r=t.end.anchorObjectId?this.scene.getObjectByProperty("uuid",t.end.anchorObjectId):null,a=t.options.targetObjectIds&&t.options.targetObjectIds.length>0?t.options.targetObjectIds.map(l=>this.scene.getObjectByProperty("uuid",l)).filter(l=>l!==void 0):void 0;this.addMeasurement(i,o,{id:t.id,targets:a&&a.length>0?a:void 0,snapMode:t.options.snapMode,snapEnabled:t.options.snapEnabled,snapDistance:t.options.snapDistance,lineColor:t.options.lineColor,labelColor:t.options.labelColor,lineWidth:t.options.lineWidth,fontSize:t.options.fontSize,fontFamily:t.options.fontFamily,isDynamic:t.options.isDynamic,startObject:s||void 0,startLocalPosition:t.start.anchorLocalPosition?new E.Vector3().fromArray(t.start.anchorLocalPosition):void 0,endObject:r||void 0,endLocalPosition:t.end.anchorLocalPosition?new E.Vector3().fromArray(t.end.anchorLocalPosition):void 0})})}dispose(){this.exitEditMode(),this.disableInteraction(),this.clearAll(),this.previewMaterial.dispose(),this.markerMaterial.map&&this.markerMaterial.map.dispose(),this.markerMaterial.dispose(),this.editSpriteMaterial&&(this.editSpriteMaterial.map&&this.editSpriteMaterial.map.dispose(),this.editSpriteMaterial.dispose())}hideCursor(){!this.domElement||this.cursorHidden||(this.originalCursor=this.domElement.style.cursor,this.domElement.style.cursor="none",this.cursorHidden=!0)}showCursor(){!this.domElement||!this.cursorHidden||(this.domElement.style.cursor=this.originalCursor||"crosshair",this.cursorHidden=!1)}createSnapMarker(){this.markerVisible&&(this.snapMarker&&this.scene.remove(this.snapMarker),this.snapMarker=new E.Sprite(this.markerMaterial),this.snapMarker.scale.setScalar(this.markerSize),this.snapMarker.visible=!1,this.snapMarker.renderOrder=999,this.snapMarker.material.depthTest=!1,this.scene.add(this.snapMarker))}updateSnapMarker(e,t=!0){!this.snapMarker||!this.markerVisible||(this.snapMarker.position.copy(e),this.snapMarker.visible=t)}hideSnapMarker(){this.snapMarker&&(this.snapMarker.visible=!1)}removeSnapMarker(){this.snapMarker&&(this.scene.remove(this.snapMarker),this.snapMarker=null)}startMeasurement(e){let t=this.generateId(),i=e.point,o=this.activeInteractionOptions??this.defaultOptions,s={...o,targets:[...o.targets]};this.pendingMeasurementOptions=s,this.hideSnapMarker();let r=new E.BufferGeometry().setFromPoints([i,i]);this.previewLine=new E.Line(r,this.previewMaterial),this.previewLine.computeLineDistances(),this.scene.add(this.previewLine),this.previewLabel=this.createLabel(0,s),this.previewLabel.position.copy(i),this.scene.add(this.previewLabel);let a=s.isDynamic&&e.object?this.createMeasurementPoint(i,e.object):this.createMeasurementPoint(i);this.currentMeasurement={id:t,start:a}}updatePreview(e){if(!this.currentMeasurement||!this.previewLine||!this.previewLabel)return;let t=this.currentMeasurement.start,i=t.position.distanceTo(e),o=new E.BufferGeometry().setFromPoints([t.position,e]);this.previewLine.geometry.dispose(),this.previewLine.geometry=o,this.previewLine.computeLineDistances();let s=t.position.clone().add(e).multiplyScalar(.5);this.previewLabel.position.copy(s),this.updateLabelText(this.previewLabel.element,i),this.dispatchEvent({type:"previewUpdated",start:t.position,current:e,distance:i})}completeMeasurement(e){if(!this.currentMeasurement)return;let t=this.currentMeasurement.start,i=e.point,o=this.pendingMeasurementOptions??this.activeInteractionOptions??this.defaultOptions;this.disableInteraction(),this.cleanupPreview();let s={...o,targets:[...o.targets]},r=s.isDynamic&&e.object?this.createMeasurementPoint(i,e.object):this.createMeasurementPoint(i);this.addMeasurementFromPoints(t,r,s),this.currentMeasurement=null,this.pendingMeasurementOptions=null,this.createSnapMarker()}cancelCurrentMeasurement(){this.cleanupPreview(),this.currentMeasurement=null,this.pendingMeasurementOptions=null,this.createSnapMarker()}cleanupPreview(){this.previewLine&&(this.scene.remove(this.previewLine),this.previewLine.geometry.dispose(),this.previewLine=null),this.previewLabel&&(this.scene.remove(this.previewLabel),this.previewLabel.element.parentNode&&this.previewLabel.element.parentNode.removeChild(this.previewLabel.element),this.previewLabel=null)}getSnapResult(e){let t=new E.Vector2,i=this.domElement.getBoundingClientRect();t.x=(e.clientX-i.left)/i.width*2-1,t.y=-((e.clientY-i.top)/i.height)*2+1;let o=this.getActiveMeasurementOptions()??this.defaultOptions,s=this.activeTargets.length>0?this.activeTargets:o.targets.length>0?o.targets:this.getAllMeshes();this.raycaster.setFromCamera(t,this.camera);let r=this.raycaster.intersectObjects(s,!0);if(r.length===0)return null;let a=r[0],l=a.point.clone(),d=!1,p="disabled";if(o.snapEnabled){let u=this.performSnapping(a,o);l=u.point,d=u.snapped,p=u.snapMode}return{point:l,originalPoint:a.point,snapped:d,snapMode:p,object:a.object}}performSnapping(e,t){let i=e.point,o=i.clone(),s=!1,r="disabled";if(t.snapMode==="vertex"){let a=this.snapToVertex(e,t.snapDistance);a&&(o=a,s=!0,r="vertex")}else t.snapMode==="face"&&(s=!0,r="face");return{point:o,originalPoint:i,snapped:s,snapMode:r,object:e.object}}snapToVertex(e,t){let i=e.object.geometry;if(!i.attributes.position)return null;let o=i.attributes.position,s=e.object.matrixWorld,r=new E.Vector3,a=1/0,l=!1;for(let d=0;d<o.count;d++){let p=new E.Vector3;p.fromBufferAttribute(o,d),p.applyMatrix4(s);let u=p.distanceTo(e.point);u<t&&u<a&&(a=u,r.copy(p),l=!0)}return l?r:null}createLabel(e,t){let i=document.createElement("div");i.className="measurement-label",Object.assign(i.style,{color:t.labelColor,fontSize:`${t.fontSize}px`,fontFamily:t.fontFamily,fontWeight:"bold",background:"rgba(0, 0, 0, 0.9)",padding:"8px 12px",borderRadius:"8px",border:"2px solid rgba(255, 255, 255, 0.3)",whiteSpace:"nowrap",userSelect:"none",pointerEvents:"auto",boxShadow:"0 2px 8px rgba(0, 0, 0, 0.5)",textShadow:"1px 1px 2px rgba(0, 0, 0, 0.8)",zIndex:"1000",cursor:"pointer"}),this.updateLabelText(i,e);let o=new Ze.CSS2DObject(i);return i.addEventListener("dblclick",s=>{s.stopPropagation();let r=this.measurements.find(a=>a.label===o);r&&this.enterEditMode(r.id)}),o}updateLabelText(e,t){let i=`${t.toFixed(2)}m`;e.textContent=i}removeMeasurementFromScene(e){this.scene.remove(e.line),this.scene.remove(e.label),e.line.geometry.dispose(),e.line.material instanceof E.Material&&e.line.material.dispose(),e.label.element.parentNode&&e.label.element.parentNode.removeChild(e.label.element)}getAllMeshes(){let e=[];return this.scene.traverse(t=>{t instanceof E.Mesh&&e.push(t)}),e}generateId(){return`measurement_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}createEditSprites(){if(!this.editingMeasurement||!this.editSpriteMaterial)return;let e=this.editingMeasurement;this.startEditSprite=new E.Sprite(this.editSpriteMaterial.clone()),this.startEditSprite.position.copy(e.start.position),this.startEditSprite.scale.set(this.markerSize,this.markerSize,1),this.startEditSprite.userData.editPoint="start",this.scene.add(this.startEditSprite),this.endEditSprite=new E.Sprite(this.editSpriteMaterial.clone()),this.endEditSprite.position.copy(e.end.position),this.endEditSprite.scale.set(this.markerSize,this.markerSize,1),this.endEditSprite.userData.editPoint="end",this.scene.add(this.endEditSprite)}removeEditSprites(){this.startEditSprite&&(this.scene.remove(this.startEditSprite),this.startEditSprite.material instanceof E.Material&&this.startEditSprite.material.dispose(),this.startEditSprite=null),this.endEditSprite&&(this.scene.remove(this.endEditSprite),this.endEditSprite.material instanceof E.Material&&this.endEditSprite.material.dispose(),this.endEditSprite=null)}cancelEdit(){this.isDragging=!1,this.editingPoint=null,this.enableControls(),this.startEditSprite&&(this.startEditSprite.visible=!0),this.endEditSprite&&(this.endEditSprite.visible=!0),this.removeSnapMarker(),this.showCursor()}updateMeasurementPreview(e,t){if(!this.editingMeasurement)return;let i=e.distanceTo(t),o=[e,t];this.editingMeasurement.line.geometry.setFromPoints(o),this.editingMeasurement.line.geometry.attributes.position.needsUpdate=!0;let s=e.clone().add(t).multiplyScalar(.5);this.editingMeasurement.label.position.copy(s),this.updateLabelText(this.editingMeasurement.label.element,i)}};var W=Y(require("three")),Ue=require("three/examples/jsm/lines/LineSegments2.js"),qe=require("three/examples/jsm/lines/LineSegmentsGeometry.js"),$e=require("three/examples/jsm/lines/LineMaterial.js"),ge=class ge{constructor(n,e={}){this.outlineData=new Map;this.lineMaterial=null;this.composer=null;this.idRenderTarget=null;this.idMaterial=null;this.handleResize=()=>{let n=this.renderer.getSize(new W.Vector2);this.lineMaterial&&this.lineMaterial.resolution.set(n.width,n.height),this.idRenderTarget&&this.idRenderTarget.setSize(n.width,n.height),this.composer&&this.composer.setSize(n.width,n.height)};this.renderer=n,this.options={outlineColor:e.outlineColor??16711680,edgeLineWidth:e.edgeLineWidth??2,edgeLineColor:e.edgeLineColor??16711680,edgeThreshold:e.edgeThreshold??30,outlineScale:e.outlineScale??1.02,enableSilhouette:e.enableSilhouette??!0,enableEdgeLines:e.enableEdgeLines??!0,edgeStrength:e.edgeStrength??1,excludeFilter:e.excludeFilter??ge.defaultExcludeFilter};let t=n.getSize(new W.Vector2);this.lineMaterial=new $e.LineMaterial({color:this.options.edgeLineColor,linewidth:this.options.edgeLineWidth,resolution:new W.Vector2(t.width,t.height)}),window.addEventListener("resize",this.handleResize)}addObjects(n){n.forEach(e=>this.addObject(e))}addObject(n){let e=n.uuid;if(this.outlineData.has(e)){console.warn(`Object ${n.name||e} is already outlined`);return}let t=[];n.traverse(i=>{if(!this.isMesh(i)||this.options.excludeFilter(i))return;let o=i,s={originalObject:o,parent:o.parent};this.options.enableSilhouette&&(s.silhouetteMesh=this.createSilhouette(o),o.parent.add(s.silhouetteMesh)),this.options.enableEdgeLines&&(s.edgeLines=this.createEdgeLines(o),o.parent.add(s.edgeLines)),t.push(s)}),t.length>0&&this.outlineData.set(e,t)}removeObjects(n){n.forEach(e=>this.removeObject(e))}removeObject(n){let e=n.uuid,t=this.outlineData.get(e);t&&(t.forEach(i=>{i.silhouetteMesh&&(i.parent.remove(i.silhouetteMesh),this.disposeMesh(i.silhouetteMesh)),i.edgeLines&&(i.parent.remove(i.edgeLines),this.disposeLineSegments(i.edgeLines)),i.originalObject.userData.outlineIdColor&&delete i.originalObject.userData.outlineIdColor}),this.outlineData.delete(e))}clearAll(){Array.from(this.outlineData.keys()).forEach(e=>{let t=this.outlineData.get(e);t&&t.length>0&&this.removeObject(t[0].originalObject.parent)})}update(){this.outlineData.forEach(n=>{n.forEach(e=>{let t=e.originalObject;e.silhouetteMesh&&(e.silhouetteMesh.position.copy(t.position),e.silhouetteMesh.rotation.copy(t.rotation),e.silhouetteMesh.quaternion.copy(t.quaternion),e.silhouetteMesh.scale.copy(t.scale),e.silhouetteMesh.scale.multiplyScalar(this.options.outlineScale)),e.edgeLines&&(e.edgeLines.position.copy(t.position),e.edgeLines.rotation.copy(t.rotation),e.edgeLines.quaternion.copy(t.quaternion),e.edgeLines.scale.copy(t.scale))})})}render(n,e){this.renderIdBuffer(n,e),this.composer.render()}renderIdBuffer(n,e){if(!this.idRenderTarget||!this.idMaterial)return;let t=this.renderer.getRenderTarget(),i=n.overrideMaterial,o=new Map;n.traverse(s=>{o.set(s,s.visible),this.isMesh(s)&&!s.userData.outlineIdColor&&(s.visible=!1)}),n.overrideMaterial=this.idMaterial,n.traverse(s=>{if(!this.isMesh(s))return;let r=s;r.onBeforeRender=()=>{let a=r.userData.outlineIdColor;a&&this.idMaterial.color.copy(a)}}),this.renderer.setRenderTarget(this.idRenderTarget),this.renderer.clear(),this.renderer.render(n,e),n.traverse(s=>{if(!this.isMesh(s))return;s.onBeforeRender=()=>{};let r=o.get(s);r!==void 0&&(s.visible=r)}),n.overrideMaterial=i,this.renderer.setRenderTarget(t)}setOptions(n){let e=n.outlineColor!==void 0||n.edgeLineColor!==void 0||n.edgeThreshold!==void 0||n.enableSilhouette!==void 0||n.enableEdgeLines!==void 0;if(Object.assign(this.options,n),n.edgeLineWidth!==void 0&&this.lineMaterial&&(this.lineMaterial.linewidth=n.edgeLineWidth),n.edgeLineColor!==void 0&&this.lineMaterial&&this.lineMaterial.color.setHex(n.edgeLineColor),e){let t=[];this.outlineData.forEach(i=>{if(i.length>0){let o=i[0].originalObject;for(;o.parent&&!this.outlineData.has(o.parent.uuid);)o=o.parent;t.push(o)}}),this.clearAll(),this.addObjects(t)}}createSilhouette(n){let e=n.clone();return e.material=new W.MeshBasicMaterial({color:this.options.outlineColor,side:W.BackSide}),e.renderOrder=-1,e.scale.multiplyScalar(this.options.outlineScale),e.userData.excludeOutline=!0,e}createEdgeLines(n){if(!this.lineMaterial)throw new Error("Line material not initialized");let e=new W.EdgesGeometry(n.geometry,this.options.edgeThreshold),t=new qe.LineSegmentsGeometry,i=e.attributes.position.array;t.setPositions(i);let o=new Ue.LineSegments2(t,this.lineMaterial);return o.computeLineDistances(),o.scale.copy(n.scale),o.rotation.copy(n.rotation),o.position.copy(n.position),o.userData.excludeOutline=!0,e.dispose(),o}isMesh(n){return n.isMesh===!0}disposeMesh(n){n.geometry&&n.geometry.dispose(),Array.isArray(n.material)?n.material.forEach(e=>e.dispose()):n.material&&n.material.dispose()}disposeLineSegments(n){n.geometry&&n.geometry.dispose()}dispose(){this.clearAll(),this.lineMaterial&&this.lineMaterial.dispose(),this.idRenderTarget&&this.idRenderTarget.dispose(),this.idMaterial&&this.idMaterial.dispose(),this.composer&&(this.composer=null),window.removeEventListener("resize",this.handleResize)}};ge.defaultExcludeFilter=n=>{if(n.type==="Line2"||n.type==="LineSegments2"||n.type.includes("Helper")||n.userData.excludeOutline)return!0;let e=n.name.toLowerCase();return!!(e.includes("arrow")||e.includes("gizmo")||e.includes("control"))};var Ee=ge;var v=Y(require("three")),Ct=1440*60*1e3,C=Math.PI/180,Rt=180/Math.PI,Ht=2440588,Lt=2451545,N=(c,n,e)=>Math.min(Math.max(c,n),e),Le=c=>((c+180)%360+360)%360-180,ot=c=>c%4===0&&c%100!==0||c%400===0,Ne=(c,n)=>{let e=ot(n)?366:365;return N(Math.floor(c),1,e)},Ke=c=>{let n=c%24;return n<0?n+24:n},Ot=new v.Color(16747612),Dt=new v.Color(16757898),Pt=new v.Color(16750950),zt=new v.Color(3549732),Je=new v.Color(12109270),At=c=>c.valueOf()/Ct-.5+Ht,et=c=>At(c)-Lt,tt=c=>C*(357.5291+.98560028*c),it=c=>{let n=C*(1.9148*Math.sin(c)+.02*Math.sin(2*c)+3e-4*Math.sin(3*c)),e=C*102.9372;return c+n+e+Math.PI},_t=c=>{let n=C*23.4397;return Math.asin(Math.sin(n)*Math.sin(c))},It=c=>{let n=C*23.4397;return Math.atan2(Math.sin(c)*Math.cos(n),Math.cos(c))},st=(c,n)=>C*(280.16+360.9856235*c)-n,kt=(c,n,e)=>Math.atan2(Math.sin(c),Math.cos(c)*Math.sin(n)-Math.tan(e)*Math.cos(n)),jt=(c,n,e)=>Math.asin(Math.sin(n)*Math.sin(e)+Math.cos(n)*Math.cos(e)*Math.cos(c)),Ft=c=>{let n=Date.UTC(c.getUTCFullYear(),0,0),e=c.getTime()-n;return Math.floor(e/(1440*60*1e3))},Vt=c=>C*(134.963+13.064993*c),Yt=c=>C*(218.316+13.176396*c),Wt=c=>C*(125.044-.052954*c),Qt=(c,n,e,t)=>{let i=C*1.274*Math.sin(2*c-2*e-n),o=C*.658*Math.sin(2*c-2*e),s=C*.186*Math.sin(e);return c+i+o+s},Bt=(c,n)=>C*5.128*Math.sin(c-n),Xt=(c,n,e)=>Math.atan2(Math.sin(c),Math.cos(c)*Math.sin(n)-Math.tan(e)*Math.cos(n)),Gt=(c,n,e)=>Math.asin(Math.sin(n)*Math.sin(e)+Math.cos(n)*Math.cos(e)*Math.cos(c)),Zt=(c,n)=>{let e=c-n;return Math.atan2(Math.sin(e),Math.cos(e))},Ut=c=>(1+Math.cos(c))/2,qt=(c,n)=>{let e=N(Math.sin(n)+.1,0,1);switch(c){case"sunny":return{sunIntensity:2.5*e,sunColor:new v.Color(16773839),ambientIntensity:.25+.45*e,ambientColor:new v.Color(16115663),hemisphereIntensity:.4+.4*e,hemisphereSkyColor:new v.Color(12114175),hemisphereGroundColor:new v.Color(16044458),shadowBias:-1e-4};case"partly-cloudy":return{sunIntensity:1.1*e,sunColor:new v.Color(16774885),ambientIntensity:.45+.35*e,ambientColor:new v.Color(15265009),hemisphereIntensity:.5+.3*e,hemisphereSkyColor:new v.Color(13162475),hemisphereGroundColor:new v.Color(15129026),shadowBias:-1e-4};case"overcast":return{sunIntensity:.35*e,sunColor:new v.Color(15791359),ambientIntensity:.75,ambientColor:new v.Color(14278117),hemisphereIntensity:.8,hemisphereSkyColor:new v.Color(13489631),hemisphereGroundColor:new v.Color(13158600),shadowBias:-1e-4};default:return{sunIntensity:1*e,sunColor:new v.Color(16767411),ambientIntensity:.35+.25*e,ambientColor:new v.Color(16769988),hemisphereIntensity:.4+.3*e,hemisphereSkyColor:new v.Color(16763043),hemisphereGroundColor:new v.Color(6243898),shadowBias:-2e-4}}},Oe=class extends v.EventDispatcher{constructor(e,t={}){super();this.createdLight=!1;this.createdHemisphere=!1;this.createdMoonLight=!1;this.scene=e;let i=t.latitude??51.5072,o=t.longitude??-.1276;this.latitude=N(i,-90,90),this.longitude=Le(o),this.referenceYear=t.referenceYear??new Date().getUTCFullYear(),this.dayOfYear=Ne(t.dayOfYear??172,this.referenceYear),this.timeOfDay=Ke(t.timeOfDay??12),this.timeZoneOffsetMinutes=t.timeZoneOffsetMinutes??0,this.weather=t.weather??"sunny",this.useSystemTime=t.useSystemTime??!1,this.lightDistance=t.lightDistance??150,this.shadowCameraSize=t.shadowCameraSize??100,this.shadowCameraFar=t.shadowCameraFar??600,this.enableMoonLight=t.enableMoonLight??!0,this.minMoonIllumination=t.minMoonIllumination??.1;let s=t.light;this.light=s??new v.DirectionalLight(16777215,1),this.createdLight=!s,this.light.parent||this.scene.add(this.light),this.light.target.parent||this.scene.add(this.light.target),this.configureShadowMap(this.light),t.ambientLight&&(this.ambientLight=t.ambientLight),(t.enableHemisphereLight??!0)&&(this.hemisphereLight=new v.HemisphereLight(t.hemisphereSkyColor??12244223,t.hemisphereGroundColor??7628634,t.hemisphereIntensity??.45),this.scene.add(this.hemisphereLight),this.createdHemisphere=!0),this.enableMoonLight&&(this.moonLight=new v.DirectionalLight(Je,0),this.scene.add(this.moonLight),this.moonLight.target.position.set(0,0,0),this.scene.add(this.moonLight.target),this.configureShadowMap(this.moonLight),this.createdMoonLight=!0,t.showMoonHelper&&(this.moonHelper=new v.DirectionalLightHelper(this.moonLight,t.moonHelperSize??20,t.moonHelperColor??12109270),this.scene.add(this.moonHelper))),t.showHelper&&(this.helper=new v.DirectionalLightHelper(this.light,t.helperSize??25,t.helperColor??16765567),this.scene.add(this.helper)),this.state={date:new Date,latitude:this.latitude,longitude:this.longitude,solarAzimuth:0,solarAltitude:0,weather:this.weather,useSystemTime:this.useSystemTime},this.update()}getLight(){return this.light}getHemisphereLight(){return this.hemisphereLight}getMoonLight(){return this.moonLight}getMoonPhase(){return this.state.moonPhase}getMoonIllumination(){return this.state.moonIllumination}getState(){return{...this.state,date:new Date(this.state.date.getTime())}}getDayOfYear(){return this.dayOfYear}getTimeOfDay(){return this.timeOfDay}getTimeZoneOffset(){return this.timeZoneOffsetMinutes}getWeather(){return this.weather}usesSystemTime(){return this.useSystemTime}setLatitude(e){let t=N(e,-90,90);t!==this.latitude&&(this.latitude=t,this.update())}setLongitude(e){let t=Le(e);t!==this.longitude&&(this.longitude=t,this.update())}setLocation(e,t){let i=!1,o=N(e,-90,90);o!==this.latitude&&(this.latitude=o,i=!0);let s=Le(t);s!==this.longitude&&(this.longitude=s,i=!0),i&&this.update()}setDayOfYear(e){let t=Ne(e,this.referenceYear);t!==this.dayOfYear&&(this.dayOfYear=t,this.update())}setTimeOfDay(e){let t=Ke(e);t!==this.timeOfDay&&(this.timeOfDay=t,this.update())}setTimeZoneOffset(e){e!==this.timeZoneOffsetMinutes&&(this.timeZoneOffsetMinutes=e,this.update())}setWeather(e){e!==this.weather&&(this.weather=e,this.dispatchEvent({type:"weatherChanged",weather:e}),this.update())}setUseSystemTime(e){e!==this.useSystemTime&&(this.useSystemTime=e,this.dispatchEvent({type:"systemTimeToggled",useSystemTime:this.useSystemTime}),this.update())}update(e){let t=this.computeDate(e),i=this.computeSunPosition(t);this.applySunPosition(i,t);let o;this.enableMoonLight&&this.moonLight&&(o=this.computeMoonPosition(t),this.applyMoonPosition(o)),this.state={date:t,latitude:this.latitude,longitude:this.longitude,solarAzimuth:i.azimuth,solarAltitude:i.altitude,weather:this.weather,useSystemTime:this.useSystemTime,lunarAzimuth:o?.azimuth,lunarAltitude:o?.altitude,moonPhase:o?.phase,moonIllumination:o?.illumination},this.applyWeather(i.altitude),this.dispatchEvent({type:"stateChanged",state:this.getState()})}dispose(){this.helper&&(this.scene.remove(this.helper),this.helper.dispose(),this.helper=void 0),this.moonHelper&&(this.scene.remove(this.moonHelper),this.moonHelper.dispose(),this.moonHelper=void 0),this.createdHemisphere&&this.hemisphereLight&&(this.scene.remove(this.hemisphereLight),this.hemisphereLight.dispose(),this.hemisphereLight=void 0),this.createdMoonLight&&this.moonLight&&(this.scene.remove(this.moonLight),this.moonLight.shadow?.map&&this.moonLight.shadow.map.dispose(),this.moonLight.dispose(),this.moonLight=void 0),this.createdLight&&this.light&&(this.scene.remove(this.light),this.light.shadow?.map&&this.light.shadow.map.dispose(),this.light.dispose())}configureShadowMap(e){e.castShadow=!0;let t=e.shadow.camera;if(t instanceof v.OrthographicCamera&&typeof this.shadowCameraSize=="number"){let i=this.shadowCameraSize;t.left=-i,t.right=i,t.top=i,t.bottom=-i,t.near=.5,t.far=this.shadowCameraFar,t.updateProjectionMatrix()}e.shadow.mapSize.set(2048,2048),e.shadow.bias=-5e-4}computeDate(e){if(e)return new Date(e.getTime());if(this.useSystemTime){let r=new Date;return this.referenceYear=r.getUTCFullYear(),this.dayOfYear=Ft(r),this.timeOfDay=r.getUTCHours()+r.getUTCMinutes()/60+r.getUTCSeconds()/3600,r}let t=ot(this.referenceYear)?366:365,i=N(this.dayOfYear,1,t),o=new Date(Date.UTC(this.referenceYear,0,1,0,0,0,0)),s=(i-1)*24*60+this.timeOfDay*60-this.timeZoneOffsetMinutes;return o.setUTCMinutes(s),o}computeSunPosition(e){let t=et(e),i=-this.longitude*C,o=this.latitude*C,s=tt(t),r=it(s),a=_t(r),l=It(r),p=st(t,i)-l;return{azimuth:kt(p,o,a),altitude:jt(p,o,a)}}applySunPosition(e,t){let i=this.lightDistance,o=e.altitude,s=e.azimuth,r=-i*Math.cos(o)*Math.sin(s),a=i*Math.sin(o),l=i*Math.cos(o)*Math.cos(s);this.light.position.set(r,a,l),this.light.target.position.set(0,0,0),this.light.target.updateMatrixWorld(),this.helper&&this.helper.update(),this.useSystemTime||(this.referenceYear=t.getUTCFullYear())}applyWeather(e){let t=qt(this.weather,e),i=e*Rt,o=-6,r=4-o,a=N((i-o)/r,0,1),l=1-a,d=t.sunColor.lerp(Ot,l),p=t.ambientColor.lerp(Dt,l),u=t.hemisphereSkyColor.lerp(Pt,l),m=t.hemisphereGroundColor.lerp(zt,l),g=t.sunIntensity*a,x=Math.max(.05,t.ambientIntensity*(.3+.7*a)),w=Math.max(.05,t.hemisphereIntensity*(.35+.65*a));this.light.intensity=g,this.light.visible=e>0&&g>.001,this.light.color.copy(d),this.light.shadow.bias=t.shadowBias,this.ambientLight&&(this.ambientLight.intensity=x,this.ambientLight.color.copy(p)),this.hemisphereLight&&(this.hemisphereLight.intensity=w,this.hemisphereLight.color.copy(u),this.hemisphereLight.groundColor.copy(m))}computeMoonPosition(e){let t=et(e),i=-this.longitude*C,o=this.latitude*C,s=tt(t),r=it(s),a=Vt(t),l=Yt(t),d=Wt(t),p=Qt(l,a,s,d),u=Bt(p,d),m=C*23.4397,g=Math.asin(Math.sin(u)*Math.cos(m)+Math.cos(u)*Math.sin(m)*Math.sin(p)),x=Math.atan2(Math.sin(p)*Math.cos(m)-Math.tan(u)*Math.sin(m),Math.cos(p)),S=st(t,i)-x,R=Zt(p,r),M=Ut(R);return{azimuth:Xt(S,o,g),altitude:Gt(S,o,g),phase:R,illumination:M}}applyMoonPosition(e){if(!this.moonLight)return;let t=this.lightDistance,i=e.altitude,o=e.azimuth,s=-t*Math.cos(i)*Math.sin(o),r=t*Math.sin(i),a=t*Math.cos(i)*Math.cos(o);this.moonLight.position.set(s,r,a),this.moonLight.target.position.set(0,0,0),this.moonLight.target.updateMatrixWorld();let l=i>0&&e.illumination>=this.minMoonIllumination,d=.015,p=this.weather==="overcast"?.3:this.weather==="partly-cloudy"?.7:1,u=Math.max(0,Math.sin(i));this.moonLight.intensity=d*e.illumination*p*u,this.moonLight.visible=l,this.moonLight.color.copy(Je),this.moonHelper&&(this.moonHelper.update(),this.moonHelper.visible=l)}};var I=Y(require("three")),ve=class extends I.EventDispatcher{constructor(e,t={}){super();this.mesh=null;this.currentData=null;this.isLoading=!1;this.generatedTextureUrls=new Set;this.scene=e,this.widthSegments=t.widthSegments??50,this.depthSegments=t.depthSegments??50,this.elevationScale=t.elevationScale??1,this.baseColor=t.baseColor??9139029,this.wireframe=t.wireframe??!1,this.textureUrl=t.textureUrl,this.mapboxOptions=t.mapbox,this.receiveShadow=t.receiveShadow??!0,this.castShadow=t.castShadow??!0,this.useDemoData=t.useDemoData??!1}setMapboxOptions(e){this.mapboxOptions=e}async loadTerrain(e,t){if(this.isLoading){console.warn("Terrain is already loading");return}this.isLoading=!0,this.dispatchEvent({type:"updateStarted",center:e,dimensions:t});try{let i=await this.fetchElevationData(e,t);this.currentData=i,this.dispatchEvent({type:"dataLoaded",data:i});let o=await this.resolveTexture(e,t);await this.createMesh(i,o)}catch(i){console.error("Error loading terrain:",i),this.dispatchEvent({type:"error",message:"Failed to load terrain",error:i})}finally{this.isLoading=!1}}async updateTerrain(e,t){if(!this.currentData&&!e){console.warn("No current terrain data and no center provided");return}let i=e||this.currentData.center,o=t||this.currentData.dimensions;await this.loadTerrain(i,o)}async fetchElevationData(e,t){if(this.useDemoData)return this.generateDemoData(e,t);let i=[],o=111320,s=111320*Math.max(Math.abs(Math.cos(e.latitude*Math.PI/180)),1e-6),r=t.depth/o,a=t.width/s,l=r/this.depthSegments,d=a/this.widthSegments,p=e.latitude+r/2,u=e.longitude-a/2;for(let M=0;M<=this.depthSegments;M++)for(let z=0;z<=this.widthSegments;z++)i.push({latitude:p-M*l,longitude:u+z*d});let m=await fetch("https://api.open-elevation.com/api/v1/lookup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({locations:i})});if(!m.ok)throw new Error(`Elevation API error: ${m.statusText}`);let x=(await m.json()).results,w=[],S=1/0,R=-1/0;for(let M=0;M<=this.depthSegments;M++){let z=[];for(let D=0;D<=this.widthSegments;D++){let B=M*(this.widthSegments+1)+D,V=x[B].elevation;z.push(V),S=Math.min(S,V),R=Math.max(R,V)}w.push(z)}return{center:e,dimensions:t,elevations:w,minElevation:S,maxElevation:R}}generateDemoData(e,t){let i=[],o=1/0,s=-1/0,r=e.latitude+e.longitude;for(let a=0;a<=this.depthSegments;a++){let l=[];for(let d=0;d<=this.widthSegments;d++){let p=d/this.widthSegments*4,u=a/this.depthSegments*4,m=0;m+=Math.sin(p+r)*500,m+=Math.cos(u+r)*500,m+=Math.sin(p*2+r)*200,m+=Math.cos(u*2+r)*200,m+=Math.sin(p*4+r)*50,m+=Math.cos(u*4+r)*50,m+=(Math.random()-.5)*30,l.push(m),o=Math.min(o,m),s=Math.max(s,m)}i.push(l)}return{center:e,dimensions:t,elevations:i,minElevation:o,maxElevation:s}}async createMesh(e,t){this.mesh&&(this.scene.remove(this.mesh),this.mesh.geometry.dispose(),Array.isArray(this.mesh.material)?this.mesh.material.forEach(a=>a.dispose()):this.mesh.material.dispose());let i=new I.PlaneGeometry(e.dimensions.width,e.dimensions.depth,this.widthSegments,this.depthSegments),o=i.attributes.position,s=0;for(let a=0;a<=this.depthSegments;a++)for(let l=0;l<=this.widthSegments;l++){let p=(e.elevations[a][l]-e.minElevation)*this.elevationScale;o.setZ(s,p),s++}i.computeVertexNormals();let r;if(t?.url)try{let a=await new I.TextureLoader().loadAsync(t.url);r=new I.MeshStandardMaterial({map:a,wireframe:this.wireframe})}catch(a){console.warn("Failed to load terrain texture, using base color.",a),r=new I.MeshStandardMaterial({color:this.baseColor,wireframe:this.wireframe})}finally{t.revokeOnUse&&this.releaseGeneratedTexture(t.url)}else r=new I.MeshStandardMaterial({color:this.baseColor,wireframe:this.wireframe});this.mesh=new I.Mesh(i,r),this.mesh.rotation.x=-Math.PI/2,this.mesh.receiveShadow=this.receiveShadow,this.mesh.castShadow=this.castShadow,this.scene.add(this.mesh),this.dispatchEvent({type:"meshLoaded",mesh:this.mesh})}async resolveTexture(e,t){if(this.textureUrl)return{url:this.textureUrl,revokeOnUse:!1};if(this.mapboxOptions)try{let i=await this.fetchMapboxTexture(e,t,this.mapboxOptions);return this.generatedTextureUrls.add(i),{url:i,revokeOnUse:!0}}catch(i){console.warn("Failed to fetch Mapbox imagery, falling back to base material.",i);return}}computeBoundingBox(e,t,i){let s=e.latitude*Math.PI/180,r=Math.cos(s),a=111320*Math.max(Math.abs(r),1e-6),l=Math.max(0,i),d=t.width*(1+l),u=t.depth*(1+l)/2/111320,m=d/2/a,g=(M,z,D)=>Math.min(Math.max(M,z),D),x=g(e.latitude-u,-90,90),w=g(e.latitude+u,-90,90),S=g(e.longitude-m,-180,180),R=g(e.longitude+m,-180,180);return{minLat:x,maxLat:w,minLon:S,maxLon:R}}async fetchMapboxTexture(e,t,i){let s=(i.styleId??"mapbox/satellite-v9").replace("mapbox://styles/","").replace(/^\/+/,""),r=Math.min(1280,Math.max(1,Math.floor(i.imageWidth??1024))),a=Math.min(1280,Math.max(1,Math.floor(i.imageHeight??1024))),l=i.highResolution?"@2x":"",d=i.imageFormat??"png",p=i.paddingRatio??.1,u=this.computeBoundingBox(e,t,p),m=`${u.minLon.toFixed(6)},${u.minLat.toFixed(6)},${u.maxLon.toFixed(6)},${u.maxLat.toFixed(6)}`,g=new URLSearchParams({access_token:i.accessToken,format:d}),x=`https://api.mapbox.com/styles/v1/${s}/static/[${m}]/${r}x${a}${l}?${g.toString()}`,w=await fetch(x);if(!w.ok)throw new Error(`Mapbox imagery request failed: ${w.status} ${w.statusText}`);let S=await w.blob();if(typeof URL>"u"||typeof URL.createObjectURL!="function")throw new Error("URL.createObjectURL is not available in this environment");return URL.createObjectURL(S)}releaseGeneratedTexture(e){this.generatedTextureUrls.has(e)&&(typeof URL<"u"&&typeof URL.revokeObjectURL=="function"&&URL.revokeObjectURL(e),this.generatedTextureUrls.delete(e))}getMesh(){return this.mesh}getData(){return this.currentData}isTerrainLoading(){return this.isLoading}dispose(){if(this.mesh&&(this.scene.remove(this.mesh),this.mesh.geometry.dispose(),Array.isArray(this.mesh.material)?this.mesh.material.forEach(e=>e.dispose()):this.mesh.material.dispose(),this.mesh=null),this.currentData=null,this.generatedTextureUrls.size>0)for(let e of Array.from(this.generatedTextureUrls))this.releaseGeneratedTexture(e)}};var h=require("three"),Pe=require("three/examples/jsm/renderers/CSS2DRenderer.js"),k=new h.Raycaster,O=new h.Vector3,U=new h.Vector3,T=new h.Quaternion,ie={X:new h.Vector3(1,0,0),Y:new h.Vector3(0,1,0),Z:new h.Vector3(0,0,1)},De={type:"change"},nt={type:"mouseDown",mode:null},rt={type:"mouseUp",mode:null},at={type:"objectChange"},ze=class extends h.Controls{constructor(n,e=null){super(void 0,e);let t=new Ae(this);this._root=t;let i=new Te;this._gizmo=i,t.add(i);let o=new we;this._plane=o,t.add(o);let s=this;this._overlay=document.createElement("div"),this._overlay.classList.add("absolute"),this._overlay.classList.add("bottom-2"),this._overlay.classList.add("left-80"),this._overlay.classList.add("z-50"),this._overlay.classList.add("bg-gray-700"),this._overlay.classList.add("bg-opacity-70"),this._overlay.classList.add("text-white"),this._overlay.classList.add("p-2"),this._overlay.classList.add("rounded-md"),this._overlay.classList.add("border"),this._overlay.classList.add("border-gray-500"),this._overlay.classList.add("hidden"),e&&e.appendChild(this._overlay);let r=document.createElement("div");r.className="distance-label",r.style.padding="4px 8px",r.style.background="rgba(0, 0, 0, 0.8)",r.style.border="1px solid rgba(255, 255, 255, 0.3)",r.style.borderRadius="4px",r.style.color="#fff",r.style.fontSize="12px",r.style.fontFamily="monospace",r.style.whiteSpace="nowrap",r.style.pointerEvents="none",r.style.userSelect="none",r.textContent="0.00",this._distanceLabel=new Pe.CSS2DObject(r),this._distanceLabel.visible=!1,t.add(this._distanceLabel);let a=document.createElement("div");a.className="rotation-angle-label",a.style.padding="4px 8px",a.style.background="rgba(0, 0, 0, 0.8)",a.style.border="1px solid rgba(255, 255, 255, 0.3)",a.style.borderRadius="4px",a.style.color="#fff",a.style.fontSize="12px",a.style.fontFamily="monospace",a.style.whiteSpace="nowrap",a.style.pointerEvents="none",a.style.userSelect="none",a.textContent="0\xB0",this._rotationAngleLabel=new Pe.CSS2DObject(a),this._rotationAngleLabel.visible=!1,t.add(this._rotationAngleLabel),this._rotationArc=null;function l(D,B){let V=B;Object.defineProperty(s,D,{get:function(){return V!==void 0?V:B},set:function($){V!==$&&(V=$,o[D]=$,i[D]=$,s.dispatchEvent({type:D+"-changed",value:$}),s.dispatchEvent(De))}}),s[D]=B,o[D]=B,i[D]=B}l("camera",n),l("object",void 0),l("enabled",!0),l("axis",null),l("mode","all"),l("translationSnap",null),l("rotationSnap",null),l("scaleSnap",null),l("space","world"),l("size",.75),l("dragging",!1),l("activeMode","translate"),l("showX",!0),l("showY",!0),l("showZ",!0),l("minX",-1/0),l("maxX",1/0),l("minY",-1/0),l("maxY",1/0),l("minZ",-1/0),l("maxZ",1/0),l("minRotation",-2*Math.PI),l("maxRotation",2*Math.PI);let d=new h.Vector3,p=new h.Vector3,u=new h.Quaternion,m=new h.Quaternion,g=new h.Vector3,x=new h.Quaternion,w=new h.Vector3,S=new h.Vector3,R=new h.Vector3,M=0,z=new h.Vector3;l("worldPosition",d),l("worldPositionStart",p),l("worldQuaternion",u),l("worldQuaternionStart",m),l("cameraPosition",g),l("cameraQuaternion",x),l("pointStart",w),l("pointEnd",S),l("rotationAxis",R),l("rotationAngle",M),l("eye",z),this._offset=new h.Vector3,this._startNorm=new h.Vector3,this._endNorm=new h.Vector3,this._cameraScale=new h.Vector3,this._parentPosition=new h.Vector3,this._parentQuaternion=new h.Quaternion,this._parentQuaternionInv=new h.Quaternion,this._parentScale=new h.Vector3,this._worldScaleStart=new h.Vector3,this._worldQuaternionInv=new h.Quaternion,this._worldScale=new h.Vector3,this._tempPosition=new h.Vector3,this._positionStart=new h.Vector3,this._quaternionStart=new h.Quaternion,this._scaleStart=new h.Vector3,this._getPointer=$t.bind(this),this._onPointerDown=Kt.bind(this),this._onPointerHover=Nt.bind(this),this._onPointerMove=Jt.bind(this),this._onPointerUp=ei.bind(this),e!==null&&this.connect(e)}connect(n){super.connect(n),this.domElement?.parentNode&&this.domElement.parentNode.appendChild(this._overlay),this.domElement?.addEventListener("pointerdown",this._onPointerDown),this.domElement?.addEventListener("pointermove",this._onPointerHover),this.domElement?.addEventListener("pointerup",this._onPointerUp),this.domElement&&(this.domElement.style.touchAction="none")}disconnect(){this._overlay.parentNode&&this._overlay.parentNode.removeChild(this._overlay),this.domElement?.removeEventListener("pointerdown",this._onPointerDown),this.domElement?.removeEventListener("pointermove",this._onPointerHover),this.domElement?.removeEventListener("pointermove",this._onPointerMove),this.domElement?.removeEventListener("pointerup",this._onPointerUp),this.domElement&&(this.domElement.style.touchAction="auto")}getHelper(){return this._root}pointerHover(n){if(this.object===void 0||this.dragging===!0)return;n!==null&&k.setFromCamera(n,this.camera);let e=null;this.mode==="all"?(e=q(this._gizmo.picker.scale,k),e||(e=q(this._gizmo.picker.rotate,k)),e||(e=q(this._gizmo.picker.translate,k))):e=q(this._gizmo.picker[this.mode],k),e?this.axis=e.object.name:this.axis=null}pointerDown(n){if(!(this.object===void 0||this.dragging===!0||n!=null&&n.button!==0)&&this.axis!==null){if(n!==null&&k.setFromCamera(n,this.camera),this.mode==="all"){let t=q(this._gizmo.picker.scale,k);t&&t.object.name===this.axis?this.activeMode="scale":(t=q(this._gizmo.picker.rotate,k),t&&t.object.name===this.axis?this.activeMode="rotate":this.activeMode="translate")}else this.activeMode=this.mode;let e=q(this._plane,k,!0);if(e){this.object.updateMatrixWorld(),this.object.parent.updateMatrixWorld(),this._positionStart.copy(this.object.position),this._quaternionStart.copy(this.object.quaternion),this._scaleStart.copy(this.object.scale);let t=_e(this.object);this.worldPositionStart.copy(t),this.object.matrixWorld.decompose(this._tempPosition,this.worldQuaternionStart,this._worldScaleStart),this.pointStart.copy(e.point).sub(this.worldPositionStart)}this.dragging=!0,nt.mode=this.mode==="all"?this.activeMode:this.mode,this.dispatchEvent(nt)}}pointerMove(n){let e=this.axis,t=this.mode==="all"?this.activeMode:this.mode,i=this.object,o=this.space;if(t==="scale"?o="local":(e==="E"||e==="XYZE"||e==="XYZ")&&(o="world"),i===void 0||e===null||this.dragging===!1||n!==null&&n.button!==-1){this._updateDistanceOverlay();return}n!==null&&k.setFromCamera(n,this.camera);let s=q(this._plane,k,!0);if(s){if(this.pointEnd.copy(s.point).sub(this.worldPositionStart),t==="translate")this._offset.copy(this.pointEnd).sub(this.pointStart),o==="local"&&e!=="XYZ"&&this._offset.applyQuaternion(this._worldQuaternionInv),e.indexOf("X")===-1&&(this._offset.x=0),e.indexOf("Y")===-1&&(this._offset.y=0),e.indexOf("Z")===-1&&(this._offset.z=0),o==="local"&&e!=="XYZ"?this._offset.applyQuaternion(this._quaternionStart).divide(this._parentScale):this._offset.applyQuaternion(this._parentQuaternionInv).divide(this._parentScale),i.position.copy(this._offset).add(this._positionStart),this.translationSnap&&(o==="local"&&(i.position.applyQuaternion(T.copy(this._quaternionStart).invert()),e.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),e.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),e.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.position.applyQuaternion(this._quaternionStart)),o==="world"&&(i.parent&&i.position.add(O.setFromMatrixPosition(i.parent.matrixWorld)),e.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),e.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),e.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.parent&&i.position.sub(O.setFromMatrixPosition(i.parent.matrixWorld)))),i.position.x=Math.max(this.minX,Math.min(this.maxX,i.position.x)),i.position.y=Math.max(this.minY,Math.min(this.maxY,i.position.y)),i.position.z=Math.max(this.minZ,Math.min(this.maxZ,i.position.z));else if(t==="scale"){if(e.search("XYZ")!==-1){let r=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(r*=-1),U.set(r,r,r)}else O.copy(this.pointStart),U.copy(this.pointEnd),O.applyQuaternion(this._worldQuaternionInv),U.applyQuaternion(this._worldQuaternionInv),U.divide(O),e.search("X")===-1&&(U.x=1),e.search("Y")===-1&&(U.y=1),e.search("Z")===-1&&(U.z=1);i.scale.copy(this._scaleStart).multiply(U),this.scaleSnap&&(e.search("X")!==-1&&(i.scale.x=Math.round(i.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),e.search("Y")!==-1&&(i.scale.y=Math.round(i.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),e.search("Z")!==-1&&(i.scale.z=Math.round(i.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if(t==="rotate"){this._offset.copy(this.pointEnd).sub(this.pointStart);let r=20/this.worldPosition.distanceTo(O.setFromMatrixPosition(this.camera.matrixWorld)),a=!1;e==="XYZE"?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(O.copy(this.rotationAxis).cross(this.eye))*r):(e==="X"||e==="Y"||e==="Z")&&(this.rotationAxis.copy(ie[e]),O.copy(ie[e]),o==="local"&&O.applyQuaternion(this.worldQuaternion),O.cross(this.eye),O.length()===0?a=!0:this.rotationAngle=this._offset.dot(O.normalize())*r),(e==="E"||a)&&(this.rotationAxis.copy(this.eye),this.rotationAngle=this.pointEnd.angleTo(this.pointStart),this._startNorm.copy(this.pointStart).normalize(),this._endNorm.copy(this.pointEnd).normalize(),this.rotationAngle*=this._endNorm.cross(this._startNorm).dot(this.eye)<0?1:-1),this.rotationSnap&&(this.rotationAngle=Math.round(this.rotationAngle/this.rotationSnap)*this.rotationSnap),this.rotationAngle=Math.max(this.minRotation,Math.min(this.maxRotation,this.rotationAngle)),o==="local"&&e!=="E"&&e!=="XYZE"?(i.quaternion.copy(this._quaternionStart),i.quaternion.multiply(T.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),i.quaternion.copy(T.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),i.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(De),this.dispatchEvent(at),this._updateDistanceOverlay()}}pointerUp(n){n!==null&&n.button!==0||(this.dragging&&this.axis!==null&&(rt.mode=this.mode,this.dispatchEvent(rt)),this.dragging=!1,this.axis=null,this._updateDistanceOverlay())}dispose(){this.disconnect(),this._root.dispose()}attach(n){return this.object=n,this._root.visible=!0,this}detach(){return this.object=void 0,this.axis=null,this._root.visible=!1,this}reset(){this.enabled&&this.dragging&&(this.object.position.copy(this._positionStart),this.object.quaternion.copy(this._quaternionStart),this.object.scale.copy(this._scaleStart),this.dispatchEvent(De),this.dispatchEvent(at),this.pointStart.copy(this.pointEnd))}getRaycaster(){return k}getMode(){return this.mode}setMode(n){}setTranslationSnap(n){this.translationSnap=n}setRotationSnap(n){this.rotationSnap=n}setMinRotation(n){this.minRotation=n}setMaxRotation(n){this.maxRotation=n}setScaleSnap(n){this.scaleSnap=n}setSize(n){this.size=n}setSpace(n){this.space=n}_updateDistanceOverlay(){if(!this.object||!this.dragging){this._overlay.classList.add("hidden"),this._distanceLabel.visible=!1,this._rotationAngleLabel.visible=!1;return}if(this.mode==="translate"||this.mode==="all"&&this.activeMode==="translate"){let n=this.object.position.x-this._positionStart.x,e=this.object.position.y-this._positionStart.y,t=this.object.position.z-this._positionStart.z,i=Math.sqrt(n*n+e*e+t*t),o=new h.Vector3((this._positionStart.x+this.object.position.x)/2,(this._positionStart.y+this.object.position.y)/2,(this._positionStart.z+this.object.position.z)/2);this._distanceLabel.position.copy(o),this._distanceLabel.visible=!0,this._rotationAngleLabel.visible=!1,this._distanceLabel.element.textContent=`${i.toFixed(3)}`,this._overlay.textContent=`X: ${n.toFixed(2)} Y: ${e.toFixed(2)} Z: ${t.toFixed(2)}`}else if(this.mode==="rotate"||this.mode==="all"&&this.activeMode==="rotate"){this._distanceLabel.visible=!1;let n=this.rotationAngle*180/Math.PI,e=.55,t=this.rotationAngle/2,i=new h.Vector3;if(this.axis==="X"||this.axis==="Y"||this.axis==="Z"){let o=ie[this.axis],s=new h.Vector3;Math.abs(o.dot(this.pointStart.clone().normalize()))>.99?s.copy(this.eye).cross(o).normalize():s.copy(this.pointStart).normalize();let r=new h.Quaternion().setFromAxisAngle(o,t);s.applyQuaternion(r),this.space==="local"&&s.applyQuaternion(this.worldQuaternion),s.multiplyScalar(e),i.copy(this.worldPosition).add(s)}else{i.copy(this.worldPosition);let o=this.pointStart.clone().normalize();this.space==="local"&&o.applyQuaternion(this.worldQuaternion),o.multiplyScalar(e),i.add(o)}this._rotationAngleLabel.position.copy(i),this._rotationAngleLabel.visible=!0,this._rotationAngleLabel.element.textContent=`${Math.abs(n).toFixed(1)}\xB0`,this._overlay.textContent=`X: ${(this.object.rotation.x*(180/Math.PI)).toFixed(2)}\xB0 Y: ${(this.object.rotation.y*(180/Math.PI)).toFixed(2)}\xB0 Z: ${(this.object.rotation.z*(180/Math.PI)).toFixed(2)}\xB0`}else this.mode==="scale"&&(this._distanceLabel.visible=!1,this._rotationAngleLabel.visible=!1,this._overlay.textContent=`X: ${this.object.scale.x.toFixed(2)} Y: ${this.object.scale.y.toFixed(2)} Z: ${this.object.scale.z.toFixed(2)}`);this._overlay.classList.remove("hidden")}};function $t(c){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:c.button};{let n=this.domElement.getBoundingClientRect();return{x:(c.clientX-n.left)/n.width*2-1,y:-(c.clientY-n.top)/n.height*2+1,button:c.button}}}function Nt(c){if(this.enabled)switch(c.pointerType){case"mouse":case"pen":this.pointerHover(this._getPointer(c));break}}function Kt(c){this.enabled&&(document.pointerLockElement||this.domElement.setPointerCapture(c.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.pointerHover(this._getPointer(c)),this.pointerDown(this._getPointer(c)))}function Jt(c){this.enabled&&this.pointerMove(this._getPointer(c))}function ei(c){this.enabled&&(this.domElement.releasePointerCapture(c.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.pointerUp(this._getPointer(c)))}function q(c,n,e){let t=n.intersectObject(c,!0);for(let i=0;i<t.length;i++)if(t[i].object.visible||e)return t[i];return!1}var be=new h.Euler,y=new h.Vector3(0,1,0),lt=new h.Vector3(0,0,0),ht=new h.Matrix4,ye=new h.Quaternion,J=new h.Quaternion,Q=new h.Vector3,ct=new h.Matrix4,re=new h.Vector3(1,0,0),K=new h.Vector3(0,1,0),ae=new h.Vector3(0,0,1),Me=new h.Vector3,oe=new h.Vector3,ne=new h.Vector3;function _e(c){let n=new h.Box3;if(c.traverse(t=>{t.isMesh&&t.geometry&&(t.geometry.computeBoundingBox(),n.expandByObject(t))}),n.isEmpty())return c.getWorldPosition(new h.Vector3);let e=new h.Vector3;return n.getCenter(e),e}var Ae=class extends h.Object3D{constructor(n){super(),this.isTransformControlsRoot=!0,this.controls=n,this.visible=!1}updateMatrixWorld(n){let e=this.controls;if(e.object!==void 0){e.object.updateMatrixWorld(),e.object.parent===null?console.error("TransformControls: The attached 3D object must be a part of the scene graph."):e.object.parent.matrixWorld.decompose(e._parentPosition,e._parentQuaternion,e._parentScale);let t=_e(e.object);e.worldPosition.copy(t),e.object.matrixWorld.decompose(e._tempPosition,e.worldQuaternion,e._worldScale),e._parentQuaternionInv.copy(e._parentQuaternion).invert(),e._worldQuaternionInv.copy(e.worldQuaternion).invert()}e.camera.updateMatrixWorld(),e.camera.matrixWorld.decompose(e.cameraPosition,e.cameraQuaternion,e._cameraScale),e.camera.isOrthographicCamera,e.eye.copy(e.cameraPosition).sub(e.worldPosition).normalize(),super.updateMatrixWorld(n)}dispose(){this.traverse(function(n){n.geometry&&n.geometry.dispose(),n.material&&n.material.dispose()})}},Te=class extends h.Object3D{constructor(){super(),this.isTransformControlsGizmo=!0,this.type="TransformControlsGizmo";let n=new h.MeshBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),e=new h.LineBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),t=n.clone();t.opacity=.15;let i=e.clone();i.opacity=.5;let o=n.clone();o.color.setHex(15549272);let s=n.clone();s.color.setHex(8571929);let r=n.clone();r.color.setHex(3245547);let a=n.clone();a.color.setHex(15549272),a.opacity=.5;let l=n.clone();l.color.setHex(8571929),l.opacity=.5;let d=n.clone();d.color.setHex(3245547),d.opacity=.5;let p=n.clone();p.opacity=.25;let u=n.clone();u.color.setHex(16776960),u.opacity=.25,n.clone().color.setHex(16776960),n.clone().color.setHex(7895160);let x=new h.CylinderGeometry(0,.04,.1,12);x.translate(0,.05,0);let w=new h.BoxGeometry(.08,.08,.08);w.translate(0,.04,0);let S=new h.BufferGeometry;S.setAttribute("position",new h.Float32BufferAttribute([0,0,0,1,0,0],3));let R=new h.CylinderGeometry(.02,.02,.5,3);R.translate(0,.25,0);function M(A,le){let F=new h.TorusGeometry(A,.02,3,64,le*Math.PI*2);return F.rotateY(Math.PI/2),F.rotateX(Math.PI/2),F}function z(){let A=new h.BufferGeometry;return A.setAttribute("position",new h.Float32BufferAttribute([0,0,0,1,1,1],3)),A}let D={X:[[new h.Mesh(x,o),[.5,0,0],[0,0,-Math.PI/2]],[new h.Mesh(R,o),[0,0,0],[0,0,-Math.PI/2]]],Y:[[new h.Mesh(x,s),[0,.5,0]],[new h.Mesh(R,s)]],Z:[[new h.Mesh(x,r),[0,0,.5],[Math.PI/2,0,0]],[new h.Mesh(R,r),null,[Math.PI/2,0,0]]]},B={X:[[new h.Mesh(new h.CylinderGeometry(.2,0,.6,4),t),[.3,0,0],[0,0,-Math.PI/2]],[new h.Mesh(new h.CylinderGeometry(.2,0,.6,4),t),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new h.Mesh(new h.CylinderGeometry(.2,0,.6,4),t),[0,.3,0]],[new h.Mesh(new h.CylinderGeometry(.2,0,.6,4),t),[0,-.3,0],[0,0,Math.PI]]],Z:[[new h.Mesh(new h.CylinderGeometry(.2,0,.6,4),t),[0,0,.3],[Math.PI/2,0,0]],[new h.Mesh(new h.CylinderGeometry(.2,0,.6,4),t),[0,0,-.3],[-Math.PI/2,0,0]]]},V={START:[[new h.Mesh(new h.OctahedronGeometry(.01,2),i),null,null,null,"helper"]],END:[[new h.Mesh(new h.OctahedronGeometry(.01,2),i),null,null,null,"helper"]],DELTA:[[new h.Line(z(),i),null,null,null,"helper"]]},$={X:[[new h.Mesh(M(.45,.25),o)]],Y:[[new h.Mesh(M(.45,.25),s),null,[0,0,-Math.PI/2]]],Z:[[new h.Mesh(M(.45,.25),r),null,[0,Math.PI/2,0]]]},pt={AXIS:[],START:[[new h.Line(S.clone(),i),null,null,null,"helper"]],END:[[new h.Line(S.clone(),i),null,null,null,"helper"]],ARC:[[new h.Line(new h.BufferGeometry,i),null,null,null,"helper"]]},dt={X:[[new h.Mesh(M(.45,.25),o)]],Y:[[new h.Mesh(M(.45,.25),s),null,[0,0,-Math.PI/2]]],Z:[[new h.Mesh(M(.45,.25),r),null,[0,Math.PI/2,0]]]},mt={X:[[new h.Mesh(w,o),[.7,0,0],[0,0,-Math.PI/2]]],Y:[[new h.Mesh(w,s),[0,.7,0]]],Z:[[new h.Mesh(w,r),[0,0,.7],[Math.PI/2,0,0]]]},ut={X:[[new h.Mesh(new h.BoxGeometry(.2,.2,.2),t),[.7,0,0],[0,0,-Math.PI/2]]],Y:[[new h.Mesh(new h.BoxGeometry(.2,.2,.2),t),[0,.7,0]]],Z:[[new h.Mesh(new h.BoxGeometry(.2,.2,.2),t),[0,0,.7],[Math.PI/2,0,0]]]},ft={X:[],Y:[],Z:[]};function X(A){let le=new h.Object3D;for(let F in A)for(let ee=A[F].length;ee--;){let P=A[F][ee][0].clone();P.userData.type="gizmo";let he=A[F][ee][1],ce=A[F][ee][2],pe=A[F][ee][3],Et=A[F][ee][4];P.name=F,P.tag=Et,he&&P.position.set(he[0],he[1],he[2]),ce&&P.rotation.set(ce[0],ce[1],ce[2]),pe&&P.scale.set(pe[0],pe[1],pe[2]),P.updateMatrix();let Ie=P.geometry.clone();Ie.applyMatrix4(P.matrix),P.geometry=Ie,P.renderOrder=1/0,P.position.set(0,0,0),P.rotation.set(0,0,0),P.scale.set(1,1,1),le.add(P)}return le}this.gizmo={},this.picker={},this.helper={},this.add(this.gizmo.translate=X(D)),this.add(this.gizmo.rotate=X($)),this.add(this.gizmo.scale=X(mt)),this.add(this.picker.translate=X(B)),this.add(this.picker.rotate=X(dt)),this.add(this.picker.scale=X(ut)),this.add(this.helper.translate=X(V)),this.add(this.helper.rotate=X(pt)),this.add(this.helper.scale=X(ft)),this.picker.translate.visible=!1,this.picker.rotate.visible=!1,this.picker.scale.visible=!1}updateMatrixWorld(n){let t=(this.mode==="scale"?"local":this.space)==="local"?this.worldQuaternion:J;this.mode==="all"?(this.gizmo.translate.visible=!0,this.gizmo.rotate.visible=!0,this.gizmo.scale.visible=!0,this.helper.translate.visible=!0,this.helper.rotate.visible=!0,this.helper.scale.visible=!1):(this.gizmo.translate.visible=this.mode==="translate",this.gizmo.rotate.visible=this.mode==="rotate",this.gizmo.scale.visible=this.mode==="scale",this.helper.translate.visible=this.mode==="translate",this.helper.rotate.visible=this.mode==="rotate",this.helper.scale.visible=this.mode==="scale");let i=[];this.mode==="all"?(i=i.concat(this.picker.translate.children),i=i.concat(this.picker.rotate.children),i=i.concat(this.picker.scale.children),i=i.concat(this.gizmo.translate.children),i=i.concat(this.gizmo.rotate.children),i=i.concat(this.gizmo.scale.children),i=i.concat(this.helper.translate.children),i=i.concat(this.helper.rotate.children)):(i=i.concat(this.picker[this.mode].children),i=i.concat(this.gizmo[this.mode].children),i=i.concat(this.helper[this.mode].children));for(let o=0;o<i.length;o++){let s=i[o];s.visible=!0,s.rotation.set(0,0,0),s.position.copy(this.worldPosition);let r;if(this.camera.isOrthographicCamera?r=(this.camera.top-this.camera.bottom)/this.camera.zoom:r=this.worldPosition.distanceTo(this.cameraPosition)*Math.min(1.9*Math.tan(Math.PI*this.camera.fov/360)/this.camera.zoom,7),s.scale.set(1,1,1).multiplyScalar(r*this.size/4),s.tag==="helper"){if(s.visible=!1,s.name==="AXIS")s.visible=!!this.axis,this.axis==="X"&&(T.setFromEuler(be.set(0,0,0)),s.quaternion.copy(t).multiply(T),Math.abs(y.copy(re).applyQuaternion(t).dot(this.eye))>.9&&(s.visible=!1)),this.axis==="Y"&&(T.setFromEuler(be.set(0,0,Math.PI/2)),s.quaternion.copy(t).multiply(T),Math.abs(y.copy(K).applyQuaternion(t).dot(this.eye))>.9&&(s.visible=!1)),this.axis==="Z"&&(T.setFromEuler(be.set(0,Math.PI/2,0)),s.quaternion.copy(t).multiply(T),Math.abs(y.copy(ae).applyQuaternion(t).dot(this.eye))>.9&&(s.visible=!1)),this.axis==="XYZE"&&(T.setFromEuler(be.set(0,Math.PI/2,0)),y.copy(this.rotationAxis),s.quaternion.setFromRotationMatrix(ht.lookAt(lt,y,K)),s.quaternion.multiply(T),s.visible=this.dragging),this.axis==="E"&&(s.visible=!1);else if(s.name==="START")if(this.mode==="rotate"||this.mode==="all"){s.position.copy(this.worldPosition);let a=this.mode==="rotate"||this.mode==="all"&&this.activeMode==="rotate";if(s.visible=this.dragging&&a,s.visible){let l=this.space;l==="local"?s.quaternion.copy(this.worldQuaternionStart):s.quaternion.copy(J);let d=new h.Vector3;this.axis==="X"||this.axis==="Y"||this.axis==="Z"?d.copy(ie[this.axis]):(this.axis==="E"||this.axis==="XYZE")&&(d.copy(this.rotationAxis),l==="local"&&d.applyQuaternion(this.worldQuaternionStart.clone().invert()));let p=this.pointStart.clone();l==="local"&&p.applyQuaternion(this.worldQuaternionStart.clone().invert());let u=p.dot(d);p.sub(d.clone().multiplyScalar(u)),p.normalize(),p.multiplyScalar(.45);let m=new h.BufferGeometry;m.setAttribute("position",new h.Float32BufferAttribute([0,0,0,p.x,p.y,p.z],3)),s.geometry.dispose(),s.geometry=m}}else s.position.copy(this.worldPositionStart),s.visible=this.dragging&&this.mode==="translate";else if(s.name==="ARC"){let a=this.mode==="rotate"||this.mode==="all"&&this.activeMode==="rotate";if(s.visible=this.dragging&&a,s.visible&&this.rotationAngle!==0){s.position.copy(this.worldPosition);let l=this.space;l==="local"?s.quaternion.copy(this.worldQuaternionStart):s.quaternion.copy(J);let d=.45,p=Math.max(8,Math.floor(Math.abs(this.rotationAngle)*50)),u=[],m=new h.Vector3;this.axis==="X"||this.axis==="Y"||this.axis==="Z"?m.copy(ie[this.axis]):(this.axis==="E"||this.axis==="XYZE")&&(m.copy(this.rotationAxis),l==="local"&&m.applyQuaternion(this.worldQuaternionStart.clone().invert()));let g=this.pointStart.clone();l==="local"&&g.applyQuaternion(this.worldQuaternionStart.clone().invert());let x=g.dot(m);g.sub(m.clone().multiplyScalar(x)),g.normalize();for(let S=0;S<=p;S++){let R=this.rotationAngle*S/p,M=g.clone(),z=new h.Quaternion().setFromAxisAngle(m,R);M.applyQuaternion(z),M.multiplyScalar(d),u.push(M.x,M.y,M.z)}let w=new h.BufferGeometry;w.setAttribute("position",new h.Float32BufferAttribute(u,3)),s.geometry.dispose(),s.geometry=w}}else if(s.name==="END")if(this.mode==="rotate"||this.mode==="all"){s.position.copy(this.worldPosition);let a=this.mode==="rotate"||this.mode==="all"&&this.activeMode==="rotate";if(s.visible=this.dragging&&a,s.visible){let l=this.space;l==="local"?s.quaternion.copy(this.worldQuaternionStart):s.quaternion.copy(J);let d=new h.BufferGeometry,p=new h.Vector3;this.axis==="X"||this.axis==="Y"||this.axis==="Z"?p.copy(ie[this.axis]):(this.axis==="E"||this.axis==="XYZE")&&(p.copy(this.rotationAxis),l==="local"&&p.applyQuaternion(this.worldQuaternionStart.clone().invert()));let u=this.pointStart.clone();l==="local"&&u.applyQuaternion(this.worldQuaternionStart.clone().invert());let m=u.dot(p);u.sub(p.clone().multiplyScalar(m)),u.normalize();let g=u.clone(),x=new h.Quaternion().setFromAxisAngle(p,this.rotationAngle);g.applyQuaternion(x),g.multiplyScalar(.45),d.setAttribute("position",new h.Float32BufferAttribute([0,0,0,g.x,g.y,g.z],3)),s.geometry.dispose(),s.geometry=d}}else s.position.copy(this.worldPosition),s.visible=!1;else s.name==="DELTA"?(s.position.copy(this.worldPositionStart),s.quaternion.copy(this.worldQuaternionStart),O.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),O.applyQuaternion(this.worldQuaternionStart.clone().invert()),s.scale.copy(O),s.visible=this.dragging):(s.quaternion.copy(t),this.dragging?s.position.copy(this.worldPositionStart):s.position.copy(this.worldPosition),this.axis&&(s.visible=this.axis.search(s.name)!==-1));continue}s.quaternion.copy(t),this.mode==="translate"||this.mode==="scale"?(s.name==="X"&&Math.abs(y.copy(re).applyQuaternion(t).dot(this.eye))>.99&&(s.scale.set(1e-10,1e-10,1e-10),s.visible=!1),s.name==="Y"&&Math.abs(y.copy(K).applyQuaternion(t).dot(this.eye))>.99&&(s.scale.set(1e-10,1e-10,1e-10),s.visible=!1),s.name==="Z"&&Math.abs(y.copy(ae).applyQuaternion(t).dot(this.eye))>.99&&(s.scale.set(1e-10,1e-10,1e-10),s.visible=!1),s.name==="XY"&&Math.abs(y.copy(ae).applyQuaternion(t).dot(this.eye))<.2&&(s.scale.set(1e-10,1e-10,1e-10),s.visible=!1),s.name==="YZ"&&Math.abs(y.copy(re).applyQuaternion(t).dot(this.eye))<.2&&(s.scale.set(1e-10,1e-10,1e-10),s.visible=!1),s.name==="XZ"&&Math.abs(y.copy(K).applyQuaternion(t).dot(this.eye))<.2&&(s.scale.set(1e-10,1e-10,1e-10),s.visible=!1)):this.mode==="rotate"&&(ye.copy(t),y.copy(this.eye).applyQuaternion(T.copy(t).invert()),s.name.search("E")!==-1&&s.quaternion.setFromRotationMatrix(ht.lookAt(this.eye,lt,K)),s.name==="X"&&(T.setFromAxisAngle(re,Math.atan2(-y.y,y.z)),T.multiplyQuaternions(ye,T),s.quaternion.copy(T)),s.name==="Y"&&(T.setFromAxisAngle(K,Math.atan2(y.x,y.z)),T.multiplyQuaternions(ye,T),s.quaternion.copy(T)),s.name==="Z"&&(T.setFromAxisAngle(ae,Math.atan2(y.y,y.x)),T.multiplyQuaternions(ye,T),s.quaternion.copy(T))),s.visible=s.visible&&(s.name.indexOf("X")===-1||this.showX),s.visible=s.visible&&(s.name.indexOf("Y")===-1||this.showY),s.visible=s.visible&&(s.name.indexOf("Z")===-1||this.showZ),s.visible=s.visible&&(s.name.indexOf("E")===-1||this.showX&&this.showY&&this.showZ),s.material._color=s.material._color||s.material.color.clone(),s.material._opacity=s.material._opacity||s.material.opacity,s.material.color.copy(s.material._color),s.material.opacity=s.material._opacity,this.dragging&&(s.material.opacity=.2),this.enabled&&this.axis&&(s.name===this.axis?(s.material.color.setHex(16776960),this.dragging||(s.material.opacity=1)):this.axis.split("").some(function(a){return s.name===a})&&(s.material.color.setHex(16776960),this.dragging||(s.material.opacity=1)))}super.updateMatrixWorld(n)}},we=class extends h.Mesh{constructor(){super(new h.PlaneGeometry(1e5,1e5,2,2),new h.MeshBasicMaterial({visible:!1,wireframe:!0,side:h.DoubleSide,transparent:!0,opacity:.1,toneMapped:!1})),this.isTransformControlsPlane=!0,this.type="TransformControlsPlane"}updateMatrixWorld(n){let e=this.space;switch(this.position.copy(this.worldPosition),this.mode==="scale"&&(e="local"),Me.copy(re).applyQuaternion(e==="local"?this.worldQuaternion:J),oe.copy(K).applyQuaternion(e==="local"?this.worldQuaternion:J),ne.copy(ae).applyQuaternion(e==="local"?this.worldQuaternion:J),y.copy(oe),this.mode){case"translate":case"scale":switch(this.axis){case"X":y.copy(this.eye).cross(Me),Q.copy(Me).cross(y);break;case"Y":y.copy(this.eye).cross(oe),Q.copy(oe).cross(y);break;case"Z":y.copy(this.eye).cross(ne),Q.copy(ne).cross(y);break;case"XY":Q.copy(ne);break;case"YZ":Q.copy(Me);break;case"XZ":y.copy(ne),Q.copy(oe);break;case"XYZ":case"E":Q.set(0,0,0);break}break;case"rotate":default:Q.set(0,0,0)}Q.length()===0?this.quaternion.copy(this.cameraQuaternion):(ct.lookAt(O.set(0,0,0),Q,y),this.quaternion.setFromRotationMatrix(ct)),super.updateMatrixWorld(n)}};var f=Y(require("three")),j={x:"#ed4358",y:"#82cc19",z:"#3185eb"},xe=class extends f.EventDispatcher{constructor(e,t,i={}){super();this.viewport=new f.Vector4;this.animating=!1;this.targetPosition=new f.Vector3;this.targetQuaternion=new f.Quaternion;this.q1=new f.Quaternion;this.q2=new f.Quaternion;this.dummy=new f.Object3D;this.radius=0;this.turnRate=2*Math.PI;this.tempVecA=new f.Vector3;this.interactiveObjects=[];this.raycaster=new f.Raycaster;this.mouse=new f.Vector2;this.controls=i.controls,this.camera=this.controls?.camera??e,this.domElement=t||document.body;let o=i.center??(this.controls?this.controls.getTarget(new f.Vector3):new f.Vector3);this.options={container:i.container||document.body,size:i.size||128,position:i.position||"bottom-right",offset:i.offset||{x:20,y:20},center:o.clone(),labels:{x:i.labels?.x||"x",y:i.labels?.y||"y",z:i.labels?.z||"z",...i.labels}},this.center=this.options.center.clone(),this.scene=new f.Scene,this.scene.background=null,this.orthoCamera=new f.OrthographicCamera(-2,2,2,-2,0,4),this.orthoCamera.position.set(0,0,2),this.createAxes(),this.createSprites(),this.setupEventListeners()}syncActiveCamera(){return this.controls&&(this.camera=this.controls.camera),this.camera}getCameraPosition(e){return this.controls?this.controls.getPosition(e):e.copy(this.camera.position)}createAxes(){let e=new f.CylinderGeometry(.04,.04,.8,5).rotateZ(-Math.PI/2).translate(.4,0,0),t=new f.MeshBasicMaterial({color:j.x,toneMapped:!1}),i=new f.MeshBasicMaterial({color:j.y,toneMapped:!1}),o=new f.MeshBasicMaterial({color:j.z,toneMapped:!1});this.axes={x:new f.Mesh(e.clone(),t),y:new f.Mesh(e.clone(),i),z:new f.Mesh(e.clone(),o)},this.axes.y.rotation.z=Math.PI/2,this.axes.z.rotation.y=-Math.PI/2,this.scene.add(this.axes.x),this.scene.add(this.axes.y),this.scene.add(this.axes.z)}createSprites(){let e=this.createSprite(j.x,this.options.labels.x),t=this.createSprite(j.y,this.options.labels.y),i=this.createSprite(j.z,this.options.labels.z),o=this.createSprite(j.x),s=this.createSprite(j.y),r=this.createSprite(j.z);this.sprites={posX:e,posY:t,posZ:i,negX:o,negY:s,negZ:r},this.sprites.posX.position.set(1,0,0),this.sprites.posY.position.set(0,1,0),this.sprites.posZ.position.set(0,0,1),this.sprites.negX.position.set(-1,0,0),this.sprites.negY.position.set(0,-1,0),this.sprites.negZ.position.set(0,0,-1),this.sprites.negX.material.opacity=.2,this.sprites.negY.material.opacity=.2,this.sprites.negZ.material.opacity=.2,this.sprites.posX.userData.type="posX",this.sprites.posY.userData.type="posY",this.sprites.posZ.userData.type="posZ",this.sprites.negX.userData.type="negX",this.sprites.negY.userData.type="negY",this.sprites.negZ.userData.type="negZ",Object.values(this.sprites).forEach(a=>{this.scene.add(a),this.interactiveObjects.push(a)})}createSprite(e,t){let i=window.devicePixelRatio||1,o=128*i,s=28*i,r=document.createElement("canvas");r.width=o,r.height=o;let a=r.getContext("2d");a.imageSmoothingEnabled=!0,a.imageSmoothingQuality="high",a.scale(i,i);let l=o/(2*i),d=s/i;a.beginPath(),a.arc(l,l,d,0,2*Math.PI),a.closePath(),a.fillStyle=e,a.fill(),t&&(a.font="bold 48px Arial, sans-serif",a.textAlign="center",a.textBaseline="middle",a.fillStyle="#ffffff",a.strokeStyle="#000000",a.lineWidth=2,a.strokeText(t,l,l),a.fillText(t,l,l));let p=new f.CanvasTexture(r);return p.colorSpace=f.SRGBColorSpace,p.generateMipmaps=!1,p.minFilter=f.LinearFilter,p.magFilter=f.LinearFilter,new f.Sprite(new f.SpriteMaterial({map:p,toneMapped:!1,alphaTest:.1}))}setupEventListeners(){this.pointerDownHandler=e=>{this.handleClick(e)},this.domElement.addEventListener("pointerdown",this.pointerDownHandler)}render(e){this.renderer=e;let t=this.syncActiveCamera();this.scene.quaternion.copy(t.quaternion).invert(),this.scene.updateMatrixWorld();let i=this.options.size,o=e.domElement.width/e.getPixelRatio(),s=e.domElement.height/e.getPixelRatio(),r,a;switch(this.options.position){case"top-left":r=this.options.offset.x,a=s-i-this.options.offset.y;break;case"top-right":r=o-i-this.options.offset.x,a=s-i-this.options.offset.y;break;case"bottom-left":r=this.options.offset.x,a=this.options.offset.y;break;case"bottom-right":default:r=o-i-this.options.offset.x,a=this.options.offset.y;break}e.getViewport(this.viewport);let l=e.autoClear;e.setViewport(r,a,i,i),e.autoClear=!1,e.setScissorTest(!0),e.setScissor(r,a,i,i),e.clearDepth(),e.render(this.scene,this.orthoCamera),e.setScissorTest(!1),e.autoClear=l,e.setViewport(this.viewport.x,this.viewport.y,this.viewport.z,this.viewport.w)}handleClick(e){if(this.animating||!this.renderer)return!1;this.syncActiveCamera();let t=this.domElement.getBoundingClientRect(),i=this.options.size,o,s;switch(this.options.position){case"top-left":o=t.left+this.options.offset.x,s=t.top+this.options.offset.y;break;case"top-right":o=t.left+t.width-i-this.options.offset.x,s=t.top+this.options.offset.y;break;case"bottom-left":o=t.left+this.options.offset.x,s=t.top+t.height-i-this.options.offset.y;break;case"bottom-right":default:o=t.left+t.width-i-this.options.offset.x,s=t.top+t.height-i-this.options.offset.y;break}if(this.mouse.x=(e.clientX-o)/i*2-1,this.mouse.y=-((e.clientY-s)/i)*2+1,this.mouse.x<-1||this.mouse.x>1||this.mouse.y<-1||this.mouse.y>1)return!1;this.raycaster.setFromCamera(this.mouse,this.orthoCamera);let r=this.raycaster.intersectObjects(this.interactiveObjects);if(r.length>0){let l=r[0].object;return this.prepareAnimationData(l,this.center),this.controls?this.startControlsAnimation(this.center):(this.animating=!0,this.dispatchEvent({type:"animationStart"})),!0}return!1}prepareAnimationData(e,t){switch(e.userData.type){case"posX":this.targetPosition.set(1,0,0),this.targetQuaternion.setFromEuler(new f.Euler(0,Math.PI*.5,0));break;case"posY":this.targetPosition.set(0,1,0),this.targetQuaternion.setFromEuler(new f.Euler(-Math.PI*.5,0,0));break;case"posZ":this.targetPosition.set(0,0,1),this.targetQuaternion.setFromEuler(new f.Euler);break;case"negX":this.targetPosition.set(-1,0,0),this.targetQuaternion.setFromEuler(new f.Euler(0,-Math.PI*.5,0));break;case"negY":this.targetPosition.set(0,-1,0),this.targetQuaternion.setFromEuler(new f.Euler(Math.PI*.5,0,0));break;case"negZ":this.targetPosition.set(0,0,-1),this.targetQuaternion.setFromEuler(new f.Euler(0,Math.PI,0));break;default:console.error("ViewHelper: Invalid axis.");return}let i=this.getCameraPosition(this.tempVecA);this.radius=i.distanceTo(t),this.targetPosition.multiplyScalar(this.radius).add(t),this.dummy.position.copy(t),this.dummy.lookAt(i),this.q1.copy(this.dummy.quaternion),this.dummy.lookAt(this.targetPosition),this.q2.copy(this.dummy.quaternion)}startControlsAnimation(e){let t=this.controls;if(!t)return;t.enabled=!1,t.stop?.(),this.animating=!0,this.dispatchEvent({type:"animationStart"});let i=()=>{t.setLookAt(this.targetPosition.x,this.targetPosition.y,this.targetPosition.z,e.x,e.y,e.z,!0),setTimeout(()=>{t.enabled=!0},100)};try{Promise.resolve(i()).catch(o=>{console.warn("ViewHelper: Unable to set camera look-at.",o)}).finally(()=>{this.animating=!1,this.dispatchEvent({type:"animationEnd"})})}catch(o){console.warn("ViewHelper: Unable to set camera look-at.",o),this.animating=!1,this.dispatchEvent({type:"animationEnd"})}}update(e){if(this.syncActiveCamera(),this.controls||!this.animating)return;let t=e*this.turnRate;this.q1.rotateTowards(this.q2,t),this.camera.position.set(0,0,1).applyQuaternion(this.q1).multiplyScalar(this.radius).add(this.center),this.camera.quaternion.rotateTowards(this.targetQuaternion,t),this.q1.angleTo(this.q2)===0&&(this.animating=!1,this.dispatchEvent({type:"animationEnd"}))}setLabels(e,t,i){e!==void 0&&(this.options.labels.x=e),t!==void 0&&(this.options.labels.y=t),i!==void 0&&(this.options.labels.z=i),this.updateLabels()}updateLabels(){this.sprites.posX.material.map?.dispose(),this.sprites.posY.material.map?.dispose(),this.sprites.posZ.material.map?.dispose(),this.sprites.posX.material.dispose(),this.sprites.posY.material.dispose(),this.sprites.posZ.material.dispose();let e=this.createSprite(j.x,this.options.labels.x),t=this.createSprite(j.y,this.options.labels.y),i=this.createSprite(j.z,this.options.labels.z);this.sprites.posX.material=e.material,this.sprites.posY.material=t.material,this.sprites.posZ.material=i.material}dispose(){this.axes.x.geometry.dispose(),this.axes.y.geometry.dispose(),this.axes.z.geometry.dispose(),this.axes.x.material.dispose(),this.axes.y.material.dispose(),this.axes.z.material.dispose(),Object.values(this.sprites).forEach(e=>{e.material.map?.dispose(),e.material.dispose()}),this.pointerDownHandler&&this.domElement.removeEventListener("pointerdown",this.pointerDownHandler)}};0&&(module.exports={AssetLoader,CompassOverlay,DualCameraControls,InfiniteGrid,MeasurementTool,OutlineTool,SnapMode,SunLightTool,TerrainTool,TransformControls,TransformControlsGizmo,TransformControlsPlane,ViewHelper,calculateBoundingBoxCenter});
168
+ `,transparent:!0,side:L.DoubleSide,depthWrite:!1});let o=new L.Mesh(i,this.gridMaterial);o.renderOrder=-1,o.rotation.x=-Math.PI/2,this.add(o)}setSubdivisions(n){this.subdivisions=n,this.gridMaterial.uniforms.uSize1.value=this.divisions/this.subdivisions,this.eventDispatcher.dispatchEvent({type:"subdivisionsChanged",subdivisions:n})}setDivisions(n){this.divisions=n,this.gridMaterial.uniforms.uSize1.value=this.divisions/this.subdivisions,this.gridMaterial.uniforms.uSize2.value=this.divisions,this.eventDispatcher.dispatchEvent({type:"divisionsChanged",divisions:n})}setColor1(n){typeof n=="number"?this.gridMaterial.uniforms.uColor1.value.setHex(n):this.gridMaterial.uniforms.uColor1.value.copy(n),this.eventDispatcher.dispatchEvent({type:"colorChanged",color:n,colorType:"color1"})}setColor2(n){typeof n=="number"?this.gridMaterial.uniforms.uColor2.value.setHex(n):this.gridMaterial.uniforms.uColor2.value.copy(n),this.eventDispatcher.dispatchEvent({type:"colorChanged",color:n,colorType:"color2"})}setFogColor(n){typeof n=="number"?this.gridMaterial.uniforms.uFogColor.value.setHex(n):this.gridMaterial.uniforms.uFogColor.value.copy(n),this.eventDispatcher.dispatchEvent({type:"colorChanged",color:n,colorType:"fog"})}setFogNear(n){let e=this.gridMaterial.uniforms.uFogFar.value,t=Math.min(n,e);this.gridMaterial.uniforms.uFogNear.value=t,this.eventDispatcher.dispatchEvent({type:"fogChanged",property:"near",value:t})}setFogFar(n){let e=this.gridMaterial.uniforms.uFogNear.value,t=Math.max(n,e);this.gridMaterial.uniforms.uFogFar.value=t,this.eventDispatcher.dispatchEvent({type:"fogChanged",property:"far",value:t})}addGridEventListener(n,e){this.eventDispatcher.addEventListener(n,e)}removeGridEventListener(n,e){this.eventDispatcher.removeEventListener(n,e)}hasGridEventListener(n,e){return this.eventDispatcher.hasEventListener(n,e)}};var E=Y(require("three")),Ze=require("three/examples/jsm/renderers/CSS2DRenderer");var ue=(i=>(i.VERTEX="vertex",i.FACE="face",i.EDGE="edge",i.DISABLED="disabled",i))(ue||{});var fe=class extends E.EventDispatcher{constructor(e,t,i={}){super();this.measurements=[];this.raycaster=new E.Raycaster;this.isInteractive=!1;this.domElement=null;this.controls=null;this.defaultTargets=[];this.activeTargets=[];this.currentMeasurement=null;this.activeInteractionOptions=null;this.pendingMeasurementOptions=null;this.previewLine=null;this.previewLabel=null;this.snapMarker=null;this.originalCursor="";this.cursorHidden=!1;this.defaultOptions={lineColor:16711680,labelColor:"#ffffff",lineWidth:2,fontSize:16,fontFamily:"Arial, sans-serif",snapMode:"vertex",snapEnabled:!0,snapDistance:.05,targets:[],isDynamic:!1};this.previewColor=65535;this.markerColor=65280;this.markerSize=.08;this.markerVisible=!0;this.isEditMode=!1;this.editingMeasurement=null;this.editingPoint=null;this.startEditSprite=null;this.endEditSprite=null;this.editSpriteMaterial=null;this.isDragging=!1;this.onMouseClick=e=>{if(!this.isInteractive)return;let t=this.getSnapResult(e);t&&(this.currentMeasurement?this.completeMeasurement(t):this.startMeasurement(t))};this.onMouseMove=e=>{if(!this.isInteractive)return;let t=this.getSnapResult(e);if(!t){this.hideSnapMarker(),this.showCursor();return}this.currentMeasurement?(this.updateSnapMarker(t.point,!0),this.hideCursor(),this.updatePreview(t.point)):(this.updateSnapMarker(t.point,!0),this.hideCursor())};this.onKeyDown=e=>{this.isInteractive&&e.key==="Escape"&&this.cancelCurrentMeasurement()};this.onEditMouseDown=e=>{if(!this.isEditMode||!this.domElement)return;let t=new E.Vector2,i=this.domElement.getBoundingClientRect();t.x=(e.clientX-i.left)/i.width*2-1,t.y=-((e.clientY-i.top)/i.height)*2+1,this.raycaster.setFromCamera(t,this.camera);let o=[this.startEditSprite,this.endEditSprite].filter(r=>r!==null),s=this.raycaster.intersectObjects(o);if(s.length>0){let r=s[0].object;this.editingPoint=r.userData.editPoint,this.isDragging=!0,this.disableControls(),this.editingPoint==="start"&&this.startEditSprite?this.startEditSprite.visible=!1:this.editingPoint==="end"&&this.endEditSprite&&(this.endEditSprite.visible=!1),this.createSnapMarker(),this.snapMarker&&(this.snapMarker.position.copy(r.position),this.snapMarker.visible=!0),this.hideCursor()}};this.onEditMouseMove=e=>{if(!this.isEditMode||!this.isDragging||!this.editingMeasurement)return;let t=this.getSnapResult(e);t&&(this.snapMarker&&(this.snapMarker.position.copy(t.point),this.snapMarker.visible=this.markerVisible),this.editingPoint==="start"?this.updateMeasurementPreview(t.point,this.editingMeasurement.end.position):this.editingPoint==="end"&&this.updateMeasurementPreview(this.editingMeasurement.start.position,t.point))};this.onEditMouseUp=e=>{if(!this.isEditMode||!this.isDragging||!this.editingMeasurement||!this.editingPoint)return;let t=this.getSnapResult(e);if(!t){this.cancelEdit();return}let i=this.editingPoint==="start"?this.editingMeasurement.start:this.editingMeasurement.end;if(i.position.copy(t.point),this.editingMeasurement.options.isDynamic&&t.object){let l=t.object.worldToLocal(t.point.clone());i.anchor={object:t.object,localPosition:l}}else i.anchor=void 0;let s=this.editingMeasurement.start.position.distanceTo(this.editingMeasurement.end.position);this.editingMeasurement.distance=s;let r=[this.editingMeasurement.start.position,this.editingMeasurement.end.position];this.editingMeasurement.line.geometry.setFromPoints(r),this.editingMeasurement.line.geometry.attributes.position.needsUpdate=!0;let a=this.editingMeasurement.start.position.clone().add(this.editingMeasurement.end.position).multiplyScalar(.5);this.editingMeasurement.label.position.copy(a),this.updateLabelText(this.editingMeasurement.label.element,s),this.startEditSprite&&(this.startEditSprite.position.copy(this.editingMeasurement.start.position),this.startEditSprite.visible=!0),this.endEditSprite&&(this.endEditSprite.position.copy(this.editingMeasurement.end.position),this.endEditSprite.visible=!0),this.removeSnapMarker(),this.showCursor(),this.enableControls(),this.dispatchEvent({type:"measurementUpdated",measurement:this.editingMeasurement}),this.isDragging=!1,this.editingPoint=null};this.scene=e,this.camera=t;let{domElement:o,controls:s}=i;o&&(this.domElement=o),s&&(this.controls=s),this.previewMaterial=new E.LineDashedMaterial({color:this.previewColor,linewidth:this.defaultOptions.lineWidth,dashSize:.1,gapSize:.05}),this.markerMaterial=new E.SpriteMaterial({map:this.createCrosshairTexture(),color:this.markerColor,transparent:!0,opacity:.8,sizeAttenuation:!1,depthTest:!1}),this.editSpriteMaterial=new E.SpriteMaterial({map:this.createDotTexture(),color:16755200,transparent:!0,opacity:.9,sizeAttenuation:!1,depthTest:!1}),this.raycaster.params.Line.threshold=.01,this.raycaster.params.Points.threshold=.01}createCrosshairTexture(){let t=document.createElement("canvas");t.width=64,t.height=64;let i=t.getContext("2d"),o=64/2,s=64/2,r=20,a=6;i.clearRect(0,0,64,64),i.strokeStyle="#ffffff",i.lineWidth=3,i.lineCap="round",i.beginPath(),i.moveTo(o-r,s),i.lineTo(o-a,s),i.moveTo(o+a,s),i.lineTo(o+r,s),i.moveTo(o,s-r),i.lineTo(o,s-a),i.moveTo(o,s+a),i.lineTo(o,s+r),i.stroke(),i.strokeStyle="#000000",i.lineWidth=5,i.globalCompositeOperation="destination-over",i.beginPath(),i.moveTo(o-r,s),i.lineTo(o-a,s),i.moveTo(o+a,s),i.lineTo(o+r,s),i.moveTo(o,s-r),i.lineTo(o,s-a),i.moveTo(o,s+a),i.lineTo(o,s+r),i.stroke();let l=new E.CanvasTexture(t);return l.needsUpdate=!0,l}createDotTexture(){let t=document.createElement("canvas");t.width=64,t.height=64;let i=t.getContext("2d"),o=64/2,s=64/2,r=12;i.clearRect(0,0,64,64),i.fillStyle="#ffffff",i.beginPath(),i.arc(o,s,r,0,Math.PI*2),i.fill(),i.strokeStyle="#000000",i.lineWidth=3,i.beginPath(),i.arc(o,s,r,0,Math.PI*2),i.stroke();let a=new E.CanvasTexture(t);return a.needsUpdate=!0,a}createMeasurementPoint(e,t,i){if(!t)return{position:e.clone()};let o=i?.clone()??t.worldToLocal(e.clone());return{position:t.localToWorld(o.clone()),anchor:{object:t,localPosition:o}}}updateMeasurementPoint(e){if(!e.anchor)return!1;let t=e.anchor.localPosition.clone();return e.anchor.object.localToWorld(t),e.position.equals(t)?!1:(e.position.copy(t),!0)}addMeasurement(e,t,i={}){let o=!!(i.startObject||i.endObject),s=this.resolveMeasurementOptions(i,i.isDynamic??o),r=this.createMeasurementPoint(e,i.startObject,i.startLocalPosition),a=this.createMeasurementPoint(t,i.endObject,i.endLocalPosition);return this.addMeasurementFromPoints(r,a,s,{id:i.id})}resolveMeasurementOptions(e={},t){let i;e.targets&&e.targets.length>0?i=e.targets:this.defaultOptions.targets.length>0?i=this.defaultOptions.targets:this.defaultTargets.length>0&&(i=this.defaultTargets);let o=i&&i.length>0?i:this.getAllMeshes(),s=e.isDynamic??t??this.defaultOptions.isDynamic;return{lineColor:e.lineColor??this.defaultOptions.lineColor,labelColor:e.labelColor??this.defaultOptions.labelColor,lineWidth:e.lineWidth??this.defaultOptions.lineWidth,fontSize:e.fontSize??this.defaultOptions.fontSize,fontFamily:e.fontFamily??this.defaultOptions.fontFamily,snapMode:e.snapMode??this.defaultOptions.snapMode,snapEnabled:e.snapEnabled??this.defaultOptions.snapEnabled,snapDistance:e.snapDistance??this.defaultOptions.snapDistance,targets:o,isDynamic:s}}getActiveMeasurementOptions(){return this.isEditMode&&this.editingMeasurement?this.editingMeasurement.options:this.activeInteractionOptions}addDynamicMeasurement(e,t,i=new E.Vector3,o=new E.Vector3){let s=e.localToWorld(i.clone()),r=t.localToWorld(o.clone());return this.addMeasurement(s,r,{startObject:e,endObject:t,startLocalPosition:i,endLocalPosition:o})}addMeasurementToObject(e,t,i=new E.Vector3){let o=t.localToWorld(i.clone());return this.addMeasurement(e,o,{endObject:t,endLocalPosition:i})}addMeasurementFromPoints(e,t,i,o){let s=o?.id||this.generateId(),r=e.position.distanceTo(t.position),a=new E.BufferGeometry().setFromPoints([e.position,t.position]),l=new E.Line(a,new E.LineBasicMaterial({color:i.lineColor,linewidth:i.lineWidth})),d=this.createLabel(r,i),p=e.position.clone().add(t.position).multiplyScalar(.5);d.position.copy(p);let u={id:s,start:e,end:t,line:l,label:d,distance:r,options:{...i,targets:[...i.targets]}};return this.scene.add(l),this.scene.add(d),this.measurements.push(u),this.dispatchEvent({type:"measurementCreated",measurement:u}),u}updateDynamicMeasurements(){let e=!1;for(let t of this.measurements){if(!t.options.isDynamic)continue;let i=!1;if(this.updateMeasurementPoint(t.start)&&(i=!0),this.updateMeasurementPoint(t.end)&&(i=!0),i){let o=t.start.position.distanceTo(t.end.position);t.distance=o;let s=[t.start.position,t.end.position];t.line.geometry.setFromPoints(s),t.line.geometry.attributes.position.needsUpdate=!0;let r=t.start.position.clone().add(t.end.position).multiplyScalar(.5);t.label.position.copy(r),this.updateLabelText(t.label.element,o),e=!0}}return e}setDynamicMode(e){this.setDefaultMeasurementOptions({isDynamic:e})}getDynamicMode(){return this.defaultOptions.isDynamic}enterEditMode(e,t){this.exitEditMode();let i;if(typeof e=="string"?i=this.measurements.find(s=>s.id===e):i=this.measurements[e],!i){console.warn("Measurement not found:",e);return}if(!this.domElement){console.warn("DOM element not set. Call setDomElement() or enableInteraction() first.");return}this.isEditMode=!0,this.editingMeasurement=i;let o=t&&t.length>0?t:i.options.targets.length>0?i.options.targets:this.getAllMeshes();this.activeTargets=o,t&&t.length>0&&(i.options.targets=[...t]),this.createEditSprites(),this.domElement.addEventListener("mousedown",this.onEditMouseDown),this.domElement.addEventListener("mousemove",this.onEditMouseMove),this.domElement.addEventListener("mouseup",this.onEditMouseUp),this.domElement.style.cursor="pointer",this.dispatchEvent({type:"editModeEntered",measurement:i})}exitEditMode(){if(!this.isEditMode)return;let e=this.editingMeasurement;this.removeEditSprites(),this.domElement&&(this.domElement.removeEventListener("mousedown",this.onEditMouseDown),this.domElement.removeEventListener("mousemove",this.onEditMouseMove),this.domElement.removeEventListener("mouseup",this.onEditMouseUp),this.domElement.style.cursor=this.isInteractive?"crosshair":"default"),this.isEditMode=!1,this.editingMeasurement=null,this.editingPoint=null,this.isDragging=!1,this.activeTargets=[],e&&this.dispatchEvent({type:"editModeExited",measurement:e})}setDomElement(e){this.domElement=e}setControls(e){this.controls=e}setTargetObjects(e){this.defaultTargets=e.length>0?e:this.getAllMeshes(),this.defaultOptions.targets=[...this.defaultTargets]}setDefaultMeasurementOptions(e){e.lineColor!==void 0&&(this.defaultOptions.lineColor=e.lineColor),e.labelColor!==void 0&&(this.defaultOptions.labelColor=e.labelColor),e.lineWidth!==void 0&&(this.defaultOptions.lineWidth=e.lineWidth),e.fontSize!==void 0&&(this.defaultOptions.fontSize=e.fontSize),e.fontFamily!==void 0&&(this.defaultOptions.fontFamily=e.fontFamily),e.snapMode!==void 0&&(this.defaultOptions.snapMode=e.snapMode),e.snapEnabled!==void 0&&(this.defaultOptions.snapEnabled=e.snapEnabled),e.snapDistance!==void 0&&(this.defaultOptions.snapDistance=e.snapDistance),e.targets!==void 0&&(this.defaultTargets=e.targets,this.defaultOptions.targets=[...e.targets],this.activeInteractionOptions&&(this.activeInteractionOptions.targets=[...e.targets],this.activeTargets=e.targets)),e.isDynamic!==void 0&&(this.defaultOptions.isDynamic=e.isDynamic,this.activeInteractionOptions&&(this.activeInteractionOptions.isDynamic=e.isDynamic)),this.activeInteractionOptions&&(e.lineColor!==void 0&&(this.activeInteractionOptions.lineColor=e.lineColor),e.labelColor!==void 0&&(this.activeInteractionOptions.labelColor=e.labelColor),e.lineWidth!==void 0&&(this.activeInteractionOptions.lineWidth=e.lineWidth),e.fontSize!==void 0&&(this.activeInteractionOptions.fontSize=e.fontSize),e.fontFamily!==void 0&&(this.activeInteractionOptions.fontFamily=e.fontFamily),e.snapMode!==void 0&&(this.activeInteractionOptions.snapMode=e.snapMode),e.snapEnabled!==void 0&&(this.activeInteractionOptions.snapEnabled=e.snapEnabled),e.snapDistance!==void 0&&(this.activeInteractionOptions.snapDistance=e.snapDistance))}disableControls(){this.controls&&(this.controls.enabled=!1)}enableControls(){this.controls&&(this.controls.enabled=!0)}enableInteraction(e={}){this.isInteractive&&this.disableInteraction();let t=this.resolveMeasurementOptions(e);this.activeInteractionOptions={...t,targets:[...t.targets]},this.activeTargets=this.activeInteractionOptions.targets.length>0?this.activeInteractionOptions.targets:this.getAllMeshes(),this.isInteractive=!0,this.domElement&&(this.domElement.addEventListener("click",this.onMouseClick),this.domElement.addEventListener("mousemove",this.onMouseMove),this.domElement.addEventListener("keydown",this.onKeyDown),this.domElement.style.cursor="crosshair"),this.createSnapMarker(),this.dispatchEvent({type:"started"})}disableInteraction(){!this.isInteractive||!this.domElement||(this.exitEditMode(),this.domElement.removeEventListener("click",this.onMouseClick),this.domElement.removeEventListener("mousemove",this.onMouseMove),this.domElement.removeEventListener("keydown",this.onKeyDown),this.showCursor(),this.domElement.style.cursor="default",this.cancelCurrentMeasurement(),this.removeSnapMarker(),this.isInteractive=!1,this.activeInteractionOptions=null,this.activeTargets=[],this.dispatchEvent({type:"ended"}))}undoLast(){if(this.measurements.length===0)return;let e=this.measurements.pop();this.removeMeasurementFromScene(e),this.dispatchEvent({type:"measurementRemoved",measurement:e})}removeMeasurement(e){let t=this.measurements.indexOf(e);t!==-1&&(this.measurements.splice(t,1),this.removeMeasurementFromScene(e),this.dispatchEvent({type:"measurementRemoved",measurement:e}))}clearAll(){let e=this.measurements.length;this.measurements.forEach(t=>{this.removeMeasurementFromScene(t)}),this.measurements=[],this.dispatchEvent({type:"measurementsCleared",count:e})}getMeasurements(){return[...this.measurements]}serializeMeasurementPoint(e){return{position:e.position.toArray(),anchorObjectId:e.anchor?.object.uuid,anchorLocalPosition:e.anchor?e.anchor.localPosition.toArray():void 0}}serialize(){return this.measurements.map(e=>({id:e.id,start:this.serializeMeasurementPoint(e.start),end:this.serializeMeasurementPoint(e.end),distance:e.distance,options:{snapMode:e.options.snapMode,snapEnabled:e.options.snapEnabled,snapDistance:e.options.snapDistance,lineColor:e.options.lineColor,labelColor:e.options.labelColor,lineWidth:e.options.lineWidth,fontSize:e.options.fontSize,fontFamily:e.options.fontFamily,isDynamic:e.options.isDynamic,targetObjectIds:e.options.targets.map(t=>t.uuid)}}))}deserialize(e){this.clearAll(),e.forEach(t=>{let i=new E.Vector3().fromArray(t.start.position),o=new E.Vector3().fromArray(t.end.position),s=t.start.anchorObjectId?this.scene.getObjectByProperty("uuid",t.start.anchorObjectId):null,r=t.end.anchorObjectId?this.scene.getObjectByProperty("uuid",t.end.anchorObjectId):null,a=t.options.targetObjectIds&&t.options.targetObjectIds.length>0?t.options.targetObjectIds.map(l=>this.scene.getObjectByProperty("uuid",l)).filter(l=>l!==void 0):void 0;this.addMeasurement(i,o,{id:t.id,targets:a&&a.length>0?a:void 0,snapMode:t.options.snapMode,snapEnabled:t.options.snapEnabled,snapDistance:t.options.snapDistance,lineColor:t.options.lineColor,labelColor:t.options.labelColor,lineWidth:t.options.lineWidth,fontSize:t.options.fontSize,fontFamily:t.options.fontFamily,isDynamic:t.options.isDynamic,startObject:s||void 0,startLocalPosition:t.start.anchorLocalPosition?new E.Vector3().fromArray(t.start.anchorLocalPosition):void 0,endObject:r||void 0,endLocalPosition:t.end.anchorLocalPosition?new E.Vector3().fromArray(t.end.anchorLocalPosition):void 0})})}dispose(){this.exitEditMode(),this.disableInteraction(),this.clearAll(),this.previewMaterial.dispose(),this.markerMaterial.map&&this.markerMaterial.map.dispose(),this.markerMaterial.dispose(),this.editSpriteMaterial&&(this.editSpriteMaterial.map&&this.editSpriteMaterial.map.dispose(),this.editSpriteMaterial.dispose())}hideCursor(){!this.domElement||this.cursorHidden||(this.originalCursor=this.domElement.style.cursor,this.domElement.style.cursor="none",this.cursorHidden=!0)}showCursor(){!this.domElement||!this.cursorHidden||(this.domElement.style.cursor=this.originalCursor||"crosshair",this.cursorHidden=!1)}createSnapMarker(){this.markerVisible&&(this.snapMarker&&this.scene.remove(this.snapMarker),this.snapMarker=new E.Sprite(this.markerMaterial),this.snapMarker.scale.setScalar(this.markerSize),this.snapMarker.visible=!1,this.snapMarker.renderOrder=999,this.snapMarker.material.depthTest=!1,this.scene.add(this.snapMarker))}updateSnapMarker(e,t=!0){!this.snapMarker||!this.markerVisible||(this.snapMarker.position.copy(e),this.snapMarker.visible=t)}hideSnapMarker(){this.snapMarker&&(this.snapMarker.visible=!1)}removeSnapMarker(){this.snapMarker&&(this.scene.remove(this.snapMarker),this.snapMarker=null)}startMeasurement(e){let t=this.generateId(),i=e.point,o=this.activeInteractionOptions??this.defaultOptions,s={...o,targets:[...o.targets]};this.pendingMeasurementOptions=s,this.hideSnapMarker();let r=new E.BufferGeometry().setFromPoints([i,i]);this.previewLine=new E.Line(r,this.previewMaterial),this.previewLine.computeLineDistances(),this.scene.add(this.previewLine),this.previewLabel=this.createLabel(0,s),this.previewLabel.position.copy(i),this.scene.add(this.previewLabel);let a=s.isDynamic&&e.object?this.createMeasurementPoint(i,e.object):this.createMeasurementPoint(i);this.currentMeasurement={id:t,start:a}}updatePreview(e){if(!this.currentMeasurement||!this.previewLine||!this.previewLabel)return;let t=this.currentMeasurement.start,i=t.position.distanceTo(e),o=new E.BufferGeometry().setFromPoints([t.position,e]);this.previewLine.geometry.dispose(),this.previewLine.geometry=o,this.previewLine.computeLineDistances();let s=t.position.clone().add(e).multiplyScalar(.5);this.previewLabel.position.copy(s),this.updateLabelText(this.previewLabel.element,i),this.dispatchEvent({type:"previewUpdated",start:t.position,current:e,distance:i})}completeMeasurement(e){if(!this.currentMeasurement)return;let t=this.currentMeasurement.start,i=e.point,o=this.pendingMeasurementOptions??this.activeInteractionOptions??this.defaultOptions;this.disableInteraction(),this.cleanupPreview();let s={...o,targets:[...o.targets]},r=s.isDynamic&&e.object?this.createMeasurementPoint(i,e.object):this.createMeasurementPoint(i);this.addMeasurementFromPoints(t,r,s),this.currentMeasurement=null,this.pendingMeasurementOptions=null,this.createSnapMarker()}cancelCurrentMeasurement(){this.cleanupPreview(),this.currentMeasurement=null,this.pendingMeasurementOptions=null,this.createSnapMarker()}cleanupPreview(){this.previewLine&&(this.scene.remove(this.previewLine),this.previewLine.geometry.dispose(),this.previewLine=null),this.previewLabel&&(this.scene.remove(this.previewLabel),this.previewLabel.element.parentNode&&this.previewLabel.element.parentNode.removeChild(this.previewLabel.element),this.previewLabel=null)}getSnapResult(e){let t=new E.Vector2,i=this.domElement.getBoundingClientRect();t.x=(e.clientX-i.left)/i.width*2-1,t.y=-((e.clientY-i.top)/i.height)*2+1;let o=this.getActiveMeasurementOptions()??this.defaultOptions,s=this.activeTargets.length>0?this.activeTargets:o.targets.length>0?o.targets:this.getAllMeshes();this.raycaster.setFromCamera(t,this.camera);let r=this.raycaster.intersectObjects(s,!0);if(r.length===0)return null;let a=r[0],l=a.point.clone(),d=!1,p="disabled";if(o.snapEnabled){let u=this.performSnapping(a,o);l=u.point,d=u.snapped,p=u.snapMode}return{point:l,originalPoint:a.point,snapped:d,snapMode:p,object:a.object}}performSnapping(e,t){let i=e.point,o=i.clone(),s=!1,r="disabled";if(t.snapMode==="vertex"){let a=this.snapToVertex(e,t.snapDistance);a&&(o=a,s=!0,r="vertex")}else t.snapMode==="face"&&(s=!0,r="face");return{point:o,originalPoint:i,snapped:s,snapMode:r,object:e.object}}snapToVertex(e,t){let i=e.object.geometry;if(!i.attributes.position)return null;let o=i.attributes.position,s=e.object.matrixWorld,r=new E.Vector3,a=1/0,l=!1;for(let d=0;d<o.count;d++){let p=new E.Vector3;p.fromBufferAttribute(o,d),p.applyMatrix4(s);let u=p.distanceTo(e.point);u<t&&u<a&&(a=u,r.copy(p),l=!0)}return l?r:null}createLabel(e,t){let i=document.createElement("div");i.className="measurement-label",Object.assign(i.style,{color:t.labelColor,fontSize:`${t.fontSize}px`,fontFamily:t.fontFamily,fontWeight:"bold",background:"rgba(0, 0, 0, 0.9)",padding:"8px 12px",borderRadius:"8px",border:"2px solid rgba(255, 255, 255, 0.3)",whiteSpace:"nowrap",userSelect:"none",pointerEvents:"auto",boxShadow:"0 2px 8px rgba(0, 0, 0, 0.5)",textShadow:"1px 1px 2px rgba(0, 0, 0, 0.8)",zIndex:"1000",cursor:"pointer"}),this.updateLabelText(i,e);let o=new Ze.CSS2DObject(i);return i.addEventListener("dblclick",s=>{s.stopPropagation();let r=this.measurements.find(a=>a.label===o);r&&this.enterEditMode(r.id)}),o}updateLabelText(e,t){let i=`${t.toFixed(2)}m`;e.textContent=i}removeMeasurementFromScene(e){this.scene.remove(e.line),this.scene.remove(e.label),e.line.geometry.dispose(),e.line.material instanceof E.Material&&e.line.material.dispose(),e.label.element.parentNode&&e.label.element.parentNode.removeChild(e.label.element)}getAllMeshes(){let e=[];return this.scene.traverse(t=>{t instanceof E.Mesh&&e.push(t)}),e}generateId(){return`measurement_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}createEditSprites(){if(!this.editingMeasurement||!this.editSpriteMaterial)return;let e=this.editingMeasurement;this.startEditSprite=new E.Sprite(this.editSpriteMaterial.clone()),this.startEditSprite.position.copy(e.start.position),this.startEditSprite.scale.set(this.markerSize,this.markerSize,1),this.startEditSprite.userData.editPoint="start",this.scene.add(this.startEditSprite),this.endEditSprite=new E.Sprite(this.editSpriteMaterial.clone()),this.endEditSprite.position.copy(e.end.position),this.endEditSprite.scale.set(this.markerSize,this.markerSize,1),this.endEditSprite.userData.editPoint="end",this.scene.add(this.endEditSprite)}removeEditSprites(){this.startEditSprite&&(this.scene.remove(this.startEditSprite),this.startEditSprite.material instanceof E.Material&&this.startEditSprite.material.dispose(),this.startEditSprite=null),this.endEditSprite&&(this.scene.remove(this.endEditSprite),this.endEditSprite.material instanceof E.Material&&this.endEditSprite.material.dispose(),this.endEditSprite=null)}cancelEdit(){this.isDragging=!1,this.editingPoint=null,this.enableControls(),this.startEditSprite&&(this.startEditSprite.visible=!0),this.endEditSprite&&(this.endEditSprite.visible=!0),this.removeSnapMarker(),this.showCursor()}updateMeasurementPreview(e,t){if(!this.editingMeasurement)return;let i=e.distanceTo(t),o=[e,t];this.editingMeasurement.line.geometry.setFromPoints(o),this.editingMeasurement.line.geometry.attributes.position.needsUpdate=!0;let s=e.clone().add(t).multiplyScalar(.5);this.editingMeasurement.label.position.copy(s),this.updateLabelText(this.editingMeasurement.label.element,i)}};var W=Y(require("three")),Ue=require("three/examples/jsm/lines/LineSegments2.js"),qe=require("three/examples/jsm/lines/LineSegmentsGeometry.js"),$e=require("three/examples/jsm/lines/LineMaterial.js"),ge=class ge{constructor(n,e={}){this.outlineData=new Map;this.lineMaterial=null;this.composer=null;this.idRenderTarget=null;this.idMaterial=null;this.handleResize=()=>{let n=this.renderer.getSize(new W.Vector2);this.lineMaterial&&this.lineMaterial.resolution.set(n.width,n.height),this.idRenderTarget&&this.idRenderTarget.setSize(n.width,n.height),this.composer&&this.composer.setSize(n.width,n.height)};this.renderer=n,this.options={outlineColor:e.outlineColor??16711680,edgeLineWidth:e.edgeLineWidth??2,edgeLineColor:e.edgeLineColor??16711680,edgeThreshold:e.edgeThreshold??30,outlineScale:e.outlineScale??1.02,enableSilhouette:e.enableSilhouette??!0,enableEdgeLines:e.enableEdgeLines??!0,edgeStrength:e.edgeStrength??1,excludeFilter:e.excludeFilter??ge.defaultExcludeFilter};let t=n.getSize(new W.Vector2);this.lineMaterial=new $e.LineMaterial({color:this.options.edgeLineColor,linewidth:this.options.edgeLineWidth,resolution:new W.Vector2(t.width,t.height)}),window.addEventListener("resize",this.handleResize)}addObjects(n){n.forEach(e=>this.addObject(e))}addObject(n){let e=n.uuid;if(this.outlineData.has(e)){console.warn(`Object ${n.name||e} is already outlined`);return}let t=[];n.traverse(i=>{if(!this.isMesh(i)||this.options.excludeFilter(i))return;let o=i,s={originalObject:o,parent:o.parent};this.options.enableSilhouette&&(s.silhouetteMesh=this.createSilhouette(o),o.parent.add(s.silhouetteMesh)),this.options.enableEdgeLines&&(s.edgeLines=this.createEdgeLines(o),o.parent.add(s.edgeLines)),t.push(s)}),t.length>0&&this.outlineData.set(e,t)}removeObjects(n){n.forEach(e=>this.removeObject(e))}removeObject(n){let e=n.uuid,t=this.outlineData.get(e);t&&(t.forEach(i=>{i.silhouetteMesh&&(i.parent.remove(i.silhouetteMesh),this.disposeMesh(i.silhouetteMesh)),i.edgeLines&&(i.parent.remove(i.edgeLines),this.disposeLineSegments(i.edgeLines)),i.originalObject.userData.outlineIdColor&&delete i.originalObject.userData.outlineIdColor}),this.outlineData.delete(e))}clearAll(){Array.from(this.outlineData.keys()).forEach(e=>{let t=this.outlineData.get(e);t&&t.length>0&&this.removeObject(t[0].originalObject.parent)})}update(){this.outlineData.forEach(n=>{n.forEach(e=>{let t=e.originalObject;e.silhouetteMesh&&(e.silhouetteMesh.position.copy(t.position),e.silhouetteMesh.rotation.copy(t.rotation),e.silhouetteMesh.quaternion.copy(t.quaternion),e.silhouetteMesh.scale.copy(t.scale),e.silhouetteMesh.scale.multiplyScalar(this.options.outlineScale)),e.edgeLines&&(e.edgeLines.position.copy(t.position),e.edgeLines.rotation.copy(t.rotation),e.edgeLines.quaternion.copy(t.quaternion),e.edgeLines.scale.copy(t.scale))})})}render(n,e){this.renderIdBuffer(n,e),this.composer.render()}renderIdBuffer(n,e){if(!this.idRenderTarget||!this.idMaterial)return;let t=this.renderer.getRenderTarget(),i=n.overrideMaterial,o=new Map;n.traverse(s=>{o.set(s,s.visible),this.isMesh(s)&&!s.userData.outlineIdColor&&(s.visible=!1)}),n.overrideMaterial=this.idMaterial,n.traverse(s=>{if(!this.isMesh(s))return;let r=s;r.onBeforeRender=()=>{let a=r.userData.outlineIdColor;a&&this.idMaterial.color.copy(a)}}),this.renderer.setRenderTarget(this.idRenderTarget),this.renderer.clear(),this.renderer.render(n,e),n.traverse(s=>{if(!this.isMesh(s))return;s.onBeforeRender=()=>{};let r=o.get(s);r!==void 0&&(s.visible=r)}),n.overrideMaterial=i,this.renderer.setRenderTarget(t)}setOptions(n){let e=n.outlineColor!==void 0||n.edgeLineColor!==void 0||n.edgeThreshold!==void 0||n.enableSilhouette!==void 0||n.enableEdgeLines!==void 0;if(Object.assign(this.options,n),n.edgeLineWidth!==void 0&&this.lineMaterial&&(this.lineMaterial.linewidth=n.edgeLineWidth),n.edgeLineColor!==void 0&&this.lineMaterial&&this.lineMaterial.color.setHex(n.edgeLineColor),e){let t=[];this.outlineData.forEach(i=>{if(i.length>0){let o=i[0].originalObject;for(;o.parent&&!this.outlineData.has(o.parent.uuid);)o=o.parent;t.push(o)}}),this.clearAll(),this.addObjects(t)}}createSilhouette(n){let e=n.clone();return e.material=new W.MeshBasicMaterial({color:this.options.outlineColor,side:W.BackSide}),e.renderOrder=-1,e.scale.multiplyScalar(this.options.outlineScale),e.userData.excludeOutline=!0,e}createEdgeLines(n){if(!this.lineMaterial)throw new Error("Line material not initialized");let e=new W.EdgesGeometry(n.geometry,this.options.edgeThreshold),t=new qe.LineSegmentsGeometry,i=e.attributes.position.array;t.setPositions(i);let o=new Ue.LineSegments2(t,this.lineMaterial);return o.computeLineDistances(),o.scale.copy(n.scale),o.rotation.copy(n.rotation),o.position.copy(n.position),o.userData.excludeOutline=!0,e.dispose(),o}isMesh(n){return n.isMesh===!0}disposeMesh(n){n.geometry&&n.geometry.dispose(),Array.isArray(n.material)?n.material.forEach(e=>e.dispose()):n.material&&n.material.dispose()}disposeLineSegments(n){n.geometry&&n.geometry.dispose()}dispose(){this.clearAll(),this.lineMaterial&&this.lineMaterial.dispose(),this.idRenderTarget&&this.idRenderTarget.dispose(),this.idMaterial&&this.idMaterial.dispose(),this.composer&&(this.composer=null),window.removeEventListener("resize",this.handleResize)}};ge.defaultExcludeFilter=n=>{if(n.type==="Line2"||n.type==="LineSegments2"||n.type.includes("Helper")||n.userData.excludeOutline)return!0;let e=n.name.toLowerCase();return!!(e.includes("arrow")||e.includes("gizmo")||e.includes("control"))};var Ee=ge;var v=Y(require("three")),Ct=1440*60*1e3,C=Math.PI/180,Rt=180/Math.PI,Ht=2440588,Lt=2451545,N=(c,n,e)=>Math.min(Math.max(c,n),e),Le=c=>((c+180)%360+360)%360-180,ot=c=>c%4===0&&c%100!==0||c%400===0,Ne=(c,n)=>{let e=ot(n)?366:365;return N(Math.floor(c),1,e)},Ke=c=>{let n=c%24;return n<0?n+24:n},Ot=new v.Color(16747612),Dt=new v.Color(16757898),Pt=new v.Color(16750950),zt=new v.Color(3549732),Je=new v.Color(12109270),At=c=>c.valueOf()/Ct-.5+Ht,et=c=>At(c)-Lt,tt=c=>C*(357.5291+.98560028*c),it=c=>{let n=C*(1.9148*Math.sin(c)+.02*Math.sin(2*c)+3e-4*Math.sin(3*c)),e=C*102.9372;return c+n+e+Math.PI},_t=c=>{let n=C*23.4397;return Math.asin(Math.sin(n)*Math.sin(c))},It=c=>{let n=C*23.4397;return Math.atan2(Math.sin(c)*Math.cos(n),Math.cos(c))},st=(c,n)=>C*(280.16+360.9856235*c)-n,kt=(c,n,e)=>Math.atan2(Math.sin(c),Math.cos(c)*Math.sin(n)-Math.tan(e)*Math.cos(n)),jt=(c,n,e)=>Math.asin(Math.sin(n)*Math.sin(e)+Math.cos(n)*Math.cos(e)*Math.cos(c)),Ft=c=>{let n=Date.UTC(c.getUTCFullYear(),0,0),e=c.getTime()-n;return Math.floor(e/(1440*60*1e3))},Vt=c=>C*(134.963+13.064993*c),Yt=c=>C*(218.316+13.176396*c),Wt=c=>C*(125.044-.052954*c),Qt=(c,n,e,t)=>{let i=C*1.274*Math.sin(2*c-2*e-n),o=C*.658*Math.sin(2*c-2*e),s=C*.186*Math.sin(e);return c+i+o+s},Bt=(c,n)=>C*5.128*Math.sin(c-n),Xt=(c,n,e)=>Math.atan2(Math.sin(c),Math.cos(c)*Math.sin(n)-Math.tan(e)*Math.cos(n)),Gt=(c,n,e)=>Math.asin(Math.sin(n)*Math.sin(e)+Math.cos(n)*Math.cos(e)*Math.cos(c)),Zt=(c,n)=>{let e=c-n;return Math.atan2(Math.sin(e),Math.cos(e))},Ut=c=>(1+Math.cos(c))/2,qt=(c,n)=>{let e=N(Math.sin(n)+.1,0,1);switch(c){case"sunny":return{sunIntensity:2.5*e,sunColor:new v.Color(16773839),ambientIntensity:.25+.45*e,ambientColor:new v.Color(16115663),hemisphereIntensity:.4+.4*e,hemisphereSkyColor:new v.Color(12114175),hemisphereGroundColor:new v.Color(16044458),shadowBias:-1e-4};case"partly-cloudy":return{sunIntensity:1.1*e,sunColor:new v.Color(16774885),ambientIntensity:.45+.35*e,ambientColor:new v.Color(15265009),hemisphereIntensity:.5+.3*e,hemisphereSkyColor:new v.Color(13162475),hemisphereGroundColor:new v.Color(15129026),shadowBias:-1e-4};case"overcast":return{sunIntensity:.35*e,sunColor:new v.Color(15791359),ambientIntensity:.75,ambientColor:new v.Color(14278117),hemisphereIntensity:.8,hemisphereSkyColor:new v.Color(13489631),hemisphereGroundColor:new v.Color(13158600),shadowBias:-1e-4};default:return{sunIntensity:1*e,sunColor:new v.Color(16767411),ambientIntensity:.35+.25*e,ambientColor:new v.Color(16769988),hemisphereIntensity:.4+.3*e,hemisphereSkyColor:new v.Color(16763043),hemisphereGroundColor:new v.Color(6243898),shadowBias:-2e-4}}},Oe=class extends v.EventDispatcher{constructor(e,t={}){super();this.createdLight=!1;this.createdHemisphere=!1;this.createdMoonLight=!1;this.scene=e;let i=t.latitude??51.5072,o=t.longitude??-.1276;this.latitude=N(i,-90,90),this.longitude=Le(o),this.referenceYear=t.referenceYear??new Date().getUTCFullYear(),this.dayOfYear=Ne(t.dayOfYear??172,this.referenceYear),this.timeOfDay=Ke(t.timeOfDay??12),this.timeZoneOffsetMinutes=t.timeZoneOffsetMinutes??0,this.weather=t.weather??"sunny",this.useSystemTime=t.useSystemTime??!1,this.lightDistance=t.lightDistance??150,this.shadowCameraSize=t.shadowCameraSize??100,this.shadowCameraFar=t.shadowCameraFar??600,this.enableMoonLight=t.enableMoonLight??!0,this.minMoonIllumination=t.minMoonIllumination??.1;let s=t.light;this.light=s??new v.DirectionalLight(16777215,1),this.createdLight=!s,this.light.parent||this.scene.add(this.light),this.light.target.parent||this.scene.add(this.light.target),this.configureShadowMap(this.light),t.ambientLight&&(this.ambientLight=t.ambientLight),(t.enableHemisphereLight??!0)&&(this.hemisphereLight=new v.HemisphereLight(t.hemisphereSkyColor??12244223,t.hemisphereGroundColor??7628634,t.hemisphereIntensity??.45),this.scene.add(this.hemisphereLight),this.createdHemisphere=!0),this.enableMoonLight&&(this.moonLight=new v.DirectionalLight(Je,0),this.scene.add(this.moonLight),this.moonLight.target.position.set(0,0,0),this.scene.add(this.moonLight.target),this.configureShadowMap(this.moonLight),this.createdMoonLight=!0,t.showMoonHelper&&(this.moonHelper=new v.DirectionalLightHelper(this.moonLight,t.moonHelperSize??20,t.moonHelperColor??12109270),this.scene.add(this.moonHelper))),t.showHelper&&(this.helper=new v.DirectionalLightHelper(this.light,t.helperSize??25,t.helperColor??16765567),this.scene.add(this.helper)),this.state={date:new Date,latitude:this.latitude,longitude:this.longitude,solarAzimuth:0,solarAltitude:0,weather:this.weather,useSystemTime:this.useSystemTime},this.update()}getLight(){return this.light}getHemisphereLight(){return this.hemisphereLight}getMoonLight(){return this.moonLight}getMoonPhase(){return this.state.moonPhase}getMoonIllumination(){return this.state.moonIllumination}getState(){return{...this.state,date:new Date(this.state.date.getTime())}}getDayOfYear(){return this.dayOfYear}getTimeOfDay(){return this.timeOfDay}getTimeZoneOffset(){return this.timeZoneOffsetMinutes}getWeather(){return this.weather}usesSystemTime(){return this.useSystemTime}setLatitude(e){let t=N(e,-90,90);t!==this.latitude&&(this.latitude=t,this.update())}setLongitude(e){let t=Le(e);t!==this.longitude&&(this.longitude=t,this.update())}setLocation(e,t){let i=!1,o=N(e,-90,90);o!==this.latitude&&(this.latitude=o,i=!0);let s=Le(t);s!==this.longitude&&(this.longitude=s,i=!0),i&&this.update()}setDayOfYear(e){let t=Ne(e,this.referenceYear);t!==this.dayOfYear&&(this.dayOfYear=t,this.update())}setTimeOfDay(e){let t=Ke(e);t!==this.timeOfDay&&(this.timeOfDay=t,this.update())}setTimeZoneOffset(e){e!==this.timeZoneOffsetMinutes&&(this.timeZoneOffsetMinutes=e,this.update())}setWeather(e){e!==this.weather&&(this.weather=e,this.dispatchEvent({type:"weatherChanged",weather:e}),this.update())}setUseSystemTime(e){e!==this.useSystemTime&&(this.useSystemTime=e,this.dispatchEvent({type:"systemTimeToggled",useSystemTime:this.useSystemTime}),this.update())}update(e){let t=this.computeDate(e),i=this.computeSunPosition(t);this.applySunPosition(i,t);let o;this.enableMoonLight&&this.moonLight&&(o=this.computeMoonPosition(t),this.applyMoonPosition(o)),this.state={date:t,latitude:this.latitude,longitude:this.longitude,solarAzimuth:i.azimuth,solarAltitude:i.altitude,weather:this.weather,useSystemTime:this.useSystemTime,lunarAzimuth:o?.azimuth,lunarAltitude:o?.altitude,moonPhase:o?.phase,moonIllumination:o?.illumination},this.applyWeather(i.altitude),this.dispatchEvent({type:"stateChanged",state:this.getState()})}dispose(){this.helper&&(this.scene.remove(this.helper),this.helper.dispose(),this.helper=void 0),this.moonHelper&&(this.scene.remove(this.moonHelper),this.moonHelper.dispose(),this.moonHelper=void 0),this.createdHemisphere&&this.hemisphereLight&&(this.scene.remove(this.hemisphereLight),this.hemisphereLight.dispose(),this.hemisphereLight=void 0),this.createdMoonLight&&this.moonLight&&(this.scene.remove(this.moonLight),this.moonLight.shadow?.map&&this.moonLight.shadow.map.dispose(),this.moonLight.dispose(),this.moonLight=void 0),this.createdLight&&this.light&&(this.scene.remove(this.light),this.light.shadow?.map&&this.light.shadow.map.dispose(),this.light.dispose())}configureShadowMap(e){e.castShadow=!0;let t=e.shadow.camera;if(t instanceof v.OrthographicCamera&&typeof this.shadowCameraSize=="number"){let i=this.shadowCameraSize;t.left=-i,t.right=i,t.top=i,t.bottom=-i,t.near=.5,t.far=this.shadowCameraFar,t.updateProjectionMatrix()}e.shadow.mapSize.set(2048,2048),e.shadow.bias=-5e-4}computeDate(e){if(e)return new Date(e.getTime());if(this.useSystemTime){let r=new Date;return this.referenceYear=r.getUTCFullYear(),this.dayOfYear=Ft(r),this.timeOfDay=r.getUTCHours()+r.getUTCMinutes()/60+r.getUTCSeconds()/3600,r}let t=ot(this.referenceYear)?366:365,i=N(this.dayOfYear,1,t),o=new Date(Date.UTC(this.referenceYear,0,1,0,0,0,0)),s=(i-1)*24*60+this.timeOfDay*60-this.timeZoneOffsetMinutes;return o.setUTCMinutes(s),o}computeSunPosition(e){let t=et(e),i=-this.longitude*C,o=this.latitude*C,s=tt(t),r=it(s),a=_t(r),l=It(r),p=st(t,i)-l;return{azimuth:kt(p,o,a),altitude:jt(p,o,a)}}applySunPosition(e,t){let i=this.lightDistance,o=e.altitude,s=e.azimuth,r=-i*Math.cos(o)*Math.sin(s),a=i*Math.sin(o),l=i*Math.cos(o)*Math.cos(s);this.light.position.set(r,a,l),this.light.target.position.set(0,0,0),this.light.target.updateMatrixWorld(),this.helper&&this.helper.update(),this.useSystemTime||(this.referenceYear=t.getUTCFullYear())}applyWeather(e){let t=qt(this.weather,e),i=e*Rt,o=-6,r=4-o,a=N((i-o)/r,0,1),l=1-a,d=t.sunColor.lerp(Ot,l),p=t.ambientColor.lerp(Dt,l),u=t.hemisphereSkyColor.lerp(Pt,l),m=t.hemisphereGroundColor.lerp(zt,l),g=t.sunIntensity*a,x=Math.max(.05,t.ambientIntensity*(.3+.7*a)),w=Math.max(.05,t.hemisphereIntensity*(.35+.65*a));this.light.intensity=g,this.light.visible=e>0&&g>.001,this.light.color.copy(d),this.light.shadow.bias=t.shadowBias,this.ambientLight&&(this.ambientLight.intensity=x,this.ambientLight.color.copy(p)),this.hemisphereLight&&(this.hemisphereLight.intensity=w,this.hemisphereLight.color.copy(u),this.hemisphereLight.groundColor.copy(m))}computeMoonPosition(e){let t=et(e),i=-this.longitude*C,o=this.latitude*C,s=tt(t),r=it(s),a=Vt(t),l=Yt(t),d=Wt(t),p=Qt(l,a,s,d),u=Bt(p,d),m=C*23.4397,g=Math.asin(Math.sin(u)*Math.cos(m)+Math.cos(u)*Math.sin(m)*Math.sin(p)),x=Math.atan2(Math.sin(p)*Math.cos(m)-Math.tan(u)*Math.sin(m),Math.cos(p)),S=st(t,i)-x,R=Zt(p,r),M=Ut(R);return{azimuth:Xt(S,o,g),altitude:Gt(S,o,g),phase:R,illumination:M}}applyMoonPosition(e){if(!this.moonLight)return;let t=this.lightDistance,i=e.altitude,o=e.azimuth,s=-t*Math.cos(i)*Math.sin(o),r=t*Math.sin(i),a=t*Math.cos(i)*Math.cos(o);this.moonLight.position.set(s,r,a),this.moonLight.target.position.set(0,0,0),this.moonLight.target.updateMatrixWorld();let l=i>0&&e.illumination>=this.minMoonIllumination,d=.015,p=this.weather==="overcast"?.3:this.weather==="partly-cloudy"?.7:1,u=Math.max(0,Math.sin(i));this.moonLight.intensity=d*e.illumination*p*u,this.moonLight.visible=l,this.moonLight.color.copy(Je),this.moonHelper&&(this.moonHelper.update(),this.moonHelper.visible=l)}};var I=Y(require("three")),ve=class extends I.EventDispatcher{constructor(e,t={}){super();this.mesh=null;this.currentData=null;this.isLoading=!1;this.generatedTextureUrls=new Set;this.scene=e,this.widthSegments=t.widthSegments??50,this.depthSegments=t.depthSegments??50,this.elevationScale=t.elevationScale??1,this.baseColor=t.baseColor??9139029,this.wireframe=t.wireframe??!1,this.textureUrl=t.textureUrl,this.mapboxOptions=t.mapbox,this.receiveShadow=t.receiveShadow??!0,this.castShadow=t.castShadow??!0,this.useDemoData=t.useDemoData??!1}setMapboxOptions(e){this.mapboxOptions=e}async loadTerrain(e,t){if(this.isLoading){console.warn("Terrain is already loading");return}this.isLoading=!0,this.dispatchEvent({type:"updateStarted",center:e,dimensions:t});try{let i=await this.fetchElevationData(e,t);this.currentData=i,this.dispatchEvent({type:"dataLoaded",data:i});let o=await this.resolveTexture(e,t);await this.createMesh(i,o)}catch(i){console.error("Error loading terrain:",i),this.dispatchEvent({type:"error",message:"Failed to load terrain",error:i})}finally{this.isLoading=!1}}async updateTerrain(e,t){if(!this.currentData&&!e){console.warn("No current terrain data and no center provided");return}let i=e||this.currentData.center,o=t||this.currentData.dimensions;await this.loadTerrain(i,o)}async fetchElevationData(e,t){if(this.useDemoData)return this.generateDemoData(e,t);let i=[],o=111320,s=111320*Math.max(Math.abs(Math.cos(e.latitude*Math.PI/180)),1e-6),r=t.depth/o,a=t.width/s,l=r/this.depthSegments,d=a/this.widthSegments,p=e.latitude+r/2,u=e.longitude-a/2;for(let M=0;M<=this.depthSegments;M++)for(let z=0;z<=this.widthSegments;z++)i.push({latitude:p-M*l,longitude:u+z*d});let m=await fetch("https://api.open-elevation.com/api/v1/lookup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({locations:i})});if(!m.ok)throw new Error(`Elevation API error: ${m.statusText}`);let x=(await m.json()).results,w=[],S=1/0,R=-1/0;for(let M=0;M<=this.depthSegments;M++){let z=[];for(let D=0;D<=this.widthSegments;D++){let B=M*(this.widthSegments+1)+D,V=x[B].elevation;z.push(V),S=Math.min(S,V),R=Math.max(R,V)}w.push(z)}return{center:e,dimensions:t,elevations:w,minElevation:S,maxElevation:R}}generateDemoData(e,t){let i=[],o=1/0,s=-1/0,r=e.latitude+e.longitude;for(let a=0;a<=this.depthSegments;a++){let l=[];for(let d=0;d<=this.widthSegments;d++){let p=d/this.widthSegments*4,u=a/this.depthSegments*4,m=0;m+=Math.sin(p+r)*500,m+=Math.cos(u+r)*500,m+=Math.sin(p*2+r)*200,m+=Math.cos(u*2+r)*200,m+=Math.sin(p*4+r)*50,m+=Math.cos(u*4+r)*50,m+=(Math.random()-.5)*30,l.push(m),o=Math.min(o,m),s=Math.max(s,m)}i.push(l)}return{center:e,dimensions:t,elevations:i,minElevation:o,maxElevation:s}}async createMesh(e,t){this.mesh&&(this.scene.remove(this.mesh),this.mesh.geometry.dispose(),Array.isArray(this.mesh.material)?this.mesh.material.forEach(a=>a.dispose()):this.mesh.material.dispose());let i=new I.PlaneGeometry(e.dimensions.width,e.dimensions.depth,this.widthSegments,this.depthSegments),o=i.attributes.position,s=0;for(let a=0;a<=this.depthSegments;a++)for(let l=0;l<=this.widthSegments;l++){let p=(e.elevations[a][l]-e.minElevation)*this.elevationScale;o.setZ(s,p),s++}i.computeVertexNormals();let r;if(t?.url)try{let a=await new I.TextureLoader().loadAsync(t.url);r=new I.MeshStandardMaterial({map:a,wireframe:this.wireframe})}catch(a){console.warn("Failed to load terrain texture, using base color.",a),r=new I.MeshStandardMaterial({color:this.baseColor,wireframe:this.wireframe})}finally{t.revokeOnUse&&this.releaseGeneratedTexture(t.url)}else r=new I.MeshStandardMaterial({color:this.baseColor,wireframe:this.wireframe});this.mesh=new I.Mesh(i,r),this.mesh.rotation.x=-Math.PI/2,this.mesh.receiveShadow=this.receiveShadow,this.mesh.castShadow=this.castShadow,this.scene.add(this.mesh),this.dispatchEvent({type:"meshLoaded",mesh:this.mesh})}async resolveTexture(e,t){if(this.textureUrl)return{url:this.textureUrl,revokeOnUse:!1};if(this.mapboxOptions)try{let i=await this.fetchMapboxTexture(e,t,this.mapboxOptions);return this.generatedTextureUrls.add(i),{url:i,revokeOnUse:!0}}catch(i){console.warn("Failed to fetch Mapbox imagery, falling back to base material.",i);return}}computeBoundingBox(e,t,i){let s=e.latitude*Math.PI/180,r=Math.cos(s),a=111320*Math.max(Math.abs(r),1e-6),l=Math.max(0,i),d=t.width*(1+l),u=t.depth*(1+l)/2/111320,m=d/2/a,g=(M,z,D)=>Math.min(Math.max(M,z),D),x=g(e.latitude-u,-90,90),w=g(e.latitude+u,-90,90),S=g(e.longitude-m,-180,180),R=g(e.longitude+m,-180,180);return{minLat:x,maxLat:w,minLon:S,maxLon:R}}async fetchMapboxTexture(e,t,i){let s=(i.styleId??"mapbox/satellite-v9").replace("mapbox://styles/","").replace(/^\/+/,""),r=Math.min(1280,Math.max(1,Math.floor(i.imageWidth??1024))),a=Math.min(1280,Math.max(1,Math.floor(i.imageHeight??1024))),l=i.highResolution?"@2x":"",d=i.imageFormat??"png",p=i.paddingRatio??.1,u=this.computeBoundingBox(e,t,p),m=`${u.minLon.toFixed(6)},${u.minLat.toFixed(6)},${u.maxLon.toFixed(6)},${u.maxLat.toFixed(6)}`,g=new URLSearchParams({access_token:i.accessToken,format:d}),x=`https://api.mapbox.com/styles/v1/${s}/static/[${m}]/${r}x${a}${l}?${g.toString()}`,w=await fetch(x);if(!w.ok)throw new Error(`Mapbox imagery request failed: ${w.status} ${w.statusText}`);let S=await w.blob();if(typeof URL>"u"||typeof URL.createObjectURL!="function")throw new Error("URL.createObjectURL is not available in this environment");return URL.createObjectURL(S)}releaseGeneratedTexture(e){this.generatedTextureUrls.has(e)&&(typeof URL<"u"&&typeof URL.revokeObjectURL=="function"&&URL.revokeObjectURL(e),this.generatedTextureUrls.delete(e))}getMesh(){return this.mesh}getData(){return this.currentData}isTerrainLoading(){return this.isLoading}dispose(){if(this.mesh&&(this.scene.remove(this.mesh),this.mesh.geometry.dispose(),Array.isArray(this.mesh.material)?this.mesh.material.forEach(e=>e.dispose()):this.mesh.material.dispose(),this.mesh=null),this.currentData=null,this.generatedTextureUrls.size>0)for(let e of Array.from(this.generatedTextureUrls))this.releaseGeneratedTexture(e)}};var h=require("three"),Pe=require("three/examples/jsm/renderers/CSS2DRenderer.js"),k=new h.Raycaster,O=new h.Vector3,U=new h.Vector3,T=new h.Quaternion,ie={X:new h.Vector3(1,0,0),Y:new h.Vector3(0,1,0),Z:new h.Vector3(0,0,1)},De={type:"change"},nt={type:"mouseDown",mode:null},rt={type:"mouseUp",mode:null},at={type:"objectChange"},ze=class extends h.Controls{constructor(n,e=null){super(void 0,e);let t=new Ae(this);this._root=t;let i=new Te;this._gizmo=i,t.add(i);let o=new we;this._plane=o,t.add(o);let s=this;this._overlay=document.createElement("div"),this._overlay.classList.add("absolute"),this._overlay.classList.add("bottom-2"),this._overlay.classList.add("left-80"),this._overlay.classList.add("z-50"),this._overlay.classList.add("bg-gray-700"),this._overlay.classList.add("bg-opacity-70"),this._overlay.classList.add("text-white"),this._overlay.classList.add("p-2"),this._overlay.classList.add("rounded-md"),this._overlay.classList.add("border"),this._overlay.classList.add("border-gray-500"),this._overlay.classList.add("hidden"),e&&e.appendChild(this._overlay);let r=document.createElement("div");r.className="distance-label",r.style.padding="4px 8px",r.style.background="rgba(0, 0, 0, 0.8)",r.style.border="1px solid rgba(255, 255, 255, 0.3)",r.style.borderRadius="4px",r.style.color="#fff",r.style.fontSize="12px",r.style.fontFamily="monospace",r.style.whiteSpace="nowrap",r.style.pointerEvents="none",r.style.userSelect="none",r.textContent="0.00",this._distanceLabel=new Pe.CSS2DObject(r),this._distanceLabel.visible=!1,t.add(this._distanceLabel);let a=document.createElement("div");a.className="rotation-angle-label",a.style.padding="4px 8px",a.style.background="rgba(0, 0, 0, 0.8)",a.style.border="1px solid rgba(255, 255, 255, 0.3)",a.style.borderRadius="4px",a.style.color="#fff",a.style.fontSize="12px",a.style.fontFamily="monospace",a.style.whiteSpace="nowrap",a.style.pointerEvents="none",a.style.userSelect="none",a.textContent="0\xB0",this._rotationAngleLabel=new Pe.CSS2DObject(a),this._rotationAngleLabel.visible=!1,t.add(this._rotationAngleLabel),this._rotationArc=null;function l(D,B){let V=B;Object.defineProperty(s,D,{get:function(){return V!==void 0?V:B},set:function($){V!==$&&(V=$,o[D]=$,i[D]=$,s.dispatchEvent({type:D+"-changed",value:$}),s.dispatchEvent(De))}}),s[D]=B,o[D]=B,i[D]=B}l("camera",n),l("object",void 0),l("enabled",!0),l("axis",null),l("mode","all"),l("translationSnap",null),l("rotationSnap",null),l("scaleSnap",null),l("space","world"),l("size",.75),l("dragging",!1),l("activeMode","translate"),l("showX",!0),l("showY",!0),l("showZ",!0),l("minX",-1/0),l("maxX",1/0),l("minY",-1/0),l("maxY",1/0),l("minZ",-1/0),l("maxZ",1/0),l("minRotation",-2*Math.PI),l("maxRotation",2*Math.PI);let d=new h.Vector3,p=new h.Vector3,u=new h.Quaternion,m=new h.Quaternion,g=new h.Vector3,x=new h.Quaternion,w=new h.Vector3,S=new h.Vector3,R=new h.Vector3,M=0,z=new h.Vector3;l("worldPosition",d),l("worldPositionStart",p),l("worldQuaternion",u),l("worldQuaternionStart",m),l("cameraPosition",g),l("cameraQuaternion",x),l("pointStart",w),l("pointEnd",S),l("rotationAxis",R),l("rotationAngle",M),l("eye",z),this._offset=new h.Vector3,this._startNorm=new h.Vector3,this._endNorm=new h.Vector3,this._cameraScale=new h.Vector3,this._parentPosition=new h.Vector3,this._parentQuaternion=new h.Quaternion,this._parentQuaternionInv=new h.Quaternion,this._parentScale=new h.Vector3,this._worldScaleStart=new h.Vector3,this._worldQuaternionInv=new h.Quaternion,this._worldScale=new h.Vector3,this._tempPosition=new h.Vector3,this._positionStart=new h.Vector3,this._quaternionStart=new h.Quaternion,this._scaleStart=new h.Vector3,this._getPointer=$t.bind(this),this._onPointerDown=Kt.bind(this),this._onPointerHover=Nt.bind(this),this._onPointerMove=Jt.bind(this),this._onPointerUp=ei.bind(this),e!==null&&this.connect(e)}connect(n){super.connect(n),this.domElement?.parentNode&&this.domElement.parentNode.appendChild(this._overlay),this.domElement?.addEventListener("pointerdown",this._onPointerDown),this.domElement?.addEventListener("pointermove",this._onPointerHover),this.domElement?.addEventListener("pointerup",this._onPointerUp),this.domElement&&(this.domElement.style.touchAction="none")}disconnect(){this._overlay.parentNode&&this._overlay.parentNode.removeChild(this._overlay),this.domElement?.removeEventListener("pointerdown",this._onPointerDown),this.domElement?.removeEventListener("pointermove",this._onPointerHover),this.domElement?.removeEventListener("pointermove",this._onPointerMove),this.domElement?.removeEventListener("pointerup",this._onPointerUp),this.domElement&&(this.domElement.style.touchAction="auto")}getHelper(){return this._root}pointerHover(n){if(this.object===void 0||this.dragging===!0)return;n!==null&&k.setFromCamera(n,this.camera);let e=null;this.mode==="all"?(e=q(this._gizmo.picker.scale,k),e||(e=q(this._gizmo.picker.rotate,k)),e||(e=q(this._gizmo.picker.translate,k))):e=q(this._gizmo.picker[this.mode],k),e?this.axis=e.object.name:this.axis=null}pointerDown(n){if(!(this.object===void 0||this.dragging===!0||n!=null&&n.button!==0)&&this.axis!==null){if(n!==null&&k.setFromCamera(n,this.camera),this.mode==="all"){let t=q(this._gizmo.picker.scale,k);t&&t.object.name===this.axis?this.activeMode="scale":(t=q(this._gizmo.picker.rotate,k),t&&t.object.name===this.axis?this.activeMode="rotate":this.activeMode="translate")}else this.activeMode=this.mode;let e=q(this._plane,k,!0);if(e){this.object.updateMatrixWorld(),this.object.parent.updateMatrixWorld(),this._positionStart.copy(this.object.position),this._quaternionStart.copy(this.object.quaternion),this._scaleStart.copy(this.object.scale);let t=_e(this.object);this.worldPositionStart.copy(t),this.object.matrixWorld.decompose(this._tempPosition,this.worldQuaternionStart,this._worldScaleStart),this.pointStart.copy(e.point).sub(this.worldPositionStart)}this.dragging=!0,nt.mode=this.mode==="all"?this.activeMode:this.mode,this.dispatchEvent(nt)}}pointerMove(n){let e=this.axis,t=this.mode==="all"?this.activeMode:this.mode,i=this.object,o=this.space;if(t==="scale"?o="local":(e==="E"||e==="XYZE"||e==="XYZ")&&(o="world"),i===void 0||e===null||this.dragging===!1||n!==null&&n.button!==-1){this._updateDistanceOverlay();return}n!==null&&k.setFromCamera(n,this.camera);let s=q(this._plane,k,!0);if(s){if(this.pointEnd.copy(s.point).sub(this.worldPositionStart),t==="translate")this._offset.copy(this.pointEnd).sub(this.pointStart),o==="local"&&e!=="XYZ"&&this._offset.applyQuaternion(this._worldQuaternionInv),e.indexOf("X")===-1&&(this._offset.x=0),e.indexOf("Y")===-1&&(this._offset.y=0),e.indexOf("Z")===-1&&(this._offset.z=0),o==="local"&&e!=="XYZ"?this._offset.applyQuaternion(this._quaternionStart).divide(this._parentScale):this._offset.applyQuaternion(this._parentQuaternionInv).divide(this._parentScale),i.position.copy(this._offset).add(this._positionStart),this.translationSnap&&(o==="local"&&(i.position.applyQuaternion(T.copy(this._quaternionStart).invert()),e.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),e.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),e.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.position.applyQuaternion(this._quaternionStart)),o==="world"&&(i.parent&&i.position.add(O.setFromMatrixPosition(i.parent.matrixWorld)),e.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),e.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),e.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.parent&&i.position.sub(O.setFromMatrixPosition(i.parent.matrixWorld)))),i.position.x=Math.max(this.minX,Math.min(this.maxX,i.position.x)),i.position.y=Math.max(this.minY,Math.min(this.maxY,i.position.y)),i.position.z=Math.max(this.minZ,Math.min(this.maxZ,i.position.z));else if(t==="scale"){if(e.search("XYZ")!==-1){let r=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(r*=-1),U.set(r,r,r)}else O.copy(this.pointStart),U.copy(this.pointEnd),O.applyQuaternion(this._worldQuaternionInv),U.applyQuaternion(this._worldQuaternionInv),U.divide(O),e.search("X")===-1&&(U.x=1),e.search("Y")===-1&&(U.y=1),e.search("Z")===-1&&(U.z=1);i.scale.copy(this._scaleStart).multiply(U),this.scaleSnap&&(e.search("X")!==-1&&(i.scale.x=Math.round(i.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),e.search("Y")!==-1&&(i.scale.y=Math.round(i.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),e.search("Z")!==-1&&(i.scale.z=Math.round(i.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if(t==="rotate"){this._offset.copy(this.pointEnd).sub(this.pointStart);let r=20/this.worldPosition.distanceTo(O.setFromMatrixPosition(this.camera.matrixWorld)),a=!1;e==="XYZE"?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(O.copy(this.rotationAxis).cross(this.eye))*r):(e==="X"||e==="Y"||e==="Z")&&(this.rotationAxis.copy(ie[e]),O.copy(ie[e]),o==="local"&&O.applyQuaternion(this.worldQuaternion),O.cross(this.eye),O.length()===0?a=!0:this.rotationAngle=this._offset.dot(O.normalize())*r),(e==="E"||a)&&(this.rotationAxis.copy(this.eye),this.rotationAngle=this.pointEnd.angleTo(this.pointStart),this._startNorm.copy(this.pointStart).normalize(),this._endNorm.copy(this.pointEnd).normalize(),this.rotationAngle*=this._endNorm.cross(this._startNorm).dot(this.eye)<0?1:-1),this.rotationSnap&&(this.rotationAngle=Math.round(this.rotationAngle/this.rotationSnap)*this.rotationSnap),this.rotationAngle=Math.max(this.minRotation,Math.min(this.maxRotation,this.rotationAngle)),o==="local"&&e!=="E"&&e!=="XYZE"?(i.quaternion.copy(this._quaternionStart),i.quaternion.multiply(T.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),i.quaternion.copy(T.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),i.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(De),this.dispatchEvent(at),this._updateDistanceOverlay()}}pointerUp(n){n!==null&&n.button!==0||(this.dragging&&this.axis!==null&&(rt.mode=this.mode,this.dispatchEvent(rt)),this.dragging=!1,this.axis=null,this._updateDistanceOverlay())}dispose(){this.disconnect(),this._root.dispose()}attach(n){return this.object=n,this._root.visible=!0,this}detach(){return this.object=void 0,this.axis=null,this._root.visible=!1,this}reset(){this.enabled&&this.dragging&&(this.object.position.copy(this._positionStart),this.object.quaternion.copy(this._quaternionStart),this.object.scale.copy(this._scaleStart),this.dispatchEvent(De),this.dispatchEvent(at),this.pointStart.copy(this.pointEnd))}getRaycaster(){return k}getMode(){return this.mode}setMode(n){}setTranslationSnap(n){this.translationSnap=n}setRotationSnap(n){this.rotationSnap=n}setMinRotation(n){this.minRotation=n}setMaxRotation(n){this.maxRotation=n}setScaleSnap(n){this.scaleSnap=n}setSize(n){this.size=n}setSpace(n){this.space=n}_updateDistanceOverlay(){if(!this.object||!this.dragging){this._overlay.classList.add("hidden"),this._distanceLabel.visible=!1,this._rotationAngleLabel.visible=!1;return}if(this.mode==="translate"||this.mode==="all"&&this.activeMode==="translate"){let n=this.object.position.x-this._positionStart.x,e=this.object.position.y-this._positionStart.y,t=this.object.position.z-this._positionStart.z,i=Math.sqrt(n*n+e*e+t*t),o=new h.Vector3((this._positionStart.x+this.object.position.x)/2,(this._positionStart.y+this.object.position.y)/2,(this._positionStart.z+this.object.position.z)/2);this._distanceLabel.position.copy(o),this._distanceLabel.visible=!0,this._rotationAngleLabel.visible=!1,this._distanceLabel.element.textContent=`${i.toFixed(3)}`,this._overlay.textContent=`X: ${n.toFixed(2)} Y: ${e.toFixed(2)} Z: ${t.toFixed(2)}`}else if(this.mode==="rotate"||this.mode==="all"&&this.activeMode==="rotate"){this._distanceLabel.visible=!1;let n=this.rotationAngle*180/Math.PI,e=.55,t=this.rotationAngle/2,i=new h.Vector3;if(this.axis==="X"||this.axis==="Y"||this.axis==="Z"){let o=ie[this.axis],s=new h.Vector3;Math.abs(o.dot(this.pointStart.clone().normalize()))>.99?s.copy(this.eye).cross(o).normalize():s.copy(this.pointStart).normalize();let r=new h.Quaternion().setFromAxisAngle(o,t);s.applyQuaternion(r),this.space==="local"&&s.applyQuaternion(this.worldQuaternion),s.multiplyScalar(e),i.copy(this.worldPosition).add(s)}else{i.copy(this.worldPosition);let o=this.pointStart.clone().normalize();this.space==="local"&&o.applyQuaternion(this.worldQuaternion),o.multiplyScalar(e),i.add(o)}this._rotationAngleLabel.position.copy(i),this._rotationAngleLabel.visible=!0,this._rotationAngleLabel.element.textContent=`${Math.abs(n).toFixed(1)}\xB0`,this._overlay.textContent=`X: ${(this.object.rotation.x*(180/Math.PI)).toFixed(2)}\xB0 Y: ${(this.object.rotation.y*(180/Math.PI)).toFixed(2)}\xB0 Z: ${(this.object.rotation.z*(180/Math.PI)).toFixed(2)}\xB0`}else this.mode==="scale"&&(this._distanceLabel.visible=!1,this._rotationAngleLabel.visible=!1,this._overlay.textContent=`X: ${this.object.scale.x.toFixed(2)} Y: ${this.object.scale.y.toFixed(2)} Z: ${this.object.scale.z.toFixed(2)}`);this._overlay.classList.remove("hidden")}};function $t(c){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:c.button};{let n=this.domElement.getBoundingClientRect();return{x:(c.clientX-n.left)/n.width*2-1,y:-(c.clientY-n.top)/n.height*2+1,button:c.button}}}function Nt(c){if(this.enabled)switch(c.pointerType){case"mouse":case"pen":this.pointerHover(this._getPointer(c));break}}function Kt(c){this.enabled&&(document.pointerLockElement||this.domElement.setPointerCapture(c.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.pointerHover(this._getPointer(c)),this.pointerDown(this._getPointer(c)))}function Jt(c){this.enabled&&this.pointerMove(this._getPointer(c))}function ei(c){this.enabled&&(this.domElement.releasePointerCapture(c.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.pointerUp(this._getPointer(c)))}function q(c,n,e){let t=n.intersectObject(c,!0);for(let i=0;i<t.length;i++)if(t[i].object.visible||e)return t[i];return!1}var be=new h.Euler,y=new h.Vector3(0,1,0),lt=new h.Vector3(0,0,0),ht=new h.Matrix4,ye=new h.Quaternion,J=new h.Quaternion,Q=new h.Vector3,ct=new h.Matrix4,re=new h.Vector3(1,0,0),K=new h.Vector3(0,1,0),ae=new h.Vector3(0,0,1),Me=new h.Vector3,oe=new h.Vector3,ne=new h.Vector3;function _e(c){let n=new h.Box3;if(c.traverse(t=>{t.isMesh&&t.geometry&&(t.geometry.computeBoundingBox(),n.expandByObject(t))}),n.isEmpty())return c.getWorldPosition(new h.Vector3);let e=new h.Vector3;return n.getCenter(e),e}var Ae=class extends h.Object3D{constructor(n){super(),this.isTransformControlsRoot=!0,this.controls=n,this.visible=!1}updateMatrixWorld(n){let e=this.controls;if(e.object!==void 0){e.object.updateMatrixWorld(),e.object.parent===null?console.error("TransformControls: The attached 3D object must be a part of the scene graph."):e.object.parent.matrixWorld.decompose(e._parentPosition,e._parentQuaternion,e._parentScale);let t=_e(e.object);e.worldPosition.copy(t),e.object.matrixWorld.decompose(e._tempPosition,e.worldQuaternion,e._worldScale),e._parentQuaternionInv.copy(e._parentQuaternion).invert(),e._worldQuaternionInv.copy(e.worldQuaternion).invert()}e.camera.updateMatrixWorld(),e.camera.matrixWorld.decompose(e.cameraPosition,e.cameraQuaternion,e._cameraScale),e.camera.isOrthographicCamera,e.eye.copy(e.cameraPosition).sub(e.worldPosition).normalize(),super.updateMatrixWorld(n)}dispose(){this.traverse(function(n){n.geometry&&n.geometry.dispose(),n.material&&n.material.dispose()})}},Te=class extends h.Object3D{constructor(){super(),this.isTransformControlsGizmo=!0,this.type="TransformControlsGizmo";let n=new h.MeshBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),e=new h.LineBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),t=n.clone();t.opacity=.15;let i=e.clone();i.opacity=.5;let o=n.clone();o.color.setHex(15549272);let s=n.clone();s.color.setHex(8571929);let r=n.clone();r.color.setHex(3245547);let a=n.clone();a.color.setHex(15549272),a.opacity=.5;let l=n.clone();l.color.setHex(8571929),l.opacity=.5;let d=n.clone();d.color.setHex(3245547),d.opacity=.5;let p=n.clone();p.opacity=.25;let u=n.clone();u.color.setHex(16776960),u.opacity=.25,n.clone().color.setHex(16776960),n.clone().color.setHex(7895160);let x=new h.CylinderGeometry(0,.04,.1,12);x.translate(0,.05,0);let w=new h.BoxGeometry(.08,.08,.08);w.translate(0,.04,0);let S=new h.BufferGeometry;S.setAttribute("position",new h.Float32BufferAttribute([0,0,0,1,0,0],3));let R=new h.CylinderGeometry(.02,.02,.5,3);R.translate(0,.25,0);function M(A,le){let F=new h.TorusGeometry(A,.02,3,64,le*Math.PI*2);return F.rotateY(Math.PI/2),F.rotateX(Math.PI/2),F}function z(){let A=new h.BufferGeometry;return A.setAttribute("position",new h.Float32BufferAttribute([0,0,0,1,1,1],3)),A}let D={X:[[new h.Mesh(x,o),[.5,0,0],[0,0,-Math.PI/2]],[new h.Mesh(R,o),[0,0,0],[0,0,-Math.PI/2]]],Y:[[new h.Mesh(x,s),[0,.5,0]],[new h.Mesh(R,s)]],Z:[[new h.Mesh(x,r),[0,0,.5],[Math.PI/2,0,0]],[new h.Mesh(R,r),null,[Math.PI/2,0,0]]]},B={X:[[new h.Mesh(new h.CylinderGeometry(.2,0,.6,4),t),[.3,0,0],[0,0,-Math.PI/2]],[new h.Mesh(new h.CylinderGeometry(.2,0,.6,4),t),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new h.Mesh(new h.CylinderGeometry(.2,0,.6,4),t),[0,.3,0]],[new h.Mesh(new h.CylinderGeometry(.2,0,.6,4),t),[0,-.3,0],[0,0,Math.PI]]],Z:[[new h.Mesh(new h.CylinderGeometry(.2,0,.6,4),t),[0,0,.3],[Math.PI/2,0,0]],[new h.Mesh(new h.CylinderGeometry(.2,0,.6,4),t),[0,0,-.3],[-Math.PI/2,0,0]]]},V={START:[[new h.Mesh(new h.OctahedronGeometry(.01,2),i),null,null,null,"helper"]],END:[[new h.Mesh(new h.OctahedronGeometry(.01,2),i),null,null,null,"helper"]],DELTA:[[new h.Line(z(),i),null,null,null,"helper"]]},$={X:[[new h.Mesh(M(.45,.25),o)]],Y:[[new h.Mesh(M(.45,.25),s),null,[0,0,-Math.PI/2]]],Z:[[new h.Mesh(M(.45,.25),r),null,[0,Math.PI/2,0]]]},pt={AXIS:[],START:[[new h.Line(S.clone(),i),null,null,null,"helper"]],END:[[new h.Line(S.clone(),i),null,null,null,"helper"]],ARC:[[new h.Line(new h.BufferGeometry,i),null,null,null,"helper"]]},dt={X:[[new h.Mesh(M(.45,.25),o)]],Y:[[new h.Mesh(M(.45,.25),s),null,[0,0,-Math.PI/2]]],Z:[[new h.Mesh(M(.45,.25),r),null,[0,Math.PI/2,0]]]},mt={X:[[new h.Mesh(w,o),[.7,0,0],[0,0,-Math.PI/2]]],Y:[[new h.Mesh(w,s),[0,.7,0]]],Z:[[new h.Mesh(w,r),[0,0,.7],[Math.PI/2,0,0]]]},ut={X:[[new h.Mesh(new h.BoxGeometry(.2,.2,.2),t),[.7,0,0],[0,0,-Math.PI/2]]],Y:[[new h.Mesh(new h.BoxGeometry(.2,.2,.2),t),[0,.7,0]]],Z:[[new h.Mesh(new h.BoxGeometry(.2,.2,.2),t),[0,0,.7],[Math.PI/2,0,0]]]},ft={X:[],Y:[],Z:[]};function X(A){let le=new h.Object3D;for(let F in A)for(let ee=A[F].length;ee--;){let P=A[F][ee][0].clone();P.userData.type="gizmo";let he=A[F][ee][1],ce=A[F][ee][2],pe=A[F][ee][3],Et=A[F][ee][4];P.name=F,P.tag=Et,he&&P.position.set(he[0],he[1],he[2]),ce&&P.rotation.set(ce[0],ce[1],ce[2]),pe&&P.scale.set(pe[0],pe[1],pe[2]),P.updateMatrix();let Ie=P.geometry.clone();Ie.applyMatrix4(P.matrix),P.geometry=Ie,P.renderOrder=1/0,P.position.set(0,0,0),P.rotation.set(0,0,0),P.scale.set(1,1,1),le.add(P)}return le}this.gizmo={},this.picker={},this.helper={},this.add(this.gizmo.translate=X(D)),this.add(this.gizmo.rotate=X($)),this.add(this.gizmo.scale=X(mt)),this.add(this.picker.translate=X(B)),this.add(this.picker.rotate=X(dt)),this.add(this.picker.scale=X(ut)),this.add(this.helper.translate=X(V)),this.add(this.helper.rotate=X(pt)),this.add(this.helper.scale=X(ft)),this.picker.translate.visible=!1,this.picker.rotate.visible=!1,this.picker.scale.visible=!1}updateMatrixWorld(n){let t=(this.mode==="scale"?"local":this.space)==="local"?this.worldQuaternion:J;this.mode==="all"?(this.gizmo.translate.visible=!0,this.gizmo.rotate.visible=!0,this.gizmo.scale.visible=!0,this.helper.translate.visible=!0,this.helper.rotate.visible=!0,this.helper.scale.visible=!1):(this.gizmo.translate.visible=this.mode==="translate",this.gizmo.rotate.visible=this.mode==="rotate",this.gizmo.scale.visible=this.mode==="scale",this.helper.translate.visible=this.mode==="translate",this.helper.rotate.visible=this.mode==="rotate",this.helper.scale.visible=this.mode==="scale");let i=[];this.mode==="all"?(i=i.concat(this.picker.translate.children),i=i.concat(this.picker.rotate.children),i=i.concat(this.picker.scale.children),i=i.concat(this.gizmo.translate.children),i=i.concat(this.gizmo.rotate.children),i=i.concat(this.gizmo.scale.children),i=i.concat(this.helper.translate.children),i=i.concat(this.helper.rotate.children)):(i=i.concat(this.picker[this.mode].children),i=i.concat(this.gizmo[this.mode].children),i=i.concat(this.helper[this.mode].children));for(let o=0;o<i.length;o++){let s=i[o];s.visible=!0,s.rotation.set(0,0,0),s.position.copy(this.worldPosition);let r;if(this.camera.isOrthographicCamera?r=(this.camera.top-this.camera.bottom)/this.camera.zoom:r=this.worldPosition.distanceTo(this.cameraPosition)*Math.min(1.9*Math.tan(Math.PI*this.camera.fov/360)/this.camera.zoom,7),s.scale.set(1,1,1).multiplyScalar(r*this.size/4),s.tag==="helper"){if(s.visible=!1,s.name==="AXIS")s.visible=!!this.axis,this.axis==="X"&&(T.setFromEuler(be.set(0,0,0)),s.quaternion.copy(t).multiply(T),Math.abs(y.copy(re).applyQuaternion(t).dot(this.eye))>.9&&(s.visible=!1)),this.axis==="Y"&&(T.setFromEuler(be.set(0,0,Math.PI/2)),s.quaternion.copy(t).multiply(T),Math.abs(y.copy(K).applyQuaternion(t).dot(this.eye))>.9&&(s.visible=!1)),this.axis==="Z"&&(T.setFromEuler(be.set(0,Math.PI/2,0)),s.quaternion.copy(t).multiply(T),Math.abs(y.copy(ae).applyQuaternion(t).dot(this.eye))>.9&&(s.visible=!1)),this.axis==="XYZE"&&(T.setFromEuler(be.set(0,Math.PI/2,0)),y.copy(this.rotationAxis),s.quaternion.setFromRotationMatrix(ht.lookAt(lt,y,K)),s.quaternion.multiply(T),s.visible=this.dragging),this.axis==="E"&&(s.visible=!1);else if(s.name==="START")if(this.mode==="rotate"||this.mode==="all"){s.position.copy(this.worldPosition);let a=this.mode==="rotate"||this.mode==="all"&&this.activeMode==="rotate";if(s.visible=this.dragging&&a,s.visible){let l=this.space;l==="local"?s.quaternion.copy(this.worldQuaternionStart):s.quaternion.copy(J);let d=new h.Vector3;this.axis==="X"||this.axis==="Y"||this.axis==="Z"?d.copy(ie[this.axis]):(this.axis==="E"||this.axis==="XYZE")&&(d.copy(this.rotationAxis),l==="local"&&d.applyQuaternion(this.worldQuaternionStart.clone().invert()));let p=this.pointStart.clone();l==="local"&&p.applyQuaternion(this.worldQuaternionStart.clone().invert());let u=p.dot(d);p.sub(d.clone().multiplyScalar(u)),p.normalize(),p.multiplyScalar(.45);let m=new h.BufferGeometry;m.setAttribute("position",new h.Float32BufferAttribute([0,0,0,p.x,p.y,p.z],3)),s.geometry.dispose(),s.geometry=m}}else s.position.copy(this.worldPositionStart),s.visible=this.dragging&&this.mode==="translate";else if(s.name==="ARC"){let a=this.mode==="rotate"||this.mode==="all"&&this.activeMode==="rotate";if(s.visible=this.dragging&&a,s.visible&&this.rotationAngle!==0){s.position.copy(this.worldPosition);let l=this.space;l==="local"?s.quaternion.copy(this.worldQuaternionStart):s.quaternion.copy(J);let d=.45,p=Math.max(8,Math.floor(Math.abs(this.rotationAngle)*50)),u=[],m=new h.Vector3;this.axis==="X"||this.axis==="Y"||this.axis==="Z"?m.copy(ie[this.axis]):(this.axis==="E"||this.axis==="XYZE")&&(m.copy(this.rotationAxis),l==="local"&&m.applyQuaternion(this.worldQuaternionStart.clone().invert()));let g=this.pointStart.clone();l==="local"&&g.applyQuaternion(this.worldQuaternionStart.clone().invert());let x=g.dot(m);g.sub(m.clone().multiplyScalar(x)),g.normalize();for(let S=0;S<=p;S++){let R=this.rotationAngle*S/p,M=g.clone(),z=new h.Quaternion().setFromAxisAngle(m,R);M.applyQuaternion(z),M.multiplyScalar(d),u.push(M.x,M.y,M.z)}let w=new h.BufferGeometry;w.setAttribute("position",new h.Float32BufferAttribute(u,3)),s.geometry.dispose(),s.geometry=w}}else if(s.name==="END")if(this.mode==="rotate"||this.mode==="all"){s.position.copy(this.worldPosition);let a=this.mode==="rotate"||this.mode==="all"&&this.activeMode==="rotate";if(s.visible=this.dragging&&a,s.visible){let l=this.space;l==="local"?s.quaternion.copy(this.worldQuaternionStart):s.quaternion.copy(J);let d=new h.BufferGeometry,p=new h.Vector3;this.axis==="X"||this.axis==="Y"||this.axis==="Z"?p.copy(ie[this.axis]):(this.axis==="E"||this.axis==="XYZE")&&(p.copy(this.rotationAxis),l==="local"&&p.applyQuaternion(this.worldQuaternionStart.clone().invert()));let u=this.pointStart.clone();l==="local"&&u.applyQuaternion(this.worldQuaternionStart.clone().invert());let m=u.dot(p);u.sub(p.clone().multiplyScalar(m)),u.normalize();let g=u.clone(),x=new h.Quaternion().setFromAxisAngle(p,this.rotationAngle);g.applyQuaternion(x),g.multiplyScalar(.45),d.setAttribute("position",new h.Float32BufferAttribute([0,0,0,g.x,g.y,g.z],3)),s.geometry.dispose(),s.geometry=d}}else s.position.copy(this.worldPosition),s.visible=!1;else s.name==="DELTA"?(s.position.copy(this.worldPositionStart),s.quaternion.copy(this.worldQuaternionStart),O.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),O.applyQuaternion(this.worldQuaternionStart.clone().invert()),s.scale.copy(O),s.visible=this.dragging):(s.quaternion.copy(t),this.dragging?s.position.copy(this.worldPositionStart):s.position.copy(this.worldPosition),this.axis&&(s.visible=this.axis.search(s.name)!==-1));continue}s.quaternion.copy(t),this.mode==="translate"||this.mode==="scale"?(s.name==="X"&&Math.abs(y.copy(re).applyQuaternion(t).dot(this.eye))>.99&&(s.scale.set(1e-10,1e-10,1e-10),s.visible=!1),s.name==="Y"&&Math.abs(y.copy(K).applyQuaternion(t).dot(this.eye))>.99&&(s.scale.set(1e-10,1e-10,1e-10),s.visible=!1),s.name==="Z"&&Math.abs(y.copy(ae).applyQuaternion(t).dot(this.eye))>.99&&(s.scale.set(1e-10,1e-10,1e-10),s.visible=!1),s.name==="XY"&&Math.abs(y.copy(ae).applyQuaternion(t).dot(this.eye))<.2&&(s.scale.set(1e-10,1e-10,1e-10),s.visible=!1),s.name==="YZ"&&Math.abs(y.copy(re).applyQuaternion(t).dot(this.eye))<.2&&(s.scale.set(1e-10,1e-10,1e-10),s.visible=!1),s.name==="XZ"&&Math.abs(y.copy(K).applyQuaternion(t).dot(this.eye))<.2&&(s.scale.set(1e-10,1e-10,1e-10),s.visible=!1)):this.mode==="rotate"&&(ye.copy(t),y.copy(this.eye).applyQuaternion(T.copy(t).invert()),s.name.search("E")!==-1&&s.quaternion.setFromRotationMatrix(ht.lookAt(this.eye,lt,K)),s.name==="X"&&(T.setFromAxisAngle(re,Math.atan2(-y.y,y.z)),T.multiplyQuaternions(ye,T),s.quaternion.copy(T)),s.name==="Y"&&(T.setFromAxisAngle(K,Math.atan2(y.x,y.z)),T.multiplyQuaternions(ye,T),s.quaternion.copy(T)),s.name==="Z"&&(T.setFromAxisAngle(ae,Math.atan2(y.y,y.x)),T.multiplyQuaternions(ye,T),s.quaternion.copy(T))),s.visible=s.visible&&(s.name.indexOf("X")===-1||this.showX),s.visible=s.visible&&(s.name.indexOf("Y")===-1||this.showY),s.visible=s.visible&&(s.name.indexOf("Z")===-1||this.showZ),s.visible=s.visible&&(s.name.indexOf("E")===-1||this.showX&&this.showY&&this.showZ),s.material._color=s.material._color||s.material.color.clone(),s.material._opacity=s.material._opacity||s.material.opacity,s.material.color.copy(s.material._color),s.material.opacity=s.material._opacity,this.dragging&&(s.material.opacity=.2),this.enabled&&this.axis&&(s.name===this.axis?(s.material.color.setHex(16776960),this.dragging||(s.material.opacity=1)):this.axis.split("").some(function(a){return s.name===a})&&(s.material.color.setHex(16776960),this.dragging||(s.material.opacity=1)))}super.updateMatrixWorld(n)}},we=class extends h.Mesh{constructor(){super(new h.PlaneGeometry(1e5,1e5,2,2),new h.MeshBasicMaterial({visible:!1,wireframe:!0,side:h.DoubleSide,transparent:!0,opacity:.1,toneMapped:!1})),this.isTransformControlsPlane=!0,this.type="TransformControlsPlane"}updateMatrixWorld(n){let e=this.space;switch(this.position.copy(this.worldPosition),this.mode==="scale"&&(e="local"),Me.copy(re).applyQuaternion(e==="local"?this.worldQuaternion:J),oe.copy(K).applyQuaternion(e==="local"?this.worldQuaternion:J),ne.copy(ae).applyQuaternion(e==="local"?this.worldQuaternion:J),y.copy(oe),this.mode){case"translate":case"scale":switch(this.axis){case"X":y.copy(this.eye).cross(Me),Q.copy(Me).cross(y);break;case"Y":y.copy(this.eye).cross(oe),Q.copy(oe).cross(y);break;case"Z":y.copy(this.eye).cross(ne),Q.copy(ne).cross(y);break;case"XY":Q.copy(ne);break;case"YZ":Q.copy(Me);break;case"XZ":y.copy(ne),Q.copy(oe);break;case"XYZ":case"E":Q.set(0,0,0);break}break;case"rotate":default:Q.set(0,0,0)}Q.length()===0?this.quaternion.copy(this.cameraQuaternion):(ct.lookAt(O.set(0,0,0),Q,y),this.quaternion.setFromRotationMatrix(ct)),super.updateMatrixWorld(n)}};var f=Y(require("three")),j={x:"#ed4358",y:"#82cc19",z:"#3185eb"},xe=class extends f.EventDispatcher{constructor(e,t,i={}){super();this.viewport=new f.Vector4;this.animating=!1;this.targetPosition=new f.Vector3;this.targetQuaternion=new f.Quaternion;this.q1=new f.Quaternion;this.q2=new f.Quaternion;this.dummy=new f.Object3D;this.radius=0;this.turnRate=2*Math.PI;this.tempVecA=new f.Vector3;this.interactiveObjects=[];this.raycaster=new f.Raycaster;this.mouse=new f.Vector2;this.controls=i.controls,this.camera=this.controls?.camera??e,this.domElement=t||document.body;let o=i.center??(this.controls?this.controls.getTarget(new f.Vector3):new f.Vector3);this.options={container:i.container||document.body,size:i.size||128,position:i.position||"bottom-right",offset:i.offset||{x:20,y:20},center:o.clone(),labels:{x:i.labels?.x||"x",y:i.labels?.y||"y",z:i.labels?.z||"z",...i.labels}},this.center=this.options.center.clone(),this.scene=new f.Scene,this.scene.background=null,this.orthoCamera=new f.OrthographicCamera(-2,2,2,-2,0,4),this.orthoCamera.position.set(0,0,2),this.createAxes(),this.createSprites(),this.setupEventListeners()}syncActiveCamera(){return this.controls&&(this.camera=this.controls.camera),this.camera}getCameraPosition(e){return this.controls?this.controls.getPosition(e):e.copy(this.camera.position)}createAxes(){let e=new f.CylinderGeometry(.04,.04,.8,5).rotateZ(-Math.PI/2).translate(.4,0,0),t=new f.MeshBasicMaterial({color:j.x,toneMapped:!1}),i=new f.MeshBasicMaterial({color:j.y,toneMapped:!1}),o=new f.MeshBasicMaterial({color:j.z,toneMapped:!1});this.axes={x:new f.Mesh(e.clone(),t),y:new f.Mesh(e.clone(),i),z:new f.Mesh(e.clone(),o)},this.axes.y.rotation.z=Math.PI/2,this.axes.z.rotation.y=-Math.PI/2,this.scene.add(this.axes.x),this.scene.add(this.axes.y),this.scene.add(this.axes.z)}createSprites(){let e=this.createSprite(j.x,this.options.labels.x),t=this.createSprite(j.y,this.options.labels.y),i=this.createSprite(j.z,this.options.labels.z),o=this.createSprite(j.x),s=this.createSprite(j.y),r=this.createSprite(j.z);this.sprites={posX:e,posY:t,posZ:i,negX:o,negY:s,negZ:r},this.sprites.posX.position.set(1,0,0),this.sprites.posY.position.set(0,1,0),this.sprites.posZ.position.set(0,0,1),this.sprites.negX.position.set(-1,0,0),this.sprites.negY.position.set(0,-1,0),this.sprites.negZ.position.set(0,0,-1),this.sprites.negX.material.opacity=.2,this.sprites.negY.material.opacity=.2,this.sprites.negZ.material.opacity=.2,this.sprites.posX.userData.type="posX",this.sprites.posY.userData.type="posY",this.sprites.posZ.userData.type="posZ",this.sprites.negX.userData.type="negX",this.sprites.negY.userData.type="negY",this.sprites.negZ.userData.type="negZ",Object.values(this.sprites).forEach(a=>{this.scene.add(a),this.interactiveObjects.push(a)})}createSprite(e,t){let i=window.devicePixelRatio||1,o=128*i,s=28*i,r=document.createElement("canvas");r.width=o,r.height=o;let a=r.getContext("2d");a.imageSmoothingEnabled=!0,a.imageSmoothingQuality="high",a.scale(i,i);let l=o/(2*i),d=s/i;a.beginPath(),a.arc(l,l,d,0,2*Math.PI),a.closePath(),a.fillStyle=e,a.fill(),t&&(a.font="bold 48px Arial, sans-serif",a.textAlign="center",a.textBaseline="middle",a.fillStyle="#ffffff",a.strokeStyle="#000000",a.lineWidth=2,a.strokeText(t,l,l),a.fillText(t,l,l));let p=new f.CanvasTexture(r);return p.colorSpace=f.SRGBColorSpace,p.generateMipmaps=!1,p.minFilter=f.LinearFilter,p.magFilter=f.LinearFilter,new f.Sprite(new f.SpriteMaterial({map:p,toneMapped:!1,alphaTest:.1}))}setupEventListeners(){this.pointerDownHandler=e=>{this.handleClick(e)},this.domElement.addEventListener("pointerdown",this.pointerDownHandler)}render(e){this.renderer=e;let t=this.syncActiveCamera();this.scene.quaternion.copy(t.quaternion).invert(),this.scene.updateMatrixWorld();let i=this.options.size,o=e.domElement.width/e.getPixelRatio(),s=e.domElement.height/e.getPixelRatio(),r,a;switch(this.options.position){case"top-left":r=this.options.offset.x,a=s-i-this.options.offset.y;break;case"top-right":r=o-i-this.options.offset.x,a=s-i-this.options.offset.y;break;case"bottom-left":r=this.options.offset.x,a=this.options.offset.y;break;case"bottom-right":default:r=o-i-this.options.offset.x,a=this.options.offset.y;break}e.getViewport(this.viewport);let l=new f.Vector4;e.getScissor(l);let d=e.getScissorTest(),p=e.getRenderTarget(),u=e.getActiveCubeFace(),m=e.getActiveMipmapLevel(),g=e.autoClear;e.setRenderTarget(null),e.setViewport(r,a,i,i),e.autoClear=!1,e.setScissorTest(!0),e.setScissor(r,a,i,i),e.clearDepth(),e.render(this.scene,this.orthoCamera),e.setRenderTarget(p,u,m),e.setViewport(this.viewport.x,this.viewport.y,this.viewport.z,this.viewport.w),e.setScissor(l),e.setScissorTest(d),e.autoClear=g}handleClick(e){if(this.animating||!this.renderer)return!1;this.syncActiveCamera();let t=this.domElement.getBoundingClientRect(),i=this.options.size,o,s;switch(this.options.position){case"top-left":o=t.left+this.options.offset.x,s=t.top+this.options.offset.y;break;case"top-right":o=t.left+t.width-i-this.options.offset.x,s=t.top+this.options.offset.y;break;case"bottom-left":o=t.left+this.options.offset.x,s=t.top+t.height-i-this.options.offset.y;break;case"bottom-right":default:o=t.left+t.width-i-this.options.offset.x,s=t.top+t.height-i-this.options.offset.y;break}if(this.mouse.x=(e.clientX-o)/i*2-1,this.mouse.y=-((e.clientY-s)/i)*2+1,this.mouse.x<-1||this.mouse.x>1||this.mouse.y<-1||this.mouse.y>1)return!1;this.raycaster.setFromCamera(this.mouse,this.orthoCamera);let r=this.raycaster.intersectObjects(this.interactiveObjects);if(r.length>0){let l=r[0].object;return this.prepareAnimationData(l,this.center),this.controls?this.startControlsAnimation(this.center):(this.animating=!0,this.dispatchEvent({type:"animationStart"})),!0}return!1}prepareAnimationData(e,t){switch(e.userData.type){case"posX":this.targetPosition.set(1,0,0),this.targetQuaternion.setFromEuler(new f.Euler(0,Math.PI*.5,0));break;case"posY":this.targetPosition.set(0,1,0),this.targetQuaternion.setFromEuler(new f.Euler(-Math.PI*.5,0,0));break;case"posZ":this.targetPosition.set(0,0,1),this.targetQuaternion.setFromEuler(new f.Euler);break;case"negX":this.targetPosition.set(-1,0,0),this.targetQuaternion.setFromEuler(new f.Euler(0,-Math.PI*.5,0));break;case"negY":this.targetPosition.set(0,-1,0),this.targetQuaternion.setFromEuler(new f.Euler(Math.PI*.5,0,0));break;case"negZ":this.targetPosition.set(0,0,-1),this.targetQuaternion.setFromEuler(new f.Euler(0,Math.PI,0));break;default:console.error("ViewHelper: Invalid axis.");return}let i=this.getCameraPosition(this.tempVecA);this.radius=i.distanceTo(t),this.targetPosition.multiplyScalar(this.radius).add(t),this.dummy.position.copy(t),this.dummy.lookAt(i),this.q1.copy(this.dummy.quaternion),this.dummy.lookAt(this.targetPosition),this.q2.copy(this.dummy.quaternion)}startControlsAnimation(e){let t=this.controls;if(!t)return;t.enabled=!1,t.stop?.(),this.animating=!0,this.dispatchEvent({type:"animationStart"});let i=()=>{t.setLookAt(this.targetPosition.x,this.targetPosition.y,this.targetPosition.z,e.x,e.y,e.z,!0),setTimeout(()=>{t.enabled=!0},100)};try{Promise.resolve(i()).catch(o=>{console.warn("ViewHelper: Unable to set camera look-at.",o)}).finally(()=>{this.animating=!1,this.dispatchEvent({type:"animationEnd"})})}catch(o){console.warn("ViewHelper: Unable to set camera look-at.",o),this.animating=!1,this.dispatchEvent({type:"animationEnd"})}}update(e){if(this.syncActiveCamera(),this.controls||!this.animating)return;let t=e*this.turnRate;this.q1.rotateTowards(this.q2,t),this.camera.position.set(0,0,1).applyQuaternion(this.q1).multiplyScalar(this.radius).add(this.center),this.camera.quaternion.rotateTowards(this.targetQuaternion,t),this.q1.angleTo(this.q2)===0&&(this.animating=!1,this.dispatchEvent({type:"animationEnd"}))}setLabels(e,t,i){e!==void 0&&(this.options.labels.x=e),t!==void 0&&(this.options.labels.y=t),i!==void 0&&(this.options.labels.z=i),this.updateLabels()}updateLabels(){this.sprites.posX.material.map?.dispose(),this.sprites.posY.material.map?.dispose(),this.sprites.posZ.material.map?.dispose(),this.sprites.posX.material.dispose(),this.sprites.posY.material.dispose(),this.sprites.posZ.material.dispose();let e=this.createSprite(j.x,this.options.labels.x),t=this.createSprite(j.y,this.options.labels.y),i=this.createSprite(j.z,this.options.labels.z);this.sprites.posX.material=e.material,this.sprites.posY.material=t.material,this.sprites.posZ.material=i.material}dispose(){this.axes.x.geometry.dispose(),this.axes.y.geometry.dispose(),this.axes.z.geometry.dispose(),this.axes.x.material.dispose(),this.axes.y.material.dispose(),this.axes.z.material.dispose(),Object.values(this.sprites).forEach(e=>{e.material.map?.dispose(),e.material.dispose()}),this.pointerDownHandler&&this.domElement.removeEventListener("pointerdown",this.pointerDownHandler)}};0&&(module.exports={AssetLoader,CompassOverlay,DualCameraControls,InfiniteGrid,MeasurementTool,OutlineTool,SnapMode,SunLightTool,TerrainTool,TransformControls,TransformControlsGizmo,TransformControlsPlane,ViewHelper,calculateBoundingBoxCenter});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{a as L,b as O,c as y,d as H}from"./chunk-WZ4X7GQ2.mjs";import{a as b}from"./chunk-UJF4S4J3.mjs";import{a as f}from"./chunk-B75TYEOO.mjs";import{a as E}from"./chunk-OJFYE56U.mjs";import{a as g}from"./chunk-4O4ENFL7.mjs";import{a as m}from"./chunk-Z5VL3O6M.mjs";import{a as M,b as R}from"./chunk-JRJBW66X.mjs";import{a as T}from"./chunk-EQRUOKFV.mjs";import{a as v}from"./chunk-55YVGK52.mjs";import*as n from"three";import{LineSegments2 as u}from"three/examples/jsm/lines/LineSegments2.js";import{LineSegmentsGeometry as c}from"three/examples/jsm/lines/LineSegmentsGeometry.js";import{LineMaterial as p}from"three/examples/jsm/lines/LineMaterial.js";var a=class a{constructor(e,i={}){this.outlineData=new Map;this.lineMaterial=null;this.composer=null;this.idRenderTarget=null;this.idMaterial=null;this.handleResize=()=>{let e=this.renderer.getSize(new n.Vector2);this.lineMaterial&&this.lineMaterial.resolution.set(e.width,e.height),this.idRenderTarget&&this.idRenderTarget.setSize(e.width,e.height),this.composer&&this.composer.setSize(e.width,e.height)};this.renderer=e,this.options={outlineColor:i.outlineColor??16711680,edgeLineWidth:i.edgeLineWidth??2,edgeLineColor:i.edgeLineColor??16711680,edgeThreshold:i.edgeThreshold??30,outlineScale:i.outlineScale??1.02,enableSilhouette:i.enableSilhouette??!0,enableEdgeLines:i.enableEdgeLines??!0,edgeStrength:i.edgeStrength??1,excludeFilter:i.excludeFilter??a.defaultExcludeFilter};let t=e.getSize(new n.Vector2);this.lineMaterial=new p({color:this.options.edgeLineColor,linewidth:this.options.edgeLineWidth,resolution:new n.Vector2(t.width,t.height)}),window.addEventListener("resize",this.handleResize)}addObjects(e){e.forEach(i=>this.addObject(i))}addObject(e){let i=e.uuid;if(this.outlineData.has(i)){console.warn(`Object ${e.name||i} is already outlined`);return}let t=[];e.traverse(s=>{if(!this.isMesh(s)||this.options.excludeFilter(s))return;let r=s,o={originalObject:r,parent:r.parent};this.options.enableSilhouette&&(o.silhouetteMesh=this.createSilhouette(r),r.parent.add(o.silhouetteMesh)),this.options.enableEdgeLines&&(o.edgeLines=this.createEdgeLines(r),r.parent.add(o.edgeLines)),t.push(o)}),t.length>0&&this.outlineData.set(i,t)}removeObjects(e){e.forEach(i=>this.removeObject(i))}removeObject(e){let i=e.uuid,t=this.outlineData.get(i);t&&(t.forEach(s=>{s.silhouetteMesh&&(s.parent.remove(s.silhouetteMesh),this.disposeMesh(s.silhouetteMesh)),s.edgeLines&&(s.parent.remove(s.edgeLines),this.disposeLineSegments(s.edgeLines)),s.originalObject.userData.outlineIdColor&&delete s.originalObject.userData.outlineIdColor}),this.outlineData.delete(i))}clearAll(){Array.from(this.outlineData.keys()).forEach(i=>{let t=this.outlineData.get(i);t&&t.length>0&&this.removeObject(t[0].originalObject.parent)})}update(){this.outlineData.forEach(e=>{e.forEach(i=>{let t=i.originalObject;i.silhouetteMesh&&(i.silhouetteMesh.position.copy(t.position),i.silhouetteMesh.rotation.copy(t.rotation),i.silhouetteMesh.quaternion.copy(t.quaternion),i.silhouetteMesh.scale.copy(t.scale),i.silhouetteMesh.scale.multiplyScalar(this.options.outlineScale)),i.edgeLines&&(i.edgeLines.position.copy(t.position),i.edgeLines.rotation.copy(t.rotation),i.edgeLines.quaternion.copy(t.quaternion),i.edgeLines.scale.copy(t.scale))})})}render(e,i){this.renderIdBuffer(e,i),this.composer.render()}renderIdBuffer(e,i){if(!this.idRenderTarget||!this.idMaterial)return;let t=this.renderer.getRenderTarget(),s=e.overrideMaterial,r=new Map;e.traverse(o=>{r.set(o,o.visible),this.isMesh(o)&&!o.userData.outlineIdColor&&(o.visible=!1)}),e.overrideMaterial=this.idMaterial,e.traverse(o=>{if(!this.isMesh(o))return;let l=o;l.onBeforeRender=()=>{let h=l.userData.outlineIdColor;h&&this.idMaterial.color.copy(h)}}),this.renderer.setRenderTarget(this.idRenderTarget),this.renderer.clear(),this.renderer.render(e,i),e.traverse(o=>{if(!this.isMesh(o))return;o.onBeforeRender=()=>{};let l=r.get(o);l!==void 0&&(o.visible=l)}),e.overrideMaterial=s,this.renderer.setRenderTarget(t)}setOptions(e){let i=e.outlineColor!==void 0||e.edgeLineColor!==void 0||e.edgeThreshold!==void 0||e.enableSilhouette!==void 0||e.enableEdgeLines!==void 0;if(Object.assign(this.options,e),e.edgeLineWidth!==void 0&&this.lineMaterial&&(this.lineMaterial.linewidth=e.edgeLineWidth),e.edgeLineColor!==void 0&&this.lineMaterial&&this.lineMaterial.color.setHex(e.edgeLineColor),i){let t=[];this.outlineData.forEach(s=>{if(s.length>0){let r=s[0].originalObject;for(;r.parent&&!this.outlineData.has(r.parent.uuid);)r=r.parent;t.push(r)}}),this.clearAll(),this.addObjects(t)}}createSilhouette(e){let i=e.clone();return i.material=new n.MeshBasicMaterial({color:this.options.outlineColor,side:n.BackSide}),i.renderOrder=-1,i.scale.multiplyScalar(this.options.outlineScale),i.userData.excludeOutline=!0,i}createEdgeLines(e){if(!this.lineMaterial)throw new Error("Line material not initialized");let i=new n.EdgesGeometry(e.geometry,this.options.edgeThreshold),t=new c,s=i.attributes.position.array;t.setPositions(s);let r=new u(t,this.lineMaterial);return r.computeLineDistances(),r.scale.copy(e.scale),r.rotation.copy(e.rotation),r.position.copy(e.position),r.userData.excludeOutline=!0,i.dispose(),r}isMesh(e){return e.isMesh===!0}disposeMesh(e){e.geometry&&e.geometry.dispose(),Array.isArray(e.material)?e.material.forEach(i=>i.dispose()):e.material&&e.material.dispose()}disposeLineSegments(e){e.geometry&&e.geometry.dispose()}dispose(){this.clearAll(),this.lineMaterial&&this.lineMaterial.dispose(),this.idRenderTarget&&this.idRenderTarget.dispose(),this.idMaterial&&this.idMaterial.dispose(),this.composer&&(this.composer=null),window.removeEventListener("resize",this.handleResize)}};a.defaultExcludeFilter=e=>{if(e.type==="Line2"||e.type==="LineSegments2"||e.type.includes("Helper")||e.userData.excludeOutline)return!0;let i=e.name.toLowerCase();return!!(i.includes("arrow")||i.includes("gizmo")||i.includes("control"))};var d=a;export{f as AssetLoader,g as CompassOverlay,E as DualCameraControls,m as InfiniteGrid,R as MeasurementTool,d as OutlineTool,M as SnapMode,T as SunLightTool,v as TerrainTool,L as TransformControls,y as TransformControlsGizmo,H as TransformControlsPlane,b as ViewHelper,O as calculateBoundingBoxCenter};
1
+ import{a as L,b as O,c as y,d as H}from"./chunk-WZ4X7GQ2.mjs";import{a as b}from"./chunk-CLSRN5D2.mjs";import{a as f}from"./chunk-B75TYEOO.mjs";import{a as E}from"./chunk-OJFYE56U.mjs";import{a as g}from"./chunk-4O4ENFL7.mjs";import{a as m}from"./chunk-Z5VL3O6M.mjs";import{a as M,b as R}from"./chunk-JRJBW66X.mjs";import{a as T}from"./chunk-EQRUOKFV.mjs";import{a as v}from"./chunk-55YVGK52.mjs";import*as n from"three";import{LineSegments2 as u}from"three/examples/jsm/lines/LineSegments2.js";import{LineSegmentsGeometry as c}from"three/examples/jsm/lines/LineSegmentsGeometry.js";import{LineMaterial as p}from"three/examples/jsm/lines/LineMaterial.js";var a=class a{constructor(e,i={}){this.outlineData=new Map;this.lineMaterial=null;this.composer=null;this.idRenderTarget=null;this.idMaterial=null;this.handleResize=()=>{let e=this.renderer.getSize(new n.Vector2);this.lineMaterial&&this.lineMaterial.resolution.set(e.width,e.height),this.idRenderTarget&&this.idRenderTarget.setSize(e.width,e.height),this.composer&&this.composer.setSize(e.width,e.height)};this.renderer=e,this.options={outlineColor:i.outlineColor??16711680,edgeLineWidth:i.edgeLineWidth??2,edgeLineColor:i.edgeLineColor??16711680,edgeThreshold:i.edgeThreshold??30,outlineScale:i.outlineScale??1.02,enableSilhouette:i.enableSilhouette??!0,enableEdgeLines:i.enableEdgeLines??!0,edgeStrength:i.edgeStrength??1,excludeFilter:i.excludeFilter??a.defaultExcludeFilter};let t=e.getSize(new n.Vector2);this.lineMaterial=new p({color:this.options.edgeLineColor,linewidth:this.options.edgeLineWidth,resolution:new n.Vector2(t.width,t.height)}),window.addEventListener("resize",this.handleResize)}addObjects(e){e.forEach(i=>this.addObject(i))}addObject(e){let i=e.uuid;if(this.outlineData.has(i)){console.warn(`Object ${e.name||i} is already outlined`);return}let t=[];e.traverse(s=>{if(!this.isMesh(s)||this.options.excludeFilter(s))return;let r=s,o={originalObject:r,parent:r.parent};this.options.enableSilhouette&&(o.silhouetteMesh=this.createSilhouette(r),r.parent.add(o.silhouetteMesh)),this.options.enableEdgeLines&&(o.edgeLines=this.createEdgeLines(r),r.parent.add(o.edgeLines)),t.push(o)}),t.length>0&&this.outlineData.set(i,t)}removeObjects(e){e.forEach(i=>this.removeObject(i))}removeObject(e){let i=e.uuid,t=this.outlineData.get(i);t&&(t.forEach(s=>{s.silhouetteMesh&&(s.parent.remove(s.silhouetteMesh),this.disposeMesh(s.silhouetteMesh)),s.edgeLines&&(s.parent.remove(s.edgeLines),this.disposeLineSegments(s.edgeLines)),s.originalObject.userData.outlineIdColor&&delete s.originalObject.userData.outlineIdColor}),this.outlineData.delete(i))}clearAll(){Array.from(this.outlineData.keys()).forEach(i=>{let t=this.outlineData.get(i);t&&t.length>0&&this.removeObject(t[0].originalObject.parent)})}update(){this.outlineData.forEach(e=>{e.forEach(i=>{let t=i.originalObject;i.silhouetteMesh&&(i.silhouetteMesh.position.copy(t.position),i.silhouetteMesh.rotation.copy(t.rotation),i.silhouetteMesh.quaternion.copy(t.quaternion),i.silhouetteMesh.scale.copy(t.scale),i.silhouetteMesh.scale.multiplyScalar(this.options.outlineScale)),i.edgeLines&&(i.edgeLines.position.copy(t.position),i.edgeLines.rotation.copy(t.rotation),i.edgeLines.quaternion.copy(t.quaternion),i.edgeLines.scale.copy(t.scale))})})}render(e,i){this.renderIdBuffer(e,i),this.composer.render()}renderIdBuffer(e,i){if(!this.idRenderTarget||!this.idMaterial)return;let t=this.renderer.getRenderTarget(),s=e.overrideMaterial,r=new Map;e.traverse(o=>{r.set(o,o.visible),this.isMesh(o)&&!o.userData.outlineIdColor&&(o.visible=!1)}),e.overrideMaterial=this.idMaterial,e.traverse(o=>{if(!this.isMesh(o))return;let l=o;l.onBeforeRender=()=>{let h=l.userData.outlineIdColor;h&&this.idMaterial.color.copy(h)}}),this.renderer.setRenderTarget(this.idRenderTarget),this.renderer.clear(),this.renderer.render(e,i),e.traverse(o=>{if(!this.isMesh(o))return;o.onBeforeRender=()=>{};let l=r.get(o);l!==void 0&&(o.visible=l)}),e.overrideMaterial=s,this.renderer.setRenderTarget(t)}setOptions(e){let i=e.outlineColor!==void 0||e.edgeLineColor!==void 0||e.edgeThreshold!==void 0||e.enableSilhouette!==void 0||e.enableEdgeLines!==void 0;if(Object.assign(this.options,e),e.edgeLineWidth!==void 0&&this.lineMaterial&&(this.lineMaterial.linewidth=e.edgeLineWidth),e.edgeLineColor!==void 0&&this.lineMaterial&&this.lineMaterial.color.setHex(e.edgeLineColor),i){let t=[];this.outlineData.forEach(s=>{if(s.length>0){let r=s[0].originalObject;for(;r.parent&&!this.outlineData.has(r.parent.uuid);)r=r.parent;t.push(r)}}),this.clearAll(),this.addObjects(t)}}createSilhouette(e){let i=e.clone();return i.material=new n.MeshBasicMaterial({color:this.options.outlineColor,side:n.BackSide}),i.renderOrder=-1,i.scale.multiplyScalar(this.options.outlineScale),i.userData.excludeOutline=!0,i}createEdgeLines(e){if(!this.lineMaterial)throw new Error("Line material not initialized");let i=new n.EdgesGeometry(e.geometry,this.options.edgeThreshold),t=new c,s=i.attributes.position.array;t.setPositions(s);let r=new u(t,this.lineMaterial);return r.computeLineDistances(),r.scale.copy(e.scale),r.rotation.copy(e.rotation),r.position.copy(e.position),r.userData.excludeOutline=!0,i.dispose(),r}isMesh(e){return e.isMesh===!0}disposeMesh(e){e.geometry&&e.geometry.dispose(),Array.isArray(e.material)?e.material.forEach(i=>i.dispose()):e.material&&e.material.dispose()}disposeLineSegments(e){e.geometry&&e.geometry.dispose()}dispose(){this.clearAll(),this.lineMaterial&&this.lineMaterial.dispose(),this.idRenderTarget&&this.idRenderTarget.dispose(),this.idMaterial&&this.idMaterial.dispose(),this.composer&&(this.composer=null),window.removeEventListener("resize",this.handleResize)}};a.defaultExcludeFilter=e=>{if(e.type==="Line2"||e.type==="LineSegments2"||e.type.includes("Helper")||e.userData.excludeOutline)return!0;let i=e.name.toLowerCase();return!!(i.includes("arrow")||i.includes("gizmo")||i.includes("control"))};var d=a;export{f as AssetLoader,g as CompassOverlay,E as DualCameraControls,m as InfiniteGrid,R as MeasurementTool,d as OutlineTool,M as SnapMode,T as SunLightTool,v as TerrainTool,L as TransformControls,y as TransformControlsGizmo,H as TransformControlsPlane,b as ViewHelper,O as calculateBoundingBoxCenter};
@@ -1 +1 @@
1
- "use strict";var f=Object.create;var m=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var b=(n,p)=>{for(var t in p)m(n,t,{get:p[t],enumerable:!0})},d=(n,p,t,s)=>{if(p&&typeof p=="object"||typeof p=="function")for(let e of T(p))!R.call(n,e)&&e!==t&&m(n,e,{get:()=>p[e],enumerable:!(s=H(p,e))||s.enumerable});return n};var v=(n,p,t)=>(t=n!=null?f(y(n)):{},d(p||!n||!n.__esModule?m(t,"default",{value:n,enumerable:!0}):t,n)),w=n=>d(m({},"__esModule",{value:!0}),n);var x={};b(x,{ViewHelper:()=>u});module.exports=w(x);var i=v(require("three")),c={x:"#ed4358",y:"#82cc19",z:"#3185eb"},u=class extends i.EventDispatcher{constructor(t,s,e={}){super();this.viewport=new i.Vector4;this.animating=!1;this.targetPosition=new i.Vector3;this.targetQuaternion=new i.Quaternion;this.q1=new i.Quaternion;this.q2=new i.Quaternion;this.dummy=new i.Object3D;this.radius=0;this.turnRate=2*Math.PI;this.tempVecA=new i.Vector3;this.interactiveObjects=[];this.raycaster=new i.Raycaster;this.mouse=new i.Vector2;this.controls=e.controls,this.camera=this.controls?.camera??t,this.domElement=s||document.body;let a=e.center??(this.controls?this.controls.getTarget(new i.Vector3):new i.Vector3);this.options={container:e.container||document.body,size:e.size||128,position:e.position||"bottom-right",offset:e.offset||{x:20,y:20},center:a.clone(),labels:{x:e.labels?.x||"x",y:e.labels?.y||"y",z:e.labels?.z||"z",...e.labels}},this.center=this.options.center.clone(),this.scene=new i.Scene,this.scene.background=null,this.orthoCamera=new i.OrthographicCamera(-2,2,2,-2,0,4),this.orthoCamera.position.set(0,0,2),this.createAxes(),this.createSprites(),this.setupEventListeners()}syncActiveCamera(){return this.controls&&(this.camera=this.controls.camera),this.camera}getCameraPosition(t){return this.controls?this.controls.getPosition(t):t.copy(this.camera.position)}createAxes(){let t=new i.CylinderGeometry(.04,.04,.8,5).rotateZ(-Math.PI/2).translate(.4,0,0),s=new i.MeshBasicMaterial({color:c.x,toneMapped:!1}),e=new i.MeshBasicMaterial({color:c.y,toneMapped:!1}),a=new i.MeshBasicMaterial({color:c.z,toneMapped:!1});this.axes={x:new i.Mesh(t.clone(),s),y:new i.Mesh(t.clone(),e),z:new i.Mesh(t.clone(),a)},this.axes.y.rotation.z=Math.PI/2,this.axes.z.rotation.y=-Math.PI/2,this.scene.add(this.axes.x),this.scene.add(this.axes.y),this.scene.add(this.axes.z)}createSprites(){let t=this.createSprite(c.x,this.options.labels.x),s=this.createSprite(c.y,this.options.labels.y),e=this.createSprite(c.z,this.options.labels.z),a=this.createSprite(c.x),h=this.createSprite(c.y),r=this.createSprite(c.z);this.sprites={posX:t,posY:s,posZ:e,negX:a,negY:h,negZ:r},this.sprites.posX.position.set(1,0,0),this.sprites.posY.position.set(0,1,0),this.sprites.posZ.position.set(0,0,1),this.sprites.negX.position.set(-1,0,0),this.sprites.negY.position.set(0,-1,0),this.sprites.negZ.position.set(0,0,-1),this.sprites.negX.material.opacity=.2,this.sprites.negY.material.opacity=.2,this.sprites.negZ.material.opacity=.2,this.sprites.posX.userData.type="posX",this.sprites.posY.userData.type="posY",this.sprites.posZ.userData.type="posZ",this.sprites.negX.userData.type="negX",this.sprites.negY.userData.type="negY",this.sprites.negZ.userData.type="negZ",Object.values(this.sprites).forEach(o=>{this.scene.add(o),this.interactiveObjects.push(o)})}createSprite(t,s){let e=window.devicePixelRatio||1,a=128*e,h=28*e,r=document.createElement("canvas");r.width=a,r.height=a;let o=r.getContext("2d");o.imageSmoothingEnabled=!0,o.imageSmoothingQuality="high",o.scale(e,e);let l=a/(2*e),g=h/e;o.beginPath(),o.arc(l,l,g,0,2*Math.PI),o.closePath(),o.fillStyle=t,o.fill(),s&&(o.font="bold 48px Arial, sans-serif",o.textAlign="center",o.textBaseline="middle",o.fillStyle="#ffffff",o.strokeStyle="#000000",o.lineWidth=2,o.strokeText(s,l,l),o.fillText(s,l,l));let E=new i.CanvasTexture(r);return E.colorSpace=i.SRGBColorSpace,E.generateMipmaps=!1,E.minFilter=i.LinearFilter,E.magFilter=i.LinearFilter,new i.Sprite(new i.SpriteMaterial({map:E,toneMapped:!1,alphaTest:.1}))}setupEventListeners(){this.pointerDownHandler=t=>{this.handleClick(t)},this.domElement.addEventListener("pointerdown",this.pointerDownHandler)}render(t){this.renderer=t;let s=this.syncActiveCamera();this.scene.quaternion.copy(s.quaternion).invert(),this.scene.updateMatrixWorld();let e=this.options.size,a=t.domElement.width/t.getPixelRatio(),h=t.domElement.height/t.getPixelRatio(),r,o;switch(this.options.position){case"top-left":r=this.options.offset.x,o=h-e-this.options.offset.y;break;case"top-right":r=a-e-this.options.offset.x,o=h-e-this.options.offset.y;break;case"bottom-left":r=this.options.offset.x,o=this.options.offset.y;break;case"bottom-right":default:r=a-e-this.options.offset.x,o=this.options.offset.y;break}t.getViewport(this.viewport);let l=t.autoClear;t.setViewport(r,o,e,e),t.autoClear=!1,t.setScissorTest(!0),t.setScissor(r,o,e,e),t.clearDepth(),t.render(this.scene,this.orthoCamera),t.setScissorTest(!1),t.autoClear=l,t.setViewport(this.viewport.x,this.viewport.y,this.viewport.z,this.viewport.w)}handleClick(t){if(this.animating||!this.renderer)return!1;this.syncActiveCamera();let s=this.domElement.getBoundingClientRect(),e=this.options.size,a,h;switch(this.options.position){case"top-left":a=s.left+this.options.offset.x,h=s.top+this.options.offset.y;break;case"top-right":a=s.left+s.width-e-this.options.offset.x,h=s.top+this.options.offset.y;break;case"bottom-left":a=s.left+this.options.offset.x,h=s.top+s.height-e-this.options.offset.y;break;case"bottom-right":default:a=s.left+s.width-e-this.options.offset.x,h=s.top+s.height-e-this.options.offset.y;break}if(this.mouse.x=(t.clientX-a)/e*2-1,this.mouse.y=-((t.clientY-h)/e)*2+1,this.mouse.x<-1||this.mouse.x>1||this.mouse.y<-1||this.mouse.y>1)return!1;this.raycaster.setFromCamera(this.mouse,this.orthoCamera);let r=this.raycaster.intersectObjects(this.interactiveObjects);if(r.length>0){let l=r[0].object;return this.prepareAnimationData(l,this.center),this.controls?this.startControlsAnimation(this.center):(this.animating=!0,this.dispatchEvent({type:"animationStart"})),!0}return!1}prepareAnimationData(t,s){switch(t.userData.type){case"posX":this.targetPosition.set(1,0,0),this.targetQuaternion.setFromEuler(new i.Euler(0,Math.PI*.5,0));break;case"posY":this.targetPosition.set(0,1,0),this.targetQuaternion.setFromEuler(new i.Euler(-Math.PI*.5,0,0));break;case"posZ":this.targetPosition.set(0,0,1),this.targetQuaternion.setFromEuler(new i.Euler);break;case"negX":this.targetPosition.set(-1,0,0),this.targetQuaternion.setFromEuler(new i.Euler(0,-Math.PI*.5,0));break;case"negY":this.targetPosition.set(0,-1,0),this.targetQuaternion.setFromEuler(new i.Euler(Math.PI*.5,0,0));break;case"negZ":this.targetPosition.set(0,0,-1),this.targetQuaternion.setFromEuler(new i.Euler(0,Math.PI,0));break;default:console.error("ViewHelper: Invalid axis.");return}let e=this.getCameraPosition(this.tempVecA);this.radius=e.distanceTo(s),this.targetPosition.multiplyScalar(this.radius).add(s),this.dummy.position.copy(s),this.dummy.lookAt(e),this.q1.copy(this.dummy.quaternion),this.dummy.lookAt(this.targetPosition),this.q2.copy(this.dummy.quaternion)}startControlsAnimation(t){let s=this.controls;if(!s)return;s.enabled=!1,s.stop?.(),this.animating=!0,this.dispatchEvent({type:"animationStart"});let e=()=>{s.setLookAt(this.targetPosition.x,this.targetPosition.y,this.targetPosition.z,t.x,t.y,t.z,!0),setTimeout(()=>{s.enabled=!0},100)};try{Promise.resolve(e()).catch(a=>{console.warn("ViewHelper: Unable to set camera look-at.",a)}).finally(()=>{this.animating=!1,this.dispatchEvent({type:"animationEnd"})})}catch(a){console.warn("ViewHelper: Unable to set camera look-at.",a),this.animating=!1,this.dispatchEvent({type:"animationEnd"})}}update(t){if(this.syncActiveCamera(),this.controls||!this.animating)return;let s=t*this.turnRate;this.q1.rotateTowards(this.q2,s),this.camera.position.set(0,0,1).applyQuaternion(this.q1).multiplyScalar(this.radius).add(this.center),this.camera.quaternion.rotateTowards(this.targetQuaternion,s),this.q1.angleTo(this.q2)===0&&(this.animating=!1,this.dispatchEvent({type:"animationEnd"}))}setLabels(t,s,e){t!==void 0&&(this.options.labels.x=t),s!==void 0&&(this.options.labels.y=s),e!==void 0&&(this.options.labels.z=e),this.updateLabels()}updateLabels(){this.sprites.posX.material.map?.dispose(),this.sprites.posY.material.map?.dispose(),this.sprites.posZ.material.map?.dispose(),this.sprites.posX.material.dispose(),this.sprites.posY.material.dispose(),this.sprites.posZ.material.dispose();let t=this.createSprite(c.x,this.options.labels.x),s=this.createSprite(c.y,this.options.labels.y),e=this.createSprite(c.z,this.options.labels.z);this.sprites.posX.material=t.material,this.sprites.posY.material=s.material,this.sprites.posZ.material=e.material}dispose(){this.axes.x.geometry.dispose(),this.axes.y.geometry.dispose(),this.axes.z.geometry.dispose(),this.axes.x.material.dispose(),this.axes.y.material.dispose(),this.axes.z.material.dispose(),Object.values(this.sprites).forEach(t=>{t.material.map?.dispose(),t.material.dispose()}),this.pointerDownHandler&&this.domElement.removeEventListener("pointerdown",this.pointerDownHandler)}};0&&(module.exports={ViewHelper});
1
+ "use strict";var v=Object.create;var m=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty;var x=(n,p)=>{for(var t in p)m(n,t,{get:p[t],enumerable:!0})},g=(n,p,t,s)=>{if(p&&typeof p=="object"||typeof p=="function")for(let e of b(p))!w.call(n,e)&&e!==t&&m(n,e,{get:()=>p[e],enumerable:!(s=R(p,e))||s.enumerable});return n};var S=(n,p,t)=>(t=n!=null?v(y(n)):{},g(p||!n||!n.__esModule?m(t,"default",{value:n,enumerable:!0}):t,n)),C=n=>g(m({},"__esModule",{value:!0}),n);var M={};x(M,{ViewHelper:()=>u});module.exports=C(M);var i=S(require("three")),h={x:"#ed4358",y:"#82cc19",z:"#3185eb"},u=class extends i.EventDispatcher{constructor(t,s,e={}){super();this.viewport=new i.Vector4;this.animating=!1;this.targetPosition=new i.Vector3;this.targetQuaternion=new i.Quaternion;this.q1=new i.Quaternion;this.q2=new i.Quaternion;this.dummy=new i.Object3D;this.radius=0;this.turnRate=2*Math.PI;this.tempVecA=new i.Vector3;this.interactiveObjects=[];this.raycaster=new i.Raycaster;this.mouse=new i.Vector2;this.controls=e.controls,this.camera=this.controls?.camera??t,this.domElement=s||document.body;let a=e.center??(this.controls?this.controls.getTarget(new i.Vector3):new i.Vector3);this.options={container:e.container||document.body,size:e.size||128,position:e.position||"bottom-right",offset:e.offset||{x:20,y:20},center:a.clone(),labels:{x:e.labels?.x||"x",y:e.labels?.y||"y",z:e.labels?.z||"z",...e.labels}},this.center=this.options.center.clone(),this.scene=new i.Scene,this.scene.background=null,this.orthoCamera=new i.OrthographicCamera(-2,2,2,-2,0,4),this.orthoCamera.position.set(0,0,2),this.createAxes(),this.createSprites(),this.setupEventListeners()}syncActiveCamera(){return this.controls&&(this.camera=this.controls.camera),this.camera}getCameraPosition(t){return this.controls?this.controls.getPosition(t):t.copy(this.camera.position)}createAxes(){let t=new i.CylinderGeometry(.04,.04,.8,5).rotateZ(-Math.PI/2).translate(.4,0,0),s=new i.MeshBasicMaterial({color:h.x,toneMapped:!1}),e=new i.MeshBasicMaterial({color:h.y,toneMapped:!1}),a=new i.MeshBasicMaterial({color:h.z,toneMapped:!1});this.axes={x:new i.Mesh(t.clone(),s),y:new i.Mesh(t.clone(),e),z:new i.Mesh(t.clone(),a)},this.axes.y.rotation.z=Math.PI/2,this.axes.z.rotation.y=-Math.PI/2,this.scene.add(this.axes.x),this.scene.add(this.axes.y),this.scene.add(this.axes.z)}createSprites(){let t=this.createSprite(h.x,this.options.labels.x),s=this.createSprite(h.y,this.options.labels.y),e=this.createSprite(h.z,this.options.labels.z),a=this.createSprite(h.x),c=this.createSprite(h.y),r=this.createSprite(h.z);this.sprites={posX:t,posY:s,posZ:e,negX:a,negY:c,negZ:r},this.sprites.posX.position.set(1,0,0),this.sprites.posY.position.set(0,1,0),this.sprites.posZ.position.set(0,0,1),this.sprites.negX.position.set(-1,0,0),this.sprites.negY.position.set(0,-1,0),this.sprites.negZ.position.set(0,0,-1),this.sprites.negX.material.opacity=.2,this.sprites.negY.material.opacity=.2,this.sprites.negZ.material.opacity=.2,this.sprites.posX.userData.type="posX",this.sprites.posY.userData.type="posY",this.sprites.posZ.userData.type="posZ",this.sprites.negX.userData.type="negX",this.sprites.negY.userData.type="negY",this.sprites.negZ.userData.type="negZ",Object.values(this.sprites).forEach(o=>{this.scene.add(o),this.interactiveObjects.push(o)})}createSprite(t,s){let e=window.devicePixelRatio||1,a=128*e,c=28*e,r=document.createElement("canvas");r.width=a,r.height=a;let o=r.getContext("2d");o.imageSmoothingEnabled=!0,o.imageSmoothingQuality="high",o.scale(e,e);let l=a/(2*e),d=c/e;o.beginPath(),o.arc(l,l,d,0,2*Math.PI),o.closePath(),o.fillStyle=t,o.fill(),s&&(o.font="bold 48px Arial, sans-serif",o.textAlign="center",o.textBaseline="middle",o.fillStyle="#ffffff",o.strokeStyle="#000000",o.lineWidth=2,o.strokeText(s,l,l),o.fillText(s,l,l));let E=new i.CanvasTexture(r);return E.colorSpace=i.SRGBColorSpace,E.generateMipmaps=!1,E.minFilter=i.LinearFilter,E.magFilter=i.LinearFilter,new i.Sprite(new i.SpriteMaterial({map:E,toneMapped:!1,alphaTest:.1}))}setupEventListeners(){this.pointerDownHandler=t=>{this.handleClick(t)},this.domElement.addEventListener("pointerdown",this.pointerDownHandler)}render(t){this.renderer=t;let s=this.syncActiveCamera();this.scene.quaternion.copy(s.quaternion).invert(),this.scene.updateMatrixWorld();let e=this.options.size,a=t.domElement.width/t.getPixelRatio(),c=t.domElement.height/t.getPixelRatio(),r,o;switch(this.options.position){case"top-left":r=this.options.offset.x,o=c-e-this.options.offset.y;break;case"top-right":r=a-e-this.options.offset.x,o=c-e-this.options.offset.y;break;case"bottom-left":r=this.options.offset.x,o=this.options.offset.y;break;case"bottom-right":default:r=a-e-this.options.offset.x,o=this.options.offset.y;break}t.getViewport(this.viewport);let l=new i.Vector4;t.getScissor(l);let d=t.getScissorTest(),E=t.getRenderTarget(),f=t.getActiveCubeFace(),H=t.getActiveMipmapLevel(),T=t.autoClear;t.setRenderTarget(null),t.setViewport(r,o,e,e),t.autoClear=!1,t.setScissorTest(!0),t.setScissor(r,o,e,e),t.clearDepth(),t.render(this.scene,this.orthoCamera),t.setRenderTarget(E,f,H),t.setViewport(this.viewport.x,this.viewport.y,this.viewport.z,this.viewport.w),t.setScissor(l),t.setScissorTest(d),t.autoClear=T}handleClick(t){if(this.animating||!this.renderer)return!1;this.syncActiveCamera();let s=this.domElement.getBoundingClientRect(),e=this.options.size,a,c;switch(this.options.position){case"top-left":a=s.left+this.options.offset.x,c=s.top+this.options.offset.y;break;case"top-right":a=s.left+s.width-e-this.options.offset.x,c=s.top+this.options.offset.y;break;case"bottom-left":a=s.left+this.options.offset.x,c=s.top+s.height-e-this.options.offset.y;break;case"bottom-right":default:a=s.left+s.width-e-this.options.offset.x,c=s.top+s.height-e-this.options.offset.y;break}if(this.mouse.x=(t.clientX-a)/e*2-1,this.mouse.y=-((t.clientY-c)/e)*2+1,this.mouse.x<-1||this.mouse.x>1||this.mouse.y<-1||this.mouse.y>1)return!1;this.raycaster.setFromCamera(this.mouse,this.orthoCamera);let r=this.raycaster.intersectObjects(this.interactiveObjects);if(r.length>0){let l=r[0].object;return this.prepareAnimationData(l,this.center),this.controls?this.startControlsAnimation(this.center):(this.animating=!0,this.dispatchEvent({type:"animationStart"})),!0}return!1}prepareAnimationData(t,s){switch(t.userData.type){case"posX":this.targetPosition.set(1,0,0),this.targetQuaternion.setFromEuler(new i.Euler(0,Math.PI*.5,0));break;case"posY":this.targetPosition.set(0,1,0),this.targetQuaternion.setFromEuler(new i.Euler(-Math.PI*.5,0,0));break;case"posZ":this.targetPosition.set(0,0,1),this.targetQuaternion.setFromEuler(new i.Euler);break;case"negX":this.targetPosition.set(-1,0,0),this.targetQuaternion.setFromEuler(new i.Euler(0,-Math.PI*.5,0));break;case"negY":this.targetPosition.set(0,-1,0),this.targetQuaternion.setFromEuler(new i.Euler(Math.PI*.5,0,0));break;case"negZ":this.targetPosition.set(0,0,-1),this.targetQuaternion.setFromEuler(new i.Euler(0,Math.PI,0));break;default:console.error("ViewHelper: Invalid axis.");return}let e=this.getCameraPosition(this.tempVecA);this.radius=e.distanceTo(s),this.targetPosition.multiplyScalar(this.radius).add(s),this.dummy.position.copy(s),this.dummy.lookAt(e),this.q1.copy(this.dummy.quaternion),this.dummy.lookAt(this.targetPosition),this.q2.copy(this.dummy.quaternion)}startControlsAnimation(t){let s=this.controls;if(!s)return;s.enabled=!1,s.stop?.(),this.animating=!0,this.dispatchEvent({type:"animationStart"});let e=()=>{s.setLookAt(this.targetPosition.x,this.targetPosition.y,this.targetPosition.z,t.x,t.y,t.z,!0),setTimeout(()=>{s.enabled=!0},100)};try{Promise.resolve(e()).catch(a=>{console.warn("ViewHelper: Unable to set camera look-at.",a)}).finally(()=>{this.animating=!1,this.dispatchEvent({type:"animationEnd"})})}catch(a){console.warn("ViewHelper: Unable to set camera look-at.",a),this.animating=!1,this.dispatchEvent({type:"animationEnd"})}}update(t){if(this.syncActiveCamera(),this.controls||!this.animating)return;let s=t*this.turnRate;this.q1.rotateTowards(this.q2,s),this.camera.position.set(0,0,1).applyQuaternion(this.q1).multiplyScalar(this.radius).add(this.center),this.camera.quaternion.rotateTowards(this.targetQuaternion,s),this.q1.angleTo(this.q2)===0&&(this.animating=!1,this.dispatchEvent({type:"animationEnd"}))}setLabels(t,s,e){t!==void 0&&(this.options.labels.x=t),s!==void 0&&(this.options.labels.y=s),e!==void 0&&(this.options.labels.z=e),this.updateLabels()}updateLabels(){this.sprites.posX.material.map?.dispose(),this.sprites.posY.material.map?.dispose(),this.sprites.posZ.material.map?.dispose(),this.sprites.posX.material.dispose(),this.sprites.posY.material.dispose(),this.sprites.posZ.material.dispose();let t=this.createSprite(h.x,this.options.labels.x),s=this.createSprite(h.y,this.options.labels.y),e=this.createSprite(h.z,this.options.labels.z);this.sprites.posX.material=t.material,this.sprites.posY.material=s.material,this.sprites.posZ.material=e.material}dispose(){this.axes.x.geometry.dispose(),this.axes.y.geometry.dispose(),this.axes.z.geometry.dispose(),this.axes.x.material.dispose(),this.axes.y.material.dispose(),this.axes.z.material.dispose(),Object.values(this.sprites).forEach(t=>{t.material.map?.dispose(),t.material.dispose()}),this.pointerDownHandler&&this.domElement.removeEventListener("pointerdown",this.pointerDownHandler)}};0&&(module.exports={ViewHelper});
@@ -1 +1 @@
1
- import{a}from"../chunk-UJF4S4J3.mjs";export{a as ViewHelper};
1
+ import{a}from"../chunk-CLSRN5D2.mjs";export{a as ViewHelper};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tonybfox/threejs-tools",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
4
  "description": "A single entry point that bundles all Three.js tools (camera, terrain, measurements, helpers, and more).",
5
5
  "private": false,
6
6
  "main": "./dist/index.cjs",
@@ -1 +0,0 @@
1
- import*as t from"three";var p={x:"#ed4358",y:"#82cc19",z:"#3185eb"},l=class extends t.EventDispatcher{constructor(e,s,i={}){super();this.viewport=new t.Vector4;this.animating=!1;this.targetPosition=new t.Vector3;this.targetQuaternion=new t.Quaternion;this.q1=new t.Quaternion;this.q2=new t.Quaternion;this.dummy=new t.Object3D;this.radius=0;this.turnRate=2*Math.PI;this.tempVecA=new t.Vector3;this.interactiveObjects=[];this.raycaster=new t.Raycaster;this.mouse=new t.Vector2;this.controls=i.controls,this.camera=this.controls?.camera??e,this.domElement=s||document.body;let a=i.center??(this.controls?this.controls.getTarget(new t.Vector3):new t.Vector3);this.options={container:i.container||document.body,size:i.size||128,position:i.position||"bottom-right",offset:i.offset||{x:20,y:20},center:a.clone(),labels:{x:i.labels?.x||"x",y:i.labels?.y||"y",z:i.labels?.z||"z",...i.labels}},this.center=this.options.center.clone(),this.scene=new t.Scene,this.scene.background=null,this.orthoCamera=new t.OrthographicCamera(-2,2,2,-2,0,4),this.orthoCamera.position.set(0,0,2),this.createAxes(),this.createSprites(),this.setupEventListeners()}syncActiveCamera(){return this.controls&&(this.camera=this.controls.camera),this.camera}getCameraPosition(e){return this.controls?this.controls.getPosition(e):e.copy(this.camera.position)}createAxes(){let e=new t.CylinderGeometry(.04,.04,.8,5).rotateZ(-Math.PI/2).translate(.4,0,0),s=new t.MeshBasicMaterial({color:p.x,toneMapped:!1}),i=new t.MeshBasicMaterial({color:p.y,toneMapped:!1}),a=new t.MeshBasicMaterial({color:p.z,toneMapped:!1});this.axes={x:new t.Mesh(e.clone(),s),y:new t.Mesh(e.clone(),i),z:new t.Mesh(e.clone(),a)},this.axes.y.rotation.z=Math.PI/2,this.axes.z.rotation.y=-Math.PI/2,this.scene.add(this.axes.x),this.scene.add(this.axes.y),this.scene.add(this.axes.z)}createSprites(){let e=this.createSprite(p.x,this.options.labels.x),s=this.createSprite(p.y,this.options.labels.y),i=this.createSprite(p.z,this.options.labels.z),a=this.createSprite(p.x),n=this.createSprite(p.y),r=this.createSprite(p.z);this.sprites={posX:e,posY:s,posZ:i,negX:a,negY:n,negZ:r},this.sprites.posX.position.set(1,0,0),this.sprites.posY.position.set(0,1,0),this.sprites.posZ.position.set(0,0,1),this.sprites.negX.position.set(-1,0,0),this.sprites.negY.position.set(0,-1,0),this.sprites.negZ.position.set(0,0,-1),this.sprites.negX.material.opacity=.2,this.sprites.negY.material.opacity=.2,this.sprites.negZ.material.opacity=.2,this.sprites.posX.userData.type="posX",this.sprites.posY.userData.type="posY",this.sprites.posZ.userData.type="posZ",this.sprites.negX.userData.type="negX",this.sprites.negY.userData.type="negY",this.sprites.negZ.userData.type="negZ",Object.values(this.sprites).forEach(o=>{this.scene.add(o),this.interactiveObjects.push(o)})}createSprite(e,s){let i=window.devicePixelRatio||1,a=128*i,n=28*i,r=document.createElement("canvas");r.width=a,r.height=a;let o=r.getContext("2d");o.imageSmoothingEnabled=!0,o.imageSmoothingQuality="high",o.scale(i,i);let h=a/(2*i),E=n/i;o.beginPath(),o.arc(h,h,E,0,2*Math.PI),o.closePath(),o.fillStyle=e,o.fill(),s&&(o.font="bold 48px Arial, sans-serif",o.textAlign="center",o.textBaseline="middle",o.fillStyle="#ffffff",o.strokeStyle="#000000",o.lineWidth=2,o.strokeText(s,h,h),o.fillText(s,h,h));let c=new t.CanvasTexture(r);return c.colorSpace=t.SRGBColorSpace,c.generateMipmaps=!1,c.minFilter=t.LinearFilter,c.magFilter=t.LinearFilter,new t.Sprite(new t.SpriteMaterial({map:c,toneMapped:!1,alphaTest:.1}))}setupEventListeners(){this.pointerDownHandler=e=>{this.handleClick(e)},this.domElement.addEventListener("pointerdown",this.pointerDownHandler)}render(e){this.renderer=e;let s=this.syncActiveCamera();this.scene.quaternion.copy(s.quaternion).invert(),this.scene.updateMatrixWorld();let i=this.options.size,a=e.domElement.width/e.getPixelRatio(),n=e.domElement.height/e.getPixelRatio(),r,o;switch(this.options.position){case"top-left":r=this.options.offset.x,o=n-i-this.options.offset.y;break;case"top-right":r=a-i-this.options.offset.x,o=n-i-this.options.offset.y;break;case"bottom-left":r=this.options.offset.x,o=this.options.offset.y;break;case"bottom-right":default:r=a-i-this.options.offset.x,o=this.options.offset.y;break}e.getViewport(this.viewport);let h=e.autoClear;e.setViewport(r,o,i,i),e.autoClear=!1,e.setScissorTest(!0),e.setScissor(r,o,i,i),e.clearDepth(),e.render(this.scene,this.orthoCamera),e.setScissorTest(!1),e.autoClear=h,e.setViewport(this.viewport.x,this.viewport.y,this.viewport.z,this.viewport.w)}handleClick(e){if(this.animating||!this.renderer)return!1;this.syncActiveCamera();let s=this.domElement.getBoundingClientRect(),i=this.options.size,a,n;switch(this.options.position){case"top-left":a=s.left+this.options.offset.x,n=s.top+this.options.offset.y;break;case"top-right":a=s.left+s.width-i-this.options.offset.x,n=s.top+this.options.offset.y;break;case"bottom-left":a=s.left+this.options.offset.x,n=s.top+s.height-i-this.options.offset.y;break;case"bottom-right":default:a=s.left+s.width-i-this.options.offset.x,n=s.top+s.height-i-this.options.offset.y;break}if(this.mouse.x=(e.clientX-a)/i*2-1,this.mouse.y=-((e.clientY-n)/i)*2+1,this.mouse.x<-1||this.mouse.x>1||this.mouse.y<-1||this.mouse.y>1)return!1;this.raycaster.setFromCamera(this.mouse,this.orthoCamera);let r=this.raycaster.intersectObjects(this.interactiveObjects);if(r.length>0){let h=r[0].object;return this.prepareAnimationData(h,this.center),this.controls?this.startControlsAnimation(this.center):(this.animating=!0,this.dispatchEvent({type:"animationStart"})),!0}return!1}prepareAnimationData(e,s){switch(e.userData.type){case"posX":this.targetPosition.set(1,0,0),this.targetQuaternion.setFromEuler(new t.Euler(0,Math.PI*.5,0));break;case"posY":this.targetPosition.set(0,1,0),this.targetQuaternion.setFromEuler(new t.Euler(-Math.PI*.5,0,0));break;case"posZ":this.targetPosition.set(0,0,1),this.targetQuaternion.setFromEuler(new t.Euler);break;case"negX":this.targetPosition.set(-1,0,0),this.targetQuaternion.setFromEuler(new t.Euler(0,-Math.PI*.5,0));break;case"negY":this.targetPosition.set(0,-1,0),this.targetQuaternion.setFromEuler(new t.Euler(Math.PI*.5,0,0));break;case"negZ":this.targetPosition.set(0,0,-1),this.targetQuaternion.setFromEuler(new t.Euler(0,Math.PI,0));break;default:console.error("ViewHelper: Invalid axis.");return}let i=this.getCameraPosition(this.tempVecA);this.radius=i.distanceTo(s),this.targetPosition.multiplyScalar(this.radius).add(s),this.dummy.position.copy(s),this.dummy.lookAt(i),this.q1.copy(this.dummy.quaternion),this.dummy.lookAt(this.targetPosition),this.q2.copy(this.dummy.quaternion)}startControlsAnimation(e){let s=this.controls;if(!s)return;s.enabled=!1,s.stop?.(),this.animating=!0,this.dispatchEvent({type:"animationStart"});let i=()=>{s.setLookAt(this.targetPosition.x,this.targetPosition.y,this.targetPosition.z,e.x,e.y,e.z,!0),setTimeout(()=>{s.enabled=!0},100)};try{Promise.resolve(i()).catch(a=>{console.warn("ViewHelper: Unable to set camera look-at.",a)}).finally(()=>{this.animating=!1,this.dispatchEvent({type:"animationEnd"})})}catch(a){console.warn("ViewHelper: Unable to set camera look-at.",a),this.animating=!1,this.dispatchEvent({type:"animationEnd"})}}update(e){if(this.syncActiveCamera(),this.controls||!this.animating)return;let s=e*this.turnRate;this.q1.rotateTowards(this.q2,s),this.camera.position.set(0,0,1).applyQuaternion(this.q1).multiplyScalar(this.radius).add(this.center),this.camera.quaternion.rotateTowards(this.targetQuaternion,s),this.q1.angleTo(this.q2)===0&&(this.animating=!1,this.dispatchEvent({type:"animationEnd"}))}setLabels(e,s,i){e!==void 0&&(this.options.labels.x=e),s!==void 0&&(this.options.labels.y=s),i!==void 0&&(this.options.labels.z=i),this.updateLabels()}updateLabels(){this.sprites.posX.material.map?.dispose(),this.sprites.posY.material.map?.dispose(),this.sprites.posZ.material.map?.dispose(),this.sprites.posX.material.dispose(),this.sprites.posY.material.dispose(),this.sprites.posZ.material.dispose();let e=this.createSprite(p.x,this.options.labels.x),s=this.createSprite(p.y,this.options.labels.y),i=this.createSprite(p.z,this.options.labels.z);this.sprites.posX.material=e.material,this.sprites.posY.material=s.material,this.sprites.posZ.material=i.material}dispose(){this.axes.x.geometry.dispose(),this.axes.y.geometry.dispose(),this.axes.z.geometry.dispose(),this.axes.x.material.dispose(),this.axes.y.material.dispose(),this.axes.z.material.dispose(),Object.values(this.sprites).forEach(e=>{e.material.map?.dispose(),e.material.dispose()}),this.pointerDownHandler&&this.domElement.removeEventListener("pointerdown",this.pointerDownHandler)}};export{l as a};