@inweb/viewer-three 26.10.4 → 26.10.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/plugins/loaders/GLTFCloudLoader.js +3 -1
- package/dist/plugins/loaders/GLTFCloudLoader.js.map +1 -1
- package/dist/plugins/loaders/GLTFCloudLoader.min.js +1 -1
- package/dist/plugins/loaders/IFCXLoader.js.map +1 -1
- package/dist/plugins/loaders/IFCXLoader.module.js.map +1 -1
- package/dist/viewer-three.js +11552 -12149
- package/dist/viewer-three.js.map +1 -1
- package/dist/viewer-three.min.js +3 -3
- package/dist/viewer-three.module.js +8 -6
- package/dist/viewer-three.module.js.map +1 -1
- package/package.json +9 -9
- package/plugins/loaders/IFCX/render.js +1 -1
- package/src/Viewer/controls/OrbitControls.js +0 -1
- package/src/Viewer/draggers/MeasureLineDragger.ts +9 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewer-three.module.js","sources":["../src/Viewer/helpers/PlaneHelper.ts","../src/Viewer/controls/OrbitControls.js","../src/Viewer/draggers/OrbitDragger.ts","../src/Viewer/draggers/CuttingPlaneDragger.ts","../src/Viewer/draggers/CuttingPlaneXAxis.ts","../src/Viewer/draggers/CuttingPlaneYAxis.ts","../src/Viewer/draggers/CuttingPlaneZAxis.ts","../src/Viewer/draggers/MeasureLineDragger.ts","../src/Viewer/draggers/PanDragger.ts","../src/Viewer/controls/WalkControls.ts","../src/Viewer/controls/JoyStickControls.ts","../src/Viewer/draggers/WalkDragger.ts","../src/Viewer/controls/FlyControls.ts","../src/Viewer/draggers/FlyDragger.ts","../src/Viewer/draggers/ZoomDragger.ts","../src/Viewer/draggers/index.ts","../src/Viewer/commands/ApplyModelTransform.ts","../src/Viewer/commands/ClearMarkup.ts","../src/Viewer/commands/ClearSelected.ts","../src/Viewer/commands/ClearSlices.ts","../src/Viewer/commands/CreatePreview.ts","../src/Viewer/commands/Explode.ts","../src/Viewer/commands/ZoomTo.ts","../src/Viewer/commands/SetDefaultViewPosition.ts","../src/Viewer/commands/GetDefaultViewPositions.ts","../src/Viewer/commands/GetModels.ts","../src/Viewer/commands/GetSelected.ts","../src/Viewer/commands/HideSelected.ts","../src/Viewer/commands/IsolateSelected.ts","../src/Viewer/commands/RegenerateAll.ts","../src/Viewer/commands/ResetView.ts","../src/Viewer/commands/SelectModel.ts","../src/Viewer/commands/SetActiveDragger.ts","../src/Viewer/commands/SetMarkupColor.ts","../src/Viewer/commands/SetSelected.ts","../src/Viewer/commands/ShowAll.ts","../src/Viewer/commands/ZoomToExtents.ts","../src/Viewer/commands/ZoomToObjects.ts","../src/Viewer/commands/ZoomToSelected.ts","../src/Viewer/commands/index.ts","../src/Viewer/components/BackgroundComponent.ts","../src/Viewer/components/CameraComponent.ts","../src/Viewer/components/ExtentsComponent.ts","../src/Viewer/components/LightComponent.ts","../src/Viewer/components/RenderLoopComponent.ts","../src/Viewer/components/ResizeCanvasComponent.ts","../src/Viewer/components/HighlighterUtils.ts","../src/Viewer/components/HighlighterComponent.ts","../src/Viewer/components/SelectionComponent.ts","../src/Viewer/helpers/WCSHelper.ts","../src/Viewer/components/WCSHelperComponent.ts","../src/Viewer/components/ResetComponent.ts","../src/Viewer/components/index.ts","../src/Viewer/loaders/GLTFLoadingManager.ts","../src/Viewer/models/ModelImpl.ts","../src/Viewer/loaders/GLTFFileLoader.ts","../src/Viewer/loaders/DynamicGltfLoader/DynamicModelImpl.ts","../src/Viewer/loaders/DynamicGltfLoader/GltfStructure.js","../src/Viewer/loaders/DynamicGltfLoader/DynamicGltfLoader.js","../src/Viewer/loaders/GLTFCloudDynamicLoader.ts","../src/Viewer/loaders/index.ts","../src/Viewer/postprocessing/SSAARenderPass.js","../src/Viewer/scenes/Helpers.ts","../src/Viewer/Viewer.ts"],"sourcesContent":["///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport {\n BufferGeometry,\n DoubleSide,\n Float32BufferAttribute,\n Line,\n LineBasicMaterial,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n Plane,\n Vector3,\n} from \"three\";\n\nclass PlaneHelper extends Line {\n public plane: Plane;\n public size: number;\n public offset: Vector3;\n public helper: Object3D;\n\n constructor(plane: Plane, size = 1, color = 0xffff00, offset: Vector3 = new Vector3()) {\n // const positions = [1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];\n const positions = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];\n\n const geometry = new BufferGeometry();\n geometry.setAttribute(\"position\", new Float32BufferAttribute(positions, 3));\n geometry.computeBoundingSphere();\n\n super(geometry, new LineBasicMaterial({ color, toneMapped: false }));\n\n (this as any).type = \"PlaneHelper\";\n\n this.plane = plane;\n this.size = size;\n this.offset = offset;\n\n const positions2 = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0];\n\n const geometry2 = new BufferGeometry();\n geometry2.setAttribute(\"position\", new Float32BufferAttribute(positions2, 3));\n geometry2.computeBoundingSphere();\n\n this.helper = new Mesh(\n geometry2,\n new MeshBasicMaterial({\n color,\n opacity: 0.2,\n transparent: true,\n depthWrite: false,\n toneMapped: false,\n side: DoubleSide,\n })\n );\n this.add(this.helper);\n }\n\n dispose() {\n this.geometry.dispose();\n (this.material as any).dispose();\n (this.children[0] as any).geometry.dispose();\n (this.children[0] as any).material.dispose();\n }\n\n override updateMatrixWorld(force: boolean) {\n this.position.set(0, 0, 0);\n this.lookAt(this.plane.normal);\n\n this.position.copy(this.offset);\n this.translateZ(-(this.offset.dot(this.plane.normal) + this.plane.constant));\n\n this.scale.set(0.5 * this.size, 0.5 * this.size, 1);\n\n super.updateMatrixWorld(force);\n }\n}\n\nexport { PlaneHelper };\n","import { EventDispatcher, MOUSE, Quaternion, Spherical, TOUCH, Vector2, Vector3 } from \"three\";\n\n// OrbitControls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nconst _changeEvent = { type: \"change\" };\nconst _startEvent = { type: \"start\" };\nconst _endEvent = { type: \"end\" };\n\nconst STATE = {\n NONE: -1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6,\n};\n\nclass OrbitControls extends EventDispatcher {\n constructor(object, domElement) {\n super();\n\n this.object = object;\n this.domElement = domElement;\n this.domElement.style.touchAction = \"none\"; // disable touch scroll\n\n // Set to false to disable this control\n this.enabled = true;\n\n // \"target\" sets the location of focus, where the object orbits around\n this.target = new Vector3();\n\n // How far you can dolly in and out ( PerspectiveCamera only )\n this.minDistance = 0;\n this.maxDistance = Infinity;\n\n // How far you can zoom in and out ( OrthographicCamera only )\n this.minZoom = 0;\n this.maxZoom = Infinity;\n\n // How far you can orbit vertically, upper and lower limits.\n // Range is 0 to Math.PI radians.\n this.minPolarAngle = 0; // radians\n this.maxPolarAngle = Math.PI; // radians\n\n // How far you can orbit horizontally, upper and lower limits.\n // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n this.minAzimuthAngle = -Infinity; // radians\n this.maxAzimuthAngle = Infinity; // radians\n\n // Set to true to enable damping (inertia)\n // If damping is enabled, you must call controls.update() in your animation loop\n this.enableDamping = false;\n this.dampingFactor = 0.05;\n\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n // Set to false to disable zooming\n this.enableZoom = true;\n this.zoomSpeed = 1.0;\n\n // Set to false to disable rotating\n this.enableRotate = true;\n this.rotateSpeed = 1.0;\n\n // Set to false to disable panning\n this.enablePan = true;\n this.panSpeed = 1.0;\n this.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n this.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\n // Set to true to automatically rotate around the target\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\n this.autoRotate = false;\n this.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\n\n // The four arrow keys\n this.keys = { LEFT: \"ArrowLeft\", UP: \"ArrowUp\", RIGHT: \"ArrowRight\", BOTTOM: \"ArrowDown\" };\n\n // Mouse buttons\n this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n // Touch fingers\n this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n // for reset\n this.target0 = this.target.clone();\n this.position0 = this.object.position.clone();\n this.zoom0 = this.object.zoom;\n\n // the target DOM element for key events\n this._domElementKeyEvents = null;\n\n //\n // public methods\n //\n\n this.getPolarAngle = function () {\n return spherical.phi;\n };\n\n this.getAzimuthalAngle = function () {\n return spherical.theta;\n };\n\n this.getDistance = function () {\n return this.object.position.distanceTo(this.target);\n };\n\n this.listenToKeyEvents = function (domElement) {\n domElement.addEventListener(\"keydown\", onKeyDown);\n this._domElementKeyEvents = domElement;\n };\n\n this.stopListenToKeyEvents = function () {\n this._domElementKeyEvents.removeEventListener(\"keydown\", onKeyDown);\n this._domElementKeyEvents = null;\n };\n\n this.saveState = function () {\n scope.target0.copy(scope.target);\n scope.position0.copy(scope.object.position);\n scope.zoom0 = scope.object.zoom;\n };\n\n this.reset = function () {\n scope.target.copy(scope.target0);\n scope.object.position.copy(scope.position0);\n scope.object.zoom = scope.zoom0;\n\n scope.object.updateProjectionMatrix();\n scope.dispatchEvent(_changeEvent);\n\n scope.update();\n\n scope.state = STATE.NONE;\n };\n\n // this method is exposed, but perhaps it would be better if we can make it private...\n this.update = (function () {\n const offset = new Vector3();\n\n // so camera.up is the orbit axis\n const quat = new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0));\n const quatInverse = quat.clone().invert();\n\n const lastPosition = new Vector3();\n const lastQuaternion = new Quaternion();\n const lastTargetPosition = new Vector3();\n\n const twoPI = 2 * Math.PI;\n\n return function update() {\n const position = scope.object.position;\n\n offset.copy(position).sub(scope.target);\n\n // rotate offset to \"y-axis-is-up\" space\n offset.applyQuaternion(quat);\n\n // angle from z-axis around y-axis\n spherical.setFromVector3(offset);\n\n if (scope.autoRotate && scope.state === STATE.NONE) {\n rotateLeft(getAutoRotationAngle());\n }\n\n if (scope.enableDamping) {\n spherical.theta += sphericalDelta.theta * scope.dampingFactor;\n spherical.phi += sphericalDelta.phi * scope.dampingFactor;\n } else {\n spherical.theta += sphericalDelta.theta;\n spherical.phi += sphericalDelta.phi;\n }\n\n // restrict theta to be between desired limits\n\n let min = scope.minAzimuthAngle;\n let max = scope.maxAzimuthAngle;\n\n if (isFinite(min) && isFinite(max)) {\n if (min < -Math.PI) min += twoPI;\n else if (min > Math.PI) min -= twoPI;\n\n if (max < -Math.PI) max += twoPI;\n else if (max > Math.PI) max -= twoPI;\n\n if (min <= max) {\n spherical.theta = Math.max(min, Math.min(max, spherical.theta));\n } else {\n spherical.theta =\n spherical.theta > (min + max) / 2 ? Math.max(min, spherical.theta) : Math.min(max, spherical.theta);\n }\n }\n\n // restrict phi to be between desired limits\n spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\n\n spherical.makeSafe();\n\n spherical.radius *= scope.scale;\n\n // restrict radius to be between desired limits\n spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\n\n // move target to panned location\n\n if (scope.enableDamping === true) {\n scope.target.addScaledVector(scope.panOffset, scope.dampingFactor);\n } else {\n scope.target.add(scope.panOffset);\n }\n\n offset.setFromSpherical(spherical);\n\n // rotate offset back to \"camera-up-vector-is-up\" space\n offset.applyQuaternion(quatInverse);\n\n position.copy(scope.target).add(offset);\n\n scope.object.lookAt(scope.target);\n\n if (scope.enableDamping === true) {\n sphericalDelta.theta *= 1 - scope.dampingFactor;\n sphericalDelta.phi *= 1 - scope.dampingFactor;\n\n scope.panOffset.multiplyScalar(1 - scope.dampingFactor);\n } else {\n sphericalDelta.set(0, 0, 0);\n\n scope.panOffset.set(0, 0, 0);\n }\n\n scope.scale = 1;\n\n // update condition is:\n // min(camera displacement, camera rotation in radians)^2 > EPS\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n if (\n scope.zoomChanged ||\n lastPosition.distanceToSquared(scope.object.position) > EPS ||\n 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS ||\n lastTargetPosition.distanceToSquared(scope.target) > 0\n ) {\n scope.dispatchEvent(_changeEvent);\n\n lastPosition.copy(scope.object.position);\n lastQuaternion.copy(scope.object.quaternion);\n lastTargetPosition.copy(scope.target);\n\n scope.zoomChanged = false;\n\n return true;\n }\n\n return false;\n };\n })();\n\n this.dispose = function () {\n scope.domElement.removeEventListener(\"contextmenu\", onContextMenu);\n\n scope.domElement.removeEventListener(\"pointerdown\", onPointerDown);\n scope.domElement.removeEventListener(\"pointercancel\", onPointerUp);\n scope.domElement.removeEventListener(\"wheel\", onMouseWheel);\n\n scope.domElement.removeEventListener(\"pointermove\", onPointerMove);\n scope.domElement.removeEventListener(\"pointerup\", onPointerUp);\n\n if (scope._domElementKeyEvents !== null) {\n scope._domElementKeyEvents.removeEventListener(\"keydown\", onKeyDown);\n scope._domElementKeyEvents = null;\n }\n\n //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n };\n\n //\n // internals\n //\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const scope = this;\n\n scope.state = STATE.NONE;\n\n const EPS = 0.000001;\n\n // current position in spherical coordinates\n const spherical = new Spherical();\n const sphericalDelta = new Spherical();\n\n scope.scale = 1;\n scope.panOffset = new Vector3();\n scope.zoomChanged = false;\n\n scope.rotateStart = new Vector2();\n scope.rotateEnd = new Vector2();\n scope.rotateDelta = new Vector2();\n\n scope.panStart = new Vector2();\n scope.panEnd = new Vector2();\n scope.panDelta = new Vector2();\n\n scope.dollyStart = new Vector2();\n scope.dollyEnd = new Vector2();\n scope.dollyDelta = new Vector2();\n scope.dollyScale = 0;\n\n scope.pointers = [];\n scope.pointerPositions = {};\n\n function getAutoRotationAngle() {\n return ((2 * Math.PI) / 60 / 60) * scope.autoRotateSpeed;\n }\n\n function getZoomScale() {\n return Math.pow(0.95, scope.zoomSpeed);\n }\n\n function rotateLeft(angle) {\n sphericalDelta.theta -= angle;\n }\n\n function rotateUp(angle) {\n sphericalDelta.phi -= angle;\n }\n\n const panLeft = (function () {\n const v = new Vector3();\n\n return function panLeft(distance, objectMatrix) {\n v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\n v.multiplyScalar(-distance);\n\n scope.panOffset.add(v);\n };\n })();\n\n const panUp = (function () {\n const v = new Vector3();\n\n return function panUp(distance, objectMatrix) {\n if (scope.screenSpacePanning === true) {\n v.setFromMatrixColumn(objectMatrix, 1);\n } else {\n v.setFromMatrixColumn(objectMatrix, 0);\n v.crossVectors(scope.object.up, v);\n }\n\n v.multiplyScalar(distance);\n\n scope.panOffset.add(v);\n };\n })();\n\n // deltaX and deltaY are in pixels; right and down are positive\n const pan = (function () {\n const offset = new Vector3();\n\n return function pan(deltaX, deltaY) {\n const element = scope.domElement;\n\n if (scope.object.isPerspectiveCamera) {\n // perspective\n const position = scope.object.position;\n offset.copy(position).sub(scope.target);\n let targetDistance = offset.length();\n\n // half of the fov is center to top of screen\n targetDistance *= Math.tan(((scope.object.fov / 2) * Math.PI) / 180.0);\n\n // we use only clientHeight here so aspect ratio does not distort speed\n panLeft((2 * deltaX * targetDistance) / element.clientHeight, scope.object.matrix);\n panUp((2 * deltaY * targetDistance) / element.clientHeight, scope.object.matrix);\n } else if (scope.object.isOrthographicCamera) {\n // orthographic\n panLeft(\n (deltaX * (scope.object.right - scope.object.left)) / scope.object.zoom / element.clientWidth,\n scope.object.matrix\n );\n panUp(\n (deltaY * (scope.object.top - scope.object.bottom)) / scope.object.zoom / element.clientHeight,\n scope.object.matrix\n );\n } else {\n // camera neither orthographic nor perspective\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\n scope.enablePan = false;\n }\n };\n })();\n\n function dollyOut(dollyScale) {\n if (scope.object.isPerspectiveCamera) {\n scope.scale /= dollyScale;\n } else if (scope.object.isOrthographicCamera) {\n scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\n scope.object.updateProjectionMatrix();\n scope.zoomChanged = true;\n } else {\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n scope.enableZoom = false;\n }\n }\n\n function dollyIn(dollyScale) {\n if (scope.object.isPerspectiveCamera) {\n scope.scale *= dollyScale;\n } else if (scope.object.isOrthographicCamera) {\n scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\n scope.object.updateProjectionMatrix();\n scope.zoomChanged = true;\n } else {\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n scope.enableZoom = false;\n }\n }\n\n //\n // event callbacks - update the object state\n //\n\n function handleMouseDownRotate(event) {\n scope.rotateStart.set(event.clientX, event.clientY);\n }\n\n function handleMouseDownDolly(event) {\n scope.dollyStart.set(event.clientX, event.clientY);\n }\n\n function handleMouseDownPan(event) {\n scope.panStart.set(event.clientX, event.clientY);\n }\n\n function handleMouseMoveRotate(event) {\n scope.rotateEnd.set(event.clientX, event.clientY);\n\n scope.rotateDelta.subVectors(scope.rotateEnd, scope.rotateStart).multiplyScalar(scope.rotateSpeed);\n\n const element = scope.domElement;\n\n rotateLeft((2 * Math.PI * scope.rotateDelta.x) / element.clientHeight); // yes, height\n\n rotateUp((2 * Math.PI * scope.rotateDelta.y) / element.clientHeight);\n\n scope.rotateStart.copy(scope.rotateEnd);\n\n scope.update();\n }\n\n function handleMouseMoveDolly(event) {\n scope.dollyEnd.set(event.clientX, event.clientY);\n\n scope.dollyDelta.subVectors(scope.dollyEnd, scope.dollyStart);\n\n if (scope.dollyDelta.y < 0) {\n scope.dollyScale = 1 / getZoomScale();\n dollyOut(getZoomScale());\n } else if (scope.dollyDelta.y > 0) {\n scope.dollyScale = getZoomScale();\n dollyIn(getZoomScale());\n }\n\n scope.dollyStart.copy(scope.dollyEnd);\n\n scope.update();\n }\n\n function handleMouseMovePan(event) {\n scope.panEnd.set(event.clientX, event.clientY);\n\n scope.panDelta.subVectors(scope.panEnd, scope.panStart).multiplyScalar(scope.panSpeed);\n\n pan(scope.panDelta.x, scope.panDelta.y);\n\n scope.panStart.copy(scope.panEnd);\n\n scope.update();\n }\n\n function handleMouseWheel(event) {\n scope.dollyEnd.set(scope.domElement.clientWidth / 2, scope.domElement.clientHeight / 2);\n\n scope.dollyDelta.set(event.deltaX, event.deltaY);\n\n if (event.deltaY < 0) {\n scope.dollyScale = 1 / getZoomScale();\n dollyIn(getZoomScale());\n } else if (event.deltaY > 0) {\n scope.dollyScale = getZoomScale();\n dollyOut(getZoomScale());\n }\n\n scope.dollyStart.copy(scope.dollyEnd);\n\n scope.update();\n\n if (event.deltaY !== 0) {\n scope.state = STATE.DOLLY;\n scope.dispatchEvent(_changeEvent);\n scope.state = STATE.NONE;\n }\n }\n\n function handleKeyDown(event) {\n let needsUpdate = false;\n\n switch (event.code) {\n case scope.keys.UP:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateUp((2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(0, scope.keyPanSpeed);\n }\n\n needsUpdate = true;\n break;\n\n case scope.keys.BOTTOM:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateUp((-2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(0, -scope.keyPanSpeed);\n }\n\n needsUpdate = true;\n break;\n\n case scope.keys.LEFT:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateLeft((2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(scope.keyPanSpeed, 0);\n }\n\n needsUpdate = true;\n break;\n\n case scope.keys.RIGHT:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateLeft((-2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(-scope.keyPanSpeed, 0);\n }\n\n needsUpdate = true;\n break;\n }\n\n if (needsUpdate) {\n // prevent the browser from scrolling on cursor keys\n event.preventDefault();\n\n scope.update();\n }\n }\n\n function handleTouchStartRotate() {\n if (scope.pointers.length === 1) {\n scope.rotateStart.set(scope.pointers[0].pageX, scope.pointers[0].pageY);\n } else {\n const x = 0.5 * (scope.pointers[0].pageX + scope.pointers[1].pageX);\n const y = 0.5 * (scope.pointers[0].pageY + scope.pointers[1].pageY);\n\n scope.rotateStart.set(x, y);\n }\n }\n\n function handleTouchStartPan() {\n if (scope.pointers.length === 1) {\n scope.panStart.set(scope.pointers[0].pageX, scope.pointers[0].pageY);\n } else {\n const x = 0.5 * (scope.pointers[0].pageX + scope.pointers[1].pageX);\n const y = 0.5 * (scope.pointers[0].pageY + scope.pointers[1].pageY);\n\n scope.panStart.set(x, y);\n }\n }\n\n function handleTouchStartDolly() {\n const dx = scope.pointers[0].pageX - scope.pointers[1].pageX;\n const dy = scope.pointers[0].pageY - scope.pointers[1].pageY;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n scope.dollyStart.set(0, distance);\n }\n\n function handleTouchStartDollyPan() {\n if (scope.enableZoom) handleTouchStartDolly();\n\n if (scope.enablePan) handleTouchStartPan();\n }\n\n function handleTouchStartDollyRotate() {\n if (scope.enableZoom) handleTouchStartDolly();\n\n if (scope.enableRotate) handleTouchStartRotate();\n }\n\n function handleTouchMoveRotate(event) {\n if (scope.pointers.length == 1) {\n scope.rotateEnd.set(event.pageX, event.pageY);\n } else {\n const position = getSecondPointerPosition(event);\n\n const x = 0.5 * (event.pageX + position.x);\n const y = 0.5 * (event.pageY + position.y);\n\n scope.rotateEnd.set(x, y);\n }\n\n scope.rotateDelta.subVectors(scope.rotateEnd, scope.rotateStart).multiplyScalar(scope.rotateSpeed);\n\n const element = scope.domElement;\n\n rotateLeft((2 * Math.PI * scope.rotateDelta.x) / element.clientHeight); // yes, height\n\n rotateUp((2 * Math.PI * scope.rotateDelta.y) / element.clientHeight);\n\n scope.rotateStart.copy(scope.rotateEnd);\n }\n\n function handleTouchMovePan(event) {\n if (scope.pointers.length === 1) {\n scope.panEnd.set(event.pageX, event.pageY);\n } else {\n const position = getSecondPointerPosition(event);\n\n const x = 0.5 * (event.pageX + position.x);\n const y = 0.5 * (event.pageY + position.y);\n\n scope.panEnd.set(x, y);\n }\n\n scope.panDelta.subVectors(scope.panEnd, scope.panStart).multiplyScalar(scope.panSpeed);\n\n pan(scope.panDelta.x, scope.panDelta.y);\n\n scope.panStart.copy(scope.panEnd);\n }\n\n function handleTouchMoveDolly(event) {\n const position = getSecondPointerPosition(event);\n\n const dx = event.pageX - position.x;\n const dy = event.pageY - position.y;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n scope.dollyEnd.set(0, distance);\n\n scope.dollyDelta.set(0, Math.pow(scope.dollyEnd.y / scope.dollyStart.y, scope.zoomSpeed));\n\n dollyOut(scope.dollyDelta.y);\n\n scope.dollyStart.copy(scope.dollyEnd);\n }\n\n function handleTouchMoveDollyPan(event) {\n if (scope.enableZoom) handleTouchMoveDolly(event);\n\n if (scope.enablePan) handleTouchMovePan(event);\n }\n\n function handleTouchMoveDollyRotate(event) {\n if (scope.enableZoom) handleTouchMoveDolly(event);\n\n if (scope.enableRotate) handleTouchMoveRotate(event);\n }\n\n //\n // event handlers - FSM: listen for events and reset state\n //\n\n function onPointerDown(event) {\n if (scope.enabled === false) return;\n\n if (scope.pointers.length === 0) {\n scope.domElement.setPointerCapture(event.pointerId);\n\n scope.domElement.addEventListener(\"pointermove\", onPointerMove);\n scope.domElement.addEventListener(\"pointerup\", onPointerUp);\n }\n\n //\n\n addPointer(event);\n\n if (event.pointerType === \"touch\") {\n onTouchStart(event);\n } else {\n onMouseDown(event);\n }\n }\n\n function onPointerMove(event) {\n if (scope.enabled === false) return;\n\n if (event.pointerType === \"touch\") {\n onTouchMove(event);\n } else {\n onMouseMove(event);\n }\n }\n\n function onPointerUp(event) {\n removePointer(event);\n\n if (scope.pointers.length === 0) {\n scope.domElement.releasePointerCapture(event.pointerId);\n\n scope.domElement.removeEventListener(\"pointermove\", onPointerMove);\n scope.domElement.removeEventListener(\"pointerup\", onPointerUp);\n }\n\n scope.dispatchEvent(_endEvent);\n\n scope.state = STATE.NONE;\n }\n\n function onMouseDown(event) {\n let mouseAction;\n\n switch (event.button) {\n case 0:\n mouseAction = scope.mouseButtons.LEFT;\n break;\n\n case 1:\n mouseAction = scope.mouseButtons.MIDDLE;\n break;\n\n case 2:\n mouseAction = scope.mouseButtons.RIGHT;\n break;\n\n default:\n mouseAction = -1;\n }\n\n switch (mouseAction) {\n case MOUSE.DOLLY:\n if (scope.enableZoom === false) return;\n\n handleMouseDownDolly(event);\n\n scope.state = STATE.DOLLY;\n\n break;\n\n case MOUSE.ROTATE:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n if (scope.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n scope.state = STATE.PAN;\n } else {\n if (scope.enableRotate === false) return;\n\n handleMouseDownRotate(event);\n\n scope.state = STATE.ROTATE;\n }\n\n break;\n\n case MOUSE.PAN:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n if (scope.enableRotate === false) return;\n\n handleMouseDownRotate(event);\n\n scope.state = STATE.ROTATE;\n } else {\n if (scope.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n scope.state = STATE.PAN;\n }\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n if (scope.state !== STATE.NONE) {\n scope.dispatchEvent(_startEvent);\n }\n }\n\n function onMouseMove(event) {\n switch (scope.state) {\n case STATE.ROTATE:\n if (scope.enableRotate === false) return;\n\n handleMouseMoveRotate(event);\n\n break;\n\n case STATE.DOLLY:\n if (scope.enableZoom === false) return;\n\n handleMouseMoveDolly(event);\n\n break;\n\n case STATE.PAN:\n if (scope.enablePan === false) return;\n\n handleMouseMovePan(event);\n\n break;\n }\n }\n\n function onMouseWheel(event) {\n if (scope.enabled === false || scope.enableZoom === false || scope.state !== STATE.NONE) return;\n\n event.preventDefault();\n\n scope.dispatchEvent(_startEvent);\n\n handleMouseWheel(event);\n\n scope.dispatchEvent(_endEvent);\n }\n\n function onKeyDown(event) {\n if (scope.enabled === false || scope.enablePan === false) return;\n\n handleKeyDown(event);\n }\n\n function onTouchStart(event) {\n trackPointer(event);\n\n switch (scope.pointers.length) {\n case 1:\n switch (scope.touches.ONE) {\n case TOUCH.ROTATE:\n if (scope.enableRotate === false) return;\n\n handleTouchStartRotate();\n\n scope.state = STATE.TOUCH_ROTATE;\n\n break;\n\n case TOUCH.PAN:\n if (scope.enablePan === false) return;\n\n handleTouchStartPan();\n\n scope.state = STATE.TOUCH_PAN;\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n break;\n\n case 2:\n switch (scope.touches.TWO) {\n case TOUCH.DOLLY_PAN:\n if (scope.enableZoom === false && scope.enablePan === false) return;\n\n handleTouchStartDollyPan();\n\n scope.state = STATE.TOUCH_DOLLY_PAN;\n\n break;\n\n case TOUCH.DOLLY_ROTATE:\n if (scope.enableZoom === false && scope.enableRotate === false) return;\n\n handleTouchStartDollyRotate();\n\n scope.state = STATE.TOUCH_DOLLY_ROTATE;\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n if (scope.state !== STATE.NONE) {\n scope.dispatchEvent(_startEvent);\n }\n }\n\n function onTouchMove(event) {\n trackPointer(event);\n\n switch (scope.state) {\n case STATE.TOUCH_ROTATE:\n if (scope.enableRotate === false) return;\n\n handleTouchMoveRotate(event);\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_PAN:\n if (scope.enablePan === false) return;\n\n handleTouchMovePan(event);\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_PAN:\n if (scope.enableZoom === false && scope.enablePan === false) return;\n\n handleTouchMoveDollyPan(event);\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_ROTATE:\n if (scope.enableZoom === false && scope.enableRotate === false) return;\n\n handleTouchMoveDollyRotate(event);\n\n scope.update();\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n }\n\n function onContextMenu(event) {\n if (scope.enabled === false) return;\n\n event.preventDefault();\n }\n\n function addPointer(event) {\n scope.pointers.push(event);\n }\n\n function removePointer(event) {\n delete scope.pointerPositions[event.pointerId];\n\n for (let i = 0; i < scope.pointers.length; i++) {\n if (scope.pointers[i].pointerId == event.pointerId) {\n scope.pointers.splice(i, 1);\n return;\n }\n }\n }\n\n function trackPointer(event) {\n let position = scope.pointerPositions[event.pointerId];\n\n if (position === undefined) {\n position = new Vector2();\n scope.pointerPositions[event.pointerId] = position;\n }\n\n position.set(event.pageX, event.pageY);\n }\n\n function getSecondPointerPosition(event) {\n const pointer = event.pointerId === scope.pointers[0].pointerId ? scope.pointers[1] : scope.pointers[0];\n\n return scope.pointerPositions[pointer.pointerId];\n }\n\n //\n\n scope.domElement.addEventListener(\"contextmenu\", onContextMenu);\n\n scope.domElement.addEventListener(\"pointerdown\", onPointerDown);\n scope.domElement.addEventListener(\"pointercancel\", onPointerUp);\n scope.domElement.addEventListener(\"wheel\", onMouseWheel, { passive: false });\n\n // force an update at start\n\n this.update();\n }\n}\n\nexport { OrbitControls, STATE };\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MOUSE, TOUCH } from \"three\";\nimport { type IDragger } from \"@inweb/viewer-core\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { OrbitControls, STATE } from \"../controls/OrbitControls.js\";\n\nexport class OrbitDragger implements IDragger {\n protected viewer: Viewer;\n protected orbit: OrbitControls;\n protected changed: boolean;\n\n constructor(viewer: Viewer) {\n this.orbit = new OrbitControls(viewer.camera, viewer.canvas);\n this.orbit.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.PAN };\n this.orbit.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n this.orbit.screenSpacePanning = true;\n this.orbit.rotateSpeed = 0.33;\n this.orbit.addEventListener(\"start\", this.controlsStart);\n this.orbit.addEventListener(\"change\", this.controlsChange);\n this.changed = false;\n this.viewer = viewer;\n this.viewer.addEventListener(\"databasechunk\", this.updateControls);\n this.viewer.on(\"viewposition\", this.updateControls);\n this.viewer.addEventListener(\"zoom\", this.updateControls);\n this.viewer.addEventListener(\"drawviewpoint\", this.updateControls);\n this.viewer.addEventListener(\"changecameramode\", this.updateControlsCamera);\n this.viewer.addEventListener(\"contextmenu\", this.stopContextMenu);\n this.updateControls();\n }\n\n initialize() {}\n\n dispose(): void {\n this.viewer.removeEventListener(\"databasechunk\", this.updateControls);\n this.viewer.off(\"viewposition\", this.updateControls);\n this.viewer.removeEventListener(\"zoom\", this.updateControls);\n this.viewer.removeEventListener(\"drawviewpoint\", this.updateControls);\n this.viewer.removeEventListener(\"changecameramode\", this.updateControlsCamera);\n this.viewer.removeEventListener(\"contextmenu\", this.stopContextMenu);\n\n this.orbit.removeEventListener(\"start\", this.controlsStart);\n this.orbit.removeEventListener(\"change\", this.controlsChange);\n this.orbit.dispose();\n }\n\n updateControls = () => {\n this.orbit.target.copy(this.viewer.target);\n this.orbit.update();\n };\n\n updateControlsCamera = () => {\n this.orbit.maxDistance = this.viewer.camera.far;\n this.orbit.minDistance = this.viewer.camera.near;\n this.orbit.object = this.viewer.camera;\n this.orbit.update();\n };\n\n controlsStart = () => {\n this.changed = false;\n };\n\n controlsChange = () => {\n this.viewer.target.copy(this.orbit.target);\n this.viewer.update();\n\n switch (this.orbit.state) {\n case STATE.ROTATE:\n case STATE.TOUCH_ROTATE:\n this.viewer.emitEvent({\n type: \"orbit\",\n });\n break;\n\n case STATE.PAN:\n case STATE.TOUCH_PAN:\n this.viewer.emitEvent({\n type: \"pan\",\n x: this.orbit.panEnd.x,\n y: this.orbit.panEnd.y,\n dX: this.orbit.panDelta.x,\n dY: this.orbit.panDelta.y,\n });\n break;\n\n case STATE.DOLLY:\n this.viewer.emitEvent({\n type: \"zoomat\",\n data: this.orbit.dollyScale,\n x: this.orbit.dollyEnd.x,\n y: this.orbit.dollyEnd.y,\n });\n break;\n }\n\n this.viewer.emitEvent({ type: \"changecamera\" });\n\n this.changed = true;\n };\n\n stopContextMenu = (event: PointerEvent) => {\n if (this.changed) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Object3D, Plane, Vector3 } from \"three\";\nimport { TransformControls } from \"three/examples/jsm/controls/TransformControls.js\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { PlaneHelper } from \"../helpers/PlaneHelper\";\nimport { OrbitDragger } from \"./OrbitDragger\";\n\nexport class CuttingPlaneDragger extends OrbitDragger {\n protected plane: Plane;\n protected planeCenter: Object3D;\n protected planeHelper: PlaneHelper;\n protected transform: TransformControls;\n\n constructor(viewer: Viewer, normal: Vector3, color: number) {\n super(viewer);\n\n const size = viewer.extents.getSize(new Vector3()).length();\n const center = viewer.extents.getCenter(new Vector3());\n const constant = -center.dot(normal);\n\n this.plane = new Plane(normal, constant);\n\n if (!viewer.renderer.clippingPlanes) viewer.renderer.clippingPlanes = [];\n viewer.renderer.clippingPlanes.push(this.plane);\n\n this.planeHelper = new PlaneHelper(this.plane, size, color, center);\n this.viewer.helpers.add(this.planeHelper);\n\n this.planeCenter = new Object3D();\n this.planeCenter.position.copy(viewer.extents.getCenter(new Vector3()));\n this.viewer.helpers.add(this.planeCenter);\n\n this.transform = new TransformControls(viewer.camera, viewer.canvas);\n this.transform.showX = !!normal.x;\n this.transform.showY = !!normal.y;\n this.transform.showZ = !!normal.z;\n this.transform.attach(this.planeCenter);\n this.transform.addEventListener(\"change\", this.transformChange);\n this.transform.addEventListener(\"dragging-changed\", this.transformDrag);\n this.viewer.helpers.add(this.transform.getHelper());\n\n this.viewer.addEventListener(\"explode\", this.updatePlaneSize);\n this.viewer.addEventListener(\"show\", this.updatePlaneSize);\n this.viewer.addEventListener(\"showall\", this.updatePlaneSize);\n this.viewer.addEventListener(\"changecameramode\", this.updateTransformCamera);\n this.viewer.canvas.addEventListener(\"dblclick\", this.onDoubleClick, true);\n this.viewer.update();\n }\n\n override dispose() {\n this.viewer.removeEventListener(\"explode\", this.updatePlaneSize);\n this.viewer.removeEventListener(\"show\", this.updatePlaneSize);\n this.viewer.removeEventListener(\"showall\", this.updatePlaneSize);\n this.viewer.removeEventListener(\"changecameramode\", this.updateTransformCamera);\n this.viewer.canvas.removeEventListener(\"dblclick\", this.onDoubleClick, true);\n\n this.transform.removeEventListener(\"change\", this.transformChange);\n this.transform.removeEventListener(\"dragging-changed\", this.transformDrag);\n this.transform.getHelper().removeFromParent();\n this.transform.detach();\n this.transform.dispose();\n\n this.planeHelper.removeFromParent();\n this.planeHelper.dispose();\n\n this.planeCenter.removeFromParent();\n\n // this.viewer.renderer.clippingPlanes = this.viewer.renderer.clippingPlanes.filter((plane) => plane !== this.plane);\n // this.viewer.update();\n\n super.dispose();\n }\n\n transformChange = () => {\n this.plane.constant = -this.planeCenter.position.dot(this.plane.normal);\n this.viewer.update();\n };\n\n transformDrag = (event) => {\n this.orbit.enabled = !event.value;\n };\n\n updatePlaneSize = () => {\n this.planeHelper.size = this.viewer.extents.getSize(new Vector3()).length();\n this.viewer.update();\n };\n\n updateTransformCamera = () => {\n this.transform.camera = this.viewer.camera;\n };\n\n onDoubleClick = (event: PointerEvent) => {\n event.stopPropagation();\n\n this.plane.negate();\n this.viewer.update();\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { CuttingPlaneDragger } from \"./CuttingPlaneDragger\";\n\nexport class CuttingPlaneXAxisDragger extends CuttingPlaneDragger {\n constructor(viewer: Viewer) {\n super(viewer, new Vector3(1, 0, 0), 0xff0000);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { CuttingPlaneDragger } from \"./CuttingPlaneDragger\";\n\nexport class CuttingPlaneYAxisDragger extends CuttingPlaneDragger {\n constructor(viewer: Viewer) {\n super(viewer, new Vector3(0, 1, 0), 0x00ff00);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { CuttingPlaneDragger } from \"./CuttingPlaneDragger\";\n\nexport class CuttingPlaneZAxisDragger extends CuttingPlaneDragger {\n constructor(viewer: Viewer) {\n super(viewer, new Vector3(0, 0, 1), 0x0000ff);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport {\n Camera,\n EdgesGeometry,\n Intersection,\n Line3,\n MathUtils,\n Matrix4,\n Object3D,\n Plane,\n Raycaster,\n Vector2,\n Vector3,\n Vector4,\n} from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { OrbitDragger } from \"./OrbitDragger\";\n\nconst PRECISION = 0.01;\nconst DESKTOP_SNAP_DISTANCE = 10;\nconst MOBILE_SNAP_DISTANCE = 50;\n\nexport class MeasureLineDragger extends OrbitDragger {\n private overlay: MeasureOverlay;\n private line: MeasureLine;\n private snapper: MeasureSnapper;\n\n constructor(viewer: Viewer) {\n super(viewer);\n\n this.overlay = new MeasureOverlay(viewer.camera, viewer.canvas);\n this.overlay.attach();\n\n this.line = new MeasureLine(this.overlay);\n this.overlay.addLine(this.line);\n\n this.snapper = new MeasureSnapper(viewer.camera, viewer.canvas);\n this.updateSnapper();\n\n this.viewer.canvas.addEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.canvas.addEventListener(\"pointermove\", this.onPointerMove);\n this.viewer.canvas.addEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.canvas.addEventListener(\"pointercancel\", this.onPointerCancel);\n this.viewer.canvas.addEventListener(\"pointerleave\", this.onPointerLeave);\n\n this.viewer.addEventListener(\"render\", this.renderOverlay);\n this.viewer.addEventListener(\"hide\", this.updateSnapper);\n this.viewer.addEventListener(\"isolate\", this.updateSnapper);\n this.viewer.addEventListener(\"show\", this.updateSnapper);\n this.viewer.addEventListener(\"showall\", this.updateSnapper);\n this.viewer.addEventListener(\"changecameramode\", this.updateSnapperCamera);\n }\n\n override dispose() {\n this.viewer.canvas.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.canvas.removeEventListener(\"pointermove\", this.onPointerMove);\n this.viewer.canvas.removeEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.canvas.removeEventListener(\"pointercancel\", this.onPointerCancel);\n this.viewer.canvas.removeEventListener(\"pointerleave\", this.onPointerLeave);\n\n this.viewer.removeEventListener(\"render\", this.renderOverlay);\n this.viewer.removeEventListener(\"hide\", this.updateSnapper);\n this.viewer.removeEventListener(\"isolate\", this.updateSnapper);\n this.viewer.removeEventListener(\"show\", this.updateSnapper);\n this.viewer.removeEventListener(\"showall\", this.updateSnapper);\n this.viewer.removeEventListener(\"changecameramode\", this.updateSnapperCamera);\n\n this.snapper.dispose();\n\n this.overlay.detach();\n this.overlay.dispose();\n\n super.dispose();\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n\n this.line.startPoint = this.snapper.getSnapPoint(event);\n this.line.render();\n\n this.viewer.canvas.setPointerCapture(event.pointerId);\n this.orbit.enabled = !this.line.startPoint;\n };\n\n onPointerMove = (event: PointerEvent) => {\n if (this.orbit.enabled && this.orbit.state !== -1) return;\n\n const snapPoint = this.snapper.getSnapPoint(event);\n if (snapPoint && this.line.endPoint && snapPoint.equals(this.line.endPoint)) return;\n\n this.line.endPoint = snapPoint;\n this.line.render();\n\n if (this.line.startPoint) this.changed = true; // <- to prevent context menu\n };\n\n onPointerUp = (event: PointerEvent) => {\n if (this.line.startPoint && this.line.endPoint && this.line.getDistance() >= PRECISION) {\n this.line = new MeasureLine(this.overlay);\n this.overlay.addLine(this.line);\n } else {\n this.line.startPoint = undefined;\n this.line.endPoint = undefined;\n this.line.render();\n }\n\n this.viewer.canvas.releasePointerCapture(event.pointerId);\n this.orbit.enabled = true;\n };\n\n onPointerCancel = (event: PointerEvent) => {\n this.viewer.canvas.dispatchEvent(new PointerEvent(\"pointerup\", event));\n };\n\n onPointerLeave = () => {\n this.line.endPoint = undefined;\n this.line.render();\n };\n\n renderOverlay = () => {\n this.overlay.render();\n };\n\n updateSnapper = () => {\n this.snapper.setFromViewer(this.viewer);\n };\n\n updateSnapperCamera = () => {\n this.snapper.camera = this.viewer.camera;\n this.overlay.camera = this.viewer.camera;\n };\n}\n\nconst _vertex = new Vector3();\nconst _start = new Vector3();\nconst _end = new Vector3();\nconst _line = new Line3();\nconst _center = new Vector3();\nconst _projection = new Vector3();\n\nclass MeasureSnapper {\n public camera: Camera;\n private canvas: HTMLCanvasElement;\n private objects: Object3D[];\n private clippingPlanes: Plane[];\n private raycaster: Raycaster;\n private detectRadiusInPixels: number;\n private edgesCache: WeakMap<any, EdgesGeometry>;\n\n constructor(camera: Camera, canvas: HTMLCanvasElement) {\n this.camera = camera;\n this.canvas = canvas;\n this.objects = [];\n this.clippingPlanes = [];\n this.raycaster = new Raycaster();\n this.detectRadiusInPixels = this.isMobile() ? MOBILE_SNAP_DISTANCE : DESKTOP_SNAP_DISTANCE;\n this.edgesCache = new WeakMap();\n }\n\n dispose() {\n this.objects = [];\n }\n\n isMobile(): boolean {\n if (typeof navigator === \"undefined\") return false;\n\n // ===================== AI-CODE-START ======================\n // Source: Claude Sonnet 4\n // Date: 2025-09-09\n // Reviewer: roman.mochalov@opendesign.com\n // Issue: CLOUD-5799\n\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);\n\n // ===================== AI-CODE-END ======================\n }\n\n getMousePosition(event: MouseEvent, target: Vector2): Vector2 {\n return target.set(event.clientX, event.clientY);\n }\n\n getPointerIntersects(mouse: Vector2): Array<Intersection<Object3D>> {\n const rect = this.canvas.getBoundingClientRect();\n const x = ((mouse.x - rect.left) / rect.width) * 2 - 1;\n const y = (-(mouse.y - rect.top) / rect.height) * 2 + 1;\n\n const coords = new Vector2(x, y);\n this.raycaster.setFromCamera(coords, this.camera);\n\n this.raycaster.params = {\n Mesh: {},\n Line: { threshold: 0.05 },\n Line2: { threshold: 0.05 },\n LOD: {},\n Points: { threshold: 0.01 },\n Sprite: {},\n };\n\n let intersects = this.raycaster.intersectObjects(this.objects, false);\n\n this.clippingPlanes.forEach((plane) => {\n intersects = intersects.filter((intersect) => plane.distanceToPoint(intersect.point) >= 0);\n });\n\n return intersects;\n }\n\n getDetectRadius(point: Vector3): number {\n const camera: any = this.camera;\n\n // ===================== AI-CODE-START ======================\n // Source: Gemini 2.5 Pro\n // Date: 2025-08-27\n // Reviewer: roman.mochalov@opendesign.com\n // Issue: CLOUD-5799\n // Notes: Originally AI-generated, modified manually\n\n if (camera.isOrthographicCamera) {\n const fieldHeight = (camera.top - camera.bottom) / camera.zoom;\n\n const canvasHeight = this.canvas.height;\n const worldUnitsPerPixel = fieldHeight / canvasHeight;\n\n return this.detectRadiusInPixels * worldUnitsPerPixel;\n }\n\n if (camera.isPerspectiveCamera) {\n const distance = camera.position.distanceTo(point);\n const fieldHeight = 2 * Math.tan(MathUtils.degToRad(camera.fov * 0.5)) * distance;\n\n const canvasHeight = this.canvas.height;\n const worldUnitsPerPixel = fieldHeight / canvasHeight;\n\n return this.detectRadiusInPixels * worldUnitsPerPixel;\n }\n\n // ===================== AI-CODE-END ======================\n\n return 0.1;\n }\n\n getSnapPoint(event: PointerEvent): Vector3 {\n const mouse = this.getMousePosition(event, new Vector2());\n\n const intersections = this.getPointerIntersects(mouse);\n if (intersections.length === 0) return undefined;\n\n // ===================== AI-CODE-START ======================\n // Source: Gemini 2.5 Pro\n // Date: 2025-08-20\n // Reviewer: roman.mochalov@opendesign.com\n // Issue: CLOUD-5799\n // Notes: Originally AI-generated, modified manually\n\n const object: any = intersections[0].object;\n const intersectionPoint = intersections[0].point;\n const localPoint = object.worldToLocal(intersectionPoint.clone());\n\n let snapPoint: Vector3;\n let snapDistance = this.getDetectRadius(intersectionPoint);\n\n const geometry = object.geometry;\n\n const positions = geometry.attributes.position.array;\n for (let i = 0; i < positions.length; i += 3) {\n _vertex.set(positions[i], positions[i + 1], positions[i + 2]);\n const distance = _vertex.distanceTo(localPoint);\n if (distance < snapDistance) {\n snapDistance = distance;\n snapPoint = _vertex.clone();\n }\n }\n if (snapPoint) return object.localToWorld(snapPoint);\n\n let edges = this.edgesCache.get(geometry);\n if (!edges) {\n edges = new EdgesGeometry(geometry);\n this.edgesCache.set(geometry, edges);\n }\n\n const edgePositions = edges.attributes.position.array;\n for (let i = 0; i < edgePositions.length; i += 6) {\n _start.set(edgePositions[i], edgePositions[i + 1], edgePositions[i + 2]);\n _end.set(edgePositions[i + 3], edgePositions[i + 4], edgePositions[i + 5]);\n _line.set(_start, _end);\n\n _line.getCenter(_center);\n const centerDistance = _center.distanceTo(localPoint);\n if (centerDistance < snapDistance) {\n snapDistance = centerDistance;\n snapPoint = _center.clone();\n continue;\n }\n\n _line.closestPointToPoint(localPoint, true, _projection);\n const lineDistance = _projection.distanceTo(localPoint);\n if (lineDistance < snapDistance) {\n snapDistance = lineDistance;\n snapPoint = _projection.clone();\n }\n }\n if (snapPoint) return object.localToWorld(snapPoint);\n\n // ===================== AI-CODE-END ======================\n\n return intersectionPoint.clone();\n }\n\n setFromViewer(viewer: Viewer) {\n this.objects.length = 0;\n viewer.models.forEach((model) => {\n model.getVisibleObjects().forEach((object) => this.objects.push(object));\n });\n\n this.camera = viewer.camera;\n this.clippingPlanes = viewer.renderer.clippingPlanes || [];\n }\n}\n\nclass MeasureOverlay {\n public camera: Camera;\n public canvas: HTMLCanvasElement;\n public container: HTMLElement;\n public lines: MeasureLine[] = [];\n public projector: MeasureProjector;\n private resizeObserver: ResizeObserver;\n\n constructor(camera: Camera, canvas: HTMLCanvasElement) {\n this.camera = camera;\n this.canvas = canvas;\n this.projector = new MeasureProjector(camera, canvas);\n this.resizeObserver = new ResizeObserver(this.resizeContainer);\n }\n\n attach() {\n this.container = document.createElement(\"div\");\n this.container.id = \"measure-container\";\n this.container.style.position = \"absolute\";\n this.container.style.outline = \"none\";\n this.container.style.pointerEvents = \"none\";\n this.container.style.overflow = \"hidden\";\n\n if (!this.canvas.parentElement) return;\n\n this.canvas.parentElement.appendChild(this.container);\n this.resizeObserver.observe(this.canvas.parentElement);\n }\n\n dispose() {\n this.clear();\n }\n\n detach() {\n this.resizeObserver.disconnect();\n\n this.container.remove();\n this.container = undefined;\n }\n\n clear() {\n this.lines.forEach((line) => line.dispose());\n this.lines = [];\n }\n\n render() {\n this.projector.setFromCamera(this.camera);\n this.lines.forEach((line) => line.render());\n }\n\n update() {\n this.lines.forEach((line) => line.update());\n }\n\n addLine(line: MeasureLine) {\n this.lines.push(line);\n }\n\n removeLine(line: MeasureLine) {\n this.lines = this.lines.filter((x) => x !== line);\n }\n\n resizeContainer = (entries: ResizeObserverEntry[]) => {\n const { width, height } = entries[0].contentRect;\n\n if (!width || !height) return; // <- invisible canvas, or canvas with parent removed\n\n this.container.style.width = `${width}px`;\n this.container.style.height = `${height}px`;\n };\n}\n\nconst _middlePoint = new Vector3();\n\nclass MeasureLine {\n private overlay: MeasureOverlay;\n\n private elementStartPoint: HTMLElement;\n private elementEndPoint: HTMLElement;\n private elementLine: HTMLElement;\n private elementLabel: HTMLElement;\n\n public startPoint: Vector3;\n public endPoint: Vector3;\n\n public id = MathUtils.generateUUID();\n public unit = \"\";\n public scale = 1.0;\n public size = 10.0;\n public lineWidth = 2;\n\n public style = {\n border: \"2px solid #FFFFFF\",\n background: \"#009bff\",\n boxShadow: \"0 0 10px rgba(0,0,0,0.5)\",\n color: \"white\",\n font: \"1rem system-ui\",\n };\n\n constructor(overlay: MeasureOverlay) {\n this.overlay = overlay;\n\n this.elementStartPoint = overlay.container.appendChild(document.createElement(\"div\"));\n this.elementEndPoint = overlay.container.appendChild(document.createElement(\"div\"));\n this.elementLine = overlay.container.appendChild(document.createElement(\"div\"));\n this.elementLabel = overlay.container.appendChild(document.createElement(\"div\"));\n\n this.update();\n }\n\n dispose() {\n this.elementStartPoint.remove();\n this.elementEndPoint.remove();\n this.elementLine.remove();\n this.elementLabel.remove();\n\n this.elementStartPoint = undefined;\n this.elementEndPoint = undefined;\n this.elementLine = undefined;\n this.elementLabel = undefined;\n }\n\n render() {\n const projector = this.overlay.projector;\n\n if (this.startPoint) {\n const { point, visible } = projector.projectPoint(this.startPoint);\n\n this.elementStartPoint.style.display = visible ? \"block\" : \"none\";\n this.elementStartPoint.style.left = `${point.x}px`;\n this.elementStartPoint.style.top = `${point.y}px`;\n } else {\n this.elementStartPoint.style.display = \"none\";\n }\n\n if (this.endPoint) {\n const { point, visible } = projector.projectPoint(this.endPoint);\n\n this.elementEndPoint.style.display = visible ? \"block\" : \"none\";\n this.elementEndPoint.style.left = `${point.x}px`;\n this.elementEndPoint.style.top = `${point.y}px`;\n } else {\n this.elementEndPoint.style.display = \"none\";\n }\n\n if (this.startPoint && this.endPoint) {\n const { point1, point2, visible } = projector.projectLine(this.startPoint, this.endPoint);\n\n point2.sub(point1);\n const angle = point2.angle();\n const width = point2.length();\n\n this.elementLine.style.display = visible ? \"block\" : \"none\";\n this.elementLine.style.left = `${point1.x}px`;\n this.elementLine.style.top = `${point1.y}px`;\n this.elementLine.style.width = `${width}px`;\n this.elementLine.style.transform = `translate(0px, ${-this.lineWidth / 2}px) rotate(${angle}rad)`;\n } else {\n this.elementLine.style.display = \"none\";\n }\n\n if (this.startPoint && this.endPoint) {\n _middlePoint.lerpVectors(this.startPoint, this.endPoint, 0.5);\n const { point, visible } = projector.projectPoint(_middlePoint);\n\n const distance = this.getDistance();\n\n this.elementLabel.style.display = visible && distance >= PRECISION ? \"block\" : \"none\";\n this.elementLabel.style.left = `${point.x}px`;\n this.elementLabel.style.top = `${point.y}px`;\n this.elementLabel.innerHTML = `${distance.toFixed(2)} ${this.unit}`;\n } else {\n this.elementLabel.style.display = \"none\";\n }\n }\n\n update() {\n this.elementStartPoint.id = `markup-dot-start-${this.id}`;\n this.elementStartPoint.style.position = \"absolute\";\n this.elementStartPoint.style.zIndex = \"2\";\n this.elementStartPoint.style.width = `${this.size}px`;\n this.elementStartPoint.style.height = `${this.size}px`;\n this.elementStartPoint.style.border = this.style.border;\n this.elementStartPoint.style.borderRadius = `${this.size}px`;\n this.elementStartPoint.style.background = this.style.background;\n this.elementStartPoint.style.boxShadow = this.style.boxShadow;\n this.elementStartPoint.style.transform = \"translate(-50%, -50%)\";\n\n this.elementEndPoint.id = `markup-dot-end-${this.id}`;\n this.elementEndPoint.style.position = \"absolute\";\n this.elementEndPoint.style.zIndex = \"2\";\n this.elementEndPoint.style.width = `${this.size}px`;\n this.elementEndPoint.style.height = `${this.size}px`;\n this.elementEndPoint.style.border = this.style.border;\n this.elementEndPoint.style.borderRadius = `${this.size}px`;\n this.elementEndPoint.style.background = this.style.background;\n this.elementEndPoint.style.boxShadow = this.style.boxShadow;\n this.elementEndPoint.style.transform = \"translate(-50%, -50%)\";\n\n this.elementLine.id = `markup-line-${this.id}`;\n this.elementLine.style.position = \"absolute\";\n this.elementLine.style.zIndex = \"1\";\n this.elementLine.style.height = `${this.lineWidth}px`;\n this.elementLine.style.background = this.style.background;\n this.elementLine.style.boxShadow = this.style.boxShadow;\n this.elementLine.style.transformOrigin = `0px ${this.lineWidth / 2}px`;\n\n this.elementLabel.id = `markup-label-${this.id}`;\n this.elementLabel.style.position = \"absolute\";\n this.elementLabel.style.zIndex = \"3\";\n this.elementLabel.style.padding = \"2px\";\n this.elementLabel.style.paddingInline = \"5px\";\n this.elementLabel.style.borderRadius = \"5px\";\n this.elementLabel.style.background = this.style.background;\n this.elementLabel.style.boxShadow = this.style.boxShadow;\n this.elementLabel.style.color = this.style.color;\n this.elementLabel.style.font = this.style.font;\n this.elementLabel.style.transform = \"translate(-50%, -50%)\";\n }\n\n getDistance(): number {\n return this.startPoint.distanceTo(this.endPoint) / this.scale;\n }\n}\n\nlet _widthHalf: number;\nlet _heightHalf: number;\nconst _viewMatrix = new Matrix4();\nconst _viewProjectionMatrix = new Matrix4();\nconst _vector = new Vector3();\nconst _vector1 = new Vector4();\nconst _vector2 = new Vector4();\nconst point = new Vector2();\nconst point1 = new Vector2();\nconst point2 = new Vector2();\n\nclass MeasureProjector {\n public camera: Camera;\n private canvas: HTMLElement;\n\n constructor(camera: Camera, canvas: HTMLCanvasElement) {\n this.camera = camera;\n this.canvas = canvas;\n }\n\n setFromCamera(camera: Camera) {\n this.camera = camera;\n this.updateProjectionMatrix();\n }\n\n updateProjectionMatrix() {\n const rect = this.canvas.getBoundingClientRect();\n _widthHalf = rect.width / 2;\n _heightHalf = rect.height / 2;\n\n _viewMatrix.copy(this.camera.matrixWorldInverse);\n _viewProjectionMatrix.multiplyMatrices(this.camera.projectionMatrix, _viewMatrix);\n }\n\n projectPoint(p: Vector3) {\n _vector.copy(p).applyMatrix4(_viewProjectionMatrix);\n const visible = _vector.z >= -1 && _vector.z <= 1;\n\n point.x = (_vector.x + 1) * _widthHalf;\n point.y = (-_vector.y + 1) * _heightHalf;\n\n return { point, visible };\n }\n\n projectLine(p1: Vector3, p2: Vector3) {\n let visible: boolean;\n\n _vector1.copy(p1 as any).applyMatrix4(_viewProjectionMatrix);\n _vector2.copy(p2 as any).applyMatrix4(_viewProjectionMatrix);\n\n // see three/examples/jsm/renderers/Projector.js/clipLine for more details\n\n const bc1near = _vector1.z + _vector1.w;\n const bc2near = _vector2.z + _vector2.w;\n const bc1far = -_vector1.z + _vector1.w;\n const bc2far = -_vector2.z + _vector2.w;\n\n if (bc1near >= 0 && bc2near >= 0 && bc1far >= 0 && bc2far >= 0) visible = true;\n else if ((bc1near < 0 && bc2near < 0) || (bc1far < 0 && bc2far < 0)) visible = false;\n else {\n let alpha1 = 0;\n let alpha2 = 1;\n\n if (bc1near < 0) alpha1 = Math.max(alpha1, bc1near / (bc1near - bc2near));\n else if (bc2near < 0) alpha2 = Math.min(alpha2, bc1near / (bc1near - bc2near));\n\n if (bc1far < 0) alpha1 = Math.max(alpha1, bc1far / (bc1far - bc2far));\n else if (bc2far < 0) alpha2 = Math.min(alpha2, bc1far / (bc1far - bc2far));\n\n visible = alpha2 >= alpha1;\n\n if (visible) {\n _vector1.lerp(_vector2, alpha1);\n _vector2.lerp(_vector1, 1 - alpha2);\n }\n }\n\n _vector1.multiplyScalar(1 / _vector1.w);\n _vector2.multiplyScalar(1 / _vector2.w);\n\n point1.x = (_vector1.x + 1) * _widthHalf;\n point1.y = (-_vector1.y + 1) * _heightHalf;\n\n point2.x = (_vector2.x + 1) * _widthHalf;\n point2.y = (-_vector2.y + 1) * _heightHalf;\n\n return { point1, point2, visible };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MOUSE } from \"three\";\n\nimport { OrbitDragger } from \"./OrbitDragger\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class PanDragger extends OrbitDragger {\n constructor(viewer: Viewer) {\n super(viewer);\n this.orbit.mouseButtons = { LEFT: MOUSE.PAN, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.PAN };\n // this.controls.touches = { ONE: TOUCH.PAN, TWO: TOUCH.DOLLY_ROTATE };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Clock, Camera, Controls, Quaternion, Vector2, Vector3, Raycaster, Object3D, MathUtils } from \"three\";\n\ninterface WalkControlsEventMap {\n change: { type: \"change\" };\n walkspeedchange: { type: \"walkspeedchange\"; data: number };\n}\n\nexport class WalkControls extends Controls<WalkControlsEventMap> {\n readonly EYE_HEIGHT = 1.7;\n readonly FAILING_DISTANCE = 2;\n readonly GROUND_FOLLOWING_SPEED = 0.05;\n readonly LOOK_SPEED = 0.1;\n readonly WALK_SPEED_DELIMITER = 4;\n readonly WHEEL_SPEED_DELIMITER = 15000;\n\n public movementSpeed = 0.1;\n public multiplier = 3;\n\n private raycaster: Raycaster;\n private groundObjects: Object3D[];\n\n private moveKeys: Set<string>;\n private moveWheel = 0;\n private moveClock: Clock;\n\n private quaternion: Quaternion;\n private downPosition: Vector2;\n private mouseDragOn = false;\n public rotateDelta: Vector2;\n\n private camera: Camera;\n\n constructor(camera: Camera, canvas: HTMLElement, groundObjects: Object3D[]) {\n super(camera, canvas);\n this.camera = camera;\n\n this.groundObjects = groundObjects;\n this.raycaster = new Raycaster();\n this.raycaster.near = 0;\n this.raycaster.far = this.EYE_HEIGHT + this.FAILING_DISTANCE;\n\n this.moveKeys = new Set();\n this.moveClock = new Clock();\n\n this.quaternion = camera.quaternion.clone();\n this.downPosition = new Vector2(0, 0);\n this.rotateDelta = new Vector2(0, 0);\n\n this.domElement.addEventListener(\"pointerdown\", this.onPointerDown);\n this.domElement.addEventListener(\"pointermove\", this.onPointerMove);\n this.domElement.addEventListener(\"pointerup\", this.onPointerUp);\n this.domElement.addEventListener(\"pointercancel\", this.onPointerCancel);\n this.domElement.addEventListener(\"wheel\", this.onWheel);\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n override dispose() {\n this.domElement.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.domElement.removeEventListener(\"pointermove\", this.onPointerMove);\n this.domElement.removeEventListener(\"pointerup\", this.onPointerUp);\n this.domElement.removeEventListener(\"pointercancel\", this.onPointerCancel);\n this.domElement.removeEventListener(\"wheel\", this.onWheel);\n\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n\n super.dispose();\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n\n this.domElement.setPointerCapture(event.pointerId);\n this.downPosition.set(event.clientX, event.clientY);\n this.quaternion.copy(this.object.quaternion);\n this.mouseDragOn = true;\n };\n\n onPointerMove = (event: PointerEvent) => {\n if (!this.mouseDragOn) return;\n\n const movePosition = new Vector2(event.clientX, event.clientY);\n if (this.downPosition.distanceTo(movePosition) === 0) return;\n\n this.rotateDelta.copy(this.downPosition).sub(movePosition);\n this.rotateCamera(this.rotateDelta);\n this.dispatchEvent({ type: \"change\" });\n };\n\n onPointerUp = (event: PointerEvent) => {\n this.domElement.releasePointerCapture(event.pointerId);\n this.mouseDragOn = false;\n };\n\n onPointerCancel = (event: PointerEvent) => {\n this.domElement.dispatchEvent(new PointerEvent(\"pointerup\", event));\n };\n\n onWheel = (event: WheelEvent) => {\n this.moveWheel = event.deltaY;\n this.update();\n };\n\n onKeyDown = (event: KeyboardEvent) => {\n switch (event.code) {\n case \"NumpadSubtract\":\n case \"Minus\":\n if (this.multiplier > 1) {\n this.multiplier = this.multiplier - 1;\n this.dispatchEvent({ type: \"walkspeedchange\", data: this.multiplier });\n }\n break;\n\n case \"NumpadAdd\":\n case \"Equal\":\n if (this.multiplier < 10) {\n this.multiplier = this.multiplier + 1;\n this.dispatchEvent({ type: \"walkspeedchange\", data: this.multiplier });\n }\n break;\n\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"ArrowUp\":\n case \"ArrowDown\":\n case \"KeyW\":\n case \"KeyS\":\n case \"KeyA\":\n case \"KeyD\":\n case \"KeyQ\":\n case \"KeyE\":\n this.moveKeys.add(event.code);\n this.update();\n break;\n }\n };\n\n onKeyUp = (event: KeyboardEvent) => {\n if (this.moveKeys.delete(event.code)) this.update();\n };\n\n private updateGroundFollowing() {\n const up = new Vector3().copy(this.camera.up);\n this.raycaster.set(this.object.position, up.negate());\n\n this.raycaster.params = this.raycaster.params = {\n Mesh: {},\n Line: { threshold: 0 },\n Line2: { threshold: 0 },\n LOD: { threshold: 0 },\n Points: { threshold: 0 },\n Sprite: { threshold: 0 },\n };\n\n const intersects = this.raycaster.intersectObjects(this.groundObjects, false);\n if (intersects.length > 0) {\n const groundY = intersects[0].point.y;\n const targetY = groundY + this.EYE_HEIGHT;\n\n // Smoothly interpolate the camera's y position to the target height\n this.object.position.y = MathUtils.lerp(this.object.position.y, targetY, this.GROUND_FOLLOWING_SPEED);\n }\n }\n\n override update() {\n let moved = false;\n let upgradeGroundFollowing = false;\n const forward = new Vector3();\n const sideways = new Vector3();\n\n if (this.moveKeys.size > 0) {\n upgradeGroundFollowing = true;\n const timeDelta = this.moveClock.getDelta();\n const moveDelta = (timeDelta * this.multiplier * this.movementSpeed) / this.WALK_SPEED_DELIMITER;\n\n this.object.getWorldDirection(forward);\n forward.y = 0;\n forward.normalize();\n\n sideways.setFromMatrixColumn(this.object.matrix, 0);\n sideways.y = 0;\n sideways.normalize();\n\n if (this.moveKeys.has(\"KeyW\")) {\n this.object.position.addScaledVector(forward, moveDelta);\n }\n if (this.moveKeys.has(\"KeyS\")) {\n this.object.position.addScaledVector(forward, -moveDelta);\n }\n\n if (this.moveKeys.has(\"KeyA\")) {\n this.object.position.addScaledVector(sideways, -moveDelta);\n }\n if (this.moveKeys.has(\"KeyD\")) {\n this.object.position.addScaledVector(sideways, moveDelta);\n }\n\n if (this.moveKeys.has(\"KeyQ\")) {\n this.object.translateY(moveDelta);\n upgradeGroundFollowing = false;\n }\n if (this.moveKeys.has(\"KeyE\")) {\n this.object.translateY(-moveDelta);\n upgradeGroundFollowing = false;\n }\n\n const lookDelta = this.LOOK_SPEED + (this.multiplier - 1);\n\n if (this.moveKeys.has(\"ArrowUp\")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, -lookDelta / 2)));\n if (this.moveKeys.has(\"ArrowDown\")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, lookDelta / 2)));\n if (this.moveKeys.has(\"ArrowLeft\")) this.rotateCamera(this.rotateDelta.add(new Vector2(lookDelta, 0)));\n if (this.moveKeys.has(\"ArrowRight\")) this.rotateCamera(this.rotateDelta.add(new Vector2(-lookDelta, 0)));\n\n this.moveWheel = 0;\n moved = true;\n }\n\n if (this.moveWheel !== 0) {\n const moveDelta = (this.moveWheel * this.multiplier * this.movementSpeed) / this.WHEEL_SPEED_DELIMITER;\n\n this.object.getWorldDirection(forward);\n forward.y = 0;\n forward.normalize();\n this.object.position.addScaledVector(forward, -moveDelta);\n\n this.moveWheel += -1 * Math.sign(this.moveWheel);\n moved = true;\n }\n\n if (upgradeGroundFollowing) this.updateGroundFollowing();\n\n if (moved) {\n this.dispatchEvent({ type: \"change\" });\n }\n\n if (this.moveKeys.size === 0 && this.moveWheel === 0) {\n this.moveClock.stop();\n this.moveClock.autoStart = true;\n }\n }\n\n rotateCamera(delta: Vector2) {\n const rotateX = (Math.PI * delta.x) / this.domElement.clientWidth;\n const rotateY = (Math.PI * delta.y) / this.domElement.clientHeight;\n\n const xRotation = new Quaternion();\n xRotation.setFromAxisAngle(this.object.up, rotateX);\n\n const yRotation = new Quaternion();\n yRotation.setFromAxisAngle(new Vector3(1, 0, 0), rotateY);\n\n const quaternion = this.quaternion.clone();\n quaternion.premultiply(xRotation).multiply(yRotation).normalize();\n\n this.object.setRotationFromQuaternion(quaternion);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\n// ===================== AI-CODE-FILE ======================\n// Source: Claude Sonnet 4.5\n// Date: 2025-10-07\n// Reviewer: vitaly.ivanov@opendesign.com\n// Issue: CLOUD-5851\n// Notes: Originally AI-generated, modified manually\n// =========================================================\n\nimport { Camera, Clock, Controls, Vector2, Vector3, Raycaster, Object3D, MathUtils } from \"three\";\n\ninterface JoyStickControlsEventMap {\n change: { type: \"change\" };\n}\n\nexport class JoyStickControls extends Controls<JoyStickControlsEventMap> {\n readonly EYE_HEIGHT = 1.7;\n readonly FAILING_DISTANCE = 2;\n readonly GROUND_FOLLOWING_SPEED = 0.05;\n readonly WALK_SPEED_DELIMITER = 4;\n\n public movementSpeed = 0.1;\n public multiplier = 3;\n\n private raycaster: Raycaster;\n private groundObjects: Object3D[];\n\n private canvas: HTMLCanvasElement;\n private overlayElement: HTMLDivElement;\n private joyStickCanvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n\n private moveClock: Clock;\n private camera: Camera;\n\n private joyStickPosition: Vector2;\n private isActive: boolean = false;\n\n private readonly MAX_JOYSTICK_DISTANCE = 100;\n private readonly INTERNAL_RADIUS = 35;\n private readonly MAX_MOVE_STICK = 40;\n private readonly EXTERNAL_RADIUS = 65;\n private readonly CANVAS_SIZE = 200;\n\n private centerX: number;\n private centerY: number;\n private pressed: boolean = false;\n\n constructor(camera: Camera, domElement: HTMLElement, canvasElement: HTMLCanvasElement, groundObjects: Object3D[]) {\n super(camera, domElement);\n this.camera = camera;\n this.canvas = canvasElement;\n this.moveClock = new Clock(false);\n this.joyStickPosition = new Vector2(0, 0);\n\n this.groundObjects = groundObjects;\n this.raycaster = new Raycaster();\n this.raycaster.near = 0;\n this.raycaster.far = this.EYE_HEIGHT + this.FAILING_DISTANCE;\n\n this.centerX = this.CANVAS_SIZE / 2;\n this.centerY = this.CANVAS_SIZE / 2;\n\n this.overlayElement = document.createElement(\"div\");\n this.overlayElement.id = \"joyStickDiv\";\n this.overlayElement.style.background = \"rgba(0,0,0,0)\";\n this.overlayElement.style.position = \"fixed\";\n this.overlayElement.style.zIndex = \"0\";\n this.overlayElement.style.touchAction = \"none\";\n document.body.appendChild(this.overlayElement);\n\n this.joyStickCanvas = document.createElement(\"canvas\");\n this.joyStickCanvas.id = \"joyStickCanvas\";\n this.joyStickCanvas.width = this.CANVAS_SIZE;\n this.joyStickCanvas.height = this.CANVAS_SIZE;\n this.overlayElement.appendChild(this.joyStickCanvas);\n this.context = this.joyStickCanvas.getContext(\"2d\")!;\n\n this.joyStickCanvas.addEventListener(\"pointerdown\", this.onPointerDown);\n document.addEventListener(\"pointermove\", this.onPointerMove);\n document.addEventListener(\"pointerup\", this.onPointerUp);\n\n window.addEventListener(\"resize\", this.onResize);\n document.addEventListener(\"fullscreenchange\", this.onResize);\n\n this.updateVisibility();\n this.updatePosition();\n this.draw();\n }\n\n override dispose() {\n this.joyStickCanvas.removeEventListener(\"pointerdown\", this.onPointerDown);\n document.removeEventListener(\"pointermove\", this.onPointerMove);\n document.removeEventListener(\"pointerup\", this.onPointerUp);\n\n window.removeEventListener(\"resize\", this.onResize);\n document.removeEventListener(\"fullscreenchange\", this.onResize);\n\n this.overlayElement.remove();\n super.dispose();\n }\n\n private onPointerDown = (event: PointerEvent) => {\n event.preventDefault();\n this.pressed = true;\n };\n\n private onPointerMove = (event: PointerEvent) => {\n event.preventDefault();\n if (!this.pressed) return;\n\n let movedX = event.pageX;\n let movedY = event.pageY;\n\n if (\n this.joyStickCanvas.offsetParent &&\n (this.joyStickCanvas.offsetParent as HTMLElement).tagName.toUpperCase() === \"BODY\"\n ) {\n movedX -= this.joyStickCanvas.offsetLeft;\n movedY -= this.joyStickCanvas.offsetTop;\n } else if (this.joyStickCanvas.offsetParent) {\n movedX -= (this.joyStickCanvas.offsetParent as HTMLElement).offsetLeft;\n movedY -= (this.joyStickCanvas.offsetParent as HTMLElement).offsetTop;\n }\n\n const x = 100 * ((movedX - this.centerX) / this.MAX_MOVE_STICK);\n const y = 100 * ((movedY - this.centerY) / this.MAX_MOVE_STICK) * -1;\n\n const distance = Math.sqrt(x * x + y * y);\n if (distance > 20) {\n this.joyStickPosition.set(x, y);\n this.isActive = true;\n } else {\n this.joyStickPosition.set(0, 0);\n this.isActive = false;\n }\n\n this.draw();\n this.moveClock.start();\n this.update();\n };\n\n private onPointerUp = (event: PointerEvent) => {\n event.preventDefault();\n this.pressed = false;\n this.joyStickPosition.set(0, 0);\n this.isActive = false;\n this.moveClock.stop();\n this.draw();\n };\n\n private onResize = () => {\n this.updateVisibility();\n this.updatePosition();\n };\n\n private updateVisibility() {\n const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n const isNarrowScreen = window.innerWidth < 1024;\n\n if (isMobile || isNarrowScreen) {\n this.overlayElement.style.display = \"block\";\n } else {\n this.overlayElement.style.display = \"none\";\n }\n }\n\n private updatePosition() {\n const rect = this.canvas.getBoundingClientRect();\n this.overlayElement.style.top = `${rect.height - this.CANVAS_SIZE}px`;\n this.overlayElement.style.left = `${rect.left}px`;\n this.overlayElement.style.width = `${this.CANVAS_SIZE}px`;\n this.overlayElement.style.height = `${this.CANVAS_SIZE}px`;\n }\n\n private draw() {\n this.context.clearRect(0, 0, this.CANVAS_SIZE, this.CANVAS_SIZE);\n\n // Draw external circle\n this.context.beginPath();\n this.context.arc(this.centerX, this.centerY, this.EXTERNAL_RADIUS, 0, 2 * Math.PI, false);\n this.context.lineWidth = 2;\n this.context.strokeStyle = \"#35436E\";\n this.context.globalAlpha = 0.5;\n this.context.stroke();\n\n // Draw internal circle\n let movedX = this.centerX + (this.joyStickPosition.x * this.MAX_MOVE_STICK) / 100;\n let movedY = this.centerY - (this.joyStickPosition.y * this.MAX_MOVE_STICK) / 100;\n\n movedX = Math.max(this.MAX_MOVE_STICK, Math.min(this.CANVAS_SIZE - this.MAX_MOVE_STICK, movedX));\n movedY = Math.max(this.MAX_MOVE_STICK, Math.min(this.CANVAS_SIZE - this.MAX_MOVE_STICK, movedY));\n\n this.context.beginPath();\n this.context.arc(movedX, movedY, this.INTERNAL_RADIUS, 0, 2 * Math.PI, false);\n this.context.fillStyle = \"#35436E\";\n this.context.lineWidth = 2;\n this.context.strokeStyle = \"#35436E\";\n this.context.globalAlpha = 0.5;\n this.context.fill();\n this.context.stroke();\n }\n\n private updateGroundFollowing() {\n const up = new Vector3().copy(this.camera.up);\n this.raycaster.set(this.camera.position, up.negate());\n\n this.raycaster.params = this.raycaster.params = {\n Mesh: {},\n Line: { threshold: 0 },\n Line2: { threshold: 0 },\n LOD: { threshold: 0 },\n Points: { threshold: 0 },\n Sprite: { threshold: 0 },\n };\n\n const intersects = this.raycaster.intersectObjects(this.groundObjects, false);\n if (intersects.length > 0) {\n const groundY = intersects[0].point.y;\n const targetY = groundY + this.EYE_HEIGHT;\n\n // Smoothly interpolate the camera's y position to the target height\n this.camera.position.y = MathUtils.lerp(this.camera.position.y, targetY, this.GROUND_FOLLOWING_SPEED);\n }\n }\n\n override update() {\n if (!this.isActive) return;\n\n const forwardInput = this.joyStickPosition.y / this.MAX_JOYSTICK_DISTANCE;\n const rightInput = this.joyStickPosition.x / this.MAX_JOYSTICK_DISTANCE;\n\n const timeDelta = this.moveClock.getDelta();\n const moveDelta = (timeDelta * this.multiplier * this.movementSpeed) / this.WALK_SPEED_DELIMITER;\n\n const forward = new Vector3();\n const sideways = new Vector3();\n\n this.camera.getWorldDirection(forward);\n if (this.groundObjects.length > 0) {\n forward.y = 0;\n }\n forward.normalize();\n\n sideways.setFromMatrixColumn(this.camera.matrix, 0);\n if (this.groundObjects.length > 0) {\n sideways.y = 0;\n }\n sideways.normalize();\n\n if (forwardInput !== 0) {\n this.camera.position.addScaledVector(forward, moveDelta * forwardInput);\n }\n if (rightInput !== 0) {\n this.camera.position.addScaledVector(sideways, moveDelta * rightInput);\n }\n\n if (forwardInput !== 0 || rightInput !== 0) {\n if (this.groundObjects.length > 0) this.updateGroundFollowing();\n this.dispatchEvent({ type: \"change\" });\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Mesh, Vector3 } from \"three\";\nimport { type IDragger } from \"@inweb/viewer-core\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { WalkControls } from \"../controls/WalkControls\";\nimport { JoyStickControls } from \"../controls/JoyStickControls\";\n\nexport class WalkDragger implements IDragger {\n protected viewer: Viewer;\n public controls: WalkControls;\n private joyStickControls: JoyStickControls;\n\n constructor(viewer: Viewer) {\n const meshOnlyGround: Mesh[] = [];\n viewer.models.forEach((model) =>\n model.getVisibleObjects().forEach((obj) => {\n if (obj instanceof Mesh) {\n meshOnlyGround.push(obj);\n }\n })\n );\n this.controls = new WalkControls(viewer.camera, viewer.canvas, meshOnlyGround);\n this.controls.addEventListener(\"change\", this.controlsChange);\n this.controls.addEventListener(\"walkspeedchange\", this.walkspeedChange);\n\n this.joyStickControls = new JoyStickControls(viewer.camera, viewer.canvas, viewer.canvas, meshOnlyGround);\n this.joyStickControls.addEventListener(\"change\", this.controlsChange);\n\n this.viewer = viewer;\n this.viewer.addEventListener(\"render\", this.viewerRender);\n this.viewer.addEventListener(\"zoom\", this.viewerZoom);\n this.viewer.addEventListener(\"changecameramode\", this.updateControlsCamera);\n this.updateControls();\n }\n\n dispose() {\n this.viewer.removeEventListener(\"render\", this.viewerRender);\n this.viewer.removeEventListener(\"zoom\", this.viewerZoom);\n this.viewer.removeEventListener(\"changecameramode\", this.updateControlsCamera);\n this.controls.removeEventListener(\"walkspeedchange\", this.walkspeedChange);\n this.controls.removeEventListener(\"change\", this.controlsChange);\n this.controls.dispose();\n\n this.joyStickControls.removeEventListener(\"change\", this.controlsChange);\n this.joyStickControls.dispose();\n }\n\n updateControls = () => {\n const size = this.viewer.extents.getSize(new Vector3());\n this.controls.movementSpeed = Math.min(size.x, size.y, size.z) / 2;\n this.joyStickControls.movementSpeed = this.controls.movementSpeed;\n this.joyStickControls.multiplier = this.controls.multiplier;\n };\n\n updateControlsCamera = () => {\n this.controls.object = this.viewer.camera;\n };\n\n controlsChange = () => {\n this.viewer.update();\n this.viewer.emitEvent({ type: \"changecamera\" });\n };\n\n walkspeedChange = (event: any) => {\n this.viewer.emitEvent(event);\n this.joyStickControls.multiplier = this.controls.multiplier;\n };\n\n viewerRender = () => {\n this.joyStickControls.update();\n this.controls.update();\n };\n\n viewerZoom = () => {\n this.controls.rotateDelta.set(0, 0);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Clock, Camera, Controls, Quaternion, Vector2, Vector3 } from \"three\";\n\ninterface FlyControlsEventMap {\n change: { type: \"change\" };\n flyspeedchange: { type: \"flyspeedchange\"; data: number };\n}\n\nexport class FlyControls extends Controls<FlyControlsEventMap> {\n public movementSpeed = 0.2;\n public lookSpeed = 5;\n public multiplier = 5;\n\n private moveKeys: Set<string>;\n private moveWheel = 0;\n private moveClock: Clock;\n\n private quaternion: Quaternion;\n private downPosition: Vector2;\n private mouseDragOn = false;\n public rotateDelta: Vector2;\n\n constructor(camera: Camera, canvas: HTMLElement) {\n super(camera, canvas);\n\n this.moveKeys = new Set();\n this.moveClock = new Clock();\n\n this.quaternion = camera.quaternion.clone();\n this.downPosition = new Vector2(0, 0);\n this.rotateDelta = new Vector2(0, 0);\n\n this.domElement.addEventListener(\"pointerdown\", this.onPointerDown);\n this.domElement.addEventListener(\"pointermove\", this.onPointerMove);\n this.domElement.addEventListener(\"pointerup\", this.onPointerUp);\n this.domElement.addEventListener(\"pointercancel\", this.onPointerCancel);\n this.domElement.addEventListener(\"wheel\", this.onWheel);\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n override dispose() {\n this.domElement.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.domElement.removeEventListener(\"pointermove\", this.onPointerMove);\n this.domElement.removeEventListener(\"pointerup\", this.onPointerUp);\n this.domElement.removeEventListener(\"pointercancel\", this.onPointerCancel);\n this.domElement.removeEventListener(\"wheel\", this.onWheel);\n\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n\n super.dispose();\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n\n this.domElement.setPointerCapture(event.pointerId);\n this.downPosition.set(event.clientX, event.clientY);\n this.quaternion.copy(this.object.quaternion);\n this.mouseDragOn = true;\n };\n\n onPointerMove = (event: PointerEvent) => {\n if (!this.mouseDragOn) return;\n\n const movePosition = new Vector2(event.clientX, event.clientY);\n if (this.downPosition.distanceTo(movePosition) === 0) return;\n\n this.rotateDelta.copy(this.downPosition).sub(movePosition);\n this.rotateCamera(this.rotateDelta);\n this.dispatchEvent({ type: \"change\" });\n };\n\n onPointerUp = (event: PointerEvent) => {\n this.domElement.releasePointerCapture(event.pointerId);\n this.mouseDragOn = false;\n };\n\n onPointerCancel = (event: PointerEvent) => {\n this.domElement.dispatchEvent(new PointerEvent(\"pointerup\", event));\n };\n\n onWheel = (event: WheelEvent) => {\n this.moveWheel = event.deltaY;\n this.update();\n };\n\n onKeyDown = (event: KeyboardEvent) => {\n switch (event.code) {\n case \"NumpadSubtract\":\n case \"Minus\":\n if (this.multiplier > 1) {\n this.multiplier = this.multiplier - 1;\n this.dispatchEvent({ type: \"flyspeedchange\", data: this.multiplier });\n }\n break;\n\n case \"NumpadAdd\":\n case \"Equal\":\n if (this.multiplier < 10) {\n this.multiplier = this.multiplier + 1;\n this.dispatchEvent({ type: \"flyspeedchange\", data: this.multiplier });\n }\n break;\n\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"ArrowUp\":\n case \"ArrowDown\":\n case \"KeyW\":\n case \"KeyS\":\n case \"KeyA\":\n case \"KeyD\":\n case \"KeyQ\":\n case \"KeyE\":\n this.moveKeys.add(event.code);\n this.update();\n break;\n }\n };\n\n onKeyUp = (event: KeyboardEvent) => {\n if (this.moveKeys.delete(event.code)) this.update();\n };\n\n override update() {\n if (this.moveKeys.size > 0) {\n const timeDelta = this.moveClock.getDelta();\n const moveDelta = timeDelta * this.movementSpeed * this.multiplier;\n\n if (this.moveKeys.has(\"KeyW\")) this.object.translateZ(-moveDelta);\n if (this.moveKeys.has(\"KeyS\")) this.object.translateZ(moveDelta);\n\n if (this.moveKeys.has(\"KeyA\")) this.object.translateX(-moveDelta);\n if (this.moveKeys.has(\"KeyD\")) this.object.translateX(moveDelta);\n\n if (this.moveKeys.has(\"KeyQ\")) this.object.translateY(moveDelta);\n if (this.moveKeys.has(\"KeyE\")) this.object.translateY(-moveDelta);\n\n const lookDelta = this.lookSpeed + (this.multiplier - 1);\n\n if (this.moveKeys.has(\"ArrowUp\")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, -lookDelta / 2)));\n if (this.moveKeys.has(\"ArrowDown\")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, lookDelta / 2)));\n\n if (this.moveKeys.has(\"ArrowLeft\")) this.rotateCamera(this.rotateDelta.add(new Vector2(lookDelta, 0)));\n if (this.moveKeys.has(\"ArrowRight\")) this.rotateCamera(this.rotateDelta.add(new Vector2(-lookDelta, 0)));\n\n this.moveWheel = 0;\n this.dispatchEvent({ type: \"change\" });\n }\n\n if (this.moveWheel !== 0) {\n const moveDelta = this.moveWheel * 0.0001 * this.movementSpeed * this.multiplier;\n\n this.object.translateZ(-moveDelta);\n this.moveWheel += -1 * Math.sign(this.moveWheel);\n this.dispatchEvent({ type: \"change\" });\n }\n\n if (this.moveKeys.size === 0 && this.moveWheel === 0) {\n this.moveClock.stop();\n this.moveClock.autoStart = true;\n }\n }\n\n rotateCamera(delta: Vector2) {\n const rotateX = (Math.PI * delta.x) / this.domElement.clientWidth;\n const rotateY = (Math.PI * delta.y) / this.domElement.clientHeight;\n\n const xRotation = new Quaternion();\n xRotation.setFromAxisAngle(this.object.up, rotateX);\n\n const yRotation = new Quaternion();\n yRotation.setFromAxisAngle(new Vector3(1, 0, 0), rotateY);\n\n const quaternion = this.quaternion.clone();\n quaternion.premultiply(xRotation).multiply(yRotation).normalize();\n\n this.object.setRotationFromQuaternion(quaternion);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\nimport { type IDragger } from \"@inweb/viewer-core\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { FlyControls } from \"../controls/FlyControls\";\nimport { JoyStickControls } from \"../controls/JoyStickControls\";\n\nexport class FlyDragger implements IDragger {\n protected viewer: Viewer;\n public controls: FlyControls;\n private joyStickControls: JoyStickControls;\n\n constructor(viewer: Viewer) {\n this.controls = new FlyControls(viewer.camera, viewer.canvas);\n this.controls.addEventListener(\"change\", this.controlsChange);\n this.controls.addEventListener(\"flyspeedchange\", this.flyspeedChange);\n\n this.joyStickControls = new JoyStickControls(viewer.camera, viewer.canvas, viewer.canvas, []);\n this.joyStickControls.addEventListener(\"change\", this.controlsChange);\n\n this.viewer = viewer;\n this.viewer.addEventListener(\"render\", this.viewerRender);\n this.viewer.addEventListener(\"zoom\", this.viewerZoom);\n this.viewer.addEventListener(\"changecameramode\", this.updateControlsCamera);\n this.updateControls();\n }\n\n dispose() {\n this.viewer.removeEventListener(\"render\", this.viewerRender);\n this.viewer.removeEventListener(\"zoom\", this.viewerZoom);\n this.viewer.removeEventListener(\"changecameramode\", this.updateControlsCamera);\n this.controls.removeEventListener(\"flyspeedchange\", this.flyspeedChange);\n this.controls.removeEventListener(\"change\", this.controlsChange);\n this.controls.dispose();\n\n this.joyStickControls.removeEventListener(\"change\", this.controlsChange);\n this.joyStickControls.dispose();\n }\n\n updateControls = () => {\n const size = this.viewer.extents.getSize(new Vector3());\n this.controls.movementSpeed = Math.min(size.x, size.y, size.z) / 2;\n this.joyStickControls.movementSpeed = this.controls.movementSpeed;\n this.joyStickControls.multiplier = this.controls.multiplier;\n };\n\n updateControlsCamera = () => {\n this.controls.object = this.viewer.camera;\n };\n\n controlsChange = () => {\n this.viewer.update();\n this.viewer.emitEvent({ type: \"changecamera\" });\n };\n\n flyspeedChange = (event: any) => {\n this.viewer.emitEvent(event);\n this.joyStickControls.multiplier = this.controls.multiplier;\n };\n\n viewerRender = () => {\n this.joyStickControls.update();\n this.controls.update();\n };\n\n viewerZoom = () => {\n this.controls.rotateDelta.set(0, 0);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MOUSE } from \"three\";\n\nimport { OrbitDragger } from \"./OrbitDragger\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ZoomDragger extends OrbitDragger {\n constructor(viewer: Viewer) {\n super(viewer);\n this.orbit.mouseButtons = { LEFT: MOUSE.DOLLY, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.PAN };\n // this.controls.touches = { ONE: TOUCH.DOLLY_PAN, TWO: TOUCH.DOLLY_PAN };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IDraggersRegistry, draggersRegistry } from \"@inweb/viewer-core\";\n\nimport { CuttingPlaneXAxisDragger } from \"./CuttingPlaneXAxis\";\nimport { CuttingPlaneYAxisDragger } from \"./CuttingPlaneYAxis\";\nimport { CuttingPlaneZAxisDragger } from \"./CuttingPlaneZAxis\";\nimport { MeasureLineDragger } from \"./MeasureLineDragger\";\nimport { OrbitDragger } from \"./OrbitDragger\";\nimport { PanDragger } from \"./PanDragger\";\nimport { WalkDragger } from \"./WalkDragger\";\nimport { FlyDragger } from \"./FlyDragger\";\nimport { ZoomDragger } from \"./ZoomDragger\";\n\n/**\n * Viewer draggers registry. Use this registry to register custom draggers.\n *\n * To implement custom dragger:\n *\n * 1. Define a dragger class implements {@link IDragger}.\n * 2. Define a constructor with a `viewer` parameter and add mouse event listeners for the specified viewer.\n * 3. Define the dragger logic in the event listeners. For example, listen for the `mousemove` event and\n * zoom in/out when the left mouse button is pressed.\n * 4. Override {@link IDragger.dispose} and remove mouse event listeners from the viewer.\n * 5. Register dragger provider in the draggers registry by calling the {@link draggers.registerDragger}.\n *\n * @example Implementing a custom dragger.\n *\n * ```javascript\n * import { IDragger, draggers, Viewer } from \"@inweb/viewer-three\";\n *\n * class MyDragger implements IDragger {\n * protected viewer: Viewer;\n *\n * constructor(viewer: Viewer) {\n * this.viewer = viewer;\n * this.viewer.addEventListener(\"pointermove\", this.onPointerMove);\n * }\n *\n * override dispose() {\n * this.viewer.removeEventListener(\"pointermove\", this.onPointerMove);\n * }\n *\n * onPointerMove = (event: PointerEvent) => {\n * // place custom logic here\n * };\n * }\n *\n * draggers.registerDragger(\"MyDragger\", (viewer): IDragger => new MyDragger(viewer));\n * ```\n *\n * @example Activating a custom dragger.\n *\n * ```javascript\n * viewer.setActiveDragger(\"MyDragger\");\n * ```\n */\nexport const draggers: IDraggersRegistry = draggersRegistry(\"threejs\");\n\n// build-in draggers\n\ndraggers.registerDragger(\"Pan\", (viewer) => new PanDragger(viewer));\ndraggers.registerDragger(\"Orbit\", (viewer) => new OrbitDragger(viewer));\ndraggers.registerDragger(\"Zoom\", (viewer) => new ZoomDragger(viewer));\ndraggers.registerDragger(\"MeasureLine\", (viewer) => new MeasureLineDragger(viewer));\ndraggers.registerDragger(\"CuttingPlaneXAxis\", (viewer) => new CuttingPlaneXAxisDragger(viewer));\ndraggers.registerDragger(\"CuttingPlaneYAxis\", (viewer) => new CuttingPlaneYAxisDragger(viewer));\ndraggers.registerDragger(\"CuttingPlaneZAxis\", (viewer) => new CuttingPlaneZAxisDragger(viewer));\ndraggers.registerDragger(\"Walk\", (viewer) => new WalkDragger(viewer));\ndraggers.registerDragger(\"Fly\", (viewer) => new FlyDragger(viewer));\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Model, File, Assembly } from \"@inweb/client\";\nimport type { Viewer } from \"../Viewer\";\n\nexport function applyModelTransform(viewer: Viewer, model: Model | File | Assembly) {\n console.warn(\"applyModelTransform not implemented\");\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function clearMarkup(viewer: Viewer) {\n viewer.clearOverlay();\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\nimport type { SelectionComponent } from \"../components/SelectionComponent\";\n\nexport function clearSelected(viewer: Viewer): void {\n const selection = viewer.getComponent(\"SelectionComponent\") as SelectionComponent;\n selection.clearSelection();\n\n viewer.update();\n viewer.emitEvent({ type: \"select\", data: undefined, handles: [] });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function clearSlices(viewer: Viewer) {\n viewer.clearSlices();\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function createPreview(viewer: Viewer, type = \"image/jpeg\", encoderOptions = 0.25): string {\n viewer.update(true);\n return viewer.canvas.toDataURL(type, encoderOptions);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function explode(viewer: Viewer, index = 0): void {\n viewer.models.forEach((model) => model.explode(index));\n\n viewer.update();\n viewer.emitEvent({ type: \"explode\", data: index });\n}\n\nexport function collect(viewer: Viewer) {\n explode(viewer, 0);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, MathUtils, Sphere, Vector2, Vector3 } from \"three\";\nimport type { Viewer } from \"../Viewer\";\n\nexport function zoomTo(viewer: Viewer, box: Box3): void {\n if (box.isEmpty()) return;\n\n const boxCenter = box.getCenter(new Vector3());\n const boxSize = box.getBoundingSphere(new Sphere()).radius;\n\n const rendererSize = viewer.renderer.getSize(new Vector2());\n const aspect = rendererSize.x / rendererSize.y;\n\n const camera = viewer.camera as any;\n\n if (camera.isPerspectiveCamera) {\n const offset = new Vector3(0, 0, 1)\n .applyQuaternion(camera.quaternion)\n .multiplyScalar(boxSize / Math.tan(MathUtils.degToRad(camera.fov * 0.5)));\n\n camera.position.copy(offset).add(boxCenter);\n camera.updateMatrixWorld();\n }\n if (camera.isOrthographicCamera) {\n camera.top = boxSize;\n camera.bottom = -boxSize;\n camera.left = camera.bottom * aspect;\n camera.right = camera.top * aspect;\n camera.zoom = 1;\n camera.updateProjectionMatrix();\n\n const offset = new Vector3(0, 0, 1)\n .applyQuaternion(camera.quaternion)\n .multiplyScalar(viewer.extents.getBoundingSphere(new Sphere()).radius * 3);\n\n camera.position.copy(offset).add(boxCenter);\n camera.updateMatrixWorld();\n }\n\n viewer.target.copy(boxCenter);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Quaternion, Sphere, Vector3 } from \"three\";\nimport type { Viewer } from \"../Viewer\";\nimport { zoomTo } from \"./ZoomTo\";\n\nexport const defaultViewPositions = {\n front: new Vector3(0, 0, -1),\n back: new Vector3(0, 0, 1),\n left: new Vector3(1, 0, 0),\n right: new Vector3(-1, 0, 0),\n bottom: new Vector3(0, -1, 0),\n top: new Vector3(0, 1, 0),\n se: new Vector3(-1, 1, -1).normalize(),\n sw: new Vector3(1, 1, -1).normalize(),\n ne: new Vector3(-1, 1, 1).normalize(),\n nw: new Vector3(1, 1, 1).normalize(),\n};\n\nexport function setDefaultViewPosition(viewer: Viewer, position: string): void {\n const extentsCenter = viewer.extents.getCenter(new Vector3());\n const extentsSize = viewer.extents.getBoundingSphere(new Sphere()).radius * 2;\n\n const upY = new Vector3(0, 1, 0);\n const offsetY = defaultViewPositions[position] || defaultViewPositions[\"sw\"];\n\n const up = new Vector3().copy(viewer.camera.up);\n const quaternion = new Quaternion().setFromUnitVectors(upY, up);\n const offset = new Vector3().copy(offsetY).applyQuaternion(quaternion);\n\n const camera = viewer.camera;\n camera.position.copy(offset).multiplyScalar(extentsSize).add(extentsCenter);\n camera.lookAt(extentsCenter);\n camera.updateMatrixWorld();\n\n viewer.target.copy(extentsCenter);\n\n viewer.update();\n viewer.emit({ type: \"viewposition\", data: position });\n\n zoomTo(viewer, viewer.extents);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { defaultViewPositions } from \"./SetDefaultViewPosition\";\n\nexport function getDefaultViewPositions(): string[] {\n return Object.keys(defaultViewPositions);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function getModels(viewer: Viewer): string[] {\n return viewer.models.map((model) => model.handle);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function getSelected(viewer: Viewer): string[] {\n const handles = [];\n viewer.models.forEach((model) => handles.push(...model.getHandlesByObjects(viewer.selected)));\n return handles;\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\nimport type { SelectionComponent } from \"../components/SelectionComponent\";\n\nexport function hideSelected(viewer: Viewer): void {\n viewer.models.forEach((model) => model.hideObjects(viewer.selected));\n\n const selection = viewer.getComponent(\"SelectionComponent\") as SelectionComponent;\n selection.clearSelection();\n\n viewer.update();\n viewer.emitEvent({ type: \"hide\" });\n viewer.emitEvent({ type: \"select\", data: undefined, handles: [] });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function isolateSelected(viewer: Viewer): void {\n viewer.models.forEach((model) => model.isolateObjects(viewer.selected));\n\n viewer.update();\n viewer.emitEvent({ type: \"isolate\" });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function regenerateAll(viewer: Viewer): void {\n viewer.emit({ type: \"regenerateall\" });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\nimport type { ResetComponent } from \"../components/ResetComponent\";\n\nexport function resetView(viewer: Viewer): void {\n const reset = viewer.getComponent(\"ResetComponent\") as ResetComponent;\n\n viewer.executeCommand(\"setActiveDragger\");\n viewer.executeCommand(\"clearSlices\");\n viewer.executeCommand(\"clearOverlay\");\n viewer.executeCommand(\"setMarkupColor\");\n viewer.executeCommand(\"clearSelected\");\n viewer.executeCommand(\"showAll\");\n viewer.executeCommand(\"explode\", 0);\n viewer.executeCommand(\"zoomToExtents\", true);\n\n reset.resetCameraPosition();\n\n viewer.emit({ type: \"resetview\" });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\nimport type { SelectionComponent } from \"../components/SelectionComponent\";\n\nexport function selectModel(viewer: Viewer, handle: string): void {\n const selection = viewer.getComponent(\"SelectionComponent\") as SelectionComponent;\n selection.clearSelection();\n\n viewer.models\n .filter((model) => model.handle === handle)\n .forEach((model) => selection.select(model.getObjects(), model));\n\n viewer.update();\n viewer.emit({ type: \"select\", data: [] });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function setActiveDragger(viewer: Viewer, dragger = \"\") {\n viewer.setActiveDragger(dragger);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function setMarkupColor(viewer: Viewer, r = 255, g = 0, b = 0) {\n viewer.markup.setMarkupColor(r, g, b);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\nimport type { SelectionComponent } from \"../components/SelectionComponent\";\n\nexport function setSelected(viewer: Viewer, handles: string[] = []): void {\n const selection = viewer.getComponent(\"SelectionComponent\") as SelectionComponent;\n selection.clearSelection();\n\n viewer.models.forEach((model) => {\n const objects = model.getObjectsByHandles(handles);\n model.showObjects(objects);\n selection.select(objects, model);\n });\n\n viewer.update();\n viewer.emitEvent({ type: \"show\" });\n viewer.emitEvent({ type: \"select\", data: undefined, handles });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function showAll(viewer: Viewer): void {\n viewer.models.forEach((model) => model.showAllObjects());\n\n viewer.update();\n viewer.emitEvent({ type: \"showall\" });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\nimport { zoomTo } from \"./ZoomTo\";\n\nexport function zoomToExtents(viewer: Viewer): void {\n zoomTo(viewer, viewer.extents);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3 } from \"three\";\nimport type { Viewer } from \"../Viewer\";\nimport { zoomTo } from \"./ZoomTo\";\n\nexport function zoomToObjects(viewer: Viewer, handles: string[] = []): void {\n const handleSet = new Set(handles);\n const objects = [];\n viewer.scene.traverseVisible((child) => {\n if (handleSet.has(child.userData?.handle)) objects.push(child);\n });\n\n const extents = objects.reduce((result: Box3, object) => result.expandByObject(object), new Box3());\n if (extents.isEmpty()) extents.copy(viewer.extents);\n\n zoomTo(viewer, extents);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3 } from \"three\";\nimport type { Viewer } from \"../Viewer\";\nimport { zoomTo } from \"./ZoomTo\";\n\nexport function zoomToSelected(viewer: Viewer): void {\n const extents = viewer.selected.reduce((result: Box3, object) => result.expandByObject(object), new Box3());\n if (extents.isEmpty()) extents.copy(viewer.extents);\n\n zoomTo(viewer, extents);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { ICommandsRegistry, commandsRegistry } from \"@inweb/viewer-core\";\n\nimport { applyModelTransform } from \"./ApplyModelTransform\";\nimport { clearMarkup } from \"./ClearMarkup\";\nimport { clearSelected } from \"./ClearSelected\";\nimport { clearSlices } from \"./ClearSlices\";\nimport { createPreview } from \"./CreatePreview\";\nimport { explode, collect } from \"./Explode\";\nimport { getDefaultViewPositions } from \"./GetDefaultViewPositions\";\nimport { getModels } from \"./GetModels\";\nimport { getSelected } from \"./GetSelected\";\nimport { hideSelected } from \"./HideSelected\";\nimport { isolateSelected } from \"./IsolateSelected\";\nimport { regenerateAll } from \"./RegenerateAll\";\nimport { resetView } from \"./ResetView\";\nimport { selectModel } from \"./SelectModel\";\nimport { setActiveDragger } from \"./SetActiveDragger\";\nimport { setDefaultViewPosition } from \"./SetDefaultViewPosition\";\nimport { setMarkupColor } from \"./SetMarkupColor\";\nimport { setSelected } from \"./SetSelected\";\nimport { showAll } from \"./ShowAll\";\nimport { zoomToExtents } from \"./ZoomToExtents\";\nimport { zoomToObjects } from \"./ZoomToObjects\";\nimport { zoomToSelected } from \"./ZoomToSelected\";\n\n/**\n * Viewer commands registry. Use this registry to register custom commands.\n *\n * To implement custom command:\n *\n * 1. Define a command handler with a first `viewer` parameter.\n * 2. Register command handler in the commands registry by calling the {@link commands.registerCommand}.\n *\n * @example Implementing a custom command.\n *\n * ```javascript\n * import { commands, Viewer } from \"@inweb/viewer-three\";\n *\n * function commandHandler(viewer: Viewer, name = \"world\"): void {\n * console.log(`Hello ${name}!!!`);\n * }\n *\n * commands.registerCommand(\"sayHello\", commandHandler);\n * ```\n *\n * @example Calling a custom command.\n *\n * ```javascript\n * viewer.executeCommand(\"sayHello\", \"user\");\n * ```\n */\nexport const commands: ICommandsRegistry = commandsRegistry(\"threejs\");\n\n// build-in commands\n\ncommands.registerCommand(\"applyModelTransform\", applyModelTransform);\ncommands.registerCommand(\"clearMarkup\", clearMarkup);\ncommands.registerCommand(\"clearSelected\", clearSelected);\ncommands.registerCommand(\"clearSlices\", clearSlices);\ncommands.registerCommand(\"collect\", collect);\ncommands.registerCommand(\"createPreview\", createPreview);\ncommands.registerCommand(\"explode\", explode);\ncommands.registerCommand(\"getDefaultViewPositions\", getDefaultViewPositions);\ncommands.registerCommand(\"getModels\", getModels);\ncommands.registerCommand(\"getSelected\", getSelected);\ncommands.registerCommand(\"hideSelected\", hideSelected);\ncommands.registerCommand(\"isolateSelected\", isolateSelected);\ncommands.registerCommand(\"regenerateAll\", regenerateAll);\ncommands.registerCommand(\"resetView\", resetView);\ncommands.registerCommand(\"selectModel\", selectModel);\ncommands.registerCommand(\"setActiveDragger\", setActiveDragger);\ncommands.registerCommand(\"setDefaultViewPosition\", setDefaultViewPosition);\ncommands.registerCommand(\"setMarkupColor\", setMarkupColor);\ncommands.registerCommand(\"setSelected\", setSelected);\ncommands.registerCommand(\"showAll\", showAll);\ncommands.registerCommand(\"zoomToExtents\", zoomToExtents);\ncommands.registerCommand(\"zoomToObjects\", zoomToObjects);\ncommands.registerCommand(\"zoomToSelected\", zoomToSelected);\n\ncommands.registerCommand(\"top\", (viewer) => setDefaultViewPosition(viewer, \"top\"));\ncommands.registerCommand(\"bottom\", (viewer) => setDefaultViewPosition(viewer, \"bottom\"));\ncommands.registerCommand(\"left\", (viewer) => setDefaultViewPosition(viewer, \"left\"));\ncommands.registerCommand(\"right\", (viewer) => setDefaultViewPosition(viewer, \"right\"));\ncommands.registerCommand(\"front\", (viewer) => setDefaultViewPosition(viewer, \"front\"));\ncommands.registerCommand(\"back\", (viewer) => setDefaultViewPosition(viewer, \"back\"));\ncommands.registerCommand(\"sw\", (viewer) => setDefaultViewPosition(viewer, \"sw\"));\ncommands.registerCommand(\"se\", (viewer) => setDefaultViewPosition(viewer, \"se\"));\ncommands.registerCommand(\"ne\", (viewer) => setDefaultViewPosition(viewer, \"ne\"));\ncommands.registerCommand(\"nw\", (viewer) => setDefaultViewPosition(viewer, \"nw\"));\n\ncommands.registerCommandAlias(\"clearMarkup\", \"clearOverlay\");\ncommands.registerCommandAlias(\"clearSelected\", \"unselect\");\ncommands.registerCommandAlias(\"zoomToExtents\", \"zoomExtents\");\n\ncommands.registerCommandAlias(\"top\", \"k3DViewTop\");\ncommands.registerCommandAlias(\"bottom\", \"k3DViewBottom\");\ncommands.registerCommandAlias(\"left\", \"k3DViewLeft\");\ncommands.registerCommandAlias(\"right\", \"k3DViewRight\");\ncommands.registerCommandAlias(\"front\", \"k3DViewFront\");\ncommands.registerCommandAlias(\"back\", \"k3DViewBack\");\ncommands.registerCommandAlias(\"se\", \"k3DViewSE\");\ncommands.registerCommandAlias(\"sw\", \"k3DViewSW\");\ncommands.registerCommandAlias(\"ne\", \"k3DViewNE\");\ncommands.registerCommandAlias(\"nw\", \"k3DViewNW\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Color } from \"three\";\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class BackgroundComponent implements IComponent {\n protected viewer: Viewer;\n protected backgroundColor: Color;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n this.backgroundColor = new Color(0xffffff);\n\n this.viewer.renderer.setClearColor(this.backgroundColor);\n this.viewer.scene.background = this.backgroundColor;\n this.viewer.addEventListener(\"optionschange\", this.syncOptions);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"optionschange\", this.syncOptions);\n this.viewer.scene.background = undefined;\n }\n\n syncOptions = () => {\n this.backgroundColor.setHex(0xffffff);\n this.viewer.renderer.setClearColor(this.backgroundColor);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MathUtils, OrthographicCamera, PerspectiveCamera, Sphere, Vector2, Vector3 } from \"three\";\n\nimport { CameraMode, IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class CameraComponent implements IComponent {\n protected viewer: Viewer;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.viewer.addEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.addEventListener(\"optionschange\", this.optionsChange);\n this.viewer.addEventListener(\"initialize\", this.optionsChange);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.removeEventListener(\"optionschange\", this.optionsChange);\n this.viewer.removeEventListener(\"initialize\", this.optionsChange);\n }\n\n getCameraMode(camera: any): CameraMode {\n return camera.isOrthographicCamera ? \"orthographic\" : \"perspective\";\n }\n\n switchCamera(camera: any) {\n const extentsSize = this.viewer.extents.getBoundingSphere(new Sphere()).radius * 2 || 1;\n const rendererSize = this.viewer.renderer.getSize(new Vector2());\n const aspect = rendererSize.x / rendererSize.y;\n\n if (camera.isPerspectiveCamera) {\n camera.aspect = aspect;\n camera.near = extentsSize / 1000;\n camera.far = extentsSize * 1000;\n }\n if (camera.isOrthographicCamera) {\n camera.left = camera.bottom * aspect;\n camera.right = camera.top * aspect;\n camera.near = 0;\n camera.far = extentsSize * 1000;\n }\n\n camera.updateProjectionMatrix();\n\n this.viewer.camera = camera;\n this.viewer.renderPass.camera = camera;\n this.viewer.helpersPass.camera = camera;\n this.viewer.ssaaRenderPass.camera = camera;\n\n this.viewer.update();\n }\n\n switchCameraMode(mode: CameraMode) {\n if (!mode) return;\n\n const currentCamera: any = this.viewer.camera;\n if (mode === this.getCameraMode(currentCamera)) return;\n\n const target = this.viewer.target.clone();\n\n let camera: PerspectiveCamera | OrthographicCamera;\n\n if (currentCamera.isOrthographicCamera) {\n const fov = currentCamera.userData.fov || 45;\n const fieldHeight = (currentCamera.top - currentCamera.bottom) / currentCamera.zoom;\n const distance = fieldHeight / (2 * Math.tan(MathUtils.degToRad(fov) / 2));\n const direction = new Vector3().subVectors(currentCamera.position, target).normalize();\n\n camera = new PerspectiveCamera(fov);\n camera.position.copy(direction).multiplyScalar(distance).add(target);\n }\n if (currentCamera.isPerspectiveCamera) {\n const fov = currentCamera.fov;\n const distance = currentCamera.position.distanceTo(target);\n const fieldHeight = 2 * Math.tan(MathUtils.degToRad(fov) / 2) * distance;\n\n camera = new OrthographicCamera();\n camera.top = fieldHeight / 2;\n camera.bottom = -fieldHeight / 2;\n camera.position.copy(currentCamera.position);\n\n camera.userData.fov = fov;\n }\n if (!camera) return;\n\n camera.up.copy(currentCamera.up);\n camera.quaternion.copy(currentCamera.quaternion);\n\n this.switchCamera(camera);\n\n this.viewer.emitEvent({ type: \"changecameramode\", mode });\n }\n\n optionsChange = () => {\n this.switchCameraMode(this.viewer.options.cameraMode);\n };\n\n geometryEnd = () => {\n let camera: any;\n\n // TODO: do not change the camera and target after opening the second model in \"append\" mode\n this.viewer.scene.traverse((object: any) => {\n if (object.isCamera)\n if (!camera) camera = object;\n else if (object.isPerspectiveCamera && camera.isOrthographicCamera) camera = object;\n });\n\n if (camera) {\n camera.isDefaultCamera = true;\n camera.scale.set(1, 1, 1); // <- Visualize fix\n\n this.switchCamera(camera);\n\n const mode = this.getCameraMode(camera);\n\n this.viewer.options.cameraMode = mode;\n this.viewer.emitEvent({ type: \"changecameramode\", mode });\n } else {\n this.switchCamera(this.viewer.camera);\n this.viewer.executeCommand(\"setDefaultViewPosition\");\n }\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3 } from \"three\";\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ExtentsComponent implements IComponent {\n private viewer: Viewer;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.viewer.addEventListener(\"databasechunk\", this.syncExtents);\n this.viewer.addEventListener(\"clear\", this.syncExtents);\n this.viewer.on(\"explode\", this.syncExtents);\n this.viewer.on(\"hide\", this.syncExtents);\n this.viewer.on(\"isolate\", this.syncExtents);\n this.viewer.on(\"show\", this.syncExtents);\n this.viewer.on(\"showall\", this.syncExtents);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"databasechunk\", this.syncExtents);\n this.viewer.removeEventListener(\"clear\", this.syncExtents);\n this.viewer.off(\"explode\", this.syncExtents);\n this.viewer.off(\"hide\", this.syncExtents);\n this.viewer.off(\"isolate\", this.syncExtents);\n this.viewer.off(\"show\", this.syncExtents);\n this.viewer.off(\"showall\", this.syncExtents);\n }\n\n syncExtents = () => {\n const extents = new Box3();\n this.viewer.models.forEach((model) => model.getExtents(extents));\n\n this.viewer.extents.copy(extents);\n this.viewer.extents.getCenter(this.viewer.target);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { AmbientLight, DirectionalLight, HemisphereLight, Quaternion, Sphere, Vector3 } from \"three\";\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class LightComponent implements IComponent {\n protected viewer: Viewer;\n protected ambientLight: AmbientLight;\n protected directionalLight: DirectionalLight;\n protected frontLight: DirectionalLight;\n protected hemisphereLight: HemisphereLight;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n this.ambientLight = new AmbientLight(0xffffff, 1.5);\n this.directionalLight = new DirectionalLight(0xffffff, 1.0);\n this.frontLight = new DirectionalLight(0xffffff, 1.25);\n this.hemisphereLight = new HemisphereLight(0xffffff, 0x444444, 1.25);\n\n this.viewer.addEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.addEventListener(\"clear\", this.geometryEnd);\n }\n\n dispose(): void {\n this.ambientLight.removeFromParent();\n this.ambientLight.dispose();\n\n this.directionalLight.removeFromParent();\n this.directionalLight.dispose();\n\n this.frontLight.removeFromParent();\n this.frontLight.dispose();\n\n this.hemisphereLight.removeFromParent();\n this.hemisphereLight.dispose();\n\n this.viewer.removeEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.removeEventListener(\"clear\", this.geometryEnd);\n }\n\n geometryEnd = () => {\n this.ambientLight.removeFromParent();\n this.directionalLight.removeFromParent();\n this.frontLight.removeFromParent();\n this.hemisphereLight.removeFromParent();\n\n if (this.viewer.extents.isEmpty()) return;\n\n const extentsCenter = this.viewer.extents.getCenter(new Vector3());\n const extentsSize = this.viewer.extents.getBoundingSphere(new Sphere()).radius;\n\n const upY = new Vector3(0, 1, 0);\n const frontY = new Vector3(0, 0, -1);\n\n const up = new Vector3().copy(this.viewer.camera.up);\n const quaternion = new Quaternion().setFromUnitVectors(upY, up);\n const front = new Vector3().copy(frontY).applyQuaternion(quaternion).negate();\n\n this.directionalLight.position\n .copy(up)\n .applyAxisAngle(front, (-Math.PI * 30) / 180)\n .multiplyScalar(extentsSize * 2)\n .add(extentsCenter);\n this.directionalLight.target.position.copy(extentsCenter);\n\n this.frontLight.position\n .copy(front)\n .multiplyScalar(extentsSize * 2)\n .add(extentsCenter);\n this.frontLight.target.position.copy(extentsCenter);\n\n this.hemisphereLight.position\n .copy(front)\n .multiplyScalar(extentsSize * 3)\n .add(extentsCenter);\n\n this.viewer.scene.add(this.ambientLight);\n this.viewer.scene.add(this.directionalLight);\n this.viewer.scene.add(this.frontLight);\n this.viewer.scene.add(this.hemisphereLight);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class RenderLoopComponent implements IComponent {\n protected viewer: Viewer;\n protected requestId: number;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.animate();\n }\n\n dispose() {\n cancelAnimationFrame(this.requestId);\n }\n\n animate = (time = 0) => {\n this.requestId = requestAnimationFrame(this.animate);\n\n this.viewer.render(time);\n this.viewer.emitEvent({ type: \"animate\", time });\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ResizeCanvasComponent implements IComponent {\n protected viewer: Viewer;\n protected resizeObserver: ResizeObserver;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.resizeObserver = new ResizeObserver(this.resizeViewer);\n this.resizeObserver.observe(viewer.canvas.parentElement);\n }\n\n dispose() {\n this.resizeObserver.disconnect();\n }\n\n resizeViewer = (entries: ResizeObserverEntry[]) => {\n const { width, height } = entries[0].contentRect;\n\n if (!width || !height) return; // <- invisible viewer, or viewer with parent removed\n\n this.viewer.setSize(width, height);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { LineSegmentsGeometry } from \"three/examples/jsm/lines/LineSegmentsGeometry.js\";\n\nexport class HighlighterUtils {\n static isBreak(positions: Float32Array, i: number) {\n return (\n isNaN(positions[i]) ||\n isNaN(positions[i + 1]) ||\n isNaN(positions[i + 2]) ||\n positions[i] === Infinity ||\n positions[i] === -Infinity ||\n positions[i + 1] === Infinity ||\n positions[i + 1] === -Infinity ||\n positions[i + 2] === Infinity ||\n positions[i + 2] === -Infinity\n );\n }\n\n static fromIndexedLine(positions: Float32Array, indices: number[]) {\n const lineGeometry = new LineSegmentsGeometry();\n const segments = [];\n\n for (let i = 0; i < indices.length; i += 2) {\n const idx1 = indices[i] * 3;\n const idx2 = indices[i + 1] * 3;\n\n if (indices[i] === -1 || indices[i + 1] === -1) {\n continue;\n }\n\n segments.push(\n positions[idx1],\n positions[idx1 + 1],\n positions[idx1 + 2],\n positions[idx2],\n positions[idx2 + 1],\n positions[idx2 + 2]\n );\n }\n\n if (segments.length === 0) return null;\n\n lineGeometry.setPositions(segments);\n return lineGeometry;\n }\n\n static fromNonIndexedLine(positions: Float32Array, isLineSegments: boolean) {\n const lineGeometry = new LineSegmentsGeometry();\n const segments = [];\n\n if (isLineSegments) {\n for (let i = 0; i < positions.length; i += 6) {\n if (i + 5 >= positions.length) break;\n\n if (HighlighterUtils.isBreak(positions, i) || HighlighterUtils.isBreak(positions, i + 3)) continue;\n\n segments.push(\n positions[i],\n positions[i + 1],\n positions[i + 2],\n positions[i + 3],\n positions[i + 4],\n positions[i + 5]\n );\n }\n } else {\n let lastValidIndex = -1;\n\n for (let i = 0; i < positions.length; i += 3) {\n if (HighlighterUtils.isBreak(positions, i)) {\n lastValidIndex = -1;\n continue;\n }\n\n if (lastValidIndex !== -1) {\n segments.push(\n positions[lastValidIndex],\n positions[lastValidIndex + 1],\n positions[lastValidIndex + 2],\n positions[i],\n positions[i + 1],\n positions[i + 2]\n );\n }\n lastValidIndex = i;\n }\n }\n\n if (segments.length === 0) return null;\n\n lineGeometry.setPositions(segments);\n return lineGeometry;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport {\n EdgesGeometry,\n LineBasicMaterial,\n MeshPhongMaterial,\n Object3D,\n RGBAFormat,\n UnsignedByteType,\n Vector2,\n WebGLRenderTarget,\n} from \"three\";\nimport { LineSegmentsGeometry } from \"three/examples/jsm/lines/LineSegmentsGeometry.js\";\nimport { Wireframe } from \"three/examples/jsm/lines/Wireframe.js\";\nimport { LineMaterial } from \"three/examples/jsm/lines/LineMaterial.js\";\n\nimport { IComponent, ResizeEvent } from \"@inweb/viewer-core\";\nimport { Viewer } from \"../Viewer\";\nimport { HighlighterUtils } from \"./HighlighterUtils\";\n\nexport class HighlighterComponent implements IComponent {\n protected viewer: Viewer;\n public renderTarget: WebGLRenderTarget;\n public facesMaterial: MeshPhongMaterial;\n public edgesMaterial: LineMaterial;\n public lineMaterial: LineBasicMaterial;\n public lineGlowMaterial: LineMaterial;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n const gl2 = viewer.canvas.getContext(\"webgl2\");\n if (gl2) {\n const size = viewer.renderer.getSize(new Vector2());\n this.renderTarget = new WebGLRenderTarget(size.x, size.y, {\n format: RGBAFormat,\n stencilBuffer: false,\n samples: 4,\n type: UnsignedByteType,\n });\n }\n\n this.viewer.addEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.addEventListener(\"optionschange\", this.optionsChange);\n this.viewer.addEventListener(\"resize\", this.viewerResize);\n\n this.geometryEnd();\n }\n\n dispose() {\n this.viewer.removeEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.removeEventListener(\"optionschange\", this.optionsChange);\n this.viewer.removeEventListener(\"resize\", this.viewerResize);\n }\n\n highlight(objects: Object3D | Object3D[]) {\n const { edgesVisibility } = this.viewer.options;\n\n if (!Array.isArray(objects)) objects = [objects];\n if (!objects.length) return;\n\n objects\n .filter((object) => !object.userData.isEdge) // <- filtering server generated edges\n .forEach((object: any) => {\n if (object.isHighlighted) return;\n\n if (object.isLine || object.isLineSegments) {\n const positions = object.geometry.attributes.position.array;\n const indices = object.geometry.index ? object.geometry.index.array : null;\n const lineGeometry = indices\n ? HighlighterUtils.fromIndexedLine(positions, indices)\n : HighlighterUtils.fromNonIndexedLine(positions, object.isLineSegments);\n\n const wireframe = new Wireframe(lineGeometry, this.lineGlowMaterial);\n wireframe.position.copy(object.position);\n wireframe.rotation.copy(object.rotation);\n wireframe.scale.copy(object.scale);\n wireframe.visible = edgesVisibility;\n\n object.parent.add(wireframe);\n object.userData.highlightWireframe = wireframe;\n\n object.userData.originalMaterial = object.material;\n object.material = this.lineMaterial;\n object.isHighlighted = true;\n } else if (object.isMesh) {\n const edgesGeometry = new EdgesGeometry(object.geometry, 89);\n const lineGeometry = new LineSegmentsGeometry().fromEdgesGeometry(edgesGeometry);\n\n const wireframe = new Wireframe(lineGeometry, this.edgesMaterial);\n wireframe.position.copy(object.position);\n wireframe.rotation.copy(object.rotation);\n wireframe.scale.copy(object.scale);\n wireframe.visible = edgesVisibility;\n\n object.parent.add(wireframe);\n object.userData.highlightWireframe = wireframe;\n\n object.userData.originalMaterial = object.material;\n object.material = this.facesMaterial;\n object.isHighlighted = true;\n }\n });\n }\n\n unhighlight(objects: Object3D | Object3D[]) {\n if (!Array.isArray(objects)) objects = [objects];\n if (!objects.length) return;\n\n objects.forEach((object: any) => {\n if (!object.isHighlighted) return;\n\n object.isHighlighted = false;\n object.material = object.userData.originalMaterial;\n object.userData.highlightWireframe.removeFromParent();\n\n delete object.userData.originalMaterial;\n delete object.userData.highlightWireframe;\n });\n }\n\n geometryEnd = () => {\n this.facesMaterial = new MeshPhongMaterial({\n transparent: true,\n specular: 0x222222,\n shininess: 10,\n reflectivity: 0.05,\n polygonOffset: true,\n polygonOffsetFactor: 1,\n polygonOffsetUnits: 1,\n });\n\n this.edgesMaterial = new LineMaterial({\n linewidth: 1.5,\n resolution: new Vector2(window.innerWidth, window.innerHeight),\n });\n\n this.lineMaterial = new LineBasicMaterial({\n transparent: true,\n depthTest: true,\n depthWrite: true,\n });\n\n this.lineGlowMaterial = new LineMaterial({\n linewidth: 1.5,\n transparent: true,\n opacity: 0.8,\n resolution: new Vector2(window.innerWidth, window.innerHeight),\n });\n\n this.syncHighlightColors();\n };\n\n optionsChange = () => {\n this.syncHighlightColors();\n this.viewer.update();\n };\n\n syncHighlightColors() {\n const { facesColor, facesTransparancy, facesOverlap } = this.viewer.options;\n const { edgesColor, edgesVisibility, edgesOverlap } = this.viewer.options;\n\n this.facesMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);\n this.facesMaterial.opacity = (255 - facesTransparancy) / 255;\n this.facesMaterial.depthTest = !facesOverlap;\n this.facesMaterial.depthWrite = !facesOverlap;\n\n this.edgesMaterial.color.setRGB(edgesColor.r / 255, edgesColor.g / 255, edgesColor.b / 255);\n this.edgesMaterial.depthTest = !edgesOverlap;\n this.edgesMaterial.depthWrite = !edgesOverlap;\n\n this.lineMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);\n\n this.lineGlowMaterial.color.setRGB(edgesColor.r / 255, edgesColor.g / 255, edgesColor.b / 255);\n this.lineGlowMaterial.depthTest = !edgesOverlap;\n this.lineGlowMaterial.depthWrite = !edgesOverlap;\n\n this.viewer.selected.forEach((selected) => {\n const wireframe = selected.userData.highlightWireframe;\n if (wireframe) wireframe.visible = edgesVisibility;\n });\n }\n\n viewerResize(event: ResizeEvent) {\n this.renderTarget?.setSize(event.width, event.height);\n this.edgesMaterial?.resolution.set(event.width, event.height);\n this.lineGlowMaterial?.resolution.set(event.width, event.height);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Intersection, Object3D, Raycaster, Vector2 } from \"three\";\n\nimport type { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport type { IModelImpl } from \"../models/IModelImpl\";\nimport type { HighlighterComponent } from \"./HighlighterComponent\";\n\nexport class SelectionComponent implements IComponent {\n protected viewer: Viewer;\n protected raycaster: Raycaster;\n protected downPosition: Vector2;\n protected highlighter: HighlighterComponent;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.raycaster = new Raycaster();\n this.downPosition = new Vector2();\n\n this.viewer.addEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.addEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.addEventListener(\"dblclick\", this.onDoubleClick);\n this.viewer.addEventListener(\"initialize\", this.initHighlighter);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.removeEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.removeEventListener(\"dblclick\", this.onDoubleClick);\n this.viewer.removeEventListener(\"initialize\", this.initHighlighter);\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (!event.isPrimary || event.button !== 0) return;\n\n this.getMousePosition(event, this.downPosition);\n };\n\n onPointerUp = (event: PointerEvent) => {\n if (!event.isPrimary) return;\n\n const upPosition = this.getMousePosition(event, new Vector2());\n if (upPosition.distanceTo(this.downPosition) !== 0) return;\n\n let intersections = [];\n this.viewer.models.forEach((model) => {\n const objects = model.getVisibleObjects();\n const intersects = this.getPointerIntersects(upPosition, objects);\n if (intersects.length > 0) intersections.push({ ...intersects[0], model });\n });\n intersections = intersections.sort((a, b) => a.distance - b.distance);\n\n if (!event.shiftKey) this.clearSelection();\n\n if (intersections.length > 0) {\n const model = intersections[0].model;\n const handles = model.getHandlesByObjects(intersections[0].object);\n const objects = model.getObjectsByHandles(handles);\n\n if (!event.shiftKey) this.select(objects, model);\n else this.toggleSelection(objects, model);\n }\n\n this.viewer.update();\n this.viewer.emitEvent({ type: \"select\", data: undefined, handles: this.viewer.getSelected() });\n };\n\n onDoubleClick = (event: MouseEvent) => {\n if (event.button !== 0) return;\n\n this.viewer.executeCommand(\"zoomToSelected\");\n };\n\n getMousePosition(event: MouseEvent, target: Vector2): Vector2 {\n return target.set(event.clientX, event.clientY);\n }\n\n getPointerIntersects(mouse: Vector2, objects: Object3D[]): Array<Intersection<Object3D>> {\n const rect = this.viewer.canvas.getBoundingClientRect();\n const x = ((mouse.x - rect.left) / rect.width) * 2 - 1;\n const y = (-(mouse.y - rect.top) / rect.height) * 2 + 1;\n\n const coords = new Vector2(x, y);\n this.raycaster.setFromCamera(coords, this.viewer.camera);\n\n this.raycaster.params = {\n Mesh: {},\n Line: { threshold: 0.05 },\n Line2: { threshold: 0.05 },\n LOD: {},\n Points: { threshold: 0.01 },\n Sprite: {},\n };\n\n let intersects = this.raycaster.intersectObjects(objects, false);\n\n (this.viewer.renderer.clippingPlanes || []).forEach((plane) => {\n intersects = intersects.filter((intersect) => plane.distanceToPoint(intersect.point) >= 0);\n });\n\n return intersects;\n }\n\n select(objects: Object3D | Object3D[], model?: IModelImpl) {\n if (!model) {\n this.viewer.models.forEach((model) => this.select(objects, model));\n return;\n }\n\n if (!Array.isArray(objects)) objects = [objects];\n if (!objects.length) return;\n\n model.showOriginalObjects(objects);\n this.highlighter.highlight(objects);\n\n objects.forEach((object: any) => this.viewer.selected.push(object));\n objects.forEach((object: any) => (object.isSelected = true));\n }\n\n deselect(objects: Object3D | Object3D[], model?: IModelImpl) {\n if (!model) {\n this.viewer.models.forEach((model) => this.select(objects, model));\n return;\n }\n\n if (!Array.isArray(objects)) objects = [objects];\n if (!objects.length) return;\n\n this.highlighter.unhighlight(objects);\n model.hideOriginalObjects(objects);\n\n this.viewer.selected = this.viewer.selected.filter((x) => !objects.includes(x));\n objects.forEach((object: any) => (object.isSelected = false));\n }\n\n toggleSelection(objects: Object3D | Object3D[], model?: IModelImpl) {\n if (!Array.isArray(objects)) objects = [objects];\n if (!objects.length) return;\n\n if ((objects[0] as any).isSelected) this.deselect(objects, model);\n else this.select(objects, model);\n }\n\n clearSelection() {\n if (!this.viewer.selected.length) return;\n\n this.highlighter.unhighlight(this.viewer.selected);\n this.viewer.models.forEach((model) => model.hideOriginalObjects(this.viewer.selected));\n\n this.viewer.selected.forEach((object: any) => (object.isSelected = false));\n this.viewer.selected.length = 0;\n }\n\n initHighlighter = () => {\n this.highlighter = this.viewer.getComponent(\"HighlighterComponent\") as HighlighterComponent;\n };\n}\n","import {\n Camera,\n CylinderGeometry,\n CanvasTexture,\n Color,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n OrthographicCamera,\n Sprite,\n SpriteMaterial,\n SRGBColorSpace,\n Vector4,\n WebGLRenderer,\n} from \"three\";\n\nexport class WCSHelper extends Object3D {\n private camera: Camera;\n private orthoCamera: OrthographicCamera;\n public size: number;\n\n constructor(camera: Camera) {\n super();\n\n this.camera = camera;\n this.size = 160;\n\n this.orthoCamera = new OrthographicCamera(-2, 2, 2, -2, 0, 4);\n this.orthoCamera.position.set(0, 0, 2);\n\n const matRed = new MeshBasicMaterial({ toneMapped: false, color: \"#dd0000\" });\n const matGreen = new MeshBasicMaterial({ toneMapped: false, color: \"#00dd00\" });\n const matBlue = new MeshBasicMaterial({ toneMapped: false, color: \"#0000dd\" });\n\n const spriteRed = this.getSpriteMaterial(matRed.color, \"X\");\n const spriteGreen = this.getSpriteMaterial(matGreen.color, \"Y\");\n const spriteBlue = this.getSpriteMaterial(matBlue.color, \"Z\");\n\n const lineGeometry = new CylinderGeometry(0.01, 0.01, 1, 3);\n lineGeometry.translate(0, 0.5, 0);\n\n const arrowGeometry = new CylinderGeometry(0, 0.1, 0.25, 12);\n arrowGeometry.translate(0, 0.625, 0);\n\n const axesMap = {\n X: [\n [new Mesh(arrowGeometry, matRed), [0.5, 0, 0], [0, 0, -Math.PI / 2]],\n [new Mesh(lineGeometry, matRed), [0, 0, 0], [0, 0, -Math.PI / 2]],\n [new Sprite(spriteRed), [1.55, 0, 0]],\n ],\n Y: [\n [new Mesh(arrowGeometry, matGreen), [0, 0.5, 0], null],\n [new Mesh(lineGeometry, matGreen), null, null],\n [new Sprite(spriteGreen), [0, 1.55, 0]],\n ],\n Z: [\n [new Mesh(arrowGeometry, matBlue), [0, 0, 0.5], [Math.PI / 2, 0, 0]],\n [new Mesh(lineGeometry, matBlue), null, [Math.PI / 2, 0, 0]],\n [new Sprite(spriteBlue), [0, 0, 1.55]],\n ],\n };\n\n Object.keys(axesMap).forEach((key) => {\n axesMap[key].forEach((objects: any) => {\n const object = objects[0];\n const position = objects[1];\n const rotation = objects[2];\n\n object.name = key;\n if (position) object.position.set(position[0], position[1], position[2]);\n if (rotation) object.rotation.set(rotation[0], rotation[1], rotation[2]);\n object.updateMatrixWorld();\n\n this.add(object);\n });\n });\n }\n\n dispose() {\n this.traverse((object: any) => {\n if (object.geometry) object.geometry.dispose();\n if (object.material) object.material.dispose();\n });\n }\n\n getSpriteMaterial(color: Color, text: string) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 64;\n canvas.height = 64;\n\n const context = canvas.getContext(\"2d\");\n context.clearRect(0, 0, 64, 64);\n context.font = \"24px Arial\";\n context.textAlign = \"center\";\n context.fillStyle = color.getStyle();\n context.fillText(text, 32, 41);\n\n const texture = new CanvasTexture(canvas);\n texture.colorSpace = SRGBColorSpace;\n\n return new SpriteMaterial({ map: texture, toneMapped: false });\n }\n\n render(renderer: WebGLRenderer) {\n this.quaternion.copy(this.camera.quaternion).invert();\n this.updateMatrixWorld();\n\n const oldAutoClear = renderer.autoClear;\n const oldClippingPlanes = renderer.clippingPlanes;\n const oldViewport = renderer.getViewport(new Vector4());\n\n renderer.autoClear = false;\n renderer.clippingPlanes = [];\n renderer.setViewport(this.position.x, this.position.y, this.size, this.size);\n renderer.clearDepth();\n renderer.render(this, this.orthoCamera);\n\n renderer.setViewport(oldViewport);\n renderer.clippingPlanes = oldClippingPlanes;\n renderer.autoClear = oldAutoClear;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport { WCSHelper } from \"../helpers/WCSHelper\";\n\nexport class WCSHelperComponent implements IComponent {\n private wcsHelper: WCSHelper;\n private viewer: Viewer;\n\n constructor(viewer: Viewer) {\n this.wcsHelper = new WCSHelper(viewer.camera);\n this.viewer = viewer;\n this.viewer.addEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.addEventListener(\"drawviewpoint\", this.geometryEnd);\n this.viewer.addEventListener(\"render\", this.viewerRender);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.removeEventListener(\"drawviewpoint\", this.geometryEnd);\n this.viewer.removeEventListener(\"render\", this.viewerRender);\n this.wcsHelper.dispose();\n }\n\n geometryEnd = () => {\n this.wcsHelper.dispose();\n this.wcsHelper = new WCSHelper(this.viewer.camera);\n };\n\n viewerRender = () => {\n if (!this.viewer.options.showWCS) return;\n\n this.wcsHelper.render(this.viewer.renderer);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\n// ===================== AI-CODE-FILE ======================\n// Source: Claude Sonnet 4\n// Date: 2025-09-10\n// Reviewer: vitaly.ivanov@opendesign.com\n// Issue: CLOUD-5835\n// Notes: Originally AI-generated, modified manually 2025-09-11\n// =========================================================\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport { Vector3 } from \"three\";\n\nexport class ResetComponent implements IComponent {\n private viewer: Viewer;\n private savedCameraPosition: any = null;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.viewer.addEventListener(\"databasechunk\", this.onDatabaseChunk);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"databasechunk\", this.onDatabaseChunk);\n }\n\n onDatabaseChunk = () => {\n this.savedCameraPosition = {\n position: this.viewer.camera.position.clone(),\n up: this.viewer.camera.up.clone(),\n direction: this.viewer.camera.getWorldDirection(new Vector3()),\n };\n };\n\n resetCameraPosition() {\n if (this.savedCameraPosition) {\n this.viewer.camera.position.copy(this.savedCameraPosition.position);\n this.viewer.camera.up.copy(this.savedCameraPosition.up);\n this.viewer.camera.lookAt(this.savedCameraPosition.position.clone().add(this.savedCameraPosition.direction));\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IComponentsRegistry, componentsRegistry } from \"@inweb/viewer-core\";\n\nimport { BackgroundComponent } from \"./BackgroundComponent\";\nimport { CameraComponent } from \"./CameraComponent\";\nimport { ExtentsComponent } from \"./ExtentsComponent\";\nimport { LightComponent } from \"./LightComponent\";\nimport { RenderLoopComponent } from \"./RenderLoopComponent\";\nimport { ResizeCanvasComponent } from \"./ResizeCanvasComponent\";\nimport { HighlighterComponent } from \"./HighlighterComponent\";\nimport { SelectionComponent } from \"./SelectionComponent\";\nimport { WCSHelperComponent } from \"./WCSHelperComponent\";\nimport { ResetComponent } from \"./ResetComponent\";\n\n/**\n * Viewer components registry. Use this registry to register custom components.\n *\n * To implement custom component:\n *\n * 1. Define a component class implements {@link IComponent}.\n * 2. Define a constructor with a `viewer` parameter and add mouse event listeners for the specified viewer.\n * 3. Define the component logic in the event listeners. For example, listen for the `mousedown` event and\n * select objects when the left mouse button is pressed.\n * 4. Override {@link IComponent.dispose} and remove mouse event listeners from the viewer.\n * 5. Register component provider in the components registry by calling the\n * {@link components.registerComponent}.\n *\n * @example Implementing a custom component.\n *\n * ```javascript\n * import { IComponent, components, Viewer } from \"@inweb/viewer-three\";\n *\n * class MyComponent implements IComponent {\n * protected viewer: Viewer;\n *\n * constructor(viewer: Viewer) {\n * this.viewer = viewer;\n * this.viewer.addEventListener(\"mousedown\", this.onMouseDown);\n * }\n *\n * override dispose() {\n * this.viewer.removeEventListener(\"mousedown\", this.onMouseDown);\n * }\n *\n * onMouseDown = (event: PointerEvent) => {\n * // place custom logic here\n * };\n * }\n *\n * components.registerComponent(\"MyComponent\", (viewer): IComponent => new MyComponent(viewer));\n * ```\n */\nexport const components: IComponentsRegistry = componentsRegistry(\"threejs\");\n\n// build-in components\n\ncomponents.registerComponent(\"ExtentsComponent\", (viewer) => new ExtentsComponent(viewer));\ncomponents.registerComponent(\"CameraComponent\", (viewer) => new CameraComponent(viewer));\ncomponents.registerComponent(\"BackgroundComponent\", (viewer) => new BackgroundComponent(viewer));\ncomponents.registerComponent(\"LightComponent\", (viewer) => new LightComponent(viewer));\ncomponents.registerComponent(\"ResizeCanvasComponent\", (viewer) => new ResizeCanvasComponent(viewer));\ncomponents.registerComponent(\"RenderLoopComponent\", (viewer) => new RenderLoopComponent(viewer));\ncomponents.registerComponent(\"HighlighterComponent\", (viewer) => new HighlighterComponent(viewer));\ncomponents.registerComponent(\"SelectionComponent\", (viewer) => new SelectionComponent(viewer));\ncomponents.registerComponent(\"WCSHelperComponent\", (viewer) => new WCSHelperComponent(viewer));\ncomponents.registerComponent(\"ResetComponent\", (viewer) => new ResetComponent(viewer));\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { LoadingManager, LoaderUtils } from \"three\";\n\nexport type GLTFFileSource = string | globalThis.File | ArrayBuffer;\n\nexport type GLTFLoadParams = {\n path?: string;\n externalFiles?: Map<string, GLTFFileSource>;\n crossOrigin?: string;\n requestHeader?: HeadersInit;\n withCredentials?: boolean;\n};\n\nexport class GLTFLoadingManager extends LoadingManager {\n public path = \"\";\n public resourcePath = \"\";\n public fileURL = \"\";\n public dataURLs = new Map();\n\n constructor(file: GLTFFileSource, params: GLTFLoadParams = {}) {\n super();\n\n this.path = params.path || \"\";\n\n const externalFiles = params.externalFiles || new Map();\n\n if (typeof file === \"string\") {\n this.fileURL = file;\n this.resourcePath = LoaderUtils.extractUrlBase(file);\n } else {\n externalFiles.forEach((value, key) => (this.fileURL = value === file ? key : this.fileURL));\n externalFiles.set(this.fileURL, file);\n }\n\n externalFiles.forEach((value, key) => {\n let dataURL: string;\n if (typeof value === \"string\") dataURL = value;\n else dataURL = URL.createObjectURL(new Blob([value]));\n this.dataURLs.set(key, dataURL);\n });\n\n this.setURLModifier((url: string) => {\n const key = decodeURI(url)\n .replace(this.path, \"\")\n .replace(this.resourcePath, \"\")\n .replace(/^(\\.?\\/)/, \"\");\n const dataURL = this.dataURLs.get(key);\n return dataURL ?? url;\n });\n }\n\n dispose() {\n this.dataURLs.forEach(URL.revokeObjectURL);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, Object3D, Vector3 } from \"three\";\nimport { ILoader } from \"@inweb/viewer-core\";\n\nimport { IModelImpl } from \"./IModelImpl\";\nimport { Viewer } from \"../Viewer\";\n\n// Basic model implementation.\n\nexport class ModelImpl implements IModelImpl {\n public handle: string;\n public scene: Object3D;\n public loader: ILoader;\n public viewer: Viewer;\n\n constructor(scene: Object3D) {\n this.handle = \"1\";\n this.scene = scene;\n }\n\n dispose() {\n function disposeMaterial(material: any) {\n // if (material.alphaMap) material.alphaMap.dispose();\n // if (material.anisotropyMap) material.anisotropyMap.dispose();\n // if (material.aoMap) material.aoMap.dispose();\n // if (material.bumpMap) material.bumpMap.dispose();\n // if (material.clearcoatMap) material.clearcoatMap.dispose();\n // if (material.clearcoatNormalMap) material.clearcoatNormalMap.dispose();\n // if (material.clearcoatRoughnessMap) material.clearcoatRoughnessMap.dispose();\n // if (material.displacementMap) material.displacementMap.dispose();\n // if (material.emissiveMap) material.emissiveMap.dispose();\n // if (material.gradientMap) material.gradientMap.dispose();\n // if (material.envMap) material.envMap.dispose();\n // if (material.iridescenceMap) material.iridescenceMap.dispose();\n // if (material.lightMap) material.lightMap.dispose();\n // if (material.map) material.map.dispose();\n // if (material.metalnessMap) material.metalnessMap.dispose();\n // if (material.normalMap) material.normalMap.dispose();\n // if (material.roughnessMap) material.roughnessMap.dispose();\n // if (material.sheenColorMap) material.sheenColorMap.dispose();\n // if (material.sheenRoughnessMap) material.sheenRoughnessMap.dispose();\n // if (material.specularMap) material.specularMap.dispose();\n // if (material.thicknessMap) material.thicknessMap.dispose();\n // if (material.transmissionMap) material.transmissionMap.dispose();\n material.dispose();\n }\n\n function disposeMaterials(material: any) {\n const materials = Array.isArray(material) ? material : [material];\n materials.forEach((material: any) => disposeMaterial(material));\n }\n\n function disposeObject(object: any) {\n if (object.geometry) object.geometry.dispose();\n if (object.material) disposeMaterials(object.material);\n }\n\n this.scene.traverse(disposeObject);\n this.scene.clear();\n }\n\n getExtents(target: Box3): Box3 {\n this.scene.traverseVisible((object) => !object.children.length && target.expandByObject(object));\n return target;\n }\n\n getObjects(): Object3D[] {\n const objects = [];\n this.scene.traverse((object) => objects.push(object));\n return objects;\n }\n\n getVisibleObjects(): Object3D[] {\n const objects = [];\n this.scene.traverseVisible((object) => objects.push(object));\n return objects;\n }\n\n hasObject(object: Object3D): boolean {\n while (object) {\n if (object === this.scene) return true;\n object = object.parent;\n }\n return false;\n }\n\n getOwnObjects(objects: Object3D | Object3D[]): Object3D[] {\n if (!Array.isArray(objects)) objects = [objects];\n return objects.filter((object) => this.hasObject(object));\n }\n\n getObjectsByHandles(handles: string | string[]): Object3D[] {\n const handleSet = new Set(handles);\n const objects = [];\n this.scene.traverse((object) => handleSet.has(object.userData.handle) && objects.push(object));\n return objects;\n }\n\n getHandlesByObjects(objects: Object3D | Object3D[]): string[] {\n if (!Array.isArray(objects)) objects = [objects];\n const handlesSet = new Set<string>();\n this.getOwnObjects(objects).forEach((object) => handlesSet.add(object.userData.handle));\n return Array.from(handlesSet);\n }\n\n hideObjects(objects: Object3D | Object3D[]): this {\n if (!Array.isArray(objects)) objects = [objects];\n this.getOwnObjects(objects).forEach((object) => (object.visible = false));\n return this;\n }\n\n hideAllObjects(): this {\n return this.isolateObjects([]);\n }\n\n isolateObjects(objects: Object3D | Object3D[]): this {\n if (!Array.isArray(objects)) objects = [objects];\n const visibleSet = new Set(objects);\n this.getOwnObjects(objects).forEach((object) => object.traverseAncestors((parent) => visibleSet.add(parent)));\n this.scene.traverse((object) => (object.visible = visibleSet.has(object)));\n return this;\n }\n\n showObjects(objects: Object3D | Object3D[]): this {\n if (!Array.isArray(objects)) objects = [objects];\n this.getOwnObjects(objects).forEach((object) => {\n object.visible = true;\n object.traverseAncestors((parent) => (parent.visible = true));\n });\n return this;\n }\n\n showAllObjects(): this {\n this.scene.traverse((object) => (object.visible = true));\n return this;\n }\n\n showOriginalObjects(objects: Object3D | Object3D[]): this {\n return this;\n }\n\n hideOriginalObjects(objects: Object3D | Object3D[]): this {\n return this;\n }\n\n explode(scale = 0, coeff = 4): this {\n function calcExplodeDepth(object: Object3D, depth: number): number {\n let res = depth;\n object.children.forEach((x: Object3D) => {\n const objectDepth = calcExplodeDepth(x, depth + 1);\n if (res < objectDepth) res = objectDepth;\n });\n\n object.userData.originalPosition = object.position.clone();\n object.userData.originalCenter = new Box3().setFromObject(object).getCenter(new Vector3());\n object.userData.isExplodeLocked = depth > 2 && object.children.length === 0;\n\n return res;\n }\n\n scale /= 100;\n\n if (!this.scene.userData.explodeDepth) this.scene.userData.explodeDepth = calcExplodeDepth(this.scene, 1);\n const maxDepth = this.scene.userData.explodeDepth;\n\n const scaledExplodeDepth = scale * maxDepth + 1;\n const explodeDepth = 0 | scaledExplodeDepth;\n const currentSegmentFraction = scaledExplodeDepth - explodeDepth;\n\n function explodeObject(object: Object3D, depth: number) {\n object.position.copy(object.userData.originalPosition);\n\n if (depth > 0 && depth <= explodeDepth && !object.userData.isExplodeLocked) {\n let objectScale = scale * coeff;\n if (depth === explodeDepth) objectScale *= currentSegmentFraction;\n\n const parentCenter = object.parent.userData.originalCenter;\n const objectCenter = object.userData.originalCenter;\n const objectOffset = objectCenter.clone().sub(parentCenter).multiplyScalar(objectScale);\n\n object.position.add(objectOffset);\n }\n\n object.children.forEach((x) => explodeObject(x, depth + 1));\n }\n\n explodeObject(this.scene, 0);\n this.scene.updateMatrixWorld();\n\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { Loader } from \"@inweb/viewer-core\";\n\nimport { Viewer } from \"../Viewer\";\nimport { GLTFLoadingManager, GLTFLoadParams } from \"./GLTFLoadingManager\";\nimport { ModelImpl } from \"../models/ModelImpl\";\n\nexport class GLTFFileLoader extends Loader {\n public viewer: Viewer;\n\n constructor(viewer: Viewer) {\n super();\n this.viewer = viewer;\n }\n\n override isSupport(file: any, format?: string): boolean {\n return (\n (typeof file === \"string\" || file instanceof globalThis.File || file instanceof ArrayBuffer) &&\n /(gltf|glb)$/i.test(format)\n );\n }\n\n override async load(file: any, format?: string, params?: GLTFLoadParams): Promise<this> {\n const manager = new GLTFLoadingManager(file, params);\n\n const loader = new GLTFLoader(manager);\n loader.setPath(manager.path);\n loader.setCrossOrigin(params.crossOrigin || loader.crossOrigin);\n loader.setWithCredentials(params.withCredentials || loader.withCredentials);\n\n const progress = (event: ProgressEvent) => {\n const { lengthComputable, loaded, total } = event;\n const progress = lengthComputable ? loaded / total : 1;\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file });\n };\n\n const gltf = await loader.loadAsync(manager.fileURL, progress);\n if (!this.viewer.scene) return this;\n\n const modelImpl = new ModelImpl(gltf.scene);\n modelImpl.loader = this;\n modelImpl.viewer = this.viewer;\n\n this.viewer.scene.add(gltf.scene);\n this.viewer.models.push(modelImpl);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n this.viewer.update();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: gltf.scene, file });\n\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, Object3D } from \"three\";\n\nimport { ModelImpl } from \"../../models/ModelImpl\";\nimport { DynamicGltfLoader } from \"./DynamicGltfLoader.js\";\n\n// Dynamic model implementation.\n\nexport class DynamicModelImpl extends ModelImpl {\n public gltfLoader: DynamicGltfLoader;\n public modelId: number;\n\n override getExtents(target: Box3): Box3 {\n return target.union(this.gltfLoader.getTotalGeometryExtent());\n }\n\n override getObjects(): Object3D[] {\n const objects = [];\n this.gltfLoader.originalObjects.forEach((object: Object3D) => {\n objects.push(object);\n });\n return objects;\n }\n\n override getVisibleObjects(): Object3D[] {\n return this.gltfLoader.getOriginalObjectForSelect();\n }\n\n override hasObject(object: any): boolean {\n return this.gltfLoader.originalObjects.has(object);\n }\n\n override getObjectsByHandles(handles: string | string[]): Object3D[] {\n const handlesSet = new Set(handles);\n const objects = [];\n handlesSet.forEach((handle) => {\n const handle2 = `${this.modelId}_${handle}`; // <- props fix: Dynamic Loader uses handle with structure ID prefix\n const handles = this.gltfLoader.handleToObjects.get(handle2) || [];\n objects.push(...Array.from(handles));\n });\n return objects;\n }\n\n override getHandlesByObjects(objects: Object3D | Object3D[]): string[] {\n const handles = super.getHandlesByObjects(objects);\n return handles.map((x) => x.split(\"_\").pop()); // <- props fix: remove structure ID prefix by the Dynamic Loader\n }\n\n override hideObjects(objects: Object3D | Object3D[]): this {\n const handles = super.getHandlesByObjects(objects);\n this.gltfLoader.hideObjects(handles);\n return this;\n }\n\n override isolateObjects(objects: Object3D | Object3D[]): this {\n const handles = super.getHandlesByObjects(objects);\n this.gltfLoader.isolateObjects(new Set(handles));\n return this;\n }\n\n override showObjects(objects: Object3D | Object3D[]): this {\n const handles = super.getHandlesByObjects(objects);\n this.gltfLoader.showObjects(handles);\n return this;\n }\n\n override showAllObjects(): this {\n this.gltfLoader.showAllHiddenObjects();\n return this;\n }\n\n override showOriginalObjects(objects: Object3D | Object3D[]): this {\n this.gltfLoader.showOriginalObjects(objects);\n return this;\n }\n\n override hideOriginalObjects(objects: Object3D | Object3D[]): this {\n this.gltfLoader.hideOriginalObjects(objects);\n return this;\n }\n}\n","import {\n TextureLoader,\n BufferAttribute,\n Color,\n DoubleSide,\n MeshPhongMaterial,\n PointsMaterial,\n LineBasicMaterial,\n} from \"three\";\n\nexport const GL_COMPONENT_TYPES = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array,\n};\n\nexport const GL_CONSTANTS = {\n FLOAT: 5126,\n //FLOAT_MAT2: 35674,\n FLOAT_MAT3: 35675,\n FLOAT_MAT4: 35676,\n FLOAT_VEC2: 35664,\n FLOAT_VEC3: 35665,\n FLOAT_VEC4: 35666,\n LINEAR: 9729,\n REPEAT: 10497,\n SAMPLER_2D: 35678,\n POINTS: 0,\n LINES: 1,\n LINE_LOOP: 2,\n LINE_STRIP: 3,\n TRIANGLES: 4,\n TRIANGLE_STRIP: 5,\n TRIANGLE_FAN: 6,\n UNSIGNED_BYTE: 5121,\n UNSIGNED_SHORT: 5123,\n};\n\nconst MAX_GAP = 128 * 1024; // 128 KB\nconst MAX_CHUNK = 30 * 1024 * 1024; // 100 MB\n\nexport class GltfStructure {\n constructor(id, loadController) {\n this.id = `${id}`;\n this.json = null;\n this.baseUrl = \"\";\n this.loadController = loadController;\n this.loader = null;\n this.batchDelay = 10;\n this.maxBatchSize = 5 * 1024 * 1024;\n this.maxRangesPerRequest = 512;\n this.pendingRequests = [];\n this.batchTimeout = null;\n this.textureLoader = new TextureLoader();\n this.materials = new Map();\n this.textureCache = new Map();\n this.materialCache = new Map();\n }\n\n async initialize(loader) {\n this.json = await this.loadController.loadJson();\n this.baseUrl = await this.loadController.baseUrl();\n this.loader = loader;\n }\n\n clear() {\n this.json = null;\n this.baseUrl = \"\";\n this.loadController = null;\n this.pendingRequests = [];\n if (this.batchTimeout) {\n clearTimeout(this.batchTimeout);\n this.batchTimeout = null;\n }\n\n this.disposeMaterials();\n this.textureCache.clear();\n this.materials.clear();\n\n this.activeChunkLoads = 0;\n this.chunkQueue = [];\n }\n\n getJson() {\n return this.json;\n }\n\n scheduleRequest(request) {\n return new Promise((resolve, reject) => {\n this.pendingRequests.push({\n ...request,\n _resolve: resolve,\n _reject: reject,\n });\n });\n }\n\n async flushBufferRequests() {\n if (!this.pendingRequests || this.pendingRequests.length === 0) return;\n const requests = [...this.pendingRequests];\n this.pendingRequests = [];\n\n requests.sort((a, b) => a.offset - b.offset);\n const mergedRanges = [];\n let current = {\n start: requests[0].offset,\n end: requests[0].offset + requests[0].length,\n requests: [requests[0]],\n };\n for (let i = 1; i < requests.length; i++) {\n const req = requests[i];\n const gap = req.offset - current.end;\n const newEnd = Math.max(current.end, req.offset + req.length);\n const projectedSize = newEnd - current.start;\n if (gap <= MAX_GAP && projectedSize <= MAX_CHUNK) {\n current.end = newEnd;\n current.requests.push(req);\n } else {\n mergedRanges.push(current);\n current = {\n start: req.offset,\n end: req.offset + req.length,\n requests: [req],\n };\n }\n }\n mergedRanges.push(current);\n const finalRanges = [];\n for (const range of mergedRanges) {\n let { start, end, requests } = range;\n while (end - start > MAX_CHUNK) {\n let splitIdx = 0;\n for (let i = 0; i < requests.length; i++) {\n if (requests[i].offset + requests[i].length - start > MAX_CHUNK) {\n break;\n }\n splitIdx = i;\n }\n const chunkRequests = requests.slice(0, splitIdx + 1);\n const chunkEnd =\n chunkRequests[chunkRequests.length - 1].offset + chunkRequests[chunkRequests.length - 1].length;\n finalRanges.push({\n start,\n end: chunkEnd,\n requests: chunkRequests,\n });\n requests = requests.slice(splitIdx + 1);\n if (requests.length > 0) {\n start = requests[0].offset;\n end = requests[0].offset + requests[0].length;\n for (let i = 1; i < requests.length; i++) {\n end = Math.max(end, requests[i].offset + requests[i].length);\n }\n }\n }\n if (requests.length > 0) {\n finalRanges.push({ start, end, requests });\n }\n }\n\n const promises = finalRanges.map(async (range, index) => {\n await this.loader.waitForChunkSlot();\n\n try {\n const length = range.end - range.start;\n const buffer = await this.loadController.loadBinaryData([{ offset: range.start, length }]);\n\n for (const req of range.requests) {\n const relOffset = req.offset - range.start;\n try {\n req._resolve({ buffer, relOffset, length: req.length });\n } catch (e) {\n req._reject(e);\n }\n }\n } catch (error) {\n for (const req of range.requests) {\n req._reject(error);\n }\n console.warn(`Failed to load chunk ${index + 1}/${finalRanges.length} (${range.start}-${range.end}):`, error);\n } finally {\n this.loader.releaseChunkSlot();\n }\n });\n\n await Promise.all(promises);\n\n this.pendingRequests = [];\n }\n\n getBufferView(byteOffset, byteLength, componentType) {\n return this.scheduleRequest({\n offset: byteOffset,\n length: byteLength,\n componentType,\n });\n }\n\n createTypedArray(buffer, offset, length, componentType) {\n try {\n if (!buffer || !(buffer instanceof ArrayBuffer)) {\n throw new Error(\"Invalid buffer\");\n }\n\n let elementSize;\n switch (componentType) {\n case 5120:\n case 5121:\n elementSize = 1;\n break; // BYTE, UNSIGNED_BYTE\n case 5122:\n case 5123:\n elementSize = 2;\n break; // SHORT, UNSIGNED_SHORT\n case 5125:\n case 5126:\n elementSize = 4;\n break; // UNSIGNED_INT, FLOAT\n default:\n throw new Error(`Unsupported component type: ${componentType}`);\n }\n\n const numElements = length / elementSize;\n if (!Number.isInteger(numElements)) {\n throw new Error(`Invalid length ${length} for component type ${componentType}`);\n }\n\n if (length > buffer.byteLength) {\n throw new Error(`Buffer too small: need ${length} bytes, but buffer is ${buffer.byteLength} bytes`);\n }\n\n const ArrayType = GL_COMPONENT_TYPES[componentType];\n return new ArrayType(buffer, offset, numElements);\n } catch (error) {\n if (error.name !== \"AbortError\") {\n console.error(\"Error creating typed array:\", {\n bufferSize: buffer?.byteLength,\n offset,\n length,\n componentType,\n error,\n });\n }\n throw error;\n }\n }\n\n async createBufferAttribute(accessorIndex) {\n if (!this.json) {\n throw new Error(\"No GLTF structure loaded\");\n }\n\n const gltf = this.json;\n const accessor = gltf.accessors[accessorIndex];\n const bufferView = gltf.bufferViews[accessor.bufferView];\n\n try {\n const byteOffset = (bufferView.byteOffset || 0) + (accessor.byteOffset || 0);\n const components = this.getNumComponents(accessor.type);\n const count = accessor.count;\n const byteLength = count * components * this.getComponentSize(accessor.componentType);\n\n const array = await this.getBufferView(byteOffset, byteLength, accessor.componentType);\n\n const attribute = new BufferAttribute(array, components);\n\n if (accessor.min !== undefined) attribute.min = accessor.min;\n if (accessor.max !== undefined) attribute.max = accessor.max;\n\n return attribute;\n } catch (error) {\n if (error.name !== \"AbortError\") {\n console.error(\"Error creating buffer attribute:\", {\n error,\n accessor,\n bufferView,\n });\n }\n\n throw error;\n }\n }\n\n getComponentSize(componentType) {\n switch (componentType) {\n case 5120: // BYTE\n case 5121: // UNSIGNED_BYTE\n return 1;\n case 5122: // SHORT\n case 5123: // UNSIGNED_SHORT\n return 2;\n case 5125: // UNSIGNED_INT\n case 5126: // FLOAT\n return 4;\n default:\n throw new Error(`Unknown component type: ${componentType}`);\n }\n }\n\n getNumComponents(type) {\n switch (type) {\n case \"SCALAR\":\n return 1;\n case \"VEC2\":\n return 2;\n case \"VEC3\":\n return 3;\n case \"VEC4\":\n return 4;\n case \"MAT2\":\n return 4;\n case \"MAT3\":\n return 9;\n case \"MAT4\":\n return 16;\n default:\n throw new Error(`Unknown type: ${type}`);\n }\n }\n\n async loadTextures() {\n if (!this.json.textures) return;\n\n const loadTexture = async (imageIndex) => {\n const image = this.json.images[imageIndex];\n\n if (image.uri) {\n if (image.uri.startsWith(\"data:\")) {\n return await this.textureLoader.loadAsync(image.uri);\n } else {\n const fullUrl = this.baseUrl + image.uri;\n return await this.textureLoader.loadAsync(fullUrl);\n }\n } else if (image.bufferView !== undefined) {\n const bufferView = this.json.bufferViews[image.bufferView];\n const array = await this.getBufferView(bufferView.byteOffset || 0, bufferView.byteLength, 5121);\n const blob = new Blob([array], { type: image.mimeType });\n const url = URL.createObjectURL(blob);\n const texture = await this.textureLoader.loadAsync(url);\n URL.revokeObjectURL(url);\n texture.flipY = false;\n return texture;\n }\n };\n\n const texturePromises = [];\n for (let i = 0; i < this.json.textures.length; i++) {\n texturePromises.push(\n loadTexture(this.json.textures[i].source).then((texture) => this.textureCache.set(i, texture))\n );\n }\n await Promise.all(texturePromises);\n }\n\n loadMaterials() {\n if (!this.json.materials) return this.materials;\n\n for (let i = 0; i < this.json.materials.length; i++) {\n const materialDef = this.json.materials[i];\n\n const materialCacheKey = `material_${i}`;\n this.materialCache.set(materialCacheKey, {\n mesh: this.createMaterial(materialDef, GL_CONSTANTS.TRIANGLES),\n points: this.createMaterial(materialDef, GL_CONSTANTS.POINTS),\n lines: this.createMaterial(materialDef, GL_CONSTANTS.LINES),\n });\n\n this.materialCache.get(materialCacheKey).mesh.name = materialDef.name;\n this.materialCache.get(materialCacheKey).points.name = materialDef.name;\n this.materialCache.get(materialCacheKey).lines.name = materialDef.name;\n\n this.materials.set(i, this.materialCache.get(materialCacheKey).mesh);\n }\n return this.materials;\n }\n\n createMaterial(materialDef, primitiveMode = undefined) {\n const params = {};\n\n if (materialDef.pbrMetallicRoughness) {\n const pbr = materialDef.pbrMetallicRoughness;\n if (pbr.baseColorFactor) {\n params.color = new Color().fromArray(pbr.baseColorFactor);\n params.opacity = pbr.baseColorFactor[3];\n if (params.opacity < 1.0) params.transparent = true;\n }\n if (pbr.baseColorTexture) {\n params.map = this.textureCache.get(pbr.baseColorTexture.index);\n }\n }\n\n if (materialDef.emissiveFactor) {\n params.emissive = new Color().fromArray(materialDef.emissiveFactor);\n }\n\n if (materialDef.alphaMode === \"BLEND\") {\n params.transparent = true;\n }\n\n if (materialDef.doubleSided) {\n params.side = DoubleSide;\n }\n let material;\n\n if (primitiveMode === GL_CONSTANTS.POINTS) {\n params.sizeAttenuation = false;\n material = new PointsMaterial(params);\n material.sizeAttenuation = false;\n } else if (\n primitiveMode === GL_CONSTANTS.LINES ||\n primitiveMode === GL_CONSTANTS.LINE_STRIP ||\n primitiveMode === GL_CONSTANTS.LINE_LOOP\n ) {\n material = new LineBasicMaterial(params);\n } else {\n params.specular = 0x222222;\n params.shininess = 10;\n params.reflectivity = 0.05;\n params.polygonOffset = true;\n params.polygonOffsetFactor = 1;\n params.polygonOffsetUnits = 1;\n\n if (materialDef.normalTexture) {\n params.normalMap = this.textureCache.get(materialDef.normalTexture.index);\n }\n\n material = new MeshPhongMaterial(params);\n }\n\n return material;\n }\n\n getCachedMaterial(materialIndex, primitiveMode) {\n const materialCacheKey = `material_${materialIndex}`;\n const materialCache = this.materialCache.get(materialCacheKey);\n\n if (materialCache) {\n if (primitiveMode === GL_CONSTANTS.POINTS) {\n return materialCache.points;\n } else if (\n primitiveMode === GL_CONSTANTS.LINES ||\n primitiveMode === GL_CONSTANTS.LINE_STRIP ||\n primitiveMode === GL_CONSTANTS.LINE_LOOP\n ) {\n return materialCache.lines;\n } else {\n return materialCache.mesh;\n }\n }\n\n return null;\n }\n\n disposeMaterials() {\n this.textureCache.forEach((texture) => texture.dispose());\n this.textureCache.clear();\n\n this.materials.forEach((material) => {\n if (material.map) material.map.dispose();\n if (material.lightMap) material.lightMap.dispose();\n if (material.bumpMap) material.bumpMap.dispose();\n if (material.normalMap) material.normalMap.dispose();\n if (material.specularMap) material.specularMap.dispose();\n if (material.envMap) material.envMap.dispose();\n if (material.aoMap) material.aoMap.dispose();\n if (material.metalnessMap) material.metalnessMap.dispose();\n if (material.roughnessMap) material.roughnessMap.dispose();\n if (material.emissiveMap) material.emissiveMap.dispose();\n material.dispose();\n });\n this.materials.clear();\n\n this.materialCache.forEach((materialCache) => {\n if (materialCache.mesh) {\n if (materialCache.mesh.map) materialCache.mesh.map.dispose();\n if (materialCache.mesh.lightMap) materialCache.mesh.lightMap.dispose();\n if (materialCache.mesh.bumpMap) materialCache.mesh.bumpMap.dispose();\n if (materialCache.mesh.normalMap) materialCache.mesh.normalMap.dispose();\n if (materialCache.mesh.specularMap) materialCache.mesh.specularMap.dispose();\n if (materialCache.mesh.envMap) materialCache.mesh.envMap.dispose();\n if (materialCache.mesh.aoMap) materialCache.mesh.aoMap.dispose();\n if (materialCache.mesh.metalnessMap) materialCache.mesh.metalnessMap.dispose();\n if (materialCache.mesh.roughnessMap) materialCache.mesh.roughnessMap.dispose();\n if (materialCache.mesh.emissiveMap) materialCache.mesh.emissiveMap.dispose();\n materialCache.mesh.dispose();\n }\n\n if (materialCache.points) {\n if (materialCache.points.map) materialCache.points.map.dispose();\n materialCache.points.dispose();\n }\n\n if (materialCache.lines) {\n if (materialCache.lines.map) materialCache.lines.map.dispose();\n materialCache.lines.dispose();\n }\n });\n this.materialCache.clear();\n }\n\n estimateNodeSize(meshIndex) {\n if (!this.json.meshes) return 0;\n\n const meshDef = this.json.meshes[meshIndex];\n if (!meshDef || !meshDef.primitives) return 0;\n\n let totalSize = 0;\n for (const primitive of meshDef.primitives) {\n if (primitive.attributes) {\n for (const [, accessorIndex] of Object.entries(primitive.attributes)) {\n if (accessorIndex === undefined) continue;\n\n const accessor = this.json.accessors[accessorIndex];\n if (!accessor) continue;\n\n const numComponents = this.getNumComponents(accessor.type);\n const bytesPerComponent = this.getComponentSize(accessor.componentType);\n totalSize += accessor.count * numComponents * bytesPerComponent;\n }\n }\n\n if (primitive.indices !== undefined) {\n const accessor = this.json.accessors[primitive.indices];\n if (accessor) {\n const bytesPerComponent = this.getComponentSize(accessor.componentType);\n totalSize += accessor.count * bytesPerComponent;\n }\n }\n }\n\n return totalSize;\n }\n}\n","import {\n BufferGeometry,\n PointsMaterial,\n Points,\n Mesh,\n TriangleStripDrawMode,\n TriangleFanDrawMode,\n LineSegments,\n Line,\n LineLoop,\n Group,\n Vector3,\n Quaternion,\n Matrix4,\n Box3,\n MeshPhongMaterial,\n Color,\n MathUtils,\n PerspectiveCamera,\n OrthographicCamera,\n DoubleSide,\n NormalBlending,\n BufferAttribute,\n LineBasicMaterial,\n} from \"three\";\nimport { GL_CONSTANTS } from \"./GltfStructure.js\";\nimport { mergeGeometries } from \"three/examples/jsm/utils/BufferGeometryUtils.js\";\n\n//#AI-GENERATED using Gemini 2.5 Pro, Claude-4-sonnet\n//#Reviewed and adapted by dborysov@opendesign.com\n\nexport class DynamicGltfLoader {\n constructor(camera, scene, renderer) {\n this.camera = camera;\n this.scene = scene;\n this.renderer = renderer;\n\n this.eventHandlers = {\n geometryprogress: [],\n databasechunk: [],\n geometryend: [],\n geometryerror: [],\n update: [],\n geometrymemory: [],\n };\n\n this.loadDistance = 100;\n this.unloadDistance = 150;\n this.checkInterval = 1000;\n\n this.nodes = new Map();\n this.loadedMeshes = new Map();\n this.nodesToLoad = [];\n this.edgeNodes = [];\n this.structures = [];\n this.structureRoots = new Map();\n\n this.memoryLimit = this.getAvailableMemory();\n this.loadedGeometrySize = 0;\n this.geometryCache = new Map();\n this.materialCache = new Map();\n this.textureCache = new Map();\n this.currentMemoryUsage = 0;\n\n this.updateMemoryIndicator();\n\n this.loadedMaterials = new Map();\n this.abortController = new AbortController();\n\n this.batchSize = 10000;\n this.frameDelay = 0;\n\n this.graphicsObjectLimit = 10000;\n this.totalLoadedObjects = 0;\n\n this.lastUpdateTime = 0;\n this.updateInterval = 1000;\n\n this.handleToObjects = new Map();\n\n this.originalObjects = new Set();\n this.originalObjectsToSelection = new Set();\n\n this.optimizedOriginalMap = new Map();\n this.mergedMesh = new Set();\n this.mergedLines = new Set();\n this.mergedLineSegments = new Set();\n this.mergedPoints = new Set();\n\n this.isolatedObjects = [];\n //!!window.WebGL2RenderingContext && this.renderer.getContext() instanceof WebGL2RenderingContext\n this.useVAO = false;\n this.visibleEdges = true;\n\n this.handleToOptimizedObjects = new Map();\n\n this.hiddenHandles = new Set();\n this.newOptimizedObjects = new Set();\n this.oldOptimizeObjects = new Set();\n\n this.maxConcurrentChunks = 8;\n this.activeChunkLoads = 0;\n this.chunkQueue = [];\n\n // GPU-accelerated visibility system\n this.objectIdToIndex = new Map(); // objectId -> index\n this.maxObjectId = 0; // Maximum object ID\n this.objectVisibility = new Float32Array(); // Array of visibility flags for each object\n\n // Chunk loading configuration\n this.maxConcurrentChunks = 6; // Default limit\n\n // Merged geometry tracking\n this.mergedObjectMap = new Map(); // objectId -> {mergedObject, startIndex, endIndex, vertexCount}\n this.mergedGeometryVisibility = new Map(); // mergedObject -> visibility array\n }\n\n setVisibleEdges(visible) {\n this.visibleEdges = visible;\n }\n\n getAvailableMemory() {\n let memoryLimit = 6 * 1024 * 1024 * 1024;\n try {\n if (navigator.deviceMemory) {\n memoryLimit = navigator.deviceMemory * 1024 * 1024 * 1024;\n } else if (performance.memory) {\n const jsHeapSizeLimit = performance.memory.jsHeapSizeLimit;\n if (jsHeapSizeLimit) {\n memoryLimit = Math.min(memoryLimit, jsHeapSizeLimit);\n }\n }\n\n memoryLimit = Math.min(memoryLimit, 16 * 1024 * 1024 * 1024);\n memoryLimit = Math.max(memoryLimit, 2 * 1024 * 1024 * 1024);\n\n console.log(`Available memory set to ${Math.round(memoryLimit / (1024 * 1024 * 1024))}GB`);\n } catch (error) {\n console.warn(\"Error detecting available memory:\", error);\n }\n\n return memoryLimit / 3;\n }\n\n getAbortController() {\n return this.abortController;\n }\n\n abortLoading() {\n this.abortController.abort();\n }\n\n updateMemoryIndicator() {\n this.dispatchEvent(\"geometrymemory\", {\n currentUsage: this.currentMemoryUsage,\n limit: this.memoryLimit,\n });\n }\n\n setMemoryLimit(bytesLimit) {\n // this.memoryLimit = bytesLimit;\n //this.updateMemoryIndicator();\n // console.log(`Memory limit set to ${Math.round(bytesLimit / (1024 * 1024))}MB`);\n }\n\n estimateGeometrySize(nodeGroup) {\n let totalSize = 0;\n nodeGroup.traverse((child) => {\n if (child.geometry) {\n if (this.abortController.signal.aborted) {\n throw new DOMException(\"Loading aborted\", \"AbortError\");\n }\n const geometry = child.geometry;\n\n if (geometry.attributes) {\n Object.values(geometry.attributes).forEach((attribute) => {\n if (attribute && attribute.array) {\n totalSize += attribute.array.byteLength;\n }\n });\n }\n\n if (geometry.index && geometry.index.array) {\n totalSize += geometry.index.array.byteLength;\n }\n }\n });\n\n return totalSize;\n }\n\n recalculateScene() {\n const geometries = [];\n this.scene.traverse((object) => {\n if (this.abortController.signal.aborted) {\n throw new DOMException(\"Loading aborted\", \"AbortError\");\n }\n\n if (object.geometry && !this.geometryCache.has(object.geometry.uuid)) {\n const size = this.estimateGeometrySize(object);\n this.geometryCache.set(object.geometry.uuid, size);\n geometries.push({\n object,\n size,\n distance: object.position.distanceTo(this.camera.position),\n });\n }\n });\n\n if (this.abortController.signal.aborted) {\n throw new DOMException(\"Loading aborted\", \"AbortError\");\n }\n\n geometries.sort((a, b) => b.distance - a.distance);\n\n let currentMemoryUsage = 0;\n for (const geo of geometries) {\n currentMemoryUsage += geo.size;\n }\n\n if (currentMemoryUsage > this.memoryLimit) {\n console.log(`Memory usage (${Math.round(currentMemoryUsage / (1024 * 1024))}MB) exceeds limit`);\n\n for (const geo of geometries) {\n if (currentMemoryUsage <= this.memoryLimit) break;\n\n if (this.abortController.signal.aborted) {\n throw new DOMException(\"Loading aborted\", \"AbortError\");\n }\n\n const object = geo.object;\n if (object.geometry) {\n currentMemoryUsage -= geo.size;\n this.geometryCache.delete(object.geometry.uuid);\n object.geometry.dispose();\n object.visible = false;\n }\n }\n }\n\n this.currentMemoryUsage = currentMemoryUsage;\n this.updateMemoryIndicator();\n\n console.log(`Final memory usage: ${Math.round(currentMemoryUsage / (1024 * 1024))}MB`);\n }\n\n async loadNode(nodeId, onLoadFinishCb) {\n const node = this.nodes.get(nodeId);\n if (!node || node.loaded || node.loading) return;\n\n node.loading = true;\n const meshDef = node.structure.getJson().meshes[node.meshIndex];\n\n try {\n const bufferRequests = [];\n const primitiveReqMap = new Map();\n for (let primIdx = 0; primIdx < meshDef.primitives.length; primIdx++) {\n const primitive = meshDef.primitives[primIdx];\n const reqs = [];\n\n if (primitive.attributes.POSITION !== undefined) {\n const accessorIndex = primitive.attributes.POSITION;\n const accessor = node.structure.json.accessors[accessorIndex];\n const bufferView = node.structure.json.bufferViews[accessor.bufferView];\n const byteOffset = (bufferView.byteOffset || 0) + (accessor.byteOffset || 0);\n const components = node.structure.getNumComponents(accessor.type);\n const count = accessor.count;\n const byteLength = count * components * node.structure.getComponentSize(accessor.componentType);\n reqs.push({\n offset: byteOffset,\n length: byteLength,\n componentType: accessor.componentType,\n accessorIndex,\n type: \"position\",\n primIdx,\n });\n }\n\n if (primitive.attributes.NORMAL !== undefined) {\n const accessorIndex = primitive.attributes.NORMAL;\n const accessor = node.structure.json.accessors[accessorIndex];\n const bufferView = node.structure.json.bufferViews[accessor.bufferView];\n const byteOffset = (bufferView.byteOffset || 0) + (accessor.byteOffset || 0);\n const components = node.structure.getNumComponents(accessor.type);\n const count = accessor.count;\n const byteLength = count * components * node.structure.getComponentSize(accessor.componentType);\n reqs.push({\n offset: byteOffset,\n length: byteLength,\n componentType: accessor.componentType,\n accessorIndex,\n type: \"normal\",\n primIdx,\n });\n }\n\n if (primitive.attributes.TEXCOORD_0 !== undefined) {\n const accessorIndex = primitive.attributes.TEXCOORD_0;\n const accessor = node.structure.json.accessors[accessorIndex];\n const bufferView = node.structure.json.bufferViews[accessor.bufferView];\n const byteOffset = (bufferView.byteOffset || 0) + (accessor.byteOffset || 0);\n const components = node.structure.getNumComponents(accessor.type);\n const count = accessor.count;\n const byteLength = count * components * node.structure.getComponentSize(accessor.componentType);\n reqs.push({\n offset: byteOffset,\n length: byteLength,\n componentType: accessor.componentType,\n accessorIndex,\n type: \"uv\",\n primIdx,\n });\n }\n\n if (primitive.indices !== undefined) {\n const accessorIndex = primitive.indices;\n const accessor = node.structure.json.accessors[accessorIndex];\n const bufferView = node.structure.json.bufferViews[accessor.bufferView];\n const byteOffset = (bufferView.byteOffset || 0) + (accessor.byteOffset || 0);\n const components = node.structure.getNumComponents(accessor.type);\n const count = accessor.count;\n const byteLength = count * components * node.structure.getComponentSize(accessor.componentType);\n reqs.push({\n offset: byteOffset,\n length: byteLength,\n componentType: accessor.componentType,\n accessorIndex,\n type: \"index\",\n primIdx,\n });\n }\n primitiveReqMap.set(primIdx, reqs);\n bufferRequests.push(...reqs);\n }\n\n if (bufferRequests.length === 0) {\n node.loaded = true;\n node.loading = false;\n return;\n }\n bufferRequests.sort((a, b) => a.offset - b.offset);\n const minOffset = bufferRequests[0].offset;\n const maxOffset = Math.max(...bufferRequests.map((r) => r.offset + r.length));\n const totalLength = maxOffset - minOffset;\n\n const { buffer, relOffset: baseRelOffset } = await node.structure.scheduleRequest({\n offset: minOffset,\n length: totalLength,\n componentType: null,\n });\n\n for (const req of bufferRequests) {\n const relOffset = req.offset - minOffset;\n req.data = node.structure.createTypedArray(buffer, baseRelOffset + relOffset, req.length, req.componentType);\n }\n\n for (let primIdx = 0; primIdx < meshDef.primitives.length; primIdx++) {\n const primitive = meshDef.primitives[primIdx];\n const geometry = new BufferGeometry();\n const reqs = primitiveReqMap.get(primIdx);\n\n if (primitive.attributes.POSITION !== undefined) {\n const req = reqs.find((r) => r.type === \"position\" && r.accessorIndex === primitive.attributes.POSITION);\n const accessor = node.structure.json.accessors[primitive.attributes.POSITION];\n const components = node.structure.getNumComponents(accessor.type);\n geometry.setAttribute(\"position\", new BufferAttribute(req.data, components));\n }\n\n if (primitive.attributes.NORMAL !== undefined) {\n const req = reqs.find((r) => r.type === \"normal\" && r.accessorIndex === primitive.attributes.NORMAL);\n const accessor = node.structure.json.accessors[primitive.attributes.NORMAL];\n const components = node.structure.getNumComponents(accessor.type);\n geometry.setAttribute(\"normal\", new BufferAttribute(req.data, components));\n }\n\n if (primitive.attributes.TEXCOORD_0 !== undefined) {\n const req = reqs.find((r) => r.type === \"uv\" && r.accessorIndex === primitive.attributes.TEXCOORD_0);\n const accessor = node.structure.json.accessors[primitive.attributes.TEXCOORD_0];\n const components = node.structure.getNumComponents(accessor.type);\n geometry.setAttribute(\"uv\", new BufferAttribute(req.data, components));\n }\n\n if (primitive.indices !== undefined) {\n const req = reqs.find((r) => r.type === \"index\" && r.accessorIndex === primitive.indices);\n geometry.setIndex(new BufferAttribute(req.data, 1));\n }\n\n let material;\n if (primitive.material !== undefined) {\n material = node.structure.getCachedMaterial(primitive.material, primitive.mode);\n\n if (!material) {\n const materialDef = node.structure.json.materials[primitive.material];\n material = node.structure.createMaterial(materialDef, primitive.mode);\n }\n } else {\n material = this.createDefaultMaterial(primitive.mode);\n }\n\n let mesh;\n if (primitive.mode === GL_CONSTANTS.POINTS) {\n mesh = new Points(geometry, material);\n } else if (\n primitive.mode === GL_CONSTANTS.TRIANGLES ||\n primitive.mode === GL_CONSTANTS.TRIANGLE_STRIP ||\n primitive.mode === GL_CONSTANTS.TRIANGLE_FAN ||\n primitive.mode === undefined\n ) {\n mesh = new Mesh(geometry, material);\n if (primitive.mode === GL_CONSTANTS.TRIANGLE_STRIP) {\n mesh.drawMode = TriangleStripDrawMode;\n } else if (primitive.mode === GL_CONSTANTS.TRIANGLE_FAN) {\n mesh.drawMode = TriangleFanDrawMode;\n }\n } else if (primitive.mode === GL_CONSTANTS.LINES) {\n mesh = new LineSegments(geometry, material);\n } else if (primitive.mode === GL_CONSTANTS.LINE_STRIP) {\n mesh = new Line(geometry, material);\n } else if (primitive.mode === GL_CONSTANTS.LINE_LOOP) {\n mesh = new LineLoop(geometry, material);\n }\n if (node.extras) {\n mesh.userData = { ...mesh.userData, ...node.extras };\n }\n if (meshDef.extras) {\n mesh.userData = { ...mesh.userData, ...meshDef.extras };\n }\n if (primitive.extras) {\n mesh.userData = { ...mesh.userData, ...primitive.extras };\n }\n if (node.handle) {\n mesh.userData.handle = node.handle;\n } else {\n mesh.userData.handle = `${node.structure.id}_${mesh.userData.handle}`;\n }\n if (mesh.material.name === \"edges\") {\n mesh.userData.isEdge = true;\n } else {\n mesh.userData.isEdge = false;\n }\n this.registerObjectWithHandle(mesh, mesh.userData.handle);\n mesh.position.copy(node.position);\n if (!geometry.attributes.normal) {\n geometry.computeVertexNormals();\n }\n if (material.aoMap && geometry.attributes.uv) {\n geometry.setAttribute(\"uv2\", geometry.attributes.uv);\n }\n if (node.group) {\n node.group.add(mesh);\n } else {\n this.scene.add(mesh);\n }\n node.object = mesh;\n this.totalLoadedObjects++;\n mesh.visible = this.totalLoadedObjects < this.graphicsObjectLimit;\n }\n node.loaded = true;\n node.loading = false;\n const geometrySize = this.estimateGeometrySize(node.object);\n this.geometryCache.set(node.object.uuid, geometrySize);\n this.currentMemoryUsage += geometrySize;\n if (onLoadFinishCb) {\n onLoadFinishCb();\n }\n } catch (error) {\n if (error.name !== \"AbortError\") {\n console.error(`Error loading node ${nodeId}:`, error);\n }\n node.loading = false;\n }\n }\n\n unloadNode(nodeId) {\n const node = this.nodes.get(nodeId);\n if (!node || !node.loaded) return;\n\n if (node.object) {\n if (node.object.parent) {\n node.object.parent.remove(node.object);\n } else {\n this.scene.remove(node.object);\n }\n\n node.object.traverse((child) => {\n if (child.geometry) {\n const geometrySize = this.geometryCache.get(child.geometry.uuid) || 0;\n this.currentMemoryUsage -= geometrySize;\n this.geometryCache.delete(child.geometry.uuid);\n child.geometry.dispose();\n }\n });\n\n node.object = null;\n node.loaded = false;\n this.updateMemoryIndicator();\n console.log(`Unloaded node: ${nodeId}`);\n }\n }\n\n checkDistances() {\n const cameraPosition = this.camera.position;\n\n this.nodes.forEach((node, nodeId) => {\n const distance = cameraPosition.distanceTo(node.position);\n\n if (node.loaded) {\n if (distance > this.unloadDistance) {\n this.unloadNode(nodeId);\n }\n } else if (!node.loading) {\n if (distance < this.loadDistance) {\n this.loadNode(nodeId);\n }\n }\n });\n }\n\n async loadStructure(structures) {\n this.clear();\n\n const structureArray = Array.isArray(structures) ? structures : [structures];\n\n for (const structure of structureArray) {\n await structure.initialize(this);\n this.structures.push(structure);\n }\n\n for (const structure of this.structures) {\n try {\n await structure.loadTextures();\n await structure.loadMaterials();\n } catch (error) {\n console.error(\"Error loading materials:\", error);\n throw error;\n }\n }\n\n await this.processSceneHierarchy();\n }\n\n async processSceneHierarchy() {\n if (this.structures.length === 0) {\n throw new Error(\"No GLTF structures loaded\");\n }\n\n this.nodesToLoad = [];\n\n let estimatedSize = 0;\n\n for (const structure of this.structures) {\n const gltf = structure.getJson();\n\n if (!gltf.scenes || !gltf.scenes.length) {\n console.warn(\"No scenes found in GLTF structure\");\n continue;\n }\n\n estimatedSize += gltf.buffers[0].byteLength;\n\n const rootGroup = new Group();\n rootGroup.name = `structure_${structure.id}_root`;\n this.scene.add(rootGroup);\n this.structureRoots.set(structure.id, rootGroup);\n\n const scene = gltf.scenes[gltf.scene || 0];\n\n for (const nodeIndex of scene.nodes) {\n await this.processNodeHierarchy(structure, nodeIndex, rootGroup);\n }\n }\n\n const ignoreEdges = estimatedSize * 2 > this.memoryLimit;\n\n this.nodesToLoad.sort((a, b) => {\n const nodeA = this.nodes.get(a);\n const nodeB = this.nodes.get(b);\n\n if (!nodeA?.geometryExtents || !nodeB?.geometryExtents) {\n return 0;\n }\n\n const sizeA = nodeA.geometryExtents.getSize(new Vector3());\n const sizeB = nodeB.geometryExtents.getSize(new Vector3());\n const volumeA = sizeA.x * sizeA.y * sizeA.z;\n const volumeB = sizeB.x * sizeB.y * sizeB.z;\n\n return volumeB - volumeA;\n });\n\n if (!ignoreEdges && this.visibleEdges) {\n this.nodesToLoad.push(...this.edgeNodes);\n }\n\n this.dispatchEvent(\"databasechunk\", {\n totalNodes: this.nodesToLoad.length,\n structures: this.structures.map((s) => ({\n id: s.id,\n nodeCount: this.nodesToLoad.filter((nodeId) => nodeId.startsWith(s.id)).length,\n })),\n });\n }\n\n async processNodeHierarchy(structure, nodeId, parentGroup) {\n const nodeDef = structure.json.nodes[nodeId];\n let nodeGroup = null;\n\n let handle = null;\n if (nodeDef.extras?.handle) {\n handle = `${structure.id}_${nodeDef.extras.handle}`;\n }\n\n if (nodeDef.camera !== undefined) {\n const camera = this.loadCamera(structure, nodeDef.camera, nodeDef);\n if (nodeDef.extras) {\n camera.userData = { ...camera.userData, ...nodeDef.extras };\n }\n this.scene.add(camera);\n return;\n }\n\n const needsGroup = this.needsGroupForNode(structure, nodeDef);\n\n if (needsGroup) {\n nodeGroup = new Group();\n nodeGroup.name = nodeDef.name || `node_${nodeId}`;\n\n if (nodeDef.extras) {\n nodeGroup.userData = { ...nodeDef.extras };\n if (nodeGroup.userData.handle) {\n nodeGroup.userData.handle = `${structure.id}_${nodeGroup.userData.handle}`;\n }\n }\n\n if (nodeDef.matrix) {\n nodeGroup.matrix.fromArray(nodeDef.matrix);\n nodeGroup.matrixAutoUpdate = false;\n } else if (nodeDef.translation || nodeDef.rotation || nodeDef.scale) {\n const position = nodeDef.translation ? new Vector3().fromArray(nodeDef.translation) : new Vector3();\n const quaternion = nodeDef.rotation ? new Quaternion().fromArray(nodeDef.rotation) : new Quaternion();\n const scale = nodeDef.scale ? new Vector3().fromArray(nodeDef.scale) : new Vector3(1, 1, 1);\n nodeGroup.matrix.compose(position, quaternion, scale);\n nodeGroup.matrixAutoUpdate = false;\n }\n\n if (parentGroup) {\n parentGroup.add(nodeGroup);\n }\n }\n\n if (nodeDef.mesh !== undefined) {\n const nodeMatrix = new Matrix4();\n const uniqueNodeId = `${structure.id}_${nodeId}`;\n const meshDef = structure.json.meshes[nodeDef.mesh];\n const geometryExtents = new Box3();\n\n for (const primitive of meshDef.primitives) {\n const positionAccessor = structure.json.accessors[primitive.attributes.POSITION];\n if (positionAccessor && positionAccessor.min && positionAccessor.max) {\n const primitiveBox = new Box3(\n new Vector3().fromArray(positionAccessor.min),\n new Vector3().fromArray(positionAccessor.max)\n );\n geometryExtents.union(primitiveBox);\n }\n }\n\n let isEdge = false;\n if (meshDef.primitives[0].material !== undefined) {\n const material = structure.json.materials[meshDef.primitives[0].material];\n if (material?.name === \"edges\") {\n isEdge = true;\n }\n }\n\n if (!isEdge) {\n this.nodesToLoad.push(uniqueNodeId);\n } else {\n this.edgeNodes.push(uniqueNodeId);\n }\n\n if (meshDef.extras && meshDef.extras.handle) {\n handle = `${structure.id}_${meshDef.extras.handle}`;\n }\n\n this.nodes.set(uniqueNodeId, {\n position: nodeGroup ? nodeGroup.position.clone() : new Vector3().setFromMatrixPosition(nodeMatrix),\n nodeIndex: nodeId,\n meshIndex: nodeDef.mesh,\n loaded: false,\n loading: false,\n object: null,\n group: nodeGroup || parentGroup,\n structure,\n extras: nodeDef.extras,\n geometryExtents,\n handle,\n });\n }\n\n if (nodeDef.children) {\n for (const childId of nodeDef.children) {\n await this.processNodeHierarchy(structure, childId, nodeGroup || parentGroup);\n }\n }\n\n return nodeGroup;\n }\n\n needsGroupForNode(structure, nodeDef) {\n const hasTransforms = nodeDef.matrix || nodeDef.translation || nodeDef.rotation || nodeDef.scale;\n\n const hasMultiplePrimitives =\n nodeDef.mesh !== undefined && structure.json.meshes[nodeDef.mesh].primitives.length > 1;\n\n return hasTransforms !== undefined || hasMultiplePrimitives;\n }\n\n async processNodes() {\n const nodesToLoad = this.nodesToLoad;\n let loadedCount = 0;\n let lastLoadedCount = 0;\n const totalNodes = nodesToLoad.length;\n\n const loadProgress = async () => {\n loadedCount++;\n if (loadedCount - lastLoadedCount > 1000) {\n lastLoadedCount = loadedCount;\n this.updateMemoryIndicator();\n this.dispatchEvent(\"geometryprogress\", {\n percentage: Math.round((loadedCount / totalNodes) * 100),\n loaded: loadedCount,\n total: totalNodes,\n });\n\n const currentTime = Date.now();\n if (currentTime - this.lastUpdateTime >= this.updateInterval) {\n this.dispatchEvent(\"update\");\n this.lastUpdateTime = currentTime;\n }\n\n await new Promise((resolve) => {\n setTimeout(resolve, 0);\n });\n }\n };\n\n try {\n const loadOperations = [];\n for (const nodeId of nodesToLoad) {\n if (this.abortController.signal.aborted) {\n throw new DOMException(\"Loading aborted\", \"AbortError\");\n }\n\n const estimatedSize = await this.estimateNodeSize(nodeId);\n\n if (this.currentMemoryUsage + estimatedSize > this.memoryLimit) {\n console.log(`Memory limit reached after loading ${loadedCount} nodes`);\n this.dispatchEvent(\"geometryerror\", {\n message: \"Memory limit reached\",\n });\n this.dispatchEvent(\"update\");\n return loadedCount;\n }\n\n loadOperations.push(this.loadNode(nodeId, loadProgress));\n }\n\n for (const structure of this.structures) {\n loadOperations.push(structure.flushBufferRequests());\n }\n\n await Promise.all(loadOperations);\n\n this.dispatchEvent(\"geometryend\", {\n totalLoaded: loadedCount,\n totalNodes,\n });\n\n return loadedCount;\n } catch (error) {\n this.dispatchEvent(\"geometryerror\", { error });\n throw error;\n }\n }\n\n async loadNodes() {\n console.time(\"process nodes\");\n await this.processNodes();\n console.timeEnd(\"process nodes\");\n\n console.time(\"optimize scene\");\n await this.optimizeScene();\n console.timeEnd(\"optimize scene\");\n }\n\n cleanupPartialLoad() {\n this.nodesToLoad.forEach((nodeId) => {\n const node = this.nodes.get(nodeId);\n if (node && node.loading) {\n this.unloadNode(nodeId);\n }\n });\n }\n\n createDefaultMaterial(primitiveMode = undefined) {\n if (primitiveMode === GL_CONSTANTS.POINTS) {\n return new PointsMaterial({\n color: new Color(0x808080),\n size: 0.05,\n sizeAttenuation: false,\n alphaTest: 0.5,\n transparent: true,\n vertexColors: false,\n blending: NormalBlending,\n depthWrite: false,\n depthTest: true,\n });\n } else if (\n primitiveMode === GL_CONSTANTS.LINES ||\n primitiveMode === GL_CONSTANTS.LINE_STRIP ||\n primitiveMode === GL_CONSTANTS.LINE_LOOP\n ) {\n return new LineBasicMaterial({\n color: 0x808080,\n linewidth: 1.0,\n alphaTest: 0.1,\n depthTest: true,\n depthWrite: true,\n transparent: true,\n opacity: 1.0,\n });\n } else {\n return new MeshPhongMaterial({\n color: 0x808080,\n specular: 0x222222,\n shininess: 10,\n side: DoubleSide,\n });\n }\n }\n\n async estimateNodeSize(nodeId) {\n const node = this.nodes.get(nodeId);\n if (!node) return 0;\n return await node.structure.estimateNodeSize(node.meshIndex);\n }\n\n getTotalGeometryExtent() {\n const totalExtent = new Box3();\n\n for (const node of this.nodes.values()) {\n if (!node.geometryExtents) continue;\n\n if (node.object && this.hiddenHandles.has(node.object.userData.handle)) continue;\n\n const transformedBox = node.geometryExtents.clone();\n\n if (node.group && node.group.matrix) {\n transformedBox.applyMatrix4(node.group.matrix);\n\n if (node.group.parent && node.group.parent.matrix) {\n transformedBox.applyMatrix4(node.group.parent.matrix);\n }\n }\n totalExtent.union(transformedBox);\n }\n\n return totalExtent;\n }\n\n loadCamera(structure, cameraIndex, nodeDef) {\n const cameraDef = structure.getJson().cameras[cameraIndex];\n const params = cameraDef[cameraDef.type];\n\n let camera;\n if (cameraDef.type === \"perspective\") {\n camera = new PerspectiveCamera(\n MathUtils.radToDeg(params.yfov),\n params.aspectRatio || 1,\n params.znear || 1,\n params.zfar || 2e6\n );\n } else if (cameraDef.type === \"orthographic\") {\n camera = new OrthographicCamera(\n params.xmag / -2,\n params.xmag / 2,\n params.ymag / 2,\n params.ymag / -2,\n params.znear,\n params.zfar\n );\n }\n\n if (nodeDef.matrix) {\n camera.matrix.fromArray(nodeDef.matrix);\n camera.matrix.decompose(camera.position, camera.quaternion, camera.scale);\n } else {\n if (nodeDef.translation) {\n camera.position.fromArray(nodeDef.translation);\n }\n if (nodeDef.rotation) {\n camera.quaternion.fromArray(nodeDef.rotation);\n }\n if (nodeDef.scale) {\n camera.scale.fromArray(nodeDef.scale);\n }\n }\n\n return camera;\n }\n\n clearNodesToLoad() {\n this.nodesToLoad = [];\n }\n\n removeOptimization() {\n this.originalObjects.forEach((obj) => (obj.visible = true));\n\n const disposeMerged = (obj) => {\n if (obj.parent) {\n obj.parent.remove(obj);\n }\n if (obj.geometry) {\n obj.geometry.dispose();\n }\n };\n\n if (this.structureGroups) {\n for (const group of this.structureGroups.values()) {\n group.meshes.forEach(disposeMerged);\n group.lines.forEach(disposeMerged);\n group.lineSegments.forEach(disposeMerged);\n group.meshes.clear();\n group.lines.clear();\n group.lineSegments.clear();\n }\n }\n this.optimizedOriginalMap.clear();\n this.mergedMesh.clear();\n this.mergedLines.clear();\n this.mergedLineSegments.clear();\n this.originalObjects.clear();\n this.originalObjectsToSelection.clear();\n }\n\n initializeObjectVisibility() {\n if (this.maxObjectId > 0) {\n this.objectVisibility = new Float32Array(this.maxObjectId);\n for (let i = 0; i < this.maxObjectId; i++) {\n this.objectVisibility[i] = 1.0;\n }\n console.log(`Initialized object visibility array: ${this.maxObjectId} objects`);\n }\n }\n\n createVisibilityMaterial(material) {\n // Применяем шейдер напрямую к оригинальному материалу\n material.onBeforeCompile = (shader) => {\n shader.vertexShader = shader.vertexShader.replace(\n \"#include <common>\",\n `\n #include <common>\n attribute float visibility;\n varying float vVisibility;\n `\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include <common>\",\n `\n #include <common>\n varying float vVisibility;\n `\n );\n\n shader.vertexShader = shader.vertexShader.replace(\n \"void main() {\",\n `\n void main() {\n vVisibility = visibility;\n `\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"void main() {\",\n `\n void main() {\n if (vVisibility < 0.5) discard;\n `\n );\n };\n\n // Принудительная перекомпиляция материала\n material.needsUpdate = true;\n\n return material;\n }\n\n clear() {\n this.chunkQueue = [];\n\n this.structures.forEach((structure) => {\n if (structure) {\n structure.clear();\n }\n });\n this.structures = [];\n\n this.nodes.forEach((node) => {\n if (node.object) {\n if (node.object.parent) {\n node.object.parent.remove(node.object);\n }\n if (node.object.geometry) {\n node.object.geometry.dispose();\n }\n if (node.object.material) {\n if (Array.isArray(node.object.material)) {\n node.object.material.forEach((material) => material.dispose());\n } else {\n node.object.material.dispose();\n }\n }\n }\n });\n this.nodes.clear();\n\n // Clear all loaded meshes\n this.loadedMeshes.forEach((mesh) => {\n if (mesh.geometry) mesh.geometry.dispose();\n if (mesh.material) {\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((material) => material.dispose());\n } else {\n mesh.material.dispose();\n }\n }\n });\n this.loadedMeshes.clear();\n\n this.structureRoots.forEach((rootGroup) => {\n if (rootGroup) {\n rootGroup.traverse((child) => {\n if (child.geometry) child.geometry.dispose();\n if (child.material) {\n if (Array.isArray(child.material)) {\n child.material.forEach((material) => material.dispose());\n } else {\n child.material.dispose();\n }\n }\n });\n if (rootGroup.parent) {\n rootGroup.parent.remove(rootGroup);\n }\n }\n });\n this.structureRoots.clear();\n\n this.mergedMesh.forEach((mesh) => {\n if (mesh.geometry) mesh.geometry.dispose();\n if (mesh.material) {\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((material) => material.dispose());\n } else {\n mesh.material.dispose();\n }\n }\n if (mesh.parent) mesh.parent.remove(mesh);\n });\n this.mergedMesh.clear();\n\n this.mergedLines.forEach((line) => {\n if (line.geometry) line.geometry.dispose();\n if (line.material) line.material.dispose();\n if (line.parent) line.parent.remove(line);\n });\n this.mergedLines.clear();\n\n this.mergedLineSegments.forEach((lineSegment) => {\n if (lineSegment.geometry) lineSegment.geometry.dispose();\n if (lineSegment.material) lineSegment.material.dispose();\n if (lineSegment.parent) lineSegment.parent.remove(lineSegment);\n });\n this.mergedLineSegments.clear();\n\n this.mergedPoints.forEach((points) => {\n if (points.geometry) points.geometry.dispose();\n if (points.material) points.material.dispose();\n if (points.parent) points.parent.remove(points);\n });\n this.mergedPoints.clear();\n\n this.geometryCache.clear();\n this.materialCache.clear();\n this.textureCache.clear();\n this.loadedMaterials.clear();\n\n this.nodesToLoad = [];\n this.handleToObjects.clear();\n this.originalObjects.clear();\n this.originalObjectsToSelection.clear();\n this.optimizedOriginalMap.clear();\n this.handleToOptimizedObjects.clear();\n this.hiddenHandles.clear();\n this.newOptimizedObjects.clear();\n this.oldOptimizeObjects.clear();\n this.isolatedObjects = [];\n\n this.totalLoadedObjects = 0;\n this.lastUpdateTime = 0;\n this.currentMemoryUsage = 0;\n this.loadedGeometrySize = 0;\n\n this.abortController = new AbortController();\n this.updateMemoryIndicator();\n\n this.objectIdToIndex.clear();\n this.maxObjectId = 0;\n this.objectVisibility = new Float32Array();\n }\n\n setStructureTransform(structureId, matrix) {\n const rootGroup = this.structureRoots.get(structureId);\n if (rootGroup) {\n rootGroup.matrix.copy(matrix);\n rootGroup.matrix.decompose(rootGroup.position, rootGroup.quaternion, rootGroup.scale);\n return true;\n }\n return false;\n }\n\n getStructureRootGroup(structureId) {\n return this.structureRoots.get(structureId);\n }\n\n addEventListener(event, handler) {\n if (this.eventHandlers[event]) {\n this.eventHandlers[event].push(handler);\n }\n }\n\n removeEventListener(event, handler) {\n if (this.eventHandlers[event]) {\n this.eventHandlers[event] = this.eventHandlers[event].filter((h) => h !== handler);\n }\n }\n\n dispatchEvent(event, data) {\n if (this.eventHandlers[event]) {\n this.eventHandlers[event].forEach((handler) => handler(data));\n }\n }\n\n registerObjectWithHandle(object, handle) {\n if (!handle) return;\n\n const fullHandle = object.userData.handle;\n if (!this.handleToObjects.has(fullHandle)) {\n this.handleToObjects.set(fullHandle, new Set());\n }\n this.handleToObjects.get(fullHandle).add(object);\n\n object.userData.structureId = object.userData.handle.split(\"_\")[0];\n }\n\n getObjectsByHandle(handle) {\n if (!handle) return [];\n return Array.from(this.handleToObjects.get(handle) || []);\n }\n\n getHandlesByObjects(objects) {\n if (!objects.length) return [];\n const handles = new Set();\n objects.forEach((obj) => {\n if (this.originalObjects.has(obj)) handles.add(obj.userData.handle);\n });\n return Array.from(handles);\n }\n\n getMaterialId(material, index) {\n const props = {\n type: material.type,\n color: material.color?.getHex(),\n map: material.map?.uuid,\n transparent: material.transparent,\n opacity: material.opacity,\n side: material.side,\n index: index ? 1 : 0,\n };\n return JSON.stringify(props);\n }\n\n addToMaterialGroup(object, groupsMap, optimizeGroupList) {\n const VERTEX_LIMIT = 100_000;\n const INDEX_LIMIT = 100_000;\n\n const objectGeometryVertexCount = object.geometry.attributes.position.count;\n const objectGeometryIndexCount = object.geometry.index ? object.geometry.index.count : 0;\n\n const material = object.material;\n let materialId = this.getMaterialId(material, object.geometry.index !== null);\n\n let group;\n if (!groupsMap.has(materialId)) {\n group = {\n material,\n objects: [object],\n totalVertices: objectGeometryVertexCount,\n totalIndices: objectGeometryIndexCount,\n };\n groupsMap.set(materialId, group);\n optimizeGroupList.push(group);\n } else {\n group = groupsMap.get(materialId);\n if (\n group.totalVertices + objectGeometryVertexCount > VERTEX_LIMIT ||\n group.totalIndices + objectGeometryIndexCount > INDEX_LIMIT\n ) {\n const newGroup = {\n material,\n objects: [object],\n totalVertices: objectGeometryVertexCount,\n totalIndices: objectGeometryIndexCount,\n };\n materialId = this.getMaterialId(material, object.geometry.index !== null);\n groupsMap.set(materialId, newGroup);\n optimizeGroupList.push(newGroup);\n } else {\n group.objects.push(object);\n group.totalVertices += objectGeometryVertexCount;\n group.totalIndices += objectGeometryIndexCount;\n }\n }\n\n this.originalObjects.add(object);\n }\n\n optimizeScene() {\n this.originalObjects.clear();\n this.originalObjectsToSelection.clear();\n const structureGroups = new Map();\n\n this.scene.traverse((object) => {\n if (object.userData.structureId) {\n const structureId = object.userData.structureId;\n if (!structureGroups.has(structureId)) {\n structureGroups.set(structureId, {\n mapMeshes: new Map(),\n mapLines: new Map(),\n mapLineSegments: new Map(),\n mapPoints: new Map(),\n\n meshes: [],\n lines: [],\n lineSegments: [],\n points: [],\n rootGroup: this.structureRoots.get(structureId),\n });\n }\n\n const group = structureGroups.get(structureId);\n\n if (object instanceof Mesh) {\n this.addToMaterialGroup(object, group.mapMeshes, group.meshes);\n } else if (object instanceof LineSegments) {\n this.addToMaterialGroup(object, group.mapLineSegments, group.lineSegments);\n } else if (object instanceof Line) {\n this.addToMaterialGroup(object, group.mapLines, group.lines);\n } else if (object instanceof Points) {\n this.addToMaterialGroup(object, group.mapPoints, group.points);\n }\n }\n });\n\n for (const group of structureGroups.values()) {\n group.mapMeshes.clear();\n group.mapLines.clear();\n group.mapLineSegments.clear();\n group.mapPoints.clear();\n\n this.mergeMeshGroups(group.meshes, group.rootGroup);\n this.mergeLineGroups(group.lines, group.rootGroup);\n this.mergeLineSegmentGroups(group.lineSegments, group.rootGroup);\n this.mergePointsGroups(group.points, group.rootGroup);\n }\n\n this.originalObjects.forEach((obj) => {\n obj.visible = false;\n if (!(obj instanceof Points) && !obj.userData.isEdge) {\n this.originalObjectsToSelection.add(obj);\n }\n });\n this.initializeObjectVisibility();\n\n console.log(`Optimization complete. Total objects: ${this.maxObjectId}`);\n\n this.dispatchEvent(\"update\");\n }\n\n mergeMeshGroups(materialGroups, rootGroup) {\n for (const group of materialGroups) {\n if (!group.material) {\n console.warn(\"Skipping mesh group with null material\");\n continue;\n }\n\n try {\n const geometries = [];\n const handles = new Set();\n const optimizedObjects = [];\n const objectMapping = new Map();\n let currentVertexOffset = 0;\n\n for (const mesh of group.objects) {\n const geometry = mesh.geometry.clone();\n mesh.updateWorldMatrix(true, false);\n geometry.applyMatrix4(mesh.matrixWorld);\n\n const handle = mesh.userData.handle;\n if (!this.objectIdToIndex.has(handle)) {\n this.objectIdToIndex.set(handle, this.maxObjectId++);\n }\n const objectId = this.objectIdToIndex.get(handle);\n\n const vertexCount = geometry.attributes.position.count;\n const objectIds = new Float32Array(vertexCount);\n for (let i = 0; i < vertexCount; i++) {\n objectIds[i] = objectId;\n }\n geometry.setAttribute(\"objectId\", new BufferAttribute(objectIds, 1));\n\n objectMapping.set(mesh, {\n geometry,\n startVertexIndex: currentVertexOffset,\n vertexCount: geometry.attributes.position.count,\n });\n\n currentVertexOffset += geometry.attributes.position.count;\n geometries.push(geometry);\n\n optimizedObjects.push(mesh);\n handles.add(mesh.userData.handle);\n }\n\n const mergedObjects = [];\n\n if (geometries.length > 0) {\n const mergedGeometry = mergeGeometries(geometries);\n\n // Create visibility attribute\n const totalVertices = mergedGeometry.attributes.position.count;\n const visibilityArray = new Float32Array(totalVertices);\n\n // Initialize all vertices as visible (1.0)\n for (let i = 0; i < totalVertices; i++) {\n visibilityArray[i] = 1.0;\n }\n\n // Add visibility attribute to geometry\n mergedGeometry.setAttribute(\"visibility\", new BufferAttribute(visibilityArray, 1));\n\n if (this.useVAO) {\n this.createVAO(mergedGeometry);\n }\n\n // Create visibility material\n const visibilityMaterial = this.createVisibilityMaterial(group.material);\n\n const mergedMesh = new Mesh(mergedGeometry, visibilityMaterial);\n rootGroup.add(mergedMesh);\n\n this.mergedMesh.add(mergedMesh);\n this.optimizedOriginalMap.set(mergedMesh, optimizedObjects);\n\n // Store object mappings with visibility tracking\n this.mergedObjectMap.set(mergedMesh.uuid, {\n objectMapping,\n visibilityArray,\n totalVertices,\n });\n\n this.mergedGeometryVisibility.set(mergedMesh, visibilityArray);\n\n mergedObjects.push(mergedMesh);\n\n geometries.forEach((geometry) => {\n geometry.dispose();\n });\n }\n\n handles.forEach((handle) => {\n if (this.handleToOptimizedObjects.has(handle)) {\n const existingObjects = this.handleToOptimizedObjects.get(handle);\n existingObjects.push(...mergedObjects);\n this.handleToOptimizedObjects.set(handle, existingObjects);\n } else {\n this.handleToOptimizedObjects.set(handle, mergedObjects);\n }\n });\n } catch (error) {\n console.error(\"Failed to merge meshes for material:\", error);\n group.objects.forEach((mesh) => {\n mesh.visible = true;\n });\n }\n }\n }\n\n mergeLineGroups(materialGroups, rootGroup) {\n for (const group of materialGroups) {\n if (group.objects.length === 0) continue;\n\n if (!group.material) {\n console.warn(\"Skipping line group with null material\");\n continue;\n }\n\n const handles = new Set();\n let totalVertices = 0;\n const objectMapping = new Map();\n let currentVertexOffset = 0;\n\n group.objects.map((line) => {\n handles.add(line.userData.handle);\n totalVertices += line.geometry.attributes.position.count;\n });\n\n const positions = new Float32Array(totalVertices * 3);\n let posOffset = 0;\n\n const indices = [];\n let vertexOffset = 0;\n\n group.objects.forEach((line) => {\n const geometry = line.geometry;\n const positionAttr = geometry.attributes.position;\n const vertexCount = positionAttr.count;\n\n const handle = line.userData.handle;\n if (!this.objectIdToIndex.has(handle)) {\n this.objectIdToIndex.set(handle, this.maxObjectId++);\n }\n // const objectId = this.objectIdToIndex.get(handle);\n\n objectMapping.set(line, {\n startVertexIndex: currentVertexOffset,\n vertexCount,\n });\n currentVertexOffset += vertexCount;\n\n line.updateWorldMatrix(true, false);\n const matrix = line.matrixWorld;\n const vector = new Vector3();\n\n for (let i = 0; i < vertexCount; i++) {\n vector.fromBufferAttribute(positionAttr, i);\n vector.applyMatrix4(matrix);\n positions[posOffset++] = vector.x;\n positions[posOffset++] = vector.y;\n positions[posOffset++] = vector.z;\n }\n\n for (let i = 0; i < vertexCount - 1; i++) {\n indices.push(vertexOffset + i, vertexOffset + i + 1);\n }\n\n vertexOffset += vertexCount;\n });\n\n const geometry = new BufferGeometry();\n geometry.setAttribute(\"position\", new BufferAttribute(positions, 3));\n geometry.setIndex(indices);\n geometry.computeBoundingSphere();\n geometry.computeBoundingBox();\n\n const objectIds = new Float32Array(totalVertices);\n let vertexIndex = 0;\n group.objects.forEach((line) => {\n const vertexCount = line.geometry.attributes.position.count;\n const handle = line.userData.handle;\n const objectId = this.objectIdToIndex.get(handle);\n\n for (let i = 0; i < vertexCount; i++) {\n objectIds[vertexIndex++] = objectId;\n }\n });\n geometry.setAttribute(\"objectId\", new BufferAttribute(objectIds, 1));\n\n const visibilityArray = new Float32Array(totalVertices);\n for (let i = 0; i < totalVertices; i++) {\n visibilityArray[i] = 1.0;\n }\n geometry.setAttribute(\"visibility\", new BufferAttribute(visibilityArray, 1));\n\n const visibilityMaterial = this.createVisibilityMaterial(group.material);\n\n const mergedLine = new LineSegments(geometry, visibilityMaterial);\n const mergedObjects = [mergedLine];\n if (this.useVAO) {\n this.createVAO(mergedLine);\n }\n rootGroup.add(mergedLine);\n this.mergedLines.add(mergedLine);\n this.optimizedOriginalMap.set(mergedLine, group.objects);\n\n this.mergedObjectMap.set(mergedLine.uuid, {\n objectMapping,\n visibilityArray,\n totalVertices,\n });\n\n this.mergedGeometryVisibility.set(mergedLine, visibilityArray);\n\n handles.forEach((handle) => {\n if (this.handleToOptimizedObjects.has(handle)) {\n const existingObjects = this.handleToOptimizedObjects.get(handle);\n existingObjects.push(...mergedObjects);\n this.handleToOptimizedObjects.set(handle, existingObjects);\n } else {\n this.handleToOptimizedObjects.set(handle, mergedObjects);\n }\n });\n }\n }\n\n mergeLineSegmentGroups(materialGroups, rootGroup) {\n for (const group of materialGroups) {\n if (!group.material) {\n console.warn(\"Skipping line segment group with null material\");\n continue;\n }\n\n try {\n const geometries = [];\n const optimizedObjects = [];\n const handles = new Set();\n const objectMapping = new Map();\n let currentVertexOffset = 0;\n\n for (const line of group.objects) {\n const geometry = line.geometry.clone();\n line.updateWorldMatrix(true, false);\n geometry.applyMatrix4(line.matrixWorld);\n\n const handle = line.userData.handle;\n if (!this.objectIdToIndex.has(handle)) {\n this.objectIdToIndex.set(handle, this.maxObjectId++);\n }\n const objectId = this.objectIdToIndex.get(handle);\n const vertexCount = geometry.attributes.position.count;\n const objectIds = new Float32Array(vertexCount);\n for (let i = 0; i < vertexCount; i++) {\n objectIds[i] = objectId;\n }\n geometry.setAttribute(\"objectId\", new BufferAttribute(objectIds, 1));\n\n objectMapping.set(line, {\n geometry,\n startVertexIndex: currentVertexOffset,\n vertexCount: geometry.attributes.position.count,\n });\n\n currentVertexOffset += geometry.attributes.position.count;\n geometries.push(geometry);\n optimizedObjects.push(line);\n handles.add(line.userData.handle);\n }\n\n const mergedObjects = [];\n\n if (geometries.length > 0) {\n const mergedGeometry = mergeGeometries(geometries, false);\n\n const totalVertices = mergedGeometry.attributes.position.count;\n const visibilityArray = new Float32Array(totalVertices);\n\n for (let i = 0; i < totalVertices; i++) {\n visibilityArray[i] = 1.0;\n }\n\n mergedGeometry.setAttribute(\"visibility\", new BufferAttribute(visibilityArray, 1));\n\n const visibilityMaterial = this.createVisibilityMaterial(group.material);\n\n const mergedLine = new LineSegments(mergedGeometry, visibilityMaterial);\n\n if (this.useVAO) {\n this.createVAO(mergedLine);\n }\n\n rootGroup.add(mergedLine);\n this.mergedLineSegments.add(mergedLine);\n this.optimizedOriginalMap.set(mergedLine, optimizedObjects);\n\n this.mergedObjectMap.set(mergedLine.uuid, {\n objectMapping,\n visibilityArray,\n totalVertices,\n });\n\n this.mergedGeometryVisibility.set(mergedLine, visibilityArray);\n\n mergedObjects.push(mergedLine);\n\n geometries.forEach((geometry) => {\n geometry.dispose();\n });\n }\n\n handles.forEach((handle) => {\n if (this.handleToOptimizedObjects.has(handle)) {\n const existingObjects = this.handleToOptimizedObjects.get(handle);\n existingObjects.push(...mergedObjects);\n this.handleToOptimizedObjects.set(handle, existingObjects);\n } else {\n this.handleToOptimizedObjects.set(handle, mergedObjects);\n }\n });\n } catch (error) {\n console.warn(\"Failed to merge line segments for material:\", error);\n group.objects.forEach((line) => {\n line.visible = true;\n });\n }\n }\n }\n\n mergePointsGroups(materialGroups, rootGroup) {\n for (const group of materialGroups) {\n if (!group.material) {\n console.warn(\"Skipping points group with null material\");\n continue;\n }\n\n try {\n const geometries = [];\n const optimizedObjects = [];\n const handles = new Set();\n\n for (const points of group.objects) {\n const geometry = points.geometry.clone();\n points.updateWorldMatrix(true, false);\n geometry.applyMatrix4(points.matrixWorld);\n geometries.push(geometry);\n optimizedObjects.push(points);\n handles.add(points.userData.handle);\n }\n\n const mergedObjects = [];\n\n if (geometries.length > 0) {\n const mergedGeometry = mergeGeometries(geometries, false);\n const mergedPoints = new Points(mergedGeometry, group.material);\n\n if (this.useVAO) {\n this.createVAO(mergedPoints);\n }\n\n rootGroup.add(mergedPoints);\n\n this.mergedPoints.add(mergedPoints);\n this.optimizedOriginalMap.set(mergedPoints, optimizedObjects);\n mergedObjects.push(mergedPoints);\n\n geometries.forEach((geometry) => {\n geometry.dispose();\n });\n }\n\n handles.forEach((handle) => {\n if (this.handleToOptimizedObjects.has(handle)) {\n const existingObjects = this.handleToOptimizedObjects.get(handle);\n existingObjects.push(...mergedObjects);\n this.handleToOptimizedObjects.set(handle, existingObjects);\n } else {\n this.handleToOptimizedObjects.set(handle, mergedObjects);\n }\n });\n } catch (error) {\n console.warn(\"Failed to merge points for material:\", error);\n group.objects.forEach((points) => {\n points.visible = true;\n });\n }\n }\n }\n\n mergeInSingleSegment(structureId, rootGroup) {\n const lineSegmentsArray = [...this.mergedLineSegments, ...this.mergedLines].filter(\n (obj) => obj.userData.structureId === structureId\n );\n\n if (lineSegmentsArray.length === 0) return;\n\n try {\n const geometriesWithIndex = [];\n const hasNormals = lineSegmentsArray.some((segment) => segment.geometry.attributes.normal !== undefined);\n\n lineSegmentsArray.forEach((segment) => {\n const clonedGeometry = segment.geometry.clone();\n segment.updateWorldMatrix(true, false);\n clonedGeometry.applyMatrix4(segment.matrixWorld);\n\n if (hasNormals && !clonedGeometry.attributes.normal) {\n clonedGeometry.computeVertexNormals();\n }\n if (!hasNormals && clonedGeometry.attributes.normal) {\n clonedGeometry.deleteAttribute(\"normal\");\n }\n\n const colorArray = new Float32Array(clonedGeometry.attributes.position.count * 3);\n for (let i = 0; i < colorArray.length; i += 3) {\n colorArray[i] = segment.material.color.r;\n colorArray[i + 1] = segment.material.color.g;\n colorArray[i + 2] = segment.material.color.b;\n }\n clonedGeometry.setAttribute(\"color\", new BufferAttribute(colorArray, 3));\n\n if (!clonedGeometry.index) {\n const indices = [];\n const posCount = clonedGeometry.attributes.position.count;\n for (let i = 0; i < posCount - 1; i += 2) {\n indices.push(i, i + 1);\n }\n clonedGeometry.setIndex(indices);\n }\n\n geometriesWithIndex.push(clonedGeometry);\n });\n\n const finalGeometry = mergeGeometries(geometriesWithIndex, false);\n const material = new LineBasicMaterial({\n vertexColors: true,\n });\n\n if (this.useVAO) {\n this.createVAO(finalGeometry);\n }\n\n const mergedLine = new LineSegments(finalGeometry, material);\n mergedLine.userData.structureId = structureId;\n rootGroup.add(mergedLine);\n this.mergedLineSegments.add(mergedLine);\n\n lineSegmentsArray.forEach((obj) => {\n if (obj.parent) {\n obj.parent.remove(obj);\n }\n obj.geometry.dispose();\n });\n } catch (error) {\n console.error(\"Failed to merge geometries:\", error);\n lineSegmentsArray.forEach((obj) => {\n obj.visible = true;\n rootGroup.add(obj);\n });\n }\n }\n\n showOriginalObjects(objects) {\n objects.forEach((obj) => {\n if (this.originalObjects.has(obj)) {\n obj.visible = true;\n }\n });\n }\n\n hideOriginalObjects(objects) {\n objects.forEach((obj) => {\n if (this.originalObjects.has(obj)) {\n obj.visible = false;\n }\n });\n }\n\n createVAO(geometry) {\n if (!this.useVAO) {\n return;\n }\n\n if (geometry.attributes?.position?.count < 1000) {\n return;\n }\n\n const gl = this.renderer.getContext();\n const vao = gl.createVertexArray();\n gl.bindVertexArray(vao);\n\n for (const name in geometry.attributes) {\n const attribute = geometry.attributes[name];\n const buffer = this.renderer.properties.get(attribute).buffer;\n\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attribute.itemSize);\n gl.vertexAttribPointer(attribute.itemSize, attribute.itemSize, gl.FLOAT, false, 0, 0);\n }\n\n if (geometry.index) {\n const indexBuffer = this.renderer.properties.get(geometry.index).buffer;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);\n }\n\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\n\n geometry.vao = vao;\n }\n\n getOriginalObjectForSelect() {\n const optimizedOriginals = [];\n\n for (const obj of this.originalObjectsToSelection) {\n if (this.hiddenHandles.has(obj.userData.handle)) {\n continue;\n }\n\n optimizedOriginals.push(obj);\n }\n\n return optimizedOriginals;\n }\n\n isolateObjects(handles) {\n if (this.hiddenHandles.size !== 0) {\n this.hiddenHandles.clear();\n this.syncHiddenObjects();\n }\n\n for (const handle of this.handleToOptimizedObjects.keys()) {\n if (!handles.has(handle)) {\n this.hiddenHandles.add(handle);\n }\n }\n\n this.syncHiddenObjects();\n }\n\n showAllHiddenObjects() {\n this.hiddenHandles.clear();\n this.syncHiddenObjects();\n }\n\n hideObjects(handles) {\n handles.forEach((handle) => {\n this.hiddenHandles.add(handle);\n });\n this.syncHiddenObjects();\n }\n\n showObjects(handles) {\n handles.forEach((handle) => {\n this.hiddenHandles.delete(handle);\n });\n this.syncHiddenObjects();\n }\n\n _updateVisibilityAttribute(mergedObject) {\n if (\n mergedObject.geometry &&\n mergedObject.geometry.attributes.visibility &&\n mergedObject.geometry.attributes.objectId\n ) {\n const visibilityArray = mergedObject.geometry.attributes.visibility.array;\n const objectIdArray = mergedObject.geometry.attributes.objectId.array;\n\n for (let i = 0; i < visibilityArray.length; i++) {\n const objectId = objectIdArray[i];\n if (objectId < this.objectVisibility.length) {\n visibilityArray[i] = this.objectVisibility[objectId];\n }\n }\n\n mergedObject.geometry.attributes.visibility.needsUpdate = true;\n }\n }\n\n syncHiddenObjects() {\n if (this.mergedObjectMap.size === 0) {\n console.log(\"No merged objects to sync\");\n return;\n }\n\n if (this.objectVisibility.length > 0) {\n for (let i = 0; i < this.objectVisibility.length; i++) {\n this.objectVisibility[i] = 1.0;\n }\n\n this.hiddenHandles.forEach((handle) => {\n const index = this.objectIdToIndex.get(handle);\n if (index !== undefined && index < this.objectVisibility.length) {\n this.objectVisibility[index] = 0.0;\n }\n });\n }\n\n for (const mesh of this.mergedMesh) {\n this._updateVisibilityAttribute(mesh);\n }\n for (const line of this.mergedLines) {\n this._updateVisibilityAttribute(line);\n }\n for (const lineSegment of this.mergedLineSegments) {\n this._updateVisibilityAttribute(lineSegment);\n }\n for (const point of this.mergedPoints) {\n this._updateVisibilityAttribute(point);\n }\n }\n\n getStructureGeometryExtent(structureId) {\n const extent = new Box3();\n for (const [nodeId, node] of this.nodes.entries()) {\n if (!node.geometryExtents) continue;\n if (!nodeId.startsWith(structureId + \"_\")) continue;\n if (node.object && this.hiddenHandles && this.hiddenHandles.has(node.object.userData.handle)) continue;\n const transformedBox = node.geometryExtents.clone();\n if (node.group && node.group.matrix) {\n transformedBox.applyMatrix4(node.group.matrix);\n if (node.group.parent && node.group.parent.matrix) {\n transformedBox.applyMatrix4(node.group.parent.matrix);\n }\n }\n extent.union(transformedBox);\n }\n return extent;\n }\n\n setMaxConcurrentChunks(maxChunks) {\n if (maxChunks < 1) {\n console.warn(\"Max concurrent chunks must be at least 1\");\n return;\n }\n this.maxConcurrentChunks = maxChunks;\n }\n\n waitForChunkSlot() {\n if (this.activeChunkLoads < this.maxConcurrentChunks) {\n this.activeChunkLoads++;\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n this.chunkQueue.push(resolve);\n });\n }\n\n releaseChunkSlot() {\n this.activeChunkLoads--;\n\n if (this.chunkQueue.length > 0) {\n const nextResolve = this.chunkQueue.shift();\n this.activeChunkLoads++;\n nextResolve();\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Group } from \"three\";\nimport { ILoader, LoadParams } from \"@inweb/viewer-core\";\n\nimport { Viewer } from \"../Viewer\";\nimport { DynamicModelImpl } from \"./DynamicGltfLoader/DynamicModelImpl\";\nimport { DynamicGltfLoader } from \"./DynamicGltfLoader/DynamicGltfLoader.js\";\nimport { GltfStructure } from \"./DynamicGltfLoader/GltfStructure.js\";\n\nexport class GLTFCloudDynamicLoader implements ILoader {\n public viewer: Viewer;\n public gltfLoader: DynamicGltfLoader;\n public requestId = 0;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n }\n\n dispose() {\n if (this.gltfLoader) this.gltfLoader.clear();\n }\n\n isSupport(file: any): boolean {\n return (\n typeof file === \"object\" &&\n typeof file.database === \"string\" &&\n typeof file.downloadResource === \"function\" &&\n typeof file.downloadResourceRange === \"function\" &&\n /.gltf$/i.test(file.database)\n );\n }\n\n async load(model: any, format?: string, params?: LoadParams): Promise<this> {\n const scene = new Group();\n\n this.gltfLoader = new DynamicGltfLoader(this.viewer.camera, scene, this.viewer.renderer);\n this.gltfLoader.memoryLimit = this.viewer.options.memoryLimit;\n this.gltfLoader.setVisibleEdges(this.viewer.options.edgeModel);\n // this.gltfLoader.setMaxConcurrentChunks(this.viewer.options.maxConcurrentChunks);\n\n this.gltfLoader.addEventListener(\"databasechunk\", (data) => {\n const modelImpl = new DynamicModelImpl(scene);\n modelImpl.loader = this;\n modelImpl.viewer = this.viewer;\n modelImpl.gltfLoader = this.gltfLoader;\n modelImpl.modelId = model.id;\n\n this.viewer.scene.add(scene);\n this.viewer.models.push(modelImpl);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n this.viewer.update();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: scene, file: model.file, model });\n });\n\n this.gltfLoader.addEventListener(\"geometryprogress\", (data) => {\n const progress = data.loaded / data.total;\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file: model.file, model });\n });\n\n this.gltfLoader.addEventListener(\"geometryerror\", (data) => {\n this.viewer.emitEvent({ type: \"geometryerror\", data, file: model.file, model });\n });\n\n this.gltfLoader.addEventListener(\"update\", (data) => {\n this.viewer.update();\n });\n\n const loadController = {\n loadJson: async () => {\n const progress = (progress: number) => {\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file: model });\n };\n\n const arrayBuffer = await model.downloadResource(\n model.database,\n progress,\n this.gltfLoader.getAbortController().signal\n );\n\n const text = new TextDecoder().decode(arrayBuffer);\n const json = JSON.parse(text);\n\n return json;\n },\n\n loadBinaryData: (requests) => {\n const ranges = requests.map((request) => ({\n begin: request.offset,\n end: request.offset + request.length - 1,\n requestId: this.requestId++,\n }));\n\n return model.downloadResourceRange(\n model.geometry[0],\n undefined,\n ranges,\n undefined,\n this.gltfLoader.getAbortController().signal\n );\n },\n\n baseUrl: () => Promise.resolve(`${model.httpClient.serverUrl}${model.path}/`),\n };\n\n const structure = new GltfStructure(model.id, loadController);\n\n await this.gltfLoader.loadStructure(structure);\n await this.gltfLoader.loadNodes();\n\n return this;\n }\n\n cancel() {\n if (this.gltfLoader) this.gltfLoader.abortLoading();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { ILoadersRegistry, loadersRegistry } from \"@inweb/viewer-core\";\n\nimport { GLTFFileLoader } from \"./GLTFFileLoader\";\nimport { GLTFCloudDynamicLoader } from \"./GLTFCloudDynamicLoader\";\n\n/**\n * Viewer loaders registry. Use this registry to register custom loaders.\n *\n * To implement custom loader:\n *\n * 1. Define a loader class implements {@link ILoader}.\n * 2. Define a constructor with a `viewer` parameter.\n * 3. Override {@link ILoader.isSupport} and сheck if the loader can load the specified file.\n * 4. Override {@link ILoader.load} and define the logic for loading the scene from the file.\n *\n * The loader should do:\n *\n * - Load raw data from file and convert it to the `Three.js` scene.\n * - Add scene to the viewer `scene`.\n * - Create `ModelImpl` for the scene and to the viewer `models` list.\n * - Synchronize viewer options and overlay.\n * - Update the viewer.\n *\n * The loader must emit events:\n *\n * - `geometryprogress` - during loading. If progress is not supported, emit it once with a value of 100%\n * after the load is complete.\n * - `databasechunk` - when scene is loaded and ready to render.\n * 5. Override {@link ILoader.dispose} and release loader resources, if required.\n * 6. Register loader provider in the loaders registry by calling the {@link loaders.registerLoader}.\n *\n * @example Implementing a custom loader.\n *\n * ```javascript\n * import { loaders, Loader, ModelImpl, Viewer } from \"@inweb/viewer-three\";\n *\n * class MyLoader extends Loader {\n * public viewer: Viewer;\n *\n * constructor(viewer: Viewer) {\n * super();\n * this.viewer = viewer;\n * }\n *\n * override isSupport(file, format): Boolean {\n * // place custom logic here\n * return ...;\n * }\n *\n * override load(file, format, params): Promise<this> {\n *\n * // place custom loading logic here\n * const scene = ...;\n *\n * const modelImpl = new ModelImpl(scene);\n * modelImpl.loader = this;\n * modelImpl.viewer = this.viewer;\n *\n * this.viewer.scene.add(scene);\n * this.viewer.models.push(modelImpl);\n *\n * this.viewer.syncOptions();\n * this.viewer.syncOverlay();\n * this.viewer.update();\n *\n * this.viewer.emitEvent({ type: \"databasechunk\", data: scene, file });\n *\n * return Promise.resove(this);\n * };\n * }\n *\n * loaders.registerLoader(\"MyLoader\", (viewer) => new MyLoader(viewer));\n * ```\n */\nexport const loaders: ILoadersRegistry = loadersRegistry(\"threejs\");\n\n// build-in loaders\n\nloaders.registerLoader(\"gltf-file\", (viewer: any) => new GLTFFileLoader(viewer));\nloaders.registerLoader(\"gltf-cloud\", (viewer: any) => new GLTFCloudDynamicLoader(viewer));\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { AdditiveBlending, Color, HalfFloatType, ShaderMaterial, UniformsUtils, WebGLRenderTarget } from \"three\";\nimport { Pass, FullScreenQuad } from \"three/examples/jsm/postprocessing/Pass.js\";\nimport { CopyShader } from \"three/examples/jsm/shaders/CopyShader.js\";\n\nexport class SSAARenderPass extends Pass {\n constructor(scenes, camera, clearColor = 0x000000, clearAlpha = 0) {\n super();\n this.scenes = Array.isArray(scenes) ? scenes : [scenes];\n this.camera = camera;\n this.sampleLevel = 2;\n this.unbiased = true;\n this.stencilBuffer = false;\n this.clearColor = clearColor;\n this.clearAlpha = clearAlpha;\n\n this._sampleRenderTarget = null;\n this._oldClearColor = new Color();\n this._copyUniforms = UniformsUtils.clone(CopyShader.uniforms);\n\n this._copyMaterial = new ShaderMaterial({\n uniforms: this._copyUniforms,\n vertexShader: CopyShader.vertexShader,\n fragmentShader: CopyShader.fragmentShader,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n premultipliedAlpha: true,\n blending: AdditiveBlending,\n });\n\n this._fsQuad = new FullScreenQuad(this._copyMaterial);\n }\n\n dispose() {\n if (this._sampleRenderTarget) {\n this._sampleRenderTarget.dispose();\n this._sampleRenderTarget = null;\n }\n\n this._copyMaterial.dispose();\n\n this._fsQuad.dispose();\n }\n\n setSize(width, height) {\n if (this._sampleRenderTarget) this._sampleRenderTarget.setSize(width, height);\n }\n\n render(renderer, writeBuffer, readBuffer, deltaTime, maskActive) {\n if (!this._sampleRenderTarget) {\n this._sampleRenderTarget = new WebGLRenderTarget(readBuffer.width, readBuffer.height, {\n type: HalfFloatType,\n stencilBuffer: this.stencilBuffer,\n });\n this._sampleRenderTarget.texture.name = \"SSAAMultiRenderPass.sample\";\n }\n\n const jitterOffsets = _JitterVectors[Math.max(0, Math.min(this.sampleLevel, 5))];\n\n const autoClear = renderer.autoClear;\n renderer.autoClear = false;\n\n renderer.getClearColor(this._oldClearColor);\n const oldClearAlpha = renderer.getClearAlpha();\n\n const baseSampleWeight = 1.0 / jitterOffsets.length;\n const roundingRange = 1 / 32;\n this._copyUniforms[\"tDiffuse\"].value = this._sampleRenderTarget.texture;\n\n const viewOffset = {\n fullWidth: readBuffer.width,\n fullHeight: readBuffer.height,\n offsetX: 0,\n offsetY: 0,\n width: readBuffer.width,\n height: readBuffer.height,\n };\n\n const originalViewOffset = Object.assign({}, this.camera.view);\n\n if (originalViewOffset.enabled) Object.assign(viewOffset, originalViewOffset);\n\n for (let i = 0; i < jitterOffsets.length; i++) {\n const jitterOffset = jitterOffsets[i];\n\n if (this.camera.setViewOffset) {\n this.camera.setViewOffset(\n viewOffset.fullWidth,\n viewOffset.fullHeight,\n\n viewOffset.offsetX + jitterOffset[0] * 0.0625,\n viewOffset.offsetY + jitterOffset[1] * 0.0625, // 0.0625 = 1 / 16\n\n viewOffset.width,\n viewOffset.height\n );\n }\n\n let sampleWeight = baseSampleWeight;\n\n if (this.unbiased) {\n const uniformCenteredDistribution = -0.5 + (i + 0.5) / jitterOffsets.length;\n sampleWeight += roundingRange * uniformCenteredDistribution;\n }\n\n this._copyUniforms[\"opacity\"].value = sampleWeight;\n renderer.setClearColor(this.clearColor, this.clearAlpha);\n renderer.setRenderTarget(this._sampleRenderTarget);\n renderer.clear();\n\n this.scenes.forEach((scene) => renderer.render(scene, this.camera));\n\n renderer.setRenderTarget(this.renderToScreen ? null : writeBuffer);\n\n if (i === 0) {\n renderer.setClearColor(0x000000, 0.0);\n renderer.clear();\n }\n\n this._fsQuad.render(renderer);\n }\n\n if (this.camera.setViewOffset && originalViewOffset.enabled) {\n this.camera.setViewOffset(\n originalViewOffset.fullWidth,\n originalViewOffset.fullHeight,\n\n originalViewOffset.offsetX,\n originalViewOffset.offsetY,\n\n originalViewOffset.width,\n originalViewOffset.height\n );\n } else if (this.camera.clearViewOffset) {\n this.camera.clearViewOffset();\n }\n\n renderer.autoClear = autoClear;\n renderer.setClearColor(this._oldClearColor, oldClearAlpha);\n }\n}\n\n// These jitter vectors are specified in integers because it is easier.\n// I am assuming a [-8,8) integer grid, but it needs to be mapped onto [-0.5,0.5)\n// before being used, thus these integers need to be scaled by 1/16.\n//\n// Sample patterns reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476218%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396\nconst _JitterVectors = [\n [[0, 0]],\n [\n [4, 4],\n [-4, -4],\n ],\n [\n [-2, -6],\n [6, -2],\n [-6, 2],\n [2, 6],\n ],\n [\n [1, -3],\n [-1, 3],\n [5, 1],\n [-3, -5],\n [-5, 5],\n [-7, -1],\n [3, 7],\n [7, -7],\n ],\n [\n [1, 1],\n [-1, -3],\n [-3, 2],\n [4, -1],\n [-5, -2],\n [2, 5],\n [5, 3],\n [3, -5],\n [-2, 6],\n [0, -7],\n [-4, -6],\n [-6, 4],\n [-8, 0],\n [7, -4],\n [6, 7],\n [-7, -8],\n ],\n [\n [-4, -7],\n [-7, -5],\n [-3, -5],\n [-5, -4],\n [-1, -4],\n [-2, -2],\n [-6, -1],\n [-4, 0],\n [-7, 1],\n [-1, 2],\n [-6, 3],\n [-3, 3],\n [-7, 6],\n [-3, 6],\n [-5, 7],\n [-1, 7],\n [5, -7],\n [1, -6],\n [6, -5],\n [4, -4],\n [2, -3],\n [7, -2],\n [1, -1],\n [4, -1],\n [2, 1],\n [6, 2],\n [0, 4],\n [4, 4],\n [2, 5],\n [7, 5],\n [5, 6],\n [3, 7],\n ],\n];\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Scene, WebGLRenderer } from \"three\";\n\nexport class Helpers extends Scene {\n private oldAutoClear = false;\n private oldClippingPlanes = [];\n\n override onBeforeRender(renderer: WebGLRenderer): void {\n this.oldAutoClear = renderer.autoClear;\n this.oldClippingPlanes = renderer.clippingPlanes;\n\n renderer.autoClear = false;\n renderer.clippingPlanes = [];\n }\n\n override onAfterRender(renderer: WebGLRenderer): void {\n renderer.clippingPlanes = this.oldClippingPlanes;\n renderer.autoClear = this.oldAutoClear;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport {\n Box3,\n LinearSRGBColorSpace,\n // LinearToneMapping,\n Object3D,\n OrthographicCamera,\n PerspectiveCamera,\n Plane,\n Scene,\n Sphere,\n Vector2,\n Vector3,\n WebGLRenderer,\n} from \"three\";\nimport { EffectComposer } from \"three/examples/jsm/postprocessing/EffectComposer.js\";\nimport { RenderPass } from \"three/examples/jsm/postprocessing/RenderPass.js\";\nimport { FXAAPass } from \"three/examples/jsm/postprocessing/FXAAPass.js\";\nimport { SMAAPass } from \"three/examples/jsm/postprocessing/SMAAPass.js\";\nimport { SSAARenderPass } from \"./postprocessing/SSAARenderPass.js\";\nimport { OutputPass } from \"three/examples/jsm/postprocessing/OutputPass.js\";\n\nimport { EventEmitter2 } from \"@inweb/eventemitter2\";\nimport { Assembly, Client, Model, File } from \"@inweb/client\";\nimport {\n CANVAS_EVENTS,\n CanvasEventMap,\n FileSource,\n IClippingPlane,\n IComponent,\n IEntity,\n IDragger,\n ILoader,\n IOptions,\n IOrthogonalCamera,\n IPerspectiveCamera,\n IPoint,\n IViewer,\n IViewpoint,\n Options,\n OptionsEventMap,\n ViewerEventMap,\n} from \"@inweb/viewer-core\";\nimport { IMarkup, IWorldTransform, Markup } from \"@inweb/markup\";\n\nimport { draggers } from \"./draggers\";\nimport { commands } from \"./commands\";\nimport { components } from \"./components\";\nimport { loaders } from \"./loaders\";\nimport { IModelImpl } from \"./models/IModelImpl\";\nimport { Helpers } from \"./scenes/Helpers\";\n\n/**\n * 3D viewer powered by {@link https://threejs.org/ | Three.js}.\n */\nexport class Viewer\n extends EventEmitter2<ViewerEventMap & CanvasEventMap & OptionsEventMap>\n implements IViewer, IWorldTransform\n{\n public client: Client | undefined;\n protected _options: Options;\n\n private canvaseventlistener: (event: any) => void;\n\n public canvas: HTMLCanvasElement | undefined;\n public canvasEvents: string[];\n\n public scene: Scene | undefined;\n public helpers: Helpers | undefined;\n public camera: PerspectiveCamera | OrthographicCamera | undefined;\n public renderer: WebGLRenderer | undefined;\n public renderPass: RenderPass | undefined;\n public helpersPass: RenderPass | undefined;\n public fxaaPass: FXAAPass | undefined;\n public smaaPass: SMAAPass | undefined;\n public ssaaRenderPass: SSAARenderPass | undefined;\n public outputPass: OutputPass | undefined;\n public composer: EffectComposer | undefined;\n\n public loaders: ILoader[];\n public models: IModelImpl[];\n public selected: Object3D[];\n public extents: Box3;\n public target: Vector3;\n\n private _activeDragger: IDragger | null;\n private _components: IComponent[];\n\n private _renderNeeded: boolean;\n private _renderTime: DOMHighResTimeStamp;\n\n private _markup: IMarkup;\n\n /**\n * @param client - The `Client` instance that is used to load model reference files from the Open Cloud\n * Server. Do not specify `Client` if you need a standalone viewer instance to view `glTF` files from\n * the web or from local computer.\n */\n constructor(client?: Client) {\n super();\n this._options = new Options(this);\n\n this.client = client;\n\n this.canvasEvents = CANVAS_EVENTS;\n this.canvaseventlistener = (event: Event) => this.emit(event);\n\n this.loaders = [];\n this.models = [];\n this.selected = [];\n this.extents = new Box3();\n this.target = new Vector3();\n\n this._activeDragger = null;\n this._components = [];\n\n this._renderTime = 0;\n\n this.render = this.render.bind(this);\n this.update = this.update.bind(this);\n\n this._markup = new Markup();\n }\n\n get options(): IOptions {\n return this._options;\n }\n\n get draggers(): string[] {\n return [...draggers.getDraggers().keys()];\n }\n\n get components(): string[] {\n return [...components.getComponents().keys()];\n }\n\n /**\n * 2D markup core instance used to create markups.\n *\n * @readonly\n */\n get markup(): IMarkup {\n return this._markup;\n }\n\n initialize(canvas: HTMLCanvasElement, onProgress?: (event: ProgressEvent<EventTarget>) => void): Promise<this> {\n this.addEventListener(\"optionschange\", (event) => this.syncOptions(event.data));\n\n this.scene = new Scene();\n this.helpers = new Helpers();\n this.target = new Vector3(0, 0, 0);\n\n const pixelRatio = window.devicePixelRatio;\n const rect = canvas.parentElement.getBoundingClientRect();\n const width = rect.width || 1;\n const height = rect.height || 1;\n const aspect = width / height;\n\n this.camera = new PerspectiveCamera(45, aspect, 0.001, 1000);\n this.camera.up.set(0, 1, 0);\n this.camera.position.set(0, 0, 1);\n this.camera.lookAt(this.target);\n this.camera.updateProjectionMatrix();\n\n this.renderer = new WebGLRenderer({\n canvas,\n antialias: true,\n alpha: true,\n preserveDrawingBuffer: true,\n powerPreference: \"high-performance\",\n logarithmicDepthBuffer: true,\n });\n this.renderer.setPixelRatio(pixelRatio);\n this.renderer.setSize(width, height);\n // this.renderer.toneMapping = LinearToneMapping;\n this.renderer.outputColorSpace = LinearSRGBColorSpace;\n\n this.renderPass = new RenderPass(this.scene, this.camera);\n\n this.helpersPass = new RenderPass(this.helpers, this.camera);\n this.helpersPass.clear = false;\n\n this.fxaaPass = new FXAAPass();\n this.smaaPass = new SMAAPass();\n\n this.ssaaRenderPass = new SSAARenderPass([this.scene, this.helpers], this.camera);\n this.ssaaRenderPass.unbiased = true;\n\n this.outputPass = new OutputPass();\n\n this.composer = new EffectComposer(this.renderer);\n this.composer.addPass(this.renderPass);\n this.composer.addPass(this.helpersPass);\n this.composer.addPass(this.smaaPass);\n this.composer.addPass(this.fxaaPass);\n this.composer.addPass(this.ssaaRenderPass);\n this.composer.addPass(this.outputPass);\n this.composer.setSize(width, height);\n\n this.canvas = canvas;\n this.canvasEvents.forEach((x) => canvas.addEventListener(x, this.canvaseventlistener));\n\n this._markup.initialize(this.canvas, this.canvasEvents, this, this);\n\n for (const name of components.getComponents().keys()) {\n this._components.push(components.createComponent(name, this));\n }\n\n this.syncOptions();\n this.syncOverlay();\n\n this._renderTime = performance.now();\n this.render(this._renderTime);\n\n if (typeof onProgress === \"function\")\n onProgress(new ProgressEvent(\"progress\", { lengthComputable: true, loaded: 1, total: 1 }));\n\n this.emitEvent({ type: \"initializeprogress\", data: 1, loaded: 1, total: 1 });\n this.emitEvent({ type: \"initialize\" });\n\n return Promise.resolve(this);\n }\n\n dispose(): this {\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"dispose\" });\n this.removeAllListeners();\n\n this.setActiveDragger();\n\n this._components.forEach((component: IComponent) => component.dispose());\n this._components = [];\n\n this._markup.dispose();\n\n if (this.canvas) {\n this.canvasEvents.forEach((x) => this.canvas.removeEventListener(x, this.canvaseventlistener));\n this.canvas = undefined;\n }\n\n if (this.composer) this.composer.dispose();\n if (this.renderPass) this.renderPass.dispose();\n if (this.helpersPass) this.helpersPass.dispose();\n if (this.fxaaPass) this.fxaaPass.dispose();\n if (this.smaaPass) this.smaaPass.dispose();\n if (this.ssaaRenderPass) this.ssaaRenderPass.dispose();\n if (this.outputPass) this.outputPass.dispose();\n if (this.renderer) this.renderer.dispose();\n\n this.scene = undefined;\n this.helpers = undefined;\n this.camera = undefined;\n this.renderer = undefined;\n this.renderPass = undefined;\n this.helpersPass = undefined;\n this.fxaaPass = undefined;\n this.smaaPass = undefined;\n this.ssaaRenderPass = undefined;\n this.outputPass = undefined;\n this.composer = undefined;\n\n return this;\n }\n\n isInitialized(): boolean {\n return !!this.renderer;\n }\n\n setSize(width: number, height: number, updateStyle = true) {\n if (!this.renderer) return;\n\n const camera = this.camera as any;\n const aspect = width / height;\n\n if (camera.isPerspectiveCamera) {\n camera.aspect = aspect;\n camera.updateProjectionMatrix();\n }\n if (camera.isOrthographicCamera) {\n camera.left = camera.bottom * aspect;\n camera.right = camera.top * aspect;\n camera.updateProjectionMatrix();\n }\n\n this.renderer.setSize(width, height, updateStyle);\n this.composer.setSize(width, height);\n\n this.update(true);\n this.emitEvent({ type: \"resize\", width, height });\n }\n\n update(force = false): void {\n this._renderNeeded = true;\n if (force) this.render();\n this.emitEvent({ type: \"update\", data: force });\n }\n\n render(time?: DOMHighResTimeStamp, force = false): void {\n if (!this.renderer) return;\n if (!this._renderNeeded && !force) return;\n\n if (!time) time = performance.now();\n const deltaTime = (time - this._renderTime) / 1000;\n\n this._renderTime = time;\n this._renderNeeded = false;\n\n if (this.options.antialiasing === true || this.options.antialiasing === \"msaa\") {\n this.renderer.render(this.scene, this.camera);\n this.renderer.render(this.helpers, this.camera);\n } else {\n this.composer.render(deltaTime);\n }\n\n this._activeDragger?.updatePreview?.();\n\n this.emitEvent({ type: \"render\", time, deltaTime });\n }\n\n loadReferences(model: Model | File | Assembly): Promise<this> {\n // todo: load reference as text fonts\n return Promise.resolve(this);\n }\n\n /**\n * Loads a file into the viewer.\n *\n * The viewer must be {@link initialize | initialized} before opening the file. Otherwise, `open()` does\n * nothing.\n *\n * This method requires a `Client` instance to be specified to load file from the Open Cloud Server.\n * The file geometry data on the Open Cloud Server must be converted into a `gltf` format, otherwise an\n * exception will be thrown.\n *\n * For files from Open Cloud Server, the default model will be loaded. If there is no default model,\n * first availiable model will be loaded. If no models are found in the file, an exception will be\n * thrown.\n *\n * For URLs, the file extension is used to determine the file format. For a `ArrayBuffer` and `Data\n * URL`, a file format must be specified using `params.format` parameter (see below). If no appropriate\n * loader is found for the specified format, an exception will be thrown.\n *\n * If there was an active dragger before opening the file, it will be deactivated. After opening the\n * file, you must manually activate the required dragger.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryChunkEvent | geometrychunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param file - File to load. Can be one of:\n *\n * - `File`, `Assembly` or `Model` instance from the Open Cloud Server\n * - File `URL` string\n * - {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string\n * - {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object\n * - {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer}\n * object\n *\n * @param params - Loading parameters.\n * @param params.format - File format string. Required when loading a file as `ArrayBuffer` or `Data\n * URL`.\n * @param params.mode - File opening mode. Can be one of:\n *\n * - `open` - Unloads an open file and opens a new one. This is default mode.\n * - `append` - Appends a file to an already open file.\n *\n * @param params.requestHeader - The\n * {@link https://developer.mozilla.org/docs/Glossary/Request_header | request header} used in HTTP\n * request.\n * @param params.withCredentials - Whether the HTTP request uses credentials such as cookies,\n * authorization headers or TLS client certificates. See\n * {@link https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/withCredentials | XMLHttpRequest.withCredentials}.\n * @param params.path - The base path from which external resources such as binary data buffers, images\n * or textures will be loaded. If not defined, the base path of the file URL will be used.\n * @param params.externalFiles - External resource map. Each resource should be represented by a `uri`\n * and a corresponding resource URL, or\n * {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string, or\n * {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object, or\n * {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer}.\n * @param params.crossOrigin - The crossOrigin string to implement CORS for loading the external\n * resources from a different domain that allows CORS. Default is `anonymous`.\n */\n async open(\n file: FileSource,\n params: {\n format?: string;\n mode?: string;\n requestHeader?: HeadersInit;\n withCredentials?: boolean;\n path?: string;\n externalFiles?: Map<string, string | globalThis.File | ArrayBuffer>;\n crossOrigin?: string;\n } = {}\n ): Promise<this> {\n if (!this.renderer) return this;\n\n if (params.mode !== \"a\" && params.mode !== \"append\") {\n this.cancel();\n this.clear();\n }\n\n this.emitEvent({ type: \"open\", file });\n\n let model: any = file;\n if (model && typeof model.getModels === \"function\") {\n const models = await model.getModels();\n model = models.find((model: Model) => model.default) || models[0] || file;\n }\n if (!model) throw new Error(`Format not supported`);\n\n let format = params.format;\n if (!format && typeof model.type === \"string\") format = model.type.split(\".\").pop();\n if (!format && typeof file === \"string\") format = file.split(\".\").pop();\n if (!format && file instanceof globalThis.File) format = file.name.split(\".\").pop();\n\n const loader: ILoader = loaders.createLoader(this, model, format);\n if (!loader) throw new Error(`Format not supported`);\n this.loaders.push(loader);\n\n this.emitEvent({ type: \"geometrystart\", file, model });\n try {\n await this.loadReferences(model);\n await loader.load(model, format, params);\n } catch (error: any) {\n this.emitEvent({ type: \"geometryerror\", data: error, file, model });\n throw error;\n }\n this.emitEvent({ type: \"geometryend\", file, model });\n\n return this;\n }\n\n /**\n * Deprecated since `26.4`. Use {@link open | open()} instead.\n *\n * @deprecated\n */\n openGltfFile(file, externalFiles, params: any = {}): Promise<this> {\n console.warn(\n \"Viewer.openGltfFile() has been deprecated since 26.4 and will be removed in a future release, use Viewer.open() instead.\"\n );\n\n return this.open(file, { ...params, format: \"gltf\", externalFiles });\n }\n\n /**\n * Deprecated since `26.4`. Use {@link open | open()} instead.\n *\n * @deprecated\n */\n loadGltfFile(file, externalFiles, params: any = {}): Promise<this> {\n console.warn(\n \"Viewer.loadGltfFile() has been deprecated since 26.4 and will be removed in a future release, use Viewer.open() instead.\"\n );\n\n return this.open(file, { ...params, format: \"gltf\", externalFiles, mode: \"append\" });\n }\n\n cancel(): this {\n this.loaders.forEach((loader) => loader.cancel());\n\n this.emitEvent({ type: \"cancel\" });\n return this;\n }\n\n clear(): this {\n if (!this.renderer) return this;\n\n this.setActiveDragger();\n this.clearSlices();\n this.clearOverlay();\n this.clearSelected();\n\n this.loaders.forEach((loader) => loader.dispose());\n this.loaders = [];\n\n this.models.forEach((model) => model.dispose());\n this.models = [];\n\n this.scene.clear();\n this.helpers.clear();\n\n this.syncOptions();\n this.syncOverlay();\n this.update(true);\n\n this.emitEvent({ type: \"clear\" });\n\n return this;\n }\n\n syncOptions(options: IOptions = this.options): void {\n if (!this.renderer) return;\n\n this.fxaaPass.enabled = options.antialiasing === \"fxaa\";\n this.smaaPass.enabled = options.antialiasing === \"smaa\";\n this.ssaaRenderPass.enabled = options.antialiasing === \"ssaa\";\n\n this.renderPass.enabled = !this.ssaaRenderPass.enabled;\n this.helpersPass.enabled = !this.ssaaRenderPass.enabled;\n\n this.update();\n }\n\n syncOverlay(): void {\n if (!this.renderer) return;\n\n this._markup.syncOverlay();\n this.update();\n }\n\n clearOverlay(): void {\n if (!this.renderer) return;\n\n this._markup.clearOverlay();\n this.update();\n }\n\n clearSlices(): void {\n if (!this.renderer) return;\n\n this.renderer.clippingPlanes = [];\n this.update();\n }\n\n getSelected(): string[] {\n return this.executeCommand(\"getSelected\");\n }\n\n setSelected(handles?: string[]): void {\n this.executeCommand(\"setSelected\", handles);\n }\n\n clearSelected(): void {\n this.executeCommand(\"clearSelected\");\n }\n\n hideSelected(): void {\n this.executeCommand(\"hideSelected\");\n }\n\n isolateSelected(): void {\n this.executeCommand(\"isolateSelected\");\n }\n\n showAll(): void {\n this.executeCommand(\"showAll\");\n }\n\n explode(index = 0): void {\n this.executeCommand(\"explode\", index);\n }\n\n collect(): void {\n this.executeCommand(\"collect\");\n }\n\n activeDragger(): IDragger | null {\n return this._activeDragger;\n }\n\n setActiveDragger(name = \"\"): IDragger | null {\n if (!this._activeDragger || this._activeDragger.name !== name) {\n const oldDragger = this._activeDragger;\n let newDragger = null;\n\n if (this._activeDragger) {\n this._activeDragger.dispose();\n this._activeDragger = null;\n }\n if (this.isInitialized()) {\n newDragger = draggers.createDragger(name, this);\n if (newDragger) {\n this._activeDragger = newDragger;\n this._activeDragger.initialize?.();\n }\n }\n\n const canvas = this.canvas;\n if (canvas) {\n if (oldDragger) canvas.classList.remove(`oda-cursor-${oldDragger.name.toLowerCase()}`);\n if (newDragger) canvas.classList.add(`oda-cursor-${newDragger.name.toLowerCase()}`);\n }\n\n this.emitEvent({ type: \"changeactivedragger\", data: name });\n this.update();\n }\n return this._activeDragger;\n }\n\n resetActiveDragger(): void {\n const dragger = this._activeDragger;\n if (dragger) {\n this.setActiveDragger();\n this.setActiveDragger(dragger.name);\n }\n }\n\n getComponent(name: string): IComponent {\n return this._components.find((component) => component.name === name);\n }\n\n is3D(): boolean {\n return true;\n }\n\n screenToWorld(position: { x: number; y: number }): { x: number; y: number; z: number } {\n if (!this.renderer) return { x: position.x, y: position.y, z: 0 };\n\n const rect = this.canvas.getBoundingClientRect();\n const x = position.x / (rect.width / 2) - 1;\n const y = -position.y / (rect.height / 2) + 1;\n\n const point = new Vector3(x, y, -1);\n point.unproject(this.camera);\n\n return { x: point.x, y: point.y, z: point.z };\n }\n\n worldToScreen(position: { x: number; y: number; z: number }): { x: number; y: number } {\n if (!this.renderer) return { x: position.x, y: position.y };\n\n const point = new Vector3(position.x, position.y, position.z);\n point.project(this.camera);\n\n const rect = this.canvas.getBoundingClientRect();\n const x = (point.x + 1) * (rect.width / 2);\n const y = (-point.y + 1) * (rect.height / 2);\n\n return { x, y };\n }\n\n getScale(): { x: number; y: number; z: number } {\n return { x: 1, y: 1, z: 1 };\n }\n\n executeCommand(id: string, ...args: any[]): any {\n return commands.executeCommand(id, this, ...args);\n }\n\n drawViewpoint(viewpoint: IViewpoint): void {\n if (!this.renderer) return;\n\n const getVector3FromPoint3d = ({ x, y, z }): Vector3 => new Vector3(x, y, z);\n\n const setOrthogonalCamera = (orthogonal_camera: IOrthogonalCamera) => {\n if (orthogonal_camera) {\n const extentsSize = this.extents.getBoundingSphere(new Sphere()).radius * 2;\n const rendererSize = this.renderer.getSize(new Vector2());\n const aspect = rendererSize.x / rendererSize.y;\n\n const camera = new OrthographicCamera();\n camera.top = orthogonal_camera.field_height / 2;\n camera.bottom = -orthogonal_camera.field_height / 2;\n camera.left = camera.bottom * aspect;\n camera.right = camera.top * aspect;\n camera.near = 0;\n camera.far = extentsSize * 1000;\n camera.zoom = orthogonal_camera.view_to_world_scale;\n camera.updateProjectionMatrix();\n\n camera.up.copy(getVector3FromPoint3d(orthogonal_camera.up_vector));\n camera.position.copy(getVector3FromPoint3d(orthogonal_camera.view_point));\n camera.lookAt(getVector3FromPoint3d(orthogonal_camera.direction).add(camera.position));\n camera.updateMatrixWorld();\n\n this.camera = camera;\n this.renderPass.camera = camera;\n this.helpersPass.camera = camera;\n this.ssaaRenderPass.camera = camera;\n\n this.emitEvent({ type: \"changecameramode\", mode: \"orthographic\" });\n }\n };\n\n const setPerspectiveCamera = (perspective_camera: IPerspectiveCamera) => {\n if (perspective_camera) {\n const extentsSize = this.extents.getBoundingSphere(new Sphere()).radius * 2;\n const rendererSize = this.renderer.getSize(new Vector2());\n const aspect = rendererSize.x / rendererSize.y;\n\n const camera = new PerspectiveCamera();\n camera.fov = perspective_camera.field_of_view;\n camera.aspect = aspect;\n camera.near = extentsSize / 1000;\n camera.far = extentsSize * 1000;\n camera.updateProjectionMatrix();\n\n camera.up.copy(getVector3FromPoint3d(perspective_camera.up_vector));\n camera.position.copy(getVector3FromPoint3d(perspective_camera.view_point));\n camera.lookAt(getVector3FromPoint3d(perspective_camera.direction).add(camera.position));\n camera.updateMatrixWorld();\n\n this.camera = camera;\n this.renderPass.camera = camera;\n this.helpersPass.camera = camera;\n this.ssaaRenderPass.camera = camera;\n\n this.emitEvent({ type: \"changecameramode\", mode: \"perspective\" });\n }\n };\n\n const setClippingPlanes = (clipping_planes: IClippingPlane[]) => {\n clipping_planes?.forEach((clipping_plane) => {\n const plane = new Plane();\n plane.setFromNormalAndCoplanarPoint(\n getVector3FromPoint3d(clipping_plane.direction),\n getVector3FromPoint3d(clipping_plane.location)\n );\n\n this.renderer.clippingPlanes.push(plane);\n });\n };\n\n const setSelection = (selection: IEntity[]) => {\n if (selection) this.setSelected(selection.map((component) => component.handle));\n };\n\n const draggerName = this._activeDragger?.name;\n\n this.setActiveDragger();\n this.clearSlices();\n this.clearOverlay();\n\n this.clearSelected();\n this.showAll();\n this.explode();\n\n setOrthogonalCamera(viewpoint.orthogonal_camera);\n setPerspectiveCamera(viewpoint.perspective_camera);\n setClippingPlanes(viewpoint.clipping_planes);\n setSelection(viewpoint.selection);\n this._markup.setViewpoint(viewpoint);\n\n this.target = getVector3FromPoint3d(viewpoint.custom_fields?.camera_target ?? this.target);\n\n this.setActiveDragger(draggerName);\n this.emitEvent({ type: \"drawviewpoint\", data: viewpoint });\n this.update();\n }\n\n createViewpoint(): IViewpoint {\n if (!this.renderer) return {};\n\n const getPoint3dFromVector3 = ({ x, y, z }): IPoint => ({ x, y, z });\n\n const getOrthogonalCamera = (): IOrthogonalCamera => {\n if (this.camera[\"isOrthographicCamera\"])\n return {\n view_point: getPoint3dFromVector3(this.camera.position),\n direction: getPoint3dFromVector3(this.camera.getWorldDirection(new Vector3())),\n up_vector: getPoint3dFromVector3(this.camera.up),\n field_width: this.camera[\"right\"] - this.camera[\"left\"],\n field_height: this.camera[\"top\"] - this.camera[\"bottom\"],\n view_to_world_scale: this.camera.zoom,\n };\n else return undefined;\n };\n\n const getPerspectiveCamera = (): IPerspectiveCamera => {\n if (this.camera[\"isPerspectiveCamera\"])\n return {\n view_point: getPoint3dFromVector3(this.camera.position),\n direction: getPoint3dFromVector3(this.camera.getWorldDirection(new Vector3())),\n up_vector: getPoint3dFromVector3(this.camera.up),\n field_of_view: this.camera[\"fov\"],\n };\n else return undefined;\n };\n\n const getClippingPlanes = (): IClippingPlane[] => {\n const clipping_planes = [];\n this.renderer.clippingPlanes.forEach((plane: Plane) => {\n const clipping_plane = {\n location: getPoint3dFromVector3(plane.coplanarPoint(new Vector3())),\n direction: getPoint3dFromVector3(plane.normal),\n };\n clipping_planes.push(clipping_plane);\n });\n return clipping_planes;\n };\n\n const getSelection = (): IEntity[] => {\n return this.getSelected().map((handle) => ({ handle }));\n };\n\n const viewpoint: IViewpoint = { custom_fields: {} };\n\n viewpoint.orthogonal_camera = getOrthogonalCamera();\n viewpoint.perspective_camera = getPerspectiveCamera();\n viewpoint.clipping_planes = getClippingPlanes();\n viewpoint.selection = getSelection();\n viewpoint.description = new Date().toDateString();\n this._markup.getViewpoint(viewpoint);\n\n viewpoint.custom_fields.camera_target = getPoint3dFromVector3(this.target);\n\n this.emitEvent({ type: \"createviewpoint\", data: viewpoint });\n\n return viewpoint;\n }\n}\n"],"names":[],"mappings":"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;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,GAAG;AACH,EAAE;AACF,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,IAAI,CAAC,CAAC,EAAE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"}
|
|
1
|
+
{"version":3,"file":"viewer-three.module.js","sources":["../src/Viewer/helpers/PlaneHelper.ts","../src/Viewer/controls/OrbitControls.js","../src/Viewer/draggers/OrbitDragger.ts","../src/Viewer/draggers/CuttingPlaneDragger.ts","../src/Viewer/draggers/CuttingPlaneXAxis.ts","../src/Viewer/draggers/CuttingPlaneYAxis.ts","../src/Viewer/draggers/CuttingPlaneZAxis.ts","../src/Viewer/draggers/MeasureLineDragger.ts","../src/Viewer/draggers/PanDragger.ts","../src/Viewer/controls/WalkControls.ts","../src/Viewer/controls/JoyStickControls.ts","../src/Viewer/draggers/WalkDragger.ts","../src/Viewer/controls/FlyControls.ts","../src/Viewer/draggers/FlyDragger.ts","../src/Viewer/draggers/ZoomDragger.ts","../src/Viewer/draggers/index.ts","../src/Viewer/commands/ApplyModelTransform.ts","../src/Viewer/commands/ClearMarkup.ts","../src/Viewer/commands/ClearSelected.ts","../src/Viewer/commands/ClearSlices.ts","../src/Viewer/commands/CreatePreview.ts","../src/Viewer/commands/Explode.ts","../src/Viewer/commands/ZoomTo.ts","../src/Viewer/commands/SetDefaultViewPosition.ts","../src/Viewer/commands/GetDefaultViewPositions.ts","../src/Viewer/commands/GetModels.ts","../src/Viewer/commands/GetSelected.ts","../src/Viewer/commands/HideSelected.ts","../src/Viewer/commands/IsolateSelected.ts","../src/Viewer/commands/RegenerateAll.ts","../src/Viewer/commands/ResetView.ts","../src/Viewer/commands/SelectModel.ts","../src/Viewer/commands/SetActiveDragger.ts","../src/Viewer/commands/SetMarkupColor.ts","../src/Viewer/commands/SetSelected.ts","../src/Viewer/commands/ShowAll.ts","../src/Viewer/commands/ZoomToExtents.ts","../src/Viewer/commands/ZoomToObjects.ts","../src/Viewer/commands/ZoomToSelected.ts","../src/Viewer/commands/index.ts","../src/Viewer/components/BackgroundComponent.ts","../src/Viewer/components/CameraComponent.ts","../src/Viewer/components/ExtentsComponent.ts","../src/Viewer/components/LightComponent.ts","../src/Viewer/components/RenderLoopComponent.ts","../src/Viewer/components/ResizeCanvasComponent.ts","../src/Viewer/components/HighlighterUtils.ts","../src/Viewer/components/HighlighterComponent.ts","../src/Viewer/components/SelectionComponent.ts","../src/Viewer/helpers/WCSHelper.ts","../src/Viewer/components/WCSHelperComponent.ts","../src/Viewer/components/ResetComponent.ts","../src/Viewer/components/index.ts","../src/Viewer/loaders/GLTFLoadingManager.ts","../src/Viewer/models/ModelImpl.ts","../src/Viewer/loaders/GLTFFileLoader.ts","../src/Viewer/loaders/DynamicGltfLoader/DynamicModelImpl.ts","../src/Viewer/loaders/DynamicGltfLoader/GltfStructure.js","../src/Viewer/loaders/DynamicGltfLoader/DynamicGltfLoader.js","../src/Viewer/loaders/GLTFCloudDynamicLoader.ts","../src/Viewer/loaders/index.ts","../src/Viewer/postprocessing/SSAARenderPass.js","../src/Viewer/scenes/Helpers.ts","../src/Viewer/Viewer.ts"],"sourcesContent":["///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport {\n BufferGeometry,\n DoubleSide,\n Float32BufferAttribute,\n Line,\n LineBasicMaterial,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n Plane,\n Vector3,\n} from \"three\";\n\nclass PlaneHelper extends Line {\n public plane: Plane;\n public size: number;\n public offset: Vector3;\n public helper: Object3D;\n\n constructor(plane: Plane, size = 1, color = 0xffff00, offset: Vector3 = new Vector3()) {\n // const positions = [1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];\n const positions = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];\n\n const geometry = new BufferGeometry();\n geometry.setAttribute(\"position\", new Float32BufferAttribute(positions, 3));\n geometry.computeBoundingSphere();\n\n super(geometry, new LineBasicMaterial({ color, toneMapped: false }));\n\n (this as any).type = \"PlaneHelper\";\n\n this.plane = plane;\n this.size = size;\n this.offset = offset;\n\n const positions2 = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0];\n\n const geometry2 = new BufferGeometry();\n geometry2.setAttribute(\"position\", new Float32BufferAttribute(positions2, 3));\n geometry2.computeBoundingSphere();\n\n this.helper = new Mesh(\n geometry2,\n new MeshBasicMaterial({\n color,\n opacity: 0.2,\n transparent: true,\n depthWrite: false,\n toneMapped: false,\n side: DoubleSide,\n })\n );\n this.add(this.helper);\n }\n\n dispose() {\n this.geometry.dispose();\n (this.material as any).dispose();\n (this.children[0] as any).geometry.dispose();\n (this.children[0] as any).material.dispose();\n }\n\n override updateMatrixWorld(force: boolean) {\n this.position.set(0, 0, 0);\n this.lookAt(this.plane.normal);\n\n this.position.copy(this.offset);\n this.translateZ(-(this.offset.dot(this.plane.normal) + this.plane.constant));\n\n this.scale.set(0.5 * this.size, 0.5 * this.size, 1);\n\n super.updateMatrixWorld(force);\n }\n}\n\nexport { PlaneHelper };\n","import { EventDispatcher, MOUSE, Quaternion, Spherical, TOUCH, Vector2, Vector3 } from \"three\";\n\n// OrbitControls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nconst _changeEvent = { type: \"change\" };\nconst _startEvent = { type: \"start\" };\nconst _endEvent = { type: \"end\" };\n\nconst STATE = {\n NONE: -1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6,\n};\n\nclass OrbitControls extends EventDispatcher {\n constructor(object, domElement) {\n super();\n\n this.object = object;\n this.domElement = domElement;\n this.domElement.style.touchAction = \"none\"; // disable touch scroll\n\n // Set to false to disable this control\n this.enabled = true;\n\n // \"target\" sets the location of focus, where the object orbits around\n this.target = new Vector3();\n\n // How far you can dolly in and out ( PerspectiveCamera only )\n this.minDistance = 0;\n this.maxDistance = Infinity;\n\n // How far you can zoom in and out ( OrthographicCamera only )\n this.minZoom = 0;\n this.maxZoom = Infinity;\n\n // How far you can orbit vertically, upper and lower limits.\n // Range is 0 to Math.PI radians.\n this.minPolarAngle = 0; // radians\n this.maxPolarAngle = Math.PI; // radians\n\n // How far you can orbit horizontally, upper and lower limits.\n // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n this.minAzimuthAngle = -Infinity; // radians\n this.maxAzimuthAngle = Infinity; // radians\n\n // Set to true to enable damping (inertia)\n // If damping is enabled, you must call controls.update() in your animation loop\n this.enableDamping = false;\n this.dampingFactor = 0.05;\n\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n // Set to false to disable zooming\n this.enableZoom = true;\n this.zoomSpeed = 1.0;\n\n // Set to false to disable rotating\n this.enableRotate = true;\n this.rotateSpeed = 1.0;\n\n // Set to false to disable panning\n this.enablePan = true;\n this.panSpeed = 1.0;\n this.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n this.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\n // Set to true to automatically rotate around the target\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\n this.autoRotate = false;\n this.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\n\n // The four arrow keys\n this.keys = { LEFT: \"ArrowLeft\", UP: \"ArrowUp\", RIGHT: \"ArrowRight\", BOTTOM: \"ArrowDown\" };\n\n // Mouse buttons\n this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n // Touch fingers\n this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n // for reset\n this.target0 = this.target.clone();\n this.position0 = this.object.position.clone();\n this.zoom0 = this.object.zoom;\n\n // the target DOM element for key events\n this._domElementKeyEvents = null;\n\n //\n // public methods\n //\n\n this.getPolarAngle = function () {\n return spherical.phi;\n };\n\n this.getAzimuthalAngle = function () {\n return spherical.theta;\n };\n\n this.getDistance = function () {\n return this.object.position.distanceTo(this.target);\n };\n\n this.listenToKeyEvents = function (domElement) {\n domElement.addEventListener(\"keydown\", onKeyDown);\n this._domElementKeyEvents = domElement;\n };\n\n this.stopListenToKeyEvents = function () {\n this._domElementKeyEvents.removeEventListener(\"keydown\", onKeyDown);\n this._domElementKeyEvents = null;\n };\n\n this.saveState = function () {\n scope.target0.copy(scope.target);\n scope.position0.copy(scope.object.position);\n scope.zoom0 = scope.object.zoom;\n };\n\n this.reset = function () {\n scope.target.copy(scope.target0);\n scope.object.position.copy(scope.position0);\n scope.object.zoom = scope.zoom0;\n\n scope.object.updateProjectionMatrix();\n scope.dispatchEvent(_changeEvent);\n\n scope.update();\n\n scope.state = STATE.NONE;\n };\n\n // this method is exposed, but perhaps it would be better if we can make it private...\n this.update = (function () {\n const offset = new Vector3();\n\n // so camera.up is the orbit axis\n const quat = new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0));\n const quatInverse = quat.clone().invert();\n\n const lastPosition = new Vector3();\n const lastQuaternion = new Quaternion();\n const lastTargetPosition = new Vector3();\n\n const twoPI = 2 * Math.PI;\n\n return function update() {\n const position = scope.object.position;\n\n offset.copy(position).sub(scope.target);\n\n // rotate offset to \"y-axis-is-up\" space\n offset.applyQuaternion(quat);\n\n // angle from z-axis around y-axis\n spherical.setFromVector3(offset);\n\n if (scope.autoRotate && scope.state === STATE.NONE) {\n rotateLeft(getAutoRotationAngle());\n }\n\n if (scope.enableDamping) {\n spherical.theta += sphericalDelta.theta * scope.dampingFactor;\n spherical.phi += sphericalDelta.phi * scope.dampingFactor;\n } else {\n spherical.theta += sphericalDelta.theta;\n spherical.phi += sphericalDelta.phi;\n }\n\n // restrict theta to be between desired limits\n\n let min = scope.minAzimuthAngle;\n let max = scope.maxAzimuthAngle;\n\n if (isFinite(min) && isFinite(max)) {\n if (min < -Math.PI) min += twoPI;\n else if (min > Math.PI) min -= twoPI;\n\n if (max < -Math.PI) max += twoPI;\n else if (max > Math.PI) max -= twoPI;\n\n if (min <= max) {\n spherical.theta = Math.max(min, Math.min(max, spherical.theta));\n } else {\n spherical.theta =\n spherical.theta > (min + max) / 2 ? Math.max(min, spherical.theta) : Math.min(max, spherical.theta);\n }\n }\n\n // restrict phi to be between desired limits\n spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\n\n spherical.makeSafe();\n\n spherical.radius *= scope.scale;\n\n // restrict radius to be between desired limits\n spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\n\n // move target to panned location\n\n if (scope.enableDamping === true) {\n scope.target.addScaledVector(scope.panOffset, scope.dampingFactor);\n } else {\n scope.target.add(scope.panOffset);\n }\n\n offset.setFromSpherical(spherical);\n\n // rotate offset back to \"camera-up-vector-is-up\" space\n offset.applyQuaternion(quatInverse);\n\n position.copy(scope.target).add(offset);\n\n scope.object.lookAt(scope.target);\n\n if (scope.enableDamping === true) {\n sphericalDelta.theta *= 1 - scope.dampingFactor;\n sphericalDelta.phi *= 1 - scope.dampingFactor;\n\n scope.panOffset.multiplyScalar(1 - scope.dampingFactor);\n } else {\n sphericalDelta.set(0, 0, 0);\n\n scope.panOffset.set(0, 0, 0);\n }\n\n scope.scale = 1;\n\n // update condition is:\n // min(camera displacement, camera rotation in radians)^2 > EPS\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n if (\n scope.zoomChanged ||\n lastPosition.distanceToSquared(scope.object.position) > EPS ||\n 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS ||\n lastTargetPosition.distanceToSquared(scope.target) > 0\n ) {\n scope.dispatchEvent(_changeEvent);\n\n lastPosition.copy(scope.object.position);\n lastQuaternion.copy(scope.object.quaternion);\n lastTargetPosition.copy(scope.target);\n\n scope.zoomChanged = false;\n\n return true;\n }\n\n return false;\n };\n })();\n\n this.dispose = function () {\n scope.domElement.removeEventListener(\"contextmenu\", onContextMenu);\n\n scope.domElement.removeEventListener(\"pointerdown\", onPointerDown);\n scope.domElement.removeEventListener(\"pointercancel\", onPointerUp);\n scope.domElement.removeEventListener(\"wheel\", onMouseWheel);\n\n scope.domElement.removeEventListener(\"pointermove\", onPointerMove);\n scope.domElement.removeEventListener(\"pointerup\", onPointerUp);\n\n if (scope._domElementKeyEvents !== null) {\n scope._domElementKeyEvents.removeEventListener(\"keydown\", onKeyDown);\n scope._domElementKeyEvents = null;\n }\n\n //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n };\n\n //\n // internals\n //\n\n const scope = this;\n\n scope.state = STATE.NONE;\n\n const EPS = 0.000001;\n\n // current position in spherical coordinates\n const spherical = new Spherical();\n const sphericalDelta = new Spherical();\n\n scope.scale = 1;\n scope.panOffset = new Vector3();\n scope.zoomChanged = false;\n\n scope.rotateStart = new Vector2();\n scope.rotateEnd = new Vector2();\n scope.rotateDelta = new Vector2();\n\n scope.panStart = new Vector2();\n scope.panEnd = new Vector2();\n scope.panDelta = new Vector2();\n\n scope.dollyStart = new Vector2();\n scope.dollyEnd = new Vector2();\n scope.dollyDelta = new Vector2();\n scope.dollyScale = 0;\n\n scope.pointers = [];\n scope.pointerPositions = {};\n\n function getAutoRotationAngle() {\n return ((2 * Math.PI) / 60 / 60) * scope.autoRotateSpeed;\n }\n\n function getZoomScale() {\n return Math.pow(0.95, scope.zoomSpeed);\n }\n\n function rotateLeft(angle) {\n sphericalDelta.theta -= angle;\n }\n\n function rotateUp(angle) {\n sphericalDelta.phi -= angle;\n }\n\n const panLeft = (function () {\n const v = new Vector3();\n\n return function panLeft(distance, objectMatrix) {\n v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\n v.multiplyScalar(-distance);\n\n scope.panOffset.add(v);\n };\n })();\n\n const panUp = (function () {\n const v = new Vector3();\n\n return function panUp(distance, objectMatrix) {\n if (scope.screenSpacePanning === true) {\n v.setFromMatrixColumn(objectMatrix, 1);\n } else {\n v.setFromMatrixColumn(objectMatrix, 0);\n v.crossVectors(scope.object.up, v);\n }\n\n v.multiplyScalar(distance);\n\n scope.panOffset.add(v);\n };\n })();\n\n // deltaX and deltaY are in pixels; right and down are positive\n const pan = (function () {\n const offset = new Vector3();\n\n return function pan(deltaX, deltaY) {\n const element = scope.domElement;\n\n if (scope.object.isPerspectiveCamera) {\n // perspective\n const position = scope.object.position;\n offset.copy(position).sub(scope.target);\n let targetDistance = offset.length();\n\n // half of the fov is center to top of screen\n targetDistance *= Math.tan(((scope.object.fov / 2) * Math.PI) / 180.0);\n\n // we use only clientHeight here so aspect ratio does not distort speed\n panLeft((2 * deltaX * targetDistance) / element.clientHeight, scope.object.matrix);\n panUp((2 * deltaY * targetDistance) / element.clientHeight, scope.object.matrix);\n } else if (scope.object.isOrthographicCamera) {\n // orthographic\n panLeft(\n (deltaX * (scope.object.right - scope.object.left)) / scope.object.zoom / element.clientWidth,\n scope.object.matrix\n );\n panUp(\n (deltaY * (scope.object.top - scope.object.bottom)) / scope.object.zoom / element.clientHeight,\n scope.object.matrix\n );\n } else {\n // camera neither orthographic nor perspective\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\n scope.enablePan = false;\n }\n };\n })();\n\n function dollyOut(dollyScale) {\n if (scope.object.isPerspectiveCamera) {\n scope.scale /= dollyScale;\n } else if (scope.object.isOrthographicCamera) {\n scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\n scope.object.updateProjectionMatrix();\n scope.zoomChanged = true;\n } else {\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n scope.enableZoom = false;\n }\n }\n\n function dollyIn(dollyScale) {\n if (scope.object.isPerspectiveCamera) {\n scope.scale *= dollyScale;\n } else if (scope.object.isOrthographicCamera) {\n scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\n scope.object.updateProjectionMatrix();\n scope.zoomChanged = true;\n } else {\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n scope.enableZoom = false;\n }\n }\n\n //\n // event callbacks - update the object state\n //\n\n function handleMouseDownRotate(event) {\n scope.rotateStart.set(event.clientX, event.clientY);\n }\n\n function handleMouseDownDolly(event) {\n scope.dollyStart.set(event.clientX, event.clientY);\n }\n\n function handleMouseDownPan(event) {\n scope.panStart.set(event.clientX, event.clientY);\n }\n\n function handleMouseMoveRotate(event) {\n scope.rotateEnd.set(event.clientX, event.clientY);\n\n scope.rotateDelta.subVectors(scope.rotateEnd, scope.rotateStart).multiplyScalar(scope.rotateSpeed);\n\n const element = scope.domElement;\n\n rotateLeft((2 * Math.PI * scope.rotateDelta.x) / element.clientHeight); // yes, height\n\n rotateUp((2 * Math.PI * scope.rotateDelta.y) / element.clientHeight);\n\n scope.rotateStart.copy(scope.rotateEnd);\n\n scope.update();\n }\n\n function handleMouseMoveDolly(event) {\n scope.dollyEnd.set(event.clientX, event.clientY);\n\n scope.dollyDelta.subVectors(scope.dollyEnd, scope.dollyStart);\n\n if (scope.dollyDelta.y < 0) {\n scope.dollyScale = 1 / getZoomScale();\n dollyOut(getZoomScale());\n } else if (scope.dollyDelta.y > 0) {\n scope.dollyScale = getZoomScale();\n dollyIn(getZoomScale());\n }\n\n scope.dollyStart.copy(scope.dollyEnd);\n\n scope.update();\n }\n\n function handleMouseMovePan(event) {\n scope.panEnd.set(event.clientX, event.clientY);\n\n scope.panDelta.subVectors(scope.panEnd, scope.panStart).multiplyScalar(scope.panSpeed);\n\n pan(scope.panDelta.x, scope.panDelta.y);\n\n scope.panStart.copy(scope.panEnd);\n\n scope.update();\n }\n\n function handleMouseWheel(event) {\n scope.dollyEnd.set(scope.domElement.clientWidth / 2, scope.domElement.clientHeight / 2);\n\n scope.dollyDelta.set(event.deltaX, event.deltaY);\n\n if (event.deltaY < 0) {\n scope.dollyScale = 1 / getZoomScale();\n dollyIn(getZoomScale());\n } else if (event.deltaY > 0) {\n scope.dollyScale = getZoomScale();\n dollyOut(getZoomScale());\n }\n\n scope.dollyStart.copy(scope.dollyEnd);\n\n scope.update();\n\n if (event.deltaY !== 0) {\n scope.state = STATE.DOLLY;\n scope.dispatchEvent(_changeEvent);\n scope.state = STATE.NONE;\n }\n }\n\n function handleKeyDown(event) {\n let needsUpdate = false;\n\n switch (event.code) {\n case scope.keys.UP:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateUp((2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(0, scope.keyPanSpeed);\n }\n\n needsUpdate = true;\n break;\n\n case scope.keys.BOTTOM:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateUp((-2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(0, -scope.keyPanSpeed);\n }\n\n needsUpdate = true;\n break;\n\n case scope.keys.LEFT:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateLeft((2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(scope.keyPanSpeed, 0);\n }\n\n needsUpdate = true;\n break;\n\n case scope.keys.RIGHT:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateLeft((-2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(-scope.keyPanSpeed, 0);\n }\n\n needsUpdate = true;\n break;\n }\n\n if (needsUpdate) {\n // prevent the browser from scrolling on cursor keys\n event.preventDefault();\n\n scope.update();\n }\n }\n\n function handleTouchStartRotate() {\n if (scope.pointers.length === 1) {\n scope.rotateStart.set(scope.pointers[0].pageX, scope.pointers[0].pageY);\n } else {\n const x = 0.5 * (scope.pointers[0].pageX + scope.pointers[1].pageX);\n const y = 0.5 * (scope.pointers[0].pageY + scope.pointers[1].pageY);\n\n scope.rotateStart.set(x, y);\n }\n }\n\n function handleTouchStartPan() {\n if (scope.pointers.length === 1) {\n scope.panStart.set(scope.pointers[0].pageX, scope.pointers[0].pageY);\n } else {\n const x = 0.5 * (scope.pointers[0].pageX + scope.pointers[1].pageX);\n const y = 0.5 * (scope.pointers[0].pageY + scope.pointers[1].pageY);\n\n scope.panStart.set(x, y);\n }\n }\n\n function handleTouchStartDolly() {\n const dx = scope.pointers[0].pageX - scope.pointers[1].pageX;\n const dy = scope.pointers[0].pageY - scope.pointers[1].pageY;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n scope.dollyStart.set(0, distance);\n }\n\n function handleTouchStartDollyPan() {\n if (scope.enableZoom) handleTouchStartDolly();\n\n if (scope.enablePan) handleTouchStartPan();\n }\n\n function handleTouchStartDollyRotate() {\n if (scope.enableZoom) handleTouchStartDolly();\n\n if (scope.enableRotate) handleTouchStartRotate();\n }\n\n function handleTouchMoveRotate(event) {\n if (scope.pointers.length == 1) {\n scope.rotateEnd.set(event.pageX, event.pageY);\n } else {\n const position = getSecondPointerPosition(event);\n\n const x = 0.5 * (event.pageX + position.x);\n const y = 0.5 * (event.pageY + position.y);\n\n scope.rotateEnd.set(x, y);\n }\n\n scope.rotateDelta.subVectors(scope.rotateEnd, scope.rotateStart).multiplyScalar(scope.rotateSpeed);\n\n const element = scope.domElement;\n\n rotateLeft((2 * Math.PI * scope.rotateDelta.x) / element.clientHeight); // yes, height\n\n rotateUp((2 * Math.PI * scope.rotateDelta.y) / element.clientHeight);\n\n scope.rotateStart.copy(scope.rotateEnd);\n }\n\n function handleTouchMovePan(event) {\n if (scope.pointers.length === 1) {\n scope.panEnd.set(event.pageX, event.pageY);\n } else {\n const position = getSecondPointerPosition(event);\n\n const x = 0.5 * (event.pageX + position.x);\n const y = 0.5 * (event.pageY + position.y);\n\n scope.panEnd.set(x, y);\n }\n\n scope.panDelta.subVectors(scope.panEnd, scope.panStart).multiplyScalar(scope.panSpeed);\n\n pan(scope.panDelta.x, scope.panDelta.y);\n\n scope.panStart.copy(scope.panEnd);\n }\n\n function handleTouchMoveDolly(event) {\n const position = getSecondPointerPosition(event);\n\n const dx = event.pageX - position.x;\n const dy = event.pageY - position.y;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n scope.dollyEnd.set(0, distance);\n\n scope.dollyDelta.set(0, Math.pow(scope.dollyEnd.y / scope.dollyStart.y, scope.zoomSpeed));\n\n dollyOut(scope.dollyDelta.y);\n\n scope.dollyStart.copy(scope.dollyEnd);\n }\n\n function handleTouchMoveDollyPan(event) {\n if (scope.enableZoom) handleTouchMoveDolly(event);\n\n if (scope.enablePan) handleTouchMovePan(event);\n }\n\n function handleTouchMoveDollyRotate(event) {\n if (scope.enableZoom) handleTouchMoveDolly(event);\n\n if (scope.enableRotate) handleTouchMoveRotate(event);\n }\n\n //\n // event handlers - FSM: listen for events and reset state\n //\n\n function onPointerDown(event) {\n if (scope.enabled === false) return;\n\n if (scope.pointers.length === 0) {\n scope.domElement.setPointerCapture(event.pointerId);\n\n scope.domElement.addEventListener(\"pointermove\", onPointerMove);\n scope.domElement.addEventListener(\"pointerup\", onPointerUp);\n }\n\n //\n\n addPointer(event);\n\n if (event.pointerType === \"touch\") {\n onTouchStart(event);\n } else {\n onMouseDown(event);\n }\n }\n\n function onPointerMove(event) {\n if (scope.enabled === false) return;\n\n if (event.pointerType === \"touch\") {\n onTouchMove(event);\n } else {\n onMouseMove(event);\n }\n }\n\n function onPointerUp(event) {\n removePointer(event);\n\n if (scope.pointers.length === 0) {\n scope.domElement.releasePointerCapture(event.pointerId);\n\n scope.domElement.removeEventListener(\"pointermove\", onPointerMove);\n scope.domElement.removeEventListener(\"pointerup\", onPointerUp);\n }\n\n scope.dispatchEvent(_endEvent);\n\n scope.state = STATE.NONE;\n }\n\n function onMouseDown(event) {\n let mouseAction;\n\n switch (event.button) {\n case 0:\n mouseAction = scope.mouseButtons.LEFT;\n break;\n\n case 1:\n mouseAction = scope.mouseButtons.MIDDLE;\n break;\n\n case 2:\n mouseAction = scope.mouseButtons.RIGHT;\n break;\n\n default:\n mouseAction = -1;\n }\n\n switch (mouseAction) {\n case MOUSE.DOLLY:\n if (scope.enableZoom === false) return;\n\n handleMouseDownDolly(event);\n\n scope.state = STATE.DOLLY;\n\n break;\n\n case MOUSE.ROTATE:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n if (scope.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n scope.state = STATE.PAN;\n } else {\n if (scope.enableRotate === false) return;\n\n handleMouseDownRotate(event);\n\n scope.state = STATE.ROTATE;\n }\n\n break;\n\n case MOUSE.PAN:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n if (scope.enableRotate === false) return;\n\n handleMouseDownRotate(event);\n\n scope.state = STATE.ROTATE;\n } else {\n if (scope.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n scope.state = STATE.PAN;\n }\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n if (scope.state !== STATE.NONE) {\n scope.dispatchEvent(_startEvent);\n }\n }\n\n function onMouseMove(event) {\n switch (scope.state) {\n case STATE.ROTATE:\n if (scope.enableRotate === false) return;\n\n handleMouseMoveRotate(event);\n\n break;\n\n case STATE.DOLLY:\n if (scope.enableZoom === false) return;\n\n handleMouseMoveDolly(event);\n\n break;\n\n case STATE.PAN:\n if (scope.enablePan === false) return;\n\n handleMouseMovePan(event);\n\n break;\n }\n }\n\n function onMouseWheel(event) {\n if (scope.enabled === false || scope.enableZoom === false || scope.state !== STATE.NONE) return;\n\n event.preventDefault();\n\n scope.dispatchEvent(_startEvent);\n\n handleMouseWheel(event);\n\n scope.dispatchEvent(_endEvent);\n }\n\n function onKeyDown(event) {\n if (scope.enabled === false || scope.enablePan === false) return;\n\n handleKeyDown(event);\n }\n\n function onTouchStart(event) {\n trackPointer(event);\n\n switch (scope.pointers.length) {\n case 1:\n switch (scope.touches.ONE) {\n case TOUCH.ROTATE:\n if (scope.enableRotate === false) return;\n\n handleTouchStartRotate();\n\n scope.state = STATE.TOUCH_ROTATE;\n\n break;\n\n case TOUCH.PAN:\n if (scope.enablePan === false) return;\n\n handleTouchStartPan();\n\n scope.state = STATE.TOUCH_PAN;\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n break;\n\n case 2:\n switch (scope.touches.TWO) {\n case TOUCH.DOLLY_PAN:\n if (scope.enableZoom === false && scope.enablePan === false) return;\n\n handleTouchStartDollyPan();\n\n scope.state = STATE.TOUCH_DOLLY_PAN;\n\n break;\n\n case TOUCH.DOLLY_ROTATE:\n if (scope.enableZoom === false && scope.enableRotate === false) return;\n\n handleTouchStartDollyRotate();\n\n scope.state = STATE.TOUCH_DOLLY_ROTATE;\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n if (scope.state !== STATE.NONE) {\n scope.dispatchEvent(_startEvent);\n }\n }\n\n function onTouchMove(event) {\n trackPointer(event);\n\n switch (scope.state) {\n case STATE.TOUCH_ROTATE:\n if (scope.enableRotate === false) return;\n\n handleTouchMoveRotate(event);\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_PAN:\n if (scope.enablePan === false) return;\n\n handleTouchMovePan(event);\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_PAN:\n if (scope.enableZoom === false && scope.enablePan === false) return;\n\n handleTouchMoveDollyPan(event);\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_ROTATE:\n if (scope.enableZoom === false && scope.enableRotate === false) return;\n\n handleTouchMoveDollyRotate(event);\n\n scope.update();\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n }\n\n function onContextMenu(event) {\n if (scope.enabled === false) return;\n\n event.preventDefault();\n }\n\n function addPointer(event) {\n scope.pointers.push(event);\n }\n\n function removePointer(event) {\n delete scope.pointerPositions[event.pointerId];\n\n for (let i = 0; i < scope.pointers.length; i++) {\n if (scope.pointers[i].pointerId == event.pointerId) {\n scope.pointers.splice(i, 1);\n return;\n }\n }\n }\n\n function trackPointer(event) {\n let position = scope.pointerPositions[event.pointerId];\n\n if (position === undefined) {\n position = new Vector2();\n scope.pointerPositions[event.pointerId] = position;\n }\n\n position.set(event.pageX, event.pageY);\n }\n\n function getSecondPointerPosition(event) {\n const pointer = event.pointerId === scope.pointers[0].pointerId ? scope.pointers[1] : scope.pointers[0];\n\n return scope.pointerPositions[pointer.pointerId];\n }\n\n //\n\n scope.domElement.addEventListener(\"contextmenu\", onContextMenu);\n\n scope.domElement.addEventListener(\"pointerdown\", onPointerDown);\n scope.domElement.addEventListener(\"pointercancel\", onPointerUp);\n scope.domElement.addEventListener(\"wheel\", onMouseWheel, { passive: false });\n\n // force an update at start\n\n this.update();\n }\n}\n\nexport { OrbitControls, STATE };\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MOUSE, TOUCH } from \"three\";\nimport { type IDragger } from \"@inweb/viewer-core\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { OrbitControls, STATE } from \"../controls/OrbitControls.js\";\n\nexport class OrbitDragger implements IDragger {\n protected viewer: Viewer;\n protected orbit: OrbitControls;\n protected changed: boolean;\n\n constructor(viewer: Viewer) {\n this.orbit = new OrbitControls(viewer.camera, viewer.canvas);\n this.orbit.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.PAN };\n this.orbit.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n this.orbit.screenSpacePanning = true;\n this.orbit.rotateSpeed = 0.33;\n this.orbit.addEventListener(\"start\", this.controlsStart);\n this.orbit.addEventListener(\"change\", this.controlsChange);\n this.changed = false;\n this.viewer = viewer;\n this.viewer.addEventListener(\"databasechunk\", this.updateControls);\n this.viewer.on(\"viewposition\", this.updateControls);\n this.viewer.addEventListener(\"zoom\", this.updateControls);\n this.viewer.addEventListener(\"drawviewpoint\", this.updateControls);\n this.viewer.addEventListener(\"changecameramode\", this.updateControlsCamera);\n this.viewer.addEventListener(\"contextmenu\", this.stopContextMenu);\n this.updateControls();\n }\n\n initialize() {}\n\n dispose(): void {\n this.viewer.removeEventListener(\"databasechunk\", this.updateControls);\n this.viewer.off(\"viewposition\", this.updateControls);\n this.viewer.removeEventListener(\"zoom\", this.updateControls);\n this.viewer.removeEventListener(\"drawviewpoint\", this.updateControls);\n this.viewer.removeEventListener(\"changecameramode\", this.updateControlsCamera);\n this.viewer.removeEventListener(\"contextmenu\", this.stopContextMenu);\n\n this.orbit.removeEventListener(\"start\", this.controlsStart);\n this.orbit.removeEventListener(\"change\", this.controlsChange);\n this.orbit.dispose();\n }\n\n updateControls = () => {\n this.orbit.target.copy(this.viewer.target);\n this.orbit.update();\n };\n\n updateControlsCamera = () => {\n this.orbit.maxDistance = this.viewer.camera.far;\n this.orbit.minDistance = this.viewer.camera.near;\n this.orbit.object = this.viewer.camera;\n this.orbit.update();\n };\n\n controlsStart = () => {\n this.changed = false;\n };\n\n controlsChange = () => {\n this.viewer.target.copy(this.orbit.target);\n this.viewer.update();\n\n switch (this.orbit.state) {\n case STATE.ROTATE:\n case STATE.TOUCH_ROTATE:\n this.viewer.emitEvent({\n type: \"orbit\",\n });\n break;\n\n case STATE.PAN:\n case STATE.TOUCH_PAN:\n this.viewer.emitEvent({\n type: \"pan\",\n x: this.orbit.panEnd.x,\n y: this.orbit.panEnd.y,\n dX: this.orbit.panDelta.x,\n dY: this.orbit.panDelta.y,\n });\n break;\n\n case STATE.DOLLY:\n this.viewer.emitEvent({\n type: \"zoomat\",\n data: this.orbit.dollyScale,\n x: this.orbit.dollyEnd.x,\n y: this.orbit.dollyEnd.y,\n });\n break;\n }\n\n this.viewer.emitEvent({ type: \"changecamera\" });\n\n this.changed = true;\n };\n\n stopContextMenu = (event: PointerEvent) => {\n if (this.changed) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Object3D, Plane, Vector3 } from \"three\";\nimport { TransformControls } from \"three/examples/jsm/controls/TransformControls.js\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { PlaneHelper } from \"../helpers/PlaneHelper\";\nimport { OrbitDragger } from \"./OrbitDragger\";\n\nexport class CuttingPlaneDragger extends OrbitDragger {\n protected plane: Plane;\n protected planeCenter: Object3D;\n protected planeHelper: PlaneHelper;\n protected transform: TransformControls;\n\n constructor(viewer: Viewer, normal: Vector3, color: number) {\n super(viewer);\n\n const size = viewer.extents.getSize(new Vector3()).length();\n const center = viewer.extents.getCenter(new Vector3());\n const constant = -center.dot(normal);\n\n this.plane = new Plane(normal, constant);\n\n if (!viewer.renderer.clippingPlanes) viewer.renderer.clippingPlanes = [];\n viewer.renderer.clippingPlanes.push(this.plane);\n\n this.planeHelper = new PlaneHelper(this.plane, size, color, center);\n this.viewer.helpers.add(this.planeHelper);\n\n this.planeCenter = new Object3D();\n this.planeCenter.position.copy(viewer.extents.getCenter(new Vector3()));\n this.viewer.helpers.add(this.planeCenter);\n\n this.transform = new TransformControls(viewer.camera, viewer.canvas);\n this.transform.showX = !!normal.x;\n this.transform.showY = !!normal.y;\n this.transform.showZ = !!normal.z;\n this.transform.attach(this.planeCenter);\n this.transform.addEventListener(\"change\", this.transformChange);\n this.transform.addEventListener(\"dragging-changed\", this.transformDrag);\n this.viewer.helpers.add(this.transform.getHelper());\n\n this.viewer.addEventListener(\"explode\", this.updatePlaneSize);\n this.viewer.addEventListener(\"show\", this.updatePlaneSize);\n this.viewer.addEventListener(\"showall\", this.updatePlaneSize);\n this.viewer.addEventListener(\"changecameramode\", this.updateTransformCamera);\n this.viewer.canvas.addEventListener(\"dblclick\", this.onDoubleClick, true);\n this.viewer.update();\n }\n\n override dispose() {\n this.viewer.removeEventListener(\"explode\", this.updatePlaneSize);\n this.viewer.removeEventListener(\"show\", this.updatePlaneSize);\n this.viewer.removeEventListener(\"showall\", this.updatePlaneSize);\n this.viewer.removeEventListener(\"changecameramode\", this.updateTransformCamera);\n this.viewer.canvas.removeEventListener(\"dblclick\", this.onDoubleClick, true);\n\n this.transform.removeEventListener(\"change\", this.transformChange);\n this.transform.removeEventListener(\"dragging-changed\", this.transformDrag);\n this.transform.getHelper().removeFromParent();\n this.transform.detach();\n this.transform.dispose();\n\n this.planeHelper.removeFromParent();\n this.planeHelper.dispose();\n\n this.planeCenter.removeFromParent();\n\n // this.viewer.renderer.clippingPlanes = this.viewer.renderer.clippingPlanes.filter((plane) => plane !== this.plane);\n // this.viewer.update();\n\n super.dispose();\n }\n\n transformChange = () => {\n this.plane.constant = -this.planeCenter.position.dot(this.plane.normal);\n this.viewer.update();\n };\n\n transformDrag = (event) => {\n this.orbit.enabled = !event.value;\n };\n\n updatePlaneSize = () => {\n this.planeHelper.size = this.viewer.extents.getSize(new Vector3()).length();\n this.viewer.update();\n };\n\n updateTransformCamera = () => {\n this.transform.camera = this.viewer.camera;\n };\n\n onDoubleClick = (event: PointerEvent) => {\n event.stopPropagation();\n\n this.plane.negate();\n this.viewer.update();\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { CuttingPlaneDragger } from \"./CuttingPlaneDragger\";\n\nexport class CuttingPlaneXAxisDragger extends CuttingPlaneDragger {\n constructor(viewer: Viewer) {\n super(viewer, new Vector3(1, 0, 0), 0xff0000);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { CuttingPlaneDragger } from \"./CuttingPlaneDragger\";\n\nexport class CuttingPlaneYAxisDragger extends CuttingPlaneDragger {\n constructor(viewer: Viewer) {\n super(viewer, new Vector3(0, 1, 0), 0x00ff00);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { CuttingPlaneDragger } from \"./CuttingPlaneDragger\";\n\nexport class CuttingPlaneZAxisDragger extends CuttingPlaneDragger {\n constructor(viewer: Viewer) {\n super(viewer, new Vector3(0, 0, 1), 0x0000ff);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport {\n Camera,\n EdgesGeometry,\n Intersection,\n Line3,\n MathUtils,\n Matrix4,\n Object3D,\n Plane,\n Raycaster,\n Vector2,\n Vector3,\n Vector4,\n} from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { OrbitDragger } from \"./OrbitDragger\";\n\nconst PRECISION = 0.01;\nconst DESKTOP_SNAP_DISTANCE = 10;\nconst MOBILE_SNAP_DISTANCE = 50;\n\nexport class MeasureLineDragger extends OrbitDragger {\n private overlay: MeasureOverlay;\n private line: MeasureLine;\n private snapper: MeasureSnapper;\n\n constructor(viewer: Viewer) {\n super(viewer);\n\n this.overlay = new MeasureOverlay(viewer.camera, viewer.canvas);\n this.overlay.attach();\n\n this.line = new MeasureLine(this.overlay);\n this.overlay.addLine(this.line);\n\n this.snapper = new MeasureSnapper(viewer.camera, viewer.canvas);\n this.updateSnapper();\n\n this.viewer.canvas.addEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.canvas.addEventListener(\"pointermove\", this.onPointerMove);\n this.viewer.canvas.addEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.canvas.addEventListener(\"pointercancel\", this.onPointerCancel);\n this.viewer.canvas.addEventListener(\"pointerleave\", this.onPointerLeave);\n\n this.viewer.addEventListener(\"render\", this.renderOverlay);\n this.viewer.addEventListener(\"hide\", this.updateSnapper);\n this.viewer.addEventListener(\"isolate\", this.updateSnapper);\n this.viewer.addEventListener(\"show\", this.updateSnapper);\n this.viewer.addEventListener(\"showall\", this.updateSnapper);\n this.viewer.addEventListener(\"changecameramode\", this.updateSnapperCamera);\n }\n\n override dispose() {\n this.viewer.canvas.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.canvas.removeEventListener(\"pointermove\", this.onPointerMove);\n this.viewer.canvas.removeEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.canvas.removeEventListener(\"pointercancel\", this.onPointerCancel);\n this.viewer.canvas.removeEventListener(\"pointerleave\", this.onPointerLeave);\n\n this.viewer.removeEventListener(\"render\", this.renderOverlay);\n this.viewer.removeEventListener(\"hide\", this.updateSnapper);\n this.viewer.removeEventListener(\"isolate\", this.updateSnapper);\n this.viewer.removeEventListener(\"show\", this.updateSnapper);\n this.viewer.removeEventListener(\"showall\", this.updateSnapper);\n this.viewer.removeEventListener(\"changecameramode\", this.updateSnapperCamera);\n\n this.snapper.dispose();\n\n this.overlay.detach();\n this.overlay.dispose();\n\n super.dispose();\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n\n this.line.startPoint = this.snapper.getSnapPoint(event);\n this.line.render();\n\n this.viewer.canvas.setPointerCapture(event.pointerId);\n this.orbit.enabled = !this.line.startPoint;\n };\n\n onPointerMove = (event: PointerEvent) => {\n if (this.orbit.enabled && this.orbit.state !== -1) return;\n\n const snapPoint = this.snapper.getSnapPoint(event);\n if (snapPoint && this.line.endPoint && snapPoint.equals(this.line.endPoint)) return;\n\n this.line.endPoint = snapPoint;\n this.line.render();\n\n if (this.line.startPoint) this.changed = true; // <- to prevent context menu\n };\n\n onPointerUp = (event: PointerEvent) => {\n if (this.line.startPoint && this.line.endPoint && this.line.getDistance() >= PRECISION) {\n this.line = new MeasureLine(this.overlay);\n this.overlay.addLine(this.line);\n } else {\n this.line.startPoint = undefined;\n this.line.endPoint = undefined;\n this.line.render();\n }\n\n this.viewer.canvas.releasePointerCapture(event.pointerId);\n this.orbit.enabled = true;\n };\n\n onPointerCancel = (event: PointerEvent) => {\n this.viewer.canvas.dispatchEvent(new PointerEvent(\"pointerup\", event));\n };\n\n onPointerLeave = () => {\n this.line.endPoint = undefined;\n this.line.render();\n };\n\n renderOverlay = () => {\n this.overlay.render();\n };\n\n updateSnapper = () => {\n this.snapper.setFromViewer(this.viewer);\n };\n\n updateSnapperCamera = () => {\n this.snapper.camera = this.viewer.camera;\n this.overlay.camera = this.viewer.camera;\n };\n}\n\nconst _vertex = new Vector3();\nconst _start = new Vector3();\nconst _end = new Vector3();\nconst _line = new Line3();\nconst _center = new Vector3();\nconst _projection = new Vector3();\n\nclass MeasureSnapper {\n public camera: Camera;\n private canvas: HTMLCanvasElement;\n private objects: Object3D[];\n private clippingPlanes: Plane[];\n private raycaster: Raycaster;\n private detectRadiusInPixels: number;\n private edgesCache: WeakMap<any, EdgesGeometry>;\n\n constructor(camera: Camera, canvas: HTMLCanvasElement) {\n this.camera = camera;\n this.canvas = canvas;\n this.objects = [];\n this.clippingPlanes = [];\n this.raycaster = new Raycaster();\n this.detectRadiusInPixels = this.isMobile() ? MOBILE_SNAP_DISTANCE : DESKTOP_SNAP_DISTANCE;\n this.edgesCache = new WeakMap();\n }\n\n dispose() {\n this.objects = [];\n }\n\n isMobile(): boolean {\n if (typeof navigator === \"undefined\") return false;\n\n // ===================== AI-CODE-START ======================\n // Source: Claude Sonnet 4\n // Date: 2025-09-09\n // Reviewer: roman.mochalov@opendesign.com\n // Issue: CLOUD-5799\n\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);\n\n // ===================== AI-CODE-END ======================\n }\n\n getMousePosition(event: MouseEvent, target: Vector2): Vector2 {\n return target.set(event.clientX, event.clientY);\n }\n\n getPointerIntersects(mouse: Vector2): Array<Intersection<Object3D>> {\n const rect = this.canvas.getBoundingClientRect();\n const x = ((mouse.x - rect.left) / rect.width) * 2 - 1;\n const y = (-(mouse.y - rect.top) / rect.height) * 2 + 1;\n\n const coords = new Vector2(x, y);\n this.raycaster.setFromCamera(coords, this.camera);\n\n this.raycaster.params = {\n Mesh: {},\n Line: { threshold: 0.05 },\n Line2: { threshold: 0.05 },\n LOD: {},\n Points: { threshold: 0.01 },\n Sprite: {},\n };\n\n let intersects = this.raycaster.intersectObjects(this.objects, false);\n\n this.clippingPlanes.forEach((plane) => {\n intersects = intersects.filter((intersect) => plane.distanceToPoint(intersect.point) >= 0);\n });\n\n return intersects;\n }\n\n getDetectRadius(point: Vector3): number {\n const camera: any = this.camera;\n\n // ===================== AI-CODE-START ======================\n // Source: Gemini 2.5 Pro\n // Date: 2025-08-27\n // Reviewer: roman.mochalov@opendesign.com\n // Issue: CLOUD-5799\n // Notes: Originally AI-generated, modified manually\n\n if (camera.isOrthographicCamera) {\n const fieldHeight = (camera.top - camera.bottom) / camera.zoom;\n\n const canvasHeight = this.canvas.height;\n const worldUnitsPerPixel = fieldHeight / canvasHeight;\n\n return this.detectRadiusInPixels * worldUnitsPerPixel;\n }\n\n if (camera.isPerspectiveCamera) {\n const distance = camera.position.distanceTo(point);\n const fieldHeight = 2 * Math.tan(MathUtils.degToRad(camera.fov * 0.5)) * distance;\n\n const canvasHeight = this.canvas.height;\n const worldUnitsPerPixel = fieldHeight / canvasHeight;\n\n return this.detectRadiusInPixels * worldUnitsPerPixel;\n }\n\n // ===================== AI-CODE-END ======================\n\n return 0.1;\n }\n\n getSnapPoint(event: PointerEvent): Vector3 {\n const mouse = this.getMousePosition(event, new Vector2());\n\n const intersections = this.getPointerIntersects(mouse);\n if (intersections.length === 0) return undefined;\n\n // ===================== AI-CODE-START ======================\n // Source: Gemini 2.5 Pro\n // Date: 2025-08-20\n // Reviewer: roman.mochalov@opendesign.com\n // Issue: CLOUD-5799\n // Notes: Originally AI-generated, modified manually\n\n const object: any = intersections[0].object;\n const intersectionPoint = intersections[0].point;\n const localPoint = object.worldToLocal(intersectionPoint.clone());\n\n let snapPoint: Vector3;\n let snapDistance = this.getDetectRadius(intersectionPoint);\n\n const geometry = object.geometry;\n\n const positions = geometry.attributes.position.array;\n for (let i = 0; i < positions.length; i += 3) {\n _vertex.set(positions[i], positions[i + 1], positions[i + 2]);\n const distance = _vertex.distanceTo(localPoint);\n if (distance < snapDistance) {\n snapDistance = distance;\n snapPoint = _vertex.clone();\n }\n }\n if (snapPoint) return object.localToWorld(snapPoint);\n\n let edges = this.edgesCache.get(geometry);\n if (!edges) {\n edges = new EdgesGeometry(geometry);\n this.edgesCache.set(geometry, edges);\n }\n\n const edgePositions = edges.attributes.position.array;\n for (let i = 0; i < edgePositions.length; i += 6) {\n _start.set(edgePositions[i], edgePositions[i + 1], edgePositions[i + 2]);\n _end.set(edgePositions[i + 3], edgePositions[i + 4], edgePositions[i + 5]);\n _line.set(_start, _end);\n\n _line.getCenter(_center);\n const centerDistance = _center.distanceTo(localPoint);\n if (centerDistance < snapDistance) {\n snapDistance = centerDistance;\n snapPoint = _center.clone();\n continue;\n }\n\n _line.closestPointToPoint(localPoint, true, _projection);\n const lineDistance = _projection.distanceTo(localPoint);\n if (lineDistance < snapDistance) {\n snapDistance = lineDistance;\n snapPoint = _projection.clone();\n }\n }\n if (snapPoint) return object.localToWorld(snapPoint);\n\n // ===================== AI-CODE-END ======================\n\n return intersectionPoint.clone();\n }\n\n setFromViewer(viewer: Viewer) {\n this.objects.length = 0;\n viewer.models.forEach((model) => {\n model.getVisibleObjects().forEach((object) => this.objects.push(object));\n });\n\n this.camera = viewer.camera;\n this.clippingPlanes = viewer.renderer.clippingPlanes || [];\n }\n}\n\nclass MeasureOverlay {\n public camera: Camera;\n public canvas: HTMLCanvasElement;\n public container: HTMLElement;\n public lines: MeasureLine[] = [];\n public projector: MeasureProjector;\n private resizeObserver: ResizeObserver;\n\n constructor(camera: Camera, canvas: HTMLCanvasElement) {\n this.camera = camera;\n this.canvas = canvas;\n this.projector = new MeasureProjector(camera, canvas);\n this.resizeObserver = new ResizeObserver(this.resizeContainer);\n }\n\n attach() {\n this.container = document.createElement(\"div\");\n this.container.id = \"measure-container\";\n this.container.style.position = \"absolute\";\n this.container.style.outline = \"none\";\n this.container.style.pointerEvents = \"none\";\n this.container.style.overflow = \"hidden\";\n\n if (!this.canvas.parentElement) return;\n\n this.canvas.parentElement.appendChild(this.container);\n this.resizeObserver.observe(this.canvas);\n }\n\n dispose() {\n this.clear();\n }\n\n detach() {\n this.resizeObserver.disconnect();\n\n this.container.remove();\n this.container = undefined;\n }\n\n clear() {\n this.lines.forEach((line) => line.dispose());\n this.lines = [];\n }\n\n render() {\n this.projector.setFromCamera(this.camera);\n this.lines.forEach((line) => line.render());\n }\n\n update() {\n this.lines.forEach((line) => line.update());\n }\n\n addLine(line: MeasureLine) {\n this.lines.push(line);\n }\n\n removeLine(line: MeasureLine) {\n this.lines = this.lines.filter((x) => x !== line);\n }\n\n resizeContainer = () => {\n const { offsetLeft, offsetTop, offsetWidth, offsetHeight } = this.canvas;\n\n if (!offsetWidth || !offsetHeight) return; // <- invisible canvas, or canvas with parent removed\n\n this.container.style.left = `${offsetLeft}px`;\n this.container.style.top = `${offsetTop}px`;\n\n this.container.style.width = `${offsetWidth}px`;\n this.container.style.height = `${offsetHeight}px`;\n };\n}\n\nconst _middlePoint = new Vector3();\n\nclass MeasureLine {\n private overlay: MeasureOverlay;\n\n private elementStartPoint: HTMLElement;\n private elementEndPoint: HTMLElement;\n private elementLine: HTMLElement;\n private elementLabel: HTMLElement;\n\n public startPoint: Vector3;\n public endPoint: Vector3;\n\n public id = MathUtils.generateUUID();\n public unit = \"\";\n public scale = 1.0;\n public size = 10.0;\n public lineWidth = 2;\n\n public style = {\n border: \"2px solid #FFFFFF\",\n background: \"#009bff\",\n boxShadow: \"0 0 10px rgba(0,0,0,0.5)\",\n color: \"white\",\n font: \"1rem system-ui\",\n };\n\n constructor(overlay: MeasureOverlay) {\n this.overlay = overlay;\n\n this.elementStartPoint = overlay.container.appendChild(document.createElement(\"div\"));\n this.elementEndPoint = overlay.container.appendChild(document.createElement(\"div\"));\n this.elementLine = overlay.container.appendChild(document.createElement(\"div\"));\n this.elementLabel = overlay.container.appendChild(document.createElement(\"div\"));\n\n this.update();\n }\n\n dispose() {\n this.elementStartPoint.remove();\n this.elementEndPoint.remove();\n this.elementLine.remove();\n this.elementLabel.remove();\n\n this.elementStartPoint = undefined;\n this.elementEndPoint = undefined;\n this.elementLine = undefined;\n this.elementLabel = undefined;\n }\n\n render() {\n const projector = this.overlay.projector;\n\n if (this.startPoint) {\n const { point, visible } = projector.projectPoint(this.startPoint);\n\n this.elementStartPoint.style.display = visible ? \"block\" : \"none\";\n this.elementStartPoint.style.left = `${point.x}px`;\n this.elementStartPoint.style.top = `${point.y}px`;\n } else {\n this.elementStartPoint.style.display = \"none\";\n }\n\n if (this.endPoint) {\n const { point, visible } = projector.projectPoint(this.endPoint);\n\n this.elementEndPoint.style.display = visible ? \"block\" : \"none\";\n this.elementEndPoint.style.left = `${point.x}px`;\n this.elementEndPoint.style.top = `${point.y}px`;\n } else {\n this.elementEndPoint.style.display = \"none\";\n }\n\n if (this.startPoint && this.endPoint) {\n const { point1, point2, visible } = projector.projectLine(this.startPoint, this.endPoint);\n\n point2.sub(point1);\n const angle = point2.angle();\n const width = point2.length();\n\n this.elementLine.style.display = visible ? \"block\" : \"none\";\n this.elementLine.style.left = `${point1.x}px`;\n this.elementLine.style.top = `${point1.y}px`;\n this.elementLine.style.width = `${width}px`;\n this.elementLine.style.transform = `translate(0px, ${-this.lineWidth / 2}px) rotate(${angle}rad)`;\n } else {\n this.elementLine.style.display = \"none\";\n }\n\n if (this.startPoint && this.endPoint) {\n _middlePoint.lerpVectors(this.startPoint, this.endPoint, 0.5);\n const { point, visible } = projector.projectPoint(_middlePoint);\n\n const distance = this.getDistance();\n\n this.elementLabel.style.display = visible && distance >= PRECISION ? \"block\" : \"none\";\n this.elementLabel.style.left = `${point.x}px`;\n this.elementLabel.style.top = `${point.y}px`;\n this.elementLabel.innerHTML = `${distance.toFixed(2)} ${this.unit}`;\n } else {\n this.elementLabel.style.display = \"none\";\n }\n }\n\n update() {\n this.elementStartPoint.id = `markup-dot-start-${this.id}`;\n this.elementStartPoint.style.position = \"absolute\";\n this.elementStartPoint.style.zIndex = \"2\";\n this.elementStartPoint.style.width = `${this.size}px`;\n this.elementStartPoint.style.height = `${this.size}px`;\n this.elementStartPoint.style.border = this.style.border;\n this.elementStartPoint.style.borderRadius = `${this.size}px`;\n this.elementStartPoint.style.background = this.style.background;\n this.elementStartPoint.style.boxShadow = this.style.boxShadow;\n this.elementStartPoint.style.transform = \"translate(-50%, -50%)\";\n\n this.elementEndPoint.id = `markup-dot-end-${this.id}`;\n this.elementEndPoint.style.position = \"absolute\";\n this.elementEndPoint.style.zIndex = \"2\";\n this.elementEndPoint.style.width = `${this.size}px`;\n this.elementEndPoint.style.height = `${this.size}px`;\n this.elementEndPoint.style.border = this.style.border;\n this.elementEndPoint.style.borderRadius = `${this.size}px`;\n this.elementEndPoint.style.background = this.style.background;\n this.elementEndPoint.style.boxShadow = this.style.boxShadow;\n this.elementEndPoint.style.transform = \"translate(-50%, -50%)\";\n\n this.elementLine.id = `markup-line-${this.id}`;\n this.elementLine.style.position = \"absolute\";\n this.elementLine.style.zIndex = \"1\";\n this.elementLine.style.height = `${this.lineWidth}px`;\n this.elementLine.style.background = this.style.background;\n this.elementLine.style.boxShadow = this.style.boxShadow;\n this.elementLine.style.transformOrigin = `0px ${this.lineWidth / 2}px`;\n\n this.elementLabel.id = `markup-label-${this.id}`;\n this.elementLabel.style.position = \"absolute\";\n this.elementLabel.style.zIndex = \"3\";\n this.elementLabel.style.padding = \"2px\";\n this.elementLabel.style.paddingInline = \"5px\";\n this.elementLabel.style.borderRadius = \"5px\";\n this.elementLabel.style.background = this.style.background;\n this.elementLabel.style.boxShadow = this.style.boxShadow;\n this.elementLabel.style.color = this.style.color;\n this.elementLabel.style.font = this.style.font;\n this.elementLabel.style.transform = \"translate(-50%, -50%)\";\n }\n\n getDistance(): number {\n return this.startPoint.distanceTo(this.endPoint) / this.scale;\n }\n}\n\nlet _widthHalf: number;\nlet _heightHalf: number;\nconst _viewMatrix = new Matrix4();\nconst _viewProjectionMatrix = new Matrix4();\nconst _vector = new Vector3();\nconst _vector1 = new Vector4();\nconst _vector2 = new Vector4();\nconst point = new Vector2();\nconst point1 = new Vector2();\nconst point2 = new Vector2();\n\nclass MeasureProjector {\n public camera: Camera;\n private canvas: HTMLElement;\n\n constructor(camera: Camera, canvas: HTMLCanvasElement) {\n this.camera = camera;\n this.canvas = canvas;\n }\n\n setFromCamera(camera: Camera) {\n this.camera = camera;\n this.updateProjectionMatrix();\n }\n\n updateProjectionMatrix() {\n const rect = this.canvas.getBoundingClientRect();\n _widthHalf = rect.width / 2;\n _heightHalf = rect.height / 2;\n\n _viewMatrix.copy(this.camera.matrixWorldInverse);\n _viewProjectionMatrix.multiplyMatrices(this.camera.projectionMatrix, _viewMatrix);\n }\n\n projectPoint(p: Vector3) {\n _vector.copy(p).applyMatrix4(_viewProjectionMatrix);\n const visible = _vector.z >= -1 && _vector.z <= 1;\n\n point.x = (_vector.x + 1) * _widthHalf;\n point.y = (-_vector.y + 1) * _heightHalf;\n\n return { point, visible };\n }\n\n projectLine(p1: Vector3, p2: Vector3) {\n let visible: boolean;\n\n _vector1.copy(p1 as any).applyMatrix4(_viewProjectionMatrix);\n _vector2.copy(p2 as any).applyMatrix4(_viewProjectionMatrix);\n\n // see three/examples/jsm/renderers/Projector.js/clipLine for more details\n\n const bc1near = _vector1.z + _vector1.w;\n const bc2near = _vector2.z + _vector2.w;\n const bc1far = -_vector1.z + _vector1.w;\n const bc2far = -_vector2.z + _vector2.w;\n\n if (bc1near >= 0 && bc2near >= 0 && bc1far >= 0 && bc2far >= 0) visible = true;\n else if ((bc1near < 0 && bc2near < 0) || (bc1far < 0 && bc2far < 0)) visible = false;\n else {\n let alpha1 = 0;\n let alpha2 = 1;\n\n if (bc1near < 0) alpha1 = Math.max(alpha1, bc1near / (bc1near - bc2near));\n else if (bc2near < 0) alpha2 = Math.min(alpha2, bc1near / (bc1near - bc2near));\n\n if (bc1far < 0) alpha1 = Math.max(alpha1, bc1far / (bc1far - bc2far));\n else if (bc2far < 0) alpha2 = Math.min(alpha2, bc1far / (bc1far - bc2far));\n\n visible = alpha2 >= alpha1;\n\n if (visible) {\n _vector1.lerp(_vector2, alpha1);\n _vector2.lerp(_vector1, 1 - alpha2);\n }\n }\n\n _vector1.multiplyScalar(1 / _vector1.w);\n _vector2.multiplyScalar(1 / _vector2.w);\n\n point1.x = (_vector1.x + 1) * _widthHalf;\n point1.y = (-_vector1.y + 1) * _heightHalf;\n\n point2.x = (_vector2.x + 1) * _widthHalf;\n point2.y = (-_vector2.y + 1) * _heightHalf;\n\n return { point1, point2, visible };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MOUSE } from \"three\";\n\nimport { OrbitDragger } from \"./OrbitDragger\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class PanDragger extends OrbitDragger {\n constructor(viewer: Viewer) {\n super(viewer);\n this.orbit.mouseButtons = { LEFT: MOUSE.PAN, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.PAN };\n // this.controls.touches = { ONE: TOUCH.PAN, TWO: TOUCH.DOLLY_ROTATE };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Clock, Camera, Controls, Quaternion, Vector2, Vector3, Raycaster, Object3D, MathUtils } from \"three\";\n\ninterface WalkControlsEventMap {\n change: { type: \"change\" };\n walkspeedchange: { type: \"walkspeedchange\"; data: number };\n}\n\nexport class WalkControls extends Controls<WalkControlsEventMap> {\n readonly EYE_HEIGHT = 1.7;\n readonly FAILING_DISTANCE = 2;\n readonly GROUND_FOLLOWING_SPEED = 0.05;\n readonly LOOK_SPEED = 0.1;\n readonly WALK_SPEED_DELIMITER = 4;\n readonly WHEEL_SPEED_DELIMITER = 15000;\n\n public movementSpeed = 0.1;\n public multiplier = 3;\n\n private raycaster: Raycaster;\n private groundObjects: Object3D[];\n\n private moveKeys: Set<string>;\n private moveWheel = 0;\n private moveClock: Clock;\n\n private quaternion: Quaternion;\n private downPosition: Vector2;\n private mouseDragOn = false;\n public rotateDelta: Vector2;\n\n private camera: Camera;\n\n constructor(camera: Camera, canvas: HTMLElement, groundObjects: Object3D[]) {\n super(camera, canvas);\n this.camera = camera;\n\n this.groundObjects = groundObjects;\n this.raycaster = new Raycaster();\n this.raycaster.near = 0;\n this.raycaster.far = this.EYE_HEIGHT + this.FAILING_DISTANCE;\n\n this.moveKeys = new Set();\n this.moveClock = new Clock();\n\n this.quaternion = camera.quaternion.clone();\n this.downPosition = new Vector2(0, 0);\n this.rotateDelta = new Vector2(0, 0);\n\n this.domElement.addEventListener(\"pointerdown\", this.onPointerDown);\n this.domElement.addEventListener(\"pointermove\", this.onPointerMove);\n this.domElement.addEventListener(\"pointerup\", this.onPointerUp);\n this.domElement.addEventListener(\"pointercancel\", this.onPointerCancel);\n this.domElement.addEventListener(\"wheel\", this.onWheel);\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n override dispose() {\n this.domElement.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.domElement.removeEventListener(\"pointermove\", this.onPointerMove);\n this.domElement.removeEventListener(\"pointerup\", this.onPointerUp);\n this.domElement.removeEventListener(\"pointercancel\", this.onPointerCancel);\n this.domElement.removeEventListener(\"wheel\", this.onWheel);\n\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n\n super.dispose();\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n\n this.domElement.setPointerCapture(event.pointerId);\n this.downPosition.set(event.clientX, event.clientY);\n this.quaternion.copy(this.object.quaternion);\n this.mouseDragOn = true;\n };\n\n onPointerMove = (event: PointerEvent) => {\n if (!this.mouseDragOn) return;\n\n const movePosition = new Vector2(event.clientX, event.clientY);\n if (this.downPosition.distanceTo(movePosition) === 0) return;\n\n this.rotateDelta.copy(this.downPosition).sub(movePosition);\n this.rotateCamera(this.rotateDelta);\n this.dispatchEvent({ type: \"change\" });\n };\n\n onPointerUp = (event: PointerEvent) => {\n this.domElement.releasePointerCapture(event.pointerId);\n this.mouseDragOn = false;\n };\n\n onPointerCancel = (event: PointerEvent) => {\n this.domElement.dispatchEvent(new PointerEvent(\"pointerup\", event));\n };\n\n onWheel = (event: WheelEvent) => {\n this.moveWheel = event.deltaY;\n this.update();\n };\n\n onKeyDown = (event: KeyboardEvent) => {\n switch (event.code) {\n case \"NumpadSubtract\":\n case \"Minus\":\n if (this.multiplier > 1) {\n this.multiplier = this.multiplier - 1;\n this.dispatchEvent({ type: \"walkspeedchange\", data: this.multiplier });\n }\n break;\n\n case \"NumpadAdd\":\n case \"Equal\":\n if (this.multiplier < 10) {\n this.multiplier = this.multiplier + 1;\n this.dispatchEvent({ type: \"walkspeedchange\", data: this.multiplier });\n }\n break;\n\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"ArrowUp\":\n case \"ArrowDown\":\n case \"KeyW\":\n case \"KeyS\":\n case \"KeyA\":\n case \"KeyD\":\n case \"KeyQ\":\n case \"KeyE\":\n this.moveKeys.add(event.code);\n this.update();\n break;\n }\n };\n\n onKeyUp = (event: KeyboardEvent) => {\n if (this.moveKeys.delete(event.code)) this.update();\n };\n\n private updateGroundFollowing() {\n const up = new Vector3().copy(this.camera.up);\n this.raycaster.set(this.object.position, up.negate());\n\n this.raycaster.params = this.raycaster.params = {\n Mesh: {},\n Line: { threshold: 0 },\n Line2: { threshold: 0 },\n LOD: { threshold: 0 },\n Points: { threshold: 0 },\n Sprite: { threshold: 0 },\n };\n\n const intersects = this.raycaster.intersectObjects(this.groundObjects, false);\n if (intersects.length > 0) {\n const groundY = intersects[0].point.y;\n const targetY = groundY + this.EYE_HEIGHT;\n\n // Smoothly interpolate the camera's y position to the target height\n this.object.position.y = MathUtils.lerp(this.object.position.y, targetY, this.GROUND_FOLLOWING_SPEED);\n }\n }\n\n override update() {\n let moved = false;\n let upgradeGroundFollowing = false;\n const forward = new Vector3();\n const sideways = new Vector3();\n\n if (this.moveKeys.size > 0) {\n upgradeGroundFollowing = true;\n const timeDelta = this.moveClock.getDelta();\n const moveDelta = (timeDelta * this.multiplier * this.movementSpeed) / this.WALK_SPEED_DELIMITER;\n\n this.object.getWorldDirection(forward);\n forward.y = 0;\n forward.normalize();\n\n sideways.setFromMatrixColumn(this.object.matrix, 0);\n sideways.y = 0;\n sideways.normalize();\n\n if (this.moveKeys.has(\"KeyW\")) {\n this.object.position.addScaledVector(forward, moveDelta);\n }\n if (this.moveKeys.has(\"KeyS\")) {\n this.object.position.addScaledVector(forward, -moveDelta);\n }\n\n if (this.moveKeys.has(\"KeyA\")) {\n this.object.position.addScaledVector(sideways, -moveDelta);\n }\n if (this.moveKeys.has(\"KeyD\")) {\n this.object.position.addScaledVector(sideways, moveDelta);\n }\n\n if (this.moveKeys.has(\"KeyQ\")) {\n this.object.translateY(moveDelta);\n upgradeGroundFollowing = false;\n }\n if (this.moveKeys.has(\"KeyE\")) {\n this.object.translateY(-moveDelta);\n upgradeGroundFollowing = false;\n }\n\n const lookDelta = this.LOOK_SPEED + (this.multiplier - 1);\n\n if (this.moveKeys.has(\"ArrowUp\")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, -lookDelta / 2)));\n if (this.moveKeys.has(\"ArrowDown\")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, lookDelta / 2)));\n if (this.moveKeys.has(\"ArrowLeft\")) this.rotateCamera(this.rotateDelta.add(new Vector2(lookDelta, 0)));\n if (this.moveKeys.has(\"ArrowRight\")) this.rotateCamera(this.rotateDelta.add(new Vector2(-lookDelta, 0)));\n\n this.moveWheel = 0;\n moved = true;\n }\n\n if (this.moveWheel !== 0) {\n const moveDelta = (this.moveWheel * this.multiplier * this.movementSpeed) / this.WHEEL_SPEED_DELIMITER;\n\n this.object.getWorldDirection(forward);\n forward.y = 0;\n forward.normalize();\n this.object.position.addScaledVector(forward, -moveDelta);\n\n this.moveWheel += -1 * Math.sign(this.moveWheel);\n moved = true;\n }\n\n if (upgradeGroundFollowing) this.updateGroundFollowing();\n\n if (moved) {\n this.dispatchEvent({ type: \"change\" });\n }\n\n if (this.moveKeys.size === 0 && this.moveWheel === 0) {\n this.moveClock.stop();\n this.moveClock.autoStart = true;\n }\n }\n\n rotateCamera(delta: Vector2) {\n const rotateX = (Math.PI * delta.x) / this.domElement.clientWidth;\n const rotateY = (Math.PI * delta.y) / this.domElement.clientHeight;\n\n const xRotation = new Quaternion();\n xRotation.setFromAxisAngle(this.object.up, rotateX);\n\n const yRotation = new Quaternion();\n yRotation.setFromAxisAngle(new Vector3(1, 0, 0), rotateY);\n\n const quaternion = this.quaternion.clone();\n quaternion.premultiply(xRotation).multiply(yRotation).normalize();\n\n this.object.setRotationFromQuaternion(quaternion);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\n// ===================== AI-CODE-FILE ======================\n// Source: Claude Sonnet 4.5\n// Date: 2025-10-07\n// Reviewer: vitaly.ivanov@opendesign.com\n// Issue: CLOUD-5851\n// Notes: Originally AI-generated, modified manually\n// =========================================================\n\nimport { Camera, Clock, Controls, Vector2, Vector3, Raycaster, Object3D, MathUtils } from \"three\";\n\ninterface JoyStickControlsEventMap {\n change: { type: \"change\" };\n}\n\nexport class JoyStickControls extends Controls<JoyStickControlsEventMap> {\n readonly EYE_HEIGHT = 1.7;\n readonly FAILING_DISTANCE = 2;\n readonly GROUND_FOLLOWING_SPEED = 0.05;\n readonly WALK_SPEED_DELIMITER = 4;\n\n public movementSpeed = 0.1;\n public multiplier = 3;\n\n private raycaster: Raycaster;\n private groundObjects: Object3D[];\n\n private canvas: HTMLCanvasElement;\n private overlayElement: HTMLDivElement;\n private joyStickCanvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n\n private moveClock: Clock;\n private camera: Camera;\n\n private joyStickPosition: Vector2;\n private isActive: boolean = false;\n\n private readonly MAX_JOYSTICK_DISTANCE = 100;\n private readonly INTERNAL_RADIUS = 35;\n private readonly MAX_MOVE_STICK = 40;\n private readonly EXTERNAL_RADIUS = 65;\n private readonly CANVAS_SIZE = 200;\n\n private centerX: number;\n private centerY: number;\n private pressed: boolean = false;\n\n constructor(camera: Camera, domElement: HTMLElement, canvasElement: HTMLCanvasElement, groundObjects: Object3D[]) {\n super(camera, domElement);\n this.camera = camera;\n this.canvas = canvasElement;\n this.moveClock = new Clock(false);\n this.joyStickPosition = new Vector2(0, 0);\n\n this.groundObjects = groundObjects;\n this.raycaster = new Raycaster();\n this.raycaster.near = 0;\n this.raycaster.far = this.EYE_HEIGHT + this.FAILING_DISTANCE;\n\n this.centerX = this.CANVAS_SIZE / 2;\n this.centerY = this.CANVAS_SIZE / 2;\n\n this.overlayElement = document.createElement(\"div\");\n this.overlayElement.id = \"joyStickDiv\";\n this.overlayElement.style.background = \"rgba(0,0,0,0)\";\n this.overlayElement.style.position = \"fixed\";\n this.overlayElement.style.zIndex = \"0\";\n this.overlayElement.style.touchAction = \"none\";\n document.body.appendChild(this.overlayElement);\n\n this.joyStickCanvas = document.createElement(\"canvas\");\n this.joyStickCanvas.id = \"joyStickCanvas\";\n this.joyStickCanvas.width = this.CANVAS_SIZE;\n this.joyStickCanvas.height = this.CANVAS_SIZE;\n this.overlayElement.appendChild(this.joyStickCanvas);\n this.context = this.joyStickCanvas.getContext(\"2d\")!;\n\n this.joyStickCanvas.addEventListener(\"pointerdown\", this.onPointerDown);\n document.addEventListener(\"pointermove\", this.onPointerMove);\n document.addEventListener(\"pointerup\", this.onPointerUp);\n\n window.addEventListener(\"resize\", this.onResize);\n document.addEventListener(\"fullscreenchange\", this.onResize);\n\n this.updateVisibility();\n this.updatePosition();\n this.draw();\n }\n\n override dispose() {\n this.joyStickCanvas.removeEventListener(\"pointerdown\", this.onPointerDown);\n document.removeEventListener(\"pointermove\", this.onPointerMove);\n document.removeEventListener(\"pointerup\", this.onPointerUp);\n\n window.removeEventListener(\"resize\", this.onResize);\n document.removeEventListener(\"fullscreenchange\", this.onResize);\n\n this.overlayElement.remove();\n super.dispose();\n }\n\n private onPointerDown = (event: PointerEvent) => {\n event.preventDefault();\n this.pressed = true;\n };\n\n private onPointerMove = (event: PointerEvent) => {\n event.preventDefault();\n if (!this.pressed) return;\n\n let movedX = event.pageX;\n let movedY = event.pageY;\n\n if (\n this.joyStickCanvas.offsetParent &&\n (this.joyStickCanvas.offsetParent as HTMLElement).tagName.toUpperCase() === \"BODY\"\n ) {\n movedX -= this.joyStickCanvas.offsetLeft;\n movedY -= this.joyStickCanvas.offsetTop;\n } else if (this.joyStickCanvas.offsetParent) {\n movedX -= (this.joyStickCanvas.offsetParent as HTMLElement).offsetLeft;\n movedY -= (this.joyStickCanvas.offsetParent as HTMLElement).offsetTop;\n }\n\n const x = 100 * ((movedX - this.centerX) / this.MAX_MOVE_STICK);\n const y = 100 * ((movedY - this.centerY) / this.MAX_MOVE_STICK) * -1;\n\n const distance = Math.sqrt(x * x + y * y);\n if (distance > 20) {\n this.joyStickPosition.set(x, y);\n this.isActive = true;\n } else {\n this.joyStickPosition.set(0, 0);\n this.isActive = false;\n }\n\n this.draw();\n this.moveClock.start();\n this.update();\n };\n\n private onPointerUp = (event: PointerEvent) => {\n event.preventDefault();\n this.pressed = false;\n this.joyStickPosition.set(0, 0);\n this.isActive = false;\n this.moveClock.stop();\n this.draw();\n };\n\n private onResize = () => {\n this.updateVisibility();\n this.updatePosition();\n };\n\n private updateVisibility() {\n const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n const isNarrowScreen = window.innerWidth < 1024;\n\n if (isMobile || isNarrowScreen) {\n this.overlayElement.style.display = \"block\";\n } else {\n this.overlayElement.style.display = \"none\";\n }\n }\n\n private updatePosition() {\n const rect = this.canvas.getBoundingClientRect();\n this.overlayElement.style.top = `${rect.height - this.CANVAS_SIZE}px`;\n this.overlayElement.style.left = `${rect.left}px`;\n this.overlayElement.style.width = `${this.CANVAS_SIZE}px`;\n this.overlayElement.style.height = `${this.CANVAS_SIZE}px`;\n }\n\n private draw() {\n this.context.clearRect(0, 0, this.CANVAS_SIZE, this.CANVAS_SIZE);\n\n // Draw external circle\n this.context.beginPath();\n this.context.arc(this.centerX, this.centerY, this.EXTERNAL_RADIUS, 0, 2 * Math.PI, false);\n this.context.lineWidth = 2;\n this.context.strokeStyle = \"#35436E\";\n this.context.globalAlpha = 0.5;\n this.context.stroke();\n\n // Draw internal circle\n let movedX = this.centerX + (this.joyStickPosition.x * this.MAX_MOVE_STICK) / 100;\n let movedY = this.centerY - (this.joyStickPosition.y * this.MAX_MOVE_STICK) / 100;\n\n movedX = Math.max(this.MAX_MOVE_STICK, Math.min(this.CANVAS_SIZE - this.MAX_MOVE_STICK, movedX));\n movedY = Math.max(this.MAX_MOVE_STICK, Math.min(this.CANVAS_SIZE - this.MAX_MOVE_STICK, movedY));\n\n this.context.beginPath();\n this.context.arc(movedX, movedY, this.INTERNAL_RADIUS, 0, 2 * Math.PI, false);\n this.context.fillStyle = \"#35436E\";\n this.context.lineWidth = 2;\n this.context.strokeStyle = \"#35436E\";\n this.context.globalAlpha = 0.5;\n this.context.fill();\n this.context.stroke();\n }\n\n private updateGroundFollowing() {\n const up = new Vector3().copy(this.camera.up);\n this.raycaster.set(this.camera.position, up.negate());\n\n this.raycaster.params = this.raycaster.params = {\n Mesh: {},\n Line: { threshold: 0 },\n Line2: { threshold: 0 },\n LOD: { threshold: 0 },\n Points: { threshold: 0 },\n Sprite: { threshold: 0 },\n };\n\n const intersects = this.raycaster.intersectObjects(this.groundObjects, false);\n if (intersects.length > 0) {\n const groundY = intersects[0].point.y;\n const targetY = groundY + this.EYE_HEIGHT;\n\n // Smoothly interpolate the camera's y position to the target height\n this.camera.position.y = MathUtils.lerp(this.camera.position.y, targetY, this.GROUND_FOLLOWING_SPEED);\n }\n }\n\n override update() {\n if (!this.isActive) return;\n\n const forwardInput = this.joyStickPosition.y / this.MAX_JOYSTICK_DISTANCE;\n const rightInput = this.joyStickPosition.x / this.MAX_JOYSTICK_DISTANCE;\n\n const timeDelta = this.moveClock.getDelta();\n const moveDelta = (timeDelta * this.multiplier * this.movementSpeed) / this.WALK_SPEED_DELIMITER;\n\n const forward = new Vector3();\n const sideways = new Vector3();\n\n this.camera.getWorldDirection(forward);\n if (this.groundObjects.length > 0) {\n forward.y = 0;\n }\n forward.normalize();\n\n sideways.setFromMatrixColumn(this.camera.matrix, 0);\n if (this.groundObjects.length > 0) {\n sideways.y = 0;\n }\n sideways.normalize();\n\n if (forwardInput !== 0) {\n this.camera.position.addScaledVector(forward, moveDelta * forwardInput);\n }\n if (rightInput !== 0) {\n this.camera.position.addScaledVector(sideways, moveDelta * rightInput);\n }\n\n if (forwardInput !== 0 || rightInput !== 0) {\n if (this.groundObjects.length > 0) this.updateGroundFollowing();\n this.dispatchEvent({ type: \"change\" });\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Mesh, Vector3 } from \"three\";\nimport { type IDragger } from \"@inweb/viewer-core\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { WalkControls } from \"../controls/WalkControls\";\nimport { JoyStickControls } from \"../controls/JoyStickControls\";\n\nexport class WalkDragger implements IDragger {\n protected viewer: Viewer;\n public controls: WalkControls;\n private joyStickControls: JoyStickControls;\n\n constructor(viewer: Viewer) {\n const meshOnlyGround: Mesh[] = [];\n viewer.models.forEach((model) =>\n model.getVisibleObjects().forEach((obj) => {\n if (obj instanceof Mesh) {\n meshOnlyGround.push(obj);\n }\n })\n );\n this.controls = new WalkControls(viewer.camera, viewer.canvas, meshOnlyGround);\n this.controls.addEventListener(\"change\", this.controlsChange);\n this.controls.addEventListener(\"walkspeedchange\", this.walkspeedChange);\n\n this.joyStickControls = new JoyStickControls(viewer.camera, viewer.canvas, viewer.canvas, meshOnlyGround);\n this.joyStickControls.addEventListener(\"change\", this.controlsChange);\n\n this.viewer = viewer;\n this.viewer.addEventListener(\"render\", this.viewerRender);\n this.viewer.addEventListener(\"zoom\", this.viewerZoom);\n this.viewer.addEventListener(\"changecameramode\", this.updateControlsCamera);\n this.updateControls();\n }\n\n dispose() {\n this.viewer.removeEventListener(\"render\", this.viewerRender);\n this.viewer.removeEventListener(\"zoom\", this.viewerZoom);\n this.viewer.removeEventListener(\"changecameramode\", this.updateControlsCamera);\n this.controls.removeEventListener(\"walkspeedchange\", this.walkspeedChange);\n this.controls.removeEventListener(\"change\", this.controlsChange);\n this.controls.dispose();\n\n this.joyStickControls.removeEventListener(\"change\", this.controlsChange);\n this.joyStickControls.dispose();\n }\n\n updateControls = () => {\n const size = this.viewer.extents.getSize(new Vector3());\n this.controls.movementSpeed = Math.min(size.x, size.y, size.z) / 2;\n this.joyStickControls.movementSpeed = this.controls.movementSpeed;\n this.joyStickControls.multiplier = this.controls.multiplier;\n };\n\n updateControlsCamera = () => {\n this.controls.object = this.viewer.camera;\n };\n\n controlsChange = () => {\n this.viewer.update();\n this.viewer.emitEvent({ type: \"changecamera\" });\n };\n\n walkspeedChange = (event: any) => {\n this.viewer.emitEvent(event);\n this.joyStickControls.multiplier = this.controls.multiplier;\n };\n\n viewerRender = () => {\n this.joyStickControls.update();\n this.controls.update();\n };\n\n viewerZoom = () => {\n this.controls.rotateDelta.set(0, 0);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Clock, Camera, Controls, Quaternion, Vector2, Vector3 } from \"three\";\n\ninterface FlyControlsEventMap {\n change: { type: \"change\" };\n flyspeedchange: { type: \"flyspeedchange\"; data: number };\n}\n\nexport class FlyControls extends Controls<FlyControlsEventMap> {\n public movementSpeed = 0.2;\n public lookSpeed = 5;\n public multiplier = 5;\n\n private moveKeys: Set<string>;\n private moveWheel = 0;\n private moveClock: Clock;\n\n private quaternion: Quaternion;\n private downPosition: Vector2;\n private mouseDragOn = false;\n public rotateDelta: Vector2;\n\n constructor(camera: Camera, canvas: HTMLElement) {\n super(camera, canvas);\n\n this.moveKeys = new Set();\n this.moveClock = new Clock();\n\n this.quaternion = camera.quaternion.clone();\n this.downPosition = new Vector2(0, 0);\n this.rotateDelta = new Vector2(0, 0);\n\n this.domElement.addEventListener(\"pointerdown\", this.onPointerDown);\n this.domElement.addEventListener(\"pointermove\", this.onPointerMove);\n this.domElement.addEventListener(\"pointerup\", this.onPointerUp);\n this.domElement.addEventListener(\"pointercancel\", this.onPointerCancel);\n this.domElement.addEventListener(\"wheel\", this.onWheel);\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n override dispose() {\n this.domElement.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.domElement.removeEventListener(\"pointermove\", this.onPointerMove);\n this.domElement.removeEventListener(\"pointerup\", this.onPointerUp);\n this.domElement.removeEventListener(\"pointercancel\", this.onPointerCancel);\n this.domElement.removeEventListener(\"wheel\", this.onWheel);\n\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n\n super.dispose();\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n\n this.domElement.setPointerCapture(event.pointerId);\n this.downPosition.set(event.clientX, event.clientY);\n this.quaternion.copy(this.object.quaternion);\n this.mouseDragOn = true;\n };\n\n onPointerMove = (event: PointerEvent) => {\n if (!this.mouseDragOn) return;\n\n const movePosition = new Vector2(event.clientX, event.clientY);\n if (this.downPosition.distanceTo(movePosition) === 0) return;\n\n this.rotateDelta.copy(this.downPosition).sub(movePosition);\n this.rotateCamera(this.rotateDelta);\n this.dispatchEvent({ type: \"change\" });\n };\n\n onPointerUp = (event: PointerEvent) => {\n this.domElement.releasePointerCapture(event.pointerId);\n this.mouseDragOn = false;\n };\n\n onPointerCancel = (event: PointerEvent) => {\n this.domElement.dispatchEvent(new PointerEvent(\"pointerup\", event));\n };\n\n onWheel = (event: WheelEvent) => {\n this.moveWheel = event.deltaY;\n this.update();\n };\n\n onKeyDown = (event: KeyboardEvent) => {\n switch (event.code) {\n case \"NumpadSubtract\":\n case \"Minus\":\n if (this.multiplier > 1) {\n this.multiplier = this.multiplier - 1;\n this.dispatchEvent({ type: \"flyspeedchange\", data: this.multiplier });\n }\n break;\n\n case \"NumpadAdd\":\n case \"Equal\":\n if (this.multiplier < 10) {\n this.multiplier = this.multiplier + 1;\n this.dispatchEvent({ type: \"flyspeedchange\", data: this.multiplier });\n }\n break;\n\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"ArrowUp\":\n case \"ArrowDown\":\n case \"KeyW\":\n case \"KeyS\":\n case \"KeyA\":\n case \"KeyD\":\n case \"KeyQ\":\n case \"KeyE\":\n this.moveKeys.add(event.code);\n this.update();\n break;\n }\n };\n\n onKeyUp = (event: KeyboardEvent) => {\n if (this.moveKeys.delete(event.code)) this.update();\n };\n\n override update() {\n if (this.moveKeys.size > 0) {\n const timeDelta = this.moveClock.getDelta();\n const moveDelta = timeDelta * this.movementSpeed * this.multiplier;\n\n if (this.moveKeys.has(\"KeyW\")) this.object.translateZ(-moveDelta);\n if (this.moveKeys.has(\"KeyS\")) this.object.translateZ(moveDelta);\n\n if (this.moveKeys.has(\"KeyA\")) this.object.translateX(-moveDelta);\n if (this.moveKeys.has(\"KeyD\")) this.object.translateX(moveDelta);\n\n if (this.moveKeys.has(\"KeyQ\")) this.object.translateY(moveDelta);\n if (this.moveKeys.has(\"KeyE\")) this.object.translateY(-moveDelta);\n\n const lookDelta = this.lookSpeed + (this.multiplier - 1);\n\n if (this.moveKeys.has(\"ArrowUp\")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, -lookDelta / 2)));\n if (this.moveKeys.has(\"ArrowDown\")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, lookDelta / 2)));\n\n if (this.moveKeys.has(\"ArrowLeft\")) this.rotateCamera(this.rotateDelta.add(new Vector2(lookDelta, 0)));\n if (this.moveKeys.has(\"ArrowRight\")) this.rotateCamera(this.rotateDelta.add(new Vector2(-lookDelta, 0)));\n\n this.moveWheel = 0;\n this.dispatchEvent({ type: \"change\" });\n }\n\n if (this.moveWheel !== 0) {\n const moveDelta = this.moveWheel * 0.0001 * this.movementSpeed * this.multiplier;\n\n this.object.translateZ(-moveDelta);\n this.moveWheel += -1 * Math.sign(this.moveWheel);\n this.dispatchEvent({ type: \"change\" });\n }\n\n if (this.moveKeys.size === 0 && this.moveWheel === 0) {\n this.moveClock.stop();\n this.moveClock.autoStart = true;\n }\n }\n\n rotateCamera(delta: Vector2) {\n const rotateX = (Math.PI * delta.x) / this.domElement.clientWidth;\n const rotateY = (Math.PI * delta.y) / this.domElement.clientHeight;\n\n const xRotation = new Quaternion();\n xRotation.setFromAxisAngle(this.object.up, rotateX);\n\n const yRotation = new Quaternion();\n yRotation.setFromAxisAngle(new Vector3(1, 0, 0), rotateY);\n\n const quaternion = this.quaternion.clone();\n quaternion.premultiply(xRotation).multiply(yRotation).normalize();\n\n this.object.setRotationFromQuaternion(quaternion);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\nimport { type IDragger } from \"@inweb/viewer-core\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { FlyControls } from \"../controls/FlyControls\";\nimport { JoyStickControls } from \"../controls/JoyStickControls\";\n\nexport class FlyDragger implements IDragger {\n protected viewer: Viewer;\n public controls: FlyControls;\n private joyStickControls: JoyStickControls;\n\n constructor(viewer: Viewer) {\n this.controls = new FlyControls(viewer.camera, viewer.canvas);\n this.controls.addEventListener(\"change\", this.controlsChange);\n this.controls.addEventListener(\"flyspeedchange\", this.flyspeedChange);\n\n this.joyStickControls = new JoyStickControls(viewer.camera, viewer.canvas, viewer.canvas, []);\n this.joyStickControls.addEventListener(\"change\", this.controlsChange);\n\n this.viewer = viewer;\n this.viewer.addEventListener(\"render\", this.viewerRender);\n this.viewer.addEventListener(\"zoom\", this.viewerZoom);\n this.viewer.addEventListener(\"changecameramode\", this.updateControlsCamera);\n this.updateControls();\n }\n\n dispose() {\n this.viewer.removeEventListener(\"render\", this.viewerRender);\n this.viewer.removeEventListener(\"zoom\", this.viewerZoom);\n this.viewer.removeEventListener(\"changecameramode\", this.updateControlsCamera);\n this.controls.removeEventListener(\"flyspeedchange\", this.flyspeedChange);\n this.controls.removeEventListener(\"change\", this.controlsChange);\n this.controls.dispose();\n\n this.joyStickControls.removeEventListener(\"change\", this.controlsChange);\n this.joyStickControls.dispose();\n }\n\n updateControls = () => {\n const size = this.viewer.extents.getSize(new Vector3());\n this.controls.movementSpeed = Math.min(size.x, size.y, size.z) / 2;\n this.joyStickControls.movementSpeed = this.controls.movementSpeed;\n this.joyStickControls.multiplier = this.controls.multiplier;\n };\n\n updateControlsCamera = () => {\n this.controls.object = this.viewer.camera;\n };\n\n controlsChange = () => {\n this.viewer.update();\n this.viewer.emitEvent({ type: \"changecamera\" });\n };\n\n flyspeedChange = (event: any) => {\n this.viewer.emitEvent(event);\n this.joyStickControls.multiplier = this.controls.multiplier;\n };\n\n viewerRender = () => {\n this.joyStickControls.update();\n this.controls.update();\n };\n\n viewerZoom = () => {\n this.controls.rotateDelta.set(0, 0);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MOUSE } from \"three\";\n\nimport { OrbitDragger } from \"./OrbitDragger\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ZoomDragger extends OrbitDragger {\n constructor(viewer: Viewer) {\n super(viewer);\n this.orbit.mouseButtons = { LEFT: MOUSE.DOLLY, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.PAN };\n // this.controls.touches = { ONE: TOUCH.DOLLY_PAN, TWO: TOUCH.DOLLY_PAN };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IDraggersRegistry, draggersRegistry } from \"@inweb/viewer-core\";\n\nimport { CuttingPlaneXAxisDragger } from \"./CuttingPlaneXAxis\";\nimport { CuttingPlaneYAxisDragger } from \"./CuttingPlaneYAxis\";\nimport { CuttingPlaneZAxisDragger } from \"./CuttingPlaneZAxis\";\nimport { MeasureLineDragger } from \"./MeasureLineDragger\";\nimport { OrbitDragger } from \"./OrbitDragger\";\nimport { PanDragger } from \"./PanDragger\";\nimport { WalkDragger } from \"./WalkDragger\";\nimport { FlyDragger } from \"./FlyDragger\";\nimport { ZoomDragger } from \"./ZoomDragger\";\n\n/**\n * Viewer draggers registry. Use this registry to register custom draggers.\n *\n * To implement custom dragger:\n *\n * 1. Define a dragger class implements {@link IDragger}.\n * 2. Define a constructor with a `viewer` parameter and add mouse event listeners for the specified viewer.\n * 3. Define the dragger logic in the event listeners. For example, listen for the `mousemove` event and\n * zoom in/out when the left mouse button is pressed.\n * 4. Override {@link IDragger.dispose} and remove mouse event listeners from the viewer.\n * 5. Register dragger provider in the draggers registry by calling the {@link draggers.registerDragger}.\n *\n * @example Implementing a custom dragger.\n *\n * ```javascript\n * import { IDragger, draggers, Viewer } from \"@inweb/viewer-three\";\n *\n * class MyDragger implements IDragger {\n * protected viewer: Viewer;\n *\n * constructor(viewer: Viewer) {\n * this.viewer = viewer;\n * this.viewer.addEventListener(\"pointermove\", this.onPointerMove);\n * }\n *\n * override dispose() {\n * this.viewer.removeEventListener(\"pointermove\", this.onPointerMove);\n * }\n *\n * onPointerMove = (event: PointerEvent) => {\n * // place custom logic here\n * };\n * }\n *\n * draggers.registerDragger(\"MyDragger\", (viewer): IDragger => new MyDragger(viewer));\n * ```\n *\n * @example Activating a custom dragger.\n *\n * ```javascript\n * viewer.setActiveDragger(\"MyDragger\");\n * ```\n */\nexport const draggers: IDraggersRegistry = draggersRegistry(\"threejs\");\n\n// build-in draggers\n\ndraggers.registerDragger(\"Pan\", (viewer) => new PanDragger(viewer));\ndraggers.registerDragger(\"Orbit\", (viewer) => new OrbitDragger(viewer));\ndraggers.registerDragger(\"Zoom\", (viewer) => new ZoomDragger(viewer));\ndraggers.registerDragger(\"MeasureLine\", (viewer) => new MeasureLineDragger(viewer));\ndraggers.registerDragger(\"CuttingPlaneXAxis\", (viewer) => new CuttingPlaneXAxisDragger(viewer));\ndraggers.registerDragger(\"CuttingPlaneYAxis\", (viewer) => new CuttingPlaneYAxisDragger(viewer));\ndraggers.registerDragger(\"CuttingPlaneZAxis\", (viewer) => new CuttingPlaneZAxisDragger(viewer));\ndraggers.registerDragger(\"Walk\", (viewer) => new WalkDragger(viewer));\ndraggers.registerDragger(\"Fly\", (viewer) => new FlyDragger(viewer));\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Model, File, Assembly } from \"@inweb/client\";\nimport type { Viewer } from \"../Viewer\";\n\nexport function applyModelTransform(viewer: Viewer, model: Model | File | Assembly) {\n console.warn(\"applyModelTransform not implemented\");\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function clearMarkup(viewer: Viewer) {\n viewer.clearOverlay();\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\nimport type { SelectionComponent } from \"../components/SelectionComponent\";\n\nexport function clearSelected(viewer: Viewer): void {\n const selection = viewer.getComponent(\"SelectionComponent\") as SelectionComponent;\n selection.clearSelection();\n\n viewer.update();\n viewer.emitEvent({ type: \"select\", data: undefined, handles: [] });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function clearSlices(viewer: Viewer) {\n viewer.clearSlices();\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function createPreview(viewer: Viewer, type = \"image/jpeg\", encoderOptions = 0.25): string {\n viewer.update(true);\n return viewer.canvas.toDataURL(type, encoderOptions);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function explode(viewer: Viewer, index = 0): void {\n viewer.models.forEach((model) => model.explode(index));\n\n viewer.update();\n viewer.emitEvent({ type: \"explode\", data: index });\n}\n\nexport function collect(viewer: Viewer) {\n explode(viewer, 0);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, MathUtils, Sphere, Vector2, Vector3 } from \"three\";\nimport type { Viewer } from \"../Viewer\";\n\nexport function zoomTo(viewer: Viewer, box: Box3): void {\n if (box.isEmpty()) return;\n\n const boxCenter = box.getCenter(new Vector3());\n const boxSize = box.getBoundingSphere(new Sphere()).radius;\n\n const rendererSize = viewer.renderer.getSize(new Vector2());\n const aspect = rendererSize.x / rendererSize.y;\n\n const camera = viewer.camera as any;\n\n if (camera.isPerspectiveCamera) {\n const offset = new Vector3(0, 0, 1)\n .applyQuaternion(camera.quaternion)\n .multiplyScalar(boxSize / Math.tan(MathUtils.degToRad(camera.fov * 0.5)));\n\n camera.position.copy(offset).add(boxCenter);\n camera.updateMatrixWorld();\n }\n if (camera.isOrthographicCamera) {\n camera.top = boxSize;\n camera.bottom = -boxSize;\n camera.left = camera.bottom * aspect;\n camera.right = camera.top * aspect;\n camera.zoom = 1;\n camera.updateProjectionMatrix();\n\n const offset = new Vector3(0, 0, 1)\n .applyQuaternion(camera.quaternion)\n .multiplyScalar(viewer.extents.getBoundingSphere(new Sphere()).radius * 3);\n\n camera.position.copy(offset).add(boxCenter);\n camera.updateMatrixWorld();\n }\n\n viewer.target.copy(boxCenter);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Quaternion, Sphere, Vector3 } from \"three\";\nimport type { Viewer } from \"../Viewer\";\nimport { zoomTo } from \"./ZoomTo\";\n\nexport const defaultViewPositions = {\n front: new Vector3(0, 0, -1),\n back: new Vector3(0, 0, 1),\n left: new Vector3(1, 0, 0),\n right: new Vector3(-1, 0, 0),\n bottom: new Vector3(0, -1, 0),\n top: new Vector3(0, 1, 0),\n se: new Vector3(-1, 1, -1).normalize(),\n sw: new Vector3(1, 1, -1).normalize(),\n ne: new Vector3(-1, 1, 1).normalize(),\n nw: new Vector3(1, 1, 1).normalize(),\n};\n\nexport function setDefaultViewPosition(viewer: Viewer, position: string): void {\n const extentsCenter = viewer.extents.getCenter(new Vector3());\n const extentsSize = viewer.extents.getBoundingSphere(new Sphere()).radius * 2;\n\n const upY = new Vector3(0, 1, 0);\n const offsetY = defaultViewPositions[position] || defaultViewPositions[\"sw\"];\n\n const up = new Vector3().copy(viewer.camera.up);\n const quaternion = new Quaternion().setFromUnitVectors(upY, up);\n const offset = new Vector3().copy(offsetY).applyQuaternion(quaternion);\n\n const camera = viewer.camera;\n camera.position.copy(offset).multiplyScalar(extentsSize).add(extentsCenter);\n camera.lookAt(extentsCenter);\n camera.updateMatrixWorld();\n\n viewer.target.copy(extentsCenter);\n\n viewer.update();\n viewer.emit({ type: \"viewposition\", data: position });\n\n zoomTo(viewer, viewer.extents);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { defaultViewPositions } from \"./SetDefaultViewPosition\";\n\nexport function getDefaultViewPositions(): string[] {\n return Object.keys(defaultViewPositions);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function getModels(viewer: Viewer): string[] {\n return viewer.models.map((model) => model.handle);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function getSelected(viewer: Viewer): string[] {\n const handles = [];\n viewer.models.forEach((model) => handles.push(...model.getHandlesByObjects(viewer.selected)));\n return handles;\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\nimport type { SelectionComponent } from \"../components/SelectionComponent\";\n\nexport function hideSelected(viewer: Viewer): void {\n viewer.models.forEach((model) => model.hideObjects(viewer.selected));\n\n const selection = viewer.getComponent(\"SelectionComponent\") as SelectionComponent;\n selection.clearSelection();\n\n viewer.update();\n viewer.emitEvent({ type: \"hide\" });\n viewer.emitEvent({ type: \"select\", data: undefined, handles: [] });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function isolateSelected(viewer: Viewer): void {\n viewer.models.forEach((model) => model.isolateObjects(viewer.selected));\n\n viewer.update();\n viewer.emitEvent({ type: \"isolate\" });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function regenerateAll(viewer: Viewer): void {\n viewer.emit({ type: \"regenerateall\" });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\nimport type { ResetComponent } from \"../components/ResetComponent\";\n\nexport function resetView(viewer: Viewer): void {\n const reset = viewer.getComponent(\"ResetComponent\") as ResetComponent;\n\n viewer.executeCommand(\"setActiveDragger\");\n viewer.executeCommand(\"clearSlices\");\n viewer.executeCommand(\"clearOverlay\");\n viewer.executeCommand(\"setMarkupColor\");\n viewer.executeCommand(\"clearSelected\");\n viewer.executeCommand(\"showAll\");\n viewer.executeCommand(\"explode\", 0);\n viewer.executeCommand(\"zoomToExtents\", true);\n\n reset.resetCameraPosition();\n\n viewer.emit({ type: \"resetview\" });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\nimport type { SelectionComponent } from \"../components/SelectionComponent\";\n\nexport function selectModel(viewer: Viewer, handle: string): void {\n const selection = viewer.getComponent(\"SelectionComponent\") as SelectionComponent;\n selection.clearSelection();\n\n viewer.models\n .filter((model) => model.handle === handle)\n .forEach((model) => selection.select(model.getObjects(), model));\n\n viewer.update();\n viewer.emit({ type: \"select\", data: [] });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function setActiveDragger(viewer: Viewer, dragger = \"\") {\n viewer.setActiveDragger(dragger);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function setMarkupColor(viewer: Viewer, r = 255, g = 0, b = 0) {\n viewer.markup.setMarkupColor(r, g, b);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\nimport type { SelectionComponent } from \"../components/SelectionComponent\";\n\nexport function setSelected(viewer: Viewer, handles: string[] = []): void {\n const selection = viewer.getComponent(\"SelectionComponent\") as SelectionComponent;\n selection.clearSelection();\n\n viewer.models.forEach((model) => {\n const objects = model.getObjectsByHandles(handles);\n model.showObjects(objects);\n selection.select(objects, model);\n });\n\n viewer.update();\n viewer.emitEvent({ type: \"show\" });\n viewer.emitEvent({ type: \"select\", data: undefined, handles });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\n\nexport function showAll(viewer: Viewer): void {\n viewer.models.forEach((model) => model.showAllObjects());\n\n viewer.update();\n viewer.emitEvent({ type: \"showall\" });\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport type { Viewer } from \"../Viewer\";\nimport { zoomTo } from \"./ZoomTo\";\n\nexport function zoomToExtents(viewer: Viewer): void {\n zoomTo(viewer, viewer.extents);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3 } from \"three\";\nimport type { Viewer } from \"../Viewer\";\nimport { zoomTo } from \"./ZoomTo\";\n\nexport function zoomToObjects(viewer: Viewer, handles: string[] = []): void {\n const handleSet = new Set(handles);\n const objects = [];\n viewer.scene.traverseVisible((child) => {\n if (handleSet.has(child.userData?.handle)) objects.push(child);\n });\n\n const extents = objects.reduce((result: Box3, object) => result.expandByObject(object), new Box3());\n if (extents.isEmpty()) extents.copy(viewer.extents);\n\n zoomTo(viewer, extents);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3 } from \"three\";\nimport type { Viewer } from \"../Viewer\";\nimport { zoomTo } from \"./ZoomTo\";\n\nexport function zoomToSelected(viewer: Viewer): void {\n const extents = viewer.selected.reduce((result: Box3, object) => result.expandByObject(object), new Box3());\n if (extents.isEmpty()) extents.copy(viewer.extents);\n\n zoomTo(viewer, extents);\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { ICommandsRegistry, commandsRegistry } from \"@inweb/viewer-core\";\n\nimport { applyModelTransform } from \"./ApplyModelTransform\";\nimport { clearMarkup } from \"./ClearMarkup\";\nimport { clearSelected } from \"./ClearSelected\";\nimport { clearSlices } from \"./ClearSlices\";\nimport { createPreview } from \"./CreatePreview\";\nimport { explode, collect } from \"./Explode\";\nimport { getDefaultViewPositions } from \"./GetDefaultViewPositions\";\nimport { getModels } from \"./GetModels\";\nimport { getSelected } from \"./GetSelected\";\nimport { hideSelected } from \"./HideSelected\";\nimport { isolateSelected } from \"./IsolateSelected\";\nimport { regenerateAll } from \"./RegenerateAll\";\nimport { resetView } from \"./ResetView\";\nimport { selectModel } from \"./SelectModel\";\nimport { setActiveDragger } from \"./SetActiveDragger\";\nimport { setDefaultViewPosition } from \"./SetDefaultViewPosition\";\nimport { setMarkupColor } from \"./SetMarkupColor\";\nimport { setSelected } from \"./SetSelected\";\nimport { showAll } from \"./ShowAll\";\nimport { zoomToExtents } from \"./ZoomToExtents\";\nimport { zoomToObjects } from \"./ZoomToObjects\";\nimport { zoomToSelected } from \"./ZoomToSelected\";\n\n/**\n * Viewer commands registry. Use this registry to register custom commands.\n *\n * To implement custom command:\n *\n * 1. Define a command handler with a first `viewer` parameter.\n * 2. Register command handler in the commands registry by calling the {@link commands.registerCommand}.\n *\n * @example Implementing a custom command.\n *\n * ```javascript\n * import { commands, Viewer } from \"@inweb/viewer-three\";\n *\n * function commandHandler(viewer: Viewer, name = \"world\"): void {\n * console.log(`Hello ${name}!!!`);\n * }\n *\n * commands.registerCommand(\"sayHello\", commandHandler);\n * ```\n *\n * @example Calling a custom command.\n *\n * ```javascript\n * viewer.executeCommand(\"sayHello\", \"user\");\n * ```\n */\nexport const commands: ICommandsRegistry = commandsRegistry(\"threejs\");\n\n// build-in commands\n\ncommands.registerCommand(\"applyModelTransform\", applyModelTransform);\ncommands.registerCommand(\"clearMarkup\", clearMarkup);\ncommands.registerCommand(\"clearSelected\", clearSelected);\ncommands.registerCommand(\"clearSlices\", clearSlices);\ncommands.registerCommand(\"collect\", collect);\ncommands.registerCommand(\"createPreview\", createPreview);\ncommands.registerCommand(\"explode\", explode);\ncommands.registerCommand(\"getDefaultViewPositions\", getDefaultViewPositions);\ncommands.registerCommand(\"getModels\", getModels);\ncommands.registerCommand(\"getSelected\", getSelected);\ncommands.registerCommand(\"hideSelected\", hideSelected);\ncommands.registerCommand(\"isolateSelected\", isolateSelected);\ncommands.registerCommand(\"regenerateAll\", regenerateAll);\ncommands.registerCommand(\"resetView\", resetView);\ncommands.registerCommand(\"selectModel\", selectModel);\ncommands.registerCommand(\"setActiveDragger\", setActiveDragger);\ncommands.registerCommand(\"setDefaultViewPosition\", setDefaultViewPosition);\ncommands.registerCommand(\"setMarkupColor\", setMarkupColor);\ncommands.registerCommand(\"setSelected\", setSelected);\ncommands.registerCommand(\"showAll\", showAll);\ncommands.registerCommand(\"zoomToExtents\", zoomToExtents);\ncommands.registerCommand(\"zoomToObjects\", zoomToObjects);\ncommands.registerCommand(\"zoomToSelected\", zoomToSelected);\n\ncommands.registerCommand(\"top\", (viewer) => setDefaultViewPosition(viewer, \"top\"));\ncommands.registerCommand(\"bottom\", (viewer) => setDefaultViewPosition(viewer, \"bottom\"));\ncommands.registerCommand(\"left\", (viewer) => setDefaultViewPosition(viewer, \"left\"));\ncommands.registerCommand(\"right\", (viewer) => setDefaultViewPosition(viewer, \"right\"));\ncommands.registerCommand(\"front\", (viewer) => setDefaultViewPosition(viewer, \"front\"));\ncommands.registerCommand(\"back\", (viewer) => setDefaultViewPosition(viewer, \"back\"));\ncommands.registerCommand(\"sw\", (viewer) => setDefaultViewPosition(viewer, \"sw\"));\ncommands.registerCommand(\"se\", (viewer) => setDefaultViewPosition(viewer, \"se\"));\ncommands.registerCommand(\"ne\", (viewer) => setDefaultViewPosition(viewer, \"ne\"));\ncommands.registerCommand(\"nw\", (viewer) => setDefaultViewPosition(viewer, \"nw\"));\n\ncommands.registerCommandAlias(\"clearMarkup\", \"clearOverlay\");\ncommands.registerCommandAlias(\"clearSelected\", \"unselect\");\ncommands.registerCommandAlias(\"zoomToExtents\", \"zoomExtents\");\n\ncommands.registerCommandAlias(\"top\", \"k3DViewTop\");\ncommands.registerCommandAlias(\"bottom\", \"k3DViewBottom\");\ncommands.registerCommandAlias(\"left\", \"k3DViewLeft\");\ncommands.registerCommandAlias(\"right\", \"k3DViewRight\");\ncommands.registerCommandAlias(\"front\", \"k3DViewFront\");\ncommands.registerCommandAlias(\"back\", \"k3DViewBack\");\ncommands.registerCommandAlias(\"se\", \"k3DViewSE\");\ncommands.registerCommandAlias(\"sw\", \"k3DViewSW\");\ncommands.registerCommandAlias(\"ne\", \"k3DViewNE\");\ncommands.registerCommandAlias(\"nw\", \"k3DViewNW\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Color } from \"three\";\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class BackgroundComponent implements IComponent {\n protected viewer: Viewer;\n protected backgroundColor: Color;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n this.backgroundColor = new Color(0xffffff);\n\n this.viewer.renderer.setClearColor(this.backgroundColor);\n this.viewer.scene.background = this.backgroundColor;\n this.viewer.addEventListener(\"optionschange\", this.syncOptions);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"optionschange\", this.syncOptions);\n this.viewer.scene.background = undefined;\n }\n\n syncOptions = () => {\n this.backgroundColor.setHex(0xffffff);\n this.viewer.renderer.setClearColor(this.backgroundColor);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MathUtils, OrthographicCamera, PerspectiveCamera, Sphere, Vector2, Vector3 } from \"three\";\n\nimport { CameraMode, IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class CameraComponent implements IComponent {\n protected viewer: Viewer;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.viewer.addEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.addEventListener(\"optionschange\", this.optionsChange);\n this.viewer.addEventListener(\"initialize\", this.optionsChange);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.removeEventListener(\"optionschange\", this.optionsChange);\n this.viewer.removeEventListener(\"initialize\", this.optionsChange);\n }\n\n getCameraMode(camera: any): CameraMode {\n return camera.isOrthographicCamera ? \"orthographic\" : \"perspective\";\n }\n\n switchCamera(camera: any) {\n const extentsSize = this.viewer.extents.getBoundingSphere(new Sphere()).radius * 2 || 1;\n const rendererSize = this.viewer.renderer.getSize(new Vector2());\n const aspect = rendererSize.x / rendererSize.y;\n\n if (camera.isPerspectiveCamera) {\n camera.aspect = aspect;\n camera.near = extentsSize / 1000;\n camera.far = extentsSize * 1000;\n }\n if (camera.isOrthographicCamera) {\n camera.left = camera.bottom * aspect;\n camera.right = camera.top * aspect;\n camera.near = 0;\n camera.far = extentsSize * 1000;\n }\n\n camera.updateProjectionMatrix();\n\n this.viewer.camera = camera;\n this.viewer.renderPass.camera = camera;\n this.viewer.helpersPass.camera = camera;\n this.viewer.ssaaRenderPass.camera = camera;\n\n this.viewer.update();\n }\n\n switchCameraMode(mode: CameraMode) {\n if (!mode) return;\n\n const currentCamera: any = this.viewer.camera;\n if (mode === this.getCameraMode(currentCamera)) return;\n\n const target = this.viewer.target.clone();\n\n let camera: PerspectiveCamera | OrthographicCamera;\n\n if (currentCamera.isOrthographicCamera) {\n const fov = currentCamera.userData.fov || 45;\n const fieldHeight = (currentCamera.top - currentCamera.bottom) / currentCamera.zoom;\n const distance = fieldHeight / (2 * Math.tan(MathUtils.degToRad(fov) / 2));\n const direction = new Vector3().subVectors(currentCamera.position, target).normalize();\n\n camera = new PerspectiveCamera(fov);\n camera.position.copy(direction).multiplyScalar(distance).add(target);\n }\n if (currentCamera.isPerspectiveCamera) {\n const fov = currentCamera.fov;\n const distance = currentCamera.position.distanceTo(target);\n const fieldHeight = 2 * Math.tan(MathUtils.degToRad(fov) / 2) * distance;\n\n camera = new OrthographicCamera();\n camera.top = fieldHeight / 2;\n camera.bottom = -fieldHeight / 2;\n camera.position.copy(currentCamera.position);\n\n camera.userData.fov = fov;\n }\n if (!camera) return;\n\n camera.up.copy(currentCamera.up);\n camera.quaternion.copy(currentCamera.quaternion);\n\n this.switchCamera(camera);\n\n this.viewer.emitEvent({ type: \"changecameramode\", mode });\n }\n\n optionsChange = () => {\n this.switchCameraMode(this.viewer.options.cameraMode);\n };\n\n geometryEnd = () => {\n let camera: any;\n\n // TODO: do not change the camera and target after opening the second model in \"append\" mode\n this.viewer.scene.traverse((object: any) => {\n if (object.isCamera)\n if (!camera) camera = object;\n else if (object.isPerspectiveCamera && camera.isOrthographicCamera) camera = object;\n });\n\n if (camera) {\n camera.isDefaultCamera = true;\n camera.scale.set(1, 1, 1); // <- Visualize fix\n\n this.switchCamera(camera);\n\n const mode = this.getCameraMode(camera);\n\n this.viewer.options.cameraMode = mode;\n this.viewer.emitEvent({ type: \"changecameramode\", mode });\n } else {\n this.switchCamera(this.viewer.camera);\n this.viewer.executeCommand(\"setDefaultViewPosition\");\n }\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3 } from \"three\";\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ExtentsComponent implements IComponent {\n private viewer: Viewer;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.viewer.addEventListener(\"databasechunk\", this.syncExtents);\n this.viewer.addEventListener(\"clear\", this.syncExtents);\n this.viewer.on(\"explode\", this.syncExtents);\n this.viewer.on(\"hide\", this.syncExtents);\n this.viewer.on(\"isolate\", this.syncExtents);\n this.viewer.on(\"show\", this.syncExtents);\n this.viewer.on(\"showall\", this.syncExtents);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"databasechunk\", this.syncExtents);\n this.viewer.removeEventListener(\"clear\", this.syncExtents);\n this.viewer.off(\"explode\", this.syncExtents);\n this.viewer.off(\"hide\", this.syncExtents);\n this.viewer.off(\"isolate\", this.syncExtents);\n this.viewer.off(\"show\", this.syncExtents);\n this.viewer.off(\"showall\", this.syncExtents);\n }\n\n syncExtents = () => {\n const extents = new Box3();\n this.viewer.models.forEach((model) => model.getExtents(extents));\n\n this.viewer.extents.copy(extents);\n this.viewer.extents.getCenter(this.viewer.target);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { AmbientLight, DirectionalLight, HemisphereLight, Quaternion, Sphere, Vector3 } from \"three\";\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class LightComponent implements IComponent {\n protected viewer: Viewer;\n protected ambientLight: AmbientLight;\n protected directionalLight: DirectionalLight;\n protected frontLight: DirectionalLight;\n protected hemisphereLight: HemisphereLight;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n this.ambientLight = new AmbientLight(0xffffff, 1.5);\n this.directionalLight = new DirectionalLight(0xffffff, 1.0);\n this.frontLight = new DirectionalLight(0xffffff, 1.25);\n this.hemisphereLight = new HemisphereLight(0xffffff, 0x444444, 1.25);\n\n this.viewer.addEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.addEventListener(\"clear\", this.geometryEnd);\n }\n\n dispose(): void {\n this.ambientLight.removeFromParent();\n this.ambientLight.dispose();\n\n this.directionalLight.removeFromParent();\n this.directionalLight.dispose();\n\n this.frontLight.removeFromParent();\n this.frontLight.dispose();\n\n this.hemisphereLight.removeFromParent();\n this.hemisphereLight.dispose();\n\n this.viewer.removeEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.removeEventListener(\"clear\", this.geometryEnd);\n }\n\n geometryEnd = () => {\n this.ambientLight.removeFromParent();\n this.directionalLight.removeFromParent();\n this.frontLight.removeFromParent();\n this.hemisphereLight.removeFromParent();\n\n if (this.viewer.extents.isEmpty()) return;\n\n const extentsCenter = this.viewer.extents.getCenter(new Vector3());\n const extentsSize = this.viewer.extents.getBoundingSphere(new Sphere()).radius;\n\n const upY = new Vector3(0, 1, 0);\n const frontY = new Vector3(0, 0, -1);\n\n const up = new Vector3().copy(this.viewer.camera.up);\n const quaternion = new Quaternion().setFromUnitVectors(upY, up);\n const front = new Vector3().copy(frontY).applyQuaternion(quaternion).negate();\n\n this.directionalLight.position\n .copy(up)\n .applyAxisAngle(front, (-Math.PI * 30) / 180)\n .multiplyScalar(extentsSize * 2)\n .add(extentsCenter);\n this.directionalLight.target.position.copy(extentsCenter);\n\n this.frontLight.position\n .copy(front)\n .multiplyScalar(extentsSize * 2)\n .add(extentsCenter);\n this.frontLight.target.position.copy(extentsCenter);\n\n this.hemisphereLight.position\n .copy(front)\n .multiplyScalar(extentsSize * 3)\n .add(extentsCenter);\n\n this.viewer.scene.add(this.ambientLight);\n this.viewer.scene.add(this.directionalLight);\n this.viewer.scene.add(this.frontLight);\n this.viewer.scene.add(this.hemisphereLight);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class RenderLoopComponent implements IComponent {\n protected viewer: Viewer;\n protected requestId: number;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.animate();\n }\n\n dispose() {\n cancelAnimationFrame(this.requestId);\n }\n\n animate = (time = 0) => {\n this.requestId = requestAnimationFrame(this.animate);\n\n this.viewer.render(time);\n this.viewer.emitEvent({ type: \"animate\", time });\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ResizeCanvasComponent implements IComponent {\n protected viewer: Viewer;\n protected resizeObserver: ResizeObserver;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.resizeObserver = new ResizeObserver(this.resizeViewer);\n this.resizeObserver.observe(viewer.canvas.parentElement);\n }\n\n dispose() {\n this.resizeObserver.disconnect();\n }\n\n resizeViewer = (entries: ResizeObserverEntry[]) => {\n const { width, height } = entries[0].contentRect;\n\n if (!width || !height) return; // <- invisible viewer, or viewer with parent removed\n\n this.viewer.setSize(width, height);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { LineSegmentsGeometry } from \"three/examples/jsm/lines/LineSegmentsGeometry.js\";\n\nexport class HighlighterUtils {\n static isBreak(positions: Float32Array, i: number) {\n return (\n isNaN(positions[i]) ||\n isNaN(positions[i + 1]) ||\n isNaN(positions[i + 2]) ||\n positions[i] === Infinity ||\n positions[i] === -Infinity ||\n positions[i + 1] === Infinity ||\n positions[i + 1] === -Infinity ||\n positions[i + 2] === Infinity ||\n positions[i + 2] === -Infinity\n );\n }\n\n static fromIndexedLine(positions: Float32Array, indices: number[]) {\n const lineGeometry = new LineSegmentsGeometry();\n const segments = [];\n\n for (let i = 0; i < indices.length; i += 2) {\n const idx1 = indices[i] * 3;\n const idx2 = indices[i + 1] * 3;\n\n if (indices[i] === -1 || indices[i + 1] === -1) {\n continue;\n }\n\n segments.push(\n positions[idx1],\n positions[idx1 + 1],\n positions[idx1 + 2],\n positions[idx2],\n positions[idx2 + 1],\n positions[idx2 + 2]\n );\n }\n\n if (segments.length === 0) return null;\n\n lineGeometry.setPositions(segments);\n return lineGeometry;\n }\n\n static fromNonIndexedLine(positions: Float32Array, isLineSegments: boolean) {\n const lineGeometry = new LineSegmentsGeometry();\n const segments = [];\n\n if (isLineSegments) {\n for (let i = 0; i < positions.length; i += 6) {\n if (i + 5 >= positions.length) break;\n\n if (HighlighterUtils.isBreak(positions, i) || HighlighterUtils.isBreak(positions, i + 3)) continue;\n\n segments.push(\n positions[i],\n positions[i + 1],\n positions[i + 2],\n positions[i + 3],\n positions[i + 4],\n positions[i + 5]\n );\n }\n } else {\n let lastValidIndex = -1;\n\n for (let i = 0; i < positions.length; i += 3) {\n if (HighlighterUtils.isBreak(positions, i)) {\n lastValidIndex = -1;\n continue;\n }\n\n if (lastValidIndex !== -1) {\n segments.push(\n positions[lastValidIndex],\n positions[lastValidIndex + 1],\n positions[lastValidIndex + 2],\n positions[i],\n positions[i + 1],\n positions[i + 2]\n );\n }\n lastValidIndex = i;\n }\n }\n\n if (segments.length === 0) return null;\n\n lineGeometry.setPositions(segments);\n return lineGeometry;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport {\n EdgesGeometry,\n LineBasicMaterial,\n MeshPhongMaterial,\n Object3D,\n RGBAFormat,\n UnsignedByteType,\n Vector2,\n WebGLRenderTarget,\n} from \"three\";\nimport { LineSegmentsGeometry } from \"three/examples/jsm/lines/LineSegmentsGeometry.js\";\nimport { Wireframe } from \"three/examples/jsm/lines/Wireframe.js\";\nimport { LineMaterial } from \"three/examples/jsm/lines/LineMaterial.js\";\n\nimport { IComponent, ResizeEvent } from \"@inweb/viewer-core\";\nimport { Viewer } from \"../Viewer\";\nimport { HighlighterUtils } from \"./HighlighterUtils\";\n\nexport class HighlighterComponent implements IComponent {\n protected viewer: Viewer;\n public renderTarget: WebGLRenderTarget;\n public facesMaterial: MeshPhongMaterial;\n public edgesMaterial: LineMaterial;\n public lineMaterial: LineBasicMaterial;\n public lineGlowMaterial: LineMaterial;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n const gl2 = viewer.canvas.getContext(\"webgl2\");\n if (gl2) {\n const size = viewer.renderer.getSize(new Vector2());\n this.renderTarget = new WebGLRenderTarget(size.x, size.y, {\n format: RGBAFormat,\n stencilBuffer: false,\n samples: 4,\n type: UnsignedByteType,\n });\n }\n\n this.viewer.addEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.addEventListener(\"optionschange\", this.optionsChange);\n this.viewer.addEventListener(\"resize\", this.viewerResize);\n\n this.geometryEnd();\n }\n\n dispose() {\n this.viewer.removeEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.removeEventListener(\"optionschange\", this.optionsChange);\n this.viewer.removeEventListener(\"resize\", this.viewerResize);\n }\n\n highlight(objects: Object3D | Object3D[]) {\n const { edgesVisibility } = this.viewer.options;\n\n if (!Array.isArray(objects)) objects = [objects];\n if (!objects.length) return;\n\n objects\n .filter((object) => !object.userData.isEdge) // <- filtering server generated edges\n .forEach((object: any) => {\n if (object.isHighlighted) return;\n\n if (object.isLine || object.isLineSegments) {\n const positions = object.geometry.attributes.position.array;\n const indices = object.geometry.index ? object.geometry.index.array : null;\n const lineGeometry = indices\n ? HighlighterUtils.fromIndexedLine(positions, indices)\n : HighlighterUtils.fromNonIndexedLine(positions, object.isLineSegments);\n\n const wireframe = new Wireframe(lineGeometry, this.lineGlowMaterial);\n wireframe.position.copy(object.position);\n wireframe.rotation.copy(object.rotation);\n wireframe.scale.copy(object.scale);\n wireframe.visible = edgesVisibility;\n\n object.parent.add(wireframe);\n object.userData.highlightWireframe = wireframe;\n\n object.userData.originalMaterial = object.material;\n object.material = this.lineMaterial;\n object.isHighlighted = true;\n } else if (object.isMesh) {\n const edgesGeometry = new EdgesGeometry(object.geometry, 89);\n const lineGeometry = new LineSegmentsGeometry().fromEdgesGeometry(edgesGeometry);\n\n const wireframe = new Wireframe(lineGeometry, this.edgesMaterial);\n wireframe.position.copy(object.position);\n wireframe.rotation.copy(object.rotation);\n wireframe.scale.copy(object.scale);\n wireframe.visible = edgesVisibility;\n\n object.parent.add(wireframe);\n object.userData.highlightWireframe = wireframe;\n\n object.userData.originalMaterial = object.material;\n object.material = this.facesMaterial;\n object.isHighlighted = true;\n }\n });\n }\n\n unhighlight(objects: Object3D | Object3D[]) {\n if (!Array.isArray(objects)) objects = [objects];\n if (!objects.length) return;\n\n objects.forEach((object: any) => {\n if (!object.isHighlighted) return;\n\n object.isHighlighted = false;\n object.material = object.userData.originalMaterial;\n object.userData.highlightWireframe.removeFromParent();\n\n delete object.userData.originalMaterial;\n delete object.userData.highlightWireframe;\n });\n }\n\n geometryEnd = () => {\n this.facesMaterial = new MeshPhongMaterial({\n transparent: true,\n specular: 0x222222,\n shininess: 10,\n reflectivity: 0.05,\n polygonOffset: true,\n polygonOffsetFactor: 1,\n polygonOffsetUnits: 1,\n });\n\n this.edgesMaterial = new LineMaterial({\n linewidth: 1.5,\n resolution: new Vector2(window.innerWidth, window.innerHeight),\n });\n\n this.lineMaterial = new LineBasicMaterial({\n transparent: true,\n depthTest: true,\n depthWrite: true,\n });\n\n this.lineGlowMaterial = new LineMaterial({\n linewidth: 1.5,\n transparent: true,\n opacity: 0.8,\n resolution: new Vector2(window.innerWidth, window.innerHeight),\n });\n\n this.syncHighlightColors();\n };\n\n optionsChange = () => {\n this.syncHighlightColors();\n this.viewer.update();\n };\n\n syncHighlightColors() {\n const { facesColor, facesTransparancy, facesOverlap } = this.viewer.options;\n const { edgesColor, edgesVisibility, edgesOverlap } = this.viewer.options;\n\n this.facesMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);\n this.facesMaterial.opacity = (255 - facesTransparancy) / 255;\n this.facesMaterial.depthTest = !facesOverlap;\n this.facesMaterial.depthWrite = !facesOverlap;\n\n this.edgesMaterial.color.setRGB(edgesColor.r / 255, edgesColor.g / 255, edgesColor.b / 255);\n this.edgesMaterial.depthTest = !edgesOverlap;\n this.edgesMaterial.depthWrite = !edgesOverlap;\n\n this.lineMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);\n\n this.lineGlowMaterial.color.setRGB(edgesColor.r / 255, edgesColor.g / 255, edgesColor.b / 255);\n this.lineGlowMaterial.depthTest = !edgesOverlap;\n this.lineGlowMaterial.depthWrite = !edgesOverlap;\n\n this.viewer.selected.forEach((selected) => {\n const wireframe = selected.userData.highlightWireframe;\n if (wireframe) wireframe.visible = edgesVisibility;\n });\n }\n\n viewerResize(event: ResizeEvent) {\n this.renderTarget?.setSize(event.width, event.height);\n this.edgesMaterial?.resolution.set(event.width, event.height);\n this.lineGlowMaterial?.resolution.set(event.width, event.height);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Intersection, Object3D, Raycaster, Vector2 } from \"three\";\n\nimport type { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport type { IModelImpl } from \"../models/IModelImpl\";\nimport type { HighlighterComponent } from \"./HighlighterComponent\";\n\nexport class SelectionComponent implements IComponent {\n protected viewer: Viewer;\n protected raycaster: Raycaster;\n protected downPosition: Vector2;\n protected highlighter: HighlighterComponent;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.raycaster = new Raycaster();\n this.downPosition = new Vector2();\n\n this.viewer.addEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.addEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.addEventListener(\"dblclick\", this.onDoubleClick);\n this.viewer.addEventListener(\"initialize\", this.initHighlighter);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.removeEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.removeEventListener(\"dblclick\", this.onDoubleClick);\n this.viewer.removeEventListener(\"initialize\", this.initHighlighter);\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (!event.isPrimary || event.button !== 0) return;\n\n this.getMousePosition(event, this.downPosition);\n };\n\n onPointerUp = (event: PointerEvent) => {\n if (!event.isPrimary) return;\n\n const upPosition = this.getMousePosition(event, new Vector2());\n if (upPosition.distanceTo(this.downPosition) !== 0) return;\n\n let intersections = [];\n this.viewer.models.forEach((model) => {\n const objects = model.getVisibleObjects();\n const intersects = this.getPointerIntersects(upPosition, objects);\n if (intersects.length > 0) intersections.push({ ...intersects[0], model });\n });\n intersections = intersections.sort((a, b) => a.distance - b.distance);\n\n if (!event.shiftKey) this.clearSelection();\n\n if (intersections.length > 0) {\n const model = intersections[0].model;\n const handles = model.getHandlesByObjects(intersections[0].object);\n const objects = model.getObjectsByHandles(handles);\n\n if (!event.shiftKey) this.select(objects, model);\n else this.toggleSelection(objects, model);\n }\n\n this.viewer.update();\n this.viewer.emitEvent({ type: \"select\", data: undefined, handles: this.viewer.getSelected() });\n };\n\n onDoubleClick = (event: MouseEvent) => {\n if (event.button !== 0) return;\n\n this.viewer.executeCommand(\"zoomToSelected\");\n };\n\n getMousePosition(event: MouseEvent, target: Vector2): Vector2 {\n return target.set(event.clientX, event.clientY);\n }\n\n getPointerIntersects(mouse: Vector2, objects: Object3D[]): Array<Intersection<Object3D>> {\n const rect = this.viewer.canvas.getBoundingClientRect();\n const x = ((mouse.x - rect.left) / rect.width) * 2 - 1;\n const y = (-(mouse.y - rect.top) / rect.height) * 2 + 1;\n\n const coords = new Vector2(x, y);\n this.raycaster.setFromCamera(coords, this.viewer.camera);\n\n this.raycaster.params = {\n Mesh: {},\n Line: { threshold: 0.05 },\n Line2: { threshold: 0.05 },\n LOD: {},\n Points: { threshold: 0.01 },\n Sprite: {},\n };\n\n let intersects = this.raycaster.intersectObjects(objects, false);\n\n (this.viewer.renderer.clippingPlanes || []).forEach((plane) => {\n intersects = intersects.filter((intersect) => plane.distanceToPoint(intersect.point) >= 0);\n });\n\n return intersects;\n }\n\n select(objects: Object3D | Object3D[], model?: IModelImpl) {\n if (!model) {\n this.viewer.models.forEach((model) => this.select(objects, model));\n return;\n }\n\n if (!Array.isArray(objects)) objects = [objects];\n if (!objects.length) return;\n\n model.showOriginalObjects(objects);\n this.highlighter.highlight(objects);\n\n objects.forEach((object: any) => this.viewer.selected.push(object));\n objects.forEach((object: any) => (object.isSelected = true));\n }\n\n deselect(objects: Object3D | Object3D[], model?: IModelImpl) {\n if (!model) {\n this.viewer.models.forEach((model) => this.select(objects, model));\n return;\n }\n\n if (!Array.isArray(objects)) objects = [objects];\n if (!objects.length) return;\n\n this.highlighter.unhighlight(objects);\n model.hideOriginalObjects(objects);\n\n this.viewer.selected = this.viewer.selected.filter((x) => !objects.includes(x));\n objects.forEach((object: any) => (object.isSelected = false));\n }\n\n toggleSelection(objects: Object3D | Object3D[], model?: IModelImpl) {\n if (!Array.isArray(objects)) objects = [objects];\n if (!objects.length) return;\n\n if ((objects[0] as any).isSelected) this.deselect(objects, model);\n else this.select(objects, model);\n }\n\n clearSelection() {\n if (!this.viewer.selected.length) return;\n\n this.highlighter.unhighlight(this.viewer.selected);\n this.viewer.models.forEach((model) => model.hideOriginalObjects(this.viewer.selected));\n\n this.viewer.selected.forEach((object: any) => (object.isSelected = false));\n this.viewer.selected.length = 0;\n }\n\n initHighlighter = () => {\n this.highlighter = this.viewer.getComponent(\"HighlighterComponent\") as HighlighterComponent;\n };\n}\n","import {\n Camera,\n CylinderGeometry,\n CanvasTexture,\n Color,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n OrthographicCamera,\n Sprite,\n SpriteMaterial,\n SRGBColorSpace,\n Vector4,\n WebGLRenderer,\n} from \"three\";\n\nexport class WCSHelper extends Object3D {\n private camera: Camera;\n private orthoCamera: OrthographicCamera;\n public size: number;\n\n constructor(camera: Camera) {\n super();\n\n this.camera = camera;\n this.size = 160;\n\n this.orthoCamera = new OrthographicCamera(-2, 2, 2, -2, 0, 4);\n this.orthoCamera.position.set(0, 0, 2);\n\n const matRed = new MeshBasicMaterial({ toneMapped: false, color: \"#dd0000\" });\n const matGreen = new MeshBasicMaterial({ toneMapped: false, color: \"#00dd00\" });\n const matBlue = new MeshBasicMaterial({ toneMapped: false, color: \"#0000dd\" });\n\n const spriteRed = this.getSpriteMaterial(matRed.color, \"X\");\n const spriteGreen = this.getSpriteMaterial(matGreen.color, \"Y\");\n const spriteBlue = this.getSpriteMaterial(matBlue.color, \"Z\");\n\n const lineGeometry = new CylinderGeometry(0.01, 0.01, 1, 3);\n lineGeometry.translate(0, 0.5, 0);\n\n const arrowGeometry = new CylinderGeometry(0, 0.1, 0.25, 12);\n arrowGeometry.translate(0, 0.625, 0);\n\n const axesMap = {\n X: [\n [new Mesh(arrowGeometry, matRed), [0.5, 0, 0], [0, 0, -Math.PI / 2]],\n [new Mesh(lineGeometry, matRed), [0, 0, 0], [0, 0, -Math.PI / 2]],\n [new Sprite(spriteRed), [1.55, 0, 0]],\n ],\n Y: [\n [new Mesh(arrowGeometry, matGreen), [0, 0.5, 0], null],\n [new Mesh(lineGeometry, matGreen), null, null],\n [new Sprite(spriteGreen), [0, 1.55, 0]],\n ],\n Z: [\n [new Mesh(arrowGeometry, matBlue), [0, 0, 0.5], [Math.PI / 2, 0, 0]],\n [new Mesh(lineGeometry, matBlue), null, [Math.PI / 2, 0, 0]],\n [new Sprite(spriteBlue), [0, 0, 1.55]],\n ],\n };\n\n Object.keys(axesMap).forEach((key) => {\n axesMap[key].forEach((objects: any) => {\n const object = objects[0];\n const position = objects[1];\n const rotation = objects[2];\n\n object.name = key;\n if (position) object.position.set(position[0], position[1], position[2]);\n if (rotation) object.rotation.set(rotation[0], rotation[1], rotation[2]);\n object.updateMatrixWorld();\n\n this.add(object);\n });\n });\n }\n\n dispose() {\n this.traverse((object: any) => {\n if (object.geometry) object.geometry.dispose();\n if (object.material) object.material.dispose();\n });\n }\n\n getSpriteMaterial(color: Color, text: string) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 64;\n canvas.height = 64;\n\n const context = canvas.getContext(\"2d\");\n context.clearRect(0, 0, 64, 64);\n context.font = \"24px Arial\";\n context.textAlign = \"center\";\n context.fillStyle = color.getStyle();\n context.fillText(text, 32, 41);\n\n const texture = new CanvasTexture(canvas);\n texture.colorSpace = SRGBColorSpace;\n\n return new SpriteMaterial({ map: texture, toneMapped: false });\n }\n\n render(renderer: WebGLRenderer) {\n this.quaternion.copy(this.camera.quaternion).invert();\n this.updateMatrixWorld();\n\n const oldAutoClear = renderer.autoClear;\n const oldClippingPlanes = renderer.clippingPlanes;\n const oldViewport = renderer.getViewport(new Vector4());\n\n renderer.autoClear = false;\n renderer.clippingPlanes = [];\n renderer.setViewport(this.position.x, this.position.y, this.size, this.size);\n renderer.clearDepth();\n renderer.render(this, this.orthoCamera);\n\n renderer.setViewport(oldViewport);\n renderer.clippingPlanes = oldClippingPlanes;\n renderer.autoClear = oldAutoClear;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport { WCSHelper } from \"../helpers/WCSHelper\";\n\nexport class WCSHelperComponent implements IComponent {\n private wcsHelper: WCSHelper;\n private viewer: Viewer;\n\n constructor(viewer: Viewer) {\n this.wcsHelper = new WCSHelper(viewer.camera);\n this.viewer = viewer;\n this.viewer.addEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.addEventListener(\"drawviewpoint\", this.geometryEnd);\n this.viewer.addEventListener(\"render\", this.viewerRender);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"databasechunk\", this.geometryEnd);\n this.viewer.removeEventListener(\"drawviewpoint\", this.geometryEnd);\n this.viewer.removeEventListener(\"render\", this.viewerRender);\n this.wcsHelper.dispose();\n }\n\n geometryEnd = () => {\n this.wcsHelper.dispose();\n this.wcsHelper = new WCSHelper(this.viewer.camera);\n };\n\n viewerRender = () => {\n if (!this.viewer.options.showWCS) return;\n\n this.wcsHelper.render(this.viewer.renderer);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\n// ===================== AI-CODE-FILE ======================\n// Source: Claude Sonnet 4\n// Date: 2025-09-10\n// Reviewer: vitaly.ivanov@opendesign.com\n// Issue: CLOUD-5835\n// Notes: Originally AI-generated, modified manually 2025-09-11\n// =========================================================\n\nimport { IComponent } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport { Vector3 } from \"three\";\n\nexport class ResetComponent implements IComponent {\n private viewer: Viewer;\n private savedCameraPosition: any = null;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.viewer.addEventListener(\"databasechunk\", this.onDatabaseChunk);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"databasechunk\", this.onDatabaseChunk);\n }\n\n onDatabaseChunk = () => {\n this.savedCameraPosition = {\n position: this.viewer.camera.position.clone(),\n up: this.viewer.camera.up.clone(),\n direction: this.viewer.camera.getWorldDirection(new Vector3()),\n };\n };\n\n resetCameraPosition() {\n if (this.savedCameraPosition) {\n this.viewer.camera.position.copy(this.savedCameraPosition.position);\n this.viewer.camera.up.copy(this.savedCameraPosition.up);\n this.viewer.camera.lookAt(this.savedCameraPosition.position.clone().add(this.savedCameraPosition.direction));\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IComponentsRegistry, componentsRegistry } from \"@inweb/viewer-core\";\n\nimport { BackgroundComponent } from \"./BackgroundComponent\";\nimport { CameraComponent } from \"./CameraComponent\";\nimport { ExtentsComponent } from \"./ExtentsComponent\";\nimport { LightComponent } from \"./LightComponent\";\nimport { RenderLoopComponent } from \"./RenderLoopComponent\";\nimport { ResizeCanvasComponent } from \"./ResizeCanvasComponent\";\nimport { HighlighterComponent } from \"./HighlighterComponent\";\nimport { SelectionComponent } from \"./SelectionComponent\";\nimport { WCSHelperComponent } from \"./WCSHelperComponent\";\nimport { ResetComponent } from \"./ResetComponent\";\n\n/**\n * Viewer components registry. Use this registry to register custom components.\n *\n * To implement custom component:\n *\n * 1. Define a component class implements {@link IComponent}.\n * 2. Define a constructor with a `viewer` parameter and add mouse event listeners for the specified viewer.\n * 3. Define the component logic in the event listeners. For example, listen for the `mousedown` event and\n * select objects when the left mouse button is pressed.\n * 4. Override {@link IComponent.dispose} and remove mouse event listeners from the viewer.\n * 5. Register component provider in the components registry by calling the\n * {@link components.registerComponent}.\n *\n * @example Implementing a custom component.\n *\n * ```javascript\n * import { IComponent, components, Viewer } from \"@inweb/viewer-three\";\n *\n * class MyComponent implements IComponent {\n * protected viewer: Viewer;\n *\n * constructor(viewer: Viewer) {\n * this.viewer = viewer;\n * this.viewer.addEventListener(\"mousedown\", this.onMouseDown);\n * }\n *\n * override dispose() {\n * this.viewer.removeEventListener(\"mousedown\", this.onMouseDown);\n * }\n *\n * onMouseDown = (event: PointerEvent) => {\n * // place custom logic here\n * };\n * }\n *\n * components.registerComponent(\"MyComponent\", (viewer): IComponent => new MyComponent(viewer));\n * ```\n */\nexport const components: IComponentsRegistry = componentsRegistry(\"threejs\");\n\n// build-in components\n\ncomponents.registerComponent(\"ExtentsComponent\", (viewer) => new ExtentsComponent(viewer));\ncomponents.registerComponent(\"CameraComponent\", (viewer) => new CameraComponent(viewer));\ncomponents.registerComponent(\"BackgroundComponent\", (viewer) => new BackgroundComponent(viewer));\ncomponents.registerComponent(\"LightComponent\", (viewer) => new LightComponent(viewer));\ncomponents.registerComponent(\"ResizeCanvasComponent\", (viewer) => new ResizeCanvasComponent(viewer));\ncomponents.registerComponent(\"RenderLoopComponent\", (viewer) => new RenderLoopComponent(viewer));\ncomponents.registerComponent(\"HighlighterComponent\", (viewer) => new HighlighterComponent(viewer));\ncomponents.registerComponent(\"SelectionComponent\", (viewer) => new SelectionComponent(viewer));\ncomponents.registerComponent(\"WCSHelperComponent\", (viewer) => new WCSHelperComponent(viewer));\ncomponents.registerComponent(\"ResetComponent\", (viewer) => new ResetComponent(viewer));\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { LoadingManager, LoaderUtils } from \"three\";\n\nexport type GLTFFileSource = string | globalThis.File | ArrayBuffer;\n\nexport type GLTFLoadParams = {\n path?: string;\n externalFiles?: Map<string, GLTFFileSource>;\n crossOrigin?: string;\n requestHeader?: HeadersInit;\n withCredentials?: boolean;\n};\n\nexport class GLTFLoadingManager extends LoadingManager {\n public path = \"\";\n public resourcePath = \"\";\n public fileURL = \"\";\n public dataURLs = new Map();\n\n constructor(file: GLTFFileSource, params: GLTFLoadParams = {}) {\n super();\n\n this.path = params.path || \"\";\n\n const externalFiles = params.externalFiles || new Map();\n\n if (typeof file === \"string\") {\n this.fileURL = file;\n this.resourcePath = LoaderUtils.extractUrlBase(file);\n } else {\n externalFiles.forEach((value, key) => (this.fileURL = value === file ? key : this.fileURL));\n externalFiles.set(this.fileURL, file);\n }\n\n externalFiles.forEach((value, key) => {\n let dataURL: string;\n if (typeof value === \"string\") dataURL = value;\n else dataURL = URL.createObjectURL(new Blob([value]));\n this.dataURLs.set(key, dataURL);\n });\n\n this.setURLModifier((url: string) => {\n const key = decodeURI(url)\n .replace(this.path, \"\")\n .replace(this.resourcePath, \"\")\n .replace(/^(\\.?\\/)/, \"\");\n const dataURL = this.dataURLs.get(key);\n return dataURL ?? url;\n });\n }\n\n dispose() {\n this.dataURLs.forEach(URL.revokeObjectURL);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, Object3D, Vector3 } from \"three\";\nimport { ILoader } from \"@inweb/viewer-core\";\n\nimport { IModelImpl } from \"./IModelImpl\";\nimport { Viewer } from \"../Viewer\";\n\n// Basic model implementation.\n\nexport class ModelImpl implements IModelImpl {\n public handle: string;\n public scene: Object3D;\n public loader: ILoader;\n public viewer: Viewer;\n\n constructor(scene: Object3D) {\n this.handle = \"1\";\n this.scene = scene;\n }\n\n dispose() {\n function disposeMaterial(material: any) {\n // if (material.alphaMap) material.alphaMap.dispose();\n // if (material.anisotropyMap) material.anisotropyMap.dispose();\n // if (material.aoMap) material.aoMap.dispose();\n // if (material.bumpMap) material.bumpMap.dispose();\n // if (material.clearcoatMap) material.clearcoatMap.dispose();\n // if (material.clearcoatNormalMap) material.clearcoatNormalMap.dispose();\n // if (material.clearcoatRoughnessMap) material.clearcoatRoughnessMap.dispose();\n // if (material.displacementMap) material.displacementMap.dispose();\n // if (material.emissiveMap) material.emissiveMap.dispose();\n // if (material.gradientMap) material.gradientMap.dispose();\n // if (material.envMap) material.envMap.dispose();\n // if (material.iridescenceMap) material.iridescenceMap.dispose();\n // if (material.lightMap) material.lightMap.dispose();\n // if (material.map) material.map.dispose();\n // if (material.metalnessMap) material.metalnessMap.dispose();\n // if (material.normalMap) material.normalMap.dispose();\n // if (material.roughnessMap) material.roughnessMap.dispose();\n // if (material.sheenColorMap) material.sheenColorMap.dispose();\n // if (material.sheenRoughnessMap) material.sheenRoughnessMap.dispose();\n // if (material.specularMap) material.specularMap.dispose();\n // if (material.thicknessMap) material.thicknessMap.dispose();\n // if (material.transmissionMap) material.transmissionMap.dispose();\n material.dispose();\n }\n\n function disposeMaterials(material: any) {\n const materials = Array.isArray(material) ? material : [material];\n materials.forEach((material: any) => disposeMaterial(material));\n }\n\n function disposeObject(object: any) {\n if (object.geometry) object.geometry.dispose();\n if (object.material) disposeMaterials(object.material);\n }\n\n this.scene.traverse(disposeObject);\n this.scene.clear();\n }\n\n getExtents(target: Box3): Box3 {\n this.scene.traverseVisible((object) => !object.children.length && target.expandByObject(object));\n return target;\n }\n\n getObjects(): Object3D[] {\n const objects = [];\n this.scene.traverse((object) => objects.push(object));\n return objects;\n }\n\n getVisibleObjects(): Object3D[] {\n const objects = [];\n this.scene.traverseVisible((object) => objects.push(object));\n return objects;\n }\n\n hasObject(object: Object3D): boolean {\n while (object) {\n if (object === this.scene) return true;\n object = object.parent;\n }\n return false;\n }\n\n getOwnObjects(objects: Object3D | Object3D[]): Object3D[] {\n if (!Array.isArray(objects)) objects = [objects];\n return objects.filter((object) => this.hasObject(object));\n }\n\n getObjectsByHandles(handles: string | string[]): Object3D[] {\n const handleSet = new Set(handles);\n const objects = [];\n this.scene.traverse((object) => handleSet.has(object.userData.handle) && objects.push(object));\n return objects;\n }\n\n getHandlesByObjects(objects: Object3D | Object3D[]): string[] {\n if (!Array.isArray(objects)) objects = [objects];\n const handlesSet = new Set<string>();\n this.getOwnObjects(objects).forEach((object) => handlesSet.add(object.userData.handle));\n return Array.from(handlesSet);\n }\n\n hideObjects(objects: Object3D | Object3D[]): this {\n if (!Array.isArray(objects)) objects = [objects];\n this.getOwnObjects(objects).forEach((object) => (object.visible = false));\n return this;\n }\n\n hideAllObjects(): this {\n return this.isolateObjects([]);\n }\n\n isolateObjects(objects: Object3D | Object3D[]): this {\n if (!Array.isArray(objects)) objects = [objects];\n const visibleSet = new Set(objects);\n this.getOwnObjects(objects).forEach((object) => object.traverseAncestors((parent) => visibleSet.add(parent)));\n this.scene.traverse((object) => (object.visible = visibleSet.has(object)));\n return this;\n }\n\n showObjects(objects: Object3D | Object3D[]): this {\n if (!Array.isArray(objects)) objects = [objects];\n this.getOwnObjects(objects).forEach((object) => {\n object.visible = true;\n object.traverseAncestors((parent) => (parent.visible = true));\n });\n return this;\n }\n\n showAllObjects(): this {\n this.scene.traverse((object) => (object.visible = true));\n return this;\n }\n\n showOriginalObjects(objects: Object3D | Object3D[]): this {\n return this;\n }\n\n hideOriginalObjects(objects: Object3D | Object3D[]): this {\n return this;\n }\n\n explode(scale = 0, coeff = 4): this {\n function calcExplodeDepth(object: Object3D, depth: number): number {\n let res = depth;\n object.children.forEach((x: Object3D) => {\n const objectDepth = calcExplodeDepth(x, depth + 1);\n if (res < objectDepth) res = objectDepth;\n });\n\n object.userData.originalPosition = object.position.clone();\n object.userData.originalCenter = new Box3().setFromObject(object).getCenter(new Vector3());\n object.userData.isExplodeLocked = depth > 2 && object.children.length === 0;\n\n return res;\n }\n\n scale /= 100;\n\n if (!this.scene.userData.explodeDepth) this.scene.userData.explodeDepth = calcExplodeDepth(this.scene, 1);\n const maxDepth = this.scene.userData.explodeDepth;\n\n const scaledExplodeDepth = scale * maxDepth + 1;\n const explodeDepth = 0 | scaledExplodeDepth;\n const currentSegmentFraction = scaledExplodeDepth - explodeDepth;\n\n function explodeObject(object: Object3D, depth: number) {\n object.position.copy(object.userData.originalPosition);\n\n if (depth > 0 && depth <= explodeDepth && !object.userData.isExplodeLocked) {\n let objectScale = scale * coeff;\n if (depth === explodeDepth) objectScale *= currentSegmentFraction;\n\n const parentCenter = object.parent.userData.originalCenter;\n const objectCenter = object.userData.originalCenter;\n const objectOffset = objectCenter.clone().sub(parentCenter).multiplyScalar(objectScale);\n\n object.position.add(objectOffset);\n }\n\n object.children.forEach((x) => explodeObject(x, depth + 1));\n }\n\n explodeObject(this.scene, 0);\n this.scene.updateMatrixWorld();\n\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { Loader } from \"@inweb/viewer-core\";\n\nimport { Viewer } from \"../Viewer\";\nimport { GLTFLoadingManager, GLTFLoadParams } from \"./GLTFLoadingManager\";\nimport { ModelImpl } from \"../models/ModelImpl\";\n\nexport class GLTFFileLoader extends Loader {\n public viewer: Viewer;\n\n constructor(viewer: Viewer) {\n super();\n this.viewer = viewer;\n }\n\n override isSupport(file: any, format?: string): boolean {\n return (\n (typeof file === \"string\" || file instanceof globalThis.File || file instanceof ArrayBuffer) &&\n /(gltf|glb)$/i.test(format)\n );\n }\n\n override async load(file: any, format?: string, params?: GLTFLoadParams): Promise<this> {\n const manager = new GLTFLoadingManager(file, params);\n\n const loader = new GLTFLoader(manager);\n loader.setPath(manager.path);\n loader.setCrossOrigin(params.crossOrigin || loader.crossOrigin);\n loader.setWithCredentials(params.withCredentials || loader.withCredentials);\n\n const progress = (event: ProgressEvent) => {\n const { lengthComputable, loaded, total } = event;\n const progress = lengthComputable ? loaded / total : 1;\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file });\n };\n\n const gltf = await loader.loadAsync(manager.fileURL, progress);\n if (!this.viewer.scene) return this;\n\n const modelImpl = new ModelImpl(gltf.scene);\n modelImpl.loader = this;\n modelImpl.viewer = this.viewer;\n\n this.viewer.scene.add(gltf.scene);\n this.viewer.models.push(modelImpl);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n this.viewer.update();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: gltf.scene, file });\n\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, Object3D } from \"three\";\n\nimport { ModelImpl } from \"../../models/ModelImpl\";\nimport { DynamicGltfLoader } from \"./DynamicGltfLoader.js\";\n\n// Dynamic model implementation.\n\nexport class DynamicModelImpl extends ModelImpl {\n public gltfLoader: DynamicGltfLoader;\n public modelId: number;\n\n override getExtents(target: Box3): Box3 {\n return target.union(this.gltfLoader.getTotalGeometryExtent());\n }\n\n override getObjects(): Object3D[] {\n const objects = [];\n this.gltfLoader.originalObjects.forEach((object: Object3D) => {\n objects.push(object);\n });\n return objects;\n }\n\n override getVisibleObjects(): Object3D[] {\n return this.gltfLoader.getOriginalObjectForSelect();\n }\n\n override hasObject(object: any): boolean {\n return this.gltfLoader.originalObjects.has(object);\n }\n\n override getObjectsByHandles(handles: string | string[]): Object3D[] {\n const handlesSet = new Set(handles);\n const objects = [];\n handlesSet.forEach((handle) => {\n const handle2 = `${this.modelId}_${handle}`; // <- props fix: Dynamic Loader uses handle with structure ID prefix\n const handles = this.gltfLoader.handleToObjects.get(handle2) || [];\n objects.push(...Array.from(handles));\n });\n return objects;\n }\n\n override getHandlesByObjects(objects: Object3D | Object3D[]): string[] {\n const handles = super.getHandlesByObjects(objects);\n return handles.map((x) => x.split(\"_\").pop()); // <- props fix: remove structure ID prefix by the Dynamic Loader\n }\n\n override hideObjects(objects: Object3D | Object3D[]): this {\n const handles = super.getHandlesByObjects(objects);\n this.gltfLoader.hideObjects(handles);\n return this;\n }\n\n override isolateObjects(objects: Object3D | Object3D[]): this {\n const handles = super.getHandlesByObjects(objects);\n this.gltfLoader.isolateObjects(new Set(handles));\n return this;\n }\n\n override showObjects(objects: Object3D | Object3D[]): this {\n const handles = super.getHandlesByObjects(objects);\n this.gltfLoader.showObjects(handles);\n return this;\n }\n\n override showAllObjects(): this {\n this.gltfLoader.showAllHiddenObjects();\n return this;\n }\n\n override showOriginalObjects(objects: Object3D | Object3D[]): this {\n this.gltfLoader.showOriginalObjects(objects);\n return this;\n }\n\n override hideOriginalObjects(objects: Object3D | Object3D[]): this {\n this.gltfLoader.hideOriginalObjects(objects);\n return this;\n }\n}\n","import {\n TextureLoader,\n BufferAttribute,\n Color,\n DoubleSide,\n MeshPhongMaterial,\n PointsMaterial,\n LineBasicMaterial,\n} from \"three\";\n\nexport const GL_COMPONENT_TYPES = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array,\n};\n\nexport const GL_CONSTANTS = {\n FLOAT: 5126,\n //FLOAT_MAT2: 35674,\n FLOAT_MAT3: 35675,\n FLOAT_MAT4: 35676,\n FLOAT_VEC2: 35664,\n FLOAT_VEC3: 35665,\n FLOAT_VEC4: 35666,\n LINEAR: 9729,\n REPEAT: 10497,\n SAMPLER_2D: 35678,\n POINTS: 0,\n LINES: 1,\n LINE_LOOP: 2,\n LINE_STRIP: 3,\n TRIANGLES: 4,\n TRIANGLE_STRIP: 5,\n TRIANGLE_FAN: 6,\n UNSIGNED_BYTE: 5121,\n UNSIGNED_SHORT: 5123,\n};\n\nconst MAX_GAP = 128 * 1024; // 128 KB\nconst MAX_CHUNK = 30 * 1024 * 1024; // 100 MB\n\nexport class GltfStructure {\n constructor(id, loadController) {\n this.id = `${id}`;\n this.json = null;\n this.baseUrl = \"\";\n this.loadController = loadController;\n this.loader = null;\n this.batchDelay = 10;\n this.maxBatchSize = 5 * 1024 * 1024;\n this.maxRangesPerRequest = 512;\n this.pendingRequests = [];\n this.batchTimeout = null;\n this.textureLoader = new TextureLoader();\n this.materials = new Map();\n this.textureCache = new Map();\n this.materialCache = new Map();\n }\n\n async initialize(loader) {\n this.json = await this.loadController.loadJson();\n this.baseUrl = await this.loadController.baseUrl();\n this.loader = loader;\n }\n\n clear() {\n this.json = null;\n this.baseUrl = \"\";\n this.loadController = null;\n this.pendingRequests = [];\n if (this.batchTimeout) {\n clearTimeout(this.batchTimeout);\n this.batchTimeout = null;\n }\n\n this.disposeMaterials();\n this.textureCache.clear();\n this.materials.clear();\n\n this.activeChunkLoads = 0;\n this.chunkQueue = [];\n }\n\n getJson() {\n return this.json;\n }\n\n scheduleRequest(request) {\n return new Promise((resolve, reject) => {\n this.pendingRequests.push({\n ...request,\n _resolve: resolve,\n _reject: reject,\n });\n });\n }\n\n async flushBufferRequests() {\n if (!this.pendingRequests || this.pendingRequests.length === 0) return;\n const requests = [...this.pendingRequests];\n this.pendingRequests = [];\n\n requests.sort((a, b) => a.offset - b.offset);\n const mergedRanges = [];\n let current = {\n start: requests[0].offset,\n end: requests[0].offset + requests[0].length,\n requests: [requests[0]],\n };\n for (let i = 1; i < requests.length; i++) {\n const req = requests[i];\n const gap = req.offset - current.end;\n const newEnd = Math.max(current.end, req.offset + req.length);\n const projectedSize = newEnd - current.start;\n if (gap <= MAX_GAP && projectedSize <= MAX_CHUNK) {\n current.end = newEnd;\n current.requests.push(req);\n } else {\n mergedRanges.push(current);\n current = {\n start: req.offset,\n end: req.offset + req.length,\n requests: [req],\n };\n }\n }\n mergedRanges.push(current);\n const finalRanges = [];\n for (const range of mergedRanges) {\n let { start, end, requests } = range;\n while (end - start > MAX_CHUNK) {\n let splitIdx = 0;\n for (let i = 0; i < requests.length; i++) {\n if (requests[i].offset + requests[i].length - start > MAX_CHUNK) {\n break;\n }\n splitIdx = i;\n }\n const chunkRequests = requests.slice(0, splitIdx + 1);\n const chunkEnd =\n chunkRequests[chunkRequests.length - 1].offset + chunkRequests[chunkRequests.length - 1].length;\n finalRanges.push({\n start,\n end: chunkEnd,\n requests: chunkRequests,\n });\n requests = requests.slice(splitIdx + 1);\n if (requests.length > 0) {\n start = requests[0].offset;\n end = requests[0].offset + requests[0].length;\n for (let i = 1; i < requests.length; i++) {\n end = Math.max(end, requests[i].offset + requests[i].length);\n }\n }\n }\n if (requests.length > 0) {\n finalRanges.push({ start, end, requests });\n }\n }\n\n const promises = finalRanges.map(async (range, index) => {\n await this.loader.waitForChunkSlot();\n\n try {\n const length = range.end - range.start;\n const buffer = await this.loadController.loadBinaryData([{ offset: range.start, length }]);\n\n for (const req of range.requests) {\n const relOffset = req.offset - range.start;\n try {\n req._resolve({ buffer, relOffset, length: req.length });\n } catch (e) {\n req._reject(e);\n }\n }\n } catch (error) {\n for (const req of range.requests) {\n req._reject(error);\n }\n console.warn(`Failed to load chunk ${index + 1}/${finalRanges.length} (${range.start}-${range.end}):`, error);\n } finally {\n this.loader.releaseChunkSlot();\n }\n });\n\n await Promise.all(promises);\n\n this.pendingRequests = [];\n }\n\n getBufferView(byteOffset, byteLength, componentType) {\n return this.scheduleRequest({\n offset: byteOffset,\n length: byteLength,\n componentType,\n });\n }\n\n createTypedArray(buffer, offset, length, componentType) {\n try {\n if (!buffer || !(buffer instanceof ArrayBuffer)) {\n throw new Error(\"Invalid buffer\");\n }\n\n let elementSize;\n switch (componentType) {\n case 5120:\n case 5121:\n elementSize = 1;\n break; // BYTE, UNSIGNED_BYTE\n case 5122:\n case 5123:\n elementSize = 2;\n break; // SHORT, UNSIGNED_SHORT\n case 5125:\n case 5126:\n elementSize = 4;\n break; // UNSIGNED_INT, FLOAT\n default:\n throw new Error(`Unsupported component type: ${componentType}`);\n }\n\n const numElements = length / elementSize;\n if (!Number.isInteger(numElements)) {\n throw new Error(`Invalid length ${length} for component type ${componentType}`);\n }\n\n if (length > buffer.byteLength) {\n throw new Error(`Buffer too small: need ${length} bytes, but buffer is ${buffer.byteLength} bytes`);\n }\n\n const ArrayType = GL_COMPONENT_TYPES[componentType];\n return new ArrayType(buffer, offset, numElements);\n } catch (error) {\n if (error.name !== \"AbortError\") {\n console.error(\"Error creating typed array:\", {\n bufferSize: buffer?.byteLength,\n offset,\n length,\n componentType,\n error,\n });\n }\n throw error;\n }\n }\n\n async createBufferAttribute(accessorIndex) {\n if (!this.json) {\n throw new Error(\"No GLTF structure loaded\");\n }\n\n const gltf = this.json;\n const accessor = gltf.accessors[accessorIndex];\n const bufferView = gltf.bufferViews[accessor.bufferView];\n\n try {\n const byteOffset = (bufferView.byteOffset || 0) + (accessor.byteOffset || 0);\n const components = this.getNumComponents(accessor.type);\n const count = accessor.count;\n const byteLength = count * components * this.getComponentSize(accessor.componentType);\n\n const array = await this.getBufferView(byteOffset, byteLength, accessor.componentType);\n\n const attribute = new BufferAttribute(array, components);\n\n if (accessor.min !== undefined) attribute.min = accessor.min;\n if (accessor.max !== undefined) attribute.max = accessor.max;\n\n return attribute;\n } catch (error) {\n if (error.name !== \"AbortError\") {\n console.error(\"Error creating buffer attribute:\", {\n error,\n accessor,\n bufferView,\n });\n }\n\n throw error;\n }\n }\n\n getComponentSize(componentType) {\n switch (componentType) {\n case 5120: // BYTE\n case 5121: // UNSIGNED_BYTE\n return 1;\n case 5122: // SHORT\n case 5123: // UNSIGNED_SHORT\n return 2;\n case 5125: // UNSIGNED_INT\n case 5126: // FLOAT\n return 4;\n default:\n throw new Error(`Unknown component type: ${componentType}`);\n }\n }\n\n getNumComponents(type) {\n switch (type) {\n case \"SCALAR\":\n return 1;\n case \"VEC2\":\n return 2;\n case \"VEC3\":\n return 3;\n case \"VEC4\":\n return 4;\n case \"MAT2\":\n return 4;\n case \"MAT3\":\n return 9;\n case \"MAT4\":\n return 16;\n default:\n throw new Error(`Unknown type: ${type}`);\n }\n }\n\n async loadTextures() {\n if (!this.json.textures) return;\n\n const loadTexture = async (imageIndex) => {\n const image = this.json.images[imageIndex];\n\n if (image.uri) {\n if (image.uri.startsWith(\"data:\")) {\n return await this.textureLoader.loadAsync(image.uri);\n } else {\n const fullUrl = this.baseUrl + image.uri;\n return await this.textureLoader.loadAsync(fullUrl);\n }\n } else if (image.bufferView !== undefined) {\n const bufferView = this.json.bufferViews[image.bufferView];\n const array = await this.getBufferView(bufferView.byteOffset || 0, bufferView.byteLength, 5121);\n const blob = new Blob([array], { type: image.mimeType });\n const url = URL.createObjectURL(blob);\n const texture = await this.textureLoader.loadAsync(url);\n URL.revokeObjectURL(url);\n texture.flipY = false;\n return texture;\n }\n };\n\n const texturePromises = [];\n for (let i = 0; i < this.json.textures.length; i++) {\n texturePromises.push(\n loadTexture(this.json.textures[i].source).then((texture) => this.textureCache.set(i, texture))\n );\n }\n await Promise.all(texturePromises);\n }\n\n loadMaterials() {\n if (!this.json.materials) return this.materials;\n\n for (let i = 0; i < this.json.materials.length; i++) {\n const materialDef = this.json.materials[i];\n\n const materialCacheKey = `material_${i}`;\n this.materialCache.set(materialCacheKey, {\n mesh: this.createMaterial(materialDef, GL_CONSTANTS.TRIANGLES),\n points: this.createMaterial(materialDef, GL_CONSTANTS.POINTS),\n lines: this.createMaterial(materialDef, GL_CONSTANTS.LINES),\n });\n\n this.materialCache.get(materialCacheKey).mesh.name = materialDef.name;\n this.materialCache.get(materialCacheKey).points.name = materialDef.name;\n this.materialCache.get(materialCacheKey).lines.name = materialDef.name;\n\n this.materials.set(i, this.materialCache.get(materialCacheKey).mesh);\n }\n return this.materials;\n }\n\n createMaterial(materialDef, primitiveMode = undefined) {\n const params = {};\n\n if (materialDef.pbrMetallicRoughness) {\n const pbr = materialDef.pbrMetallicRoughness;\n if (pbr.baseColorFactor) {\n params.color = new Color().fromArray(pbr.baseColorFactor);\n params.opacity = pbr.baseColorFactor[3];\n if (params.opacity < 1.0) params.transparent = true;\n }\n if (pbr.baseColorTexture) {\n params.map = this.textureCache.get(pbr.baseColorTexture.index);\n }\n }\n\n if (materialDef.emissiveFactor) {\n params.emissive = new Color().fromArray(materialDef.emissiveFactor);\n }\n\n if (materialDef.alphaMode === \"BLEND\") {\n params.transparent = true;\n }\n\n if (materialDef.doubleSided) {\n params.side = DoubleSide;\n }\n let material;\n\n if (primitiveMode === GL_CONSTANTS.POINTS) {\n params.sizeAttenuation = false;\n material = new PointsMaterial(params);\n material.sizeAttenuation = false;\n } else if (\n primitiveMode === GL_CONSTANTS.LINES ||\n primitiveMode === GL_CONSTANTS.LINE_STRIP ||\n primitiveMode === GL_CONSTANTS.LINE_LOOP\n ) {\n material = new LineBasicMaterial(params);\n } else {\n params.specular = 0x222222;\n params.shininess = 10;\n params.reflectivity = 0.05;\n params.polygonOffset = true;\n params.polygonOffsetFactor = 1;\n params.polygonOffsetUnits = 1;\n\n if (materialDef.normalTexture) {\n params.normalMap = this.textureCache.get(materialDef.normalTexture.index);\n }\n\n material = new MeshPhongMaterial(params);\n }\n\n return material;\n }\n\n getCachedMaterial(materialIndex, primitiveMode) {\n const materialCacheKey = `material_${materialIndex}`;\n const materialCache = this.materialCache.get(materialCacheKey);\n\n if (materialCache) {\n if (primitiveMode === GL_CONSTANTS.POINTS) {\n return materialCache.points;\n } else if (\n primitiveMode === GL_CONSTANTS.LINES ||\n primitiveMode === GL_CONSTANTS.LINE_STRIP ||\n primitiveMode === GL_CONSTANTS.LINE_LOOP\n ) {\n return materialCache.lines;\n } else {\n return materialCache.mesh;\n }\n }\n\n return null;\n }\n\n disposeMaterials() {\n this.textureCache.forEach((texture) => texture.dispose());\n this.textureCache.clear();\n\n this.materials.forEach((material) => {\n if (material.map) material.map.dispose();\n if (material.lightMap) material.lightMap.dispose();\n if (material.bumpMap) material.bumpMap.dispose();\n if (material.normalMap) material.normalMap.dispose();\n if (material.specularMap) material.specularMap.dispose();\n if (material.envMap) material.envMap.dispose();\n if (material.aoMap) material.aoMap.dispose();\n if (material.metalnessMap) material.metalnessMap.dispose();\n if (material.roughnessMap) material.roughnessMap.dispose();\n if (material.emissiveMap) material.emissiveMap.dispose();\n material.dispose();\n });\n this.materials.clear();\n\n this.materialCache.forEach((materialCache) => {\n if (materialCache.mesh) {\n if (materialCache.mesh.map) materialCache.mesh.map.dispose();\n if (materialCache.mesh.lightMap) materialCache.mesh.lightMap.dispose();\n if (materialCache.mesh.bumpMap) materialCache.mesh.bumpMap.dispose();\n if (materialCache.mesh.normalMap) materialCache.mesh.normalMap.dispose();\n if (materialCache.mesh.specularMap) materialCache.mesh.specularMap.dispose();\n if (materialCache.mesh.envMap) materialCache.mesh.envMap.dispose();\n if (materialCache.mesh.aoMap) materialCache.mesh.aoMap.dispose();\n if (materialCache.mesh.metalnessMap) materialCache.mesh.metalnessMap.dispose();\n if (materialCache.mesh.roughnessMap) materialCache.mesh.roughnessMap.dispose();\n if (materialCache.mesh.emissiveMap) materialCache.mesh.emissiveMap.dispose();\n materialCache.mesh.dispose();\n }\n\n if (materialCache.points) {\n if (materialCache.points.map) materialCache.points.map.dispose();\n materialCache.points.dispose();\n }\n\n if (materialCache.lines) {\n if (materialCache.lines.map) materialCache.lines.map.dispose();\n materialCache.lines.dispose();\n }\n });\n this.materialCache.clear();\n }\n\n estimateNodeSize(meshIndex) {\n if (!this.json.meshes) return 0;\n\n const meshDef = this.json.meshes[meshIndex];\n if (!meshDef || !meshDef.primitives) return 0;\n\n let totalSize = 0;\n for (const primitive of meshDef.primitives) {\n if (primitive.attributes) {\n for (const [, accessorIndex] of Object.entries(primitive.attributes)) {\n if (accessorIndex === undefined) continue;\n\n const accessor = this.json.accessors[accessorIndex];\n if (!accessor) continue;\n\n const numComponents = this.getNumComponents(accessor.type);\n const bytesPerComponent = this.getComponentSize(accessor.componentType);\n totalSize += accessor.count * numComponents * bytesPerComponent;\n }\n }\n\n if (primitive.indices !== undefined) {\n const accessor = this.json.accessors[primitive.indices];\n if (accessor) {\n const bytesPerComponent = this.getComponentSize(accessor.componentType);\n totalSize += accessor.count * bytesPerComponent;\n }\n }\n }\n\n return totalSize;\n }\n}\n","import {\n BufferGeometry,\n PointsMaterial,\n Points,\n Mesh,\n TriangleStripDrawMode,\n TriangleFanDrawMode,\n LineSegments,\n Line,\n LineLoop,\n Group,\n Vector3,\n Quaternion,\n Matrix4,\n Box3,\n MeshPhongMaterial,\n Color,\n MathUtils,\n PerspectiveCamera,\n OrthographicCamera,\n DoubleSide,\n NormalBlending,\n BufferAttribute,\n LineBasicMaterial,\n} from \"three\";\nimport { GL_CONSTANTS } from \"./GltfStructure.js\";\nimport { mergeGeometries } from \"three/examples/jsm/utils/BufferGeometryUtils.js\";\n\n//#AI-GENERATED using Gemini 2.5 Pro, Claude-4-sonnet\n//#Reviewed and adapted by dborysov@opendesign.com\n\nexport class DynamicGltfLoader {\n constructor(camera, scene, renderer) {\n this.camera = camera;\n this.scene = scene;\n this.renderer = renderer;\n\n this.eventHandlers = {\n geometryprogress: [],\n databasechunk: [],\n geometryend: [],\n geometryerror: [],\n update: [],\n geometrymemory: [],\n };\n\n this.loadDistance = 100;\n this.unloadDistance = 150;\n this.checkInterval = 1000;\n\n this.nodes = new Map();\n this.loadedMeshes = new Map();\n this.nodesToLoad = [];\n this.edgeNodes = [];\n this.structures = [];\n this.structureRoots = new Map();\n\n this.memoryLimit = this.getAvailableMemory();\n this.loadedGeometrySize = 0;\n this.geometryCache = new Map();\n this.materialCache = new Map();\n this.textureCache = new Map();\n this.currentMemoryUsage = 0;\n\n this.updateMemoryIndicator();\n\n this.loadedMaterials = new Map();\n this.abortController = new AbortController();\n\n this.batchSize = 10000;\n this.frameDelay = 0;\n\n this.graphicsObjectLimit = 10000;\n this.totalLoadedObjects = 0;\n\n this.lastUpdateTime = 0;\n this.updateInterval = 1000;\n\n this.handleToObjects = new Map();\n\n this.originalObjects = new Set();\n this.originalObjectsToSelection = new Set();\n\n this.optimizedOriginalMap = new Map();\n this.mergedMesh = new Set();\n this.mergedLines = new Set();\n this.mergedLineSegments = new Set();\n this.mergedPoints = new Set();\n\n this.isolatedObjects = [];\n //!!window.WebGL2RenderingContext && this.renderer.getContext() instanceof WebGL2RenderingContext\n this.useVAO = false;\n this.visibleEdges = true;\n\n this.handleToOptimizedObjects = new Map();\n\n this.hiddenHandles = new Set();\n this.newOptimizedObjects = new Set();\n this.oldOptimizeObjects = new Set();\n\n this.maxConcurrentChunks = 8;\n this.activeChunkLoads = 0;\n this.chunkQueue = [];\n\n // GPU-accelerated visibility system\n this.objectIdToIndex = new Map(); // objectId -> index\n this.maxObjectId = 0; // Maximum object ID\n this.objectVisibility = new Float32Array(); // Array of visibility flags for each object\n\n // Chunk loading configuration\n this.maxConcurrentChunks = 6; // Default limit\n\n // Merged geometry tracking\n this.mergedObjectMap = new Map(); // objectId -> {mergedObject, startIndex, endIndex, vertexCount}\n this.mergedGeometryVisibility = new Map(); // mergedObject -> visibility array\n }\n\n setVisibleEdges(visible) {\n this.visibleEdges = visible;\n }\n\n getAvailableMemory() {\n let memoryLimit = 6 * 1024 * 1024 * 1024;\n try {\n if (navigator.deviceMemory) {\n memoryLimit = navigator.deviceMemory * 1024 * 1024 * 1024;\n } else if (performance.memory) {\n const jsHeapSizeLimit = performance.memory.jsHeapSizeLimit;\n if (jsHeapSizeLimit) {\n memoryLimit = Math.min(memoryLimit, jsHeapSizeLimit);\n }\n }\n\n memoryLimit = Math.min(memoryLimit, 16 * 1024 * 1024 * 1024);\n memoryLimit = Math.max(memoryLimit, 2 * 1024 * 1024 * 1024);\n\n console.log(`Available memory set to ${Math.round(memoryLimit / (1024 * 1024 * 1024))}GB`);\n } catch (error) {\n console.warn(\"Error detecting available memory:\", error);\n }\n\n return memoryLimit / 3;\n }\n\n getAbortController() {\n return this.abortController;\n }\n\n abortLoading() {\n this.abortController.abort();\n }\n\n updateMemoryIndicator() {\n this.dispatchEvent(\"geometrymemory\", {\n currentUsage: this.currentMemoryUsage,\n limit: this.memoryLimit,\n });\n }\n\n setMemoryLimit(bytesLimit) {\n // this.memoryLimit = bytesLimit;\n //this.updateMemoryIndicator();\n // console.log(`Memory limit set to ${Math.round(bytesLimit / (1024 * 1024))}MB`);\n }\n\n estimateGeometrySize(nodeGroup) {\n let totalSize = 0;\n nodeGroup.traverse((child) => {\n if (child.geometry) {\n if (this.abortController.signal.aborted) {\n throw new DOMException(\"Loading aborted\", \"AbortError\");\n }\n const geometry = child.geometry;\n\n if (geometry.attributes) {\n Object.values(geometry.attributes).forEach((attribute) => {\n if (attribute && attribute.array) {\n totalSize += attribute.array.byteLength;\n }\n });\n }\n\n if (geometry.index && geometry.index.array) {\n totalSize += geometry.index.array.byteLength;\n }\n }\n });\n\n return totalSize;\n }\n\n recalculateScene() {\n const geometries = [];\n this.scene.traverse((object) => {\n if (this.abortController.signal.aborted) {\n throw new DOMException(\"Loading aborted\", \"AbortError\");\n }\n\n if (object.geometry && !this.geometryCache.has(object.geometry.uuid)) {\n const size = this.estimateGeometrySize(object);\n this.geometryCache.set(object.geometry.uuid, size);\n geometries.push({\n object,\n size,\n distance: object.position.distanceTo(this.camera.position),\n });\n }\n });\n\n if (this.abortController.signal.aborted) {\n throw new DOMException(\"Loading aborted\", \"AbortError\");\n }\n\n geometries.sort((a, b) => b.distance - a.distance);\n\n let currentMemoryUsage = 0;\n for (const geo of geometries) {\n currentMemoryUsage += geo.size;\n }\n\n if (currentMemoryUsage > this.memoryLimit) {\n console.log(`Memory usage (${Math.round(currentMemoryUsage / (1024 * 1024))}MB) exceeds limit`);\n\n for (const geo of geometries) {\n if (currentMemoryUsage <= this.memoryLimit) break;\n\n if (this.abortController.signal.aborted) {\n throw new DOMException(\"Loading aborted\", \"AbortError\");\n }\n\n const object = geo.object;\n if (object.geometry) {\n currentMemoryUsage -= geo.size;\n this.geometryCache.delete(object.geometry.uuid);\n object.geometry.dispose();\n object.visible = false;\n }\n }\n }\n\n this.currentMemoryUsage = currentMemoryUsage;\n this.updateMemoryIndicator();\n\n console.log(`Final memory usage: ${Math.round(currentMemoryUsage / (1024 * 1024))}MB`);\n }\n\n async loadNode(nodeId, onLoadFinishCb) {\n const node = this.nodes.get(nodeId);\n if (!node || node.loaded || node.loading) return;\n\n node.loading = true;\n const meshDef = node.structure.getJson().meshes[node.meshIndex];\n\n try {\n const bufferRequests = [];\n const primitiveReqMap = new Map();\n for (let primIdx = 0; primIdx < meshDef.primitives.length; primIdx++) {\n const primitive = meshDef.primitives[primIdx];\n const reqs = [];\n\n if (primitive.attributes.POSITION !== undefined) {\n const accessorIndex = primitive.attributes.POSITION;\n const accessor = node.structure.json.accessors[accessorIndex];\n const bufferView = node.structure.json.bufferViews[accessor.bufferView];\n const byteOffset = (bufferView.byteOffset || 0) + (accessor.byteOffset || 0);\n const components = node.structure.getNumComponents(accessor.type);\n const count = accessor.count;\n const byteLength = count * components * node.structure.getComponentSize(accessor.componentType);\n reqs.push({\n offset: byteOffset,\n length: byteLength,\n componentType: accessor.componentType,\n accessorIndex,\n type: \"position\",\n primIdx,\n });\n }\n\n if (primitive.attributes.NORMAL !== undefined) {\n const accessorIndex = primitive.attributes.NORMAL;\n const accessor = node.structure.json.accessors[accessorIndex];\n const bufferView = node.structure.json.bufferViews[accessor.bufferView];\n const byteOffset = (bufferView.byteOffset || 0) + (accessor.byteOffset || 0);\n const components = node.structure.getNumComponents(accessor.type);\n const count = accessor.count;\n const byteLength = count * components * node.structure.getComponentSize(accessor.componentType);\n reqs.push({\n offset: byteOffset,\n length: byteLength,\n componentType: accessor.componentType,\n accessorIndex,\n type: \"normal\",\n primIdx,\n });\n }\n\n if (primitive.attributes.TEXCOORD_0 !== undefined) {\n const accessorIndex = primitive.attributes.TEXCOORD_0;\n const accessor = node.structure.json.accessors[accessorIndex];\n const bufferView = node.structure.json.bufferViews[accessor.bufferView];\n const byteOffset = (bufferView.byteOffset || 0) + (accessor.byteOffset || 0);\n const components = node.structure.getNumComponents(accessor.type);\n const count = accessor.count;\n const byteLength = count * components * node.structure.getComponentSize(accessor.componentType);\n reqs.push({\n offset: byteOffset,\n length: byteLength,\n componentType: accessor.componentType,\n accessorIndex,\n type: \"uv\",\n primIdx,\n });\n }\n\n if (primitive.indices !== undefined) {\n const accessorIndex = primitive.indices;\n const accessor = node.structure.json.accessors[accessorIndex];\n const bufferView = node.structure.json.bufferViews[accessor.bufferView];\n const byteOffset = (bufferView.byteOffset || 0) + (accessor.byteOffset || 0);\n const components = node.structure.getNumComponents(accessor.type);\n const count = accessor.count;\n const byteLength = count * components * node.structure.getComponentSize(accessor.componentType);\n reqs.push({\n offset: byteOffset,\n length: byteLength,\n componentType: accessor.componentType,\n accessorIndex,\n type: \"index\",\n primIdx,\n });\n }\n primitiveReqMap.set(primIdx, reqs);\n bufferRequests.push(...reqs);\n }\n\n if (bufferRequests.length === 0) {\n node.loaded = true;\n node.loading = false;\n return;\n }\n bufferRequests.sort((a, b) => a.offset - b.offset);\n const minOffset = bufferRequests[0].offset;\n const maxOffset = Math.max(...bufferRequests.map((r) => r.offset + r.length));\n const totalLength = maxOffset - minOffset;\n\n const { buffer, relOffset: baseRelOffset } = await node.structure.scheduleRequest({\n offset: minOffset,\n length: totalLength,\n componentType: null,\n });\n\n for (const req of bufferRequests) {\n const relOffset = req.offset - minOffset;\n req.data = node.structure.createTypedArray(buffer, baseRelOffset + relOffset, req.length, req.componentType);\n }\n\n for (let primIdx = 0; primIdx < meshDef.primitives.length; primIdx++) {\n const primitive = meshDef.primitives[primIdx];\n const geometry = new BufferGeometry();\n const reqs = primitiveReqMap.get(primIdx);\n\n if (primitive.attributes.POSITION !== undefined) {\n const req = reqs.find((r) => r.type === \"position\" && r.accessorIndex === primitive.attributes.POSITION);\n const accessor = node.structure.json.accessors[primitive.attributes.POSITION];\n const components = node.structure.getNumComponents(accessor.type);\n geometry.setAttribute(\"position\", new BufferAttribute(req.data, components));\n }\n\n if (primitive.attributes.NORMAL !== undefined) {\n const req = reqs.find((r) => r.type === \"normal\" && r.accessorIndex === primitive.attributes.NORMAL);\n const accessor = node.structure.json.accessors[primitive.attributes.NORMAL];\n const components = node.structure.getNumComponents(accessor.type);\n geometry.setAttribute(\"normal\", new BufferAttribute(req.data, components));\n }\n\n if (primitive.attributes.TEXCOORD_0 !== undefined) {\n const req = reqs.find((r) => r.type === \"uv\" && r.accessorIndex === primitive.attributes.TEXCOORD_0);\n const accessor = node.structure.json.accessors[primitive.attributes.TEXCOORD_0];\n const components = node.structure.getNumComponents(accessor.type);\n geometry.setAttribute(\"uv\", new BufferAttribute(req.data, components));\n }\n\n if (primitive.indices !== undefined) {\n const req = reqs.find((r) => r.type === \"index\" && r.accessorIndex === primitive.indices);\n geometry.setIndex(new BufferAttribute(req.data, 1));\n }\n\n let material;\n if (primitive.material !== undefined) {\n material = node.structure.getCachedMaterial(primitive.material, primitive.mode);\n\n if (!material) {\n const materialDef = node.structure.json.materials[primitive.material];\n material = node.structure.createMaterial(materialDef, primitive.mode);\n }\n } else {\n material = this.createDefaultMaterial(primitive.mode);\n }\n\n let mesh;\n if (primitive.mode === GL_CONSTANTS.POINTS) {\n mesh = new Points(geometry, material);\n } else if (\n primitive.mode === GL_CONSTANTS.TRIANGLES ||\n primitive.mode === GL_CONSTANTS.TRIANGLE_STRIP ||\n primitive.mode === GL_CONSTANTS.TRIANGLE_FAN ||\n primitive.mode === undefined\n ) {\n mesh = new Mesh(geometry, material);\n if (primitive.mode === GL_CONSTANTS.TRIANGLE_STRIP) {\n mesh.drawMode = TriangleStripDrawMode;\n } else if (primitive.mode === GL_CONSTANTS.TRIANGLE_FAN) {\n mesh.drawMode = TriangleFanDrawMode;\n }\n } else if (primitive.mode === GL_CONSTANTS.LINES) {\n mesh = new LineSegments(geometry, material);\n } else if (primitive.mode === GL_CONSTANTS.LINE_STRIP) {\n mesh = new Line(geometry, material);\n } else if (primitive.mode === GL_CONSTANTS.LINE_LOOP) {\n mesh = new LineLoop(geometry, material);\n }\n if (node.extras) {\n mesh.userData = { ...mesh.userData, ...node.extras };\n }\n if (meshDef.extras) {\n mesh.userData = { ...mesh.userData, ...meshDef.extras };\n }\n if (primitive.extras) {\n mesh.userData = { ...mesh.userData, ...primitive.extras };\n }\n if (node.handle) {\n mesh.userData.handle = node.handle;\n } else {\n mesh.userData.handle = `${node.structure.id}_${mesh.userData.handle}`;\n }\n if (mesh.material.name === \"edges\") {\n mesh.userData.isEdge = true;\n } else {\n mesh.userData.isEdge = false;\n }\n this.registerObjectWithHandle(mesh, mesh.userData.handle);\n mesh.position.copy(node.position);\n if (!geometry.attributes.normal) {\n geometry.computeVertexNormals();\n }\n if (material.aoMap && geometry.attributes.uv) {\n geometry.setAttribute(\"uv2\", geometry.attributes.uv);\n }\n if (node.group) {\n node.group.add(mesh);\n } else {\n this.scene.add(mesh);\n }\n node.object = mesh;\n this.totalLoadedObjects++;\n mesh.visible = this.totalLoadedObjects < this.graphicsObjectLimit;\n }\n node.loaded = true;\n node.loading = false;\n const geometrySize = this.estimateGeometrySize(node.object);\n this.geometryCache.set(node.object.uuid, geometrySize);\n this.currentMemoryUsage += geometrySize;\n if (onLoadFinishCb) {\n onLoadFinishCb();\n }\n } catch (error) {\n if (error.name !== \"AbortError\") {\n console.error(`Error loading node ${nodeId}:`, error);\n }\n node.loading = false;\n }\n }\n\n unloadNode(nodeId) {\n const node = this.nodes.get(nodeId);\n if (!node || !node.loaded) return;\n\n if (node.object) {\n if (node.object.parent) {\n node.object.parent.remove(node.object);\n } else {\n this.scene.remove(node.object);\n }\n\n node.object.traverse((child) => {\n if (child.geometry) {\n const geometrySize = this.geometryCache.get(child.geometry.uuid) || 0;\n this.currentMemoryUsage -= geometrySize;\n this.geometryCache.delete(child.geometry.uuid);\n child.geometry.dispose();\n }\n });\n\n node.object = null;\n node.loaded = false;\n this.updateMemoryIndicator();\n console.log(`Unloaded node: ${nodeId}`);\n }\n }\n\n checkDistances() {\n const cameraPosition = this.camera.position;\n\n this.nodes.forEach((node, nodeId) => {\n const distance = cameraPosition.distanceTo(node.position);\n\n if (node.loaded) {\n if (distance > this.unloadDistance) {\n this.unloadNode(nodeId);\n }\n } else if (!node.loading) {\n if (distance < this.loadDistance) {\n this.loadNode(nodeId);\n }\n }\n });\n }\n\n async loadStructure(structures) {\n this.clear();\n\n const structureArray = Array.isArray(structures) ? structures : [structures];\n\n for (const structure of structureArray) {\n await structure.initialize(this);\n this.structures.push(structure);\n }\n\n for (const structure of this.structures) {\n try {\n await structure.loadTextures();\n await structure.loadMaterials();\n } catch (error) {\n console.error(\"Error loading materials:\", error);\n throw error;\n }\n }\n\n await this.processSceneHierarchy();\n }\n\n async processSceneHierarchy() {\n if (this.structures.length === 0) {\n throw new Error(\"No GLTF structures loaded\");\n }\n\n this.nodesToLoad = [];\n\n let estimatedSize = 0;\n\n for (const structure of this.structures) {\n const gltf = structure.getJson();\n\n if (!gltf.scenes || !gltf.scenes.length) {\n console.warn(\"No scenes found in GLTF structure\");\n continue;\n }\n\n estimatedSize += gltf.buffers[0].byteLength;\n\n const rootGroup = new Group();\n rootGroup.name = `structure_${structure.id}_root`;\n this.scene.add(rootGroup);\n this.structureRoots.set(structure.id, rootGroup);\n\n const scene = gltf.scenes[gltf.scene || 0];\n\n for (const nodeIndex of scene.nodes) {\n await this.processNodeHierarchy(structure, nodeIndex, rootGroup);\n }\n }\n\n const ignoreEdges = estimatedSize * 2 > this.memoryLimit;\n\n this.nodesToLoad.sort((a, b) => {\n const nodeA = this.nodes.get(a);\n const nodeB = this.nodes.get(b);\n\n if (!nodeA?.geometryExtents || !nodeB?.geometryExtents) {\n return 0;\n }\n\n const sizeA = nodeA.geometryExtents.getSize(new Vector3());\n const sizeB = nodeB.geometryExtents.getSize(new Vector3());\n const volumeA = sizeA.x * sizeA.y * sizeA.z;\n const volumeB = sizeB.x * sizeB.y * sizeB.z;\n\n return volumeB - volumeA;\n });\n\n if (!ignoreEdges && this.visibleEdges) {\n this.nodesToLoad.push(...this.edgeNodes);\n }\n\n this.dispatchEvent(\"databasechunk\", {\n totalNodes: this.nodesToLoad.length,\n structures: this.structures.map((s) => ({\n id: s.id,\n nodeCount: this.nodesToLoad.filter((nodeId) => nodeId.startsWith(s.id)).length,\n })),\n });\n }\n\n async processNodeHierarchy(structure, nodeId, parentGroup) {\n const nodeDef = structure.json.nodes[nodeId];\n let nodeGroup = null;\n\n let handle = null;\n if (nodeDef.extras?.handle) {\n handle = `${structure.id}_${nodeDef.extras.handle}`;\n }\n\n if (nodeDef.camera !== undefined) {\n const camera = this.loadCamera(structure, nodeDef.camera, nodeDef);\n if (nodeDef.extras) {\n camera.userData = { ...camera.userData, ...nodeDef.extras };\n }\n this.scene.add(camera);\n return;\n }\n\n const needsGroup = this.needsGroupForNode(structure, nodeDef);\n\n if (needsGroup) {\n nodeGroup = new Group();\n nodeGroup.name = nodeDef.name || `node_${nodeId}`;\n\n if (nodeDef.extras) {\n nodeGroup.userData = { ...nodeDef.extras };\n if (nodeGroup.userData.handle) {\n nodeGroup.userData.handle = `${structure.id}_${nodeGroup.userData.handle}`;\n }\n }\n\n if (nodeDef.matrix) {\n nodeGroup.matrix.fromArray(nodeDef.matrix);\n nodeGroup.matrixAutoUpdate = false;\n } else if (nodeDef.translation || nodeDef.rotation || nodeDef.scale) {\n const position = nodeDef.translation ? new Vector3().fromArray(nodeDef.translation) : new Vector3();\n const quaternion = nodeDef.rotation ? new Quaternion().fromArray(nodeDef.rotation) : new Quaternion();\n const scale = nodeDef.scale ? new Vector3().fromArray(nodeDef.scale) : new Vector3(1, 1, 1);\n nodeGroup.matrix.compose(position, quaternion, scale);\n nodeGroup.matrixAutoUpdate = false;\n }\n\n if (parentGroup) {\n parentGroup.add(nodeGroup);\n }\n }\n\n if (nodeDef.mesh !== undefined) {\n const nodeMatrix = new Matrix4();\n const uniqueNodeId = `${structure.id}_${nodeId}`;\n const meshDef = structure.json.meshes[nodeDef.mesh];\n const geometryExtents = new Box3();\n\n for (const primitive of meshDef.primitives) {\n const positionAccessor = structure.json.accessors[primitive.attributes.POSITION];\n if (positionAccessor && positionAccessor.min && positionAccessor.max) {\n const primitiveBox = new Box3(\n new Vector3().fromArray(positionAccessor.min),\n new Vector3().fromArray(positionAccessor.max)\n );\n geometryExtents.union(primitiveBox);\n }\n }\n\n let isEdge = false;\n if (meshDef.primitives[0].material !== undefined) {\n const material = structure.json.materials[meshDef.primitives[0].material];\n if (material?.name === \"edges\") {\n isEdge = true;\n }\n }\n\n if (!isEdge) {\n this.nodesToLoad.push(uniqueNodeId);\n } else {\n this.edgeNodes.push(uniqueNodeId);\n }\n\n if (meshDef.extras && meshDef.extras.handle) {\n handle = `${structure.id}_${meshDef.extras.handle}`;\n }\n\n this.nodes.set(uniqueNodeId, {\n position: nodeGroup ? nodeGroup.position.clone() : new Vector3().setFromMatrixPosition(nodeMatrix),\n nodeIndex: nodeId,\n meshIndex: nodeDef.mesh,\n loaded: false,\n loading: false,\n object: null,\n group: nodeGroup || parentGroup,\n structure,\n extras: nodeDef.extras,\n geometryExtents,\n handle,\n });\n }\n\n if (nodeDef.children) {\n for (const childId of nodeDef.children) {\n await this.processNodeHierarchy(structure, childId, nodeGroup || parentGroup);\n }\n }\n\n return nodeGroup;\n }\n\n needsGroupForNode(structure, nodeDef) {\n const hasTransforms = nodeDef.matrix || nodeDef.translation || nodeDef.rotation || nodeDef.scale;\n\n const hasMultiplePrimitives =\n nodeDef.mesh !== undefined && structure.json.meshes[nodeDef.mesh].primitives.length > 1;\n\n return hasTransforms !== undefined || hasMultiplePrimitives;\n }\n\n async processNodes() {\n const nodesToLoad = this.nodesToLoad;\n let loadedCount = 0;\n let lastLoadedCount = 0;\n const totalNodes = nodesToLoad.length;\n\n const loadProgress = async () => {\n loadedCount++;\n if (loadedCount - lastLoadedCount > 1000) {\n lastLoadedCount = loadedCount;\n this.updateMemoryIndicator();\n this.dispatchEvent(\"geometryprogress\", {\n percentage: Math.round((loadedCount / totalNodes) * 100),\n loaded: loadedCount,\n total: totalNodes,\n });\n\n const currentTime = Date.now();\n if (currentTime - this.lastUpdateTime >= this.updateInterval) {\n this.dispatchEvent(\"update\");\n this.lastUpdateTime = currentTime;\n }\n\n await new Promise((resolve) => {\n setTimeout(resolve, 0);\n });\n }\n };\n\n try {\n const loadOperations = [];\n for (const nodeId of nodesToLoad) {\n if (this.abortController.signal.aborted) {\n throw new DOMException(\"Loading aborted\", \"AbortError\");\n }\n\n const estimatedSize = await this.estimateNodeSize(nodeId);\n\n if (this.currentMemoryUsage + estimatedSize > this.memoryLimit) {\n console.log(`Memory limit reached after loading ${loadedCount} nodes`);\n this.dispatchEvent(\"geometryerror\", {\n message: \"Memory limit reached\",\n });\n this.dispatchEvent(\"update\");\n return loadedCount;\n }\n\n loadOperations.push(this.loadNode(nodeId, loadProgress));\n }\n\n for (const structure of this.structures) {\n loadOperations.push(structure.flushBufferRequests());\n }\n\n await Promise.all(loadOperations);\n\n this.dispatchEvent(\"geometryend\", {\n totalLoaded: loadedCount,\n totalNodes,\n });\n\n return loadedCount;\n } catch (error) {\n this.dispatchEvent(\"geometryerror\", { error });\n throw error;\n }\n }\n\n async loadNodes() {\n console.time(\"process nodes\");\n await this.processNodes();\n console.timeEnd(\"process nodes\");\n\n console.time(\"optimize scene\");\n await this.optimizeScene();\n console.timeEnd(\"optimize scene\");\n }\n\n cleanupPartialLoad() {\n this.nodesToLoad.forEach((nodeId) => {\n const node = this.nodes.get(nodeId);\n if (node && node.loading) {\n this.unloadNode(nodeId);\n }\n });\n }\n\n createDefaultMaterial(primitiveMode = undefined) {\n if (primitiveMode === GL_CONSTANTS.POINTS) {\n return new PointsMaterial({\n color: new Color(0x808080),\n size: 0.05,\n sizeAttenuation: false,\n alphaTest: 0.5,\n transparent: true,\n vertexColors: false,\n blending: NormalBlending,\n depthWrite: false,\n depthTest: true,\n });\n } else if (\n primitiveMode === GL_CONSTANTS.LINES ||\n primitiveMode === GL_CONSTANTS.LINE_STRIP ||\n primitiveMode === GL_CONSTANTS.LINE_LOOP\n ) {\n return new LineBasicMaterial({\n color: 0x808080,\n linewidth: 1.0,\n alphaTest: 0.1,\n depthTest: true,\n depthWrite: true,\n transparent: true,\n opacity: 1.0,\n });\n } else {\n return new MeshPhongMaterial({\n color: 0x808080,\n specular: 0x222222,\n shininess: 10,\n side: DoubleSide,\n });\n }\n }\n\n async estimateNodeSize(nodeId) {\n const node = this.nodes.get(nodeId);\n if (!node) return 0;\n return await node.structure.estimateNodeSize(node.meshIndex);\n }\n\n getTotalGeometryExtent() {\n const totalExtent = new Box3();\n\n for (const node of this.nodes.values()) {\n if (!node.geometryExtents) continue;\n\n if (node.object && this.hiddenHandles.has(node.object.userData.handle)) continue;\n\n const transformedBox = node.geometryExtents.clone();\n\n if (node.group && node.group.matrix) {\n transformedBox.applyMatrix4(node.group.matrix);\n\n if (node.group.parent && node.group.parent.matrix) {\n transformedBox.applyMatrix4(node.group.parent.matrix);\n }\n }\n totalExtent.union(transformedBox);\n }\n\n return totalExtent;\n }\n\n loadCamera(structure, cameraIndex, nodeDef) {\n const cameraDef = structure.getJson().cameras[cameraIndex];\n const params = cameraDef[cameraDef.type];\n\n let camera;\n if (cameraDef.type === \"perspective\") {\n camera = new PerspectiveCamera(\n MathUtils.radToDeg(params.yfov),\n params.aspectRatio || 1,\n params.znear || 1,\n params.zfar || 2e6\n );\n } else if (cameraDef.type === \"orthographic\") {\n camera = new OrthographicCamera(\n params.xmag / -2,\n params.xmag / 2,\n params.ymag / 2,\n params.ymag / -2,\n params.znear,\n params.zfar\n );\n }\n\n if (nodeDef.matrix) {\n camera.matrix.fromArray(nodeDef.matrix);\n camera.matrix.decompose(camera.position, camera.quaternion, camera.scale);\n } else {\n if (nodeDef.translation) {\n camera.position.fromArray(nodeDef.translation);\n }\n if (nodeDef.rotation) {\n camera.quaternion.fromArray(nodeDef.rotation);\n }\n if (nodeDef.scale) {\n camera.scale.fromArray(nodeDef.scale);\n }\n }\n\n return camera;\n }\n\n clearNodesToLoad() {\n this.nodesToLoad = [];\n }\n\n removeOptimization() {\n this.originalObjects.forEach((obj) => (obj.visible = true));\n\n const disposeMerged = (obj) => {\n if (obj.parent) {\n obj.parent.remove(obj);\n }\n if (obj.geometry) {\n obj.geometry.dispose();\n }\n };\n\n if (this.structureGroups) {\n for (const group of this.structureGroups.values()) {\n group.meshes.forEach(disposeMerged);\n group.lines.forEach(disposeMerged);\n group.lineSegments.forEach(disposeMerged);\n group.meshes.clear();\n group.lines.clear();\n group.lineSegments.clear();\n }\n }\n this.optimizedOriginalMap.clear();\n this.mergedMesh.clear();\n this.mergedLines.clear();\n this.mergedLineSegments.clear();\n this.originalObjects.clear();\n this.originalObjectsToSelection.clear();\n }\n\n initializeObjectVisibility() {\n if (this.maxObjectId > 0) {\n this.objectVisibility = new Float32Array(this.maxObjectId);\n for (let i = 0; i < this.maxObjectId; i++) {\n this.objectVisibility[i] = 1.0;\n }\n console.log(`Initialized object visibility array: ${this.maxObjectId} objects`);\n }\n }\n\n createVisibilityMaterial(material) {\n // Применяем шейдер напрямую к оригинальному материалу\n material.onBeforeCompile = (shader) => {\n shader.vertexShader = shader.vertexShader.replace(\n \"#include <common>\",\n `\n #include <common>\n attribute float visibility;\n varying float vVisibility;\n `\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include <common>\",\n `\n #include <common>\n varying float vVisibility;\n `\n );\n\n shader.vertexShader = shader.vertexShader.replace(\n \"void main() {\",\n `\n void main() {\n vVisibility = visibility;\n `\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"void main() {\",\n `\n void main() {\n if (vVisibility < 0.5) discard;\n `\n );\n };\n\n // Принудительная перекомпиляция материала\n material.needsUpdate = true;\n\n return material;\n }\n\n clear() {\n this.chunkQueue = [];\n\n this.structures.forEach((structure) => {\n if (structure) {\n structure.clear();\n }\n });\n this.structures = [];\n\n this.nodes.forEach((node) => {\n if (node.object) {\n if (node.object.parent) {\n node.object.parent.remove(node.object);\n }\n if (node.object.geometry) {\n node.object.geometry.dispose();\n }\n if (node.object.material) {\n if (Array.isArray(node.object.material)) {\n node.object.material.forEach((material) => material.dispose());\n } else {\n node.object.material.dispose();\n }\n }\n }\n });\n this.nodes.clear();\n\n // Clear all loaded meshes\n this.loadedMeshes.forEach((mesh) => {\n if (mesh.geometry) mesh.geometry.dispose();\n if (mesh.material) {\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((material) => material.dispose());\n } else {\n mesh.material.dispose();\n }\n }\n });\n this.loadedMeshes.clear();\n\n this.structureRoots.forEach((rootGroup) => {\n if (rootGroup) {\n rootGroup.traverse((child) => {\n if (child.geometry) child.geometry.dispose();\n if (child.material) {\n if (Array.isArray(child.material)) {\n child.material.forEach((material) => material.dispose());\n } else {\n child.material.dispose();\n }\n }\n });\n if (rootGroup.parent) {\n rootGroup.parent.remove(rootGroup);\n }\n }\n });\n this.structureRoots.clear();\n\n this.mergedMesh.forEach((mesh) => {\n if (mesh.geometry) mesh.geometry.dispose();\n if (mesh.material) {\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((material) => material.dispose());\n } else {\n mesh.material.dispose();\n }\n }\n if (mesh.parent) mesh.parent.remove(mesh);\n });\n this.mergedMesh.clear();\n\n this.mergedLines.forEach((line) => {\n if (line.geometry) line.geometry.dispose();\n if (line.material) line.material.dispose();\n if (line.parent) line.parent.remove(line);\n });\n this.mergedLines.clear();\n\n this.mergedLineSegments.forEach((lineSegment) => {\n if (lineSegment.geometry) lineSegment.geometry.dispose();\n if (lineSegment.material) lineSegment.material.dispose();\n if (lineSegment.parent) lineSegment.parent.remove(lineSegment);\n });\n this.mergedLineSegments.clear();\n\n this.mergedPoints.forEach((points) => {\n if (points.geometry) points.geometry.dispose();\n if (points.material) points.material.dispose();\n if (points.parent) points.parent.remove(points);\n });\n this.mergedPoints.clear();\n\n this.geometryCache.clear();\n this.materialCache.clear();\n this.textureCache.clear();\n this.loadedMaterials.clear();\n\n this.nodesToLoad = [];\n this.handleToObjects.clear();\n this.originalObjects.clear();\n this.originalObjectsToSelection.clear();\n this.optimizedOriginalMap.clear();\n this.handleToOptimizedObjects.clear();\n this.hiddenHandles.clear();\n this.newOptimizedObjects.clear();\n this.oldOptimizeObjects.clear();\n this.isolatedObjects = [];\n\n this.totalLoadedObjects = 0;\n this.lastUpdateTime = 0;\n this.currentMemoryUsage = 0;\n this.loadedGeometrySize = 0;\n\n this.abortController = new AbortController();\n this.updateMemoryIndicator();\n\n this.objectIdToIndex.clear();\n this.maxObjectId = 0;\n this.objectVisibility = new Float32Array();\n }\n\n setStructureTransform(structureId, matrix) {\n const rootGroup = this.structureRoots.get(structureId);\n if (rootGroup) {\n rootGroup.matrix.copy(matrix);\n rootGroup.matrix.decompose(rootGroup.position, rootGroup.quaternion, rootGroup.scale);\n return true;\n }\n return false;\n }\n\n getStructureRootGroup(structureId) {\n return this.structureRoots.get(structureId);\n }\n\n addEventListener(event, handler) {\n if (this.eventHandlers[event]) {\n this.eventHandlers[event].push(handler);\n }\n }\n\n removeEventListener(event, handler) {\n if (this.eventHandlers[event]) {\n this.eventHandlers[event] = this.eventHandlers[event].filter((h) => h !== handler);\n }\n }\n\n dispatchEvent(event, data) {\n if (this.eventHandlers[event]) {\n this.eventHandlers[event].forEach((handler) => handler(data));\n }\n }\n\n registerObjectWithHandle(object, handle) {\n if (!handle) return;\n\n const fullHandle = object.userData.handle;\n if (!this.handleToObjects.has(fullHandle)) {\n this.handleToObjects.set(fullHandle, new Set());\n }\n this.handleToObjects.get(fullHandle).add(object);\n\n object.userData.structureId = object.userData.handle.split(\"_\")[0];\n }\n\n getObjectsByHandle(handle) {\n if (!handle) return [];\n return Array.from(this.handleToObjects.get(handle) || []);\n }\n\n getHandlesByObjects(objects) {\n if (!objects.length) return [];\n const handles = new Set();\n objects.forEach((obj) => {\n if (this.originalObjects.has(obj)) handles.add(obj.userData.handle);\n });\n return Array.from(handles);\n }\n\n getMaterialId(material, index) {\n const props = {\n type: material.type,\n color: material.color?.getHex(),\n map: material.map?.uuid,\n transparent: material.transparent,\n opacity: material.opacity,\n side: material.side,\n index: index ? 1 : 0,\n };\n return JSON.stringify(props);\n }\n\n addToMaterialGroup(object, groupsMap, optimizeGroupList) {\n const VERTEX_LIMIT = 100_000;\n const INDEX_LIMIT = 100_000;\n\n const objectGeometryVertexCount = object.geometry.attributes.position.count;\n const objectGeometryIndexCount = object.geometry.index ? object.geometry.index.count : 0;\n\n const material = object.material;\n let materialId = this.getMaterialId(material, object.geometry.index !== null);\n\n let group;\n if (!groupsMap.has(materialId)) {\n group = {\n material,\n objects: [object],\n totalVertices: objectGeometryVertexCount,\n totalIndices: objectGeometryIndexCount,\n };\n groupsMap.set(materialId, group);\n optimizeGroupList.push(group);\n } else {\n group = groupsMap.get(materialId);\n if (\n group.totalVertices + objectGeometryVertexCount > VERTEX_LIMIT ||\n group.totalIndices + objectGeometryIndexCount > INDEX_LIMIT\n ) {\n const newGroup = {\n material,\n objects: [object],\n totalVertices: objectGeometryVertexCount,\n totalIndices: objectGeometryIndexCount,\n };\n materialId = this.getMaterialId(material, object.geometry.index !== null);\n groupsMap.set(materialId, newGroup);\n optimizeGroupList.push(newGroup);\n } else {\n group.objects.push(object);\n group.totalVertices += objectGeometryVertexCount;\n group.totalIndices += objectGeometryIndexCount;\n }\n }\n\n this.originalObjects.add(object);\n }\n\n optimizeScene() {\n this.originalObjects.clear();\n this.originalObjectsToSelection.clear();\n const structureGroups = new Map();\n\n this.scene.traverse((object) => {\n if (object.userData.structureId) {\n const structureId = object.userData.structureId;\n if (!structureGroups.has(structureId)) {\n structureGroups.set(structureId, {\n mapMeshes: new Map(),\n mapLines: new Map(),\n mapLineSegments: new Map(),\n mapPoints: new Map(),\n\n meshes: [],\n lines: [],\n lineSegments: [],\n points: [],\n rootGroup: this.structureRoots.get(structureId),\n });\n }\n\n const group = structureGroups.get(structureId);\n\n if (object instanceof Mesh) {\n this.addToMaterialGroup(object, group.mapMeshes, group.meshes);\n } else if (object instanceof LineSegments) {\n this.addToMaterialGroup(object, group.mapLineSegments, group.lineSegments);\n } else if (object instanceof Line) {\n this.addToMaterialGroup(object, group.mapLines, group.lines);\n } else if (object instanceof Points) {\n this.addToMaterialGroup(object, group.mapPoints, group.points);\n }\n }\n });\n\n for (const group of structureGroups.values()) {\n group.mapMeshes.clear();\n group.mapLines.clear();\n group.mapLineSegments.clear();\n group.mapPoints.clear();\n\n this.mergeMeshGroups(group.meshes, group.rootGroup);\n this.mergeLineGroups(group.lines, group.rootGroup);\n this.mergeLineSegmentGroups(group.lineSegments, group.rootGroup);\n this.mergePointsGroups(group.points, group.rootGroup);\n }\n\n this.originalObjects.forEach((obj) => {\n obj.visible = false;\n if (!(obj instanceof Points) && !obj.userData.isEdge) {\n this.originalObjectsToSelection.add(obj);\n }\n });\n this.initializeObjectVisibility();\n\n console.log(`Optimization complete. Total objects: ${this.maxObjectId}`);\n\n this.dispatchEvent(\"update\");\n }\n\n mergeMeshGroups(materialGroups, rootGroup) {\n for (const group of materialGroups) {\n if (!group.material) {\n console.warn(\"Skipping mesh group with null material\");\n continue;\n }\n\n try {\n const geometries = [];\n const handles = new Set();\n const optimizedObjects = [];\n const objectMapping = new Map();\n let currentVertexOffset = 0;\n\n for (const mesh of group.objects) {\n const geometry = mesh.geometry.clone();\n mesh.updateWorldMatrix(true, false);\n geometry.applyMatrix4(mesh.matrixWorld);\n\n const handle = mesh.userData.handle;\n if (!this.objectIdToIndex.has(handle)) {\n this.objectIdToIndex.set(handle, this.maxObjectId++);\n }\n const objectId = this.objectIdToIndex.get(handle);\n\n const vertexCount = geometry.attributes.position.count;\n const objectIds = new Float32Array(vertexCount);\n for (let i = 0; i < vertexCount; i++) {\n objectIds[i] = objectId;\n }\n geometry.setAttribute(\"objectId\", new BufferAttribute(objectIds, 1));\n\n objectMapping.set(mesh, {\n geometry,\n startVertexIndex: currentVertexOffset,\n vertexCount: geometry.attributes.position.count,\n });\n\n currentVertexOffset += geometry.attributes.position.count;\n geometries.push(geometry);\n\n optimizedObjects.push(mesh);\n handles.add(mesh.userData.handle);\n }\n\n const mergedObjects = [];\n\n if (geometries.length > 0) {\n const mergedGeometry = mergeGeometries(geometries);\n\n // Create visibility attribute\n const totalVertices = mergedGeometry.attributes.position.count;\n const visibilityArray = new Float32Array(totalVertices);\n\n // Initialize all vertices as visible (1.0)\n for (let i = 0; i < totalVertices; i++) {\n visibilityArray[i] = 1.0;\n }\n\n // Add visibility attribute to geometry\n mergedGeometry.setAttribute(\"visibility\", new BufferAttribute(visibilityArray, 1));\n\n if (this.useVAO) {\n this.createVAO(mergedGeometry);\n }\n\n // Create visibility material\n const visibilityMaterial = this.createVisibilityMaterial(group.material);\n\n const mergedMesh = new Mesh(mergedGeometry, visibilityMaterial);\n rootGroup.add(mergedMesh);\n\n this.mergedMesh.add(mergedMesh);\n this.optimizedOriginalMap.set(mergedMesh, optimizedObjects);\n\n // Store object mappings with visibility tracking\n this.mergedObjectMap.set(mergedMesh.uuid, {\n objectMapping,\n visibilityArray,\n totalVertices,\n });\n\n this.mergedGeometryVisibility.set(mergedMesh, visibilityArray);\n\n mergedObjects.push(mergedMesh);\n\n geometries.forEach((geometry) => {\n geometry.dispose();\n });\n }\n\n handles.forEach((handle) => {\n if (this.handleToOptimizedObjects.has(handle)) {\n const existingObjects = this.handleToOptimizedObjects.get(handle);\n existingObjects.push(...mergedObjects);\n this.handleToOptimizedObjects.set(handle, existingObjects);\n } else {\n this.handleToOptimizedObjects.set(handle, mergedObjects);\n }\n });\n } catch (error) {\n console.error(\"Failed to merge meshes for material:\", error);\n group.objects.forEach((mesh) => {\n mesh.visible = true;\n });\n }\n }\n }\n\n mergeLineGroups(materialGroups, rootGroup) {\n for (const group of materialGroups) {\n if (group.objects.length === 0) continue;\n\n if (!group.material) {\n console.warn(\"Skipping line group with null material\");\n continue;\n }\n\n const handles = new Set();\n let totalVertices = 0;\n const objectMapping = new Map();\n let currentVertexOffset = 0;\n\n group.objects.map((line) => {\n handles.add(line.userData.handle);\n totalVertices += line.geometry.attributes.position.count;\n });\n\n const positions = new Float32Array(totalVertices * 3);\n let posOffset = 0;\n\n const indices = [];\n let vertexOffset = 0;\n\n group.objects.forEach((line) => {\n const geometry = line.geometry;\n const positionAttr = geometry.attributes.position;\n const vertexCount = positionAttr.count;\n\n const handle = line.userData.handle;\n if (!this.objectIdToIndex.has(handle)) {\n this.objectIdToIndex.set(handle, this.maxObjectId++);\n }\n // const objectId = this.objectIdToIndex.get(handle);\n\n objectMapping.set(line, {\n startVertexIndex: currentVertexOffset,\n vertexCount,\n });\n currentVertexOffset += vertexCount;\n\n line.updateWorldMatrix(true, false);\n const matrix = line.matrixWorld;\n const vector = new Vector3();\n\n for (let i = 0; i < vertexCount; i++) {\n vector.fromBufferAttribute(positionAttr, i);\n vector.applyMatrix4(matrix);\n positions[posOffset++] = vector.x;\n positions[posOffset++] = vector.y;\n positions[posOffset++] = vector.z;\n }\n\n for (let i = 0; i < vertexCount - 1; i++) {\n indices.push(vertexOffset + i, vertexOffset + i + 1);\n }\n\n vertexOffset += vertexCount;\n });\n\n const geometry = new BufferGeometry();\n geometry.setAttribute(\"position\", new BufferAttribute(positions, 3));\n geometry.setIndex(indices);\n geometry.computeBoundingSphere();\n geometry.computeBoundingBox();\n\n const objectIds = new Float32Array(totalVertices);\n let vertexIndex = 0;\n group.objects.forEach((line) => {\n const vertexCount = line.geometry.attributes.position.count;\n const handle = line.userData.handle;\n const objectId = this.objectIdToIndex.get(handle);\n\n for (let i = 0; i < vertexCount; i++) {\n objectIds[vertexIndex++] = objectId;\n }\n });\n geometry.setAttribute(\"objectId\", new BufferAttribute(objectIds, 1));\n\n const visibilityArray = new Float32Array(totalVertices);\n for (let i = 0; i < totalVertices; i++) {\n visibilityArray[i] = 1.0;\n }\n geometry.setAttribute(\"visibility\", new BufferAttribute(visibilityArray, 1));\n\n const visibilityMaterial = this.createVisibilityMaterial(group.material);\n\n const mergedLine = new LineSegments(geometry, visibilityMaterial);\n const mergedObjects = [mergedLine];\n if (this.useVAO) {\n this.createVAO(mergedLine);\n }\n rootGroup.add(mergedLine);\n this.mergedLines.add(mergedLine);\n this.optimizedOriginalMap.set(mergedLine, group.objects);\n\n this.mergedObjectMap.set(mergedLine.uuid, {\n objectMapping,\n visibilityArray,\n totalVertices,\n });\n\n this.mergedGeometryVisibility.set(mergedLine, visibilityArray);\n\n handles.forEach((handle) => {\n if (this.handleToOptimizedObjects.has(handle)) {\n const existingObjects = this.handleToOptimizedObjects.get(handle);\n existingObjects.push(...mergedObjects);\n this.handleToOptimizedObjects.set(handle, existingObjects);\n } else {\n this.handleToOptimizedObjects.set(handle, mergedObjects);\n }\n });\n }\n }\n\n mergeLineSegmentGroups(materialGroups, rootGroup) {\n for (const group of materialGroups) {\n if (!group.material) {\n console.warn(\"Skipping line segment group with null material\");\n continue;\n }\n\n try {\n const geometries = [];\n const optimizedObjects = [];\n const handles = new Set();\n const objectMapping = new Map();\n let currentVertexOffset = 0;\n\n for (const line of group.objects) {\n const geometry = line.geometry.clone();\n line.updateWorldMatrix(true, false);\n geometry.applyMatrix4(line.matrixWorld);\n\n const handle = line.userData.handle;\n if (!this.objectIdToIndex.has(handle)) {\n this.objectIdToIndex.set(handle, this.maxObjectId++);\n }\n const objectId = this.objectIdToIndex.get(handle);\n const vertexCount = geometry.attributes.position.count;\n const objectIds = new Float32Array(vertexCount);\n for (let i = 0; i < vertexCount; i++) {\n objectIds[i] = objectId;\n }\n geometry.setAttribute(\"objectId\", new BufferAttribute(objectIds, 1));\n\n objectMapping.set(line, {\n geometry,\n startVertexIndex: currentVertexOffset,\n vertexCount: geometry.attributes.position.count,\n });\n\n currentVertexOffset += geometry.attributes.position.count;\n geometries.push(geometry);\n optimizedObjects.push(line);\n handles.add(line.userData.handle);\n }\n\n const mergedObjects = [];\n\n if (geometries.length > 0) {\n const mergedGeometry = mergeGeometries(geometries, false);\n\n const totalVertices = mergedGeometry.attributes.position.count;\n const visibilityArray = new Float32Array(totalVertices);\n\n for (let i = 0; i < totalVertices; i++) {\n visibilityArray[i] = 1.0;\n }\n\n mergedGeometry.setAttribute(\"visibility\", new BufferAttribute(visibilityArray, 1));\n\n const visibilityMaterial = this.createVisibilityMaterial(group.material);\n\n const mergedLine = new LineSegments(mergedGeometry, visibilityMaterial);\n\n if (this.useVAO) {\n this.createVAO(mergedLine);\n }\n\n rootGroup.add(mergedLine);\n this.mergedLineSegments.add(mergedLine);\n this.optimizedOriginalMap.set(mergedLine, optimizedObjects);\n\n this.mergedObjectMap.set(mergedLine.uuid, {\n objectMapping,\n visibilityArray,\n totalVertices,\n });\n\n this.mergedGeometryVisibility.set(mergedLine, visibilityArray);\n\n mergedObjects.push(mergedLine);\n\n geometries.forEach((geometry) => {\n geometry.dispose();\n });\n }\n\n handles.forEach((handle) => {\n if (this.handleToOptimizedObjects.has(handle)) {\n const existingObjects = this.handleToOptimizedObjects.get(handle);\n existingObjects.push(...mergedObjects);\n this.handleToOptimizedObjects.set(handle, existingObjects);\n } else {\n this.handleToOptimizedObjects.set(handle, mergedObjects);\n }\n });\n } catch (error) {\n console.warn(\"Failed to merge line segments for material:\", error);\n group.objects.forEach((line) => {\n line.visible = true;\n });\n }\n }\n }\n\n mergePointsGroups(materialGroups, rootGroup) {\n for (const group of materialGroups) {\n if (!group.material) {\n console.warn(\"Skipping points group with null material\");\n continue;\n }\n\n try {\n const geometries = [];\n const optimizedObjects = [];\n const handles = new Set();\n\n for (const points of group.objects) {\n const geometry = points.geometry.clone();\n points.updateWorldMatrix(true, false);\n geometry.applyMatrix4(points.matrixWorld);\n geometries.push(geometry);\n optimizedObjects.push(points);\n handles.add(points.userData.handle);\n }\n\n const mergedObjects = [];\n\n if (geometries.length > 0) {\n const mergedGeometry = mergeGeometries(geometries, false);\n const mergedPoints = new Points(mergedGeometry, group.material);\n\n if (this.useVAO) {\n this.createVAO(mergedPoints);\n }\n\n rootGroup.add(mergedPoints);\n\n this.mergedPoints.add(mergedPoints);\n this.optimizedOriginalMap.set(mergedPoints, optimizedObjects);\n mergedObjects.push(mergedPoints);\n\n geometries.forEach((geometry) => {\n geometry.dispose();\n });\n }\n\n handles.forEach((handle) => {\n if (this.handleToOptimizedObjects.has(handle)) {\n const existingObjects = this.handleToOptimizedObjects.get(handle);\n existingObjects.push(...mergedObjects);\n this.handleToOptimizedObjects.set(handle, existingObjects);\n } else {\n this.handleToOptimizedObjects.set(handle, mergedObjects);\n }\n });\n } catch (error) {\n console.warn(\"Failed to merge points for material:\", error);\n group.objects.forEach((points) => {\n points.visible = true;\n });\n }\n }\n }\n\n mergeInSingleSegment(structureId, rootGroup) {\n const lineSegmentsArray = [...this.mergedLineSegments, ...this.mergedLines].filter(\n (obj) => obj.userData.structureId === structureId\n );\n\n if (lineSegmentsArray.length === 0) return;\n\n try {\n const geometriesWithIndex = [];\n const hasNormals = lineSegmentsArray.some((segment) => segment.geometry.attributes.normal !== undefined);\n\n lineSegmentsArray.forEach((segment) => {\n const clonedGeometry = segment.geometry.clone();\n segment.updateWorldMatrix(true, false);\n clonedGeometry.applyMatrix4(segment.matrixWorld);\n\n if (hasNormals && !clonedGeometry.attributes.normal) {\n clonedGeometry.computeVertexNormals();\n }\n if (!hasNormals && clonedGeometry.attributes.normal) {\n clonedGeometry.deleteAttribute(\"normal\");\n }\n\n const colorArray = new Float32Array(clonedGeometry.attributes.position.count * 3);\n for (let i = 0; i < colorArray.length; i += 3) {\n colorArray[i] = segment.material.color.r;\n colorArray[i + 1] = segment.material.color.g;\n colorArray[i + 2] = segment.material.color.b;\n }\n clonedGeometry.setAttribute(\"color\", new BufferAttribute(colorArray, 3));\n\n if (!clonedGeometry.index) {\n const indices = [];\n const posCount = clonedGeometry.attributes.position.count;\n for (let i = 0; i < posCount - 1; i += 2) {\n indices.push(i, i + 1);\n }\n clonedGeometry.setIndex(indices);\n }\n\n geometriesWithIndex.push(clonedGeometry);\n });\n\n const finalGeometry = mergeGeometries(geometriesWithIndex, false);\n const material = new LineBasicMaterial({\n vertexColors: true,\n });\n\n if (this.useVAO) {\n this.createVAO(finalGeometry);\n }\n\n const mergedLine = new LineSegments(finalGeometry, material);\n mergedLine.userData.structureId = structureId;\n rootGroup.add(mergedLine);\n this.mergedLineSegments.add(mergedLine);\n\n lineSegmentsArray.forEach((obj) => {\n if (obj.parent) {\n obj.parent.remove(obj);\n }\n obj.geometry.dispose();\n });\n } catch (error) {\n console.error(\"Failed to merge geometries:\", error);\n lineSegmentsArray.forEach((obj) => {\n obj.visible = true;\n rootGroup.add(obj);\n });\n }\n }\n\n showOriginalObjects(objects) {\n objects.forEach((obj) => {\n if (this.originalObjects.has(obj)) {\n obj.visible = true;\n }\n });\n }\n\n hideOriginalObjects(objects) {\n objects.forEach((obj) => {\n if (this.originalObjects.has(obj)) {\n obj.visible = false;\n }\n });\n }\n\n createVAO(geometry) {\n if (!this.useVAO) {\n return;\n }\n\n if (geometry.attributes?.position?.count < 1000) {\n return;\n }\n\n const gl = this.renderer.getContext();\n const vao = gl.createVertexArray();\n gl.bindVertexArray(vao);\n\n for (const name in geometry.attributes) {\n const attribute = geometry.attributes[name];\n const buffer = this.renderer.properties.get(attribute).buffer;\n\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attribute.itemSize);\n gl.vertexAttribPointer(attribute.itemSize, attribute.itemSize, gl.FLOAT, false, 0, 0);\n }\n\n if (geometry.index) {\n const indexBuffer = this.renderer.properties.get(geometry.index).buffer;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);\n }\n\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\n\n geometry.vao = vao;\n }\n\n getOriginalObjectForSelect() {\n const optimizedOriginals = [];\n\n for (const obj of this.originalObjectsToSelection) {\n if (this.hiddenHandles.has(obj.userData.handle)) {\n continue;\n }\n\n optimizedOriginals.push(obj);\n }\n\n return optimizedOriginals;\n }\n\n isolateObjects(handles) {\n if (this.hiddenHandles.size !== 0) {\n this.hiddenHandles.clear();\n this.syncHiddenObjects();\n }\n\n for (const handle of this.handleToOptimizedObjects.keys()) {\n if (!handles.has(handle)) {\n this.hiddenHandles.add(handle);\n }\n }\n\n this.syncHiddenObjects();\n }\n\n showAllHiddenObjects() {\n this.hiddenHandles.clear();\n this.syncHiddenObjects();\n }\n\n hideObjects(handles) {\n handles.forEach((handle) => {\n this.hiddenHandles.add(handle);\n });\n this.syncHiddenObjects();\n }\n\n showObjects(handles) {\n handles.forEach((handle) => {\n this.hiddenHandles.delete(handle);\n });\n this.syncHiddenObjects();\n }\n\n _updateVisibilityAttribute(mergedObject) {\n if (\n mergedObject.geometry &&\n mergedObject.geometry.attributes.visibility &&\n mergedObject.geometry.attributes.objectId\n ) {\n const visibilityArray = mergedObject.geometry.attributes.visibility.array;\n const objectIdArray = mergedObject.geometry.attributes.objectId.array;\n\n for (let i = 0; i < visibilityArray.length; i++) {\n const objectId = objectIdArray[i];\n if (objectId < this.objectVisibility.length) {\n visibilityArray[i] = this.objectVisibility[objectId];\n }\n }\n\n mergedObject.geometry.attributes.visibility.needsUpdate = true;\n }\n }\n\n syncHiddenObjects() {\n if (this.mergedObjectMap.size === 0) {\n console.log(\"No merged objects to sync\");\n return;\n }\n\n if (this.objectVisibility.length > 0) {\n for (let i = 0; i < this.objectVisibility.length; i++) {\n this.objectVisibility[i] = 1.0;\n }\n\n this.hiddenHandles.forEach((handle) => {\n const index = this.objectIdToIndex.get(handle);\n if (index !== undefined && index < this.objectVisibility.length) {\n this.objectVisibility[index] = 0.0;\n }\n });\n }\n\n for (const mesh of this.mergedMesh) {\n this._updateVisibilityAttribute(mesh);\n }\n for (const line of this.mergedLines) {\n this._updateVisibilityAttribute(line);\n }\n for (const lineSegment of this.mergedLineSegments) {\n this._updateVisibilityAttribute(lineSegment);\n }\n for (const point of this.mergedPoints) {\n this._updateVisibilityAttribute(point);\n }\n }\n\n getStructureGeometryExtent(structureId) {\n const extent = new Box3();\n for (const [nodeId, node] of this.nodes.entries()) {\n if (!node.geometryExtents) continue;\n if (!nodeId.startsWith(structureId + \"_\")) continue;\n if (node.object && this.hiddenHandles && this.hiddenHandles.has(node.object.userData.handle)) continue;\n const transformedBox = node.geometryExtents.clone();\n if (node.group && node.group.matrix) {\n transformedBox.applyMatrix4(node.group.matrix);\n if (node.group.parent && node.group.parent.matrix) {\n transformedBox.applyMatrix4(node.group.parent.matrix);\n }\n }\n extent.union(transformedBox);\n }\n return extent;\n }\n\n setMaxConcurrentChunks(maxChunks) {\n if (maxChunks < 1) {\n console.warn(\"Max concurrent chunks must be at least 1\");\n return;\n }\n this.maxConcurrentChunks = maxChunks;\n }\n\n waitForChunkSlot() {\n if (this.activeChunkLoads < this.maxConcurrentChunks) {\n this.activeChunkLoads++;\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n this.chunkQueue.push(resolve);\n });\n }\n\n releaseChunkSlot() {\n this.activeChunkLoads--;\n\n if (this.chunkQueue.length > 0) {\n const nextResolve = this.chunkQueue.shift();\n this.activeChunkLoads++;\n nextResolve();\n }\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Group } from \"three\";\nimport { ILoader, LoadParams } from \"@inweb/viewer-core\";\n\nimport { Viewer } from \"../Viewer\";\nimport { DynamicModelImpl } from \"./DynamicGltfLoader/DynamicModelImpl\";\nimport { DynamicGltfLoader } from \"./DynamicGltfLoader/DynamicGltfLoader.js\";\nimport { GltfStructure } from \"./DynamicGltfLoader/GltfStructure.js\";\n\nexport class GLTFCloudDynamicLoader implements ILoader {\n public viewer: Viewer;\n public gltfLoader: DynamicGltfLoader;\n public requestId = 0;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n }\n\n dispose() {\n if (this.gltfLoader) this.gltfLoader.clear();\n }\n\n isSupport(file: any): boolean {\n return (\n typeof file === \"object\" &&\n typeof file.database === \"string\" &&\n typeof file.downloadResource === \"function\" &&\n typeof file.downloadResourceRange === \"function\" &&\n /.gltf$/i.test(file.database)\n );\n }\n\n async load(model: any, format?: string, params?: LoadParams): Promise<this> {\n const scene = new Group();\n\n this.gltfLoader = new DynamicGltfLoader(this.viewer.camera, scene, this.viewer.renderer);\n this.gltfLoader.memoryLimit = this.viewer.options.memoryLimit;\n this.gltfLoader.setVisibleEdges(this.viewer.options.edgeModel);\n // this.gltfLoader.setMaxConcurrentChunks(this.viewer.options.maxConcurrentChunks);\n\n this.gltfLoader.addEventListener(\"databasechunk\", (data) => {\n const modelImpl = new DynamicModelImpl(scene);\n modelImpl.loader = this;\n modelImpl.viewer = this.viewer;\n modelImpl.gltfLoader = this.gltfLoader;\n modelImpl.modelId = model.id;\n\n this.viewer.scene.add(scene);\n this.viewer.models.push(modelImpl);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n this.viewer.update();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: scene, file: model.file, model });\n });\n\n this.gltfLoader.addEventListener(\"geometryprogress\", (data) => {\n const progress = data.loaded / data.total;\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file: model.file, model });\n });\n\n this.gltfLoader.addEventListener(\"geometryerror\", (data) => {\n this.viewer.emitEvent({ type: \"geometryerror\", data, file: model.file, model });\n });\n\n this.gltfLoader.addEventListener(\"update\", (data) => {\n this.viewer.update();\n });\n\n const loadController = {\n loadJson: async () => {\n const progress = (progress: number) => {\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file: model });\n };\n\n const arrayBuffer = await model.downloadResource(\n model.database,\n progress,\n this.gltfLoader.getAbortController().signal\n );\n\n const text = new TextDecoder().decode(arrayBuffer);\n const json = JSON.parse(text);\n\n return json;\n },\n\n loadBinaryData: (requests) => {\n const ranges = requests.map((request) => ({\n begin: request.offset,\n end: request.offset + request.length - 1,\n requestId: this.requestId++,\n }));\n\n return model.downloadResourceRange(\n model.geometry[0],\n undefined,\n ranges,\n undefined,\n this.gltfLoader.getAbortController().signal\n );\n },\n\n baseUrl: () => Promise.resolve(`${model.httpClient.serverUrl}${model.path}/`),\n };\n\n const structure = new GltfStructure(model.id, loadController);\n\n await this.gltfLoader.loadStructure(structure);\n await this.gltfLoader.loadNodes();\n\n return this;\n }\n\n cancel() {\n if (this.gltfLoader) this.gltfLoader.abortLoading();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { ILoadersRegistry, loadersRegistry } from \"@inweb/viewer-core\";\n\nimport { GLTFFileLoader } from \"./GLTFFileLoader\";\nimport { GLTFCloudDynamicLoader } from \"./GLTFCloudDynamicLoader\";\n\n/**\n * Viewer loaders registry. Use this registry to register custom loaders.\n *\n * To implement custom loader:\n *\n * 1. Define a loader class implements {@link ILoader}.\n * 2. Define a constructor with a `viewer` parameter.\n * 3. Override {@link ILoader.isSupport} and сheck if the loader can load the specified file.\n * 4. Override {@link ILoader.load} and define the logic for loading the scene from the file.\n *\n * The loader should do:\n *\n * - Load raw data from file and convert it to the `Three.js` scene.\n * - Add scene to the viewer `scene`.\n * - Create `ModelImpl` for the scene and to the viewer `models` list.\n * - Synchronize viewer options and overlay.\n * - Update the viewer.\n *\n * The loader must emit events:\n *\n * - `geometryprogress` - during loading. If progress is not supported, emit it once with a value of 100%\n * after the load is complete.\n * - `databasechunk` - when scene is loaded and ready to render.\n * 5. Override {@link ILoader.dispose} and release loader resources, if required.\n * 6. Register loader provider in the loaders registry by calling the {@link loaders.registerLoader}.\n *\n * @example Implementing a custom loader.\n *\n * ```javascript\n * import { loaders, Loader, ModelImpl, Viewer } from \"@inweb/viewer-three\";\n *\n * class MyLoader extends Loader {\n * public viewer: Viewer;\n *\n * constructor(viewer: Viewer) {\n * super();\n * this.viewer = viewer;\n * }\n *\n * override isSupport(file, format): Boolean {\n * // place custom logic here\n * return ...;\n * }\n *\n * override load(file, format, params): Promise<this> {\n *\n * // place custom loading logic here\n * const scene = ...;\n *\n * const modelImpl = new ModelImpl(scene);\n * modelImpl.loader = this;\n * modelImpl.viewer = this.viewer;\n *\n * this.viewer.scene.add(scene);\n * this.viewer.models.push(modelImpl);\n *\n * this.viewer.syncOptions();\n * this.viewer.syncOverlay();\n * this.viewer.update();\n *\n * this.viewer.emitEvent({ type: \"databasechunk\", data: scene, file });\n *\n * return Promise.resove(this);\n * };\n * }\n *\n * loaders.registerLoader(\"MyLoader\", (viewer) => new MyLoader(viewer));\n * ```\n */\nexport const loaders: ILoadersRegistry = loadersRegistry(\"threejs\");\n\n// build-in loaders\n\nloaders.registerLoader(\"gltf-file\", (viewer: any) => new GLTFFileLoader(viewer));\nloaders.registerLoader(\"gltf-cloud\", (viewer: any) => new GLTFCloudDynamicLoader(viewer));\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { AdditiveBlending, Color, HalfFloatType, ShaderMaterial, UniformsUtils, WebGLRenderTarget } from \"three\";\nimport { Pass, FullScreenQuad } from \"three/examples/jsm/postprocessing/Pass.js\";\nimport { CopyShader } from \"three/examples/jsm/shaders/CopyShader.js\";\n\nexport class SSAARenderPass extends Pass {\n constructor(scenes, camera, clearColor = 0x000000, clearAlpha = 0) {\n super();\n this.scenes = Array.isArray(scenes) ? scenes : [scenes];\n this.camera = camera;\n this.sampleLevel = 2;\n this.unbiased = true;\n this.stencilBuffer = false;\n this.clearColor = clearColor;\n this.clearAlpha = clearAlpha;\n\n this._sampleRenderTarget = null;\n this._oldClearColor = new Color();\n this._copyUniforms = UniformsUtils.clone(CopyShader.uniforms);\n\n this._copyMaterial = new ShaderMaterial({\n uniforms: this._copyUniforms,\n vertexShader: CopyShader.vertexShader,\n fragmentShader: CopyShader.fragmentShader,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n premultipliedAlpha: true,\n blending: AdditiveBlending,\n });\n\n this._fsQuad = new FullScreenQuad(this._copyMaterial);\n }\n\n dispose() {\n if (this._sampleRenderTarget) {\n this._sampleRenderTarget.dispose();\n this._sampleRenderTarget = null;\n }\n\n this._copyMaterial.dispose();\n\n this._fsQuad.dispose();\n }\n\n setSize(width, height) {\n if (this._sampleRenderTarget) this._sampleRenderTarget.setSize(width, height);\n }\n\n render(renderer, writeBuffer, readBuffer, deltaTime, maskActive) {\n if (!this._sampleRenderTarget) {\n this._sampleRenderTarget = new WebGLRenderTarget(readBuffer.width, readBuffer.height, {\n type: HalfFloatType,\n stencilBuffer: this.stencilBuffer,\n });\n this._sampleRenderTarget.texture.name = \"SSAAMultiRenderPass.sample\";\n }\n\n const jitterOffsets = _JitterVectors[Math.max(0, Math.min(this.sampleLevel, 5))];\n\n const autoClear = renderer.autoClear;\n renderer.autoClear = false;\n\n renderer.getClearColor(this._oldClearColor);\n const oldClearAlpha = renderer.getClearAlpha();\n\n const baseSampleWeight = 1.0 / jitterOffsets.length;\n const roundingRange = 1 / 32;\n this._copyUniforms[\"tDiffuse\"].value = this._sampleRenderTarget.texture;\n\n const viewOffset = {\n fullWidth: readBuffer.width,\n fullHeight: readBuffer.height,\n offsetX: 0,\n offsetY: 0,\n width: readBuffer.width,\n height: readBuffer.height,\n };\n\n const originalViewOffset = Object.assign({}, this.camera.view);\n\n if (originalViewOffset.enabled) Object.assign(viewOffset, originalViewOffset);\n\n for (let i = 0; i < jitterOffsets.length; i++) {\n const jitterOffset = jitterOffsets[i];\n\n if (this.camera.setViewOffset) {\n this.camera.setViewOffset(\n viewOffset.fullWidth,\n viewOffset.fullHeight,\n\n viewOffset.offsetX + jitterOffset[0] * 0.0625,\n viewOffset.offsetY + jitterOffset[1] * 0.0625, // 0.0625 = 1 / 16\n\n viewOffset.width,\n viewOffset.height\n );\n }\n\n let sampleWeight = baseSampleWeight;\n\n if (this.unbiased) {\n const uniformCenteredDistribution = -0.5 + (i + 0.5) / jitterOffsets.length;\n sampleWeight += roundingRange * uniformCenteredDistribution;\n }\n\n this._copyUniforms[\"opacity\"].value = sampleWeight;\n renderer.setClearColor(this.clearColor, this.clearAlpha);\n renderer.setRenderTarget(this._sampleRenderTarget);\n renderer.clear();\n\n this.scenes.forEach((scene) => renderer.render(scene, this.camera));\n\n renderer.setRenderTarget(this.renderToScreen ? null : writeBuffer);\n\n if (i === 0) {\n renderer.setClearColor(0x000000, 0.0);\n renderer.clear();\n }\n\n this._fsQuad.render(renderer);\n }\n\n if (this.camera.setViewOffset && originalViewOffset.enabled) {\n this.camera.setViewOffset(\n originalViewOffset.fullWidth,\n originalViewOffset.fullHeight,\n\n originalViewOffset.offsetX,\n originalViewOffset.offsetY,\n\n originalViewOffset.width,\n originalViewOffset.height\n );\n } else if (this.camera.clearViewOffset) {\n this.camera.clearViewOffset();\n }\n\n renderer.autoClear = autoClear;\n renderer.setClearColor(this._oldClearColor, oldClearAlpha);\n }\n}\n\n// These jitter vectors are specified in integers because it is easier.\n// I am assuming a [-8,8) integer grid, but it needs to be mapped onto [-0.5,0.5)\n// before being used, thus these integers need to be scaled by 1/16.\n//\n// Sample patterns reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476218%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396\nconst _JitterVectors = [\n [[0, 0]],\n [\n [4, 4],\n [-4, -4],\n ],\n [\n [-2, -6],\n [6, -2],\n [-6, 2],\n [2, 6],\n ],\n [\n [1, -3],\n [-1, 3],\n [5, 1],\n [-3, -5],\n [-5, 5],\n [-7, -1],\n [3, 7],\n [7, -7],\n ],\n [\n [1, 1],\n [-1, -3],\n [-3, 2],\n [4, -1],\n [-5, -2],\n [2, 5],\n [5, 3],\n [3, -5],\n [-2, 6],\n [0, -7],\n [-4, -6],\n [-6, 4],\n [-8, 0],\n [7, -4],\n [6, 7],\n [-7, -8],\n ],\n [\n [-4, -7],\n [-7, -5],\n [-3, -5],\n [-5, -4],\n [-1, -4],\n [-2, -2],\n [-6, -1],\n [-4, 0],\n [-7, 1],\n [-1, 2],\n [-6, 3],\n [-3, 3],\n [-7, 6],\n [-3, 6],\n [-5, 7],\n [-1, 7],\n [5, -7],\n [1, -6],\n [6, -5],\n [4, -4],\n [2, -3],\n [7, -2],\n [1, -1],\n [4, -1],\n [2, 1],\n [6, 2],\n [0, 4],\n [4, 4],\n [2, 5],\n [7, 5],\n [5, 6],\n [3, 7],\n ],\n];\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Scene, WebGLRenderer } from \"three\";\n\nexport class Helpers extends Scene {\n private oldAutoClear = false;\n private oldClippingPlanes = [];\n\n override onBeforeRender(renderer: WebGLRenderer): void {\n this.oldAutoClear = renderer.autoClear;\n this.oldClippingPlanes = renderer.clippingPlanes;\n\n renderer.autoClear = false;\n renderer.clippingPlanes = [];\n }\n\n override onAfterRender(renderer: WebGLRenderer): void {\n renderer.clippingPlanes = this.oldClippingPlanes;\n renderer.autoClear = this.oldAutoClear;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport {\n Box3,\n LinearSRGBColorSpace,\n // LinearToneMapping,\n Object3D,\n OrthographicCamera,\n PerspectiveCamera,\n Plane,\n Scene,\n Sphere,\n Vector2,\n Vector3,\n WebGLRenderer,\n} from \"three\";\nimport { EffectComposer } from \"three/examples/jsm/postprocessing/EffectComposer.js\";\nimport { RenderPass } from \"three/examples/jsm/postprocessing/RenderPass.js\";\nimport { FXAAPass } from \"three/examples/jsm/postprocessing/FXAAPass.js\";\nimport { SMAAPass } from \"three/examples/jsm/postprocessing/SMAAPass.js\";\nimport { SSAARenderPass } from \"./postprocessing/SSAARenderPass.js\";\nimport { OutputPass } from \"three/examples/jsm/postprocessing/OutputPass.js\";\n\nimport { EventEmitter2 } from \"@inweb/eventemitter2\";\nimport { Assembly, Client, Model, File } from \"@inweb/client\";\nimport {\n CANVAS_EVENTS,\n CanvasEventMap,\n FileSource,\n IClippingPlane,\n IComponent,\n IEntity,\n IDragger,\n ILoader,\n IOptions,\n IOrthogonalCamera,\n IPerspectiveCamera,\n IPoint,\n IViewer,\n IViewpoint,\n Options,\n OptionsEventMap,\n ViewerEventMap,\n} from \"@inweb/viewer-core\";\nimport { IMarkup, IWorldTransform, Markup } from \"@inweb/markup\";\n\nimport { draggers } from \"./draggers\";\nimport { commands } from \"./commands\";\nimport { components } from \"./components\";\nimport { loaders } from \"./loaders\";\nimport { IModelImpl } from \"./models/IModelImpl\";\nimport { Helpers } from \"./scenes/Helpers\";\n\n/**\n * 3D viewer powered by {@link https://threejs.org/ | Three.js}.\n */\nexport class Viewer\n extends EventEmitter2<ViewerEventMap & CanvasEventMap & OptionsEventMap>\n implements IViewer, IWorldTransform\n{\n public client: Client | undefined;\n protected _options: Options;\n\n private canvaseventlistener: (event: any) => void;\n\n public canvas: HTMLCanvasElement | undefined;\n public canvasEvents: string[];\n\n public scene: Scene | undefined;\n public helpers: Helpers | undefined;\n public camera: PerspectiveCamera | OrthographicCamera | undefined;\n public renderer: WebGLRenderer | undefined;\n public renderPass: RenderPass | undefined;\n public helpersPass: RenderPass | undefined;\n public fxaaPass: FXAAPass | undefined;\n public smaaPass: SMAAPass | undefined;\n public ssaaRenderPass: SSAARenderPass | undefined;\n public outputPass: OutputPass | undefined;\n public composer: EffectComposer | undefined;\n\n public loaders: ILoader[];\n public models: IModelImpl[];\n public selected: Object3D[];\n public extents: Box3;\n public target: Vector3;\n\n private _activeDragger: IDragger | null;\n private _components: IComponent[];\n\n private _renderNeeded: boolean;\n private _renderTime: DOMHighResTimeStamp;\n\n private _markup: IMarkup;\n\n /**\n * @param client - The `Client` instance that is used to load model reference files from the Open Cloud\n * Server. Do not specify `Client` if you need a standalone viewer instance to view `glTF` files from\n * the web or from local computer.\n */\n constructor(client?: Client) {\n super();\n this._options = new Options(this);\n\n this.client = client;\n\n this.canvasEvents = CANVAS_EVENTS;\n this.canvaseventlistener = (event: Event) => this.emit(event);\n\n this.loaders = [];\n this.models = [];\n this.selected = [];\n this.extents = new Box3();\n this.target = new Vector3();\n\n this._activeDragger = null;\n this._components = [];\n\n this._renderTime = 0;\n\n this.render = this.render.bind(this);\n this.update = this.update.bind(this);\n\n this._markup = new Markup();\n }\n\n get options(): IOptions {\n return this._options;\n }\n\n get draggers(): string[] {\n return [...draggers.getDraggers().keys()];\n }\n\n get components(): string[] {\n return [...components.getComponents().keys()];\n }\n\n /**\n * 2D markup core instance used to create markups.\n *\n * @readonly\n */\n get markup(): IMarkup {\n return this._markup;\n }\n\n initialize(canvas: HTMLCanvasElement, onProgress?: (event: ProgressEvent<EventTarget>) => void): Promise<this> {\n this.addEventListener(\"optionschange\", (event) => this.syncOptions(event.data));\n\n this.scene = new Scene();\n this.helpers = new Helpers();\n this.target = new Vector3(0, 0, 0);\n\n const pixelRatio = window.devicePixelRatio;\n const rect = canvas.parentElement.getBoundingClientRect();\n const width = rect.width || 1;\n const height = rect.height || 1;\n const aspect = width / height;\n\n this.camera = new PerspectiveCamera(45, aspect, 0.001, 1000);\n this.camera.up.set(0, 1, 0);\n this.camera.position.set(0, 0, 1);\n this.camera.lookAt(this.target);\n this.camera.updateProjectionMatrix();\n\n this.renderer = new WebGLRenderer({\n canvas,\n antialias: true,\n alpha: true,\n preserveDrawingBuffer: true,\n powerPreference: \"high-performance\",\n logarithmicDepthBuffer: true,\n });\n this.renderer.setPixelRatio(pixelRatio);\n this.renderer.setSize(width, height);\n // this.renderer.toneMapping = LinearToneMapping;\n this.renderer.outputColorSpace = LinearSRGBColorSpace;\n\n this.renderPass = new RenderPass(this.scene, this.camera);\n\n this.helpersPass = new RenderPass(this.helpers, this.camera);\n this.helpersPass.clear = false;\n\n this.fxaaPass = new FXAAPass();\n this.smaaPass = new SMAAPass();\n\n this.ssaaRenderPass = new SSAARenderPass([this.scene, this.helpers], this.camera);\n this.ssaaRenderPass.unbiased = true;\n\n this.outputPass = new OutputPass();\n\n this.composer = new EffectComposer(this.renderer);\n this.composer.addPass(this.renderPass);\n this.composer.addPass(this.helpersPass);\n this.composer.addPass(this.smaaPass);\n this.composer.addPass(this.fxaaPass);\n this.composer.addPass(this.ssaaRenderPass);\n this.composer.addPass(this.outputPass);\n this.composer.setSize(width, height);\n\n this.canvas = canvas;\n this.canvasEvents.forEach((x) => canvas.addEventListener(x, this.canvaseventlistener));\n\n this._markup.initialize(this.canvas, this.canvasEvents, this, this);\n\n for (const name of components.getComponents().keys()) {\n this._components.push(components.createComponent(name, this));\n }\n\n this.syncOptions();\n this.syncOverlay();\n\n this._renderTime = performance.now();\n this.render(this._renderTime);\n\n if (typeof onProgress === \"function\")\n onProgress(new ProgressEvent(\"progress\", { lengthComputable: true, loaded: 1, total: 1 }));\n\n this.emitEvent({ type: \"initializeprogress\", data: 1, loaded: 1, total: 1 });\n this.emitEvent({ type: \"initialize\" });\n\n return Promise.resolve(this);\n }\n\n dispose(): this {\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"dispose\" });\n this.removeAllListeners();\n\n this.setActiveDragger();\n\n this._components.forEach((component: IComponent) => component.dispose());\n this._components = [];\n\n this._markup.dispose();\n\n if (this.canvas) {\n this.canvasEvents.forEach((x) => this.canvas.removeEventListener(x, this.canvaseventlistener));\n this.canvas = undefined;\n }\n\n if (this.composer) this.composer.dispose();\n if (this.renderPass) this.renderPass.dispose();\n if (this.helpersPass) this.helpersPass.dispose();\n if (this.fxaaPass) this.fxaaPass.dispose();\n if (this.smaaPass) this.smaaPass.dispose();\n if (this.ssaaRenderPass) this.ssaaRenderPass.dispose();\n if (this.outputPass) this.outputPass.dispose();\n if (this.renderer) this.renderer.dispose();\n\n this.scene = undefined;\n this.helpers = undefined;\n this.camera = undefined;\n this.renderer = undefined;\n this.renderPass = undefined;\n this.helpersPass = undefined;\n this.fxaaPass = undefined;\n this.smaaPass = undefined;\n this.ssaaRenderPass = undefined;\n this.outputPass = undefined;\n this.composer = undefined;\n\n return this;\n }\n\n isInitialized(): boolean {\n return !!this.renderer;\n }\n\n setSize(width: number, height: number, updateStyle = true) {\n if (!this.renderer) return;\n\n const camera = this.camera as any;\n const aspect = width / height;\n\n if (camera.isPerspectiveCamera) {\n camera.aspect = aspect;\n camera.updateProjectionMatrix();\n }\n if (camera.isOrthographicCamera) {\n camera.left = camera.bottom * aspect;\n camera.right = camera.top * aspect;\n camera.updateProjectionMatrix();\n }\n\n this.renderer.setSize(width, height, updateStyle);\n this.composer.setSize(width, height);\n\n this.update(true);\n this.emitEvent({ type: \"resize\", width, height });\n }\n\n update(force = false): void {\n this._renderNeeded = true;\n if (force) this.render();\n this.emitEvent({ type: \"update\", data: force });\n }\n\n render(time?: DOMHighResTimeStamp, force = false): void {\n if (!this.renderer) return;\n if (!this._renderNeeded && !force) return;\n\n if (!time) time = performance.now();\n const deltaTime = (time - this._renderTime) / 1000;\n\n this._renderTime = time;\n this._renderNeeded = false;\n\n if (this.options.antialiasing === true || this.options.antialiasing === \"msaa\") {\n this.renderer.render(this.scene, this.camera);\n this.renderer.render(this.helpers, this.camera);\n } else {\n this.composer.render(deltaTime);\n }\n\n this._activeDragger?.updatePreview?.();\n\n this.emitEvent({ type: \"render\", time, deltaTime });\n }\n\n loadReferences(model: Model | File | Assembly): Promise<this> {\n // todo: load reference as text fonts\n return Promise.resolve(this);\n }\n\n /**\n * Loads a file into the viewer.\n *\n * The viewer must be {@link initialize | initialized} before opening the file. Otherwise, `open()` does\n * nothing.\n *\n * This method requires a `Client` instance to be specified to load file from the Open Cloud Server.\n * The file geometry data on the Open Cloud Server must be converted into a `gltf` format, otherwise an\n * exception will be thrown.\n *\n * For files from Open Cloud Server, the default model will be loaded. If there is no default model,\n * first availiable model will be loaded. If no models are found in the file, an exception will be\n * thrown.\n *\n * For URLs, the file extension is used to determine the file format. For a `ArrayBuffer` and `Data\n * URL`, a file format must be specified using `params.format` parameter (see below). If no appropriate\n * loader is found for the specified format, an exception will be thrown.\n *\n * If there was an active dragger before opening the file, it will be deactivated. After opening the\n * file, you must manually activate the required dragger.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryChunkEvent | geometrychunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param file - File to load. Can be one of:\n *\n * - `File`, `Assembly` or `Model` instance from the Open Cloud Server\n * - File `URL` string\n * - {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string\n * - {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object\n * - {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer}\n * object\n *\n * @param params - Loading parameters.\n * @param params.format - File format string. Required when loading a file as `ArrayBuffer` or `Data\n * URL`.\n * @param params.mode - File opening mode. Can be one of:\n *\n * - `open` - Unloads an open file and opens a new one. This is default mode.\n * - `append` - Appends a file to an already open file.\n *\n * @param params.requestHeader - The\n * {@link https://developer.mozilla.org/docs/Glossary/Request_header | request header} used in HTTP\n * request.\n * @param params.withCredentials - Whether the HTTP request uses credentials such as cookies,\n * authorization headers or TLS client certificates. See\n * {@link https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/withCredentials | XMLHttpRequest.withCredentials}.\n * @param params.path - The base path from which external resources such as binary data buffers, images\n * or textures will be loaded. If not defined, the base path of the file URL will be used.\n * @param params.externalFiles - External resource map. Each resource should be represented by a `uri`\n * and a corresponding resource URL, or\n * {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string, or\n * {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object, or\n * {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer}.\n * @param params.crossOrigin - The crossOrigin string to implement CORS for loading the external\n * resources from a different domain that allows CORS. Default is `anonymous`.\n */\n async open(\n file: FileSource,\n params: {\n format?: string;\n mode?: string;\n requestHeader?: HeadersInit;\n withCredentials?: boolean;\n path?: string;\n externalFiles?: Map<string, string | globalThis.File | ArrayBuffer>;\n crossOrigin?: string;\n } = {}\n ): Promise<this> {\n if (!this.renderer) return this;\n\n if (params.mode !== \"a\" && params.mode !== \"append\") {\n this.cancel();\n this.clear();\n }\n\n this.emitEvent({ type: \"open\", file });\n\n let model: any = file;\n if (model && typeof model.getModels === \"function\") {\n const models = await model.getModels();\n model = models.find((model: Model) => model.default) || models[0] || file;\n }\n if (!model) throw new Error(`Format not supported`);\n\n let format = params.format;\n if (!format && typeof model.type === \"string\") format = model.type.split(\".\").pop();\n if (!format && typeof file === \"string\") format = file.split(\".\").pop();\n if (!format && file instanceof globalThis.File) format = file.name.split(\".\").pop();\n\n const loader: ILoader = loaders.createLoader(this, model, format);\n if (!loader) throw new Error(`Format not supported`);\n this.loaders.push(loader);\n\n this.emitEvent({ type: \"geometrystart\", file, model });\n try {\n await this.loadReferences(model);\n await loader.load(model, format, params);\n } catch (error: any) {\n this.emitEvent({ type: \"geometryerror\", data: error, file, model });\n throw error;\n }\n this.emitEvent({ type: \"geometryend\", file, model });\n\n return this;\n }\n\n /**\n * Deprecated since `26.4`. Use {@link open | open()} instead.\n *\n * @deprecated\n */\n openGltfFile(file, externalFiles, params: any = {}): Promise<this> {\n console.warn(\n \"Viewer.openGltfFile() has been deprecated since 26.4 and will be removed in a future release, use Viewer.open() instead.\"\n );\n\n return this.open(file, { ...params, format: \"gltf\", externalFiles });\n }\n\n /**\n * Deprecated since `26.4`. Use {@link open | open()} instead.\n *\n * @deprecated\n */\n loadGltfFile(file, externalFiles, params: any = {}): Promise<this> {\n console.warn(\n \"Viewer.loadGltfFile() has been deprecated since 26.4 and will be removed in a future release, use Viewer.open() instead.\"\n );\n\n return this.open(file, { ...params, format: \"gltf\", externalFiles, mode: \"append\" });\n }\n\n cancel(): this {\n this.loaders.forEach((loader) => loader.cancel());\n\n this.emitEvent({ type: \"cancel\" });\n return this;\n }\n\n clear(): this {\n if (!this.renderer) return this;\n\n this.setActiveDragger();\n this.clearSlices();\n this.clearOverlay();\n this.clearSelected();\n\n this.loaders.forEach((loader) => loader.dispose());\n this.loaders = [];\n\n this.models.forEach((model) => model.dispose());\n this.models = [];\n\n this.scene.clear();\n this.helpers.clear();\n\n this.syncOptions();\n this.syncOverlay();\n this.update(true);\n\n this.emitEvent({ type: \"clear\" });\n\n return this;\n }\n\n syncOptions(options: IOptions = this.options): void {\n if (!this.renderer) return;\n\n this.fxaaPass.enabled = options.antialiasing === \"fxaa\";\n this.smaaPass.enabled = options.antialiasing === \"smaa\";\n this.ssaaRenderPass.enabled = options.antialiasing === \"ssaa\";\n\n this.renderPass.enabled = !this.ssaaRenderPass.enabled;\n this.helpersPass.enabled = !this.ssaaRenderPass.enabled;\n\n this.update();\n }\n\n syncOverlay(): void {\n if (!this.renderer) return;\n\n this._markup.syncOverlay();\n this.update();\n }\n\n clearOverlay(): void {\n if (!this.renderer) return;\n\n this._markup.clearOverlay();\n this.update();\n }\n\n clearSlices(): void {\n if (!this.renderer) return;\n\n this.renderer.clippingPlanes = [];\n this.update();\n }\n\n getSelected(): string[] {\n return this.executeCommand(\"getSelected\");\n }\n\n setSelected(handles?: string[]): void {\n this.executeCommand(\"setSelected\", handles);\n }\n\n clearSelected(): void {\n this.executeCommand(\"clearSelected\");\n }\n\n hideSelected(): void {\n this.executeCommand(\"hideSelected\");\n }\n\n isolateSelected(): void {\n this.executeCommand(\"isolateSelected\");\n }\n\n showAll(): void {\n this.executeCommand(\"showAll\");\n }\n\n explode(index = 0): void {\n this.executeCommand(\"explode\", index);\n }\n\n collect(): void {\n this.executeCommand(\"collect\");\n }\n\n activeDragger(): IDragger | null {\n return this._activeDragger;\n }\n\n setActiveDragger(name = \"\"): IDragger | null {\n if (!this._activeDragger || this._activeDragger.name !== name) {\n const oldDragger = this._activeDragger;\n let newDragger = null;\n\n if (this._activeDragger) {\n this._activeDragger.dispose();\n this._activeDragger = null;\n }\n if (this.isInitialized()) {\n newDragger = draggers.createDragger(name, this);\n if (newDragger) {\n this._activeDragger = newDragger;\n this._activeDragger.initialize?.();\n }\n }\n\n const canvas = this.canvas;\n if (canvas) {\n if (oldDragger) canvas.classList.remove(`oda-cursor-${oldDragger.name.toLowerCase()}`);\n if (newDragger) canvas.classList.add(`oda-cursor-${newDragger.name.toLowerCase()}`);\n }\n\n this.emitEvent({ type: \"changeactivedragger\", data: name });\n this.update();\n }\n return this._activeDragger;\n }\n\n resetActiveDragger(): void {\n const dragger = this._activeDragger;\n if (dragger) {\n this.setActiveDragger();\n this.setActiveDragger(dragger.name);\n }\n }\n\n getComponent(name: string): IComponent {\n return this._components.find((component) => component.name === name);\n }\n\n is3D(): boolean {\n return true;\n }\n\n screenToWorld(position: { x: number; y: number }): { x: number; y: number; z: number } {\n if (!this.renderer) return { x: position.x, y: position.y, z: 0 };\n\n const rect = this.canvas.getBoundingClientRect();\n const x = position.x / (rect.width / 2) - 1;\n const y = -position.y / (rect.height / 2) + 1;\n\n const point = new Vector3(x, y, -1);\n point.unproject(this.camera);\n\n return { x: point.x, y: point.y, z: point.z };\n }\n\n worldToScreen(position: { x: number; y: number; z: number }): { x: number; y: number } {\n if (!this.renderer) return { x: position.x, y: position.y };\n\n const point = new Vector3(position.x, position.y, position.z);\n point.project(this.camera);\n\n const rect = this.canvas.getBoundingClientRect();\n const x = (point.x + 1) * (rect.width / 2);\n const y = (-point.y + 1) * (rect.height / 2);\n\n return { x, y };\n }\n\n getScale(): { x: number; y: number; z: number } {\n return { x: 1, y: 1, z: 1 };\n }\n\n executeCommand(id: string, ...args: any[]): any {\n return commands.executeCommand(id, this, ...args);\n }\n\n drawViewpoint(viewpoint: IViewpoint): void {\n if (!this.renderer) return;\n\n const getVector3FromPoint3d = ({ x, y, z }): Vector3 => new Vector3(x, y, z);\n\n const setOrthogonalCamera = (orthogonal_camera: IOrthogonalCamera) => {\n if (orthogonal_camera) {\n const extentsSize = this.extents.getBoundingSphere(new Sphere()).radius * 2;\n const rendererSize = this.renderer.getSize(new Vector2());\n const aspect = rendererSize.x / rendererSize.y;\n\n const camera = new OrthographicCamera();\n camera.top = orthogonal_camera.field_height / 2;\n camera.bottom = -orthogonal_camera.field_height / 2;\n camera.left = camera.bottom * aspect;\n camera.right = camera.top * aspect;\n camera.near = 0;\n camera.far = extentsSize * 1000;\n camera.zoom = orthogonal_camera.view_to_world_scale;\n camera.updateProjectionMatrix();\n\n camera.up.copy(getVector3FromPoint3d(orthogonal_camera.up_vector));\n camera.position.copy(getVector3FromPoint3d(orthogonal_camera.view_point));\n camera.lookAt(getVector3FromPoint3d(orthogonal_camera.direction).add(camera.position));\n camera.updateMatrixWorld();\n\n this.camera = camera;\n this.renderPass.camera = camera;\n this.helpersPass.camera = camera;\n this.ssaaRenderPass.camera = camera;\n\n this.emitEvent({ type: \"changecameramode\", mode: \"orthographic\" });\n }\n };\n\n const setPerspectiveCamera = (perspective_camera: IPerspectiveCamera) => {\n if (perspective_camera) {\n const extentsSize = this.extents.getBoundingSphere(new Sphere()).radius * 2;\n const rendererSize = this.renderer.getSize(new Vector2());\n const aspect = rendererSize.x / rendererSize.y;\n\n const camera = new PerspectiveCamera();\n camera.fov = perspective_camera.field_of_view;\n camera.aspect = aspect;\n camera.near = extentsSize / 1000;\n camera.far = extentsSize * 1000;\n camera.updateProjectionMatrix();\n\n camera.up.copy(getVector3FromPoint3d(perspective_camera.up_vector));\n camera.position.copy(getVector3FromPoint3d(perspective_camera.view_point));\n camera.lookAt(getVector3FromPoint3d(perspective_camera.direction).add(camera.position));\n camera.updateMatrixWorld();\n\n this.camera = camera;\n this.renderPass.camera = camera;\n this.helpersPass.camera = camera;\n this.ssaaRenderPass.camera = camera;\n\n this.emitEvent({ type: \"changecameramode\", mode: \"perspective\" });\n }\n };\n\n const setClippingPlanes = (clipping_planes: IClippingPlane[]) => {\n clipping_planes?.forEach((clipping_plane) => {\n const plane = new Plane();\n plane.setFromNormalAndCoplanarPoint(\n getVector3FromPoint3d(clipping_plane.direction),\n getVector3FromPoint3d(clipping_plane.location)\n );\n\n this.renderer.clippingPlanes.push(plane);\n });\n };\n\n const setSelection = (selection: IEntity[]) => {\n if (selection) this.setSelected(selection.map((component) => component.handle));\n };\n\n const draggerName = this._activeDragger?.name;\n\n this.setActiveDragger();\n this.clearSlices();\n this.clearOverlay();\n\n this.clearSelected();\n this.showAll();\n this.explode();\n\n setOrthogonalCamera(viewpoint.orthogonal_camera);\n setPerspectiveCamera(viewpoint.perspective_camera);\n setClippingPlanes(viewpoint.clipping_planes);\n setSelection(viewpoint.selection);\n this._markup.setViewpoint(viewpoint);\n\n this.target = getVector3FromPoint3d(viewpoint.custom_fields?.camera_target ?? this.target);\n\n this.setActiveDragger(draggerName);\n this.emitEvent({ type: \"drawviewpoint\", data: viewpoint });\n this.update();\n }\n\n createViewpoint(): IViewpoint {\n if (!this.renderer) return {};\n\n const getPoint3dFromVector3 = ({ x, y, z }): IPoint => ({ x, y, z });\n\n const getOrthogonalCamera = (): IOrthogonalCamera => {\n if (this.camera[\"isOrthographicCamera\"])\n return {\n view_point: getPoint3dFromVector3(this.camera.position),\n direction: getPoint3dFromVector3(this.camera.getWorldDirection(new Vector3())),\n up_vector: getPoint3dFromVector3(this.camera.up),\n field_width: this.camera[\"right\"] - this.camera[\"left\"],\n field_height: this.camera[\"top\"] - this.camera[\"bottom\"],\n view_to_world_scale: this.camera.zoom,\n };\n else return undefined;\n };\n\n const getPerspectiveCamera = (): IPerspectiveCamera => {\n if (this.camera[\"isPerspectiveCamera\"])\n return {\n view_point: getPoint3dFromVector3(this.camera.position),\n direction: getPoint3dFromVector3(this.camera.getWorldDirection(new Vector3())),\n up_vector: getPoint3dFromVector3(this.camera.up),\n field_of_view: this.camera[\"fov\"],\n };\n else return undefined;\n };\n\n const getClippingPlanes = (): IClippingPlane[] => {\n const clipping_planes = [];\n this.renderer.clippingPlanes.forEach((plane: Plane) => {\n const clipping_plane = {\n location: getPoint3dFromVector3(plane.coplanarPoint(new Vector3())),\n direction: getPoint3dFromVector3(plane.normal),\n };\n clipping_planes.push(clipping_plane);\n });\n return clipping_planes;\n };\n\n const getSelection = (): IEntity[] => {\n return this.getSelected().map((handle) => ({ handle }));\n };\n\n const viewpoint: IViewpoint = { custom_fields: {} };\n\n viewpoint.orthogonal_camera = getOrthogonalCamera();\n viewpoint.perspective_camera = getPerspectiveCamera();\n viewpoint.clipping_planes = getClippingPlanes();\n viewpoint.selection = getSelection();\n viewpoint.description = new Date().toDateString();\n this._markup.getViewpoint(viewpoint);\n\n viewpoint.custom_fields.camera_target = getPoint3dFromVector3(this.target);\n\n this.emitEvent({ type: \"createviewpoint\", data: viewpoint });\n\n return viewpoint;\n }\n}\n"],"names":[],"mappings":"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I,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,GAAG;AACH,EAAE;AACF,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACZ,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AACX,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACV,GAAG;AACH,CAAC;;AC3NK,MAAO,OAAQ,SAAQ,KAAK,CAAA;AAAlC,IAAA,WAAA,GAAA;;QACU,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,iBAAiB,GAAG,EAAE;IAchC;AAZW,IAAA,cAAc,CAAC,QAAuB,EAAA;AAC7C,QAAA,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,SAAS;AACtC,QAAA,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,cAAc;AAEhD,QAAA,QAAQ,CAAC,SAAS,GAAG,KAAK;AAC1B,QAAA,QAAQ,CAAC,cAAc,GAAG,EAAE;IAC9B;AAES,IAAA,aAAa,CAAC,QAAuB,EAAA;AAC5C,QAAA,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,iBAAiB;AAChD,QAAA,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY;IACxC;AACD;;ACoCK,MAAO,MACX,SAAQ,aAAgE,CAAA;AA0CxE,IAAA,WAAA,CAAY,MAAe,EAAA;AACzB,QAAA,KAAK,EAAE;QACP,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;AAEjC,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AAEpB,QAAA,IAAI,CAAC,YAAY,GAAG,aAAa;AACjC,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,KAAY,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAE7D,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;AACjB,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE;AAChB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;AAClB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE;AACzB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE;AAE3B,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AAErB,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;QAEpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AAEpC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,EAAE;IAC7B;AAEA,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;IACtB;AAEA,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAC3C;AAEA,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,CAAC,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC;IAC/C;AAOA,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,OAAO;IACrB;IAEA,UAAU,CAAC,MAAyB,EAAE,UAAwD,EAAA;AAC5F,QAAA,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAE/E,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE;AAC5B,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAElC,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,gBAAgB;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,qBAAqB,EAAE;AACzD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;AAC7B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC;AAC/B,QAAA,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM;AAE7B,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC;AAC5D,QAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;AAEpC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,CAAC;YAChC,MAAM;AACN,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,qBAAqB,EAAE,IAAI;AAC3B,YAAA,eAAe,EAAE,kBAAkB;AACnC,YAAA,sBAAsB,EAAE,IAAI;AAC7B,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;AAEpC,QAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,GAAG,oBAAoB;AAErD,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;AAEzD,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;AAC5D,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK;AAE9B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAC9B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAE;QAE9B,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;AACjF,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,IAAI;AAEnC,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,EAAE;QAElC,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;AAEpC,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;AAEtF,QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC;QAEnE,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;AACpD,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/D;QAEA,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,WAAW,EAAE;AAElB,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;QAE7B,IAAI,OAAO,UAAU,KAAK,UAAU;YAClC,UAAU,CAAC,IAAI,aAAa,CAAC,UAAU,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAE5F,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AAEtC,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;IAC9B;IAEA,OAAO,GAAA;QACL,IAAI,CAAC,MAAM,EAAE;QACb,IAAI,CAAC,KAAK,EAAE;QAEZ,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACnC,IAAI,CAAC,kBAAkB,EAAE;QAEzB,IAAI,CAAC,gBAAgB,EAAE;AAEvB,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,SAAqB,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;AACxE,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AAErB,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AAEtB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;AAC9F,YAAA,IAAI,CAAC,MAAM,GAAG,SAAS;QACzB;QAEA,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;QAC1C,IAAI,IAAI,CAAC,UAAU;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;QAC9C,IAAI,IAAI,CAAC,WAAW;AAAE,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;QAChD,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;QAC1C,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;QAC1C,IAAI,IAAI,CAAC,cAAc;AAAE,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QACtD,IAAI,IAAI,CAAC,UAAU;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;QAC9C,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;AAE1C,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS;AACtB,QAAA,IAAI,CAAC,OAAO,GAAG,SAAS;AACxB,QAAA,IAAI,CAAC,MAAM,GAAG,SAAS;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,QAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;AACzB,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;AACzB,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS;AAC/B,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;AAEzB,QAAA,OAAO,IAAI;IACb;IAEA,aAAa,GAAA;AACX,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ;IACxB;AAEA,IAAA,OAAO,CAAC,KAAa,EAAE,MAAc,EAAE,WAAW,GAAG,IAAI,EAAA;QACvD,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AAEpB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAa;AACjC,QAAA,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM;AAE7B,QAAA,IAAI,MAAM,CAAC,mBAAmB,EAAE;AAC9B,YAAA,MAAM,CAAC,MAAM,GAAG,MAAM;YACtB,MAAM,CAAC,sBAAsB,EAAE;QACjC;AACA,QAAA,IAAI,MAAM,CAAC,oBAAoB,EAAE;YAC/B,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM;YACpC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM;YAClC,MAAM,CAAC,sBAAsB,EAAE;QACjC;QAEA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;AAEpC,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACjB,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACnD;IAEA,MAAM,CAAC,KAAK,GAAG,KAAK,EAAA;AAClB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,KAAK;YAAE,IAAI,CAAC,MAAM,EAAE;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACjD;AAEA,IAAA,MAAM,CAAC,IAA0B,EAAE,KAAK,GAAG,KAAK,EAAA;;QAC9C,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK;YAAE;AAEnC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,MAAM,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI;AAElD,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAE1B,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,MAAM,EAAE;AAC9E,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;AAC7C,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;QACjD;aAAO;AACL,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;QACjC;AAEA,QAAA,CAAA,EAAA,GAAA,MAAA,IAAI,CAAC,cAAc,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,aAAa,kDAAI;AAEtC,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACrD;AAEA,IAAA,cAAc,CAAC,KAA8B,EAAA;AAE3C,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;IAC9B;AAkEA,IAAA,MAAM,IAAI,CACR,IAAgB,EAChB,SAQI,EAAE,EAAA;QAEN,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI;AAE/B,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;YACnD,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,KAAK,EAAE;QACd;QAEA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAEtC,IAAI,KAAK,GAAQ,IAAI;QACrB,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE;AAClD,YAAA,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YACtC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAY,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI;QAC3E;AACA,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,CAAsB,CAAC;AAEnD,QAAA,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM;QAC1B,IAAI,CAAC,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;AAAE,YAAA,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;AACnF,QAAA,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;AACvE,QAAA,IAAI,CAAC,MAAM,IAAI,IAAI,YAAY,UAAU,CAAC,IAAI;AAAE,YAAA,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;AAEnF,QAAA,MAAM,MAAM,GAAY,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC;AACjE,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,CAAsB,CAAC;AACpD,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AAEzB,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACtD,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YAChC,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;QAC1C;QAAE,OAAO,KAAU,EAAE;AACnB,YAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACnE,YAAA,MAAM,KAAK;QACb;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAEpD,QAAA,OAAO,IAAI;IACb;AAOA,IAAA,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,SAAc,EAAE,EAAA;AAChD,QAAA,OAAO,CAAC,IAAI,CACV,0HAA0H,CAC3H;AAED,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACtE;AAOA,IAAA,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,SAAc,EAAE,EAAA;AAChD,QAAA,OAAO,CAAC,IAAI,CACV,0HAA0H,CAC3H;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACtF;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QAEjD,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAClC,QAAA,OAAO,IAAI;IACb;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI;QAE/B,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;AAClD,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;AAEjB,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;AAC/C,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE;AAEhB,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAClB,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;QAEpB,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAEjB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAEjC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,WAAW,CAAC,OAAA,GAAoB,IAAI,CAAC,OAAO,EAAA;QAC1C,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;QAEpB,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,YAAY,KAAK,MAAM;QACvD,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,YAAY,KAAK,MAAM;QACvD,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC,YAAY,KAAK,MAAM;QAE7D,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO;QACtD,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO;QAEvD,IAAI,CAAC,MAAM,EAAE;IACf;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AAEpB,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;QAC1B,IAAI,CAAC,MAAM,EAAE;IACf;IAEA,YAAY,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AAEpB,QAAA,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;QAC3B,IAAI,CAAC,MAAM,EAAE;IACf;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AAEpB,QAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,EAAE;QACjC,IAAI,CAAC,MAAM,EAAE;IACf;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;IAC3C;AAEA,IAAA,WAAW,CAAC,OAAkB,EAAA;AAC5B,QAAA,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC;IAC7C;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC;IACtC;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC;IACrC;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC;IACxC;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;IAChC;IAEA,OAAO,CAAC,KAAK,GAAG,CAAC,EAAA;AACf,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC;IACvC;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;IAChC;IAEA,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,cAAc;IAC5B;IAEA,gBAAgB,CAAC,IAAI,GAAG,EAAE,EAAA;;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,IAAI,EAAE;AAC7D,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc;YACtC,IAAI,UAAU,GAAG,IAAI;AAErB,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,gBAAA,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;AAC7B,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI;YAC5B;AACA,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;gBACxB,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;gBAC/C,IAAI,UAAU,EAAE;AACd,oBAAA,IAAI,CAAC,cAAc,GAAG,UAAU;AAChC,oBAAA,CAAA,EAAA,GAAA,MAAA,IAAI,CAAC,cAAc,EAAC,UAAU,kDAAI;gBACpC;YACF;AAEA,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;YAC1B,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,UAAU;AAAE,oBAAA,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA,WAAA,EAAc,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA,CAAE,CAAC;AACtF,gBAAA,IAAI,UAAU;AAAE,oBAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,WAAA,EAAc,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA,CAAE,CAAC;YACrF;AAEA,YAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC3D,IAAI,CAAC,MAAM,EAAE;QACf;QACA,OAAO,IAAI,CAAC,cAAc;IAC5B;IAEA,kBAAkB,GAAA;AAChB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc;QACnC,IAAI,OAAO,EAAE;YACX,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC;QACrC;IACF;AAEA,IAAA,YAAY,CAAC,IAAY,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC;IACtE;IAEA,IAAI,GAAA;AACF,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,aAAa,CAAC,QAAkC,EAAA;QAC9C,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QAEjE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE;AAChD,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;AAC3C,QAAA,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;AAE7C,QAAA,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AACnC,QAAA,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;AAE5B,QAAA,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;IAC/C;AAEA,IAAA,aAAa,CAAC,QAA6C,EAAA;QACzD,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE;AAE3D,QAAA,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC7D,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QAE1B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE;AAChD,QAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;AAC1C,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAE5C,QAAA,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE;IACjB;IAEA,QAAQ,GAAA;AACN,QAAA,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAC7B;AAEA,IAAA,cAAc,CAAC,EAAU,EAAE,GAAG,IAAW,EAAA;QACvC,OAAO,QAAQ,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACnD;AAEA,IAAA,aAAa,CAAC,SAAqB,EAAA;;QACjC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;QAEpB,MAAM,qBAAqB,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAc,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAE5E,QAAA,MAAM,mBAAmB,GAAG,CAAC,iBAAoC,KAAI;YACnE,IAAI,iBAAiB,EAAE;AACrB,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;AAC3E,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;gBACzD,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC;AAE9C,gBAAA,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE;gBACvC,MAAM,CAAC,GAAG,GAAG,iBAAiB,CAAC,YAAY,GAAG,CAAC;gBAC/C,MAAM,CAAC,MAAM,GAAG,CAAC,iBAAiB,CAAC,YAAY,GAAG,CAAC;gBACnD,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM;gBACpC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM;AAClC,gBAAA,MAAM,CAAC,IAAI,GAAG,CAAC;AACf,gBAAA,MAAM,CAAC,GAAG,GAAG,WAAW,GAAG,IAAI;AAC/B,gBAAA,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC,mBAAmB;gBACnD,MAAM,CAAC,sBAAsB,EAAE;AAE/B,gBAAA,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAClE,gBAAA,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACzE,gBAAA,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACtF,MAAM,CAAC,iBAAiB,EAAE;AAE1B,gBAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,MAAM;AAC/B,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,MAAM;AAChC,gBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,MAAM;AAEnC,gBAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;YACpE;AACF,QAAA,CAAC;AAED,QAAA,MAAM,oBAAoB,GAAG,CAAC,kBAAsC,KAAI;YACtE,IAAI,kBAAkB,EAAE;AACtB,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;AAC3E,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;gBACzD,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC;AAE9C,gBAAA,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE;AACtC,gBAAA,MAAM,CAAC,GAAG,GAAG,kBAAkB,CAAC,aAAa;AAC7C,gBAAA,MAAM,CAAC,MAAM,GAAG,MAAM;AACtB,gBAAA,MAAM,CAAC,IAAI,GAAG,WAAW,GAAG,IAAI;AAChC,gBAAA,MAAM,CAAC,GAAG,GAAG,WAAW,GAAG,IAAI;gBAC/B,MAAM,CAAC,sBAAsB,EAAE;AAE/B,gBAAA,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACnE,gBAAA,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;AAC1E,gBAAA,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvF,MAAM,CAAC,iBAAiB,EAAE;AAE1B,gBAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,MAAM;AAC/B,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,MAAM;AAChC,gBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,MAAM;AAEnC,gBAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YACnE;AACF,QAAA,CAAC;AAED,QAAA,MAAM,iBAAiB,GAAG,CAAC,eAAiC,KAAI;YAC9D,eAAe,KAAA,IAAA,IAAf,eAAe,KAAA,MAAA,GAAA,MAAA,GAAf,eAAe,CAAE,OAAO,CAAC,CAAC,cAAc,KAAI;AAC1C,gBAAA,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;AACzB,gBAAA,KAAK,CAAC,6BAA6B,CACjC,qBAAqB,CAAC,cAAc,CAAC,SAAS,CAAC,EAC/C,qBAAqB,CAAC,cAAc,CAAC,QAAQ,CAAC,CAC/C;gBAED,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1C,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AAED,QAAA,MAAM,YAAY,GAAG,CAAC,SAAoB,KAAI;AAC5C,YAAA,IAAI,SAAS;AAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC;AACjF,QAAA,CAAC;QAED,MAAM,WAAW,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,cAAc,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,IAAI;QAE7C,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,YAAY,EAAE;QAEnB,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,OAAO,EAAE;QACd,IAAI,CAAC,OAAO,EAAE;AAEd,QAAA,mBAAmB,CAAC,SAAS,CAAC,iBAAiB,CAAC;AAChD,QAAA,oBAAoB,CAAC,SAAS,CAAC,kBAAkB,CAAC;AAClD,QAAA,iBAAiB,CAAC,SAAS,CAAC,eAAe,CAAC;AAC5C,QAAA,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC;AACjC,QAAA,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC;AAEpC,QAAA,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,MAAA,CAAA,EAAA,GAAA,SAAS,CAAC,aAAa,0CAAE,aAAa,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,IAAI,CAAC,MAAM,CAAC;AAE1F,QAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC1D,IAAI,CAAC,MAAM,EAAE;IACf;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;QAE7B,MAAM,qBAAqB,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAc,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAEpE,MAAM,mBAAmB,GAAG,MAAwB;AAClD,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC;gBACrC,OAAO;oBACL,UAAU,EAAE,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;AACvD,oBAAA,SAAS,EAAE,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;oBAC9E,SAAS,EAAE,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AAChD,oBAAA,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AACvD,oBAAA,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;AACxD,oBAAA,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;iBACtC;;AACE,gBAAA,OAAO,SAAS;AACvB,QAAA,CAAC;QAED,MAAM,oBAAoB,GAAG,MAAyB;AACpD,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;gBACpC,OAAO;oBACL,UAAU,EAAE,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;AACvD,oBAAA,SAAS,EAAE,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;oBAC9E,SAAS,EAAE,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AAChD,oBAAA,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;iBAClC;;AACE,gBAAA,OAAO,SAAS;AACvB,QAAA,CAAC;QAED,MAAM,iBAAiB,GAAG,MAAuB;YAC/C,MAAM,eAAe,GAAG,EAAE;YAC1B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAY,KAAI;AACpD,gBAAA,MAAM,cAAc,GAAG;oBACrB,QAAQ,EAAE,qBAAqB,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AACnE,oBAAA,SAAS,EAAE,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC;iBAC/C;AACD,gBAAA,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC;AACtC,YAAA,CAAC,CAAC;AACF,YAAA,OAAO,eAAe;AACxB,QAAA,CAAC;QAED,MAAM,YAAY,GAAG,MAAgB;AACnC,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACzD,QAAA,CAAC;AAED,QAAA,MAAM,SAAS,GAAe,EAAE,aAAa,EAAE,EAAE,EAAE;AAEnD,QAAA,SAAS,CAAC,iBAAiB,GAAG,mBAAmB,EAAE;AACnD,QAAA,SAAS,CAAC,kBAAkB,GAAG,oBAAoB,EAAE;AACrD,QAAA,SAAS,CAAC,eAAe,GAAG,iBAAiB,EAAE;AAC/C,QAAA,SAAS,CAAC,SAAS,GAAG,YAAY,EAAE;QACpC,SAAS,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,YAAY,EAAE;AACjD,QAAA,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC;QAEpC,SAAS,CAAC,aAAa,CAAC,aAAa,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC;AAE1E,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAE5D,QAAA,OAAO,SAAS;IAClB;AACD;;;;"}
|