schematic-renderer 1.4.0 → 1.4.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"CameraManager.d.ts","sourceRoot":"","sources":["../../src/managers/CameraManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CameraManager.d.ts","sourceRoot":"","sources":["../../src/managers/CameraManager.ts"],"names":[],"mappings":"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"}
@@ -2691,7 +2691,7 @@ ${C || "(no log captured)"}`);
2691
2691
  };
2692
2692
  }
2693
2693
  calculateIsometricFraming(A, I, C, i) {
2694
- const w = this.activeCameraKey, l = (_oI.CAMERA_PRESETS[w] || _oI.CAMERA_PRESETS.isometric).rotation || _oI.CAMERA_PRESETS.isometric.rotation, j = new Q.Euler(...l), g = Math.max(I.x, I.y, I.z) * 1.5 + Ig * 2, V = new Q.Vector3(0, 0, 1);
2694
+ const w = this.activeCameraKey, l = (_oI.CAMERA_PRESETS[w] || _oI.CAMERA_PRESETS.isometric).rotation || _oI.CAMERA_PRESETS.isometric.rotation, j = new Q.Euler(l[0], l[1], l[2] ?? 0, "YXZ"), g = Math.max(I.x, I.y, I.z) * 1.5 + Ig * 2, V = new Q.Vector3(0, 0, 1);
2695
2695
  return V.applyEuler(j), V.multiplyScalar(g), {
2696
2696
  position: A.clone().add(V),
2697
2697
  rotation: j
@@ -2779,8 +2779,8 @@ ${C || "(no log captured)"}`);
2779
2779
  w,
2780
2780
  0
2781
2781
  ], this.activeCameraKey === "isometric") {
2782
- const l = new Q.Euler(i, w, 0);
2783
- this.activeCamera.rotation = [
2782
+ const l = new Q.Euler(i, w, 0, "YXZ");
2783
+ this.activeCamera.camera.rotation.order = "YXZ", this.activeCamera.rotation = [
2784
2784
  l.x,
2785
2785
  l.y,
2786
2786
  l.z
@@ -4399,7 +4399,7 @@ ${C || "(no log captured)"}`);
4399
4399
  __publicField(this, "tiltShiftGizmoVisible", true);
4400
4400
  __publicField(this, "_focusPickRaycaster", null);
4401
4401
  var _a2, _b3;
4402
- this.schematicRenderer = A, this.eventEmitter = this.schematicRenderer.eventEmitter, this.isometricBackground = new Q.Color(8900331);
4402
+ this.schematicRenderer = A, this.eventEmitter = this.schematicRenderer.eventEmitter, this.isometricBackground = new Q.Color(8300799);
4403
4403
  const I = (_b3 = (_a2 = A.options) == null ? void 0 : _a2.postProcessingOptions) == null ? void 0 : _b3.ssaoPresets;
4404
4404
  I && (I.perspective && (this.ssaoPresets.perspective = {
4405
4405
  ...this.ssaoPresets.perspective,
@@ -10,7 +10,7 @@ ${i||"(no log captured)"}`);return console.error(l.message),l}cleanup(){if(this.
10
10
  <div>Shift - Sprint</div>
11
11
  <div>ESC - Exit</div>
12
12
  </div>
13
- `,this.overlayElement.appendChild(A),this.overlayElement.addEventListener("click",this.onOverlayClick);const I=this.domElement.parentElement;I&&(I.style.position="relative",I.appendChild(this.overlayElement)),this.showOverlay(!1)}showOverlay(A){this.overlayElement&&(this.overlayElement.style.opacity=A?"1":"0",this.overlayElement.style.pointerEvents=A?"auto":"none")}setOverlayVisible(A){this.showOverlay(A)}lock(){this.enabled&&this.pointerLockControls.lock()}unlock(){this.pointerLockControls.unlock()}toggle(){this.isLocked?this.unlock():this.lock()}update(A){if(!this.enabled||!this.isLocked)return;this.direction.set(0,0,0),this.pressedKeys.has(this.keybinds.forward)&&(this.direction.z-=1),this.pressedKeys.has(this.keybinds.backward)&&(this.direction.z+=1),this.pressedKeys.has(this.keybinds.left)&&(this.direction.x-=1),this.pressedKeys.has(this.keybinds.right)&&(this.direction.x+=1),this.pressedKeys.has(this.keybinds.up)&&(this.direction.y+=1),this.pressedKeys.has(this.keybinds.down)&&(this.direction.y-=1),this.direction.length()>0&&this.direction.normalize();let I=this.moveSpeed;this.pressedKeys.has(this.keybinds.sprint)&&(I*=this.sprintMultiplier),this.velocity.copy(this.direction).multiplyScalar(I*A);const i=new b.Vector3;this.camera.getWorldDirection(i);const C=new b.Vector3(i.x,0,i.z).normalize(),l=new b.Vector3().crossVectors(new b.Vector3(0,1,0),C).normalize(),w=new b.Vector3;w.addScaledVector(C,-this.velocity.z),w.addScaledVector(l,-this.velocity.x),w.y+=this.velocity.y,this.camera.position.add(w),w.length()>0&&this.emit("change")}getMoveSpeed(){return this.moveSpeed}setMoveSpeed(A){this.moveSpeed=A}getSprintMultiplier(){return this.sprintMultiplier}setSprintMultiplier(A){this.sprintMultiplier=A}getKeybinds(){return{...this.keybinds}}setKeybinds(A){this.keybinds={...this.keybinds,...A}}getPointerLockControls(){return this.pointerLockControls}dispose(){this.domElement.removeEventListener("click",this.onCanvasClick),document.removeEventListener("keydown",this.onKeyDown),document.removeEventListener("keyup",this.onKeyUp),this.isLocked&&this.unlock(),this.overlayElement&&(this.overlayElement.removeEventListener("click",this.onOverlayClick),this.overlayElement.parentElement&&this.overlayElement.parentElement.removeChild(this.overlayElement)),this.overlayElement=null,this.pointerLockControls.dispose(),this.pressedKeys.clear(),this.removeAllListeners()}}const Ob=5,sh=5;class $C extends Ds.EventEmitter{schematicRenderer;cameras=new Map;cameraOptions;activeCameraKey;controls=new Map;activeControlKey;rendererDomElement;animationRequestId=null;isAnimating=!1;animationStartPosition=new b.Vector3;animationStartRotation=new b.Euler;recordingManager;flyControls=null;flyControlsEnabled=!1;autoOrbitEnabled=!1;autoOrbitAnimationId=null;autoOrbitStartTime=0;autoOrbitDuration=30;cameraPathManager;static CAMERA_PRESETS={isometric:{type:"orthographic",position:[0,0,20],rotation:[-Math.atan(1/Math.sqrt(2)),45*Math.PI/180,0],controlType:"orbit",fov:45,controlSettings:{enableDamping:!0,dampingFactor:.08,minDistance:5,maxDistance:500,enableZoom:!0,enableRotate:!0,enablePan:!0,panSpeed:1,rotateSpeed:.8,zoomSpeed:1.2,minPolarAngle:Math.PI/8,maxPolarAngle:Math.PI/2.1}},perspective:{type:"perspective",position:[0,20,20],rotation:[-20*Math.PI/180,0,0],controlType:"orbit",fov:60,controlSettings:{enableDamping:!0,dampingFactor:.08,minDistance:1,maxDistance:1e3,enableZoom:!0,enableRotate:!0,enablePan:!0,panSpeed:1,rotateSpeed:.8,zoomSpeed:1.2}},perspective_fpv:{type:"perspective",position:[0,2,0],rotation:[0,0,0],fov:90,controlType:"creative",controlSettings:{movementSpeed:new b.Vector3(200,200,200)}}};constructor(A,I={}){super(),this.schematicRenderer=A,this.rendererDomElement=this.schematicRenderer.canvas,this.cameraOptions={enableZoomInOnLoad:I.enableZoomInOnLoad||!1,zoomInDuration:I.zoomInDuration||2,autoOrbitAfterZoom:I.autoOrbitAfterZoom||!1,...I},this.recordingManager=new VD(A),this.activeCameraKey="perspective";const i=I.defaultCameraPreset||"perspective",C=$C.CAMERA_PRESETS[i]||$C.CAMERA_PRESETS.perspective;this.activeControlKey=`${i}-${C.controlType}`,I.defaultCameraPreset&&(console.log(`Switching to default camera preset: ${I.defaultCameraPreset}`),this.activeCameraKey=I.defaultCameraPreset,this.switchCameraPreset(I.defaultCameraPreset)),Object.entries($C.CAMERA_PRESETS).forEach(([w,Z])=>{const M={position:I.position||Z.position,size:Z.type==="orthographic"?20:void 0,fov:Z.fov};"rotation"in Z&&(M.rotation=Z.rotation);const m=this.createCamera(Z.type,M);this.cameras.set(w,m);const e=`${w}-${Z.controlType}`,t=this.createControls(Z.controlType,m);t&&Z.controlSettings&&(Object.assign(t,Z.controlSettings),w==="isometric"&&this.setupIsometricControls(t)),t&&(this.controls.set(e,t),this.setupControlEvents(t))}),this.cameras.has(this.activeCameraKey)||(this.activeCameraKey="perspective");const l=$C.CAMERA_PRESETS[this.activeCameraKey];this.activeControlKey=`${this.activeCameraKey}-${l.controlType}`,this.controls.forEach((w,Z)=>{w.enabled=Z===this.activeControlKey}),this.cameraPathManager=new KE(this.schematicRenderer,{showVisualization:I.showCameraPathVisualization||!1}),this.schematicRenderer.options.autoOrbitDuration&&(this.autoOrbitDuration=this.schematicRenderer.options.autoOrbitDuration),this.schematicRenderer.eventEmitter&&this.schematicRenderer.eventEmitter.on("schematicAdded",async()=>{await this.handleSchematicLoaded(this.cameraOptions.enableZoomInOnLoad)}),this.schematicRenderer.options.enableAutoOrbit&&!this.cameraOptions.enableZoomInOnLoad&&this.startAutoOrbit()}createCamera(A,I){let i;return A==="perspective"?i=new Lb("perspective",this.rendererDomElement,this.schematicRenderer,I):i=new Lb("orthographic",this.rendererDomElement,this.schematicRenderer,I),i}getDefaultCameraPath(){const A=Array.from(this.cameraPathManager.paths.entries());return A.length>0?{path:A[0][1],name:A[0][0]}:null}async animateCameraAlongPath(A){let I,i={};if(A instanceof ob?I=A:typeof A=="object"&&(i=A,i.pathName&&(I=this.cameraPathManager.getPath(i.pathName))),!I){const n=this.getDefaultCameraPath();if(!n)return Promise.reject(new Error("No camera path available"));I=n.path,console.log(`Using default camera path: ${n.name}`)}const{totalFrames:C=300,targetFps:l=60,easing:w=_E.linear,lookAtTarget:Z=!0,updateControls:M=!0,onStart:m,onUpdate:e,onComplete:t}=i,j=1e3/l;this.stopAnimation();try{return new Promise((n,D)=>{this.isAnimating=!0;let d=0,c=performance.now();if(this.animationStartPosition.copy(this.activeCamera.position),this.animationStartRotation.copy(this.activeCamera.rotation),M){const a=this.controls.get(this.activeControlKey);a&&a.enabled&&(a.enabled=!1)}const{position:J,rotation:L,target:o}=I.getPoint(0);this.activeCamera.position.copy(J),this.activeCamera.rotation.copy(L),Z&&this.activeCamera.lookAt(o);const Q=async()=>{let a=d/C;a=w(a);const{position:z,rotation:R,target:O}=I.getPoint(a);if(this.activeCamera.position.copy(z),Z?this.activeCamera.lookAt(O):this.activeCamera.rotation.copy(R),this.emit("cameraMove",{position:this.activeCamera.position.clone(),rotation:this.activeCamera.rotation.clone(),progress:a}),e&&await e(a),d++,d<=C){const B=performance.now(),X=B-c,v=Math.max(0,j-X);c=B,setTimeout(()=>{this.animationRequestId=requestAnimationFrame(Q)},v)}else{if(this.isAnimating=!1,M){const B=this.controls.get(this.activeControlKey);B&&(B.enabled=!0)}t&&t(),n()}};m&&m(),this.animationRequestId=requestAnimationFrame(Q)})}catch(n){throw this.stopAnimation(),n}}isCurrentlyAnimating(){return this.isAnimating}stopAnimation(){if(this.animationRequestId!==null){cancelAnimationFrame(this.animationRequestId),this.animationRequestId=null,this.isAnimating=!1;const A=this.controls.get(this.activeControlKey);A&&(A.enabled=!0)}}switchCameraPreset(A){const I=$C.CAMERA_PRESETS[A];if(!I){console.warn(`Preset ${A} not found`);return}const i=this.activeCameraKey;this.schematicRenderer.uiManager?.hideFPVOverlay(),this.activeCameraKey=A;const C=`${A}-${I.controlType}`;this.controls.forEach((w,Z)=>{w.enabled=Z===C}),this.activeControlKey=C;const l=this.controls.get(this.activeControlKey);l&&(l.object=this.activeCamera.camera,I.controlType==="orbit"&&l.update&&l.update()),I.controlType==="creative"&&this.schematicRenderer.uiManager?.showFPVOverlay(),this.schematicRenderer.renderManager&&this.schematicRenderer.renderManager.updateCamera(this.activeCamera.camera),this.emit("cameraChanged",{previousCamera:i,newCamera:A,controlType:I.controlType}),this.schematicRenderer.schematicManager&&!this.schematicRenderer.schematicManager.isEmpty()&&this.focusOnSchematics()}updatePathParameters(A,I){this.cameraPathManager.updatePathParameters(A,I)}showPathVisualization(A){this.cameraPathManager.showPathVisualization(A)}hidePathVisualization(A){this.cameraPathManager.hidePathVisualization(A)}getCameraPath(A){return this.cameraPathManager.getPath(A)}createControls(A,I){return I.createControls(A)}switchControls(A){const I=this.controls.get(this.activeControlKey);I&&I.dispose&&I.dispose();const i=this.activeCamera,C=this.createControls(A,i);this.controls.set(A,C),this.activeControlKey=A,C&&this.setupControlEvents(C)}setupControlEvents(A){A.addEventListener("change",()=>{this.schematicRenderer.invalidate(),this.emit("propertyChanged",{property:"position",value:this.activeCamera.position.clone()}),this.emit("propertyChanged",{property:"rotation",value:this.activeCamera.rotation.clone()})})}setupIsometricControls(A){A.enableDamping=!0,A.dampingFactor=.1,A.minDistance=10,A.maxDistance=100,A.enableZoom=!0,A.enableRotate=!0,A.enablePan=!0,A.minPolarAngle=Math.PI/6,A.maxPolarAngle=Math.PI/2.2}update(A=0){if(this.flyControlsEnabled&&this.flyControls){this.flyControls.update(A);return}const I=this.controls.get(this.activeControlKey);if(I)if(this.activeControlKey.includes("creative")){const i=$C.CAMERA_PRESETS.perspective_fpv.controlSettings?.movementSpeed;i&&HA.update(I,i)}else I.update&&I.update(A)}initializeFlyControls(A){return this.flyControls&&this.flyControls.dispose(),this.flyControls=new Pb(this.activeCamera.camera,this.rendererDomElement,A),this.flyControls.on("lock",()=>{this.schematicRenderer.uiManager?.hideFPVOverlay(),this.emit("flyControlsLocked")}),this.flyControls.on("unlock",()=>{this.flyControlsEnabled&&this.schematicRenderer.uiManager?.hideFPVOverlay(),this.emit("flyControlsUnlocked")}),this.flyControls.on("change",()=>{this.emit("cameraMove",{position:this.activeCamera.position.clone(),rotation:this.activeCamera.rotation.clone()})}),this.flyControls}enableFlyControls(){this.flyControls||this.initializeFlyControls(),this.controls.forEach(A=>{A.enabled=!1}),this.flyControlsEnabled=!0,this.flyControls&&(this.flyControls.enabled=!0,this.flyControls.setOverlayVisible(!0)),this.schematicRenderer.uiManager?.hideFPVOverlay(),this.emit("controlModeChanged",{mode:"fly"})}disableFlyControls(){this.flyControls?.isLocked&&this.flyControls.unlock(),this.flyControlsEnabled=!1,this.flyControls&&(this.flyControls.enabled=!1,this.flyControls.setOverlayVisible(!1));const A=this.controls.get(this.activeControlKey);A&&(A.enabled=!0),this.emit("controlModeChanged",{mode:"orbit"})}toggleFlyControls(){return this.flyControlsEnabled?(this.disableFlyControls(),!1):(this.enableFlyControls(),!0)}isFlyControlsEnabled(){return this.flyControlsEnabled}isFlyControlsLocked(){return this.flyControls?.isLocked??!1}getFlyControlsSettings(){return this.flyControls?{moveSpeed:this.flyControls.getMoveSpeed(),sprintMultiplier:this.flyControls.getSprintMultiplier(),keybinds:this.flyControls.getKeybinds()}:null}setFlyControlsSettings(A){this.flyControls&&(A.moveSpeed!==void 0&&this.flyControls.setMoveSpeed(A.moveSpeed),A.sprintMultiplier!==void 0&&this.flyControls.setSprintMultiplier(A.sprintMultiplier),A.keybinds!==void 0&&this.flyControls.setKeybinds(A.keybinds))}get activeCamera(){return this.cameras.get(this.activeCameraKey)}updateAspectRatio(A){this.cameras.forEach(I=>{if(I.camera instanceof b.PerspectiveCamera)I.camera.aspect=A,I.camera.updateProjectionMatrix();else if(I.camera instanceof b.OrthographicCamera){const i=I.camera.top-I.camera.bottom;I.camera.left=-i*A/2,I.camera.right=i*A/2,I.camera.updateProjectionMatrix()}}),this.schematicRenderer.schematicManager&&!this.schematicRenderer.schematicManager.isEmpty()&&this.focusOnSchematics({animationDuration:0})}lookAt(A){Array.isArray(A)?this.activeCamera.lookAt(new b.Vector3(...A)):this.activeCamera.lookAt(A)}lookAtSchematicsCenter(){if(!this.schematicRenderer.schematicManager)return;const A=this.schematicRenderer.schematicManager.getSchematicsAveragePosition();this.activeCamera.lookAt(A)}async focusOnSchematics(A={}){if(!this.schematicRenderer?.schematicManager||this.schematicRenderer.schematicManager.isEmpty())return;if(A.preserveCamera??this.cameraOptions.preserveCameraOnUpdate??!1){console.log("Camera preservation enabled, skipping focus");return}const{padding:i=.05,animationDuration:C=0,easing:l=o=>o*o*(3-2*o),skipPathFitting:w=!1}=A,Z=this.controls.get(this.activeControlKey);Z&&(Z.enabled=!1);const M=this.calculateSchematicBounds();if(!M){console.warn("No valid schematic bounds found"),Z&&(Z.enabled=!0);return}const{center:m,size:e}=M,t=this.schematicRenderer.canvas,j=t.width/t.height,n=new b.Vector3().copy(this.activeCamera.position),D=new b.Euler().copy(this.activeCamera.rotation);let d,c=null,J=m.clone();if(this.activeCamera.camera.type==="OrthographicCamera"){const o=this.calculateIsometricFraming(m,e,j,i);d=o.position,c=o.rotation;const Q=this.activeCamera.camera,a=this.calculateOrthographicSize(e,j,i);Q.left=-a*j/2,Q.right=a*j/2,Q.top=a/2,Q.bottom=-a/2,Q.updateProjectionMatrix()}else{const o=this.calculatePerspectiveFraming(m,e,j,i);d=o.position,J=o.target}if(C>0?await this.animateToPosition(n,D,d,c,J,C,l):(this.activeCamera.setPosition([d.x,d.y,d.z]),c?this.activeCamera.rotation=[c.x,c.y,c.z]:this.activeCamera.lookAt(J)),Z&&"target"in Z&&(Z.target.copy(J),Z.update()),Z&&(Z.enabled=!0),!w){const o=Math.max(e.x,e.y,e.z);this.cameraPathManager.fitCircularPathToSchematics("circularPath",{padding:i,minRadius:o*.8,maxRadius:o*2.5})}const L=this.autoOrbitEnabled;if(L&&this.stopAutoOrbit(),L||this.cameraOptions.autoOrbitAfterZoom&&C>0){const o=C>0?100:0;setTimeout(()=>this.startAutoOrbitFromOptimalPosition(),o)}else this.schematicRenderer.options.enableAutoOrbit&&C===0&&!this.cameraOptions.enableZoomInOnLoad&&setTimeout(()=>this.startAutoOrbitFromOptimalPosition(),100)}calculateOrthographicSize(A,I,i){const C=1+i*2;let l,w;if(this.activeCamera.camera instanceof b.OrthographicCamera){const M=this.activeCamera.camera.matrixWorldInverse,m=A.clone().multiplyScalar(.5),e=this.schematicRenderer.schematicManager.getSchematicsAveragePosition(),t=[new b.Vector3(e.x-m.x,e.y-m.y,e.z-m.z),new b.Vector3(e.x+m.x,e.y-m.y,e.z-m.z),new b.Vector3(e.x-m.x,e.y+m.y,e.z-m.z),new b.Vector3(e.x+m.x,e.y+m.y,e.z-m.z),new b.Vector3(e.x-m.x,e.y-m.y,e.z+m.z),new b.Vector3(e.x+m.x,e.y-m.y,e.z+m.z),new b.Vector3(e.x-m.x,e.y+m.y,e.z+m.z),new b.Vector3(e.x+m.x,e.y+m.y,e.z+m.z)];let j=1/0,n=-1/0,D=1/0,d=-1/0;for(const c of t){const J=c.clone().applyMatrix4(M);j=Math.min(j,J.x),n=Math.max(n,J.x),D=Math.min(D,J.y),d=Math.max(d,J.y)}l=(n-j)*C,w=(d-D)*C}else l=A.x*C,w=A.y*C;let Z;return l/I>w?Z=l/I:Z=w,Math.max(Z,Ob)}async startAutoOrbitWithZoomIn(A={}){const{zoomIn:I=!0,zoomDuration:i=2,orbitDelay:C=.5,orbitTransitionDuration:l=1}=A;if(I&&!this.schematicRenderer?.schematicManager?.isEmpty()){console.log("Starting cinematic zoom-in followed by auto-orbit"),await this.zoomInToSchematics({duration:i,padding:.08,skipPathFitting:!0}),C>0&&await new Promise(Z=>setTimeout(Z,C*1e3));const w=this.cameraPathManager.getFirstPath();w&&this.cameraPathManager.fitCircularPathToSchematics(w.name),this.startAutoOrbitSmooth({transitionDuration:l,startFromCurrentPosition:!0,skipPathFitting:!0})}else this.startAutoOrbitSmooth({transitionDuration:l,startFromCurrentPosition:!0})}setZoomInOnLoad(A,I=2){this.cameraOptions.enableZoomInOnLoad=A,this.cameraOptions.zoomInDuration=I}setAutoOrbitAfterZoom(A){this.cameraOptions.autoOrbitAfterZoom=A}getCameraSettings(){return{enableZoomInOnLoad:this.cameraOptions.enableZoomInOnLoad||!1,zoomInDuration:this.cameraOptions.zoomInDuration||2,autoOrbitAfterZoom:this.cameraOptions.autoOrbitAfterZoom||!1,autoOrbitEnabled:this.autoOrbitEnabled}}async handleSchematicLoaded(A=!1){if(A){const I=this.cameraPathManager.getFirstPath();I&&this.cameraPathManager.fitCircularPathToSchematics(I.name),await this.zoomToOrbitPosition({duration:this.cameraOptions.zoomInDuration||2,padding:.08,startFromCurrentPosition:!0,startOrbitAfterZoom:this.cameraOptions.autoOrbitAfterZoom||!1})}else await this.focusOnSchematics({animationDuration:0,padding:.08,skipPathFitting:!1})}startAutoOrbitFromOptimalPosition(){this.autoOrbitEnabled&&this.stopAutoOrbit();const A=this.cameraPathManager.getFirstPath();if(!A||!(A.path instanceof je)){console.warn("Cannot start auto-orbit: No circular camera path available");return}const I=A.path,i=new b.Vector3().copy(this.activeCamera.position),C=this.findClosestOrbitPoint(I,i);I.setStartAngle(C.angle),this.activeCamera.setPosition([C.position.x,C.position.y,C.position.z]),this.activeCamera.lookAt(I.getTargetPosition());const l=this.controls.get(this.activeControlKey);l&&"target"in l&&(l.target.copy(I.getTargetPosition()),l.update&&l.update()),this.startAutoOrbit()}startAutoOrbitSmooth(A={}){if(this.autoOrbitEnabled)return;const{transitionDuration:I=1,startFromCurrentPosition:i=!0,easing:C=M=>M*M*(3-2*M),skipPathFitting:l=!1}=A;this.stopAnimation();const w=this.cameraPathManager.getFirstPath();if(!w||!(w.path instanceof je)){console.warn("Cannot start auto-orbit: No (circular) camera path available.");return}!l&&this.schematicRenderer?.schematicManager&&!this.schematicRenderer.schematicManager.isEmpty()&&this.cameraPathManager.fitCircularPathToSchematics(w.name);const Z=w.path;if(i&&I>0)this.transitionToOrbit(Z,I,C);else{const M=Z.getPoint(0);this.activeCamera.setPosition([M.position.x,M.position.y,M.position.z]),this.activeCamera.lookAt(M.target);const m=this.controls.get(this.activeControlKey);m&&"target"in m&&(m.target.copy(M.target),m.update&&m.update()),this.startAutoOrbit()}}async zoomInToSchematics(A={}){const{padding:I=.08,duration:i=2,easing:C=o=>o*o*(3-2*o),startDistance:l=3,startFromCurrentPosition:w=!1,skipPathFitting:Z=!1}=A;if(this.schematicRenderer?.schematicManager?.isEmpty())return;console.log("Starting cinematic zoom-in to schematics");const M=this.calculateSchematicBounds();if(!M)return;const{center:m,size:e}=M,t=this.schematicRenderer.canvas,j=t.width/t.height;let n,D=null,d=m;if(this.activeCamera.camera.type==="OrthographicCamera"){const o=this.calculateIsometricFraming(m,e,j,I);n=o.position,D=o.rotation;const Q=this.activeCamera.camera,a=this.calculateOrthographicSize(e,j,I);Q.left=-a*j/2,Q.right=a*j/2,Q.top=a/2,Q.bottom=-a/2}else{const o=this.calculatePerspectiveFraming(m,e,j,I);n=o.position,d=o.target}let c;const J=this.activeCamera.rotation?this.activeCamera.rotation.clone():new b.Euler;if(w)c=this.activeCamera.position.clone();else{const o=n.clone().sub(m).normalize();o.lengthSq()===0&&o.set(0,0,1),c=m.clone().add(o.multiplyScalar(n.distanceTo(m)*l))}const L=this.controls.get(this.activeControlKey);if(L&&(L.enabled=!1),await this.animateToPosition(c,J,n,D,d,i,C),this.activeCamera.camera.type==="OrthographicCamera"&&this.activeCamera.camera.updateProjectionMatrix(),L&&"target"in L&&(L.target.copy(d),L.update&&L.update()),L&&(L.enabled=!0),!Z){const o=Math.max(e.x,e.y,e.z);this.cameraPathManager.fitCircularPathToSchematics("circularPath",{padding:I,minRadius:o*.8,maxRadius:o*2.5})}}async transitionToOrbit(A,I,i){const C=this.activeCamera.position.clone(),l=this.activeCamera.rotation.clone(),w=A.getTargetPosition(),Z=this.findClosestOrbitPoint(A,C),M=Z.position;A.setStartAngle(Z.angle);const m=this.controls.get(this.activeControlKey);m&&(m.enabled=!1),await this.animateToPosition(C,l,M,null,w,I,i),this.startAutoOrbit()}findClosestOrbitPoint(A,I){const i=A.getCenter(),C=A.getRadius(),l=A.getHeight(),Z=new b.Vector3(I.x,i.y+l,I.z).clone().sub(i);if(Z.lengthSq()===0){const e=A.getStartAngle()!==void 0?A.getStartAngle():0;return{position:new b.Vector3(i.x+C*Math.cos(e),i.y+l,i.z+C*Math.sin(e)),angle:e}}Z.normalize();const M=Math.atan2(Z.z,Z.x);return{position:new b.Vector3(i.x+C*Math.cos(M),i.y+l,i.z+C*Math.sin(M)),angle:M}}async animateToPosition(A,I,i,C,l,w,Z){return new Promise(M=>{const m=performance.now(),e=new b.Quaternion().setFromEuler(I);let t=null;C&&(t=new b.Quaternion().setFromEuler(C));const j=()=>{const n=(performance.now()-m)/1e3;let D=Math.min(n/w,1);D=Z(D);const d=A.clone().lerp(i,D);if(this.activeCamera.setPosition([d.x,d.y,d.z]),this.activeCamera.camera.type==="OrthographicCamera"&&t){const c=new b.Quaternion;c.slerpQuaternions(e,t,D);const J=new b.Euler().setFromQuaternion(c,this.activeCamera.camera.rotation.order);this.activeCamera.rotation=[J.x,J.y,J.z]}else this.activeCamera.lookAt(l);D<1?requestAnimationFrame(j):(this.activeCamera.setPosition([i.x,i.y,i.z]),this.activeCamera.camera.type==="OrthographicCamera"&&C?this.activeCamera.rotation=[C.x,C.y,C.z]:this.activeCamera.lookAt(l),M())};requestAnimationFrame(j)})}calculateSchematicBounds(){if(!this.schematicRenderer.schematicManager||this.schematicRenderer.schematicManager.isEmpty())return null;const A=this.schematicRenderer.schematicManager.getGlobalTightWorldBox();if(A.isEmpty())return null;const I=A.getCenter(new b.Vector3),i=A.getSize(new b.Vector3);return{center:I,size:i,boundingBox:A}}calculateOptimalViewingAngles(A,I=1){const{x:i,y:C,z:l}=A,w=Math.max(i,l),Z=w/(C+w+.001),M=Math.PI/6,m=11*Math.PI/36,e=b.MathUtils.lerp(M,m,Z),t=l/(i+l+.001),j=Math.min(Math.max((I-1)*.2,-.1),.1),n=Math.PI/6-j,D=Math.PI/3+j;return{yaw:b.MathUtils.lerp(n,D,t),pitch:e}}calculatePerspectiveFraming(A,I,i,C){const l=this.activeCamera.camera,w=b.MathUtils.degToRad(l.fov),Z=Math.tan(w/2),M=1+C*2,{yaw:m,pitch:e}=this.calculateOptimalViewingAngles(I,i),t=Math.cos(m),j=Math.sin(m),n=Math.cos(e),D=Math.sin(e),d=new b.Vector3(n*j,D,n*t).normalize(),c=new b.Vector3(0,1,0),J=new b.Vector3().crossVectors(c,d).normalize();J.lengthSq()<.001&&J.set(1,0,0);const L=new b.Vector3().crossVectors(d,J).normalize(),o=I.clone().multiplyScalar(.5),a=[new b.Vector3(o.x,o.y,o.z),new b.Vector3(o.x,o.y,-o.z),new b.Vector3(o.x,-o.y,o.z),new b.Vector3(o.x,-o.y,-o.z),new b.Vector3(-o.x,o.y,o.z),new b.Vector3(-o.x,o.y,-o.z),new b.Vector3(-o.x,-o.y,o.z),new b.Vector3(-o.x,-o.y,-o.z)].map(Y=>new b.Vector3(Y.dot(J),Y.dot(L),Y.dot(d)));let z=0,R=0,O=0;for(let Y=0;Y<3;Y++){let S=0;for(const AA of a){const $=Math.abs(AA.x-z),cA=Math.abs(AA.y-R),PA=$*M/(Z*i),UA=cA*M/Z,mI=AA.z+Math.max(PA,UA);S=Math.max(S,mI)}const T=Math.max(I.x,I.y,I.z);O=Math.max(S,T*.1,sh);let p=1/0,eA=-1/0,CA=1/0,zA=-1/0;for(const AA of a){const $=O-AA.z;if($<.001)continue;const cA=(AA.x-z)/$,PA=(AA.y-R)/$;p=Math.min(p,cA),eA=Math.max(eA,cA),CA=Math.min(CA,PA),zA=Math.max(zA,PA)}const mA=(p+eA)/2,LA=(CA+zA)/2;if(z+=mA*O,R+=LA*O,Math.abs(mA)<.001&&Math.abs(LA)<.001)break}const B=J.clone().multiplyScalar(z).add(L.clone().multiplyScalar(R)),X=A.clone().add(B);return{position:X.clone().add(d.multiplyScalar(O)),target:X}}calculateIsometricFraming(A,I,i,C){const l=this.activeCameraKey,Z=($C.CAMERA_PRESETS[l]||$C.CAMERA_PRESETS.isometric).rotation||$C.CAMERA_PRESETS.isometric.rotation,M=new b.Euler(...Z),e=Math.max(I.x,I.y,I.z)*1.5+Ob*2,t=new b.Vector3(0,0,1);return t.applyEuler(M),t.multiplyScalar(e),{position:A.clone().add(t),rotation:M}}async zoomToOrbitPosition(A={}){const{duration:I=2,padding:i=.08,startFromCurrentPosition:C=!0,startOrbitAfterZoom:l=!1,easing:w=n=>n*n*(3-2*n)}=A;if(this.schematicRenderer?.schematicManager?.isEmpty())return;console.log("Starting zoom directly to orbit position");const Z=this.cameraPathManager.getFirstPath();if(!Z||!(Z.path instanceof je)){console.warn("No circular camera path available for zoom to orbit"),l&&this.startAutoOrbitFromOptimalPosition();return}const M=Z.path;this.cameraPathManager.fitCircularPathToSchematics(Z.name,{padding:i});let m;const e=this.activeCamera.rotation.clone(),t=this.findClosestOrbitPoint(M,C?this.activeCamera.position.clone():M.getPoint(0).position);if(C)m=this.activeCamera.position.clone();else{const n=M.getTargetPosition().clone().sub(t.position).normalize(),D=M.getRadius()*2;m=t.position.clone().add(n.multiplyScalar(D))}M.setStartAngle(t.angle);const j=this.controls.get(this.activeControlKey);j&&(j.enabled=!1),await this.animateToPosition(m,e,t.position,null,M.getTargetPosition(),I,w),j&&"target"in j&&(j.target.copy(M.getTargetPosition()),j.update&&j.update()),j&&(j.enabled=!0),l&&setTimeout(()=>{this.startAutoOrbitFromOptimalPosition()},100)}startAutoOrbit(){if(this.autoOrbitEnabled)return;this.stopAnimation();const A=this.cameraPathManager.getFirstPath();if(!A||!(A.path instanceof je)){console.warn("Cannot start auto-orbit: No circular camera path or path not found.");return}console.log("🎬 Starting auto-orbit animation.");const I=this.controls.get(this.activeControlKey);I&&(I.enabled=!1),this.autoOrbitEnabled=!0,this.autoOrbitStartTime=performance.now();const i=()=>{if(!this.autoOrbitEnabled)return;const l=(performance.now()-this.autoOrbitStartTime)/1e3%this.autoOrbitDuration/this.autoOrbitDuration,{position:w,rotation:Z,target:M}=A.path.getPoint(l);this.activeCamera.position.copy(w),this.activeCamera.lookAt(M),this.emit("cameraMove",{position:this.activeCamera.position.clone(),rotation:this.activeCamera.rotation.clone(),progress:l}),this.autoOrbitAnimationId=requestAnimationFrame(i)};this.autoOrbitAnimationId=requestAnimationFrame(i)}stopAutoOrbit(){if(!this.autoOrbitEnabled)return;this.autoOrbitEnabled=!1,this.autoOrbitAnimationId!==null&&(cancelAnimationFrame(this.autoOrbitAnimationId),this.autoOrbitAnimationId=null);const A=this.controls.get(this.activeControlKey);A&&(A.enabled=!0)}toggleAutoOrbit(){if(this.autoOrbitEnabled)return this.stopAutoOrbit(),!1;{const A=this.cameraPathManager.getFirstPath();return A&&this.schematicRenderer.schematicManager&&!this.schematicRenderer.schematicManager.isEmpty()&&this.cameraPathManager.fitCircularPathToSchematics(A.name),this.startAutoOrbitFromOptimalPosition(),!0}}setAutoOrbitDuration(A){this.autoOrbitDuration=Math.max(1,A),this.autoOrbitEnabled&&(this.stopAutoOrbit(),this.startAutoOrbitFromOptimalPosition())}isAutoOrbitEnabled(){return this.autoOrbitEnabled}setIsometricAngles(A,I=45,i=!0){A=Math.max(0,Math.min(89,A));const C=-(A*Math.PI)/180,l=I*Math.PI/180,w=$C.CAMERA_PRESETS.isometric;if(w.rotation=[C,l,0],this.activeCameraKey==="isometric"){const Z=new b.Euler(C,l,0);this.activeCamera.rotation=[Z.x,Z.y,Z.z],i&&this.schematicRenderer.schematicManager&&!this.schematicRenderer.schematicManager.isEmpty()&&this.focusOnSchematics({animationDuration:.5,easing:M=>M*M*(3-2*M)}),console.log(`Isometric angles updated: pitch=${A}°, yaw=${I}°`)}}resetIsometricAngles(A=!0){const I=Math.atan(1/Math.sqrt(2))*(180/Math.PI);this.setIsometricAngles(I,45,A)}getIsometricAngles(){if(this.activeCameraKey!=="isometric")return null;const A=$C.CAMERA_PRESETS.isometric;return A.rotation?{pitch:-(A.rotation[0]*180)/Math.PI,yaw:A.rotation[1]*180/Math.PI}:null}dispose(){this.recordingManager.dispose(),this.stopAnimation(),this.stopAutoOrbit(),this.flyControls&&(this.flyControls.dispose(),this.flyControls=null),this.controls.forEach(A=>{A.dispose&&A.dispose()}),this.controls.clear(),this.cameras.clear(),this.removeAllListeners()}static SNAP_ANGLES={front:{dir:[0,0,1]},back:{dir:[0,0,-1]},right:{dir:[1,0,0]},left:{dir:[-1,0,0]},top:{dir:[0,1,0]},bottom:{dir:[0,-1,0]},"3/4":{dir:[1,.7,1]},"iso-ne":{iso:[35.264,45]},"iso-nw":{iso:[35.264,135]},"iso-sw":{iso:[35.264,225]},"iso-se":{iso:[35.264,315]},"iso-top":{iso:[89,45]},"iso-front":{iso:[10,0]},"iso-right":{iso:[10,90]},"iso-back":{iso:[10,180]},"iso-left":{iso:[10,270]}};snapToAngle(A,I=!0){const i=$C.SNAP_ANGLES[A];if(!i){console.warn(`Unknown snap angle: ${A}`);return}if("iso"in i)this.setIsometricAngles(i.iso[0],i.iso[1],I);else if("dir"in i){const C=this.getControlsTarget(),l=this.activeCamera.camera,w=l.position.distanceTo(C),Z=new b.Vector3(i.dir[0],i.dir[1],i.dir[2]).normalize(),M=C.clone().add(Z.multiplyScalar(w));l.position.copy(M),l.lookAt(C);const m=this.controls.get(this.activeControlKey);m&&"target"in m&&(m.target.copy(C),m.update?.()),I&&this.focusOnSchematics({padding:.05,animationDuration:0})}}getControlsTarget(){const A=this.controls.get(this.activeControlKey);return A&&"target"in A?A.target.clone():new b.Vector3(0,0,0)}static getSnapAngles(){return Object.keys($C.SNAP_ANGLES)}calculateFramingDistance(A,I,i=.05){const C=this.activeCamera.camera,l=b.MathUtils.degToRad(C.fov),w=this.schematicRenderer.canvas.width/this.schematicRenderer.canvas.height,Z=Math.tan(l/2),M=1+i*2,e=I.getSize(new b.Vector3).clone().multiplyScalar(.5),t=new b.Vector3(0,1,0),j=new b.Vector3().crossVectors(t,A).normalize();j.lengthSq()<.001&&j.set(1,0,0);const n=new b.Vector3().crossVectors(A,j).normalize(),D=[new b.Vector3(e.x,e.y,e.z),new b.Vector3(e.x,e.y,-e.z),new b.Vector3(e.x,-e.y,e.z),new b.Vector3(e.x,-e.y,-e.z),new b.Vector3(-e.x,e.y,e.z),new b.Vector3(-e.x,e.y,-e.z),new b.Vector3(-e.x,-e.y,e.z),new b.Vector3(-e.x,-e.y,-e.z)];let d=0,c=0;for(const o of D)d=Math.max(d,Math.abs(o.dot(j))),c=Math.max(c,Math.abs(o.dot(n)));d*=M,c*=M;const J=d/(Z*w),L=c/Z;return Math.max(J,L)}}N.UniformsLib.line={worldUnits:{value:1},linewidth:{value:1},resolution:{value:new N.Vector2(1,1)},dashOffset:{value:0},dashScale:{value:1},dashSize:{value:1},gapSize:{value:1}},N.ShaderLib.line={uniforms:N.UniformsUtils.merge([N.UniformsLib.common,N.UniformsLib.fog,N.UniformsLib.line]),vertexShader:`
13
+ `,this.overlayElement.appendChild(A),this.overlayElement.addEventListener("click",this.onOverlayClick);const I=this.domElement.parentElement;I&&(I.style.position="relative",I.appendChild(this.overlayElement)),this.showOverlay(!1)}showOverlay(A){this.overlayElement&&(this.overlayElement.style.opacity=A?"1":"0",this.overlayElement.style.pointerEvents=A?"auto":"none")}setOverlayVisible(A){this.showOverlay(A)}lock(){this.enabled&&this.pointerLockControls.lock()}unlock(){this.pointerLockControls.unlock()}toggle(){this.isLocked?this.unlock():this.lock()}update(A){if(!this.enabled||!this.isLocked)return;this.direction.set(0,0,0),this.pressedKeys.has(this.keybinds.forward)&&(this.direction.z-=1),this.pressedKeys.has(this.keybinds.backward)&&(this.direction.z+=1),this.pressedKeys.has(this.keybinds.left)&&(this.direction.x-=1),this.pressedKeys.has(this.keybinds.right)&&(this.direction.x+=1),this.pressedKeys.has(this.keybinds.up)&&(this.direction.y+=1),this.pressedKeys.has(this.keybinds.down)&&(this.direction.y-=1),this.direction.length()>0&&this.direction.normalize();let I=this.moveSpeed;this.pressedKeys.has(this.keybinds.sprint)&&(I*=this.sprintMultiplier),this.velocity.copy(this.direction).multiplyScalar(I*A);const i=new b.Vector3;this.camera.getWorldDirection(i);const C=new b.Vector3(i.x,0,i.z).normalize(),l=new b.Vector3().crossVectors(new b.Vector3(0,1,0),C).normalize(),w=new b.Vector3;w.addScaledVector(C,-this.velocity.z),w.addScaledVector(l,-this.velocity.x),w.y+=this.velocity.y,this.camera.position.add(w),w.length()>0&&this.emit("change")}getMoveSpeed(){return this.moveSpeed}setMoveSpeed(A){this.moveSpeed=A}getSprintMultiplier(){return this.sprintMultiplier}setSprintMultiplier(A){this.sprintMultiplier=A}getKeybinds(){return{...this.keybinds}}setKeybinds(A){this.keybinds={...this.keybinds,...A}}getPointerLockControls(){return this.pointerLockControls}dispose(){this.domElement.removeEventListener("click",this.onCanvasClick),document.removeEventListener("keydown",this.onKeyDown),document.removeEventListener("keyup",this.onKeyUp),this.isLocked&&this.unlock(),this.overlayElement&&(this.overlayElement.removeEventListener("click",this.onOverlayClick),this.overlayElement.parentElement&&this.overlayElement.parentElement.removeChild(this.overlayElement)),this.overlayElement=null,this.pointerLockControls.dispose(),this.pressedKeys.clear(),this.removeAllListeners()}}const Ob=5,sh=5;class $C extends Ds.EventEmitter{schematicRenderer;cameras=new Map;cameraOptions;activeCameraKey;controls=new Map;activeControlKey;rendererDomElement;animationRequestId=null;isAnimating=!1;animationStartPosition=new b.Vector3;animationStartRotation=new b.Euler;recordingManager;flyControls=null;flyControlsEnabled=!1;autoOrbitEnabled=!1;autoOrbitAnimationId=null;autoOrbitStartTime=0;autoOrbitDuration=30;cameraPathManager;static CAMERA_PRESETS={isometric:{type:"orthographic",position:[0,0,20],rotation:[-Math.atan(1/Math.sqrt(2)),45*Math.PI/180,0],controlType:"orbit",fov:45,controlSettings:{enableDamping:!0,dampingFactor:.08,minDistance:5,maxDistance:500,enableZoom:!0,enableRotate:!0,enablePan:!0,panSpeed:1,rotateSpeed:.8,zoomSpeed:1.2,minPolarAngle:Math.PI/8,maxPolarAngle:Math.PI/2.1}},perspective:{type:"perspective",position:[0,20,20],rotation:[-20*Math.PI/180,0,0],controlType:"orbit",fov:60,controlSettings:{enableDamping:!0,dampingFactor:.08,minDistance:1,maxDistance:1e3,enableZoom:!0,enableRotate:!0,enablePan:!0,panSpeed:1,rotateSpeed:.8,zoomSpeed:1.2}},perspective_fpv:{type:"perspective",position:[0,2,0],rotation:[0,0,0],fov:90,controlType:"creative",controlSettings:{movementSpeed:new b.Vector3(200,200,200)}}};constructor(A,I={}){super(),this.schematicRenderer=A,this.rendererDomElement=this.schematicRenderer.canvas,this.cameraOptions={enableZoomInOnLoad:I.enableZoomInOnLoad||!1,zoomInDuration:I.zoomInDuration||2,autoOrbitAfterZoom:I.autoOrbitAfterZoom||!1,...I},this.recordingManager=new VD(A),this.activeCameraKey="perspective";const i=I.defaultCameraPreset||"perspective",C=$C.CAMERA_PRESETS[i]||$C.CAMERA_PRESETS.perspective;this.activeControlKey=`${i}-${C.controlType}`,I.defaultCameraPreset&&(console.log(`Switching to default camera preset: ${I.defaultCameraPreset}`),this.activeCameraKey=I.defaultCameraPreset,this.switchCameraPreset(I.defaultCameraPreset)),Object.entries($C.CAMERA_PRESETS).forEach(([w,Z])=>{const M={position:I.position||Z.position,size:Z.type==="orthographic"?20:void 0,fov:Z.fov};"rotation"in Z&&(M.rotation=Z.rotation);const m=this.createCamera(Z.type,M);this.cameras.set(w,m);const e=`${w}-${Z.controlType}`,t=this.createControls(Z.controlType,m);t&&Z.controlSettings&&(Object.assign(t,Z.controlSettings),w==="isometric"&&this.setupIsometricControls(t)),t&&(this.controls.set(e,t),this.setupControlEvents(t))}),this.cameras.has(this.activeCameraKey)||(this.activeCameraKey="perspective");const l=$C.CAMERA_PRESETS[this.activeCameraKey];this.activeControlKey=`${this.activeCameraKey}-${l.controlType}`,this.controls.forEach((w,Z)=>{w.enabled=Z===this.activeControlKey}),this.cameraPathManager=new KE(this.schematicRenderer,{showVisualization:I.showCameraPathVisualization||!1}),this.schematicRenderer.options.autoOrbitDuration&&(this.autoOrbitDuration=this.schematicRenderer.options.autoOrbitDuration),this.schematicRenderer.eventEmitter&&this.schematicRenderer.eventEmitter.on("schematicAdded",async()=>{await this.handleSchematicLoaded(this.cameraOptions.enableZoomInOnLoad)}),this.schematicRenderer.options.enableAutoOrbit&&!this.cameraOptions.enableZoomInOnLoad&&this.startAutoOrbit()}createCamera(A,I){let i;return A==="perspective"?i=new Lb("perspective",this.rendererDomElement,this.schematicRenderer,I):i=new Lb("orthographic",this.rendererDomElement,this.schematicRenderer,I),i}getDefaultCameraPath(){const A=Array.from(this.cameraPathManager.paths.entries());return A.length>0?{path:A[0][1],name:A[0][0]}:null}async animateCameraAlongPath(A){let I,i={};if(A instanceof ob?I=A:typeof A=="object"&&(i=A,i.pathName&&(I=this.cameraPathManager.getPath(i.pathName))),!I){const n=this.getDefaultCameraPath();if(!n)return Promise.reject(new Error("No camera path available"));I=n.path,console.log(`Using default camera path: ${n.name}`)}const{totalFrames:C=300,targetFps:l=60,easing:w=_E.linear,lookAtTarget:Z=!0,updateControls:M=!0,onStart:m,onUpdate:e,onComplete:t}=i,j=1e3/l;this.stopAnimation();try{return new Promise((n,D)=>{this.isAnimating=!0;let d=0,c=performance.now();if(this.animationStartPosition.copy(this.activeCamera.position),this.animationStartRotation.copy(this.activeCamera.rotation),M){const a=this.controls.get(this.activeControlKey);a&&a.enabled&&(a.enabled=!1)}const{position:J,rotation:L,target:o}=I.getPoint(0);this.activeCamera.position.copy(J),this.activeCamera.rotation.copy(L),Z&&this.activeCamera.lookAt(o);const Q=async()=>{let a=d/C;a=w(a);const{position:z,rotation:R,target:O}=I.getPoint(a);if(this.activeCamera.position.copy(z),Z?this.activeCamera.lookAt(O):this.activeCamera.rotation.copy(R),this.emit("cameraMove",{position:this.activeCamera.position.clone(),rotation:this.activeCamera.rotation.clone(),progress:a}),e&&await e(a),d++,d<=C){const B=performance.now(),X=B-c,v=Math.max(0,j-X);c=B,setTimeout(()=>{this.animationRequestId=requestAnimationFrame(Q)},v)}else{if(this.isAnimating=!1,M){const B=this.controls.get(this.activeControlKey);B&&(B.enabled=!0)}t&&t(),n()}};m&&m(),this.animationRequestId=requestAnimationFrame(Q)})}catch(n){throw this.stopAnimation(),n}}isCurrentlyAnimating(){return this.isAnimating}stopAnimation(){if(this.animationRequestId!==null){cancelAnimationFrame(this.animationRequestId),this.animationRequestId=null,this.isAnimating=!1;const A=this.controls.get(this.activeControlKey);A&&(A.enabled=!0)}}switchCameraPreset(A){const I=$C.CAMERA_PRESETS[A];if(!I){console.warn(`Preset ${A} not found`);return}const i=this.activeCameraKey;this.schematicRenderer.uiManager?.hideFPVOverlay(),this.activeCameraKey=A;const C=`${A}-${I.controlType}`;this.controls.forEach((w,Z)=>{w.enabled=Z===C}),this.activeControlKey=C;const l=this.controls.get(this.activeControlKey);l&&(l.object=this.activeCamera.camera,I.controlType==="orbit"&&l.update&&l.update()),I.controlType==="creative"&&this.schematicRenderer.uiManager?.showFPVOverlay(),this.schematicRenderer.renderManager&&this.schematicRenderer.renderManager.updateCamera(this.activeCamera.camera),this.emit("cameraChanged",{previousCamera:i,newCamera:A,controlType:I.controlType}),this.schematicRenderer.schematicManager&&!this.schematicRenderer.schematicManager.isEmpty()&&this.focusOnSchematics()}updatePathParameters(A,I){this.cameraPathManager.updatePathParameters(A,I)}showPathVisualization(A){this.cameraPathManager.showPathVisualization(A)}hidePathVisualization(A){this.cameraPathManager.hidePathVisualization(A)}getCameraPath(A){return this.cameraPathManager.getPath(A)}createControls(A,I){return I.createControls(A)}switchControls(A){const I=this.controls.get(this.activeControlKey);I&&I.dispose&&I.dispose();const i=this.activeCamera,C=this.createControls(A,i);this.controls.set(A,C),this.activeControlKey=A,C&&this.setupControlEvents(C)}setupControlEvents(A){A.addEventListener("change",()=>{this.schematicRenderer.invalidate(),this.emit("propertyChanged",{property:"position",value:this.activeCamera.position.clone()}),this.emit("propertyChanged",{property:"rotation",value:this.activeCamera.rotation.clone()})})}setupIsometricControls(A){A.enableDamping=!0,A.dampingFactor=.1,A.minDistance=10,A.maxDistance=100,A.enableZoom=!0,A.enableRotate=!0,A.enablePan=!0,A.minPolarAngle=Math.PI/6,A.maxPolarAngle=Math.PI/2.2}update(A=0){if(this.flyControlsEnabled&&this.flyControls){this.flyControls.update(A);return}const I=this.controls.get(this.activeControlKey);if(I)if(this.activeControlKey.includes("creative")){const i=$C.CAMERA_PRESETS.perspective_fpv.controlSettings?.movementSpeed;i&&HA.update(I,i)}else I.update&&I.update(A)}initializeFlyControls(A){return this.flyControls&&this.flyControls.dispose(),this.flyControls=new Pb(this.activeCamera.camera,this.rendererDomElement,A),this.flyControls.on("lock",()=>{this.schematicRenderer.uiManager?.hideFPVOverlay(),this.emit("flyControlsLocked")}),this.flyControls.on("unlock",()=>{this.flyControlsEnabled&&this.schematicRenderer.uiManager?.hideFPVOverlay(),this.emit("flyControlsUnlocked")}),this.flyControls.on("change",()=>{this.emit("cameraMove",{position:this.activeCamera.position.clone(),rotation:this.activeCamera.rotation.clone()})}),this.flyControls}enableFlyControls(){this.flyControls||this.initializeFlyControls(),this.controls.forEach(A=>{A.enabled=!1}),this.flyControlsEnabled=!0,this.flyControls&&(this.flyControls.enabled=!0,this.flyControls.setOverlayVisible(!0)),this.schematicRenderer.uiManager?.hideFPVOverlay(),this.emit("controlModeChanged",{mode:"fly"})}disableFlyControls(){this.flyControls?.isLocked&&this.flyControls.unlock(),this.flyControlsEnabled=!1,this.flyControls&&(this.flyControls.enabled=!1,this.flyControls.setOverlayVisible(!1));const A=this.controls.get(this.activeControlKey);A&&(A.enabled=!0),this.emit("controlModeChanged",{mode:"orbit"})}toggleFlyControls(){return this.flyControlsEnabled?(this.disableFlyControls(),!1):(this.enableFlyControls(),!0)}isFlyControlsEnabled(){return this.flyControlsEnabled}isFlyControlsLocked(){return this.flyControls?.isLocked??!1}getFlyControlsSettings(){return this.flyControls?{moveSpeed:this.flyControls.getMoveSpeed(),sprintMultiplier:this.flyControls.getSprintMultiplier(),keybinds:this.flyControls.getKeybinds()}:null}setFlyControlsSettings(A){this.flyControls&&(A.moveSpeed!==void 0&&this.flyControls.setMoveSpeed(A.moveSpeed),A.sprintMultiplier!==void 0&&this.flyControls.setSprintMultiplier(A.sprintMultiplier),A.keybinds!==void 0&&this.flyControls.setKeybinds(A.keybinds))}get activeCamera(){return this.cameras.get(this.activeCameraKey)}updateAspectRatio(A){this.cameras.forEach(I=>{if(I.camera instanceof b.PerspectiveCamera)I.camera.aspect=A,I.camera.updateProjectionMatrix();else if(I.camera instanceof b.OrthographicCamera){const i=I.camera.top-I.camera.bottom;I.camera.left=-i*A/2,I.camera.right=i*A/2,I.camera.updateProjectionMatrix()}}),this.schematicRenderer.schematicManager&&!this.schematicRenderer.schematicManager.isEmpty()&&this.focusOnSchematics({animationDuration:0})}lookAt(A){Array.isArray(A)?this.activeCamera.lookAt(new b.Vector3(...A)):this.activeCamera.lookAt(A)}lookAtSchematicsCenter(){if(!this.schematicRenderer.schematicManager)return;const A=this.schematicRenderer.schematicManager.getSchematicsAveragePosition();this.activeCamera.lookAt(A)}async focusOnSchematics(A={}){if(!this.schematicRenderer?.schematicManager||this.schematicRenderer.schematicManager.isEmpty())return;if(A.preserveCamera??this.cameraOptions.preserveCameraOnUpdate??!1){console.log("Camera preservation enabled, skipping focus");return}const{padding:i=.05,animationDuration:C=0,easing:l=o=>o*o*(3-2*o),skipPathFitting:w=!1}=A,Z=this.controls.get(this.activeControlKey);Z&&(Z.enabled=!1);const M=this.calculateSchematicBounds();if(!M){console.warn("No valid schematic bounds found"),Z&&(Z.enabled=!0);return}const{center:m,size:e}=M,t=this.schematicRenderer.canvas,j=t.width/t.height,n=new b.Vector3().copy(this.activeCamera.position),D=new b.Euler().copy(this.activeCamera.rotation);let d,c=null,J=m.clone();if(this.activeCamera.camera.type==="OrthographicCamera"){const o=this.calculateIsometricFraming(m,e,j,i);d=o.position,c=o.rotation;const Q=this.activeCamera.camera,a=this.calculateOrthographicSize(e,j,i);Q.left=-a*j/2,Q.right=a*j/2,Q.top=a/2,Q.bottom=-a/2,Q.updateProjectionMatrix()}else{const o=this.calculatePerspectiveFraming(m,e,j,i);d=o.position,J=o.target}if(C>0?await this.animateToPosition(n,D,d,c,J,C,l):(this.activeCamera.setPosition([d.x,d.y,d.z]),c?this.activeCamera.rotation=[c.x,c.y,c.z]:this.activeCamera.lookAt(J)),Z&&"target"in Z&&(Z.target.copy(J),Z.update()),Z&&(Z.enabled=!0),!w){const o=Math.max(e.x,e.y,e.z);this.cameraPathManager.fitCircularPathToSchematics("circularPath",{padding:i,minRadius:o*.8,maxRadius:o*2.5})}const L=this.autoOrbitEnabled;if(L&&this.stopAutoOrbit(),L||this.cameraOptions.autoOrbitAfterZoom&&C>0){const o=C>0?100:0;setTimeout(()=>this.startAutoOrbitFromOptimalPosition(),o)}else this.schematicRenderer.options.enableAutoOrbit&&C===0&&!this.cameraOptions.enableZoomInOnLoad&&setTimeout(()=>this.startAutoOrbitFromOptimalPosition(),100)}calculateOrthographicSize(A,I,i){const C=1+i*2;let l,w;if(this.activeCamera.camera instanceof b.OrthographicCamera){const M=this.activeCamera.camera.matrixWorldInverse,m=A.clone().multiplyScalar(.5),e=this.schematicRenderer.schematicManager.getSchematicsAveragePosition(),t=[new b.Vector3(e.x-m.x,e.y-m.y,e.z-m.z),new b.Vector3(e.x+m.x,e.y-m.y,e.z-m.z),new b.Vector3(e.x-m.x,e.y+m.y,e.z-m.z),new b.Vector3(e.x+m.x,e.y+m.y,e.z-m.z),new b.Vector3(e.x-m.x,e.y-m.y,e.z+m.z),new b.Vector3(e.x+m.x,e.y-m.y,e.z+m.z),new b.Vector3(e.x-m.x,e.y+m.y,e.z+m.z),new b.Vector3(e.x+m.x,e.y+m.y,e.z+m.z)];let j=1/0,n=-1/0,D=1/0,d=-1/0;for(const c of t){const J=c.clone().applyMatrix4(M);j=Math.min(j,J.x),n=Math.max(n,J.x),D=Math.min(D,J.y),d=Math.max(d,J.y)}l=(n-j)*C,w=(d-D)*C}else l=A.x*C,w=A.y*C;let Z;return l/I>w?Z=l/I:Z=w,Math.max(Z,Ob)}async startAutoOrbitWithZoomIn(A={}){const{zoomIn:I=!0,zoomDuration:i=2,orbitDelay:C=.5,orbitTransitionDuration:l=1}=A;if(I&&!this.schematicRenderer?.schematicManager?.isEmpty()){console.log("Starting cinematic zoom-in followed by auto-orbit"),await this.zoomInToSchematics({duration:i,padding:.08,skipPathFitting:!0}),C>0&&await new Promise(Z=>setTimeout(Z,C*1e3));const w=this.cameraPathManager.getFirstPath();w&&this.cameraPathManager.fitCircularPathToSchematics(w.name),this.startAutoOrbitSmooth({transitionDuration:l,startFromCurrentPosition:!0,skipPathFitting:!0})}else this.startAutoOrbitSmooth({transitionDuration:l,startFromCurrentPosition:!0})}setZoomInOnLoad(A,I=2){this.cameraOptions.enableZoomInOnLoad=A,this.cameraOptions.zoomInDuration=I}setAutoOrbitAfterZoom(A){this.cameraOptions.autoOrbitAfterZoom=A}getCameraSettings(){return{enableZoomInOnLoad:this.cameraOptions.enableZoomInOnLoad||!1,zoomInDuration:this.cameraOptions.zoomInDuration||2,autoOrbitAfterZoom:this.cameraOptions.autoOrbitAfterZoom||!1,autoOrbitEnabled:this.autoOrbitEnabled}}async handleSchematicLoaded(A=!1){if(A){const I=this.cameraPathManager.getFirstPath();I&&this.cameraPathManager.fitCircularPathToSchematics(I.name),await this.zoomToOrbitPosition({duration:this.cameraOptions.zoomInDuration||2,padding:.08,startFromCurrentPosition:!0,startOrbitAfterZoom:this.cameraOptions.autoOrbitAfterZoom||!1})}else await this.focusOnSchematics({animationDuration:0,padding:.08,skipPathFitting:!1})}startAutoOrbitFromOptimalPosition(){this.autoOrbitEnabled&&this.stopAutoOrbit();const A=this.cameraPathManager.getFirstPath();if(!A||!(A.path instanceof je)){console.warn("Cannot start auto-orbit: No circular camera path available");return}const I=A.path,i=new b.Vector3().copy(this.activeCamera.position),C=this.findClosestOrbitPoint(I,i);I.setStartAngle(C.angle),this.activeCamera.setPosition([C.position.x,C.position.y,C.position.z]),this.activeCamera.lookAt(I.getTargetPosition());const l=this.controls.get(this.activeControlKey);l&&"target"in l&&(l.target.copy(I.getTargetPosition()),l.update&&l.update()),this.startAutoOrbit()}startAutoOrbitSmooth(A={}){if(this.autoOrbitEnabled)return;const{transitionDuration:I=1,startFromCurrentPosition:i=!0,easing:C=M=>M*M*(3-2*M),skipPathFitting:l=!1}=A;this.stopAnimation();const w=this.cameraPathManager.getFirstPath();if(!w||!(w.path instanceof je)){console.warn("Cannot start auto-orbit: No (circular) camera path available.");return}!l&&this.schematicRenderer?.schematicManager&&!this.schematicRenderer.schematicManager.isEmpty()&&this.cameraPathManager.fitCircularPathToSchematics(w.name);const Z=w.path;if(i&&I>0)this.transitionToOrbit(Z,I,C);else{const M=Z.getPoint(0);this.activeCamera.setPosition([M.position.x,M.position.y,M.position.z]),this.activeCamera.lookAt(M.target);const m=this.controls.get(this.activeControlKey);m&&"target"in m&&(m.target.copy(M.target),m.update&&m.update()),this.startAutoOrbit()}}async zoomInToSchematics(A={}){const{padding:I=.08,duration:i=2,easing:C=o=>o*o*(3-2*o),startDistance:l=3,startFromCurrentPosition:w=!1,skipPathFitting:Z=!1}=A;if(this.schematicRenderer?.schematicManager?.isEmpty())return;console.log("Starting cinematic zoom-in to schematics");const M=this.calculateSchematicBounds();if(!M)return;const{center:m,size:e}=M,t=this.schematicRenderer.canvas,j=t.width/t.height;let n,D=null,d=m;if(this.activeCamera.camera.type==="OrthographicCamera"){const o=this.calculateIsometricFraming(m,e,j,I);n=o.position,D=o.rotation;const Q=this.activeCamera.camera,a=this.calculateOrthographicSize(e,j,I);Q.left=-a*j/2,Q.right=a*j/2,Q.top=a/2,Q.bottom=-a/2}else{const o=this.calculatePerspectiveFraming(m,e,j,I);n=o.position,d=o.target}let c;const J=this.activeCamera.rotation?this.activeCamera.rotation.clone():new b.Euler;if(w)c=this.activeCamera.position.clone();else{const o=n.clone().sub(m).normalize();o.lengthSq()===0&&o.set(0,0,1),c=m.clone().add(o.multiplyScalar(n.distanceTo(m)*l))}const L=this.controls.get(this.activeControlKey);if(L&&(L.enabled=!1),await this.animateToPosition(c,J,n,D,d,i,C),this.activeCamera.camera.type==="OrthographicCamera"&&this.activeCamera.camera.updateProjectionMatrix(),L&&"target"in L&&(L.target.copy(d),L.update&&L.update()),L&&(L.enabled=!0),!Z){const o=Math.max(e.x,e.y,e.z);this.cameraPathManager.fitCircularPathToSchematics("circularPath",{padding:I,minRadius:o*.8,maxRadius:o*2.5})}}async transitionToOrbit(A,I,i){const C=this.activeCamera.position.clone(),l=this.activeCamera.rotation.clone(),w=A.getTargetPosition(),Z=this.findClosestOrbitPoint(A,C),M=Z.position;A.setStartAngle(Z.angle);const m=this.controls.get(this.activeControlKey);m&&(m.enabled=!1),await this.animateToPosition(C,l,M,null,w,I,i),this.startAutoOrbit()}findClosestOrbitPoint(A,I){const i=A.getCenter(),C=A.getRadius(),l=A.getHeight(),Z=new b.Vector3(I.x,i.y+l,I.z).clone().sub(i);if(Z.lengthSq()===0){const e=A.getStartAngle()!==void 0?A.getStartAngle():0;return{position:new b.Vector3(i.x+C*Math.cos(e),i.y+l,i.z+C*Math.sin(e)),angle:e}}Z.normalize();const M=Math.atan2(Z.z,Z.x);return{position:new b.Vector3(i.x+C*Math.cos(M),i.y+l,i.z+C*Math.sin(M)),angle:M}}async animateToPosition(A,I,i,C,l,w,Z){return new Promise(M=>{const m=performance.now(),e=new b.Quaternion().setFromEuler(I);let t=null;C&&(t=new b.Quaternion().setFromEuler(C));const j=()=>{const n=(performance.now()-m)/1e3;let D=Math.min(n/w,1);D=Z(D);const d=A.clone().lerp(i,D);if(this.activeCamera.setPosition([d.x,d.y,d.z]),this.activeCamera.camera.type==="OrthographicCamera"&&t){const c=new b.Quaternion;c.slerpQuaternions(e,t,D);const J=new b.Euler().setFromQuaternion(c,this.activeCamera.camera.rotation.order);this.activeCamera.rotation=[J.x,J.y,J.z]}else this.activeCamera.lookAt(l);D<1?requestAnimationFrame(j):(this.activeCamera.setPosition([i.x,i.y,i.z]),this.activeCamera.camera.type==="OrthographicCamera"&&C?this.activeCamera.rotation=[C.x,C.y,C.z]:this.activeCamera.lookAt(l),M())};requestAnimationFrame(j)})}calculateSchematicBounds(){if(!this.schematicRenderer.schematicManager||this.schematicRenderer.schematicManager.isEmpty())return null;const A=this.schematicRenderer.schematicManager.getGlobalTightWorldBox();if(A.isEmpty())return null;const I=A.getCenter(new b.Vector3),i=A.getSize(new b.Vector3);return{center:I,size:i,boundingBox:A}}calculateOptimalViewingAngles(A,I=1){const{x:i,y:C,z:l}=A,w=Math.max(i,l),Z=w/(C+w+.001),M=Math.PI/6,m=11*Math.PI/36,e=b.MathUtils.lerp(M,m,Z),t=l/(i+l+.001),j=Math.min(Math.max((I-1)*.2,-.1),.1),n=Math.PI/6-j,D=Math.PI/3+j;return{yaw:b.MathUtils.lerp(n,D,t),pitch:e}}calculatePerspectiveFraming(A,I,i,C){const l=this.activeCamera.camera,w=b.MathUtils.degToRad(l.fov),Z=Math.tan(w/2),M=1+C*2,{yaw:m,pitch:e}=this.calculateOptimalViewingAngles(I,i),t=Math.cos(m),j=Math.sin(m),n=Math.cos(e),D=Math.sin(e),d=new b.Vector3(n*j,D,n*t).normalize(),c=new b.Vector3(0,1,0),J=new b.Vector3().crossVectors(c,d).normalize();J.lengthSq()<.001&&J.set(1,0,0);const L=new b.Vector3().crossVectors(d,J).normalize(),o=I.clone().multiplyScalar(.5),a=[new b.Vector3(o.x,o.y,o.z),new b.Vector3(o.x,o.y,-o.z),new b.Vector3(o.x,-o.y,o.z),new b.Vector3(o.x,-o.y,-o.z),new b.Vector3(-o.x,o.y,o.z),new b.Vector3(-o.x,o.y,-o.z),new b.Vector3(-o.x,-o.y,o.z),new b.Vector3(-o.x,-o.y,-o.z)].map(Y=>new b.Vector3(Y.dot(J),Y.dot(L),Y.dot(d)));let z=0,R=0,O=0;for(let Y=0;Y<3;Y++){let S=0;for(const AA of a){const $=Math.abs(AA.x-z),cA=Math.abs(AA.y-R),PA=$*M/(Z*i),UA=cA*M/Z,mI=AA.z+Math.max(PA,UA);S=Math.max(S,mI)}const T=Math.max(I.x,I.y,I.z);O=Math.max(S,T*.1,sh);let p=1/0,eA=-1/0,CA=1/0,zA=-1/0;for(const AA of a){const $=O-AA.z;if($<.001)continue;const cA=(AA.x-z)/$,PA=(AA.y-R)/$;p=Math.min(p,cA),eA=Math.max(eA,cA),CA=Math.min(CA,PA),zA=Math.max(zA,PA)}const mA=(p+eA)/2,LA=(CA+zA)/2;if(z+=mA*O,R+=LA*O,Math.abs(mA)<.001&&Math.abs(LA)<.001)break}const B=J.clone().multiplyScalar(z).add(L.clone().multiplyScalar(R)),X=A.clone().add(B);return{position:X.clone().add(d.multiplyScalar(O)),target:X}}calculateIsometricFraming(A,I,i,C){const l=this.activeCameraKey,Z=($C.CAMERA_PRESETS[l]||$C.CAMERA_PRESETS.isometric).rotation||$C.CAMERA_PRESETS.isometric.rotation,M=new b.Euler(Z[0],Z[1],Z[2]??0,"YXZ"),e=Math.max(I.x,I.y,I.z)*1.5+Ob*2,t=new b.Vector3(0,0,1);return t.applyEuler(M),t.multiplyScalar(e),{position:A.clone().add(t),rotation:M}}async zoomToOrbitPosition(A={}){const{duration:I=2,padding:i=.08,startFromCurrentPosition:C=!0,startOrbitAfterZoom:l=!1,easing:w=n=>n*n*(3-2*n)}=A;if(this.schematicRenderer?.schematicManager?.isEmpty())return;console.log("Starting zoom directly to orbit position");const Z=this.cameraPathManager.getFirstPath();if(!Z||!(Z.path instanceof je)){console.warn("No circular camera path available for zoom to orbit"),l&&this.startAutoOrbitFromOptimalPosition();return}const M=Z.path;this.cameraPathManager.fitCircularPathToSchematics(Z.name,{padding:i});let m;const e=this.activeCamera.rotation.clone(),t=this.findClosestOrbitPoint(M,C?this.activeCamera.position.clone():M.getPoint(0).position);if(C)m=this.activeCamera.position.clone();else{const n=M.getTargetPosition().clone().sub(t.position).normalize(),D=M.getRadius()*2;m=t.position.clone().add(n.multiplyScalar(D))}M.setStartAngle(t.angle);const j=this.controls.get(this.activeControlKey);j&&(j.enabled=!1),await this.animateToPosition(m,e,t.position,null,M.getTargetPosition(),I,w),j&&"target"in j&&(j.target.copy(M.getTargetPosition()),j.update&&j.update()),j&&(j.enabled=!0),l&&setTimeout(()=>{this.startAutoOrbitFromOptimalPosition()},100)}startAutoOrbit(){if(this.autoOrbitEnabled)return;this.stopAnimation();const A=this.cameraPathManager.getFirstPath();if(!A||!(A.path instanceof je)){console.warn("Cannot start auto-orbit: No circular camera path or path not found.");return}console.log("🎬 Starting auto-orbit animation.");const I=this.controls.get(this.activeControlKey);I&&(I.enabled=!1),this.autoOrbitEnabled=!0,this.autoOrbitStartTime=performance.now();const i=()=>{if(!this.autoOrbitEnabled)return;const l=(performance.now()-this.autoOrbitStartTime)/1e3%this.autoOrbitDuration/this.autoOrbitDuration,{position:w,rotation:Z,target:M}=A.path.getPoint(l);this.activeCamera.position.copy(w),this.activeCamera.lookAt(M),this.emit("cameraMove",{position:this.activeCamera.position.clone(),rotation:this.activeCamera.rotation.clone(),progress:l}),this.autoOrbitAnimationId=requestAnimationFrame(i)};this.autoOrbitAnimationId=requestAnimationFrame(i)}stopAutoOrbit(){if(!this.autoOrbitEnabled)return;this.autoOrbitEnabled=!1,this.autoOrbitAnimationId!==null&&(cancelAnimationFrame(this.autoOrbitAnimationId),this.autoOrbitAnimationId=null);const A=this.controls.get(this.activeControlKey);A&&(A.enabled=!0)}toggleAutoOrbit(){if(this.autoOrbitEnabled)return this.stopAutoOrbit(),!1;{const A=this.cameraPathManager.getFirstPath();return A&&this.schematicRenderer.schematicManager&&!this.schematicRenderer.schematicManager.isEmpty()&&this.cameraPathManager.fitCircularPathToSchematics(A.name),this.startAutoOrbitFromOptimalPosition(),!0}}setAutoOrbitDuration(A){this.autoOrbitDuration=Math.max(1,A),this.autoOrbitEnabled&&(this.stopAutoOrbit(),this.startAutoOrbitFromOptimalPosition())}isAutoOrbitEnabled(){return this.autoOrbitEnabled}setIsometricAngles(A,I=45,i=!0){A=Math.max(0,Math.min(89,A));const C=-(A*Math.PI)/180,l=I*Math.PI/180,w=$C.CAMERA_PRESETS.isometric;if(w.rotation=[C,l,0],this.activeCameraKey==="isometric"){const Z=new b.Euler(C,l,0,"YXZ");this.activeCamera.camera.rotation.order="YXZ",this.activeCamera.rotation=[Z.x,Z.y,Z.z],i&&this.schematicRenderer.schematicManager&&!this.schematicRenderer.schematicManager.isEmpty()&&this.focusOnSchematics({animationDuration:.5,easing:M=>M*M*(3-2*M)}),console.log(`Isometric angles updated: pitch=${A}°, yaw=${I}°`)}}resetIsometricAngles(A=!0){const I=Math.atan(1/Math.sqrt(2))*(180/Math.PI);this.setIsometricAngles(I,45,A)}getIsometricAngles(){if(this.activeCameraKey!=="isometric")return null;const A=$C.CAMERA_PRESETS.isometric;return A.rotation?{pitch:-(A.rotation[0]*180)/Math.PI,yaw:A.rotation[1]*180/Math.PI}:null}dispose(){this.recordingManager.dispose(),this.stopAnimation(),this.stopAutoOrbit(),this.flyControls&&(this.flyControls.dispose(),this.flyControls=null),this.controls.forEach(A=>{A.dispose&&A.dispose()}),this.controls.clear(),this.cameras.clear(),this.removeAllListeners()}static SNAP_ANGLES={front:{dir:[0,0,1]},back:{dir:[0,0,-1]},right:{dir:[1,0,0]},left:{dir:[-1,0,0]},top:{dir:[0,1,0]},bottom:{dir:[0,-1,0]},"3/4":{dir:[1,.7,1]},"iso-ne":{iso:[35.264,45]},"iso-nw":{iso:[35.264,135]},"iso-sw":{iso:[35.264,225]},"iso-se":{iso:[35.264,315]},"iso-top":{iso:[89,45]},"iso-front":{iso:[10,0]},"iso-right":{iso:[10,90]},"iso-back":{iso:[10,180]},"iso-left":{iso:[10,270]}};snapToAngle(A,I=!0){const i=$C.SNAP_ANGLES[A];if(!i){console.warn(`Unknown snap angle: ${A}`);return}if("iso"in i)this.setIsometricAngles(i.iso[0],i.iso[1],I);else if("dir"in i){const C=this.getControlsTarget(),l=this.activeCamera.camera,w=l.position.distanceTo(C),Z=new b.Vector3(i.dir[0],i.dir[1],i.dir[2]).normalize(),M=C.clone().add(Z.multiplyScalar(w));l.position.copy(M),l.lookAt(C);const m=this.controls.get(this.activeControlKey);m&&"target"in m&&(m.target.copy(C),m.update?.()),I&&this.focusOnSchematics({padding:.05,animationDuration:0})}}getControlsTarget(){const A=this.controls.get(this.activeControlKey);return A&&"target"in A?A.target.clone():new b.Vector3(0,0,0)}static getSnapAngles(){return Object.keys($C.SNAP_ANGLES)}calculateFramingDistance(A,I,i=.05){const C=this.activeCamera.camera,l=b.MathUtils.degToRad(C.fov),w=this.schematicRenderer.canvas.width/this.schematicRenderer.canvas.height,Z=Math.tan(l/2),M=1+i*2,e=I.getSize(new b.Vector3).clone().multiplyScalar(.5),t=new b.Vector3(0,1,0),j=new b.Vector3().crossVectors(t,A).normalize();j.lengthSq()<.001&&j.set(1,0,0);const n=new b.Vector3().crossVectors(A,j).normalize(),D=[new b.Vector3(e.x,e.y,e.z),new b.Vector3(e.x,e.y,-e.z),new b.Vector3(e.x,-e.y,e.z),new b.Vector3(e.x,-e.y,-e.z),new b.Vector3(-e.x,e.y,e.z),new b.Vector3(-e.x,e.y,-e.z),new b.Vector3(-e.x,-e.y,e.z),new b.Vector3(-e.x,-e.y,-e.z)];let d=0,c=0;for(const o of D)d=Math.max(d,Math.abs(o.dot(j))),c=Math.max(c,Math.abs(o.dot(n)));d*=M,c*=M;const J=d/(Z*w),L=c/Z;return Math.max(J,L)}}N.UniformsLib.line={worldUnits:{value:1},linewidth:{value:1},resolution:{value:new N.Vector2(1,1)},dashOffset:{value:0},dashScale:{value:1},dashSize:{value:1},gapSize:{value:1}},N.ShaderLib.line={uniforms:N.UniformsUtils.merge([N.UniformsLib.common,N.UniformsLib.fog,N.UniformsLib.line]),vertexShader:`
14
14
  #include <common>
15
15
  #include <color_pars_vertex>
16
16
  #include <fog_pars_vertex>
@@ -410,7 +410,7 @@ ${i||"(no log captured)"}`);return console.error(l.message),l}cleanup(){if(this.
410
410
  `,t=function(O,B,X){B=B||1024;let Y=O.pos,S=-1,T=0,p="",eA=String.fromCharCode.apply(null,new Uint16Array(O.subarray(Y,Y+128)));for(;0>(S=eA.indexOf(e))&&T<B&&Y<O.byteLength;)p+=eA,T+=eA.length,Y+=128,eA=String.fromCharCode.apply(null,new Uint16Array(O.subarray(Y,Y+128)));return-1<S?(X!==!1&&(O.pos+=T+S+1),p+eA.slice(0,S)):!1},j=function(O){const B=/^#\?(\S+)/,X=/^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/,v=/^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/,Y=/^\s*FORMAT=(\S+)\s*$/,S=/^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/,T={valid:0,string:"",comments:"",programtype:"RGBE",format:"",gamma:1,exposure:1,width:0,height:0};let p,eA;for((O.pos>=O.byteLength||!(p=t(O)))&&w(1,"no header found"),(eA=p.match(B))||w(3,"bad initial token"),T.valid|=1,T.programtype=eA[1],T.string+=p+`
411
411
  `;p=t(O),p!==!1;){if(T.string+=p+`
412
412
  `,p.charAt(0)==="#"){T.comments+=p+`
413
- `;continue}if((eA=p.match(X))&&(T.gamma=parseFloat(eA[1])),(eA=p.match(v))&&(T.exposure=parseFloat(eA[1])),(eA=p.match(Y))&&(T.valid|=2,T.format=eA[1]),(eA=p.match(S))&&(T.valid|=4,T.height=parseInt(eA[1],10),T.width=parseInt(eA[2],10)),T.valid&2&&T.valid&4)break}return T.valid&2||w(3,"missing format specifier"),T.valid&4||w(3,"missing image size specifier"),T},n=function(O,B,X){const v=B;if(v<8||v>32767||O[0]!==2||O[1]!==2||O[2]&128)return new Uint8Array(O);v!==(O[2]<<8|O[3])&&w(3,"wrong scanline width");const Y=new Uint8Array(4*B*X);Y.length||w(4,"unable to allocate buffer space");let S=0,T=0;const p=4*v,eA=new Uint8Array(4),CA=new Uint8Array(p);let zA=X;for(;zA>0&&T<O.byteLength;){T+4>O.byteLength&&w(1),eA[0]=O[T++],eA[1]=O[T++],eA[2]=O[T++],eA[3]=O[T++],(eA[0]!=2||eA[1]!=2||(eA[2]<<8|eA[3])!=v)&&w(3,"bad rgbe scanline format");let mA=0,LA;for(;mA<p&&T<O.byteLength;){LA=O[T++];const $=LA>128;if($&&(LA-=128),(LA===0||mA+LA>p)&&w(3,"bad scanline data"),$){const cA=O[T++];for(let PA=0;PA<LA;PA++)CA[mA++]=cA}else CA.set(O.subarray(T,T+LA),mA),mA+=LA,T+=LA}const AA=v;for(let $=0;$<AA;$++){let cA=0;Y[S]=CA[$+cA],cA+=v,Y[S+1]=CA[$+cA],cA+=v,Y[S+2]=CA[$+cA],cA+=v,Y[S+3]=CA[$+cA],S+=4}zA--}return Y},D=function(O,B,X,v){const Y=O[B+3],S=Math.pow(2,Y-128)/255;X[v+0]=O[B+0]*S,X[v+1]=O[B+1]*S,X[v+2]=O[B+2]*S,X[v+3]=1},d=function(O,B,X,v){const Y=O[B+3],S=Math.pow(2,Y-128)/255;X[v+0]=N.DataUtils.toHalfFloat(Math.min(O[B+0]*S,65504)),X[v+1]=N.DataUtils.toHalfFloat(Math.min(O[B+1]*S,65504)),X[v+2]=N.DataUtils.toHalfFloat(Math.min(O[B+2]*S,65504)),X[v+3]=N.DataUtils.toHalfFloat(1)},c=new Uint8Array(A);c.pos=0;const J=j(c),L=J.width,o=J.height,Q=n(c.subarray(c.pos),L,o);let a,z,R;switch(this.type){case N.FloatType:R=Q.length/4;const O=new Float32Array(R*4);for(let X=0;X<R;X++)D(Q,X*4,O,X*4);a=O,z=N.FloatType;break;case N.HalfFloatType:R=Q.length/4;const B=new Uint16Array(R*4);for(let X=0;X<R;X++)d(Q,X*4,B,X*4);a=B,z=N.HalfFloatType;break;default:throw new Error("THREE.HDRLoader: Unsupported type: "+this.type)}return{width:L,height:o,data:a,header:J.string,gamma:J.gamma,exposure:J.exposure,type:z}}setDataType(A){return this.type=A,this}load(A,I,i,C){function l(w,Z){switch(w.type){case N.FloatType:case N.HalfFloatType:w.colorSpace=N.LinearSRGBColorSpace,w.minFilter=N.LinearFilter,w.magFilter=N.LinearFilter,w.generateMipmaps=!1,w.flipY=!0;break}I&&I(w,Z)}return super.load(A,l,i,C)}}class gh extends nh{constructor(A){console.warn("RGBELoader has been deprecated. Please use HDRLoader instead."),super(A)}}function Yb(s=2){const A=typeof window<"u"&&window.devicePixelRatio||1;return Math.min(A,Math.max(1,s))}let Nc=null,cc=null,Nj=null,Jc=null,rb=null,Lc=null,oc=null,ub=!1;async function Eb(){if(ub)return;const s=await Promise.resolve().then(()=>j5),A=await Promise.resolve().then(()=>L5),I=await Promise.resolve().then(()=>Q5);Nc=s.EffectComposer,cc=s.RenderPass,Nj=s.EffectPass,Jc=s.SMAAEffect,rb=A.N8AOPostPass,Lc=I.GammaCorrectionEffect,oc=(await Promise.resolve().then(()=>b5)).TiltShiftPlaneEffect,ub=!0}function hb(s){const A=Math.max(0,Math.min(1,s));return{focusRange:6-A*5.5,blurStrength:.005+A*.02}}const Dh="schematic-renderer-hdri-cache",de="hdri-textures",dh=1;let oD=null;async function pb(){return oD||new Promise((s,A)=>{const I=indexedDB.open(Dh,dh);I.onerror=()=>A(I.error),I.onsuccess=()=>{oD=I.result,s(oD)},I.onupgradeneeded=i=>{const C=i.target.result;C.objectStoreNames.contains(de)||C.createObjectStore(de,{keyPath:"url"})}})}async function Vh(s){try{const A=await pb();return new Promise(I=>{const l=A.transaction(de,"readonly").objectStore(de).get(s);l.onsuccess=()=>{l.result?(console.log(`[HDRI Cache] Cache hit for: ${s}`),I(l.result.data)):I(null)},l.onerror=()=>I(null)})}catch{return null}}async function Nh(s,A){try{const I=await pb();return new Promise(i=>{const C=I.transaction(de,"readwrite");C.objectStore(de).put({url:s,data:A,timestamp:Date.now()}),C.oncomplete=()=>{console.log(`[HDRI Cache] Cached: ${s}`),i()},C.onerror=()=>i()})}catch{}}let Sb=null,Uc=null;class ch{schematicRenderer;renderer;composer;_postProcessing=null;passes=new Map;eventEmitter;pmremGenerator;isRendering=!1;hdriPath=null;hdriBackgroundOnly=!0;currentEnvMap=null;disposed=!1;contextLost=!1;initialSizeSet=!1;get pixelRatio(){return Yb(this.schematicRenderer.options.maxPixelRatio)}resizeTimeout=null;usesSharedRenderer=!1;blitCtx=null;renderRequested=!1;_isWebGPU=!1;_webgpuInitialized=!1;inspector=null;originalBackground=null;isometricBackground;_alphaMode=!1;_opaqueComposer=null;_alphaComposer=null;_backgroundMode="hdri";_forceBackground=!1;_imageBackground=null;ssaoPresets={perspective:{aoRadius:1,distanceFalloff:.4,intensity:5},isometric:{aoRadius:.3,distanceFalloff:.1,intensity:.8}};constructor(A){this.schematicRenderer=A,this.eventEmitter=this.schematicRenderer.eventEmitter,this.isometricBackground=new b.Color(8900331);const I=A.options?.postProcessingOptions?.ssaoPresets;I&&(I.perspective&&(this.ssaoPresets.perspective={...this.ssaoPresets.perspective,...I.perspective}),I.isometric&&(this.ssaoPresets.isometric={...this.ssaoPresets.isometric,...I.isometric})),this.setInitialSize()}async initialize(){const A=this.schematicRenderer.options.webgpuOptions,I=A?.preferWebGPU??!1,i=A?.forceWebGPU??!1;if(I||i)if(await this.checkWebGPUSupport()||i)try{await this.initWebGPURenderer(),this._isWebGPU=!0,console.log("%c[RenderManager] WebGPU Renderer initialized","color: #4caf50; font-weight: bold")}catch(l){console.warn("[RenderManager] WebGPU initialization failed, falling back to WebGL:",l),await this.initWebGLRenderer()}else console.log("[RenderManager] WebGPU not available, using WebGL"),await this.initWebGLRenderer();else await this.initWebGLRenderer();this.setupEventListeners(),this.updateCanvasSize(),this.schematicRenderer.options?.hdri!==void 0&&this.schematicRenderer.options.hdri!==""&&(this._isWebGPU?(console.warn("[RenderManager] HDRI backgrounds are not yet supported in WebGPU mode. Using solid color with enhanced lighting."),this.schematicRenderer.sceneManager.scene.background=new b.Color(8900331),this.setupWebGPUEnvironment()):this.setupHDRIBackground(this.schematicRenderer.options.hdri)),this.schematicRenderer.cameraManager.on("cameraChanged",C=>{this.handleCameraChange(C.newCamera)})}async checkWebGPUSupport(){if(!navigator.gpu)return!1;try{const A=await navigator.gpu.requestAdapter();return A?((await A.requestDevice()).destroy(),!0):!1}catch(A){return console.warn("[RenderManager] WebGPU check failed:",A),!1}}get isWebGPU(){return this._isWebGPU}getInspector(){return this.inspector}setupWebGPUEnvironment(){const A=this.schematicRenderer.sceneManager.scene,I=this.schematicRenderer.sceneManager;if(I.lights){const w=I.lights,Z=w.get("ambientLight");Z&&(Z.intensity=3.5);const M=w.get("directionalLight");M&&(M.intensity=1.5)}const i=new b.HemisphereLight(8900331,6710886,2);i.name="webgpuHemiLight",A.add(i);const C=new b.DirectionalLight(16777215,.8);C.position.set(-15,15,15),C.name="webgpuFillLight",A.add(C);const l=new b.DirectionalLight(16777164,.4);l.position.set(0,-10,-20),l.name="webgpuBackLight",A.add(l),console.log("[RenderManager] WebGPU environment lighting configured")}setInitialSize(){const A=this.schematicRenderer.canvas,I=A.parentElement;if(!I){console.warn("Canvas parent element not found");return}const i=I.getBoundingClientRect(),C=i.width,l=i.height;A.style.width=`${C}px`,A.style.height=`${l}px`,A.width=C*this.pixelRatio,A.height=l*this.pixelRatio,this.initialSizeSet=!0}async initWebGPURenderer(){const A=await Promise.resolve().then(()=>nAA);Sb=A.WebGPURenderer,A.PostProcessing;try{Uc=(await Promise.resolve().then(()=>pAA)).Inspector}catch(I){console.warn("[RenderManager] Three.js Inspector not available:",I)}if(this.renderer=new Sb({canvas:this.schematicRenderer.canvas,antialias:!0,powerPreference:"high-performance"}),await this.renderer.init(),this.initialSizeSet){const I=this.schematicRenderer.canvas.parentElement;if(I){const i=I.clientWidth,C=I.clientHeight;this.renderer.setSize(i,C,!1)}}if(this.renderer.setPixelRatio(this.pixelRatio),Uc&&this.schematicRenderer.options.debugOptions?.enableInspector)try{this.inspector=new Uc,this.inspector.setRenderer(this.renderer),console.log("[RenderManager] Three.js Inspector initialized")}catch(I){console.warn("[RenderManager] Failed to initialize Inspector:",I)}this.composer=null,this._webgpuInitialized=!0,this.renderer.resetState(),this.pmremGenerator=new b.PMREMGenerator(this.renderer)}async initWebGLRenderer(){const A=this.schematicRenderer.options.context?.getSharedGLRenderer?.()??null;if(A?(this.renderer=A,this.usesSharedRenderer=!0,this.blitCtx=this.schematicRenderer.canvas.getContext("2d")):this.renderer=new b.WebGLRenderer({canvas:this.schematicRenderer.canvas,alpha:!0,antialias:!0,powerPreference:"high-performance",preserveDrawingBuffer:!0}),this.initialSizeSet&&!this.usesSharedRenderer){const I=this.schematicRenderer.canvas.parentElement;if(I){const i=I.clientWidth,C=I.clientHeight;this.renderer.setSize(i,C,!1)}}this.pmremGenerator=new b.PMREMGenerator(this.renderer),this.usesSharedRenderer||this.renderer.setPixelRatio(this.pixelRatio),await this.initComposer(),this.initDefaultPasses(this.schematicRenderer.options)}async initComposer(){if(this._isWebGPU)return;const A=this.schematicRenderer.options.postProcessingOptions;if(A&&A.enabled===!1||A&&A.enableSSAO===!1&&A.enableSMAA===!1&&A.enableGamma===!1)return;await Eb(),this.composer=new Nc(this.renderer);const I=new cc(this.schematicRenderer.sceneManager.scene,this.schematicRenderer.cameraManager.activeCamera.camera);this.composer.addPass(I),this.passes.set("renderPass",I)}handleCameraChange(A){const I=this.schematicRenderer.sceneManager.scene;A==="isometric"?(I.background&&I.background instanceof b.Texture&&(this.originalBackground=I.background),this._forceBackground||(I.background=this.isometricBackground),this.setSSAOParameters(this.ssaoPresets.isometric),console.log("Switched to isometric mode (background + SSAO adjusted)")):(this.originalBackground&&(I.background=this.originalBackground,console.log("Restored HDRI background")),this.setSSAOParameters(this.ssaoPresets.perspective),console.log("Switched to perspective mode (SSAO restored)"))}isOrthographicCamera(){return this.schematicRenderer.cameraManager.activeCamera.camera instanceof b.OrthographicCamera}setupHDRIBackground(A,I=!0){this.hdriPath=A,this.hdriBackgroundOnly=I,this.loadHDRI(A,I);const i=this.renderer.domElement;i.removeEventListener("webglcontextlost",this.handleContextLost),i.removeEventListener("webglcontextrestored",this.handleContextRestored),this._isWebGPU||(i.addEventListener("webglcontextlost",this.handleContextLost,!1),i.addEventListener("webglcontextrestored",this.handleContextRestored,!1))}isPMREMGeneratorDisposed(){return!this.pmremGenerator||this.pmremGenerator._blurMaterial===null}loadHDRI(A,I){this.loadHDRIWithCache(A,I)}async loadHDRIWithCache(A,I){const i=new gh;i.setDataType(b.HalfFloatType);const C=await Vh(A);if(C)try{const w=i.parse(C);if(w&&w.image&&w.image.width&&w.image.height){w.mapping=b.EquirectangularReflectionMapping,this.applyHDRITexture(w,I,A);return}else console.warn("[HDRI Cache] Cached texture missing required properties, fetching fresh")}catch(l){console.warn("[HDRI Cache] Failed to parse cached data, fetching fresh:",l)}i.load(A,l=>{l.mapping=b.EquirectangularReflectionMapping,this.applyHDRITexture(l,I,A),fetch(A).then(w=>w.arrayBuffer()).then(w=>Nh(A,w)).catch(()=>{})},void 0,l=>{console.error("HDRI loading failed:",l),this.eventEmitter.emit("hdriError",{error:l})})}applyHDRITexture(A,I,i){if(this.disposed){A.dispose();return}this.isPMREMGeneratorDisposed()&&(this.pmremGenerator=new b.PMREMGenerator(this.renderer));const C=this.pmremGenerator.fromEquirectangular(A).texture;if(this.currentEnvMap=C,I){const l=new b.WebGLCubeRenderTarget(1024).fromEquirectangularTexture(this.renderer,A);this.isOrthographicCamera()?(this.originalBackground=l.texture,this.schematicRenderer.sceneManager.scene.background=this.isometricBackground):(this.schematicRenderer.sceneManager.scene.background=l.texture,this.originalBackground=l.texture)}else this.schematicRenderer.sceneManager.scene.environment=C,this.isOrthographicCamera()?(this.originalBackground=C,this.schematicRenderer.sceneManager.scene.background=this.isometricBackground):(this.schematicRenderer.sceneManager.scene.background=C,this.originalBackground=C);A.dispose(),this.pmremGenerator.dispose(),this.eventEmitter.emit("hdriLoaded",{path:i})}setIsometricBackgroundColor(A){this.isometricBackground.set(A),this.isOrthographicCamera()&&(this.schematicRenderer.sceneManager.scene.background=this.isometricBackground)}getIsometricBackgroundColor(){return this.isometricBackground.clone()}handleContextLost=A=>{A.preventDefault(),this.contextLost=!0,this.isRendering=!1,console.log("WebGL context lost. Suspending render operations..."),this.eventEmitter.emit("webglContextLost")};handleContextRestored=async()=>{console.log("WebGL context restored. Reinitializing renderer...");try{await new Promise(A=>setTimeout(A,300)),this.contextLost=!1,await this.initWebGLRenderer(),this.updateCanvasSize(),this.hdriPath&&(await new Promise(A=>setTimeout(A,100)),this.loadHDRI(this.hdriPath,this.hdriBackgroundOnly)),this.eventEmitter.emit("webglContextRestored"),requestAnimationFrame(()=>{this.contextLost||this.render()})}catch(A){console.error("Error during context restoration:",A),this.eventEmitter.emit("webglContextError",{error:A})}};initDefaultPasses(A){if(this._isWebGPU||!this.composer)return;const I=this.schematicRenderer.options.postProcessingOptions,i=[];if(I?.enableGamma!==!1){const l=new Lc(A.gamma??.5);this.passes.set("gammaCorrection",l),i.push(l)}if(I?.enableSMAA!==!1){const l=new Jc;this.passes.set("smaa",l),i.push(l)}if(I?.enableSSAO!==!1)try{const l=this.schematicRenderer.canvas.parentElement,w=l?l.clientWidth:window.innerWidth,Z=l?l.clientHeight:window.innerHeight,M=new rb(this.schematicRenderer.sceneManager.scene,this.schematicRenderer.cameraManager.activeCamera.camera,w,Z);M.configuration.aoRadius=1,M.configuration.distanceFalloff=.4,M.configuration.intensity=5,M.configuration.gammaCorrection=!1,M.setQualityMode("Medium"),this.passes.set("ssao",M),this.composer.addPass(M)}catch(l){console.warn("Failed to initialize N8AO SSAO:",l)}let C=null;if(i.length>0&&(C=new Nj(this.schematicRenderer.cameraManager.activeCamera.camera,...i),this.composer.addPass(C),this.passes.set("effectPass",C)),C)C.renderToScreen=!0;else if(this.composer.passes.length>1){const l=this.composer.passes[this.composer.passes.length-1];l&&(l.renderToScreen=!0)}else this.composer=null;I?.enableTiltShift===!0&&this.setTiltShiftEnabled(!0)}setupEventListeners(){window.addEventListener("resize",()=>{this.resizeTimeout&&window.cancelAnimationFrame(this.resizeTimeout),this.resizeTimeout=window.requestAnimationFrame(()=>{this.updateCanvasSize(),this.resizeTimeout=null})})}updateCanvasSize(){const A=this.schematicRenderer.canvas,I=A.parentElement;if(!I)return;const i=I.clientWidth,C=I.clientHeight;if(A.style.width=`${i}px`,A.style.height=`${C}px`,this.usesSharedRenderer){const l=this.pixelRatio;A.width=Math.max(1,Math.floor(i*l)),A.height=Math.max(1,Math.floor(C*l)),this.schematicRenderer.cameraManager.updateAspectRatio(i/C)}else if(!this.contextLost){this.renderer.setSize(i,C,!1),this.composer&&this.composer.setSize(i,C);const l=this.schematicRenderer.cameraManager.activeCamera.camera;l.aspect=i/C,l.updateProjectionMatrix();const w=this.passes.get("ssao");if(w&&w.setSize){const Z=this.renderer.getPixelRatio();w.setSize(i*Z,C*Z)}}this.schematicRenderer.invalidate()}enableEffect(A){const I=this.passes.get(A);I&&(I.enabled=!0)}disableEffect(A){const I=this.passes.get(A);I&&(I.enabled=!1)}setGamma(A){const I=this.passes.get("gammaCorrection");I&&I.setGamma(A)}_pendingTiltShiftAmount=null;setTiltShiftAmount(A){const I=this.passes.get("tiltShift");if(!I){this._pendingTiltShiftAmount=A;return}const i=hb(A);I.setFocusRange?.(i.focusRange),I.setBlurStrength?.(i.blurStrength),this.updateTiltShiftGizmo()}updateTiltShiftGizmo(){if(!this.tiltShiftGizmo)return;const A=this.passes.get("tiltShift");if(!A?.uniforms)return;const I=A.uniforms.get("focusPoint")?.value,i=A.uniforms.get("focusNormal")?.value,C=A.uniforms.get("focusRange")?.value;!I||!i||C==null||this.tiltShiftGizmo.update(I,i,C)}setTiltShiftGizmoVisible(A){this.tiltShiftGizmoVisible=A,this.tiltShiftGizmo?.setVisible(A)}setTiltShiftFocusPoint(A){this.passes.get("tiltShift")?.setFocusPoint?.(A),this.updateTiltShiftGizmo()}setTiltShiftTilt(A,I){this.passes.get("tiltShift")?.setTiltAngles?.(A,I),this._pendingTiltPitch=A,this._pendingTiltYaw=I,this.updateTiltShiftGizmo()}_pendingTiltPitch=0;_pendingTiltYaw=0;tiltShiftGizmo=null;tiltShiftGizmoVisible=!0;_focusPickRaycaster=null;pickTiltShiftFocus(){const A=this.schematicRenderer.canvas,I=A.style.cursor;A.style.cursor="crosshair";const i=w=>{w.stopPropagation(),w.preventDefault(),l(),this.focusTiltShiftOnScreenPoint(w.clientX,w.clientY)},C=w=>{w.key==="Escape"&&l()},l=()=>{A.style.cursor=I,A.removeEventListener("click",i,!0),window.removeEventListener("keydown",C)};A.addEventListener("click",i,!0),window.addEventListener("keydown",C)}focusTiltShiftOnScreenPoint(A,I){const i=this.schematicRenderer.canvas,C=this.schematicRenderer.cameraManager?.activeCamera?.camera;if(!C)return;const l=i.getBoundingClientRect(),w=new b.Vector2((A-l.left)/l.width*2-1,-((I-l.top)/l.height*2-1));this._focusPickRaycaster||(this._focusPickRaycaster=new b.Raycaster),this._focusPickRaycaster.setFromCamera(w,C);const Z=[],M=this.schematicRenderer.schematicManager?.getAllSchematics?.()??[];for(const e of M)e.group&&Z.push(e.group);if(Z.length===0)return;const m=this._focusPickRaycaster.intersectObjects(Z,!0);m.length!==0&&this.setTiltShiftFocusPoint(m[0].point)}computeSubjectWorldPosition(){const I=this.schematicRenderer.schematicManager?.getFirstSchematic?.();if(I?.group){const C=new b.Vector3;return I.group.getWorldPosition(C),C}return this.schematicRenderer.cameraManager?.activeCamera?.camera?.userData?.target??new b.Vector3}setTiltShiftEnabled(A){if(!this.composer||!oc||!Nj)return;let I=this.passes.get("tiltShiftPass");const i=this.passes.get("effectPass");if(A&&!I){const C=this._pendingTiltShiftAmount??.5,l=hb(C),w=this.schematicRenderer.cameraManager.activeCamera.camera,Z=this.computeSubjectWorldPosition(),M=new oc(w,{focusPoint:Z,focusRange:l.focusRange,blurStrength:l.blurStrength});M.setTiltAngles(this._pendingTiltPitch,this._pendingTiltYaw),I=new Nj(w,M),this.passes.set("tiltShift",M),this.passes.set("tiltShiftPass",I),this.composer.addPass(I);const m=this.schematicRenderer.canvas.parentElement,e=m?m.clientWidth:window.innerWidth,t=m?m.clientHeight:window.innerHeight;this.composer.setSize?.(e,t),this.ensureTiltShiftGizmo()}I&&(I.enabled=A,i&&(i.renderToScreen=!A),I.renderToScreen=A,this.tiltShiftGizmo?.setVisible(A&&this.tiltShiftGizmoVisible),A&&this.updateTiltShiftGizmo())}async ensureTiltShiftGizmo(){if(this.tiltShiftGizmo)return;const{TiltShiftGizmo:A}=await Promise.resolve().then(()=>GAA),I=this.schematicRenderer.sceneManager?.scene;I&&(this.tiltShiftGizmo=new A(I),this.tiltShiftGizmo.setVisible(this.tiltShiftGizmoVisible),this.updateTiltShiftGizmo())}setSSAOEnabled(A){const I=this.passes.get("ssao");I&&(I.enabled=A,A||console.log("[RenderManager] SSAO disabled for performance"))}isSSAOEnabled(){return this.passes.get("ssao")?.enabled??!1}setSSAOParameters(A){const I=this.passes.get("ssao");I&&I.configuration&&(A.aoRadius!==void 0&&(I.configuration.aoRadius=A.aoRadius),A.distanceFalloff!==void 0&&(I.configuration.distanceFalloff=A.distanceFalloff),A.intensity!==void 0&&(I.configuration.intensity=A.intensity),A.qualityMode!==void 0&&I.setQualityMode(A.qualityMode))}setSSAOPreset(A,I){this.ssaoPresets[A]={...this.ssaoPresets[A],...I},(this.isOrthographicCamera()?"isometric":"perspective")===A&&this.setSSAOParameters(this.ssaoPresets[A]),console.log(`SSAO preset updated for ${A} mode:`,this.ssaoPresets[A])}getSSAOPresets(){return{perspective:{...this.ssaoPresets.perspective},isometric:{...this.ssaoPresets.isometric}}}renderSingleFrameAndGetStats(){if(this.isRendering||this.contextLost||this.disposed)return console.warn("[RenderManager] Attempted renderSingleFrameAndGetStats while busy, context lost, or disposed."),{renderTimeMs:0,rendererInfo:null};const A=this.schematicRenderer.sceneManager.scene,I=this.schematicRenderer.cameraManager.activeCamera.camera,i=this.renderer;if(!i||!A||!I)return console.error("[RenderManager] Renderer, scene, or camera not available for renderSingleFrameAndGetStats."),{renderTimeMs:0,rendererInfo:i?i.info:null};if(!this._isWebGPU){const w=i.getContext();if(!w||w.isContextLost())return console.warn("[RenderManager] Attempted to render with lost WebGL context for stats."),this.contextLost=!0,{renderTimeMs:0,rendererInfo:i.info}}const C=performance.now();try{this.isRendering=!0,this._isWebGPU?this.renderer.render(A,I):this.composer?this.composer.render():this.renderer.render(A,I)}catch(w){return console.error("[RenderManager] Error during renderSingleFrameAndGetStats:",w),this.eventEmitter.emit("renderError",{error:w}),{renderTimeMs:performance.now()-C,rendererInfo:i.info}}finally{this.isRendering=!1}return{renderTimeMs:performance.now()-C,rendererInfo:i.info}}renderSharedAndBlit(){const A=this.schematicRenderer.canvas,I=A.clientWidth,i=A.clientHeight;if(I===0||i===0||!this.blitCtx)return;const C=this.pixelRatio,l=Math.max(1,Math.floor(I*C)),w=Math.max(1,Math.floor(i*C));(A.width!==l||A.height!==w)&&(A.width=l,A.height=w,this.schematicRenderer.cameraManager.updateAspectRatio(I/i)),this.renderer.setSize(I,i,!1),this.composer?(this.composer.setSize(I,i),this.composer.render()):this.renderer.render(this.schematicRenderer.sceneManager.scene,this.schematicRenderer.cameraManager.activeCamera.camera),this.blitCtx.clearRect(0,0,l,w),this.blitCtx.drawImage(this.renderer.domElement,0,0,l,w)}render(){if(!(this.isRendering||this.contextLost||this.disposed))try{if(this.isRendering=!0,!this._isWebGPU){const A=this.renderer.getContext();if(!A||A.isContextLost()){console.warn("Attempted to render with lost WebGL context"),this.contextLost=!0;return}}if(this._isWebGPU){const A=this.schematicRenderer.sceneManager.scene,I=this.schematicRenderer.cameraManager.activeCamera.camera;this.renderer.render(A,I),this.renderer.resolveTimestampsAsync&&this.renderer.resolveTimestampsAsync("render").catch(()=>{})}else this.usesSharedRenderer?this.renderSharedAndBlit():this.composer?this.composer.render():this.renderer.render(this.schematicRenderer.sceneManager.scene,this.schematicRenderer.cameraManager.activeCamera.camera)}catch(A){console.error("Render error:",A),this.eventEmitter.emit("renderError",{error:A})}finally{this.isRendering=!1}}requestRender(){!this.renderRequested&&!this.contextLost&&!this.disposed&&(this.renderRequested=!0,requestAnimationFrame(()=>{!this.contextLost&&!this.disposed&&this.render(),this.renderRequested=!1}))}resize(A,I){if(this.contextLost)return;this.renderer.setSize(A,I,!1),this.composer&&this.composer.setSize(A,I);const i=this.schematicRenderer.cameraManager.activeCamera.camera;i.aspect=A/I,i.updateProjectionMatrix();const C=this.passes.get("ssao");C&&C.setSize&&C.setSize(A,I)}updateCamera(A){const I=this.passes.get("renderPass");I&&(I.camera=A);const i=this.passes.get("effectPass");i&&(i.camera=A);const C=this.passes.get("ssao");C&&C.camera&&(C.camera=A)}getRenderer(){return this.renderer}getEffect(A){return this.passes.get(A)}dispose(){this.disposed=!0,this.contextLost=!0,this.resizeTimeout!==null&&(window.cancelAnimationFrame(this.resizeTimeout),this.resizeTimeout=null),window.removeEventListener("resize",this.updateCanvasSize);const A=this.renderer.domElement;A.removeEventListener("webglcontextlost",this.handleContextLost),A.removeEventListener("webglcontextrestored",this.handleContextRestored),this.passes.forEach(I=>{I.dispose&&I.dispose()}),this.passes.clear(),this.composer&&this.composer.dispose(),this.pmremGenerator&&!this.isPMREMGeneratorDisposed()&&this.pmremGenerator.dispose(),this.currentEnvMap&&this.currentEnvMap.dispose(),this.inspector&&(this.inspector=null),this.usesSharedRenderer||this.renderer.dispose()}async setAlphaMode(A){if(this._alphaMode!==A)if(this._alphaMode=A,A){this.composer&&!this._opaqueComposer&&(this._opaqueComposer=this.composer),await Eb();const I=this.renderer,i=this.schematicRenderer.cameraManager.activeCamera.camera,C=this.schematicRenderer.sceneManager.scene,l=this.schematicRenderer.options.gamma??.5,w=new Nc(I,{alpha:!0}),Z=new cc(C,i);w.addPass(Z);const M=[];M.push(new Lc(l));try{M.push(new Jc)}catch{}if(M.length>0){const m=new Nj(i,...M);m.renderToScreen=!0,w.addPass(m)}if(this._alphaComposer)try{this._alphaComposer.dispose()}catch{}this._alphaComposer=w,this.composer=w,I.setClearColor(0,0)}else{if(this._alphaComposer&&this.composer===this._alphaComposer){try{this._alphaComposer.dispose()}catch{}this._alphaComposer=null}this._opaqueComposer&&(this.composer=this._opaqueComposer),this.renderer.setClearColor(0,1)}}isAlphaMode(){return this._alphaMode}async setBackgroundMode(A,I={}){this._backgroundMode=A,this._forceBackground=I.force??!1;const i=this.schematicRenderer.sceneManager.scene;switch(A){case"hdri":await this.setAlphaMode(!1),I.hdriPath&&this.setupHDRIBackground(I.hdriPath,I.hdriBackgroundOnly??!0),this._forceBackground&&this.isOrthographicCamera()&&this.originalBackground&&(i.background=this.originalBackground);break;case"solid":{await this.setAlphaMode(!1);const C=new b.Color(I.color??2236962);i.background=C,this.renderer.setClearColor(C,1);break}case"transparent":await this.setAlphaMode(!0),i.background=null,i.environment=null;break;case"image":await this.setAlphaMode(!1),I.imageTexture&&(this._imageBackground&&this._imageBackground.dispose(),this._imageBackground=I.imageTexture),this._imageBackground&&(i.background=this._imageBackground),this.renderer.setClearColor(0,1);break}}getBackgroundMode(){return this._backgroundMode}}var Qc=(s=>(s.SCHEMATIC="schematic",s.RESOURCE_PACK="resourcePack",s.UNKNOWN="unknown",s))(Qc||{});class Gb{static SCHEMATIC_EXTENSIONS=[".schem",".litematic",".nbt",".schematic",".mcstructure"];static RESOURCE_PACK_EXTENSIONS=[".zip",".mcpack"];static determineFileType(A){const I=this.getFileExtension(A.name).toLowerCase();return this.SCHEMATIC_EXTENSIONS.includes(I)?"schematic":this.RESOURCE_PACK_EXTENSIONS.includes(I)?"resourcePack":"unknown"}static getFileExtension(A){const I=A.lastIndexOf(".");return I===-1?"":A.substring(I)}static isSchematic(A){return this.determineFileType(A)==="schematic"}static isResourcePack(A){return this.determineFileType(A)==="resourcePack"}static async validateResourcePack(A){return this.isResourcePack(A)}}class Jh{renderer;options;canvas;uiManager;constructor(A,I){this.renderer=A,this.options=I,this.canvas=this.renderer.canvas,this.uiManager=this.renderer.uiManager,this.initialize()}initialize(){this.canvas.addEventListener("dragover",this.onDragOver),this.canvas.addEventListener("dragleave",this.onDragLeave),this.canvas.addEventListener("drop",this.onDrop)}onDragOver=A=>{A.preventDefault(),this.uiManager.showOverlay(),this.uiManager.emptyStateOverlay.style.border="4px dashed #00ff00";const I=this.uiManager.emptyStateOverlay.getElementsByClassName("uploadOverlayContent").item(0);I.style.transform="translate(-50%, -50%) scale(1.1)",this.renderer.options.enableDragAndDrop&&this.uiManager.showEmptyState()};onDragLeave=A=>{A.preventDefault(),this.uiManager.hideOverlay(),this.uiManager.emptyStateOverlay.style.border="none";const I=this.uiManager.emptyStateOverlay.getElementsByClassName("uploadOverlayContent").item(0);I.style.transform="translate(-50%, -50%) scale(1)",this.renderer.schematicManager?.isEmpty()||this.uiManager.hideEmptyState()};onDrop=async A=>{A.preventDefault(),this.uiManager.hideOverlay(),this.canvas.style.border="none",console.log("Draged file detected"),this.uiManager.hideEmptyState();const I=A.dataTransfer?.files;if(console.log("Files dropped:",I),I&&I.length>0){let i=0;for(const C of I){const l=performance.now(),w=Gb.determineFileType(C);if(console.log("File type determined in",performance.now()-l,"ms"),w===Qc.SCHEMATIC&&this.isAcceptedFileType(C)){const Z=performance.now();await this.handleSchematicDrop(C),i++,console.log("Schematic drop handled in",performance.now()-Z,"ms")}else if(w===Qc.RESOURCE_PACK)await this.handleResourcePackDrop(C);else{const Z=C.name.split(".").pop()?.toLowerCase()||"unknown",M=this.options.acceptedFileTypes?.length?this.options.acceptedFileTypes.join(", "):"schem, litematic, nbt, schematic, mcstructure";this.uiManager.showMessage(`Unsupported file type: .${Z}
413
+ `;continue}if((eA=p.match(X))&&(T.gamma=parseFloat(eA[1])),(eA=p.match(v))&&(T.exposure=parseFloat(eA[1])),(eA=p.match(Y))&&(T.valid|=2,T.format=eA[1]),(eA=p.match(S))&&(T.valid|=4,T.height=parseInt(eA[1],10),T.width=parseInt(eA[2],10)),T.valid&2&&T.valid&4)break}return T.valid&2||w(3,"missing format specifier"),T.valid&4||w(3,"missing image size specifier"),T},n=function(O,B,X){const v=B;if(v<8||v>32767||O[0]!==2||O[1]!==2||O[2]&128)return new Uint8Array(O);v!==(O[2]<<8|O[3])&&w(3,"wrong scanline width");const Y=new Uint8Array(4*B*X);Y.length||w(4,"unable to allocate buffer space");let S=0,T=0;const p=4*v,eA=new Uint8Array(4),CA=new Uint8Array(p);let zA=X;for(;zA>0&&T<O.byteLength;){T+4>O.byteLength&&w(1),eA[0]=O[T++],eA[1]=O[T++],eA[2]=O[T++],eA[3]=O[T++],(eA[0]!=2||eA[1]!=2||(eA[2]<<8|eA[3])!=v)&&w(3,"bad rgbe scanline format");let mA=0,LA;for(;mA<p&&T<O.byteLength;){LA=O[T++];const $=LA>128;if($&&(LA-=128),(LA===0||mA+LA>p)&&w(3,"bad scanline data"),$){const cA=O[T++];for(let PA=0;PA<LA;PA++)CA[mA++]=cA}else CA.set(O.subarray(T,T+LA),mA),mA+=LA,T+=LA}const AA=v;for(let $=0;$<AA;$++){let cA=0;Y[S]=CA[$+cA],cA+=v,Y[S+1]=CA[$+cA],cA+=v,Y[S+2]=CA[$+cA],cA+=v,Y[S+3]=CA[$+cA],S+=4}zA--}return Y},D=function(O,B,X,v){const Y=O[B+3],S=Math.pow(2,Y-128)/255;X[v+0]=O[B+0]*S,X[v+1]=O[B+1]*S,X[v+2]=O[B+2]*S,X[v+3]=1},d=function(O,B,X,v){const Y=O[B+3],S=Math.pow(2,Y-128)/255;X[v+0]=N.DataUtils.toHalfFloat(Math.min(O[B+0]*S,65504)),X[v+1]=N.DataUtils.toHalfFloat(Math.min(O[B+1]*S,65504)),X[v+2]=N.DataUtils.toHalfFloat(Math.min(O[B+2]*S,65504)),X[v+3]=N.DataUtils.toHalfFloat(1)},c=new Uint8Array(A);c.pos=0;const J=j(c),L=J.width,o=J.height,Q=n(c.subarray(c.pos),L,o);let a,z,R;switch(this.type){case N.FloatType:R=Q.length/4;const O=new Float32Array(R*4);for(let X=0;X<R;X++)D(Q,X*4,O,X*4);a=O,z=N.FloatType;break;case N.HalfFloatType:R=Q.length/4;const B=new Uint16Array(R*4);for(let X=0;X<R;X++)d(Q,X*4,B,X*4);a=B,z=N.HalfFloatType;break;default:throw new Error("THREE.HDRLoader: Unsupported type: "+this.type)}return{width:L,height:o,data:a,header:J.string,gamma:J.gamma,exposure:J.exposure,type:z}}setDataType(A){return this.type=A,this}load(A,I,i,C){function l(w,Z){switch(w.type){case N.FloatType:case N.HalfFloatType:w.colorSpace=N.LinearSRGBColorSpace,w.minFilter=N.LinearFilter,w.magFilter=N.LinearFilter,w.generateMipmaps=!1,w.flipY=!0;break}I&&I(w,Z)}return super.load(A,l,i,C)}}class gh extends nh{constructor(A){console.warn("RGBELoader has been deprecated. Please use HDRLoader instead."),super(A)}}function Yb(s=2){const A=typeof window<"u"&&window.devicePixelRatio||1;return Math.min(A,Math.max(1,s))}let Nc=null,cc=null,Nj=null,Jc=null,rb=null,Lc=null,oc=null,ub=!1;async function Eb(){if(ub)return;const s=await Promise.resolve().then(()=>j5),A=await Promise.resolve().then(()=>L5),I=await Promise.resolve().then(()=>Q5);Nc=s.EffectComposer,cc=s.RenderPass,Nj=s.EffectPass,Jc=s.SMAAEffect,rb=A.N8AOPostPass,Lc=I.GammaCorrectionEffect,oc=(await Promise.resolve().then(()=>b5)).TiltShiftPlaneEffect,ub=!0}function hb(s){const A=Math.max(0,Math.min(1,s));return{focusRange:6-A*5.5,blurStrength:.005+A*.02}}const Dh="schematic-renderer-hdri-cache",de="hdri-textures",dh=1;let oD=null;async function pb(){return oD||new Promise((s,A)=>{const I=indexedDB.open(Dh,dh);I.onerror=()=>A(I.error),I.onsuccess=()=>{oD=I.result,s(oD)},I.onupgradeneeded=i=>{const C=i.target.result;C.objectStoreNames.contains(de)||C.createObjectStore(de,{keyPath:"url"})}})}async function Vh(s){try{const A=await pb();return new Promise(I=>{const l=A.transaction(de,"readonly").objectStore(de).get(s);l.onsuccess=()=>{l.result?(console.log(`[HDRI Cache] Cache hit for: ${s}`),I(l.result.data)):I(null)},l.onerror=()=>I(null)})}catch{return null}}async function Nh(s,A){try{const I=await pb();return new Promise(i=>{const C=I.transaction(de,"readwrite");C.objectStore(de).put({url:s,data:A,timestamp:Date.now()}),C.oncomplete=()=>{console.log(`[HDRI Cache] Cached: ${s}`),i()},C.onerror=()=>i()})}catch{}}let Sb=null,Uc=null;class ch{schematicRenderer;renderer;composer;_postProcessing=null;passes=new Map;eventEmitter;pmremGenerator;isRendering=!1;hdriPath=null;hdriBackgroundOnly=!0;currentEnvMap=null;disposed=!1;contextLost=!1;initialSizeSet=!1;get pixelRatio(){return Yb(this.schematicRenderer.options.maxPixelRatio)}resizeTimeout=null;usesSharedRenderer=!1;blitCtx=null;renderRequested=!1;_isWebGPU=!1;_webgpuInitialized=!1;inspector=null;originalBackground=null;isometricBackground;_alphaMode=!1;_opaqueComposer=null;_alphaComposer=null;_backgroundMode="hdri";_forceBackground=!1;_imageBackground=null;ssaoPresets={perspective:{aoRadius:1,distanceFalloff:.4,intensity:5},isometric:{aoRadius:.3,distanceFalloff:.1,intensity:.8}};constructor(A){this.schematicRenderer=A,this.eventEmitter=this.schematicRenderer.eventEmitter,this.isometricBackground=new b.Color(8300799);const I=A.options?.postProcessingOptions?.ssaoPresets;I&&(I.perspective&&(this.ssaoPresets.perspective={...this.ssaoPresets.perspective,...I.perspective}),I.isometric&&(this.ssaoPresets.isometric={...this.ssaoPresets.isometric,...I.isometric})),this.setInitialSize()}async initialize(){const A=this.schematicRenderer.options.webgpuOptions,I=A?.preferWebGPU??!1,i=A?.forceWebGPU??!1;if(I||i)if(await this.checkWebGPUSupport()||i)try{await this.initWebGPURenderer(),this._isWebGPU=!0,console.log("%c[RenderManager] WebGPU Renderer initialized","color: #4caf50; font-weight: bold")}catch(l){console.warn("[RenderManager] WebGPU initialization failed, falling back to WebGL:",l),await this.initWebGLRenderer()}else console.log("[RenderManager] WebGPU not available, using WebGL"),await this.initWebGLRenderer();else await this.initWebGLRenderer();this.setupEventListeners(),this.updateCanvasSize(),this.schematicRenderer.options?.hdri!==void 0&&this.schematicRenderer.options.hdri!==""&&(this._isWebGPU?(console.warn("[RenderManager] HDRI backgrounds are not yet supported in WebGPU mode. Using solid color with enhanced lighting."),this.schematicRenderer.sceneManager.scene.background=new b.Color(8900331),this.setupWebGPUEnvironment()):this.setupHDRIBackground(this.schematicRenderer.options.hdri)),this.schematicRenderer.cameraManager.on("cameraChanged",C=>{this.handleCameraChange(C.newCamera)})}async checkWebGPUSupport(){if(!navigator.gpu)return!1;try{const A=await navigator.gpu.requestAdapter();return A?((await A.requestDevice()).destroy(),!0):!1}catch(A){return console.warn("[RenderManager] WebGPU check failed:",A),!1}}get isWebGPU(){return this._isWebGPU}getInspector(){return this.inspector}setupWebGPUEnvironment(){const A=this.schematicRenderer.sceneManager.scene,I=this.schematicRenderer.sceneManager;if(I.lights){const w=I.lights,Z=w.get("ambientLight");Z&&(Z.intensity=3.5);const M=w.get("directionalLight");M&&(M.intensity=1.5)}const i=new b.HemisphereLight(8900331,6710886,2);i.name="webgpuHemiLight",A.add(i);const C=new b.DirectionalLight(16777215,.8);C.position.set(-15,15,15),C.name="webgpuFillLight",A.add(C);const l=new b.DirectionalLight(16777164,.4);l.position.set(0,-10,-20),l.name="webgpuBackLight",A.add(l),console.log("[RenderManager] WebGPU environment lighting configured")}setInitialSize(){const A=this.schematicRenderer.canvas,I=A.parentElement;if(!I){console.warn("Canvas parent element not found");return}const i=I.getBoundingClientRect(),C=i.width,l=i.height;A.style.width=`${C}px`,A.style.height=`${l}px`,A.width=C*this.pixelRatio,A.height=l*this.pixelRatio,this.initialSizeSet=!0}async initWebGPURenderer(){const A=await Promise.resolve().then(()=>nAA);Sb=A.WebGPURenderer,A.PostProcessing;try{Uc=(await Promise.resolve().then(()=>pAA)).Inspector}catch(I){console.warn("[RenderManager] Three.js Inspector not available:",I)}if(this.renderer=new Sb({canvas:this.schematicRenderer.canvas,antialias:!0,powerPreference:"high-performance"}),await this.renderer.init(),this.initialSizeSet){const I=this.schematicRenderer.canvas.parentElement;if(I){const i=I.clientWidth,C=I.clientHeight;this.renderer.setSize(i,C,!1)}}if(this.renderer.setPixelRatio(this.pixelRatio),Uc&&this.schematicRenderer.options.debugOptions?.enableInspector)try{this.inspector=new Uc,this.inspector.setRenderer(this.renderer),console.log("[RenderManager] Three.js Inspector initialized")}catch(I){console.warn("[RenderManager] Failed to initialize Inspector:",I)}this.composer=null,this._webgpuInitialized=!0,this.renderer.resetState(),this.pmremGenerator=new b.PMREMGenerator(this.renderer)}async initWebGLRenderer(){const A=this.schematicRenderer.options.context?.getSharedGLRenderer?.()??null;if(A?(this.renderer=A,this.usesSharedRenderer=!0,this.blitCtx=this.schematicRenderer.canvas.getContext("2d")):this.renderer=new b.WebGLRenderer({canvas:this.schematicRenderer.canvas,alpha:!0,antialias:!0,powerPreference:"high-performance",preserveDrawingBuffer:!0}),this.initialSizeSet&&!this.usesSharedRenderer){const I=this.schematicRenderer.canvas.parentElement;if(I){const i=I.clientWidth,C=I.clientHeight;this.renderer.setSize(i,C,!1)}}this.pmremGenerator=new b.PMREMGenerator(this.renderer),this.usesSharedRenderer||this.renderer.setPixelRatio(this.pixelRatio),await this.initComposer(),this.initDefaultPasses(this.schematicRenderer.options)}async initComposer(){if(this._isWebGPU)return;const A=this.schematicRenderer.options.postProcessingOptions;if(A&&A.enabled===!1||A&&A.enableSSAO===!1&&A.enableSMAA===!1&&A.enableGamma===!1)return;await Eb(),this.composer=new Nc(this.renderer);const I=new cc(this.schematicRenderer.sceneManager.scene,this.schematicRenderer.cameraManager.activeCamera.camera);this.composer.addPass(I),this.passes.set("renderPass",I)}handleCameraChange(A){const I=this.schematicRenderer.sceneManager.scene;A==="isometric"?(I.background&&I.background instanceof b.Texture&&(this.originalBackground=I.background),this._forceBackground||(I.background=this.isometricBackground),this.setSSAOParameters(this.ssaoPresets.isometric),console.log("Switched to isometric mode (background + SSAO adjusted)")):(this.originalBackground&&(I.background=this.originalBackground,console.log("Restored HDRI background")),this.setSSAOParameters(this.ssaoPresets.perspective),console.log("Switched to perspective mode (SSAO restored)"))}isOrthographicCamera(){return this.schematicRenderer.cameraManager.activeCamera.camera instanceof b.OrthographicCamera}setupHDRIBackground(A,I=!0){this.hdriPath=A,this.hdriBackgroundOnly=I,this.loadHDRI(A,I);const i=this.renderer.domElement;i.removeEventListener("webglcontextlost",this.handleContextLost),i.removeEventListener("webglcontextrestored",this.handleContextRestored),this._isWebGPU||(i.addEventListener("webglcontextlost",this.handleContextLost,!1),i.addEventListener("webglcontextrestored",this.handleContextRestored,!1))}isPMREMGeneratorDisposed(){return!this.pmremGenerator||this.pmremGenerator._blurMaterial===null}loadHDRI(A,I){this.loadHDRIWithCache(A,I)}async loadHDRIWithCache(A,I){const i=new gh;i.setDataType(b.HalfFloatType);const C=await Vh(A);if(C)try{const w=i.parse(C);if(w&&w.image&&w.image.width&&w.image.height){w.mapping=b.EquirectangularReflectionMapping,this.applyHDRITexture(w,I,A);return}else console.warn("[HDRI Cache] Cached texture missing required properties, fetching fresh")}catch(l){console.warn("[HDRI Cache] Failed to parse cached data, fetching fresh:",l)}i.load(A,l=>{l.mapping=b.EquirectangularReflectionMapping,this.applyHDRITexture(l,I,A),fetch(A).then(w=>w.arrayBuffer()).then(w=>Nh(A,w)).catch(()=>{})},void 0,l=>{console.error("HDRI loading failed:",l),this.eventEmitter.emit("hdriError",{error:l})})}applyHDRITexture(A,I,i){if(this.disposed){A.dispose();return}this.isPMREMGeneratorDisposed()&&(this.pmremGenerator=new b.PMREMGenerator(this.renderer));const C=this.pmremGenerator.fromEquirectangular(A).texture;if(this.currentEnvMap=C,I){const l=new b.WebGLCubeRenderTarget(1024).fromEquirectangularTexture(this.renderer,A);this.isOrthographicCamera()?(this.originalBackground=l.texture,this.schematicRenderer.sceneManager.scene.background=this.isometricBackground):(this.schematicRenderer.sceneManager.scene.background=l.texture,this.originalBackground=l.texture)}else this.schematicRenderer.sceneManager.scene.environment=C,this.isOrthographicCamera()?(this.originalBackground=C,this.schematicRenderer.sceneManager.scene.background=this.isometricBackground):(this.schematicRenderer.sceneManager.scene.background=C,this.originalBackground=C);A.dispose(),this.pmremGenerator.dispose(),this.eventEmitter.emit("hdriLoaded",{path:i})}setIsometricBackgroundColor(A){this.isometricBackground.set(A),this.isOrthographicCamera()&&(this.schematicRenderer.sceneManager.scene.background=this.isometricBackground)}getIsometricBackgroundColor(){return this.isometricBackground.clone()}handleContextLost=A=>{A.preventDefault(),this.contextLost=!0,this.isRendering=!1,console.log("WebGL context lost. Suspending render operations..."),this.eventEmitter.emit("webglContextLost")};handleContextRestored=async()=>{console.log("WebGL context restored. Reinitializing renderer...");try{await new Promise(A=>setTimeout(A,300)),this.contextLost=!1,await this.initWebGLRenderer(),this.updateCanvasSize(),this.hdriPath&&(await new Promise(A=>setTimeout(A,100)),this.loadHDRI(this.hdriPath,this.hdriBackgroundOnly)),this.eventEmitter.emit("webglContextRestored"),requestAnimationFrame(()=>{this.contextLost||this.render()})}catch(A){console.error("Error during context restoration:",A),this.eventEmitter.emit("webglContextError",{error:A})}};initDefaultPasses(A){if(this._isWebGPU||!this.composer)return;const I=this.schematicRenderer.options.postProcessingOptions,i=[];if(I?.enableGamma!==!1){const l=new Lc(A.gamma??.5);this.passes.set("gammaCorrection",l),i.push(l)}if(I?.enableSMAA!==!1){const l=new Jc;this.passes.set("smaa",l),i.push(l)}if(I?.enableSSAO!==!1)try{const l=this.schematicRenderer.canvas.parentElement,w=l?l.clientWidth:window.innerWidth,Z=l?l.clientHeight:window.innerHeight,M=new rb(this.schematicRenderer.sceneManager.scene,this.schematicRenderer.cameraManager.activeCamera.camera,w,Z);M.configuration.aoRadius=1,M.configuration.distanceFalloff=.4,M.configuration.intensity=5,M.configuration.gammaCorrection=!1,M.setQualityMode("Medium"),this.passes.set("ssao",M),this.composer.addPass(M)}catch(l){console.warn("Failed to initialize N8AO SSAO:",l)}let C=null;if(i.length>0&&(C=new Nj(this.schematicRenderer.cameraManager.activeCamera.camera,...i),this.composer.addPass(C),this.passes.set("effectPass",C)),C)C.renderToScreen=!0;else if(this.composer.passes.length>1){const l=this.composer.passes[this.composer.passes.length-1];l&&(l.renderToScreen=!0)}else this.composer=null;I?.enableTiltShift===!0&&this.setTiltShiftEnabled(!0)}setupEventListeners(){window.addEventListener("resize",()=>{this.resizeTimeout&&window.cancelAnimationFrame(this.resizeTimeout),this.resizeTimeout=window.requestAnimationFrame(()=>{this.updateCanvasSize(),this.resizeTimeout=null})})}updateCanvasSize(){const A=this.schematicRenderer.canvas,I=A.parentElement;if(!I)return;const i=I.clientWidth,C=I.clientHeight;if(A.style.width=`${i}px`,A.style.height=`${C}px`,this.usesSharedRenderer){const l=this.pixelRatio;A.width=Math.max(1,Math.floor(i*l)),A.height=Math.max(1,Math.floor(C*l)),this.schematicRenderer.cameraManager.updateAspectRatio(i/C)}else if(!this.contextLost){this.renderer.setSize(i,C,!1),this.composer&&this.composer.setSize(i,C);const l=this.schematicRenderer.cameraManager.activeCamera.camera;l.aspect=i/C,l.updateProjectionMatrix();const w=this.passes.get("ssao");if(w&&w.setSize){const Z=this.renderer.getPixelRatio();w.setSize(i*Z,C*Z)}}this.schematicRenderer.invalidate()}enableEffect(A){const I=this.passes.get(A);I&&(I.enabled=!0)}disableEffect(A){const I=this.passes.get(A);I&&(I.enabled=!1)}setGamma(A){const I=this.passes.get("gammaCorrection");I&&I.setGamma(A)}_pendingTiltShiftAmount=null;setTiltShiftAmount(A){const I=this.passes.get("tiltShift");if(!I){this._pendingTiltShiftAmount=A;return}const i=hb(A);I.setFocusRange?.(i.focusRange),I.setBlurStrength?.(i.blurStrength),this.updateTiltShiftGizmo()}updateTiltShiftGizmo(){if(!this.tiltShiftGizmo)return;const A=this.passes.get("tiltShift");if(!A?.uniforms)return;const I=A.uniforms.get("focusPoint")?.value,i=A.uniforms.get("focusNormal")?.value,C=A.uniforms.get("focusRange")?.value;!I||!i||C==null||this.tiltShiftGizmo.update(I,i,C)}setTiltShiftGizmoVisible(A){this.tiltShiftGizmoVisible=A,this.tiltShiftGizmo?.setVisible(A)}setTiltShiftFocusPoint(A){this.passes.get("tiltShift")?.setFocusPoint?.(A),this.updateTiltShiftGizmo()}setTiltShiftTilt(A,I){this.passes.get("tiltShift")?.setTiltAngles?.(A,I),this._pendingTiltPitch=A,this._pendingTiltYaw=I,this.updateTiltShiftGizmo()}_pendingTiltPitch=0;_pendingTiltYaw=0;tiltShiftGizmo=null;tiltShiftGizmoVisible=!0;_focusPickRaycaster=null;pickTiltShiftFocus(){const A=this.schematicRenderer.canvas,I=A.style.cursor;A.style.cursor="crosshair";const i=w=>{w.stopPropagation(),w.preventDefault(),l(),this.focusTiltShiftOnScreenPoint(w.clientX,w.clientY)},C=w=>{w.key==="Escape"&&l()},l=()=>{A.style.cursor=I,A.removeEventListener("click",i,!0),window.removeEventListener("keydown",C)};A.addEventListener("click",i,!0),window.addEventListener("keydown",C)}focusTiltShiftOnScreenPoint(A,I){const i=this.schematicRenderer.canvas,C=this.schematicRenderer.cameraManager?.activeCamera?.camera;if(!C)return;const l=i.getBoundingClientRect(),w=new b.Vector2((A-l.left)/l.width*2-1,-((I-l.top)/l.height*2-1));this._focusPickRaycaster||(this._focusPickRaycaster=new b.Raycaster),this._focusPickRaycaster.setFromCamera(w,C);const Z=[],M=this.schematicRenderer.schematicManager?.getAllSchematics?.()??[];for(const e of M)e.group&&Z.push(e.group);if(Z.length===0)return;const m=this._focusPickRaycaster.intersectObjects(Z,!0);m.length!==0&&this.setTiltShiftFocusPoint(m[0].point)}computeSubjectWorldPosition(){const I=this.schematicRenderer.schematicManager?.getFirstSchematic?.();if(I?.group){const C=new b.Vector3;return I.group.getWorldPosition(C),C}return this.schematicRenderer.cameraManager?.activeCamera?.camera?.userData?.target??new b.Vector3}setTiltShiftEnabled(A){if(!this.composer||!oc||!Nj)return;let I=this.passes.get("tiltShiftPass");const i=this.passes.get("effectPass");if(A&&!I){const C=this._pendingTiltShiftAmount??.5,l=hb(C),w=this.schematicRenderer.cameraManager.activeCamera.camera,Z=this.computeSubjectWorldPosition(),M=new oc(w,{focusPoint:Z,focusRange:l.focusRange,blurStrength:l.blurStrength});M.setTiltAngles(this._pendingTiltPitch,this._pendingTiltYaw),I=new Nj(w,M),this.passes.set("tiltShift",M),this.passes.set("tiltShiftPass",I),this.composer.addPass(I);const m=this.schematicRenderer.canvas.parentElement,e=m?m.clientWidth:window.innerWidth,t=m?m.clientHeight:window.innerHeight;this.composer.setSize?.(e,t),this.ensureTiltShiftGizmo()}I&&(I.enabled=A,i&&(i.renderToScreen=!A),I.renderToScreen=A,this.tiltShiftGizmo?.setVisible(A&&this.tiltShiftGizmoVisible),A&&this.updateTiltShiftGizmo())}async ensureTiltShiftGizmo(){if(this.tiltShiftGizmo)return;const{TiltShiftGizmo:A}=await Promise.resolve().then(()=>GAA),I=this.schematicRenderer.sceneManager?.scene;I&&(this.tiltShiftGizmo=new A(I),this.tiltShiftGizmo.setVisible(this.tiltShiftGizmoVisible),this.updateTiltShiftGizmo())}setSSAOEnabled(A){const I=this.passes.get("ssao");I&&(I.enabled=A,A||console.log("[RenderManager] SSAO disabled for performance"))}isSSAOEnabled(){return this.passes.get("ssao")?.enabled??!1}setSSAOParameters(A){const I=this.passes.get("ssao");I&&I.configuration&&(A.aoRadius!==void 0&&(I.configuration.aoRadius=A.aoRadius),A.distanceFalloff!==void 0&&(I.configuration.distanceFalloff=A.distanceFalloff),A.intensity!==void 0&&(I.configuration.intensity=A.intensity),A.qualityMode!==void 0&&I.setQualityMode(A.qualityMode))}setSSAOPreset(A,I){this.ssaoPresets[A]={...this.ssaoPresets[A],...I},(this.isOrthographicCamera()?"isometric":"perspective")===A&&this.setSSAOParameters(this.ssaoPresets[A]),console.log(`SSAO preset updated for ${A} mode:`,this.ssaoPresets[A])}getSSAOPresets(){return{perspective:{...this.ssaoPresets.perspective},isometric:{...this.ssaoPresets.isometric}}}renderSingleFrameAndGetStats(){if(this.isRendering||this.contextLost||this.disposed)return console.warn("[RenderManager] Attempted renderSingleFrameAndGetStats while busy, context lost, or disposed."),{renderTimeMs:0,rendererInfo:null};const A=this.schematicRenderer.sceneManager.scene,I=this.schematicRenderer.cameraManager.activeCamera.camera,i=this.renderer;if(!i||!A||!I)return console.error("[RenderManager] Renderer, scene, or camera not available for renderSingleFrameAndGetStats."),{renderTimeMs:0,rendererInfo:i?i.info:null};if(!this._isWebGPU){const w=i.getContext();if(!w||w.isContextLost())return console.warn("[RenderManager] Attempted to render with lost WebGL context for stats."),this.contextLost=!0,{renderTimeMs:0,rendererInfo:i.info}}const C=performance.now();try{this.isRendering=!0,this._isWebGPU?this.renderer.render(A,I):this.composer?this.composer.render():this.renderer.render(A,I)}catch(w){return console.error("[RenderManager] Error during renderSingleFrameAndGetStats:",w),this.eventEmitter.emit("renderError",{error:w}),{renderTimeMs:performance.now()-C,rendererInfo:i.info}}finally{this.isRendering=!1}return{renderTimeMs:performance.now()-C,rendererInfo:i.info}}renderSharedAndBlit(){const A=this.schematicRenderer.canvas,I=A.clientWidth,i=A.clientHeight;if(I===0||i===0||!this.blitCtx)return;const C=this.pixelRatio,l=Math.max(1,Math.floor(I*C)),w=Math.max(1,Math.floor(i*C));(A.width!==l||A.height!==w)&&(A.width=l,A.height=w,this.schematicRenderer.cameraManager.updateAspectRatio(I/i)),this.renderer.setSize(I,i,!1),this.composer?(this.composer.setSize(I,i),this.composer.render()):this.renderer.render(this.schematicRenderer.sceneManager.scene,this.schematicRenderer.cameraManager.activeCamera.camera),this.blitCtx.clearRect(0,0,l,w),this.blitCtx.drawImage(this.renderer.domElement,0,0,l,w)}render(){if(!(this.isRendering||this.contextLost||this.disposed))try{if(this.isRendering=!0,!this._isWebGPU){const A=this.renderer.getContext();if(!A||A.isContextLost()){console.warn("Attempted to render with lost WebGL context"),this.contextLost=!0;return}}if(this._isWebGPU){const A=this.schematicRenderer.sceneManager.scene,I=this.schematicRenderer.cameraManager.activeCamera.camera;this.renderer.render(A,I),this.renderer.resolveTimestampsAsync&&this.renderer.resolveTimestampsAsync("render").catch(()=>{})}else this.usesSharedRenderer?this.renderSharedAndBlit():this.composer?this.composer.render():this.renderer.render(this.schematicRenderer.sceneManager.scene,this.schematicRenderer.cameraManager.activeCamera.camera)}catch(A){console.error("Render error:",A),this.eventEmitter.emit("renderError",{error:A})}finally{this.isRendering=!1}}requestRender(){!this.renderRequested&&!this.contextLost&&!this.disposed&&(this.renderRequested=!0,requestAnimationFrame(()=>{!this.contextLost&&!this.disposed&&this.render(),this.renderRequested=!1}))}resize(A,I){if(this.contextLost)return;this.renderer.setSize(A,I,!1),this.composer&&this.composer.setSize(A,I);const i=this.schematicRenderer.cameraManager.activeCamera.camera;i.aspect=A/I,i.updateProjectionMatrix();const C=this.passes.get("ssao");C&&C.setSize&&C.setSize(A,I)}updateCamera(A){const I=this.passes.get("renderPass");I&&(I.camera=A);const i=this.passes.get("effectPass");i&&(i.camera=A);const C=this.passes.get("ssao");C&&C.camera&&(C.camera=A)}getRenderer(){return this.renderer}getEffect(A){return this.passes.get(A)}dispose(){this.disposed=!0,this.contextLost=!0,this.resizeTimeout!==null&&(window.cancelAnimationFrame(this.resizeTimeout),this.resizeTimeout=null),window.removeEventListener("resize",this.updateCanvasSize);const A=this.renderer.domElement;A.removeEventListener("webglcontextlost",this.handleContextLost),A.removeEventListener("webglcontextrestored",this.handleContextRestored),this.passes.forEach(I=>{I.dispose&&I.dispose()}),this.passes.clear(),this.composer&&this.composer.dispose(),this.pmremGenerator&&!this.isPMREMGeneratorDisposed()&&this.pmremGenerator.dispose(),this.currentEnvMap&&this.currentEnvMap.dispose(),this.inspector&&(this.inspector=null),this.usesSharedRenderer||this.renderer.dispose()}async setAlphaMode(A){if(this._alphaMode!==A)if(this._alphaMode=A,A){this.composer&&!this._opaqueComposer&&(this._opaqueComposer=this.composer),await Eb();const I=this.renderer,i=this.schematicRenderer.cameraManager.activeCamera.camera,C=this.schematicRenderer.sceneManager.scene,l=this.schematicRenderer.options.gamma??.5,w=new Nc(I,{alpha:!0}),Z=new cc(C,i);w.addPass(Z);const M=[];M.push(new Lc(l));try{M.push(new Jc)}catch{}if(M.length>0){const m=new Nj(i,...M);m.renderToScreen=!0,w.addPass(m)}if(this._alphaComposer)try{this._alphaComposer.dispose()}catch{}this._alphaComposer=w,this.composer=w,I.setClearColor(0,0)}else{if(this._alphaComposer&&this.composer===this._alphaComposer){try{this._alphaComposer.dispose()}catch{}this._alphaComposer=null}this._opaqueComposer&&(this.composer=this._opaqueComposer),this.renderer.setClearColor(0,1)}}isAlphaMode(){return this._alphaMode}async setBackgroundMode(A,I={}){this._backgroundMode=A,this._forceBackground=I.force??!1;const i=this.schematicRenderer.sceneManager.scene;switch(A){case"hdri":await this.setAlphaMode(!1),I.hdriPath&&this.setupHDRIBackground(I.hdriPath,I.hdriBackgroundOnly??!0),this._forceBackground&&this.isOrthographicCamera()&&this.originalBackground&&(i.background=this.originalBackground);break;case"solid":{await this.setAlphaMode(!1);const C=new b.Color(I.color??2236962);i.background=C,this.renderer.setClearColor(C,1);break}case"transparent":await this.setAlphaMode(!0),i.background=null,i.environment=null;break;case"image":await this.setAlphaMode(!1),I.imageTexture&&(this._imageBackground&&this._imageBackground.dispose(),this._imageBackground=I.imageTexture),this._imageBackground&&(i.background=this._imageBackground),this.renderer.setClearColor(0,1);break}}getBackgroundMode(){return this._backgroundMode}}var Qc=(s=>(s.SCHEMATIC="schematic",s.RESOURCE_PACK="resourcePack",s.UNKNOWN="unknown",s))(Qc||{});class Gb{static SCHEMATIC_EXTENSIONS=[".schem",".litematic",".nbt",".schematic",".mcstructure"];static RESOURCE_PACK_EXTENSIONS=[".zip",".mcpack"];static determineFileType(A){const I=this.getFileExtension(A.name).toLowerCase();return this.SCHEMATIC_EXTENSIONS.includes(I)?"schematic":this.RESOURCE_PACK_EXTENSIONS.includes(I)?"resourcePack":"unknown"}static getFileExtension(A){const I=A.lastIndexOf(".");return I===-1?"":A.substring(I)}static isSchematic(A){return this.determineFileType(A)==="schematic"}static isResourcePack(A){return this.determineFileType(A)==="resourcePack"}static async validateResourcePack(A){return this.isResourcePack(A)}}class Jh{renderer;options;canvas;uiManager;constructor(A,I){this.renderer=A,this.options=I,this.canvas=this.renderer.canvas,this.uiManager=this.renderer.uiManager,this.initialize()}initialize(){this.canvas.addEventListener("dragover",this.onDragOver),this.canvas.addEventListener("dragleave",this.onDragLeave),this.canvas.addEventListener("drop",this.onDrop)}onDragOver=A=>{A.preventDefault(),this.uiManager.showOverlay(),this.uiManager.emptyStateOverlay.style.border="4px dashed #00ff00";const I=this.uiManager.emptyStateOverlay.getElementsByClassName("uploadOverlayContent").item(0);I.style.transform="translate(-50%, -50%) scale(1.1)",this.renderer.options.enableDragAndDrop&&this.uiManager.showEmptyState()};onDragLeave=A=>{A.preventDefault(),this.uiManager.hideOverlay(),this.uiManager.emptyStateOverlay.style.border="none";const I=this.uiManager.emptyStateOverlay.getElementsByClassName("uploadOverlayContent").item(0);I.style.transform="translate(-50%, -50%) scale(1)",this.renderer.schematicManager?.isEmpty()||this.uiManager.hideEmptyState()};onDrop=async A=>{A.preventDefault(),this.uiManager.hideOverlay(),this.canvas.style.border="none",console.log("Draged file detected"),this.uiManager.hideEmptyState();const I=A.dataTransfer?.files;if(console.log("Files dropped:",I),I&&I.length>0){let i=0;for(const C of I){const l=performance.now(),w=Gb.determineFileType(C);if(console.log("File type determined in",performance.now()-l,"ms"),w===Qc.SCHEMATIC&&this.isAcceptedFileType(C)){const Z=performance.now();await this.handleSchematicDrop(C),i++,console.log("Schematic drop handled in",performance.now()-Z,"ms")}else if(w===Qc.RESOURCE_PACK)await this.handleResourcePackDrop(C);else{const Z=C.name.split(".").pop()?.toLowerCase()||"unknown",M=this.options.acceptedFileTypes?.length?this.options.acceptedFileTypes.join(", "):"schem, litematic, nbt, schematic, mcstructure";this.uiManager.showMessage(`Unsupported file type: .${Z}
414
414
  Supported formats: ${M}`),await this.options.callbacks?.onInvalidFileType?.(C)}}i>1&&this.options.gridLayout?.enabled&&this.renderer.schematicManager&&this.renderer.schematicManager.arrangeInGrid({spacing:this.options.gridLayout.spacing,columns:this.options.gridLayout.columns})}};async handleSchematicDrop(A){try{await this.options.callbacks?.onSchematicDropped?.(A),this.uiManager.showLoadingIndicator(`Loading schematic: ${A.name}...`),console.log("Loading schematic",A.name),await this.renderer.schematicManager?.loadSchematicFromFile(A,{onProgress:I=>{this.uiManager.showLoadingIndicator(`${I.message} (${Math.round(I.progress)}%)`),this.options.callbacks?.onLoadingProgress?.(A,I.progress)}}),console.log("Schematic loaded successfully:",A.name),this.options.callbacks?.onSchematicLoaded&&this.options.callbacks.onSchematicLoaded(A.name),this.uiManager.hideLoadingIndicator(),await this.options.callbacks?.onSchematicDropSuccess?.(A)}catch(I){console.error(I),this.uiManager.hideLoadingIndicator();const i=I instanceof Error?I.message:"Unknown error";this.uiManager.showMessage(`Error loading schematic ${A.name}: ${i}`),await this.options.callbacks?.onSchematicDropFailed?.(A,I instanceof Error?I:new Error(i))}}async handleResourcePackDrop(A){try{if(await this.options.callbacks?.onResourcePackDropped?.(A),this.uiManager.showLoadingIndicator(`Loading resource pack: ${A.name}...`),console.log("Loading resource pack",A.name),!await Gb.validateResourcePack(A))throw new Error("Invalid resource pack format");await this.renderer.addResourcePack(A),await this.options.callbacks?.onResourcePackDropSuccess?.(A),this.uiManager.hideLoadingIndicator(),this.uiManager.showMessage(`Resource pack ${A.name} loaded successfully!`),await this.options.callbacks?.onResourcePackLoaded?.(A.name)}catch(I){console.error(I),this.uiManager.hideLoadingIndicator();const i=I instanceof Error?I.message:"Unknown error";this.uiManager.showMessage(`Error loading resource pack ${A.name}: ${i}`),await this.options.callbacks?.onResourcePackDropFailed?.(A,I instanceof Error?I:new Error(i))}}isAcceptedFileType(A){if(!this.options.acceptedFileTypes||this.options.acceptedFileTypes.length===0)return!0;const I=A.name.split(".").pop()?.toLowerCase();return this.options.acceptedFileTypes.includes(I||"")}dispose(){this.canvas.removeEventListener("dragover",this.onDragOver),this.canvas.removeEventListener("dragleave",this.onDragLeave),this.canvas.removeEventListener("drop",this.onDrop)}}const xb={};function Lh(){for(const s of Object.keys(xb))delete xb[s]}class Ve{static instance;sessions=new Map;currentSession=null;renderer=null;memoryCheckInterval=100;memoryIntervalId=null;baselineMemory=null;frameCount=0;lastTime=performance.now();fpsIntervalId=null;frameId=null;isMonitoring=!1;latestFrameTime=0;latestFPS=0;timingStack=[];constructor(){}static getInstance(){return Ve.instance||(Ve.instance=new Ve),Ve.instance}setRenderer(A){this.renderer=A}startSession(A,I){const i=`${A}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;return this.currentSession={sessionId:i,schematicId:A,startTime:performance.now(),renderMode:I,memorySnapshots:[],peakMemoryUsage:0,memoryLeaks:0,timingData:[],blockProcessingData:[],chunkProcessingData:[],averageBlockProcessingTime:0,averageChunkProcessingTime:0,slowestOperations:[],memoryHotspots:[],fpsHistory:[],averageFPS:0,rendererStatsHistory:[],frameHistory:[]},this.sessions.set(i,this.currentSession),this.baselineMemory=this.takeMemorySnapshot("session_start"),this.currentSession.memorySnapshots.push(this.baselineMemory),this.startMemoryMonitoring(),this.startMonitoringLoop(),i}endSession(A){const I=A?this.sessions.get(A):this.currentSession;if(!I)return null;I.endTime=performance.now(),I.totalDuration=I.endTime-I.startTime,this.stopMemoryMonitoring();const i=this.takeMemorySnapshot("session_end");return I.memorySnapshots.push(i),this.calculateSessionMetrics(I),this.renderer&&this.renderer.info&&(I.rendererStats={drawCalls:this.renderer.info.render.calls,triangles:this.renderer.info.render.triangles,points:this.renderer.info.render.points,lines:this.renderer.info.render.lines,geometries:this.renderer.info.memory.geometries,textures:this.renderer.info.memory.textures,programs:this.renderer.info.programs?.length||0}),this.currentSession=null,this.stopMonitoringLoop(),I}startBackgroundMonitoring(){this.startMonitoringLoop()}stopBackgroundMonitoring(){this.stopMonitoringLoop()}trackMemoryLeaks(A){if(A.memorySnapshots.length>=2){const I=A.memorySnapshots[0].usedJSHeapSize,i=A.memorySnapshots[A.memorySnapshots.length-1].usedJSHeapSize;A.memoryLeaks=i-I;const C=300*1024*1024;A.memoryLeaks>C&&console.warn(`Significant memory leak detected: ${A.memoryLeaks/(1024*1024)} MB`)}}identifyUnreleasedObjects(A){const I=[];return A.memorySnapshots.forEach((i,C)=>{if(C===0)return;const l=A.memorySnapshots[C-1];i.usedJSHeapSize-l.usedJSHeapSize>0&&I.push(`Potential leak after ${l.customData?.label||"unknown"}`)}),I}logMemoryAnalysis(A){const I=this.sessions.get(A);if(!I)return;this.trackMemoryLeaks(I);const i=this.identifyUnreleasedObjects(I);console.log("Memory Analysis Results:",{totalLeak:I.memoryLeaks,unreleasedObjects:i})}startOperation(A,I){const i={name:A,startTime:performance.now(),parentOperation:this.timingStack.length>0?this.timingStack[this.timingStack.length-1].name:void 0,metadata:I};this.timingStack.push(i),this.currentSession&&this.currentSession.timingData.push(i)}endOperation(A){const I=this.timingStack.findIndex(C=>C.name===A);if(I===-1){console.warn(`No matching start operation found for: ${A}`);return}const i=this.timingStack[I];i.endTime=performance.now(),i.duration=i.endTime-i.startTime,this.timingStack.splice(I,1),i.duration>50&&this.takeMemorySnapshot(A)}recordOperationDetails(A,I){this.currentSession&&this.currentSession.timingData.push({name:A,startTime:performance.now(),metadata:I})}recordBlockProcessing(A){this.currentSession&&(this.currentSession.blockProcessingData.push(A),A.processingTime>10&&this.takeMemorySnapshot(`block_${A.blockType}_${A.chunkId}`))}recordChunkProcessing(A){this.currentSession&&(this.currentSession.chunkProcessingData.push(A),this.takeMemorySnapshot(`chunk_${A.chunkId}`))}takeMemorySnapshot(A){const I={timestamp:performance.now(),jsHeapSize:0,jsHeapSizeLimit:0,usedJSHeapSize:0,geometryCount:0,textureCount:0,materialCount:0,vertexCount:0,indexCount:0,bufferMemoryEstimate:0,customData:{label:A}};return performance.memory&&(I.jsHeapSize=performance.memory.jsHeapSize,I.jsHeapSizeLimit=performance.memory.jsHeapSizeLimit,I.usedJSHeapSize=performance.memory.usedJSHeapSize),this.renderer&&this.renderer.info&&(I.geometryCount=this.renderer.info.memory.geometries,I.textureCount=this.renderer.info.memory.textures),I.bufferMemoryEstimate=this.estimateBufferMemory(),this.currentSession&&I.usedJSHeapSize>this.currentSession.peakMemoryUsage&&(this.currentSession.peakMemoryUsage=I.usedJSHeapSize),I}estimateBufferMemory(){if(!this.renderer||!this.renderer.info)return 0;const A=this.renderer.info,I=A.render.triangles*3*3*4,i=A.render.triangles*3*2;return I+i}startMemoryMonitoring(){this.memoryIntervalId||(this.memoryIntervalId=window.setInterval(()=>{if(this.currentSession){const A=this.takeMemorySnapshot("continuous_monitoring");this.currentSession.memorySnapshots.push(A)}},this.memoryCheckInterval))}stopMemoryMonitoring(){this.memoryIntervalId&&(clearInterval(this.memoryIntervalId),this.memoryIntervalId=null)}calculateSessionMetrics(A){if(A.blockProcessingData.length>0){const I=A.blockProcessingData.reduce((i,C)=>i+C.processingTime,0);A.averageBlockProcessingTime=I/A.blockProcessingData.length}if(A.chunkProcessingData.length>0){const I=A.chunkProcessingData.reduce((i,C)=>i+C.processingTime,0);A.averageChunkProcessingTime=I/A.chunkProcessingData.length}if(A.slowestOperations=A.timingData.filter(I=>I.duration!==void 0).sort((I,i)=>(i.duration||0)-(I.duration||0)).slice(0,10),A.memoryHotspots=this.identifyMemoryHotspots(A),A.memorySnapshots.length>=2){const I=A.memorySnapshots[0].usedJSHeapSize,i=A.memorySnapshots[A.memorySnapshots.length-1].usedJSHeapSize;A.memoryLeaks=i-I}A.breakdown=A.timingData.filter(I=>I.duration!==void 0).sort((I,i)=>(i.duration||0)-(I.duration||0)).map(I=>({operationId:I.name,duration:I.duration||0,memoryDelta:0}))}identifyMemoryHotspots(A){const I=[];for(let i=1;i<A.memorySnapshots.length;i++){const C=A.memorySnapshots[i-1],l=A.memorySnapshots[i];l.usedJSHeapSize-C.usedJSHeapSize>5*1024*1024&&I.push(l.customData?.label||`snapshot_${i}`)}return I}getSession(A){return this.sessions.get(A)||null}getAllSessions(){return Array.from(this.sessions.values())}getCurrentSession(){return this.currentSession}exportSessionData(A){const I=this.sessions.get(A);return I?JSON.stringify(I,null,2):""}clearSessions(){this.sessions.clear(),this.currentSession=null}clearAllSessions(){this.stopMemoryMonitoring(),this.stopMonitoringLoop(),this.sessions.clear(),this.currentSession=null,this.timingStack=[],this.baselineMemory=null,this.frameCount=0,this.lastTime=performance.now(),this.latestFPS=0,this.latestFrameTime=0,console.log("[PerformanceMonitor] Cleared all sessions and reset monitoring state.")}getMemoryUsageOverTime(A){const I=this.sessions.get(A);return I?I.memorySnapshots.map(i=>({time:i.timestamp-I.startTime,memory:i.usedJSHeapSize})):[]}getOperationTimings(A){const I=this.sessions.get(A);if(!I)return[];const i=new Map;return I.timingData.forEach(C=>{if(C.duration!==void 0){const l=i.get(C.name)||{total:0,count:0};l.total+=C.duration,l.count+=1,i.set(C.name,l)}}),Array.from(i.entries()).map(([C,l])=>({name:C,duration:l.total/l.count,count:l.count}))}getBlockProcessingStats(A){const I=this.sessions.get(A);if(!I)return[];const i=new Map;return I.blockProcessingData.forEach(C=>{const l=i.get(C.blockType)||{total:0,count:0};l.total+=C.processingTime,l.count+=1,i.set(C.blockType,l)}),Array.from(i.entries()).map(([C,l])=>({blockType:C,averageTime:l.total/l.count,count:l.count}))}startMonitoringLoop(){if(this.isMonitoring)return;this.isMonitoring=!0,this.frameCount=0,this.lastTime=performance.now();const A=()=>{if(!this.isMonitoring)return;const I=performance.now(),i=I-this.lastTime;this.frameCount++,this.latestFrameTime=i,this.currentSession&&this.currentSession.frameHistory.length<1e3&&this.currentSession.frameHistory.push({timestamp:I,duration:i,fps:1e3/i}),this.frameCount%60,this.renderer&&this.renderer.info&&this.currentSession&&this.frameCount%10===0&&this.currentSession.rendererStatsHistory.push({timestamp:I,drawCalls:this.renderer.info.render.calls,triangles:this.renderer.info.render.triangles,points:this.renderer.info.render.points,lines:this.renderer.info.render.lines,geometries:this.renderer.info.memory.geometries,textures:this.renderer.info.memory.textures,programs:this.renderer.info.programs?.length||0}),this.lastTime=I,this.frameId=requestAnimationFrame(A)};if(this.frameId=requestAnimationFrame(A),!this.fpsIntervalId){let I=performance.now(),i=0;this.fpsIntervalId=window.setInterval(()=>{const C=performance.now(),l=C-I,w=this.frameCount-i;if(l>=1e3){const Z=w*1e3/l;this.latestFPS=Z,this.currentSession&&(this.currentSession.fpsHistory.push(Z),this.currentSession.fpsHistory.length>60&&this.currentSession.fpsHistory.shift(),this.currentSession.averageFPS=this.currentSession.fpsHistory.reduce((M,m)=>M+m,0)/this.currentSession.fpsHistory.length),I=C,i=this.frameCount}},1e3)}}stopMonitoringLoop(){this.isMonitoring=!1,this.frameId!==null&&(cancelAnimationFrame(this.frameId),this.frameId=null),this.fpsIntervalId!==null&&(clearInterval(this.fpsIntervalId),this.fpsIntervalId=null)}getCurrentFPS(){return this.latestFPS}getCurrentFrameTime(){return this.latestFrameTime}getAverageFPS(){return this.currentSession?this.currentSession.averageFPS:0}getFPSHistory(A){const I=A?this.sessions.get(A):this.currentSession;return I?[...I.fpsHistory]:[]}}const bI=Ve.getInstance(),vb={POSITION:["byte","byte normalized","unsigned byte","unsigned byte normalized","short","short normalized","unsigned short","unsigned short normalized"],NORMAL:["byte normalized","short normalized"],TANGENT:["byte normalized","short normalized"],TEXCOORD:["byte","byte normalized","unsigned byte","short","short normalized","unsigned short"]};class cj{constructor(){this.textureUtils=null,this.pluginCallbacks=[],this.register(function(A){return new Th(A)}),this.register(function(A){return new Fh(A)}),this.register(function(A){return new Yh(A)}),this.register(function(A){return new rh(A)}),this.register(function(A){return new uh(A)}),this.register(function(A){return new Eh(A)}),this.register(function(A){return new Bh(A)}),this.register(function(A){return new yh(A)}),this.register(function(A){return new Xh(A)}),this.register(function(A){return new hh(A)}),this.register(function(A){return new ph(A)}),this.register(function(A){return new Sh(A)}),this.register(function(A){return new Gh(A)}),this.register(function(A){return new xh(A)})}register(A){return this.pluginCallbacks.indexOf(A)===-1&&this.pluginCallbacks.push(A),this}unregister(A){return this.pluginCallbacks.indexOf(A)!==-1&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(A),1),this}setTextureUtils(A){return this.textureUtils=A,this}parse(A,I,i,C){const l=new Rh,w=[];for(let Z=0,M=this.pluginCallbacks.length;Z<M;Z++)w.push(this.pluginCallbacks[Z](l));l.setPlugins(w),l.setTextureUtils(this.textureUtils),l.writeAsync(A,I,C).catch(i)}parseAsync(A,I){const i=this;return new Promise(function(C,l){i.parse(A,C,l,I)})}}const zI={POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,TRIANGLE_STRIP:5,TRIANGLE_FAN:6,BYTE:5120,UNSIGNED_BYTE:5121,SHORT:5122,UNSIGNED_SHORT:5123,INT:5124,UNSIGNED_INT:5125,FLOAT:5126,ARRAY_BUFFER:34962,ELEMENT_ARRAY_BUFFER:34963,NEAREST:9728,LINEAR:9729,NEAREST_MIPMAP_NEAREST:9984,LINEAR_MIPMAP_NEAREST:9985,NEAREST_MIPMAP_LINEAR:9986,LINEAR_MIPMAP_LINEAR:9987,CLAMP_TO_EDGE:33071,MIRRORED_REPEAT:33648,REPEAT:10497},ac="KHR_mesh_quantization",Bl={};Bl[N.NearestFilter]=zI.NEAREST,Bl[N.NearestMipmapNearestFilter]=zI.NEAREST_MIPMAP_NEAREST,Bl[N.NearestMipmapLinearFilter]=zI.NEAREST_MIPMAP_LINEAR,Bl[N.LinearFilter]=zI.LINEAR,Bl[N.LinearMipmapNearestFilter]=zI.LINEAR_MIPMAP_NEAREST,Bl[N.LinearMipmapLinearFilter]=zI.LINEAR_MIPMAP_LINEAR,Bl[N.ClampToEdgeWrapping]=zI.CLAMP_TO_EDGE,Bl[N.RepeatWrapping]=zI.REPEAT,Bl[N.MirroredRepeatWrapping]=zI.MIRRORED_REPEAT;const kb={scale:"scale",position:"translation",quaternion:"rotation",morphTargetInfluences:"weights"},oh=new N.Color,Hb=12,Uh=1179937895,Qh=2,fb=8,ah=1313821514,Wh=5130562;function Ks(s,A){return s.length===A.length&&s.every(function(I,i){return I===A[i]})}function bh(s){return new TextEncoder().encode(s).buffer}function zh(s){return Ks(s.elements,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])}function Ph(s,A,I){const i={min:new Array(s.itemSize).fill(Number.POSITIVE_INFINITY),max:new Array(s.itemSize).fill(Number.NEGATIVE_INFINITY)};for(let C=A;C<A+I;C++)for(let l=0;l<s.itemSize;l++){let w;s.itemSize>4?w=s.array[C*s.itemSize+l]:(l===0?w=s.getX(C):l===1?w=s.getY(C):l===2?w=s.getZ(C):l===3&&(w=s.getW(C)),s.normalized===!0&&(w=N.MathUtils.normalize(w,s.array))),i.min[l]=Math.min(i.min[l],w),i.max[l]=Math.max(i.max[l],w)}return i}function Kb(s){return Math.ceil(s/4)*4}function Wc(s,A=0){const I=Kb(s.byteLength);if(I!==s.byteLength){const i=new Uint8Array(I);if(i.set(new Uint8Array(s)),A!==0)for(let C=s.byteLength;C<I;C++)i[C]=A;return i.buffer}return s}function _b(){return typeof document>"u"&&typeof OffscreenCanvas<"u"?new OffscreenCanvas(1,1):document.createElement("canvas")}function Oh(s,A){if(typeof OffscreenCanvas<"u"&&s instanceof OffscreenCanvas){let I;return A==="image/jpeg"?I=.92:A==="image/webp"&&(I=.8),s.convertToBlob({type:A,quality:I})}else return new Promise(I=>s.toBlob(I,A))}class Rh{constructor(){this.plugins=[],this.options={},this.pending=[],this.buffers=[],this.byteOffset=0,this.buffers=[],this.nodeMap=new Map,this.skins=[],this.extensionsUsed={},this.extensionsRequired={},this.uids=new Map,this.uid=0,this.json={asset:{version:"2.0",generator:"THREE.GLTFExporter r"+N.REVISION}},this.cache={meshes:new Map,attributes:new Map,attributesNormalized:new Map,materials:new Map,textures:new Map,images:new Map},this.textureUtils=null}setPlugins(A){this.plugins=A}setTextureUtils(A){this.textureUtils=A}async writeAsync(A,I,i={}){this.options=Object.assign({binary:!1,trs:!1,onlyVisible:!0,maxTextureSize:1/0,animations:[],includeCustomExtensions:!1},i),this.options.animations.length>0&&(this.options.trs=!0),await this.processInputAsync(A),await Promise.all(this.pending);const C=this,l=C.buffers,w=C.json;i=C.options;const Z=C.extensionsUsed,M=C.extensionsRequired,m=new Blob(l,{type:"application/octet-stream"}),e=Object.keys(Z),t=Object.keys(M);if(e.length>0&&(w.extensionsUsed=e),t.length>0&&(w.extensionsRequired=t),w.buffers&&w.buffers.length>0&&(w.buffers[0].byteLength=m.size),i.binary===!0){const j=new FileReader;j.readAsArrayBuffer(m),j.onloadend=function(){const n=Wc(j.result),D=new DataView(new ArrayBuffer(fb));D.setUint32(0,n.byteLength,!0),D.setUint32(4,Wh,!0);const d=Wc(bh(JSON.stringify(w)),32),c=new DataView(new ArrayBuffer(fb));c.setUint32(0,d.byteLength,!0),c.setUint32(4,ah,!0);const J=new ArrayBuffer(Hb),L=new DataView(J);L.setUint32(0,Uh,!0),L.setUint32(4,Qh,!0);const o=Hb+c.byteLength+d.byteLength+D.byteLength+n.byteLength;L.setUint32(8,o,!0);const Q=new Blob([J,c,d,D,n],{type:"application/octet-stream"}),a=new FileReader;a.readAsArrayBuffer(Q),a.onloadend=function(){I(a.result)}}}else if(w.buffers&&w.buffers.length>0){const j=new FileReader;j.readAsDataURL(m),j.onloadend=function(){const n=j.result;w.buffers[0].uri=n,I(w)}}else I(w)}serializeUserData(A,I){if(Object.keys(A.userData).length===0)return;const i=this.options,C=this.extensionsUsed;try{const l=JSON.parse(JSON.stringify(A.userData));if(i.includeCustomExtensions&&l.gltfExtensions){I.extensions===void 0&&(I.extensions={});for(const w in l.gltfExtensions)I.extensions[w]=l.gltfExtensions[w],C[w]=!0;delete l.gltfExtensions}Object.keys(l).length>0&&(I.extras=l)}catch(l){console.warn("THREE.GLTFExporter: userData of '"+A.name+"' won't be serialized because of JSON.stringify error - "+l.message)}}getUID(A,I=!1){if(this.uids.has(A)===!1){const C=new Map;C.set(!0,this.uid++),C.set(!1,this.uid++),this.uids.set(A,C)}return this.uids.get(A).get(I)}isNormalizedNormalAttribute(A){if(this.cache.attributesNormalized.has(A))return!1;const i=new N.Vector3;for(let C=0,l=A.count;C<l;C++)if(Math.abs(i.fromBufferAttribute(A,C).length()-1)>5e-4)return!1;return!0}createNormalizedNormalAttribute(A){const I=this.cache;if(I.attributesNormalized.has(A))return I.attributesNormalized.get(A);const i=A.clone(),C=new N.Vector3;for(let l=0,w=i.count;l<w;l++)C.fromBufferAttribute(i,l),C.x===0&&C.y===0&&C.z===0?C.setX(1):C.normalize(),i.setXYZ(l,C.x,C.y,C.z);return I.attributesNormalized.set(A,i),i}applyTextureTransform(A,I){let i=!1;const C={};(I.offset.x!==0||I.offset.y!==0)&&(C.offset=I.offset.toArray(),i=!0),I.rotation!==0&&(C.rotation=I.rotation,i=!0),(I.repeat.x!==1||I.repeat.y!==1)&&(C.scale=I.repeat.toArray(),i=!0),i&&(A.extensions=A.extensions||{},A.extensions.KHR_texture_transform=C,this.extensionsUsed.KHR_texture_transform=!0)}async buildMetalRoughTextureAsync(A,I){if(A===I)return A;function i(n){return n.colorSpace===N.SRGBColorSpace?function(d){return d<.04045?d*.0773993808:Math.pow(d*.9478672986+.0521327014,2.4)}:function(d){return d}}A instanceof N.CompressedTexture&&(A=await this.decompressTextureAsync(A)),I instanceof N.CompressedTexture&&(I=await this.decompressTextureAsync(I));const C=A?A.image:null,l=I?I.image:null,w=Math.max(C?C.width:0,l?l.width:0),Z=Math.max(C?C.height:0,l?l.height:0),M=_b();M.width=w,M.height=Z;const m=M.getContext("2d",{willReadFrequently:!0});m.fillStyle="#00ffff",m.fillRect(0,0,w,Z);const e=m.getImageData(0,0,w,Z);if(C){m.drawImage(C,0,0,w,Z);const n=i(A),D=m.getImageData(0,0,w,Z).data;for(let d=2;d<D.length;d+=4)e.data[d]=n(D[d]/256)*256}if(l){m.drawImage(l,0,0,w,Z);const n=i(I),D=m.getImageData(0,0,w,Z).data;for(let d=1;d<D.length;d+=4)e.data[d]=n(D[d]/256)*256}m.putImageData(e,0,0);const j=(A||I).clone();return j.source=new N.Source(M),j.colorSpace=N.NoColorSpace,j.channel=(A||I).channel,A&&I&&A.channel!==I.channel&&console.warn("THREE.GLTFExporter: UV channels for metalnessMap and roughnessMap textures must match."),console.warn("THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures."),j}async decompressTextureAsync(A,I=1/0){if(this.textureUtils===null)throw new Error("THREE.GLTFExporter: setTextureUtils() must be called to process compressed textures.");return await this.textureUtils.decompress(A,I)}processBuffer(A){const I=this.json,i=this.buffers;return I.buffers||(I.buffers=[{byteLength:0}]),i.push(A),0}processBufferView(A,I,i,C,l){const w=this.json;w.bufferViews||(w.bufferViews=[]);let Z;switch(I){case zI.BYTE:case zI.UNSIGNED_BYTE:Z=1;break;case zI.SHORT:case zI.UNSIGNED_SHORT:Z=2;break;default:Z=4}let M=A.itemSize*Z;l===zI.ARRAY_BUFFER&&(M=Math.ceil(M/4)*4);const m=Kb(C*M),e=new DataView(new ArrayBuffer(m));let t=0;for(let D=i;D<i+C;D++){for(let d=0;d<A.itemSize;d++){let c;A.itemSize>4?c=A.array[D*A.itemSize+d]:(d===0?c=A.getX(D):d===1?c=A.getY(D):d===2?c=A.getZ(D):d===3&&(c=A.getW(D)),A.normalized===!0&&(c=N.MathUtils.normalize(c,A.array))),I===zI.FLOAT?e.setFloat32(t,c,!0):I===zI.INT?e.setInt32(t,c,!0):I===zI.UNSIGNED_INT?e.setUint32(t,c,!0):I===zI.SHORT?e.setInt16(t,c,!0):I===zI.UNSIGNED_SHORT?e.setUint16(t,c,!0):I===zI.BYTE?e.setInt8(t,c):I===zI.UNSIGNED_BYTE&&e.setUint8(t,c),t+=Z}t%M!==0&&(t+=M-t%M)}const j={buffer:this.processBuffer(e.buffer),byteOffset:this.byteOffset,byteLength:m};return l!==void 0&&(j.target=l),l===zI.ARRAY_BUFFER&&(j.byteStride=M),this.byteOffset+=m,w.bufferViews.push(j),{id:w.bufferViews.length-1,byteLength:0}}processBufferViewImage(A){const I=this,i=I.json;return i.bufferViews||(i.bufferViews=[]),new Promise(function(C){const l=new FileReader;l.readAsArrayBuffer(A),l.onloadend=function(){const w=Wc(l.result),Z={buffer:I.processBuffer(w),byteOffset:I.byteOffset,byteLength:w.byteLength};I.byteOffset+=w.byteLength,C(i.bufferViews.push(Z)-1)}})}processAccessor(A,I,i,C){const l=this.json,w={1:"SCALAR",2:"VEC2",3:"VEC3",4:"VEC4",9:"MAT3",16:"MAT4"};let Z;if(A.array.constructor===Float32Array)Z=zI.FLOAT;else if(A.array.constructor===Int32Array)Z=zI.INT;else if(A.array.constructor===Uint32Array)Z=zI.UNSIGNED_INT;else if(A.array.constructor===Int16Array)Z=zI.SHORT;else if(A.array.constructor===Uint16Array)Z=zI.UNSIGNED_SHORT;else if(A.array.constructor===Int8Array)Z=zI.BYTE;else if(A.array.constructor===Uint8Array)Z=zI.UNSIGNED_BYTE;else throw new Error("THREE.GLTFExporter: Unsupported bufferAttribute component type: "+A.array.constructor.name);if(i===void 0&&(i=0),(C===void 0||C===1/0)&&(C=A.count),C===0)return null;const M=Ph(A,i,C);let m;I!==void 0&&(m=A===I.index?zI.ELEMENT_ARRAY_BUFFER:zI.ARRAY_BUFFER);const e=this.processBufferView(A,Z,i,C,m),t={bufferView:e.id,byteOffset:e.byteOffset,componentType:Z,count:C,max:M.max,min:M.min,type:w[A.itemSize]};return A.normalized===!0&&(t.normalized=!0),l.accessors||(l.accessors=[]),l.accessors.push(t)-1}processImage(A,I,i,C="image/png"){if(A!==null){const l=this,w=l.cache,Z=l.json,M=l.options,m=l.pending;w.images.has(A)||w.images.set(A,{});const e=w.images.get(A),t=C+":flipY/"+i.toString();if(e[t]!==void 0)return e[t];Z.images||(Z.images=[]);const j={mimeType:C},n=_b();n.width=Math.min(A.width,M.maxTextureSize),n.height=Math.min(A.height,M.maxTextureSize);const D=n.getContext("2d",{willReadFrequently:!0});if(i===!0&&(D.translate(0,n.height),D.scale(1,-1)),A.data!==void 0){I!==N.RGBAFormat&&console.error("GLTFExporter: Only RGBAFormat is supported.",I),(A.width>M.maxTextureSize||A.height>M.maxTextureSize)&&console.warn("GLTFExporter: Image size is bigger than maxTextureSize",A);const c=new Uint8ClampedArray(A.height*A.width*4);for(let J=0;J<c.length;J+=4)c[J+0]=A.data[J+0],c[J+1]=A.data[J+1],c[J+2]=A.data[J+2],c[J+3]=A.data[J+3];D.putImageData(new ImageData(c,A.width,A.height),0,0)}else if(typeof HTMLImageElement<"u"&&A instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&A instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&A instanceof ImageBitmap||typeof OffscreenCanvas<"u"&&A instanceof OffscreenCanvas)D.drawImage(A,0,0,n.width,n.height);else throw new Error("THREE.GLTFExporter: Invalid image type. Use HTMLImageElement, HTMLCanvasElement, ImageBitmap or OffscreenCanvas.");M.binary===!0?m.push(Oh(n,C).then(c=>l.processBufferViewImage(c)).then(c=>{j.bufferView=c})):j.uri=N.ImageUtils.getDataURL(n,C);const d=Z.images.push(j)-1;return e[t]=d,d}else throw new Error("THREE.GLTFExporter: No valid image data found. Unable to process texture.")}processSampler(A){const I=this.json;I.samplers||(I.samplers=[]);const i={magFilter:Bl[A.magFilter],minFilter:Bl[A.minFilter],wrapS:Bl[A.wrapS],wrapT:Bl[A.wrapT]};return I.samplers.push(i)-1}async processTextureAsync(A){const i=this.options,C=this.cache,l=this.json;if(C.textures.has(A))return C.textures.get(A);l.textures||(l.textures=[]),A instanceof N.CompressedTexture&&(A=await this.decompressTextureAsync(A,i.maxTextureSize));const w=A.userData.mimeType,Z=this.processImage(A.image,A.format,A.flipY,w),M={sampler:this.processSampler(A)};w==="image/webp"?(M.extensions=M.extensions||{},M.extensions.EXT_texture_webp={source:Z},this.extensionsUsed.EXT_texture_webp=!0,this.extensionsRequired.EXT_texture_webp=!0):M.source=Z,A.name&&(M.name=A.name),await this._invokeAllAsync(async function(e){e.writeTexture&&await e.writeTexture(A,M)});const m=l.textures.push(M)-1;return C.textures.set(A,m),m}async processMaterialAsync(A){const I=this.cache,i=this.json;if(I.materials.has(A))return I.materials.get(A);if(A.isShaderMaterial)return console.warn("GLTFExporter: THREE.ShaderMaterial not supported."),null;i.materials||(i.materials=[]);const C={pbrMetallicRoughness:{}};A.isMeshStandardMaterial!==!0&&A.isMeshBasicMaterial!==!0&&console.warn("GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.");const l=A.color.toArray().concat([A.opacity]);if(Ks(l,[1,1,1,1])||(C.pbrMetallicRoughness.baseColorFactor=l),A.isMeshStandardMaterial?(C.pbrMetallicRoughness.metallicFactor=A.metalness,C.pbrMetallicRoughness.roughnessFactor=A.roughness):(C.pbrMetallicRoughness.metallicFactor=0,C.pbrMetallicRoughness.roughnessFactor=1),A.metalnessMap||A.roughnessMap){const Z=await this.buildMetalRoughTextureAsync(A.metalnessMap,A.roughnessMap),M={index:await this.processTextureAsync(Z),texCoord:Z.channel};this.applyTextureTransform(M,Z),C.pbrMetallicRoughness.metallicRoughnessTexture=M}if(A.map){const Z={index:await this.processTextureAsync(A.map),texCoord:A.map.channel};this.applyTextureTransform(Z,A.map),C.pbrMetallicRoughness.baseColorTexture=Z}if(A.emissive){const Z=A.emissive;if(Math.max(Z.r,Z.g,Z.b)>0&&(C.emissiveFactor=A.emissive.toArray()),A.emissiveMap){const m={index:await this.processTextureAsync(A.emissiveMap),texCoord:A.emissiveMap.channel};this.applyTextureTransform(m,A.emissiveMap),C.emissiveTexture=m}}if(A.normalMap){const Z={index:await this.processTextureAsync(A.normalMap),texCoord:A.normalMap.channel};A.normalScale&&A.normalScale.x!==1&&(Z.scale=A.normalScale.x),this.applyTextureTransform(Z,A.normalMap),C.normalTexture=Z}if(A.aoMap){const Z={index:await this.processTextureAsync(A.aoMap),texCoord:A.aoMap.channel};A.aoMapIntensity!==1&&(Z.strength=A.aoMapIntensity),this.applyTextureTransform(Z,A.aoMap),C.occlusionTexture=Z}A.transparent?C.alphaMode="BLEND":A.alphaTest>0&&(C.alphaMode="MASK",C.alphaCutoff=A.alphaTest),A.side===N.DoubleSide&&(C.doubleSided=!0),A.name!==""&&(C.name=A.name),this.serializeUserData(A,C),await this._invokeAllAsync(async function(Z){Z.writeMaterialAsync&&await Z.writeMaterialAsync(A,C)});const w=i.materials.push(C)-1;return I.materials.set(A,w),w}async processMeshAsync(A){const I=this.cache,i=this.json,C=[A.geometry.uuid];if(Array.isArray(A.material))for(let Q=0,a=A.material.length;Q<a;Q++)C.push(A.material[Q].uuid);else C.push(A.material.uuid);const l=C.join(":");if(I.meshes.has(l))return I.meshes.get(l);const w=A.geometry;let Z;A.isLineSegments?Z=zI.LINES:A.isLineLoop?Z=zI.LINE_LOOP:A.isLine?Z=zI.LINE_STRIP:A.isPoints?Z=zI.POINTS:Z=A.material.wireframe?zI.LINES:zI.TRIANGLES;const M={},m={},e=[],t=[],j={uv:"TEXCOORD_0",uv1:"TEXCOORD_1",uv2:"TEXCOORD_2",uv3:"TEXCOORD_3",color:"COLOR_0",skinWeight:"WEIGHTS_0",skinIndex:"JOINTS_0"},n=w.getAttribute("normal");n!==void 0&&!this.isNormalizedNormalAttribute(n)&&(console.warn("THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one."),w.setAttribute("normal",this.createNormalizedNormalAttribute(n)));let D=null;for(let Q in w.attributes){if(Q.slice(0,5)==="morph")continue;const a=w.attributes[Q];if(Q=j[Q]||Q.toUpperCase(),!/^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/.test(Q)&&!Q.startsWith("_")&&(Q="_"+Q),I.attributes.has(this.getUID(a))){m[Q]=I.attributes.get(this.getUID(a));continue}D=null;const R=a.array;Q==="JOINTS_0"&&!(R instanceof Uint16Array)&&!(R instanceof Uint8Array)?(console.warn('GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.'),D=cj.Utils.toTypedBufferAttribute(a,Uint16Array)):(R instanceof Uint32Array||R instanceof Int32Array)&&!Q.startsWith("_")&&(console.warn(`GLTFExporter: Attribute "${Q}" converted to type FLOAT.`),D=cj.Utils.toTypedBufferAttribute(a,Float32Array));const O=this.processAccessor(D||a,w);O!==null&&(Q.startsWith("_")||this.detectMeshQuantization(Q,a),m[Q]=O,I.attributes.set(this.getUID(a),O))}if(n!==void 0&&w.setAttribute("normal",n),Object.keys(m).length===0)return null;if(A.morphTargetInfluences!==void 0&&A.morphTargetInfluences.length>0){const Q=[],a=[],z={};if(A.morphTargetDictionary!==void 0)for(const R in A.morphTargetDictionary)z[A.morphTargetDictionary[R]]=R;for(let R=0;R<A.morphTargetInfluences.length;++R){const O={};let B=!1;for(const X in w.morphAttributes){if(X!=="position"&&X!=="normal"){B||(console.warn("GLTFExporter: Only POSITION and NORMAL morph are supported."),B=!0);continue}const v=w.morphAttributes[X][R],Y=X.toUpperCase(),S=w.attributes[X];if(I.attributes.has(this.getUID(v,!0))){O[Y]=I.attributes.get(this.getUID(v,!0));continue}const T=v.clone();if(!w.morphTargetsRelative)for(let p=0,eA=v.count;p<eA;p++)for(let CA=0;CA<v.itemSize;CA++)CA===0&&T.setX(p,v.getX(p)-S.getX(p)),CA===1&&T.setY(p,v.getY(p)-S.getY(p)),CA===2&&T.setZ(p,v.getZ(p)-S.getZ(p)),CA===3&&T.setW(p,v.getW(p)-S.getW(p));O[Y]=this.processAccessor(T,w),I.attributes.set(this.getUID(S,!0),O[Y])}t.push(O),Q.push(A.morphTargetInfluences[R]),A.morphTargetDictionary!==void 0&&a.push(z[R])}M.weights=Q,a.length>0&&(M.extras={},M.extras.targetNames=a)}const d=Array.isArray(A.material);if(d&&w.groups.length===0)return null;let c=!1;if(d&&w.index===null){const Q=[];for(let a=0,z=w.attributes.position.count;a<z;a++)Q[a]=a;w.setIndex(Q),c=!0}const J=d?A.material:[A.material],L=d?w.groups:[{materialIndex:0,start:void 0,count:void 0}];for(let Q=0,a=L.length;Q<a;Q++){const z={mode:Z,attributes:m};if(this.serializeUserData(w,z),t.length>0&&(z.targets=t),w.index!==null){let O=this.getUID(w.index);(L[Q].start!==void 0||L[Q].count!==void 0)&&(O+=":"+L[Q].start+":"+L[Q].count),I.attributes.has(O)?z.indices=I.attributes.get(O):(z.indices=this.processAccessor(w.index,w,L[Q].start,L[Q].count),I.attributes.set(O,z.indices)),z.indices===null&&delete z.indices}const R=await this.processMaterialAsync(J[L[Q].materialIndex]);R!==null&&(z.material=R),e.push(z)}c===!0&&w.setIndex(null),M.primitives=e,i.meshes||(i.meshes=[]),await this._invokeAllAsync(function(Q){Q.writeMesh&&Q.writeMesh(A,M)});const o=i.meshes.push(M)-1;return I.meshes.set(l,o),o}detectMeshQuantization(A,I){if(this.extensionsUsed[ac])return;let i;switch(I.array.constructor){case Int8Array:i="byte";break;case Uint8Array:i="unsigned byte";break;case Int16Array:i="short";break;case Uint16Array:i="unsigned short";break;default:return}I.normalized&&(i+=" normalized");const C=A.split("_",1)[0];vb[C]&&vb[C].includes(i)&&(this.extensionsUsed[ac]=!0,this.extensionsRequired[ac]=!0)}processCamera(A){const I=this.json;I.cameras||(I.cameras=[]);const i=A.isOrthographicCamera,C={type:i?"orthographic":"perspective"};return i?C.orthographic={xmag:A.right*2,ymag:A.top*2,zfar:A.far<=0?.001:A.far,znear:A.near<0?0:A.near}:C.perspective={aspectRatio:A.aspect,yfov:N.MathUtils.degToRad(A.fov),zfar:A.far<=0?.001:A.far,znear:A.near<0?0:A.near},A.name!==""&&(C.name=A.type),I.cameras.push(C)-1}processAnimation(A,I){const i=this.json,C=this.nodeMap;i.animations||(i.animations=[]),A=cj.Utils.mergeMorphTargetTracks(A.clone(),I);const l=A.tracks,w=[],Z=[];for(let m=0;m<l.length;++m){const e=l[m],t=N.PropertyBinding.parseTrackName(e.name);let j=N.PropertyBinding.findNode(I,t.nodeName);const n=kb[t.propertyName];if(t.objectName==="bones"&&(j.isSkinnedMesh===!0?j=j.skeleton.getBoneByName(t.objectIndex):j=void 0),!j||!n){console.warn('THREE.GLTFExporter: Could not export animation track "%s".',e.name);continue}const D=1;let d=e.values.length/e.times.length;n===kb.morphTargetInfluences&&(d/=j.morphTargetInfluences.length);let c;e.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline===!0?(c="CUBICSPLINE",d/=3):e.getInterpolation()===N.InterpolateDiscrete?c="STEP":c="LINEAR",Z.push({input:this.processAccessor(new N.BufferAttribute(e.times,D)),output:this.processAccessor(new N.BufferAttribute(e.values,d)),interpolation:c}),w.push({sampler:Z.length-1,target:{node:C.get(j),path:n}})}const M={name:A.name||"clip_"+i.animations.length,samplers:Z,channels:w};return this.serializeUserData(A,M),i.animations.push(M),i.animations.length-1}processSkin(A){const I=this.json,i=this.nodeMap,C=I.nodes[i.get(A)],l=A.skeleton;if(l===void 0)return null;const w=A.skeleton.bones[0];if(w===void 0)return null;const Z=[],M=new Float32Array(l.bones.length*16),m=new N.Matrix4;for(let t=0;t<l.bones.length;++t)Z.push(i.get(l.bones[t])),m.copy(l.boneInverses[t]),m.multiply(A.bindMatrix).toArray(M,t*16);return I.skins===void 0&&(I.skins=[]),I.skins.push({inverseBindMatrices:this.processAccessor(new N.BufferAttribute(M,16)),joints:Z,skeleton:i.get(w)}),C.skin=I.skins.length-1}async processNodeAsync(A){const I=this.json,i=this.options,C=this.nodeMap;if(I.nodes||(I.nodes=[]),A.pivot!==null)return await this._processNodeWithPivotAsync(A);const l={};if(i.trs){const Z=A.quaternion.toArray(),M=A.position.toArray(),m=A.scale.toArray();Ks(Z,[0,0,0,1])||(l.rotation=Z),Ks(M,[0,0,0])||(l.translation=M),Ks(m,[1,1,1])||(l.scale=m)}else A.matrixAutoUpdate&&A.updateMatrix(),zh(A.matrix)===!1&&(l.matrix=A.matrix.elements);if(A.name!==""&&(l.name=String(A.name)),this.serializeUserData(A,l),A.isMesh||A.isLine||A.isPoints){const Z=await this.processMeshAsync(A);Z!==null&&(l.mesh=Z)}else A.isCamera&&(l.camera=this.processCamera(A));A.isSkinnedMesh&&this.skins.push(A);const w=I.nodes.push(l)-1;if(C.set(A,w),A.children.length>0){const Z=[];for(let M=0,m=A.children.length;M<m;M++){const e=A.children[M];if(e.visible||i.onlyVisible===!1){const t=await this.processNodeAsync(e);t!==null&&Z.push(t)}}Z.length>0&&(l.children=Z)}return await this._invokeAllAsync(function(Z){Z.writeNode&&Z.writeNode(A,l)}),w}async _processNodeWithPivotAsync(A){const I=this.json,i=this.options,C=this.nodeMap,l=A.pivot,w={},Z=A.quaternion.toArray(),M=[A.position.x+l.x,A.position.y+l.y,A.position.z+l.z],m=A.scale.toArray();Ks(Z,[0,0,0,1])||(w.rotation=Z),Ks(M,[0,0,0])||(w.translation=M),Ks(m,[1,1,1])||(w.scale=m),w.extras={pivot:l.toArray()},A.name!==""&&(w.name=String(A.name)),this.serializeUserData(A,w);const e=I.nodes.push(w)-1;C.set(A,e);const t={},j=[-l.x,-l.y,-l.z];if(Ks(j,[0,0,0])||(t.translation=j),A.isMesh||A.isLine||A.isPoints){const d=await this.processMeshAsync(A);d!==null&&(t.mesh=d)}else A.isCamera&&(t.camera=this.processCamera(A));A.isSkinnedMesh&&this.skins.push(A);const D=[I.nodes.push(t)-1];if(A.children.length>0){const d=[];for(let c=0,J=A.children.length;c<J;c++){const L=A.children[c];if(L.visible||i.onlyVisible===!1){const o=await this.processNodeAsync(L);o!==null&&d.push(o)}}d.length>0&&(t.children=d)}return w.children=D,await this._invokeAllAsync(function(d){d.writeNode&&d.writeNode(A,w)}),e}async processSceneAsync(A){const I=this.json,i=this.options;I.scenes||(I.scenes=[],I.scene=0);const C={};A.name!==""&&(C.name=A.name),I.scenes.push(C);const l=[];for(let w=0,Z=A.children.length;w<Z;w++){const M=A.children[w];if(M.visible||i.onlyVisible===!1){const m=await this.processNodeAsync(M);m!==null&&l.push(m)}}l.length>0&&(C.nodes=l),this.serializeUserData(A,C)}async processObjectsAsync(A){const I=new N.Scene;I.name="AuxScene";for(let i=0;i<A.length;i++)I.children.push(A[i]);await this.processSceneAsync(I)}async processInputAsync(A){const I=this.options;A=A instanceof Array?A:[A],await this._invokeAllAsync(function(C){C.beforeParse&&C.beforeParse(A)});const i=[];for(let C=0;C<A.length;C++)A[C]instanceof N.Scene?await this.processSceneAsync(A[C]):i.push(A[C]);i.length>0&&await this.processObjectsAsync(i);for(let C=0;C<this.skins.length;++C)this.processSkin(this.skins[C]);for(let C=0;C<I.animations.length;++C)this.processAnimation(I.animations[C],A[0]);await this._invokeAllAsync(function(C){C.afterParse&&C.afterParse(A)})}async _invokeAllAsync(A){for(let I=0,i=this.plugins.length;I<i;I++)await A(this.plugins[I])}}class Th{constructor(A){this.writer=A,this.name="KHR_lights_punctual"}writeNode(A,I){if(!A.isLight)return;if(!A.isDirectionalLight&&!A.isPointLight&&!A.isSpotLight){console.warn("THREE.GLTFExporter: Only directional, point, and spot lights are supported.",A);return}const i=this.writer,C=i.json,l=i.extensionsUsed,w={};A.name&&(w.name=A.name),w.color=A.color.toArray(),w.intensity=A.intensity,A.isDirectionalLight?w.type="directional":A.isPointLight?(w.type="point",A.distance>0&&(w.range=A.distance)):A.isSpotLight&&(w.type="spot",A.distance>0&&(w.range=A.distance),w.spot={},w.spot.innerConeAngle=(1-A.penumbra)*A.angle,w.spot.outerConeAngle=A.angle),A.decay!==void 0&&A.decay!==2&&console.warn("THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, and expects light.decay=2."),A.target&&(A.target.parent!==A||A.target.position.x!==0||A.target.position.y!==0||A.target.position.z!==-1)&&console.warn("THREE.GLTFExporter: Light direction may be lost. For best results, make light.target a child of the light with position 0,0,-1."),l[this.name]||(C.extensions=C.extensions||{},C.extensions[this.name]={lights:[]},l[this.name]=!0);const Z=C.extensions[this.name].lights;Z.push(w),I.extensions=I.extensions||{},I.extensions[this.name]={light:Z.length-1}}}let Fh=class{constructor(A){this.writer=A,this.name="KHR_materials_unlit"}async writeMaterialAsync(A,I){if(!A.isMeshBasicMaterial)return;const C=this.writer.extensionsUsed;I.extensions=I.extensions||{},I.extensions[this.name]={},C[this.name]=!0,I.pbrMetallicRoughness.metallicFactor=0,I.pbrMetallicRoughness.roughnessFactor=.9}},Bh=class{constructor(A){this.writer=A,this.name="KHR_materials_clearcoat"}async writeMaterialAsync(A,I){if(!A.isMeshPhysicalMaterial||A.clearcoat===0)return;const i=this.writer,C=i.extensionsUsed,l={};if(l.clearcoatFactor=A.clearcoat,A.clearcoatMap){const w={index:await i.processTextureAsync(A.clearcoatMap),texCoord:A.clearcoatMap.channel};i.applyTextureTransform(w,A.clearcoatMap),l.clearcoatTexture=w}if(l.clearcoatRoughnessFactor=A.clearcoatRoughness,A.clearcoatRoughnessMap){const w={index:await i.processTextureAsync(A.clearcoatRoughnessMap),texCoord:A.clearcoatRoughnessMap.channel};i.applyTextureTransform(w,A.clearcoatRoughnessMap),l.clearcoatRoughnessTexture=w}if(A.clearcoatNormalMap){const w={index:await i.processTextureAsync(A.clearcoatNormalMap),texCoord:A.clearcoatNormalMap.channel};A.clearcoatNormalScale.x!==1&&(w.scale=A.clearcoatNormalScale.x),i.applyTextureTransform(w,A.clearcoatNormalMap),l.clearcoatNormalTexture=w}I.extensions=I.extensions||{},I.extensions[this.name]=l,C[this.name]=!0}},yh=class{constructor(A){this.writer=A,this.name="KHR_materials_dispersion"}async writeMaterialAsync(A,I){if(!A.isMeshPhysicalMaterial||A.dispersion===0)return;const C=this.writer.extensionsUsed,l={};l.dispersion=A.dispersion,I.extensions=I.extensions||{},I.extensions[this.name]=l,C[this.name]=!0}},Xh=class{constructor(A){this.writer=A,this.name="KHR_materials_iridescence"}async writeMaterialAsync(A,I){if(!A.isMeshPhysicalMaterial||A.iridescence===0)return;const i=this.writer,C=i.extensionsUsed,l={};if(l.iridescenceFactor=A.iridescence,A.iridescenceMap){const w={index:await i.processTextureAsync(A.iridescenceMap),texCoord:A.iridescenceMap.channel};i.applyTextureTransform(w,A.iridescenceMap),l.iridescenceTexture=w}if(l.iridescenceIor=A.iridescenceIOR,l.iridescenceThicknessMinimum=A.iridescenceThicknessRange[0],l.iridescenceThicknessMaximum=A.iridescenceThicknessRange[1],A.iridescenceThicknessMap){const w={index:await i.processTextureAsync(A.iridescenceThicknessMap),texCoord:A.iridescenceThicknessMap.channel};i.applyTextureTransform(w,A.iridescenceThicknessMap),l.iridescenceThicknessTexture=w}I.extensions=I.extensions||{},I.extensions[this.name]=l,C[this.name]=!0}},Yh=class{constructor(A){this.writer=A,this.name="KHR_materials_transmission"}async writeMaterialAsync(A,I){if(!A.isMeshPhysicalMaterial||A.transmission===0)return;const i=this.writer,C=i.extensionsUsed,l={};if(l.transmissionFactor=A.transmission,A.transmissionMap){const w={index:await i.processTextureAsync(A.transmissionMap),texCoord:A.transmissionMap.channel};i.applyTextureTransform(w,A.transmissionMap),l.transmissionTexture=w}I.extensions=I.extensions||{},I.extensions[this.name]=l,C[this.name]=!0}},rh=class{constructor(A){this.writer=A,this.name="KHR_materials_volume"}async writeMaterialAsync(A,I){if(!A.isMeshPhysicalMaterial||A.transmission===0)return;const i=this.writer,C=i.extensionsUsed,l={};if(l.thicknessFactor=A.thickness,A.thicknessMap){const w={index:await i.processTextureAsync(A.thicknessMap),texCoord:A.thicknessMap.channel};i.applyTextureTransform(w,A.thicknessMap),l.thicknessTexture=w}A.attenuationDistance!==1/0&&(l.attenuationDistance=A.attenuationDistance),l.attenuationColor=A.attenuationColor.toArray(),I.extensions=I.extensions||{},I.extensions[this.name]=l,C[this.name]=!0}},uh=class{constructor(A){this.writer=A,this.name="KHR_materials_ior"}async writeMaterialAsync(A,I){if(!A.isMeshPhysicalMaterial||A.ior===1.5)return;const C=this.writer.extensionsUsed,l={};l.ior=A.ior,I.extensions=I.extensions||{},I.extensions[this.name]=l,C[this.name]=!0}},Eh=class{constructor(A){this.writer=A,this.name="KHR_materials_specular"}async writeMaterialAsync(A,I){if(!A.isMeshPhysicalMaterial||A.specularIntensity===1&&A.specularColor.equals(oh)&&!A.specularIntensityMap&&!A.specularColorMap)return;const i=this.writer,C=i.extensionsUsed,l={};if(A.specularIntensityMap){const w={index:await i.processTextureAsync(A.specularIntensityMap),texCoord:A.specularIntensityMap.channel};i.applyTextureTransform(w,A.specularIntensityMap),l.specularTexture=w}if(A.specularColorMap){const w={index:await i.processTextureAsync(A.specularColorMap),texCoord:A.specularColorMap.channel};i.applyTextureTransform(w,A.specularColorMap),l.specularColorTexture=w}l.specularFactor=A.specularIntensity,l.specularColorFactor=A.specularColor.toArray(),I.extensions=I.extensions||{},I.extensions[this.name]=l,C[this.name]=!0}},hh=class{constructor(A){this.writer=A,this.name="KHR_materials_sheen"}async writeMaterialAsync(A,I){if(!A.isMeshPhysicalMaterial||A.sheen==0)return;const i=this.writer,C=i.extensionsUsed,l={};if(A.sheenRoughnessMap){const w={index:await i.processTextureAsync(A.sheenRoughnessMap),texCoord:A.sheenRoughnessMap.channel};i.applyTextureTransform(w,A.sheenRoughnessMap),l.sheenRoughnessTexture=w}if(A.sheenColorMap){const w={index:await i.processTextureAsync(A.sheenColorMap),texCoord:A.sheenColorMap.channel};i.applyTextureTransform(w,A.sheenColorMap),l.sheenColorTexture=w}l.sheenRoughnessFactor=A.sheenRoughness,l.sheenColorFactor=A.sheenColor.toArray(),I.extensions=I.extensions||{},I.extensions[this.name]=l,C[this.name]=!0}},ph=class{constructor(A){this.writer=A,this.name="KHR_materials_anisotropy"}async writeMaterialAsync(A,I){if(!A.isMeshPhysicalMaterial||A.anisotropy==0)return;const i=this.writer,C=i.extensionsUsed,l={};if(A.anisotropyMap){const w={index:await i.processTextureAsync(A.anisotropyMap)};i.applyTextureTransform(w,A.anisotropyMap),l.anisotropyTexture=w}l.anisotropyStrength=A.anisotropy,l.anisotropyRotation=A.anisotropyRotation,I.extensions=I.extensions||{},I.extensions[this.name]=l,C[this.name]=!0}},Sh=class{constructor(A){this.writer=A,this.name="KHR_materials_emissive_strength"}async writeMaterialAsync(A,I){if(!A.isMeshStandardMaterial||A.emissiveIntensity===1)return;const C=this.writer.extensionsUsed,l={};l.emissiveStrength=A.emissiveIntensity,I.extensions=I.extensions||{},I.extensions[this.name]=l,C[this.name]=!0}},Gh=class{constructor(A){this.writer=A,this.name="EXT_materials_bump"}async writeMaterialAsync(A,I){if(!A.isMeshStandardMaterial||A.bumpScale===1&&!A.bumpMap)return;const i=this.writer,C=i.extensionsUsed,l={};if(A.bumpMap){const w={index:await i.processTextureAsync(A.bumpMap),texCoord:A.bumpMap.channel};i.applyTextureTransform(w,A.bumpMap),l.bumpTexture=w}l.bumpFactor=A.bumpScale,I.extensions=I.extensions||{},I.extensions[this.name]=l,C[this.name]=!0}},xh=class{constructor(A){this.writer=A,this.name="EXT_mesh_gpu_instancing"}writeNode(A,I){if(!A.isInstancedMesh)return;const i=this.writer,C=A,l=new Float32Array(C.count*3),w=new Float32Array(C.count*4),Z=new Float32Array(C.count*3),M=new N.Matrix4,m=new N.Vector3,e=new N.Quaternion,t=new N.Vector3;for(let n=0;n<C.count;n++)C.getMatrixAt(n,M),M.decompose(m,e,t),m.toArray(l,n*3),e.toArray(w,n*4),t.toArray(Z,n*3);const j={TRANSLATION:i.processAccessor(new N.BufferAttribute(l,3)),ROTATION:i.processAccessor(new N.BufferAttribute(w,4)),SCALE:i.processAccessor(new N.BufferAttribute(Z,3))};C.instanceColor&&(j._COLOR_0=i.processAccessor(C.instanceColor)),I.extensions=I.extensions||{},I.extensions[this.name]={attributes:j},i.extensionsUsed[this.name]=!0,i.extensionsRequired[this.name]=!0}};cj.Utils={insertKeyframe:function(s,A){const i=s.getValueSize(),C=new s.TimeBufferType(s.times.length+1),l=new s.ValueBufferType(s.values.length+i),w=s.createInterpolant(new s.ValueBufferType(i));let Z;if(s.times.length===0){C[0]=A;for(let M=0;M<i;M++)l[M]=0;Z=0}else if(A<s.times[0]){if(Math.abs(s.times[0]-A)<.001)return 0;C[0]=A,C.set(s.times,1),l.set(w.evaluate(A),0),l.set(s.values,i),Z=0}else if(A>s.times[s.times.length-1]){if(Math.abs(s.times[s.times.length-1]-A)<.001)return s.times.length-1;C[C.length-1]=A,C.set(s.times,0),l.set(s.values,0),l.set(w.evaluate(A),s.values.length),Z=C.length-1}else for(let M=0;M<s.times.length;M++){if(Math.abs(s.times[M]-A)<.001)return M;if(s.times[M]<A&&s.times[M+1]>A){C.set(s.times.slice(0,M+1),0),C[M+1]=A,C.set(s.times.slice(M+1),M+2),l.set(s.values.slice(0,(M+1)*i),0),l.set(w.evaluate(A),(M+1)*i),l.set(s.values.slice((M+1)*i),(M+2)*i),Z=M+1;break}}return s.times=C,s.values=l,Z},mergeMorphTargetTracks:function(s,A){const I=[],i={},C=s.tracks;for(let l=0;l<C.length;++l){let w=C[l];const Z=N.PropertyBinding.parseTrackName(w.name),M=N.PropertyBinding.findNode(A,Z.nodeName);if(Z.propertyName!=="morphTargetInfluences"||Z.propertyIndex===void 0){I.push(w);continue}if(w.createInterpolant!==w.InterpolantFactoryMethodDiscrete&&w.createInterpolant!==w.InterpolantFactoryMethodLinear){if(w.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline)throw new Error("THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.");console.warn("THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead."),w=w.clone(),w.setInterpolation(N.InterpolateLinear)}const m=M.morphTargetInfluences.length,e=M.morphTargetDictionary[Z.propertyIndex];if(e===void 0)throw new Error("THREE.GLTFExporter: Morph target name not found: "+Z.propertyIndex);let t;if(i[M.uuid]===void 0){t=w.clone();const n=new t.ValueBufferType(m*t.times.length);for(let D=0;D<t.times.length;D++)n[D*m+e]=t.values[D];t.name=(Z.nodeName||"")+".morphTargetInfluences",t.values=n,i[M.uuid]=t,I.push(t);continue}const j=w.createInterpolant(new w.ValueBufferType(1));t=i[M.uuid];for(let n=0;n<t.times.length;n++)t.values[n*m+e]=j.evaluate(t.times[n]);for(let n=0;n<w.times.length;n++){const D=this.insertKeyframe(t,w.times[n]);t.values[D*m+e]=w.values[n]}}return s.tracks=I,s},toTypedBufferAttribute:function(s,A){const I=new N.BufferAttribute(new A(s.count*s.itemSize),s.itemSize,!1);if(!s.normalized&&!s.isInterleavedBufferAttribute)return I.array.set(s.array),I;for(let i=0,C=s.count;i<C;i++)for(let l=0;l<s.itemSize;l++)I.setComponent(i,l,s.getComponent(i,l));return I}};const qb={low:{maxTextureSize:512,optimize:!0,preserveMaterials:!1},medium:{maxTextureSize:1024,optimize:!0,preserveMaterials:!0},high:{maxTextureSize:2048,optimize:!1,preserveMaterials:!0},ultra:{maxTextureSize:4096,optimize:!1,preserveMaterials:!0}};class bc{eventListeners=new Map;currentExport=null;constructor(){["exportStarted","exportProgress","exportComplete","exportError","exportCancelled"].forEach(I=>this.eventListeners.set(I,new Set))}async export(A,I={}){const i=performance.now();this.currentExport=new AbortController;const C=this.resolveOptions(I),l=this.getFilename(C);this.emit("exportStarted",{format:C.format,filename:l});try{this.emitProgress("preparing",0,"Preparing export...");const w=this.prepareExportGroup(A,C);this.emitProgress("processing",.2,"Processing geometry..."),await this.processNormals(w,C),this.emitProgress("processing",.3,"Fixing materials..."),this.fixMaterialsForExport(w,C.forceOpaque),C.optimize&&(this.emitProgress("processing",.4,"Optimizing geometry..."),this.optimizeGeometry(w)),this.emitProgress("converting",.5,"Converting to export format...");let Z;switch(C.format){case"gltf":case"glb":Z=await this.exportGLTF(w,C,l,i);break;case"obj":Z=await this.exportOBJ(w,C,l,i);break;case"stl":Z=await this.exportSTL(w,C,l,i);break;case"usdz":Z=await this.exportUSDZ(w,C,l,i);break;default:throw this.createError("INVALID_FORMAT",`Unknown format: ${C.format}`)}return this.emitProgress("finalizing",.9,"Finalizing export..."),this.disposeExportGroup(w),this.emitProgress("finalizing",1,"Export complete!"),this.emit("exportComplete",Z),Z}catch(w){const Z=this.createError("UNKNOWN",w instanceof Error?w.message:"Unknown error",w instanceof Error?w:void 0);throw this.emit("exportError",Z),Z}finally{this.currentExport=null}}cancel(){this.currentExport&&(this.currentExport.abort(),this.emit("exportCancelled",{filename:""}))}on(A,I){const i=this.eventListeners.get(A);return i&&i.add(I),()=>this.off(A,I)}off(A,I){const i=this.eventListeners.get(A);i&&i.delete(I)}emit(A,I){const i=this.eventListeners.get(A);i&&i.forEach(C=>C(I))}emitProgress(A,I,i){this.emit("exportProgress",{phase:A,progress:I,message:i})}resolveOptions(A){const I=A.quality||"high",i=qb[I];return{filename:A.filename||"schematic_export",format:A.format||"glb",quality:I,normalMode:A.normalMode||"double-sided",embedTextures:A.embedTextures??!0,maxTextureSize:A.maxTextureSize??i.maxTextureSize,animations:A.animations||[],includeCustomExtensions:A.includeCustomExtensions??!1,centerAtOrigin:A.centerAtOrigin??!1,scale:A.scale??1,optimize:A.optimize??i.optimize,visibleOnly:A.visibleOnly??!0,preserveMaterials:A.preserveMaterials??i.preserveMaterials,forceOpaque:A.forceOpaque??!1,onProgress:A.onProgress||(()=>{}),onComplete:A.onComplete||(()=>{}),onError:A.onError||(()=>{})}}getFilename(A){let I=A.filename;const i=`.${A.format}`;return I=I.replace(/\.[^/.]+$/,""),`${I}${i}`}prepareExportGroup(A,I){const i=new b.Group;i.name="export_group";const C=this.deepCloneObject(A);return I.visibleOnly&&this.filterVisibleMeshes(C),I.scale!==1&&C.scale.multiplyScalar(I.scale),I.centerAtOrigin&&this.centerAtOrigin(C),i.add(C),i}filterVisibleMeshes(A){const I=[];A.traverse(i=>{i.visible||I.push(i)}),I.forEach(i=>{i.parent&&i.parent.remove(i)})}centerAtOrigin(A){const i=new b.Box3().setFromObject(A).getCenter(new b.Vector3);A.position.sub(i)}async processNormals(A,I){const i=I.normalMode;A.traverse(C=>{if(C instanceof b.Mesh&&C.geometry){const l=C.geometry;switch(i){case"flip":this.flipFaceWinding(l);break;case"recompute":this.flipFaceWinding(l),l.computeVertexNormals();break;case"double-sided":this.setDoubleSided(C);break}}})}deepCloneObject(A){const I=A.clone(!0);return I.traverse(i=>{if(i instanceof b.Mesh&&i.geometry){const C=i.geometry,l=new b.BufferGeometry;for(const Z of Object.keys(C.attributes)){const M=C.getAttribute(Z);if(M){const m=M.array,e=m.constructor,t=new e(m.length);t.set(m);const j=new b.BufferAttribute(t,M.itemSize,M.normalized);l.setAttribute(Z,j)}}const w=C.getIndex();if(w){const Z=w.array,M=Z.constructor,m=new M(Z.length);m.set(Z),l.setIndex(new b.BufferAttribute(m,1))}for(const Z of C.groups)l.addGroup(Z.start,Z.count,Z.materialIndex);C.boundingBox&&(l.boundingBox=C.boundingBox.clone()),C.boundingSphere&&(l.boundingSphere=C.boundingSphere.clone()),i.geometry=l}i instanceof b.Mesh&&i.material&&(Array.isArray(i.material)?i.material=i.material.map(C=>C.clone()):i.material=i.material.clone())}),I}flipFaceWinding(A){const I=A.getIndex();if(!I){const C=A.getAttribute("position");if(C){const l=C.array,w=A.getAttribute("normal")?.array,Z=A.getAttribute("uv")?.array;for(let M=0;M<l.length;M+=9)if(this.swapArrayValues(l,M+3,M+6,3),w&&this.swapArrayValues(w,M+3,M+6,3),Z){const m=M/9*6;this.swapArrayValues(Z,m+2,m+4,2)}C.needsUpdate=!0}return}const i=I.array;for(let C=0;C<i.length;C+=3){const l=i[C+1];i[C+1]=i[C+2],i[C+2]=l}I.needsUpdate=!0}swapArrayValues(A,I,i,C){for(let l=0;l<C;l++){const w=A[I+l];A[I+l]=A[i+l],A[i+l]=w}}setDoubleSided(A){(Array.isArray(A.material)?A.material:[A.material]).forEach(i=>{i&&(i.side=b.DoubleSide)})}fixMaterialsForExport(A,I=!1){A.traverse(i=>{i instanceof b.Mesh&&(Array.isArray(i.material)?i.material:[i.material]).forEach(l=>{l&&(l.depthTest=!0,l.depthWrite=!0,this.setNearestFilterOnMaterial(l),I?(l.transparent=!1,l.opacity=1,l.alphaTest=0):l.transparent&&l.alphaTest===0&&(l.alphaTest=.5))})})}setNearestFilterOnMaterial(A){["map","alphaMap","aoMap","bumpMap","displacementMap","emissiveMap","envMap","lightMap","metalnessMap","normalMap","roughnessMap","specularMap"].forEach(i=>{const C=A[i];C&&C.isTexture&&(C.magFilter=b.NearestFilter,C.minFilter=b.NearestFilter,C.needsUpdate=!0)})}optimizeGeometry(A){A.traverse(I=>{if(I instanceof b.Mesh&&I.geometry){const i=I.geometry;i.getIndex(),i.computeBoundingBox(),i.computeBoundingSphere()}})}async exportGLTF(A,I,i,C){const l=new cj,w=I.format==="glb",Z=await new Promise((t,j)=>{l.parse(A,n=>t(n),n=>j(n),{binary:w,includeCustomExtensions:I.includeCustomExtensions,maxTextureSize:I.maxTextureSize,embedImages:I.embedTextures,animations:I.animations})});let M,m=i;if(w)M=new Blob([Z],{type:"application/octet-stream"}),m.endsWith(".glb")||(m=m.replace(/\.[^/.]+$/,"")+".glb");else{const t=JSON.stringify(Z,null,2);M=new Blob([t],{type:"application/json"}),m.endsWith(".gltf")||(m=m.replace(/\.[^/.]+$/,"")+".gltf")}const e=performance.now()-C;return{success:!0,filename:m,format:I.format,size:M.size,duration:e,data:M,downloadUrl:URL.createObjectURL(M)}}async exportOBJ(A,I,i,C){const{OBJExporter:l}=await Promise.resolve().then(()=>vAA),Z=new l().parse(A),M=new Blob([Z],{type:"text/plain"}),m=i.endsWith(".obj")?i:i.replace(/\.[^/.]+$/,"")+".obj",e=performance.now()-C;return{success:!0,filename:m,format:"obj",size:M.size,duration:e,data:M,downloadUrl:URL.createObjectURL(M)}}async exportSTL(A,I,i,C){const{STLExporter:l}=await Promise.resolve().then(()=>HAA),Z=new l().parse(A,{binary:!0}),M=Z instanceof DataView?Z.buffer:Z,m=new Blob([M],{type:"application/octet-stream"}),e=i.endsWith(".stl")?i:i.replace(/\.[^/.]+$/,"")+".stl",t=performance.now()-C;return{success:!0,filename:e,format:"stl",size:m.size,duration:t,data:m,downloadUrl:URL.createObjectURL(m)}}async exportUSDZ(A,I,i,C){const{USDZExporter:l}=await Promise.resolve().then(()=>oIA),w=new l;this.convertToStandardMaterials(A);const Z=await w.parseAsync(A),M=new Blob([Z],{type:"application/octet-stream"}),m=i.endsWith(".usdz")?i:i.replace(/\.[^/.]+$/,"")+".usdz",e=performance.now()-C;return{success:!0,filename:m,format:"usdz",size:M.size,duration:e,data:M,downloadUrl:URL.createObjectURL(M)}}convertToStandardMaterials(A){const I=[];A.traverse(C=>{C instanceof b.Mesh&&C.material&&C.parent&&I.push({mesh:C,parent:C.parent})});const i=C=>{if(C instanceof b.MeshStandardMaterial){const w=C.clone();return this.fixTextureFiltering(w),this.fixTransparencyForUSDZ(w),w}const l=new b.MeshStandardMaterial;if(l.name=C.name,l.side=C.side,"color"in C&&C.color instanceof b.Color&&l.color.copy(C.color),"map"in C&&C.map){const w=this.upscaleTextureForUSDZ(C.map);l.map=w}return C.transparent&&C.opacity<1?(l.transparent=!1,l.opacity=1,l.alphaTest=.5):(l.transparent=!1,l.opacity=1,l.alphaTest=C.alphaTest>0?C.alphaTest:.5),l.roughness=1,l.metalness=0,l};for(const{mesh:C,parent:l}of I)if(Array.isArray(C.material)){const w=C.geometry,Z=w.groups;if(Z.length>0){for(let M=0;M<Z.length;M++){const m=Z[M],e=m.materialIndex??M,t=C.material[e];if(!t)continue;const j=new b.BufferGeometry;for(const D of Object.keys(w.attributes))j.setAttribute(D,w.getAttribute(D));if(w.index){const d=w.index.array.slice(m.start,m.start+m.count);j.setIndex(new b.BufferAttribute(d,1))}else j.setDrawRange(m.start,m.count);const n=new b.Mesh(j,i(t));n.name=`${C.name}_part${M}`,n.position.copy(C.position),n.rotation.copy(C.rotation),n.scale.copy(C.scale),l.add(n)}l.remove(C)}else C.material=i(C.material[0])}else C.material=i(C.material)}fixTextureFiltering(A){A.map&&(A.map=this.upscaleTextureForUSDZ(A.map))}upscaleTextureForUSDZ(A,I=8){const i=A.image;if(!i)return A;const C=document.createElement("canvas"),l=C.getContext("2d");if(!l)return A;const w=i.width||i.naturalWidth||256,Z=i.height||i.naturalHeight||256;C.width=w*I,C.height=Z*I,l.imageSmoothingEnabled=!1,l.drawImage(i,0,0,w,Z,0,0,C.width,C.height);const M=new b.CanvasTexture(C);return M.wrapS=A.wrapS,M.wrapT=A.wrapT,M.flipY=A.flipY,M.colorSpace=A.colorSpace,M.needsUpdate=!0,M}fixTransparencyForUSDZ(A){A.transparent=!1,A.opacity=1,A.alphaTest===0&&(A.alphaTest=.5)}disposeExportGroup(A){A.traverse(I=>{I instanceof b.Mesh&&(I.geometry&&I.geometry.dispose(),(Array.isArray(I.material)?I.material:[I.material]).forEach(C=>{C&&C.dispose&&C.dispose()}))})}createError(A,I,i){return{message:I,code:A,originalError:i}}download(A){A.downloadUrl||(A.downloadUrl=URL.createObjectURL(A.data));const I=document.createElement("a");I.href=A.downloadUrl,I.download=A.filename,document.body.appendChild(I),I.click(),document.body.removeChild(I)}revokeUrl(A){A.downloadUrl&&(URL.revokeObjectURL(A.downloadUrl),A.downloadUrl=void 0)}static getAvailableFormats(){return["gltf","glb","obj","stl","usdz"]}static getFormatDescription(A){return{gltf:"GL Transmission Format (JSON) - Best compatibility",glb:"GL Transmission Format (Binary) - Compact single file",obj:"Wavefront OBJ - Universal but no materials",stl:"Stereolithography - 3D printing ready",usdz:"Universal Scene Description (Apple AR) - iOS/macOS AR viewing"}[A]}static getFormatExtension(A){return`.${A}`}static getQualityPreset(A){return{...qb[A]}}}class UD extends Ds.EventEmitter{name;schematicWrapper;schematicRenderer;meshes=[];worldMeshBuilder;eventEmitter;sceneManager;chunkMeshes=new Map;chunkDimensions={chunkWidth:16,chunkHeight:16,chunkLength:16};id;group;position;rotation;scale;opacity;visible;meshBoundingBox;renderingBounds;bounds;meshesReady;_cachedDimensions=null;blockEntitiesMap=null;constructor(A,I,i,C){if(super(),this.id=I,this.name=I,this.schematicWrapper=i,this.schematicRenderer=A,!this.schematicRenderer)throw new Error("SchematicRenderer is required.");if(!this.schematicRenderer.worldMeshBuilder)throw new Error("WorldMeshBuilder is required.");this.worldMeshBuilder=A.worldMeshBuilder,this.eventEmitter=A.eventEmitter,this.sceneManager=A.sceneManager,this.position=new b.Vector3,this.rotation=new b.Euler,this.scale=new b.Vector3(1,1,1),this.opacity=1,this.visible=C?.visible??!0,C&&(C.position&&(Array.isArray(C.position)?this.position.set(C.position[0],C.position[1],C.position[2]):this.position.copy(C.position)),C.rotation&&(Array.isArray(C.rotation)?this.rotation.set(C.rotation[0],C.rotation[1],C.rotation[2]):this.rotation.copy(C.rotation)),C.scale&&(Array.isArray(C.scale)?this.scale.set(C.scale[0],C.scale[1],C.scale[2]):typeof C.scale=="number"?this.scale.setScalar(C.scale):this.scale.copy(C.scale)),C.opacity!==void 0&&(this.opacity=C.opacity),C.visible!==void 0&&(this.visible=C.visible)),this.schematicRenderer.options.chunkSideLength&&(this.chunkDimensions={chunkWidth:this.schematicRenderer.options.chunkSideLength,chunkHeight:this.schematicRenderer.options.chunkSideLength,chunkLength:this.schematicRenderer.options.chunkSideLength});const l=this.getDimensions(),w=this.getTightDimensions(),Z=w[0]>0&&w[1]>0&&w[2]>0?w:l;this.position=new b.Vector3(-Z[0]/2+.5,.5,-Z[2]/2+.5),C?.meshBoundingBox?this.meshBoundingBox=C.meshBoundingBox:this.meshBoundingBox=[this.position.toArray(),this.position.clone().add(new b.Vector3(l[0],l[1],l[2])).toArray()],this.renderingBounds={min:new b.Vector3(0,0,0),max:new b.Vector3(l[0],l[1],l[2]),enabled:!1},C?.renderingBounds&&(Array.isArray(C.renderingBounds.min)?this.renderingBounds.min=new b.Vector3(C.renderingBounds.min[0],C.renderingBounds.min[1],C.renderingBounds.min[2]):C.renderingBounds.min instanceof b.Vector3&&(this.renderingBounds.min=C.renderingBounds.min.clone()),Array.isArray(C.renderingBounds.max)?this.renderingBounds.max=new b.Vector3(C.renderingBounds.max[0],C.renderingBounds.max[1],C.renderingBounds.max[2]):C.renderingBounds.max instanceof b.Vector3&&(this.renderingBounds.max=C.renderingBounds.max.clone()));const M=this;this.bounds={get minX(){return M.renderingBounds.min.x},set minX(m){M.renderingBounds.min.x=m,M.updateRenderingBounds()},get maxX(){return M.renderingBounds.max.x},set maxX(m){M.renderingBounds.max.x=m,M.updateRenderingBounds()},get minY(){return M.renderingBounds.min.y},set minY(m){M.renderingBounds.min.y=m,M.updateRenderingBounds()},get maxY(){return M.renderingBounds.max.y},set maxY(m){M.renderingBounds.max.y=m,M.updateRenderingBounds()},get minZ(){return M.renderingBounds.min.z},set minZ(m){M.renderingBounds.min.z=m,M.updateRenderingBounds()},get maxZ(){return M.renderingBounds.max.z},set maxZ(m){M.renderingBounds.max.z=m,M.updateRenderingBounds()},get enabled(){return M.renderingBounds.enabled||!1},set enabled(m){M.renderingBounds.enabled=m,M.updateRenderingBounds(),M.showRenderingBoundsHelper(m)},reset(){const m=M.getDimensions();return M.setRenderingBounds(new b.Vector3(0,0,0),new b.Vector3(m[0],m[1],m[2])),"Reset to full dimensions"},showHelper(m=!0){return M.showRenderingBoundsHelper(m),`Helper ${m?"shown":"hidden"}`},apply(){return M.rebuildMesh(),"Bounds applied and mesh rebuilt"}},this.group=new b.Group,this.group.name=I,this.updateTransform(),this.sceneManager.add(this.group),this.group.visible=this.visible,this.visible?this.meshesReady=this.buildMeshes():this.meshesReady=Promise.resolve(),this.setupPropertyWatchers()}_propertyWatcherTimer=null;setupPropertyWatchers(){let A=this.position.clone(),I=this.rotation.clone(),i=this.scale.clone(),C=this.opacity,l=this.visible;const w=()=>{this.position.equals(A)||(A=this.position.clone(),this.updateTransform(),this.emitPropertyChanged("position",this.position)),this.rotation.equals(I)||(I=this.rotation.clone(),this.updateTransform(),this.emitPropertyChanged("rotation",this.rotation)),this.scale.equals(i)||(i=this.scale.clone(),this.updateTransform(),this.emitPropertyChanged("scale",this.scale)),this.opacity!==C&&(C=this.opacity,this.updateMeshMaterials("opacity"),this.emitPropertyChanged("opacity",this.opacity)),this.visible!==l&&(l=this.visible,this.updateMeshVisibility(),this.emitPropertyChanged("visible",this.visible)),this._propertyWatcherTimer=setTimeout(w,250)};this._propertyWatcherTimer=setTimeout(w,250)}getDimensions(){if(!this._cachedDimensions){const A=this.schematicWrapper.get_dimensions();this._cachedDimensions=[A[0],A[1],A[2]]}return this._cachedDimensions}getTightDimensions(){const A=this.schematicWrapper.get_tight_dimensions();return[A[0],A[1],A[2]]}getTightBoundsMin(){const A=this.schematicWrapper.get_tight_bounds_min();return A?[A[0],A[1],A[2]]:null}getTightBoundsMax(){const A=this.schematicWrapper.get_tight_bounds_max();return A?[A[0],A[1],A[2]]:null}displayPerformanceResults(A){if(!A){console.warn("displayPerformanceResults called with no data!");return}let I=0,i=0;A.chunkProcessingData&&A.chunkProcessingData.forEach(C=>{I+=C.blockCount||0,i+=C.meshCount||0}),A.breakdown&&A.breakdown.length>0?(console.warn("Detailed Breakdown:"),A.breakdown.forEach(C=>{console.warn(` - ${C.operationId}: ${C.duration!==void 0?C.duration.toFixed(2):"0.00"}ms`)})):(console.warn("No breakdown data available."),A.timingData&&console.log("Raw timing data:",JSON.stringify(A.timingData)))}emitPropertyChanged(A,I){this.eventEmitter.emit("schematicPropertyChanged",{schematic:this,property:A,value:I})}updateTransform(){this.group.position.copy(this.position),this.group.rotation.copy(this.rotation),this.group.scale.copy(this.scale)}syncTransformFromGroup(){this.position.copy(this.group.position),this.rotation.copy(this.group.rotation),this.scale.copy(this.group.scale),this.emitPropertyChanged("transform",{position:this.position,rotation:this.rotation,scale:this.scale})}applyPropertiesToObjects(A){const I=this.opacity<1;A.forEach(i=>{i.visible=this.visible,this.visible&&i.traverse(C=>{C instanceof b.Mesh&&(C.castShadow=!0,C.receiveShadow=!0,C.frustumCulled=!0,(Array.isArray(C.material)?C.material:[C.material]).forEach(w=>{w&&(I&&(w.opacity=this.opacity),I&&(w.transparent=!0))}))})})}async export(A={}){await this.meshesReady;const I=new bc,i=A.onProgress;this.schematicRenderer.options.enableProgressBar&&this.schematicRenderer.uiManager&&(this.schematicRenderer.uiManager.showProgressBar(`Exporting ${this.name}`),I.on("exportProgress",l=>{this.schematicRenderer.uiManager?.updateProgress(l.progress,l.message),i?.(l)}),I.on("exportComplete",()=>{setTimeout(()=>{this.schematicRenderer.uiManager?.hideProgressBar()},1e3)}),I.on("exportError",()=>{this.schematicRenderer.uiManager?.hideProgressBar()}));const C={filename:A.filename||`${this.name}_schematic`,format:A.format||"glb",quality:A.quality||"high",normalMode:A.normalMode||"double-sided",...A};try{const l=await I.export(this.group,C);return A.onComplete||(I.download(l),setTimeout(()=>I.revokeUrl(l),5e3)),console.log(`Successfully exported schematic "${this.name}" as ${l.filename}`),l}catch(l){throw console.error("Error exporting schematic:",l),l}}async exportAsGLB(A){return this.export({format:"glb",filename:A||this.name})}async exportAsGLTF(A={}){const I=A.binary?"glb":"gltf";await this.export({filename:A.filename||`${this.name}_schematic`,format:I,includeCustomExtensions:A.includeCustomExtensions,maxTextureSize:A.maxTextureSize,embedTextures:A.embedImages,animations:A.animations})}async buildMeshes(){if(!this.visible)return;const{meshes:A,chunkMap:I}=await this.buildSchematicMeshes(this,this.chunkDimensions);this.chunkMeshes=I;try{const i=await this.worldMeshBuilder.buildSignMeshes(this);A.push(...i)}catch(i){console.warn("[SchematicObject] sign build failed",i)}this.applyPropertiesToObjects(A),A.forEach(i=>{this.group.add(i)}),this.updateTransform(),this.group.visible=this.visible,this.meshes=A,this.group.updateMatrixWorld(!0),this.group.updateWorldMatrix(!0,!0),this.sceneManager.schematicRenderer.options.showRenderingBoundsHelper&&this.createRenderingBoundsHelper(),this.sceneManager.schematicRenderer.options.callbacks?.onSchematicRendered?.(this.name)}reportBuildProgress(A,I,i,C){if(this.schematicRenderer.options.enableProgressBar&&this.schematicRenderer.uiManager){let l=A;i!==void 0&&C!==void 0&&(l=`${A} (${C}/${i} chunks)`),this.schematicRenderer.uiManager.isProgressBarVisible()||this.schematicRenderer.uiManager.showProgressBar("Building Schematic"),this.schematicRenderer.uiManager.updateProgress(I,l),I>=1&&this.schematicRenderer.uiManager.hideProgressBar()}}async buildSchematicMeshes(A,I={chunkWidth:16,chunkHeight:16,chunkLength:16},i=this.schematicRenderer.options.meshBuildingMode||"incremental"){const C=bI.startSession(this.id,i);this.schematicRenderer.renderManager?.renderer&&bI.setRenderer(this.schematicRenderer.renderManager.renderer),bI.startOperation(`schematic-build-${i}`,{schematicId:this.id,schematicName:this.name,buildMode:i,chunkDimensions:I}),bI.takeMemorySnapshot(`schematic-build-${i}-start`);const l=performance.memory?performance.memory.usedJSHeapSize:0;try{let w;switch(i){case"immediate":w=await this.buildSchematicMeshesImmediate(A,I);break;case"incremental":w=await this.buildSchematicMeshesIncremental(A,I);break;case"instanced":w=await this.buildSchematicMeshesInstanced(A);break;case"batched":w=await this.buildSchematicMeshesBatched(A,I);break;default:throw new Error(`Invalid build mode: ${i}. Use 'immediate', 'incremental', 'instanced', or 'batched'.`)}const M=(performance.memory?performance.memory.usedJSHeapSize:0)-l;bI.recordChunkProcessing({chunkId:`${this.id}-complete`,chunkCoords:[0,0,0],processingTime:performance.now()-bI.getCurrentOperationStartTime?.()||0,blockCount:w.meshes.length,meshCount:w.meshes.length,memoryUsed:M,totalVertices:w.meshes.length*100,totalIndices:w.meshes.length*150,materialGroups:w.meshes.length,blockTypes:["schematic-complete"],renderingPhases:[],blockTypeTimings:new Map,geometryStats:{facesCulled:0,facesGenerated:w.meshes.length,cullingEfficiency:0,averageVerticesPerBlock:100,textureAtlasUsage:[]},memoryBreakdown:{vertexBuffers:M*.4,indexBuffers:M*.3,materials:M*.1,textures:M*.1,other:M*.1}}),bI.takeMemorySnapshot(`schematic-build-${i}-end`),bI.endOperation(`schematic-build-${i}`);const m=bI.endSession(C);return m&&(this.schematicRenderer.options.debugOptions?.logBuildPerformance&&this.displayPerformanceResults(m),typeof window<"u"&&window.dispatchEvent(new CustomEvent("schematicRenderComplete",{detail:m}))),w}catch(w){throw bI.endOperation(`schematic-build-${i}`),w}}async buildSchematicMeshesImmediate(A,I={chunkWidth:16,chunkHeight:16,chunkLength:16}){const i=performance.now(),C=A.schematicWrapper;this.reportBuildProgress("Initializing pipeline...",.05);const l=this.getPalettes(C);bI.startOperation("Palette Precomputation"),await this.worldMeshBuilder.precomputePaletteGeometries(l.default),bI.endOperation("Palette Precomputation"),this.reportBuildProgress("Creating chunk iterator...",.1),bI.startOperation("Chunk Iterator Creation");const w=C.create_lazy_chunk_iterator(I.chunkWidth,I.chunkHeight,I.chunkLength,"bottom_up",0,0,0);bI.endOperation("Chunk Iterator Creation");const Z=w.total_chunks();if(Z===0)return this.reportBuildProgress("Schematic build complete (no chunks)",1,0,0),{meshes:[],chunkMap:new Map};const M=new Map,m=A.renderingBounds?.enabled?A.renderingBounds:void 0;let e=0,t=0;const j=Math.max(1,Math.floor(Z/20));this.reportBuildProgress("Processing chunks with minimal memory...",.15,Z,0),bI.startOperation("Process All Chunks");const n=navigator.hardwareConcurrency||4,D=[],d=async Q=>{const{chunk_x:a,chunk_y:z,chunk_z:R,blocks:O}=Q;if(m?.enabled){const X=a*I.chunkWidth,v=z*I.chunkHeight,Y=R*I.chunkLength,S=X+I.chunkWidth,T=v+I.chunkHeight,p=Y+I.chunkLength;if(S<m.min.x||X>m.max.x||T<m.min.y||v>m.max.y||p<m.min.z||Y>m.max.z){e++,e%j===0&&this.reportBuildProgress("Processing chunks (bounds culled)...",.15+e/Z*.8,Z,e);return}}const B=await this.worldMeshBuilder.getChunkMesh({blocks:O,chunk_x:a,chunk_y:z,chunk_z:R},A,m);if(e++,B&&B.length>0){const X=`${a},${z},${R}`;M.set(X,B),this.applyPropertiesToObjects(B),B.forEach(v=>{this.group.add(v)}),this.schematicRenderer.invalidate(),t+=B.length}e%j===0&&this.reportBuildProgress("Processing chunks...",.15+e/Z*.8,Z,e)};for(;w.has_next();){const Q=w.next();if(!Q)break;D.length>=n&&await Promise.race(D);const a=d(Q).then(()=>{const z=D.indexOf(a);z>-1&&D.splice(z,1)});D.push(a)}await Promise.all(D),bI.endOperation("Process All Chunks"),this.reportBuildProgress("Finalizing scene...",.95,Z,e),this.group.updateMatrixWorld(!0);const c=performance.now()-i,J=Array.from(this.group.children);typeof window<"u"&&window.dispatchEvent(new CustomEvent("schematicRenderComplete",{detail:{schematicId:this.id,schematicName:this.name,totalChunks:Z,processedChunks:e,buildTimeMs:c,meshCount:t,optimized:!0,immediate:!0,trueLazy:!0}}));const L=this.schematicRenderer.renderManager?.renderer;L&&L.info&&(console.log(`FINAL TRUE LAZY STATS - Draw Calls: ${L.info.render.calls}, Tris: ${L.info.render.triangles}`),console.log(`Memory - Geometries: ${L.info.memory.geometries}, Textures: ${L.info.memory.textures}`));const o=this.worldMeshBuilder.getPaletteStats();return console.log(`Palette Cache - ${o.paletteSize} block types, ${(o.memoryEstimate/1024/1024).toFixed(1)}MB`),this.reportBuildProgress("TRUE lazy build complete",1,Z,e),setTimeout(()=>{this.schematicRenderer.uiManager&&this.schematicRenderer.uiManager.hideProgressBar()},500),{meshes:J,chunkMap:M}}computeChunkAprons(A,I){const i=I.chunkWidth,C=I.chunkHeight,l=I.chunkLength,w=(e,t,j)=>`${e},${t},${j}`,Z=(e,t)=>{if(e instanceof Int32Array)for(let j=0;j<e.length;j+=4)t(e[j],e[j+1],e[j+2],e[j+3]);else if(Array.isArray(e))for(const j of e)t(j[0],j[1],j[2],j[3])},M=new Map;for(const e of A){const t=e.chunk_x*i,j=e.chunk_x*i+i-1,n=e.chunk_y*C,D=e.chunk_y*C+C-1,d=e.chunk_z*l,c=e.chunk_z*l+l-1,J={negX:[],posX:[],negY:[],posY:[],negZ:[],posZ:[]};Z(e.blocks,(L,o,Q,a)=>{L===t&&J.negX.push(L,o,Q,a),L===j&&J.posX.push(L,o,Q,a),o===n&&J.negY.push(L,o,Q,a),o===D&&J.posY.push(L,o,Q,a),Q===d&&J.negZ.push(L,o,Q,a),Q===c&&J.posZ.push(L,o,Q,a)}),M.set(w(e.chunk_x,e.chunk_y,e.chunk_z),J)}const m=new Map;for(const e of A){const t=e.chunk_x,j=e.chunk_y,n=e.chunk_z,D=[],d=(o,Q)=>{const a=M.get(o);a&&D.push(Q(a))};d(w(t+1,j,n),o=>o.negX),d(w(t-1,j,n),o=>o.posX),d(w(t,j+1,n),o=>o.negY),d(w(t,j-1,n),o=>o.posY),d(w(t,j,n+1),o=>o.negZ),d(w(t,j,n-1),o=>o.posZ);let c=0;for(const o of D)c+=o.length;if(c===0)continue;const J=new Int32Array(c);let L=0;for(const o of D)J.set(o,L),L+=o.length;m.set(w(t,j,n),J)}return m}async buildSchematicMeshesIncremental(A,I={chunkWidth:16,chunkHeight:16,chunkLength:16}){const i=performance.now(),C=this.schematicRenderer.renderManager?.renderer,l=A.schematicWrapper,w=this.getPalettes(l);await this.worldMeshBuilder.precomputePaletteGeometries(w.default),await new Promise(n=>setTimeout(n,100));const Z=l.create_lazy_chunk_iterator(I.chunkWidth,I.chunkHeight,I.chunkLength,"bottom_up",0,0,0),M=Z.total_chunks();if(M===0)return this.reportBuildProgress("Schematic build complete (no chunks)",1,0,0),{meshes:[],chunkMap:new Map};const m=new Map;let e=0;this.reportBuildProgress("Processing optimized chunks...",0,M,0);const t=A.renderingBounds?.enabled?A.renderingBounds:void 0;let j=0;return bI.startOperation("schematic-build-incremental"),bI.startOperation("Process All Chunks"),new Promise(async(n,D)=>{try{const d=[];for(;Z.has_next();){const Q=Z.next();if(!Q)break;const{chunk_x:a,chunk_y:z,chunk_z:R,blocks:O}=Q;if(t?.enabled){const B=a*I.chunkWidth,X=z*I.chunkHeight,v=R*I.chunkLength,Y=B+I.chunkWidth,S=X+I.chunkHeight,T=v+I.chunkLength;if(Y<t.min.x||B>t.max.x||S<t.min.y||X>t.max.y||T<t.min.z||v>t.max.z)continue}d.push({chunk_x:a,chunk_y:z,chunk_z:R,blocks:O})}const c=this.computeChunkAprons(d,I),J=8,L=d.length;for(let Q=0;Q<L;Q+=J){const a=Math.min(Q+J,L),R=d.slice(Q,a).map(({chunk_x:B,chunk_y:X,chunk_z:v,blocks:Y})=>this.worldMeshBuilder.getChunkMesh({blocks:Y,chunk_x:B,chunk_y:X,chunk_z:v,apronBlocks:c.get(`${B},${X},${v}`)},A,t).then(S=>({chunk_x:B,chunk_y:X,chunk_z:v,meshes:S}))),O=await Promise.all(R);for(const{chunk_x:B,chunk_y:X,chunk_z:v,meshes:Y}of O)if(j++,Y&&Y.length>0){const S=`${B},${X},${v}`;m.set(S,Y),this.applyPropertiesToObjects(Y),Y.forEach(T=>this.group.add(T)),e+=Y.length,this.schematicRenderer.invalidate()}console.log(`[SceneAdd] batch=${Math.floor(Q/J)+1} processed=${j}/${L} children=${this.group.children.length}`),this.reportBuildProgress("Processing chunks...",j/L,L,j)}if(this.schematicRenderer.renderManager&&C){const Q=performance.now();this.schematicRenderer.renderManager.render();const a=performance.now()-Q;console.log(`[RenderTiming] FINAL meshes=${this.group.children.length} renderMs=${a.toFixed(0)}`)}bI.endOperation("Process All Chunks"),this.group.updateMatrixWorld(!0);const o=Array.from(this.group.children);typeof window<"u"&&window.dispatchEvent(new CustomEvent("schematicRenderComplete",{detail:{schematicId:this.id,schematicName:this.name,totalChunks:M,processedChunks:j,buildTimeMs:performance.now()-i,meshCount:e,optimized:!0,incremental:!0,batchedWorkers:!0}})),this.reportBuildProgress("Build complete",1,M,j),bI.endOperation("schematic-build-incremental"),setTimeout(()=>{this.schematicRenderer.uiManager&&this.schematicRenderer.uiManager.hideProgressBar()},800),n({meshes:o,chunkMap:m})}catch(d){bI.endOperation("Process All Chunks"),bI.endOperation("schematic-build-incremental"),console.error("[SchematicObject] Error during batched processing:",d),D(d)}})}applyBoundsToChunks(A,I,i){const C=[],l=I.min.x,w=I.min.y,Z=I.min.z,M=I.max.x,m=I.max.y,e=I.max.z;for(const t of A){const j=t.chunk_x*i.chunkWidth,n=t.chunk_y*i.chunkHeight,D=t.chunk_z*i.chunkLength,d=j+i.chunkWidth,c=n+i.chunkHeight,J=D+i.chunkLength;if(d<=l||j>=M||c<=w||n>=m||J<=Z||D>=e)continue;if(j>=l&&d<=M&&n>=w&&c<=m&&D>=Z&&J<=e){C.push(t);continue}const L=t.blocks,o=[];for(let Q=0;Q<L.length;Q+=4){const a=L[Q],z=L[Q+1],R=L[Q+2];a>=l&&a<M&&z>=w&&z<m&&R>=Z&&R<e&&o.push(a,z,R,L[Q+3])}o.length>0&&C.push({blocks:new Int32Array(o),chunk_x:t.chunk_x,chunk_y:t.chunk_y,chunk_z:t.chunk_z})}return C}async buildSchematicMeshesBatched(A,I={chunkWidth:16,chunkHeight:16,chunkLength:16}){const i=performance.now(),C=A.schematicWrapper;this.reportBuildProgress("Initializing batched pipeline...",.05);const l=this.getPalettes(C);bI.startOperation("Palette Precomputation"),await this.worldMeshBuilder.precomputePaletteGeometries(l.default),bI.endOperation("Palette Precomputation"),this.reportBuildProgress("Creating chunk iterator...",.1),bI.startOperation("Chunk Iterator Creation");const w=C.create_lazy_chunk_iterator(I.chunkWidth,I.chunkHeight,I.chunkLength,"bottom_up",0,0,0);bI.endOperation("Chunk Iterator Creation");const Z=w.total_chunks();if(Z===0)return this.reportBuildProgress("Schematic build complete (no chunks)",1,0,0),{meshes:[],chunkMap:new Map};this.reportBuildProgress("Collecting chunk data...",.15,Z,0);const M=[];for(;w.has_next();){const c=w.next();if(!c||c.blocks.length===0)continue;const J=c.blocks;let L;if(J instanceof Int32Array)L=J;else{L=new Int32Array(J.length*4);for(let o=0;o<J.length;o++){const Q=J[o];L[o*4]=Q[0],L[o*4+1]=Q[1],L[o*4+2]=Q[2],L[o*4+3]=Q[3]}}M.push({blocks:L,chunk_x:c.chunk_x,chunk_y:c.chunk_y,chunk_z:c.chunk_z})}const m=A.renderingBounds?.enabled?A.renderingBounds:void 0,e=m?this.applyBoundsToChunks(M,m,I):M,t=this.computeChunkAprons(e,I);for(const c of e)c.apronBlocks=t.get(`${c.chunk_x},${c.chunk_y},${c.chunk_z}`);this.reportBuildProgress("Processing chunks in BATCH mode...",.2,Z,0),bI.startOperation("Process All Chunks");let j=0;const n=await this.worldMeshBuilder.processChunksBatched(e,(c,J)=>{j=c;const L=.2+c/J*.7;this.reportBuildProgress("Batch processing chunks...",L,J,c)});bI.endOperation("Process All Chunks"),this.reportBuildProgress("Adding batched meshes to scene...",.95,Z,j);const D=2;for(let c=0;c<n.length;c+=D){const J=n.slice(c,c+D);for(const L of J)this.group.add(L);this.schematicRenderer.renderManager&&this.schematicRenderer.renderManager.render(),c+D<n.length&&await new Promise(L=>requestAnimationFrame(()=>L()))}this.group.updateMatrixWorld(!0);const d=performance.now()-i;return this.reportBuildProgress("Build complete!",1,Z,j),typeof window<"u"&&setTimeout(()=>{window.dispatchEvent(new CustomEvent("schematicRenderComplete",{detail:{schematicId:this.id,schematicName:this.name,totalChunks:Z,processedChunks:j,buildTimeMs:d,meshCount:n.length,optimized:!0,batched:!0}}))},100),{meshes:n,chunkMap:new Map([["batched",n]])}}async buildSchematicMeshesInstanced(A){const I=performance.now();await this.worldMeshBuilder.precomputePaletteGeometries(this.getPalettes(this.schematicWrapper).default),this.worldMeshBuilder.enableInstancedRendering(this.group,!0),await this.worldMeshBuilder.renderSchematicInstanced(A);const i=performance.now()-I,C=Array.from(this.group.children);return typeof window<"u"&&window.dispatchEvent(new CustomEvent("schematicRenderComplete",{detail:{schematicId:this.id,schematicName:this.name,buildTimeMs:i,meshCount:C.length,optimized:!0,instanced:!0}})),{meshes:C,chunkMap:new Map}}createRenderingBoundsHelper(A=!0){if(this.renderingBounds.helper&&this.group.remove(this.renderingBounds.helper),A&&this.renderingBounds.enabled){const I=new b.Box3(this.renderingBounds.min.clone().add(new b.Vector3(-.5,-.5,-.5)),this.renderingBounds.max.clone().add(new b.Vector3(-.5,-.5,-.5))),i=new b.Box3Helper(I,new b.Color(65280));this.renderingBounds.helper=i,this.group.add(i)}else this.renderingBounds.helper=void 0}setRenderingBounds(A,I,i=!0){Array.isArray(A)&&(A=new b.Vector3(A[0],A[1],A[2])),Array.isArray(I)&&(I=new b.Vector3(I[0],I[1],I[2])),this.renderingBounds.min=A.clone(),this.renderingBounds.max=I.clone(),this.createRenderingBoundsHelper(i),this.rebuildMesh()}updateRenderingBounds(){this.emitPropertyChanged("renderingBounds",{min:this.renderingBounds.min.toArray(),max:this.renderingBounds.max.toArray(),enabled:this.renderingBounds.enabled})}showRenderingBoundsHelper(A){this.createRenderingBoundsHelper(A)}resetRenderingBounds(){const A=this.getDimensions();this.setRenderingBounds(new b.Vector3(0,0,0),new b.Vector3(A[0],A[1],A[2]))}async getMeshes(){return await this.meshesReady,Array.from(this.group.children)}getChunkObjectsAt(A,I,i){const C=`${A},${I},${i}`;return this.chunkMeshes.get(C)||null}setChunkObjectsAt(A,I,i,C){const l=`${A},${I},${i}`;this.chunkMeshes.set(l,C)}getChunkMeshAt(A,I,i){return this.getChunkObjectsAt(A,I,i)}setChunkMeshAt(A,I,i,C){this.setChunkObjectsAt(A,I,i,C)}updateMeshMaterials(A){const I=this.opacity<1;this.group.traverse(i=>{i instanceof b.Mesh&&(Array.isArray(i.material)?i.material:[i.material]).forEach(l=>{l&&(l.opacity=this.opacity,l.transparent=I)})}),this.emitPropertyChanged("material",{property:A,value:this.opacity})}updateMeshVisibility(){this.group.visible=this.visible,this.emitPropertyChanged("visibility",this.visible)}async updateMesh(){this.meshes.forEach(A=>{this.group.remove(A),A.geometry.dispose(),Array.isArray(A.material)?A.material.forEach(I=>I.dispose()):A.material.dispose()}),this.chunkMeshes.clear(),this.visible&&await this.buildMeshes()}async rebuildMesh(){bI.startOperation(`rebuildMesh-${this.name}`);const A=this.sceneManager?.schematicRenderer;A?.options.enableProgressBar&&A.uiManager&&(A.uiManager.showProgressBar(`Rebuilding ${this.name}`),A.uiManager.updateProgress(.1,"Disposing old meshes...")),this.meshes.forEach(i=>{this.group.remove(i),i.geometry?.dispose(),Array.isArray(i.material)?i.material.forEach(C=>C?.dispose()):i.material?.dispose()});const I=[...this.group.children];for(const i of I)i.name&&i.name.startsWith("region_")||(this.group.remove(i),i instanceof b.Mesh&&(i.geometry?.dispose(),Array.isArray(i.material)?i.material.forEach(C=>C?.dispose()):i.material?.dispose()));this.chunkMeshes.clear(),this.meshes=[],A?.options.enableProgressBar&&A.uiManager&&A.uiManager.updateProgress(.2,"Building new meshes..."),this.visible&&await this.buildMeshes(),A?.options.enableProgressBar&&A.uiManager&&A.uiManager.hideProgressBar(),bI.endOperation(`rebuildMesh-${this.name}`)}getSchematicWrapper(){return this.schematicWrapper}getRegions(){return this.schematicRenderer.regionManager?.getRegionsForSchematic(this.id)||[]}getRegion(A){const I=`${this.id}_${A}`,i=this.schematicRenderer.regionManager?.getRegion(I);return i||this.schematicRenderer.regionManager?.getRegion(A)}createRegion(A,I,i,C){const l=`${this.id}_${A}`;let w,Z=C;return i&&typeof i=="object"&&"x"in i&&"y"in i&&"z"in i?w=i:(w=I,i&&(Z=i)),this.schematicRenderer.regionManager.createRegion(l,I,w,this.id,Z)}_definitionRegionsVisible=!1;get definitionRegionsVisible(){return this._definitionRegionsVisible}loadDefinitionRegions(A){if(!this.schematicRenderer.regionManager)return console.warn("[SchematicObject] RegionManager not available, cannot load definition regions."),[];const I=A??this.schematicRenderer.options.definitionRegionOptions?.showOnLoad??!0,i=this.schematicRenderer.regionManager.loadDefinitionRegionsFromSchematic(this.id,I);return this._definitionRegionsVisible=I&&i.length>0,i}showDefinitionRegions(){this.schematicRenderer.regionManager?.showDefinitionRegions(this.id),this._definitionRegionsVisible=!0}hideDefinitionRegions(){this.schematicRenderer.regionManager?.hideDefinitionRegions(this.id),this._definitionRegionsVisible=!1}toggleDefinitionRegions(){const A=this.schematicRenderer.regionManager?.toggleDefinitionRegions(this.id)??!1;return this._definitionRegionsVisible=A,A}hasDefinitionRegions(){return this.schematicRenderer.regionManager?.hasDefinitionRegions(this.id)??!1}getDefinitionRegionNames(){const A=this.schematicWrapper.getDefinitionRegionNames();return Array.from(A)}getDefinitionRegion(A){const I=`${this.id}_defRegion_${A}`;return this.schematicRenderer.regionManager?.getRegion(I)}removeDefinitionRegions(){this.schematicRenderer.regionManager?.removeDefinitionRegions(this.id),this._definitionRegionsVisible=!1}createCircuitFunction(A,I){let i=new CI.CircuitBuilderWrapper(this.schematicWrapper);const C=(Z,M)=>{let m;if(Z instanceof CI.DefinitionRegionWrapper)m=Z;else if(typeof Z=="string"){const e=this.getRegion(Z);if(!e)throw new Error(`Region '${Z}' not found in RegionManager`);m=e.toDefinitionRegion(this.schematicWrapper)}else m=CI.DefinitionRegionWrapper.fromBounds(new CI.BlockPosition(Z.min.x,Z.min.y,Z.min.z),new CI.BlockPosition(Z.max.x,Z.max.y,Z.max.z));if(M){const e=Array.isArray(M)?M:[M];if(e.length>0){const t=m.filterByBlock(this.schematicWrapper,e[0]);for(let j=1;j<e.length;j++){const n=m.filterByBlock(this.schematicWrapper,e[j]);t.unionInto(n),n.free()}Z instanceof CI.DefinitionRegionWrapper||m.free(),m=t}}return m},l=Z=>{if(Z){if(Z instanceof CI.SortStrategyWrapper)return Z;if(typeof Z=="string")return CI.SortStrategyWrapper.fromString(Z)}};for(const Z of A){const M=Z.mode==="signal"&&Z.bits<4?4:Z.bits,m=Z.signed?CI.IoTypeWrapper.signedInt(M):CI.IoTypeWrapper.unsignedInt(M),e=C(Z.region,Z.blockFilter),t=l(Z.sort);if(Z.mode==="signal"){const j=CI.LayoutFunctionWrapper.packed4();t?i=i.withInputSorted(Z.name,m,j,e,t):i=i.withInput(Z.name,m,j,e)}else t?i=i.withInputAutoSorted(Z.name,m,e,t):i=i.withInputAuto(Z.name,m,e)}for(const Z of I){const M=Z.mode==="signal"&&Z.bits<4?4:Z.bits,m=Z.signed?CI.IoTypeWrapper.signedInt(M):CI.IoTypeWrapper.unsignedInt(M),e=C(Z.region,Z.blockFilter),t=l(Z.sort);if(Z.mode==="signal"){const j=CI.LayoutFunctionWrapper.packed4();t?i=i.withOutputSorted(Z.name,m,j,e,t):i=i.withOutput(Z.name,m,j,e)}else t?i=i.withOutputAutoSorted(Z.name,m,e,t):i=i.withOutputAuto(Z.name,m,e)}const w=i.build();return{run:(Z,M=1e3,m="stable")=>{const e={};for(const[n,D]of Object.entries(Z))e[n]=typeof D=="boolean"?D?1:0:D;let t;return m==="fixed"?t=CI.ExecutionModeWrapper.fixedTicks(M):t=CI.ExecutionModeWrapper.untilStable(2,M),w.execute(e,t)},reset:()=>w.reset(),sync:async()=>{const Z=w.syncToSchematic();this.schematicWrapper=Z,await this.rebuildMesh()},executor:w}}getPalettes(A){return typeof A.get_all_palettes=="function"?A.get_all_palettes():(console.warn("[SchematicObject] get_all_palettes missing, falling back to get_palette"),typeof A.get_palette=="function"?{default:A.get_palette()}:(console.error("[SchematicObject] Both get_all_palettes and get_palette are missing!"),{default:[]}))}getBlockEntitiesMap(){if(this.blockEntitiesMap===null){this.blockEntitiesMap=new Map;const A=this.schematicWrapper.get_all_block_entities()||[];for(const I of A)if(I&&I.position&&I.position.length===3){const i=`${I.position[0]},${I.position[1]},${I.position[2]}`;this.blockEntitiesMap.set(i,I)}}return this.blockEntitiesMap}async setBlockNoRebuild(A,I){Array.isArray(A)&&(A=new b.Vector3(A[0],A[1],A[2])),this.schematicWrapper.set_block(A.x,A.y,A.z,I),this._cachedDimensions=null,this.blockEntitiesMap=null}async setBlockWithNbt(A,I,i){bI.startOperation("setBlockWithNbt"),Array.isArray(A)&&(A=new b.Vector3(A[0],A[1],A[2])),this.schematicWrapper.setBlockWithNbt(A.x,A.y,A.z,I,i),bI.endOperation("setBlockWithNbt")}compileInsign(){try{return this.schematicWrapper.compileInsign()}catch(A){return console.warn("[SchematicObject] Insign compilation failed:",A),null}}async setBlock(A,I){Array.isArray(A)&&(A=new b.Vector3(A[0],A[1],A[2])),await this.setBlockNoRebuild(A,I),await this.rebuildChunkAtPosition(A)}async setBlocks(A){const I=new Set;let i=performance.now();bI.startOperation("setBlocks"),console.log("Setting blocks"),Lh();for(let[l,w]of A){Array.isArray(l)&&(l=new b.Vector3(l[0],l[1],l[2])),await this.setBlockNoRebuild(l,w);const Z=this.getChunkCoordinates(l);I.add(`${Z.x},${Z.y},${Z.z}`)}console.log("Blocks set"),bI.endOperation("setBlocks"),console.log("Time to set blocks:",performance.now()-i+"ms"),i=performance.now(),console.log("Rebuilding chunks");const C=[];for(const l of I){const[w,Z,M]=l.split(",").map(m=>parseInt(m));C.push(this.rebuildChunk(w,Z,M))}await Promise.all(C),console.log("Chunks rebuilt in",performance.now()-i+"ms")}async copyRegionFromSchematic(A,I,i,C,l,w=!1){const Z=this.sceneManager?.schematicRenderer?.schematicManager?.getSchematic(A);if(!Z)throw new Error(`Schematic ${A} not found`);Array.isArray(I)&&(I=new b.Vector3(I[0],I[1],I[2])),Array.isArray(i)&&(i=new b.Vector3(i[0],i[1],i[2])),Array.isArray(C)&&(C=new b.Vector3(C[0],C[1],C[2]));const M=Z.getDimensions();I||(I=new b.Vector3(0,0,0)),i||(i=new b.Vector3(M[0]-1,M[1]-1,M[2]-1)),C||(C=new b.Vector3(0,0,0)),l||(l=[]),await this.schematicWrapper.copy_region(Z.schematicWrapper,I.x,I.y,I.z,i.x,i.y,i.z,C.x,C.y,C.z,l),w&&await this.rebuildMesh()}getBlock(A){return Array.isArray(A)&&(A=new b.Vector3(A[0],A[1],A[2])),this.schematicWrapper.get_block(A.x,A.y,A.z)}debugBlock(A){const I=Math.floor(A.x),i=Math.floor(A.y),C=Math.floor(A.z);console.log(`🔍 Debug Block at (${I}, ${i}, ${C}):`);const l=this.schematicWrapper.get_block(I,i,C);console.log(`Type: ${l}`);try{const w=this.schematicWrapper.get_block_with_properties?.(I,i,C);w&&console.log("Properties:",w.properties())}catch(w){console.warn("Could not get block properties:",w)}try{const w=this.schematicWrapper.create_simulation_world();console.log(`Redstone Power: ${w.get_redstone_power(I,i,C)}`),w.is_lit&&console.log(`Is Lit: ${w.is_lit(I,i,C)}`),w.free()}catch(w){console.warn("Could not check simulation state:",w)}}async replaceBlock(A,I){const i=[],C=this.getDimensions();for(let l=0;l<C[0];l++)for(let w=0;w<C[1];w++)for(let Z=0;Z<C[2];Z++)this.schematicWrapper.get_block(l,w,Z)===A&&i.push([new b.Vector3(l,w,Z),I]);await this.setBlocks(i)}async addCube(A,I,i){Array.isArray(A)&&(A=new b.Vector3(A[0],A[1],A[2])),Array.isArray(I)&&(I=new b.Vector3(I[0],I[1],I[2]));const C=[];for(let l=0;l<I.x;l++)for(let w=0;w<I.y;w++)for(let Z=0;Z<I.z;Z++)C.push([A.clone().add(new b.Vector3(l,w,Z)),i]);return await this.setBlocks(C),this}async rebuildChunkAtPosition(A){const I=this.getChunkCoordinates(A);await this.rebuildChunk(I.x,I.y,I.z)}rebuildAllChunks(){this.rebuildMesh()}getChunkCoordinates(A){return{x:Math.floor(A.x/this.chunkDimensions.chunkWidth),y:Math.floor(A.y/this.chunkDimensions.chunkHeight),z:Math.floor(A.z/this.chunkDimensions.chunkLength)}}async rebuildChunk(A,I,i){const C={x:A*this.chunkDimensions.chunkWidth,y:I*this.chunkDimensions.chunkHeight,z:i*this.chunkDimensions.chunkLength};if(this.renderingBounds){const m=C.x+this.chunkDimensions.chunkWidth,e=C.y+this.chunkDimensions.chunkHeight,t=C.z+this.chunkDimensions.chunkLength;if(m<=this.renderingBounds.min.x||C.x>=this.renderingBounds.max.x||e<=this.renderingBounds.min.y||C.y>=this.renderingBounds.max.y||t<=this.renderingBounds.min.z||C.z>=this.renderingBounds.max.z){this.removeChunkObjects(A,I,i);return}}let l,w,Z;this.schematicWrapper.getChunkData?(l=this.schematicWrapper.getChunkData(A,I,i,this.chunkDimensions.chunkWidth,this.chunkDimensions.chunkHeight,this.chunkDimensions.chunkLength),w=l.blocks,Z=l.entities):w=this.schematicWrapper.get_chunk_blocks_indices(C.x,C.y,C.z,this.chunkDimensions.chunkWidth,this.chunkDimensions.chunkHeight,this.chunkDimensions.chunkLength),this.removeChunkObjects(A,I,i);const M=await this.worldMeshBuilder.getChunkMesh({blocks:w,chunk_x:A,chunk_y:I,chunk_z:i},this,this.renderingBounds,Z);this.applyPropertiesToObjects(M),M.forEach(m=>{this.group.add(m)}),this.setChunkObjectsAt(A,I,i,M)}removeChunkObjects(A,I,i){const C=this.getChunkObjectsAt(A,I,i);C&&(C.forEach(l=>{this.group.remove(l),l.traverse(w=>{w instanceof b.Mesh&&(w.geometry?.dispose(),Array.isArray(w.material)?w.material.forEach(Z=>Z.dispose()):w.material?.dispose())})}),this.chunkMeshes.delete(`${A},${I},${i}`))}containsPosition(A){const I=this.getDimensions(),i=this.position.clone(),C=i.clone().add(new b.Vector3(I[0],I[1],I[2]).multiply(this.scale));return A.x>=i.x&&A.x<=C.x&&A.y>=i.y&&A.y<=C.y&&A.z>=i.z&&A.z<=C.z}getSchematicCenter(){return this.getTightWorldBox().getCenter(new b.Vector3)}getTightWorldBox(){const A=this.getTightBoundsMin(),I=this.getTightDimensions(),i=A!==null&&I[0]>0&&I[1]>0&&I[2]>0,C=new b.Box3;if(i)C.min.set(A[0],A[1],A[2]),C.max.set(A[0]+I[0],A[1]+I[1],A[2]+I[2]);else{const l=this.getDimensions();C.min.set(0,0,0),C.max.set(l[0],l[1],l[2])}return this.group.updateMatrixWorld(!0),C.applyMatrix4(this.group.matrixWorld),C}centerInScene(){const A=this.getSchematicCenter(),I=new b.Vector3(this.position.x-A.x,this.position.y-A.y,this.position.z-A.z);this.position.copy(I),this.updateTransform()}centerInScenePlane(){const A=this.getSchematicCenter(),I=new b.Vector3(this.position.x-A.x,0,this.position.z-A.z);this.position.copy(I),this.updateTransform()}setPosition(A){if(Array.isArray(A)){this.position=new b.Vector3(A[0],A[1],A[2]),this.updateTransform();return}this.position=A,this.updateTransform()}setRotation(A){if(Array.isArray(A)){this.rotation=new b.Euler(A[0],A[1],A[2]);return}this.rotation=A}setScale(A){if(Array.isArray(A)){this.scale=new b.Vector3(A[0],A[1],A[2]);return}this.scale=A}getWorldPosition(){return this.group.getWorldPosition(new b.Vector3)}getBoundingBox(){this.group.updateMatrixWorld();const A=new b.Box3().setFromObject(this.group),I=[A.min.x,A.min.y,A.min.z],i=[A.max.x,A.max.y,A.max.z];return[I,i]}getAllBlocks(A){const I=this.getDimensions(),i=[];for(let C=0;C<I[0];C++)for(let l=0;l<I[1];l++)for(let w=0;w<I[2];w++){const Z=this.schematicWrapper.get_block(C,l,w);if(Z&&Z!=="minecraft:air"){let M={};try{const e=this.schematicWrapper.get_block_with_properties?.(C,l,w);e&&(M=e.properties||{})}catch{M={}}const m={x:C,y:l,z:w,name:Z,properties:M,chunk_x:Math.floor(C/this.chunkDimensions.chunkWidth),chunk_y:Math.floor(l/this.chunkDimensions.chunkHeight),chunk_z:Math.floor(w/this.chunkDimensions.chunkLength),stateKey:`${Z}${Object.keys(M).length>0?`[${Object.entries(M).map(([e,t])=>`${e}=${t}`).join(",")}]`:""}`};(!A||A(m))&&i.push(m)}}return i}createBoundsControls(){const A=this.getDimensions(),[I,i,C]=A,l={minX:this.renderingBounds.min.x,maxX:this.renderingBounds.max.x,minY:this.renderingBounds.min.y,maxY:this.renderingBounds.max.y,minZ:this.renderingBounds.min.z,maxZ:this.renderingBounds.max.z,applyX:()=>{const w=this.renderingBounds.min.clone(),Z=this.renderingBounds.max.clone();return w.x=l.minX,Z.x=l.maxX,this.setRenderingBounds(w,Z),`X axis bounds set to [${l.minX}, ${l.maxX}]`},applyY:()=>{const w=this.renderingBounds.min.clone(),Z=this.renderingBounds.max.clone();return w.y=l.minY,Z.y=l.maxY,this.setRenderingBounds(w,Z),`Y axis bounds set to [${l.minY}, ${l.maxY}]`},applyZ:()=>{const w=this.renderingBounds.min.clone(),Z=this.renderingBounds.max.clone();return w.z=l.minZ,Z.z=l.maxZ,this.setRenderingBounds(w,Z),`Z axis bounds set to [${l.minZ}, ${l.maxZ}]`},applyAll:()=>(this.setRenderingBounds([l.minX,l.minY,l.minZ],[l.maxX,l.maxY,l.maxZ]),`All bounds set to min:[${l.minX}, ${l.minY}, ${l.minZ}], max:[${l.maxX}, ${l.maxY}, ${l.maxZ}]`),reset:()=>(this.resetRenderingBounds(),l.minX=0,l.maxX=I,l.minY=0,l.maxY=i,l.minZ=0,l.maxZ=C,`Reset rendering bounds to full dimensions: [${I}, ${i}, ${C}]`),toggleHelper:(w=!0)=>(this.showRenderingBoundsHelper(w),`Rendering bounds helper ${w?"shown":"hidden"}`),getCurrentBounds:()=>({min:this.renderingBounds.min.toArray(),max:this.renderingBounds.max.toArray()}),syncFromCurrent:()=>(l.minX=this.renderingBounds.min.x,l.maxX=this.renderingBounds.max.x,l.minY=this.renderingBounds.min.y,l.maxY=this.renderingBounds.max.y,l.minZ=this.renderingBounds.min.z,l.maxZ=this.renderingBounds.max.z,"Settings synchronized with current bounds"),sliceX:w=>(l.maxX=w,l.applyX()),sliceY:w=>(l.maxY=w,l.applyY()),sliceZ:w=>(l.maxZ=w,l.applyZ())};return l}}class vh{schematicRenderer;options;raycaster;mouse;camera;hoveredObject=null;canvas;selectedObject=null;constructor(A,I){this.schematicRenderer=A,this.options=I,this.raycaster=new b.Raycaster,this.mouse=new b.Vector2,this.camera=this.schematicRenderer.cameraManager.activeCamera.camera,this.canvas=this.schematicRenderer.canvas,this.addEventListeners()}addEventListeners(){this.options.enableSelection&&(this.canvas.addEventListener("mousemove",this.onMouseMove.bind(this)),this.canvas.addEventListener("mousedown",this.onMouseDown.bind(this)),window.addEventListener("keydown",this.onKeyDown.bind(this))),this.schematicRenderer.eventEmitter.on("objectSelected",A=>{this.selectedObject!==A&&(this.selectedObject=A,console.log("InteractionManager synced selection:",A.id))}),this.schematicRenderer.eventEmitter.on("objectDeselected",()=>{this.selectedObject&&(this.selectedObject=null)})}onMouseMove(A){this.options.enableSelection&&this.updateMousePosition(A)}onMouseDown(A){this.options.enableSelection&&(this.updateMousePosition(A),this.checkSelection())}onKeyDown(A){if(this.options.enableMovingSchematics)switch(A.key){case"g":this.schematicRenderer.gizmoManager?.setMode("translate");break;case"r":this.schematicRenderer.gizmoManager?.setMode("rotate");break;case"s":this.schematicRenderer.gizmoManager?.setMode("scale");break;case"Escape":this.deselectObject();break}}updateMousePosition(A){const I=this.canvas.getBoundingClientRect();this.mouse.x=(A.clientX-I.left)/I.width*2-1,this.mouse.y=-((A.clientY-I.top)/I.height)*2+1}checkHover(){this.raycaster.setFromCamera(this.mouse,this.camera);const A=this.schematicRenderer.schematicManager?.getSelectableObjects();if(!A||A.length===0){console.warn("No selectable objects found");return}const I=A.filter(i=>i!==void 0);I.length!==A.length&&console.warn(`Filtered out ${A.length-I.length} undefined objects`);try{const i=this.raycaster.intersectObjects(I,!0);if(i.length>0){const C=i[0].object,l=this.findSelectableParent(C);l&&l!==this.hoveredObject&&(this.hoveredObject&&this.schematicRenderer.eventEmitter.emit("hoverExit",this.hoveredObject),this.hoveredObject=l,this.schematicRenderer.eventEmitter.emit("hoverEnter",l,i[0]),console.log("Hovering over object",l.id))}else this.hoveredObject&&(this.schematicRenderer.eventEmitter.emit("hoverExit",this.hoveredObject),this.hoveredObject=null)}catch{}}findSelectableParent(A){let I=A;for(;I;){if(I instanceof b.Group&&I.name){const i=this.schematicRenderer.schematicManager?.getSchematic(I.name);if(i)return console.log("Found selectable parent:",i.id),i}I=I.parent}return console.log("No selectable parent found"),null}visualizeBoundingBoxes(){const A=this.schematicRenderer.schematicManager?.getSelectableObjects();if(!A){console.warn("No selectable objects found");return}A.forEach(I=>{const i=new b.Box3().setFromObject(I),C=new b.Box3Helper(i,new b.Color(16776960));this.schematicRenderer.sceneManager.scene.add(C),console.log("Object:",I.name),console.log(" Position:",I.position),console.log(" Scale:",I.scale),console.log(" Bounding box min:",i.min),console.log(" Bounding box max:",i.max),console.log(" Bounding box size:",i.getSize(new b.Vector3))}),console.log("Added bounding box visualizations")}checkSelection(){this.raycaster.setFromCamera(this.mouse,this.camera);const A=this.schematicRenderer.schematicManager?.getSelectableObjects();if(!A?.length){console.warn("No selectable objects available");return}const I=A.filter(C=>this.schematicRenderer.sceneManager.scene.getObjectById(C.id)),i=this.raycaster.intersectObjects(I,!0);if(i.length>0){const C=i[0].object;if(C.userData&&C.userData.isHandle)return;const l=this.findSelectableParent(C);if(l&&(l.id?.startsWith("region_")||l.name?.startsWith("region_")||l.group?.name?.startsWith("region_")))return;if(l){if(this.selectedObject&&this.selectedObject.id?.startsWith("region_")&&l instanceof UD){console.log("Ignoring selection change from Region to Schematic (preserving region context)");return}this.selectObject(l)}}}selectObject(A){this.selectedObject!==A&&(this.deselectObject(),this.selectedObject=A,this.schematicRenderer.eventEmitter.emit("objectSelected",A),console.log("Selected object:",A.id))}deselectObject(){this.selectedObject&&(this.schematicRenderer.gizmoManager?.detach(),this.schematicRenderer.eventEmitter.emit("objectDeselected",this.selectedObject),this.selectedObject=null)}update(){}dispose(){this.canvas.removeEventListener("mousemove",this.onMouseMove),this.canvas.removeEventListener("mousedown",this.onMouseDown)}}class kh{schematicRenderer;hoverMesh=null;raycaster;mouse;lastHoveredObject=null;constructor(A){this.schematicRenderer=A,this.raycaster=new b.Raycaster,this.mouse=new b.Vector2,this.onHoverEnter=this.onHoverEnter.bind(this),this.onHoverExit=this.onHoverExit.bind(this)}activate(){this.schematicRenderer.eventEmitter.on("hoverEnter",this.onHoverEnter),this.schematicRenderer.eventEmitter.on("hoverExit",this.onHoverExit)}deactivate(){console.log("HoverHighlight deactivated"),this.schematicRenderer.eventEmitter.off("hoverEnter",this.onHoverEnter),this.schematicRenderer.eventEmitter.off("hoverExit",this.onHoverExit),this.removeHoverMesh()}update(A){}onHoverEnter=(A,I)=>{this.removeHoverMesh(),this.lastHoveredObject=A,console.log("Hovering over object",A);const i=new b.Vector3;i.copy(I.point).floor();const C=new b.BoxGeometry(1.1,1.1,1.1),l=new b.MeshBasicMaterial({color:65280,opacity:.2,transparent:!0});this.hoverMesh=new b.Mesh(C,l),this.hoverMesh.position.copy(i).addScalar(.5),this.hoverMesh.userData.isHighlight=!0,this.schematicRenderer.sceneManager.add(this.hoverMesh),this.schematicRenderer.eventEmitter.emit("hover",{object:A,position:i,faceNormal:I.face?.normal.clone().transformDirection(I.object.matrixWorld)})};onHoverExit=A=>{A===this.lastHoveredObject&&(this.removeHoverMesh(),this.lastHoveredObject=null,this.schematicRenderer.eventEmitter.emit("hover",null))};removeHoverMesh(){this.hoverMesh&&(this.schematicRenderer.sceneManager.scene.remove(this.hoverMesh),this.hoverMesh=null)}getBlockData(A){if(!this.schematicRenderer.schematicManager)return null;const I=this.schematicRenderer.schematicManager.getAllSchematics()[0];if(!I)return null;const i=I.schematicWrapper.get_block_with_properties(A.x,A.y,A.z);if(i){const C=I.schematicWrapper.get_block_entity(A.x,A.y,A.z);return{name:i.name(),properties:i.properties(),blockEntity:C}}return null}}class Hh{schematicRenderer;annotations={};annotationInput;raycaster;mouse;hoverPosition=null;constructor(A){this.schematicRenderer=A,this.schematicRenderer.eventEmitter.on("addAnnotation",this.onAddAnnotation),this.annotationInput=document.createElement("div"),this.raycaster=new b.Raycaster,this.mouse=new b.Vector2,this.createAnnotationInput()}onAddAnnotation=A=>{this.showAnnotationInput(A)};activate(){}deactivate(){this.clearAllAnnotations(),this.annotationInput.remove(),this.schematicRenderer.eventEmitter.off("addAnnotation",this.onAddAnnotation)}update(A){this.updateAnnotationVisibility()}createAnnotationInput(){this.annotationInput=document.createElement("div"),this.annotationInput.style.position="absolute",this.annotationInput.style.display="none",this.annotationInput.innerHTML=`
415
415
  <input type="text" id="annotation-text" style="width: 200px;">
416
416
  <button id="submit-annotation">Add</button>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "schematic-renderer",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "license": "AGPL-3.0-only",
5
5
  "description": "A schematic renderer package for Minecraft schematics using Three.js",
6
6
  "repository": {