@inweb/viewer-three 25.9.8 → 25.10.0

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.
Files changed (109) hide show
  1. package/README.md +26 -18
  2. package/dist/viewer-three.js +10315 -6179
  3. package/dist/viewer-three.js.map +1 -1
  4. package/dist/viewer-three.min.js +3 -2
  5. package/dist/viewer-three.module.js +1881 -322
  6. package/dist/viewer-three.module.js.map +1 -1
  7. package/lib/Viewer/IDisposable.d.ts +6 -0
  8. package/lib/Viewer/Viewer.d.ts +113 -14
  9. package/lib/Viewer/commands/ApplyModelTransform.d.ts +1 -0
  10. package/lib/Viewer/commands/ClearMarkup.d.ts +1 -0
  11. package/lib/Viewer/commands/ClearSlices.d.ts +1 -0
  12. package/lib/Viewer/commands/CreatePreview.d.ts +1 -0
  13. package/lib/Viewer/commands/Explode.d.ts +1 -0
  14. package/lib/Viewer/commands/GetDefaultViewPositions.d.ts +1 -0
  15. package/lib/Viewer/commands/GetModels.d.ts +1 -0
  16. package/lib/Viewer/commands/GetSelected.d.ts +1 -0
  17. package/lib/Viewer/commands/HideSelected.d.ts +1 -0
  18. package/lib/Viewer/commands/IsolateSelected.d.ts +1 -0
  19. package/lib/Viewer/commands/RegenerateAll.d.ts +1 -0
  20. package/lib/Viewer/commands/ResetView.d.ts +1 -0
  21. package/lib/Viewer/commands/SelectModel.d.ts +1 -0
  22. package/lib/Viewer/commands/SetActiveDragger.d.ts +1 -0
  23. package/lib/Viewer/commands/SetDefaultViewPosition.d.ts +13 -0
  24. package/lib/Viewer/commands/SetMarkupColor.d.ts +1 -0
  25. package/lib/Viewer/commands/SetSelected.d.ts +1 -0
  26. package/lib/Viewer/commands/ShowAll.d.ts +1 -0
  27. package/lib/Viewer/commands/Unselect.d.ts +1 -0
  28. package/lib/Viewer/commands/ZoomToExtents.d.ts +1 -0
  29. package/lib/Viewer/commands/ZoomToObjects.d.ts +1 -0
  30. package/lib/Viewer/commands/ZoomToSelected.d.ts +1 -0
  31. package/lib/Viewer/commands/index.d.ts +22 -0
  32. package/lib/Viewer/components/AxesHelperComponent.d.ts +10 -0
  33. package/lib/Viewer/components/BackgroundComponent.d.ts +4 -4
  34. package/lib/Viewer/components/{DefaultCameraPositionComponent.d.ts → DefaultPositionComponent.d.ts} +3 -2
  35. package/lib/Viewer/components/ExtentsComponent.d.ts +8 -0
  36. package/lib/Viewer/components/ExtentsHelperComponent.d.ts +9 -0
  37. package/lib/Viewer/components/LightComponent.d.ts +5 -5
  38. package/lib/Viewer/components/RenderLoopComponent.d.ts +3 -3
  39. package/lib/Viewer/components/ResizeCanvasComponent.d.ts +2 -2
  40. package/lib/Viewer/components/SelectionComponent.d.ts +19 -0
  41. package/lib/Viewer/components/ViewPositionComponent.d.ts +31 -0
  42. package/lib/Viewer/components/WCSHelperComponent.d.ts +9 -0
  43. package/lib/Viewer/controls/WalkControls.d.ts +26 -0
  44. package/lib/Viewer/draggers/CuttingPlaneDragger.d.ts +17 -0
  45. package/lib/Viewer/draggers/CuttingPlaneXAxis.d.ts +5 -0
  46. package/lib/Viewer/draggers/CuttingPlaneYAxis.d.ts +5 -0
  47. package/lib/Viewer/draggers/CuttingPlaneZAxis.d.ts +5 -0
  48. package/lib/Viewer/draggers/OrbitDragger.d.ts +9 -5
  49. package/lib/Viewer/draggers/WalkDragger.d.ts +7 -33
  50. package/lib/Viewer/helpers/PlaneHelper.d.ts +11 -0
  51. package/lib/Viewer/helpers/WCSHelper.d.ts +10 -0
  52. package/lib/Viewer/loaders/GLTFLoadingManager.d.ts +3 -3
  53. package/lib/index.d.ts +1 -0
  54. package/package.json +7 -6
  55. package/src/Viewer/IDisposable.ts +29 -0
  56. package/src/Viewer/Viewer.ts +218 -49
  57. package/src/Viewer/commands/ApplyModelTransform.ts +33 -0
  58. package/src/Viewer/commands/ClearMarkup.ts +29 -0
  59. package/src/Viewer/commands/ClearSlices.ts +32 -0
  60. package/src/Viewer/commands/CreatePreview.ts +32 -0
  61. package/src/Viewer/commands/Explode.ts +83 -0
  62. package/src/Viewer/commands/GetDefaultViewPositions.ts +31 -0
  63. package/src/Viewer/commands/GetModels.ts +32 -0
  64. package/src/Viewer/commands/GetSelected.ts +31 -0
  65. package/src/Viewer/commands/HideSelected.ts +40 -0
  66. package/src/Viewer/commands/IsolateSelected.ts +50 -0
  67. package/src/Viewer/commands/RegenerateAll.ts +32 -0
  68. package/src/Viewer/commands/ResetView.ts +41 -0
  69. package/src/Viewer/commands/SelectModel.ts +32 -0
  70. package/src/Viewer/commands/SetActiveDragger.ts +29 -0
  71. package/src/Viewer/commands/SetDefaultViewPosition.ts +83 -0
  72. package/src/Viewer/commands/SetMarkupColor.ts +30 -0
  73. package/src/Viewer/commands/SetSelected.ts +44 -0
  74. package/src/Viewer/commands/ShowAll.ts +34 -0
  75. package/src/Viewer/commands/Unselect.ts +37 -0
  76. package/src/Viewer/commands/ZoomToExtents.ts +47 -0
  77. package/src/Viewer/commands/ZoomToObjects.ts +55 -0
  78. package/src/Viewer/commands/ZoomToSelected.ts +51 -0
  79. package/src/Viewer/commands/index.ts +45 -0
  80. package/src/Viewer/components/AxesHelperComponent.ts +70 -0
  81. package/src/Viewer/components/BackgroundComponent.ts +9 -7
  82. package/src/Viewer/components/{DefaultCameraPositionComponent.ts → DefaultPositionComponent.ts} +11 -22
  83. package/src/Viewer/components/ExtentsComponent.ts +54 -0
  84. package/src/Viewer/components/ExtentsHelperComponent.ts +58 -0
  85. package/src/Viewer/components/LightComponent.ts +14 -10
  86. package/src/Viewer/components/RenderLoopComponent.ts +6 -6
  87. package/src/Viewer/components/ResizeCanvasComponent.ts +2 -2
  88. package/src/Viewer/components/SelectionComponent.ts +132 -0
  89. package/src/Viewer/components/ViewPositionComponent.ts +165 -0
  90. package/src/Viewer/components/WCSHelperComponent.ts +46 -0
  91. package/src/Viewer/controls/WalkControls.ts +221 -0
  92. package/src/Viewer/draggers/CuttingPlaneDragger.ts +110 -0
  93. package/src/Viewer/draggers/CuttingPlaneXAxis.ts +33 -0
  94. package/src/Viewer/draggers/CuttingPlaneYAxis.ts +33 -0
  95. package/src/Viewer/draggers/CuttingPlaneZAxis.ts +33 -0
  96. package/src/Viewer/draggers/OrbitDragger.ts +47 -22
  97. package/src/Viewer/draggers/PanDragger.ts +4 -3
  98. package/src/Viewer/draggers/WalkDragger.ts +27 -216
  99. package/src/Viewer/draggers/ZoomDragger.ts +4 -3
  100. package/src/Viewer/helpers/PlaneHelper.ts +99 -0
  101. package/src/Viewer/helpers/WCSHelper.ts +119 -0
  102. package/src/Viewer/loaders/GLTFLoadingManager.ts +6 -6
  103. package/src/index.ts +2 -0
  104. package/lib/Viewer/IComponent.d.ts +0 -3
  105. package/lib/Viewer/components/ObjectSelectionComponent.d.ts +0 -16
  106. package/lib/Viewer/draggers/ClippingPlaneDragger.d.ts +0 -17
  107. package/src/Viewer/IComponent.ts +0 -3
  108. package/src/Viewer/components/ObjectSelectionComponent.ts +0 -105
  109. package/src/Viewer/draggers/ClippingPlaneDragger.ts +0 -120
@@ -1 +1 @@
1
- {"version":3,"file":"viewer-three.module.js","sources":["../../viewer-core/dist/viewer-core.module.js","../../eventemitter2/dist/eventemitter2.module.js","../src/Viewer/loaders/GLTFLoadingManager.ts","../src/Viewer/draggers/OrbitDragger.ts","../src/Viewer/draggers/PanDragger.ts","../src/Viewer/draggers/ZoomDragger.ts","../src/Viewer/draggers/WalkDragger.ts","../src/Viewer/draggers/ClippingPlaneDragger.ts","../src/Viewer/components/LightComponent.ts","../src/Viewer/components/BackgroundComponent.ts","../src/Viewer/components/DefaultCameraPositionComponent.ts","../src/Viewer/components/ResizeCanvasComponent.ts","../src/Viewer/components/RenderLoopComponent.ts","../src/Viewer/Viewer.ts"],"sourcesContent":["class Commands {\n constructor() {\n this._commands = new Map;\n }\n registerCommand(id, handler, description, thisArg) {\n this._commands.set(id, {\n id: id,\n handler: handler,\n thisArg: thisArg,\n description: description\n });\n }\n registerCommandAlias(id, alias) {\n this.registerCommand(alias, ((viewer, ...args) => this.executeCommand(id, viewer, ...args)));\n }\n getCommand(id) {\n return this._commands.get(id);\n }\n getCommands() {\n const map = new Map;\n this._commands.forEach(((value, key) => map.set(key, value)));\n return map;\n }\n executeCommand(id, viewer, ...args) {\n const command = this._commands.get(id);\n if (!command) {\n if (viewer) {\n const isDraggerCommand = viewer.draggers.includes(id);\n if (isDraggerCommand) return viewer.setActiveDragger(id);\n }\n console.warn(`Command '${id}' not found`);\n return undefined;\n }\n const {handler: handler, thisArg: thisArg} = command;\n const result = handler.apply(thisArg, [ viewer, ...args ]);\n viewer === null || viewer === void 0 ? void 0 : viewer.emit({\n type: \"command\",\n data: id,\n args: args\n });\n return result;\n }\n}\n\nconst _commands = new Map;\n\nfunction commands(viewerType = \"\") {\n let result = _commands.get(viewerType);\n if (!result) {\n result = new Commands;\n _commands.set(viewerType, result);\n }\n return result;\n}\n\ncommands(\"\").registerCommand(\"noop\", (() => {}));\n\ncommands(\"VisualizeJS\").registerCommand(\"noop\", (() => {}));\n\ncommands(\"ThreeJS\").registerCommand(\"noop\", (() => {}));\n\nfunction defaultOptions() {\n return {\n showWCS: true,\n cameraAnimation: true,\n antialiasing: true,\n groundShadow: false,\n shadows: false,\n cameraAxisXSpeed: 4,\n cameraAxisYSpeed: 1,\n ambientOcclusion: false,\n enableStreamingMode: true,\n enablePartialMode: false,\n memoryLimit: 3294967296,\n cuttingPlaneFillColor: {\n red: 255,\n green: 152,\n blue: 0\n },\n edgesColor: {\n r: 255,\n g: 152,\n b: 0\n },\n facesColor: {\n r: 255,\n g: 152,\n b: 0\n },\n edgesVisibility: true,\n edgesOverlap: true,\n facesOverlap: false,\n facesTransparancy: 200,\n enableCustomHighlight: true,\n sceneGraph: false,\n edgeModel: true,\n reverseZoomWheel: false,\n enableZoomWheel: true,\n enableGestures: true,\n geometryType: \"vsfx\"\n };\n}\n\nclass Options {\n constructor(emitter) {\n this._emitter = emitter;\n this._data = defaultOptions();\n this.loadFromStorage();\n }\n static defaults() {\n return defaultOptions();\n }\n notifierChangeEvent() {\n console.warn(\"Options.notifierChangeEvent() has been deprecated since 25.3 and will be removed in a future release, use Options.change() instead.\");\n this.change();\n }\n change() {\n if (this._emitter !== undefined) {\n this.saveToStorage();\n this._emitter.emit({\n type: \"optionschange\",\n data: this\n });\n }\n }\n saveToStorage() {\n if (typeof window !== \"undefined\") try {\n localStorage.setItem(\"od-client-settings\", JSON.stringify(this.data));\n } catch (error) {\n console.error(\"Cannot save client settings.\", error);\n }\n }\n loadFromStorage() {\n if (typeof window !== \"undefined\") try {\n const item = localStorage.getItem(\"od-client-settings\");\n if (item) {\n const data = JSON.parse(item);\n this.data = {\n ...data\n };\n }\n } catch (error) {\n console.error(\"Cannot load client settings.\", error);\n }\n }\n resetToDefaults(fields) {\n if (fields !== undefined) {\n const defaults = Options.defaults();\n const resetData = fields.reduce(((acc, field) => {\n acc[field] = defaults[field];\n return acc;\n }), {});\n this.data = {\n ...this.data,\n ...resetData\n };\n } else {\n this.data = {\n ...this.data,\n ...Options.defaults()\n };\n }\n }\n get data() {\n return this._data;\n }\n set data(value) {\n const enablePartialMode = value.enableStreamingMode ? value.enablePartialMode : false;\n const sceneGraph = enablePartialMode ? false : value.sceneGraph;\n this._data = {\n ...Options.defaults(),\n ...this._data,\n ...value,\n enablePartialMode: enablePartialMode,\n sceneGraph: sceneGraph\n };\n this.change();\n }\n get showWCS() {\n return this._data.showWCS;\n }\n set showWCS(value) {\n this._data.showWCS = value;\n this.change();\n }\n get cameraAnimation() {\n return this._data.cameraAnimation;\n }\n set cameraAnimation(value) {\n this._data.cameraAnimation = value;\n this.change();\n }\n get antialiasing() {\n return this._data.antialiasing;\n }\n set antialiasing(value) {\n this._data.antialiasing = value;\n this.change();\n }\n get groundShadow() {\n return this._data.groundShadow;\n }\n set groundShadow(value) {\n this._data.groundShadow = value;\n this.change();\n }\n get shadows() {\n return this._data.shadows;\n }\n set shadows(value) {\n this._data.shadows = value;\n this.change();\n }\n get cameraAxisXSpeed() {\n return this._data.cameraAxisXSpeed;\n }\n set cameraAxisXSpeed(value) {\n this._data.cameraAxisXSpeed = value;\n this.change();\n }\n get cameraAxisYSpeed() {\n return this._data.cameraAxisYSpeed;\n }\n set cameraAxisYSpeed(value) {\n this.cameraAxisYSpeed = value;\n this.change();\n }\n get ambientOcclusion() {\n return this._data.ambientOcclusion;\n }\n set ambientOcclusion(value) {\n this._data.ambientOcclusion = value;\n this.change();\n }\n get enableStreamingMode() {\n return this._data.enableStreamingMode;\n }\n set enableStreamingMode(value) {\n this._data.enableStreamingMode = value;\n if (!value) this._data.enablePartialMode = false;\n this.change();\n }\n get enablePartialMode() {\n return this._data.enablePartialMode;\n }\n set enablePartialMode(value) {\n this._data.enablePartialMode = value;\n if (value) {\n this._data.enableStreamingMode = true;\n this._data.sceneGraph = false;\n }\n this.change();\n }\n get memoryLimit() {\n return this._data.memoryLimit;\n }\n set memoryLimit(value) {\n this._data.memoryLimit = value;\n this.change();\n }\n get cuttingPlaneFillColor() {\n return this._data.cuttingPlaneFillColor;\n }\n set cuttingPlaneFillColor(value) {\n this._data.cuttingPlaneFillColor = value;\n this.change();\n }\n get edgesColor() {\n return this._data.edgesColor;\n }\n set edgesColor(value) {\n this._data.edgesColor = value;\n this.change();\n }\n get facesColor() {\n return this._data.facesColor;\n }\n set facesColor(value) {\n this._data.facesColor = value;\n this.change();\n }\n get edgesVisibility() {\n return this._data.edgesVisibility;\n }\n set edgesVisibility(value) {\n this._data.edgesVisibility = value;\n this.change();\n }\n get edgesOverlap() {\n return this._data.edgesOverlap;\n }\n set edgesOverlap(value) {\n this._data.edgesOverlap = value;\n this.change();\n }\n get facesOverlap() {\n return this._data.facesOverlap;\n }\n set facesOverlap(value) {\n this._data.facesOverlap = value;\n this.change();\n }\n get facesTransparancy() {\n return this._data.facesTransparancy;\n }\n set facesTransparancy(value) {\n this._data.facesTransparancy = value;\n this.change();\n }\n get enableCustomHighlight() {\n return this._data.enableCustomHighlight;\n }\n set enableCustomHighlight(value) {\n this._data.enableCustomHighlight = value;\n this.change();\n }\n get sceneGraph() {\n return this._data.sceneGraph;\n }\n set sceneGraph(value) {\n this._data.sceneGraph = value;\n if (value) this._data.enablePartialMode = false;\n this.change();\n }\n get edgeModel() {\n return Boolean(this._data.edgeModel);\n }\n set edgeModel(value) {\n this._data.edgeModel = Boolean(value);\n this.change();\n }\n get reverseZoomWheel() {\n return this._data.reverseZoomWheel;\n }\n set reverseZoomWheel(value) {\n this._data.reverseZoomWheel = !!value;\n this.change();\n }\n get enableZoomWheel() {\n return this._data.enableZoomWheel;\n }\n set enableZoomWheel(value) {\n this._data.enableZoomWheel = !!value;\n this.change();\n }\n get enableGestures() {\n return this._data.enableGestures;\n }\n set enableGestures(value) {\n this._data.enableGestures = !!value;\n this.change();\n }\n get geometryType() {\n return this._data.geometryType;\n }\n set geometryType(value) {\n this._data.geometryType = value;\n this.change();\n }\n}\n\nconst CanvasEvents = [ \"click\", \"contextmenu\", \"dblclick\", \"mousedown\", \"mouseleave\", \"mousemove\", \"mouseup\", \"pointercancel\", \"pointerdown\", \"pointerleave\", \"pointermove\", \"pointerup\", \"touchcancel\", \"touchend\", \"touchmove\", \"touchstart\", \"wheel\" ];\n\nconst CANVAS_EVENTS = CanvasEvents;\n\nclass Dragger {\n constructor(viewer) {\n this.name = \"\";\n }\n initialize() {}\n dispose() {}\n updatePreview() {}\n}\n\nexport { CANVAS_EVENTS, CanvasEvents, Dragger, Options, commands, defaultOptions };\n//# sourceMappingURL=viewer-core.module.js.map\n","class EventEmitter2 {\n constructor() {\n this._listeners = {};\n }\n addEventListener(type, listener) {\n if (this._listeners[type] === undefined) this._listeners[type] = [];\n this._listeners[type].push(listener);\n return this;\n }\n removeEventListener(type, listener) {\n if (this._listeners[type] === undefined) return this;\n const listeners = this._listeners[type].filter((x => x !== listener));\n if (listeners.length !== 0) this._listeners[type] = listeners; else delete this._listeners[type];\n return this;\n }\n removeAllListeners(type) {\n if (type) delete this._listeners[type]; else this._listeners = {};\n return this;\n }\n emitEvent(event) {\n if (this._listeners[event.type] === undefined) return false;\n const invoke = this._listeners[event.type].slice();\n invoke.forEach((listener => listener.call(this, event)));\n return true;\n }\n on(type, listener) {\n return this.addEventListener(type, listener);\n }\n off(type, listener) {\n return this.removeEventListener(type, listener);\n }\n emit(type, ...args) {\n if (typeof type === \"string\") return this.emitEvent({\n type: type,\n args: args\n }); else if (typeof type === \"object\") return this.emitEvent(type); else return false;\n }\n}\n\nexport { EventEmitter2 };\n//# sourceMappingURL=eventemitter2.module.js.map\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 * as THREE from \"three\";\n\nexport class GLTFLoadingManager extends THREE.LoadingManager {\n public path = \"\";\n public resourcePath = \"\";\n public fileURL = \"\";\n public dataURLs = new Map();\n\n constructor(\n file: string | ArrayBuffer | Blob,\n externalData: Map<string, string | ArrayBuffer | Blob> = new Map(),\n params: { path?: string } = {}\n ) {\n super();\n\n this.path = params.path || \"\";\n\n if (typeof file === \"string\") {\n this.fileURL = file;\n this.resourcePath = THREE.LoaderUtils.extractUrlBase(file);\n } else {\n externalData.forEach((value, key) => (this.fileURL = value === file ? key : this.fileURL));\n externalData.set(this.fileURL, file);\n }\n\n externalData.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(): void {\n this.dataURLs.forEach(URL.revokeObjectURL);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { GeometryEndEvent } from \"@inweb/viewer-core\";\nimport * as THREE from \"three\";\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class OrbitDragger extends OrbitControls {\n private viewer: Viewer;\n\n constructor(viewer: Viewer) {\n super(viewer.camera, viewer.canvas);\n this.mouseButtons = { LEFT: THREE.MOUSE.ROTATE, MIDDLE: THREE.MOUSE.PAN, RIGHT: THREE.MOUSE.PAN };\n this.touches = { ONE: THREE.TOUCH.ROTATE, TWO: THREE.TOUCH.DOLLY_PAN };\n this.screenSpacePanning = true;\n this.rotateSpeed = 0.33;\n this.viewer = viewer;\n this.viewer.addEventListener(\"geometryend\", this.geometryEnd);\n this.addEventListener(\"change\", this.updateViewer);\n }\n\n override dispose(): void {\n this.removeEventListener(\"change\", this.updateViewer);\n this.viewer.removeEventListener(\"geometryend\", this.geometryEnd);\n super.dispose();\n }\n\n geometryEnd = (event: GeometryEndEvent) => {\n const { data: scene } = event;\n const box = new THREE.Box3().setFromObject(scene);\n const size = box.getSize(new THREE.Vector3()).length();\n\n this.maxDistance = size * 10;\n this.update();\n };\n\n updateViewer = () => {\n this.viewer.update();\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 * as THREE from \"three\";\nimport { OrbitDragger } from \"./OrbitDragger\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class PanDragger extends OrbitDragger {\n constructor(viewer: Viewer) {\n super(viewer);\n this.mouseButtons = { LEFT: THREE.MOUSE.PAN, MIDDLE: THREE.MOUSE.PAN, RIGHT: THREE.MOUSE.PAN };\n this.touches = { ONE: THREE.TOUCH.PAN, TWO: THREE.TOUCH.DOLLY_ROTATE };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 * as THREE from \"three\";\nimport { OrbitDragger } from \"./OrbitDragger\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ZoomDragger extends OrbitDragger {\n constructor(viewer: Viewer) {\n super(viewer);\n this.mouseButtons = { LEFT: THREE.MOUSE.DOLLY, MIDDLE: THREE.MOUSE.PAN, RIGHT: THREE.MOUSE.PAN };\n this.touches = { ONE: THREE.TOUCH.DOLLY_PAN, TWO: THREE.TOUCH.DOLLY_PAN };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { RenderEvent } from \"@inweb/viewer-core\";\nimport * as THREE from \"three\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class WalkDragger {\n protected viewer: Viewer;\n protected camera: THREE.Camera;\n protected canvas: HTMLCanvasElement;\n protected _target: THREE.Vector3;\n protected quaternion: THREE.Quaternion;\n protected mouseStart: THREE.Vector2;\n protected mouseDelta: THREE.Vector2;\n protected xAxis: THREE.Vector3;\n protected yAxis: THREE.Vector3;\n protected zAxis: THREE.Vector3;\n protected speed: THREE.Vector3;\n protected _maxDistance: number;\n protected xRotation: THREE.Quaternion;\n protected yRotation: THREE.Quaternion;\n protected yRotationAxis: THREE.Vector3;\n protected touchStartDistance: number;\n\n public walkSpeed: number;\n public boostSpeed: number;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n this._target = new THREE.Vector3();\n\n this.quaternion = this.viewer.camera.quaternion.clone();\n this.xRotation = new THREE.Quaternion();\n this.yRotation = new THREE.Quaternion();\n\n this.mouseStart = new THREE.Vector2();\n this.mouseDelta = new THREE.Vector2();\n\n this.xAxis = new THREE.Vector3();\n this.yAxis = new THREE.Vector3();\n this.zAxis = new THREE.Vector3();\n this.yRotationAxis = new THREE.Vector3(1, 0, 0);\n this.walkSpeed = 1;\n this.boostSpeed = 5;\n this.speed = new THREE.Vector3();\n this._maxDistance = 1;\n\n this.touchStartDistance = 0;\n\n this.viewer.addEventListener(\"render\", this.onRender);\n\n this.viewer.addEventListener(\"contextmenu\", this.onContextMenu);\n\n this.viewer.addEventListener(\"mousedown\", this.onMouseDown);\n this.viewer.addEventListener(\"mouseup\", this.onMouseUp);\n\n this.viewer.addEventListener(\"touchstart\", this.onTouchStart);\n this.viewer.addEventListener(\"touchmove\", this.onTouchMove);\n this.viewer.addEventListener(\"touchend\", this.onTouchEnd);\n\n this.viewer.addEventListener(\"wheel\", this.onMouseWheel);\n\n document.addEventListener(\"keydown\", this.onKeyDown);\n document.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n dispose(): void {\n this.viewer.removeEventListener(\"render\", this.onRender);\n\n this.viewer.removeEventListener(\"contextmenu\", this.onContextMenu);\n\n this.viewer.removeEventListener(\"mousedown\", this.onMouseDown);\n this.viewer.removeEventListener(\"mouseup\", this.onMouseUp);\n this.viewer.removeEventListener(\"mousemove\", this.onMouseMove);\n\n this.viewer.removeEventListener(\"touchstart\", this.onTouchStart);\n this.viewer.removeEventListener(\"touchmove\", this.onTouchMove);\n this.viewer.removeEventListener(\"touchend\", this.onTouchEnd);\n\n this.viewer.removeEventListener(\"wheel\", this.onMouseWheel);\n\n document.removeEventListener(\"keydown\", this.onKeyDown);\n document.removeEventListener(\"keyup\", this.onKeyUp);\n }\n\n onKeyDown = (event: KeyboardEvent) => {\n switch (event.code) {\n case \"KeyW\": // Forward\n if (event.shiftKey) {\n this.speed.z = this.walkSpeed * this.boostSpeed;\n } else {\n this.speed.z = this.walkSpeed;\n }\n break;\n case \"KeyS\": // Backward\n if (event.shiftKey) {\n this.speed.z = -this.walkSpeed * this.boostSpeed;\n } else {\n this.speed.z = -this.walkSpeed;\n }\n break;\n case \"KeyA\": // Left\n if (event.shiftKey) {\n this.speed.x = this.walkSpeed * this.boostSpeed;\n } else {\n this.speed.x = this.walkSpeed;\n }\n break;\n case \"KeyD\": // Right\n if (event.shiftKey) {\n this.speed.x = -this.walkSpeed * this.boostSpeed;\n } else {\n this.speed.x = -this.walkSpeed;\n }\n break;\n default:\n break;\n }\n };\n\n onKeyUp = (event: KeyboardEvent) => {\n switch (event.code) {\n case \"KeyW\":\n this.speed.z = 0;\n break;\n case \"KeyS\":\n this.speed.z = 0;\n break;\n case \"KeyA\":\n this.speed.x = 0;\n break;\n case \"KeyD\":\n this.speed.x = 0;\n break;\n default:\n break;\n }\n };\n\n onMouseDown = (event: PointerEvent) => {\n const { clientX, clientY } = event;\n this.mouseStart.set(clientX, clientY);\n this.mouseDelta.set(0, 0);\n this.quaternion.copy(this.viewer.camera.quaternion);\n this.viewer.addEventListener(\"mousemove\", this.onMouseMove);\n };\n\n onMouseMove = (event: MouseEvent) => {\n const { clientX, clientY } = event;\n this.mouseDelta.set(this.mouseStart.x - clientX, this.mouseStart.y - clientY);\n this.rotateCamera(this.mouseDelta);\n };\n\n onMouseUp = (event: PointerEvent) => {\n this.speed.set(0, 0, 0);\n this.mouseStart.set(0, 0);\n this.mouseDelta.set(0, 0);\n this.quaternion.copy(this.viewer.camera.quaternion);\n this.viewer.removeEventListener(\"mousemove\", this.onMouseMove);\n };\n\n onMouseWheel = (event: WheelEvent) => {\n event.preventDefault();\n\n if (-event.deltaY < 0) {\n this.walkSpeed = Math.max(0.001, this.walkSpeed - 1);\n } else if (-event.deltaY > 0) {\n this.walkSpeed++;\n }\n };\n\n onContextMenu = (event: MouseEvent) => {\n console.log(event);\n event.preventDefault();\n event.stopImmediatePropagation();\n };\n\n onTouchStart = (event: TouchEvent) => {\n if (event.touches.length > 1) {\n this.touchStartDistance = this.getTouchsDistance(event.touches);\n } else {\n const { clientX, clientY } = event.touches[0];\n this.mouseStart.set(clientX, clientY);\n this.mouseDelta.set(0, 0);\n this.quaternion.copy(this.viewer.camera.quaternion);\n }\n };\n\n onTouchEnd = (event: TouchEvent) => {\n if (event.touches.length === 0) {\n this.touchStartDistance = 0;\n }\n this.speed.set(0, 0, 0);\n this.mouseStart.set(0, 0);\n this.mouseDelta.set(0, 0);\n this.quaternion.copy(this.viewer.camera.quaternion);\n };\n\n onTouchMove = (event: TouchEvent) => {\n if (event.touches.length === 1 && this.touchStartDistance === 0) {\n const { clientX, clientY } = event.touches[0];\n this.mouseDelta.set(this.mouseStart.x - clientX, this.mouseStart.y - clientY);\n this.rotateCamera(this.mouseDelta);\n }\n if (event.touches.length === 2) {\n const distance = this.getTouchsDistance(event.touches);\n this.speed.z = (distance - this.touchStartDistance) / 2;\n }\n };\n\n getTouchsDistance(touches) {\n const [start, end] = touches;\n const dx = start.clientX - end.clientX;\n const dy = start.clientY - end.clientY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n return distance;\n }\n\n onRender = (event: RenderEvent) => {\n this.viewer.camera.matrix.extractBasis(this.xAxis, this.yAxis, this.zAxis);\n this.viewer.camera.position.add(this.zAxis.multiplyScalar(-event.deltaTime * this.speed.z));\n this.viewer.camera.position.add(this.xAxis.multiplyScalar(-event.deltaTime * this.speed.x));\n };\n\n update() {}\n\n rotateCamera(delta: THREE.Vector2) {\n const rotateX = (Math.PI * delta.x) / this.viewer.canvas.clientWidth;\n const rotateY = (Math.PI * delta.y) / this.viewer.canvas.clientHeight;\n\n const quaternion = this.quaternion.clone();\n this.xRotation.setFromAxisAngle(this.viewer.camera.up, rotateX);\n this.yRotation.setFromAxisAngle(this.yRotationAxis, rotateY);\n quaternion.premultiply(this.xRotation).multiply(this.yRotation).normalize();\n\n this.viewer.camera.setRotationFromQuaternion(quaternion);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 * as THREE from \"three\";\n\nexport class ClippingPlaneDragger {\n protected viewer: any;\n protected start: THREE.Vector3;\n protected end: THREE.Vector3;\n protected delta: THREE.Vector3;\n protected planeHelper: THREE.PlaneHelper;\n\n public plane: THREE.Plane;\n\n constructor(viewer: any) {\n this.viewer = viewer;\n\n this.viewer.addEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.addEventListener(\"pointerup\", this.onPointerUp);\n\n this.plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0);\n\n this.start = new THREE.Vector3();\n this.end = new THREE.Vector3();\n this.delta = new THREE.Vector3();\n if (!this.viewer.renderer.clippingPlanes) this.viewer.renderer.clippingPlanes = [];\n\n this.viewer.renderer.clippingPlanes.push(this.plane);\n\n this.planeHelper = new THREE.PlaneHelper(this.plane, 150, 0xffff00);\n this.viewer.scene.add(this.planeHelper);\n }\n\n dispose(): void {\n this.viewer.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.removeEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.removeEventListener(\"pointermove\", this.onPointerMove);\n\n this.viewer.renderer.clippingPlanes = this.viewer.renderer.clippingPlanes.filter((plane) => this.plane !== plane);\n\n this.planeHelper.removeFromParent();\n }\n\n onPointerDown = (event: PointerEvent) => {\n this.viewer.addEventListener(\"pointermove\", this.onPointerMove);\n\n const { offsetX, offsetY } = event;\n this.start.set(offsetX, offsetY, 0.5);\n this.start = this.screenToPlane(this.start);\n this.delta.set(0, 0, 0);\n this.end.set(0, 0, 0);\n };\n\n onPointerUp = (event: PointerEvent) => {\n this.viewer.removeEventListener(\"pointermove\", this.onPointerMove);\n\n if (this.end.length() === 0) {\n const plane: THREE.Plane = this.plane;\n plane.normal.multiplyScalar(-1);\n plane.constant *= -1;\n } else {\n const { offsetX, offsetY } = event;\n this.end.set(offsetX, offsetY, 0.5);\n this.end = this.screenToPlane(this.end);\n }\n };\n\n onPointerMove = (event: PointerEvent) => {\n const { offsetX, offsetY } = event;\n this.end.set(offsetX, offsetY, 0.5);\n this.end = this.screenToPlane(this.end);\n this.delta.copy(this.end).sub(this.start);\n this.start.copy(this.end);\n\n const plane: THREE.Plane = this.plane;\n plane.translate(this.delta);\n };\n\n update(): void {}\n\n screenToWorld(v: THREE.Vector3): THREE.Vector3 {\n v.x = (2 * v.x) / this.viewer.canvas.clientWidth - 1;\n v.y = 1 - (2 * v.y) / this.viewer.canvas.clientHeight;\n return v.unproject(this.viewer.camera);\n }\n\n screenToPlane(v: THREE.Vector3): THREE.Vector3 {\n v = this.screenToWorld(v);\n const direction = v.sub(this.viewer.camera.position).normalize();\n const ray = new THREE.Ray(this.viewer.camera.position, direction);\n let plane: THREE.Plane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0);\n const dot = plane.normal.dot(this.plane.normal);\n if (Math.abs(dot) === 1) {\n plane = new THREE.Plane(new THREE.Vector3(1, 0, 0), 0);\n }\n const result = new THREE.Vector3();\n ray.intersectPlane(plane, result);\n return result;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 * as THREE from \"three\";\nimport { IComponent } from \"../IComponent\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class LightComponent implements IComponent {\n protected viewer: Viewer;\n protected ambientLight: THREE.AmbientLight;\n protected directLight: THREE.DirectionalLight;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n this.ambientLight = new THREE.AmbientLight(0xffffff, 0);\n this.viewer.camera.add(this.ambientLight);\n\n this.directLight = new THREE.DirectionalLight(0xffffff, 1);\n this.directLight.position.set(0.5, 0, 0.866); // ~60º\n this.viewer.camera.add(this.directLight);\n }\n\n dispose(): void {\n this.ambientLight.removeFromParent();\n this.directLight.removeFromParent();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 * as THREE from \"three\";\nimport { RoomEnvironment } from \"three/examples/jsm/environments/RoomEnvironment.js\";\nimport { IComponent } from \"../IComponent\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class BackgroundComponent implements IComponent {\n protected viewer: Viewer;\n protected backgroundColor: THREE.Color;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n this.backgroundColor = new THREE.Color(0xffffff);\n\n const environment = new RoomEnvironment();\n const pmremGenerator = new THREE.PMREMGenerator(this.viewer.renderer);\n\n this.viewer.scene.background = this.backgroundColor;\n this.viewer.scene.environment = pmremGenerator.fromScene(environment).texture;\n this.viewer.addEventListener(\"optionschange\", this.syncOptions);\n\n environment.dispose();\n }\n\n dispose(): void {\n this.viewer.removeEventListener(\"optionschange\", this.syncOptions);\n this.viewer.scene.environment = undefined;\n this.viewer.scene.background = undefined;\n }\n\n syncOptions = () => {\n this.backgroundColor.setHex(0xffffff);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { GeometryEndEvent } from \"@inweb/viewer-core\";\nimport * as THREE from \"three\";\nimport { IComponent } from \"../IComponent\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class DefaultCameraPositionComponent implements IComponent {\n protected viewer: Viewer;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.viewer.addEventListener(\"geometryend\", this.geometryEnd);\n }\n\n dispose(): void {\n this.viewer.removeEventListener(\"geometryend\", this.geometryEnd);\n }\n\n geometryEnd = (event: GeometryEndEvent) => {\n const { data: scene } = event;\n\n scene.updateMatrixWorld();\n\n const box = new THREE.Box3().setFromObject(scene);\n const size = box.getSize(new THREE.Vector3()).length();\n const center = box.getCenter(new THREE.Vector3());\n\n scene.position.x += scene.position.x - center.x;\n scene.position.y += scene.position.y - center.y;\n scene.position.z += scene.position.z - center.z;\n\n this.viewer.camera.near = size / 100;\n this.viewer.camera.far = size * 100;\n\n this.viewer.camera.position.copy(center);\n this.viewer.camera.position.x += size / 2.0;\n this.viewer.camera.position.y += size / 5.0;\n this.viewer.camera.position.z += size / 2.0;\n\n this.viewer.camera.updateMatrixWorld();\n this.viewer.camera.updateProjectionMatrix();\n this.viewer.camera.lookAt(center);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 \"../IComponent\";\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.camera.aspect = width / height;\n this.viewer.camera.updateProjectionMatrix();\n this.viewer.renderer.setSize(width, height, true);\n\n this.viewer.update(true);\n this.viewer.emitEvent({ type: \"resize\", width, height });\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 \"../IComponent\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class RenderLoopComponent implements IComponent {\n protected viewer: Viewer;\n protected requestID = 0;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.animate();\n }\n\n dispose(): void {\n cancelAnimationFrame(this.requestID);\n }\n\n animate = (time = 0) => {\n this.requestID = requestAnimationFrame(this.animate);\n this.viewer.render(time);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { EventEmitter2 } from \"@inweb/eventemitter2\";\nimport { Assembly, Client, File, Model } from \"@inweb/client\";\nimport {\n CANVAS_EVENTS,\n CanvasEventMap,\n commands,\n IDragger,\n IOptions,\n IViewer,\n IViewpoint,\n Options,\n OptionsEventMap,\n ViewerEventMap,\n} from \"@inweb/viewer-core\";\nimport * as THREE from \"three\";\nimport { GLTF, GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { GLTFLoadingManager } from \"./loaders/GLTFLoadingManager\";\n\nimport { PanDragger } from \"./draggers/PanDragger\";\nimport { OrbitDragger } from \"./draggers/OrbitDragger\";\nimport { ZoomDragger } from \"./draggers/ZoomDragger\";\nimport { WalkDragger } from \"./draggers/WalkDragger\";\nimport { ClippingPlaneDragger } from \"./draggers/ClippingPlaneDragger\";\n\nimport { IComponent } from \"./IComponent\";\nimport { LightComponent } from \"./components/LightComponent\";\nimport { BackgroundComponent } from \"./components/BackgroundComponent\";\nimport { DefaultCameraPositionComponent } from \"./components/DefaultCameraPositionComponent\";\nimport { ResizeCanvasComponent } from \"./components/ResizeCanvasComponent\";\nimport { RenderLoopComponent } from \"./components/RenderLoopComponent\";\n// import { ObjectSelectionComponent } from \"./components/ObjectSelectionComponent\";\n\nexport class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMap & OptionsEventMap> implements IViewer {\n public client: Client | undefined;\n private _options: Options;\n\n private canvaseventlistener: (event: any) => void;\n\n public canvas: HTMLCanvasElement | undefined;\n public canvasEvents: string[];\n\n public scene: THREE.Scene | undefined;\n public camera: THREE.PerspectiveCamera | undefined;\n public renderer: THREE.WebGLRenderer | undefined;\n public models: Array<GLTF>;\n public selectedObjects: Array<any>;\n\n private draggerFactory: Record<string, any>;\n private _activeDragger: IDragger | null;\n\n private components: Array<IComponent>;\n\n private renderNeeded = false;\n private renderTime: DOMHighResTimeStamp;\n\n constructor(client?: Client) {\n super();\n this._options = new Options(this);\n\n this.client = client;\n\n this.canvasEvents = CANVAS_EVENTS.slice();\n this.canvaseventlistener = (event: Event) => this.emit(event);\n\n this.draggerFactory = {\n Pan: PanDragger,\n Zoom: ZoomDragger,\n Orbit: OrbitDragger,\n Walk: WalkDragger,\n Clipping: ClippingPlaneDragger,\n };\n this._activeDragger = null;\n\n this.models = [];\n this.components = [];\n this.selectedObjects = [];\n\n this.renderTime = 0;\n\n this.render = this.render.bind(this);\n this.update = this.update.bind(this);\n }\n\n get options(): Options {\n return this._options;\n }\n\n get draggers(): string[] {\n return Object.keys(this.draggerFactory);\n }\n\n initialize(canvas: HTMLCanvasElement, onProgress?: (event: ProgressEvent) => void): Promise<this> {\n this.addEventListener(\"optionschange\", (event) => this.syncOptions(event.data));\n\n this.scene = new THREE.Scene();\n\n const rect = canvas.parentElement.getBoundingClientRect();\n const width = rect.width || 1;\n const height = rect.height || 1;\n this.camera = new THREE.PerspectiveCamera(45, width / height, 0.01, 1000);\n this.camera.up.set(0, 0, 1);\n\n this.renderer = new THREE.WebGLRenderer({ canvas, antialias: true });\n this.renderer.setPixelRatio(window.devicePixelRatio);\n this.renderer.setSize(width, height);\n this.renderer.toneMapping = THREE.LinearToneMapping;\n\n this.canvas = canvas;\n this.canvasEvents.forEach((x) => canvas.addEventListener(x, this.canvaseventlistener));\n\n this.components.push(new LightComponent(this));\n this.components.push(new BackgroundComponent(this));\n this.components.push(new DefaultCameraPositionComponent(this));\n this.components.push(new ResizeCanvasComponent(this));\n this.components.push(new RenderLoopComponent(this as any));\n // this.components.push(new ObjectSelectionComponent(this as any));\n\n this.syncOptions();\n\n this.renderTime = performance.now();\n this.render(this.renderTime);\n\n if (onProgress) 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.emitEvent({ type: \"dispose\" });\n\n this.components.forEach((component: IComponent) => component.dispose());\n this.components = [];\n\n this.setActiveDragger(\"\");\n this.removeAllListeners();\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.renderer) this.renderer.dispose();\n\n this.renderer = undefined;\n this.camera = undefined;\n this.scene = undefined;\n\n return this;\n }\n\n isInitialized(): boolean {\n return !!this.renderer;\n }\n\n public render(time: DOMHighResTimeStamp): void {\n if (!this.renderNeeded) return;\n if (!this.renderer) return;\n if (!this.scene) return;\n if (!this.camera) return;\n\n this.renderer.render(this.scene, this.camera);\n this.renderNeeded = false;\n\n const deltaTime = (time - this.renderTime) / 1000;\n this.renderTime = time;\n this.emitEvent({ type: \"render\", time, deltaTime });\n }\n\n public update(force = false): void {\n this.renderNeeded = true;\n if (force) this.render(performance.now());\n this.emitEvent({ type: \"update\", data: force });\n }\n\n public syncOptions(options: IOptions = this.options): void {\n // this.update();\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 async open(file: File | Assembly | Model): Promise<this> {\n if (!this.renderer) return this;\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\", file, model: file });\n\n let model: Model | undefined = undefined;\n if (file) {\n const models = (await file.getModels()) || [];\n model = models.find((model: Model) => model.default) || models[0];\n }\n if (!model) throw new Error(\"No default model found\");\n\n const geometryType = model.database.split(\".\").pop();\n if (geometryType !== \"gltf\") throw new Error(`Unknown geometry type: ${geometryType}`);\n\n const url = `${model.httpClient.serverUrl}${model.path}/${model.database}`;\n const params = { requestHeader: model.httpClient.headers };\n\n await this.loadReferences(model);\n await this.loadGltfFile(url, undefined, params);\n\n return this;\n }\n\n cancel(): this {\n this.emitEvent({ type: \"cancel\" });\n return this;\n }\n\n openGltfFile(\n file: string | ArrayBuffer | Blob,\n externalData: Map<string, string | ArrayBuffer | Blob> = new Map(),\n params: {\n path?: string;\n requestHeader?: HeadersInit;\n crossOrigin?: string;\n withCredentials?: boolean;\n } = {}\n ): Promise<this> {\n if (!this.renderer) return Promise.resolve(this);\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\" });\n\n return this.loadGltfFile(file, externalData, params);\n }\n\n async loadGltfFile(\n file: string | ArrayBuffer | Blob,\n externalData: Map<string, string | ArrayBuffer | Blob> = new Map(),\n params: {\n path?: string;\n requestHeader?: HeadersInit;\n crossOrigin?: string;\n withCredentials?: boolean;\n } = {}\n ): Promise<this> {\n const manager = new GLTFLoadingManager(file, externalData, params);\n try {\n this.emitEvent({ type: \"geometrystart\" });\n\n const loader = new GLTFLoader(manager);\n loader.setPath(manager.path);\n loader.setRequestHeader(params.requestHeader as any);\n loader.setCrossOrigin(params.crossOrigin || loader.crossOrigin);\n loader.setWithCredentials(params.withCredentials || loader.withCredentials);\n\n const gltf = await loader.loadAsync(manager.fileURL, (event: ProgressEvent) => {\n const { lengthComputable, loaded, total } = event;\n const progress = lengthComputable ? loaded / total : 1;\n this.emitEvent({ type: \"geometryprogress\", data: progress });\n });\n\n if (!this.scene) return this;\n if (!gltf.scene) throw new Error(\"No glTF scene found\");\n\n this.models.push(gltf);\n this.scene.add(gltf.scene);\n this.update();\n\n this.emitEvent({ type: \"databasechunk\" });\n this.emitEvent({ type: \"geometryend\", data: gltf.scene });\n } catch (error: any) {\n this.emitEvent({ type: \"geometryerror\", data: error });\n throw error;\n } finally {\n manager.dispose();\n }\n\n return this;\n }\n\n clear(): this {\n function disposeMaterial(material: any) {\n const materials = Array.isArray(material) ? material : [material];\n materials.forEach((material: any) => {\n // Object.keys(material).forEach((key) => material[key]?.dispose?.());\n material.dispose();\n });\n }\n\n function disposeObject(object: any) {\n if (object.geometry) object.geometry.dispose();\n if (object.material) disposeMaterial(object.material);\n }\n\n this.selectedObjects = [];\n\n this.models.forEach((gltf) => gltf.scene.traverse(disposeObject));\n this.models.forEach((gltf) => gltf.scene.removeFromParent());\n this.models = [];\n\n this.update();\n this.emitEvent({ type: \"clear\" });\n\n return this;\n }\n\n activeDragger(): IDragger | null {\n return this._activeDragger;\n }\n\n setActiveDragger(name: string): IDragger | null {\n if (!this._activeDragger || this._activeDragger.name !== name) {\n if (this._activeDragger) {\n this._activeDragger.dispose();\n this._activeDragger = null;\n }\n const Constructor = this.draggerFactory[name];\n if (Constructor) {\n this._activeDragger = new Constructor(this);\n this._activeDragger.name = name;\n }\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 is3D(): boolean {\n return false;\n }\n\n executeCommand(id: string, ...args: any[]): any {\n return commands(\"ThreeJS\").executeCommand(id, this, ...args);\n }\n\n drawViewpoint(viewpoint: IViewpoint): void {}\n\n createViewpoint(): IViewpoint {\n return {};\n }\n}\n"],"names":["Commands","constructor","this","_commands","Map","registerCommand","id","handler","description","thisArg","set","registerCommandAlias","alias","viewer","args","executeCommand","getCommand","get","getCommands","map","forEach","value","key","command","isDraggerCommand","draggers","includes","setActiveDragger","console","warn","undefined","result","apply","emit","type","data","commands","viewerType","defaultOptions","showWCS","cameraAnimation","antialiasing","groundShadow","shadows","cameraAxisXSpeed","cameraAxisYSpeed","ambientOcclusion","enableStreamingMode","enablePartialMode","memoryLimit","cuttingPlaneFillColor","red","green","blue","edgesColor","r","g","b","facesColor","edgesVisibility","edgesOverlap","facesOverlap","facesTransparancy","enableCustomHighlight","sceneGraph","edgeModel","reverseZoomWheel","enableZoomWheel","enableGestures","geometryType","Options","emitter","_emitter","_data","loadFromStorage","defaults","notifierChangeEvent","change","saveToStorage","window","localStorage","setItem","JSON","stringify","error","item","getItem","parse","resetToDefaults","fields","resetData","reduce","acc","field","Boolean","CanvasEvents","CANVAS_EVENTS","Dragger","name","initialize","dispose","updatePreview","EventEmitter2","_listeners","addEventListener","listener","push","removeEventListener","listeners","filter","x","length","removeAllListeners","emitEvent","event","invoke","slice","call","on","off","GLTFLoadingManager","THREE","LoadingManager","file","externalData","params","super","path","resourcePath","fileURL","dataURLs","LoaderUtils","extractUrlBase","dataURL","URL","createObjectURL","Blob","setURLModifier","url","decodeURI","replace","revokeObjectURL","OrbitDragger","OrbitControls","camera","canvas","geometryEnd","scene","box","Box3","setFromObject","size","getSize","Vector3","maxDistance","update","updateViewer","mouseButtons","LEFT","MOUSE","ROTATE","MIDDLE","PAN","RIGHT","touches","ONE","TOUCH","TWO","DOLLY_PAN","screenSpacePanning","rotateSpeed","PanDragger","DOLLY_ROTATE","ZoomDragger","DOLLY","WalkDragger","onKeyDown","code","shiftKey","speed","z","walkSpeed","boostSpeed","onKeyUp","onMouseDown","clientX","clientY","mouseStart","mouseDelta","quaternion","copy","onMouseMove","y","rotateCamera","onMouseUp","onMouseWheel","preventDefault","deltaY","Math","max","onContextMenu","log","stopImmediatePropagation","onTouchStart","touchStartDistance","getTouchsDistance","onTouchEnd","onTouchMove","distance","onRender","matrix","extractBasis","xAxis","yAxis","zAxis","position","add","multiplyScalar","deltaTime","_target","clone","xRotation","Quaternion","yRotation","Vector2","yRotationAxis","_maxDistance","document","start","end","dx","dy","sqrt","delta","rotateX","PI","clientWidth","rotateY","clientHeight","setFromAxisAngle","up","premultiply","multiply","normalize","setRotationFromQuaternion","ClippingPlaneDragger","onPointerDown","onPointerMove","offsetX","offsetY","screenToPlane","onPointerUp","plane","normal","constant","sub","translate","Plane","renderer","clippingPlanes","planeHelper","PlaneHelper","removeFromParent","screenToWorld","v","unproject","direction","ray","Ray","dot","abs","intersectPlane","LightComponent","ambientLight","AmbientLight","directLight","DirectionalLight","BackgroundComponent","syncOptions","backgroundColor","setHex","Color","environment","RoomEnvironment","pmremGenerator","PMREMGenerator","background","fromScene","texture","DefaultCameraPositionComponent","updateMatrixWorld","center","getCenter","near","far","updateProjectionMatrix","lookAt","ResizeCanvasComponent","resizeViewer","entries","width","height","contentRect","aspect","setSize","resizeObserver","ResizeObserver","observe","parentElement","disconnect","RenderLoopComponent","requestID","animate","time","requestAnimationFrame","render","cancelAnimationFrame","Viewer","client","renderNeeded","_options","canvasEvents","canvaseventlistener","draggerFactory","Pan","Zoom","Orbit","Walk","Clipping","_activeDragger","models","components","selectedObjects","renderTime","bind","options","Object","keys","onProgress","Scene","rect","getBoundingClientRect","PerspectiveCamera","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","toneMapping","LinearToneMapping","performance","now","ProgressEvent","lengthComputable","loaded","total","Promise","resolve","cancel","component","isInitialized","force","loadReferences","model","open","clear","getModels","find","default","Error","database","split","pop","httpClient","serverUrl","requestHeader","headers","loadGltfFile","openGltfFile","manager","loader","GLTFLoader","setPath","setRequestHeader","setCrossOrigin","crossOrigin","setWithCredentials","withCredentials","gltf","loadAsync","progress","disposeMaterial","material","materials","Array","isArray","disposeObject","object","geometry","traverse","activeDragger","Constructor","resetActiveDragger","dragger","is3D","drawViewpoint","viewpoint","createViewpoint"],"mappings":"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"}
1
+ {"version":3,"file":"viewer-three.module.js","sources":["../../viewer-core/dist/viewer-core.module.js","../src/Viewer/commands/ApplyModelTransform.ts","../src/Viewer/commands/ClearMarkup.ts","../src/Viewer/commands/ClearSlices.ts","../src/Viewer/commands/CreatePreview.ts","../src/Viewer/commands/Explode.ts","../src/Viewer/commands/SetDefaultViewPosition.ts","../src/Viewer/commands/GetDefaultViewPositions.ts","../src/Viewer/commands/GetModels.ts","../src/Viewer/commands/GetSelected.ts","../src/Viewer/components/SelectionComponent.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/Unselect.ts","../src/Viewer/commands/ZoomToExtents.ts","../src/Viewer/commands/ZoomToObjects.ts","../src/Viewer/commands/ZoomToSelected.ts","../src/Viewer/loaders/GLTFLoadingManager.ts","../../eventemitter2/dist/eventemitter2.module.js","../src/Viewer/draggers/OrbitDragger.ts","../src/Viewer/draggers/PanDragger.ts","../src/Viewer/draggers/ZoomDragger.ts","../src/Viewer/controls/WalkControls.ts","../src/Viewer/draggers/WalkDragger.ts","../../../node_modules/three/examples/jsm/controls/TransformControls.js","../src/Viewer/helpers/PlaneHelper.ts","../src/Viewer/draggers/CuttingPlaneDragger.ts","../src/Viewer/draggers/CuttingPlaneXAxis.ts","../src/Viewer/draggers/CuttingPlaneYAxis.ts","../src/Viewer/draggers/CuttingPlaneZAxis.ts","../src/Viewer/components/ExtentsComponent.ts","../src/Viewer/components/LightComponent.ts","../src/Viewer/components/BackgroundComponent.ts","../src/Viewer/components/DefaultPositionComponent.ts","../src/Viewer/components/ResizeCanvasComponent.ts","../src/Viewer/components/RenderLoopComponent.ts","../src/Viewer/helpers/WCSHelper.ts","../src/Viewer/components/WCSHelperComponent.ts","../src/Viewer/Viewer.ts"],"sourcesContent":["class Commands {\n constructor() {\n this._commands = new Map;\n }\n registerCommand(id, handler, description, thisArg) {\n this._commands.set(id, {\n id: id,\n handler: handler,\n thisArg: thisArg,\n description: description\n });\n }\n registerCommandAlias(id, alias) {\n this.registerCommand(alias, ((viewer, ...args) => this.executeCommand(id, viewer, ...args)));\n }\n getCommand(id) {\n return this._commands.get(id);\n }\n getCommands() {\n const map = new Map;\n this._commands.forEach(((value, key) => map.set(key, value)));\n return map;\n }\n executeCommand(id, viewer, ...args) {\n const command = this._commands.get(id);\n if (!command) {\n if (viewer) {\n const isDraggerCommand = viewer.draggers.includes(id);\n if (isDraggerCommand) return viewer.setActiveDragger(id);\n }\n console.warn(`Command '${id}' not found`);\n return undefined;\n }\n const {handler: handler, thisArg: thisArg} = command;\n const result = handler.apply(thisArg, [ viewer, ...args ]);\n viewer === null || viewer === void 0 ? void 0 : viewer.emit({\n type: \"command\",\n data: id,\n args: args\n });\n return result;\n }\n}\n\nconst _commands = new Map;\n\nfunction commands(viewerType = \"\") {\n let result = _commands.get(viewerType);\n if (!result) {\n result = new Commands;\n _commands.set(viewerType, result);\n }\n return result;\n}\n\ncommands(\"\").registerCommand(\"noop\", (() => {}));\n\ncommands(\"VisualizeJS\").registerCommand(\"noop\", (() => {}));\n\ncommands(\"ThreeJS\").registerCommand(\"noop\", (() => {}));\n\nfunction defaultOptions() {\n return {\n showWCS: true,\n cameraAnimation: true,\n antialiasing: true,\n groundShadow: false,\n shadows: false,\n cameraAxisXSpeed: 4,\n cameraAxisYSpeed: 1,\n ambientOcclusion: false,\n enableStreamingMode: true,\n enablePartialMode: false,\n memoryLimit: 3294967296,\n cuttingPlaneFillColor: {\n red: 255,\n green: 152,\n blue: 0\n },\n edgesColor: {\n r: 255,\n g: 152,\n b: 0\n },\n facesColor: {\n r: 255,\n g: 152,\n b: 0\n },\n edgesVisibility: true,\n edgesOverlap: true,\n facesOverlap: false,\n facesTransparancy: 200,\n enableCustomHighlight: true,\n sceneGraph: false,\n edgeModel: true,\n reverseZoomWheel: false,\n enableZoomWheel: true,\n enableGestures: true,\n geometryType: \"vsfx\"\n };\n}\n\nclass Options {\n constructor(emitter) {\n this._emitter = emitter;\n this._data = defaultOptions();\n this.loadFromStorage();\n }\n static defaults() {\n return defaultOptions();\n }\n notifierChangeEvent() {\n console.warn(\"Options.notifierChangeEvent() has been deprecated since 25.3 and will be removed in a future release, use Options.change() instead.\");\n this.change();\n }\n change() {\n if (this._emitter !== undefined) {\n this.saveToStorage();\n this._emitter.emit({\n type: \"optionschange\",\n data: this\n });\n }\n }\n saveToStorage() {\n if (typeof window !== \"undefined\") try {\n localStorage.setItem(\"od-client-settings\", JSON.stringify(this.data));\n } catch (error) {\n console.error(\"Cannot save client settings.\", error);\n }\n }\n loadFromStorage() {\n if (typeof window !== \"undefined\") try {\n const item = localStorage.getItem(\"od-client-settings\");\n if (item) {\n const data = JSON.parse(item);\n this.data = {\n ...data\n };\n }\n } catch (error) {\n console.error(\"Cannot load client settings.\", error);\n }\n }\n resetToDefaults(fields) {\n if (fields !== undefined) {\n const defaults = Options.defaults();\n const resetData = fields.reduce(((acc, field) => {\n acc[field] = defaults[field];\n return acc;\n }), {});\n this.data = {\n ...this.data,\n ...resetData\n };\n } else {\n this.data = {\n ...this.data,\n ...Options.defaults()\n };\n }\n }\n get data() {\n return this._data;\n }\n set data(value) {\n const enablePartialMode = value.enableStreamingMode ? value.enablePartialMode : false;\n const sceneGraph = enablePartialMode ? false : value.sceneGraph;\n this._data = {\n ...Options.defaults(),\n ...this._data,\n ...value,\n enablePartialMode: enablePartialMode,\n sceneGraph: sceneGraph\n };\n this.change();\n }\n get showWCS() {\n return this._data.showWCS;\n }\n set showWCS(value) {\n this._data.showWCS = value;\n this.change();\n }\n get cameraAnimation() {\n return this._data.cameraAnimation;\n }\n set cameraAnimation(value) {\n this._data.cameraAnimation = value;\n this.change();\n }\n get antialiasing() {\n return this._data.antialiasing;\n }\n set antialiasing(value) {\n this._data.antialiasing = value;\n this.change();\n }\n get groundShadow() {\n return this._data.groundShadow;\n }\n set groundShadow(value) {\n this._data.groundShadow = value;\n this.change();\n }\n get shadows() {\n return this._data.shadows;\n }\n set shadows(value) {\n this._data.shadows = value;\n this.change();\n }\n get cameraAxisXSpeed() {\n return this._data.cameraAxisXSpeed;\n }\n set cameraAxisXSpeed(value) {\n this._data.cameraAxisXSpeed = value;\n this.change();\n }\n get cameraAxisYSpeed() {\n return this._data.cameraAxisYSpeed;\n }\n set cameraAxisYSpeed(value) {\n this.cameraAxisYSpeed = value;\n this.change();\n }\n get ambientOcclusion() {\n return this._data.ambientOcclusion;\n }\n set ambientOcclusion(value) {\n this._data.ambientOcclusion = value;\n this.change();\n }\n get enableStreamingMode() {\n return this._data.enableStreamingMode;\n }\n set enableStreamingMode(value) {\n this._data.enableStreamingMode = value;\n if (!value) this._data.enablePartialMode = false;\n this.change();\n }\n get enablePartialMode() {\n return this._data.enablePartialMode;\n }\n set enablePartialMode(value) {\n this._data.enablePartialMode = value;\n if (value) {\n this._data.enableStreamingMode = true;\n this._data.sceneGraph = false;\n }\n this.change();\n }\n get memoryLimit() {\n return this._data.memoryLimit;\n }\n set memoryLimit(value) {\n this._data.memoryLimit = value;\n this.change();\n }\n get cuttingPlaneFillColor() {\n return this._data.cuttingPlaneFillColor;\n }\n set cuttingPlaneFillColor(value) {\n this._data.cuttingPlaneFillColor = value;\n this.change();\n }\n get edgesColor() {\n return this._data.edgesColor;\n }\n set edgesColor(value) {\n this._data.edgesColor = value;\n this.change();\n }\n get facesColor() {\n return this._data.facesColor;\n }\n set facesColor(value) {\n this._data.facesColor = value;\n this.change();\n }\n get edgesVisibility() {\n return this._data.edgesVisibility;\n }\n set edgesVisibility(value) {\n this._data.edgesVisibility = value;\n this.change();\n }\n get edgesOverlap() {\n return this._data.edgesOverlap;\n }\n set edgesOverlap(value) {\n this._data.edgesOverlap = value;\n this.change();\n }\n get facesOverlap() {\n return this._data.facesOverlap;\n }\n set facesOverlap(value) {\n this._data.facesOverlap = value;\n this.change();\n }\n get facesTransparancy() {\n return this._data.facesTransparancy;\n }\n set facesTransparancy(value) {\n this._data.facesTransparancy = value;\n this.change();\n }\n get enableCustomHighlight() {\n return this._data.enableCustomHighlight;\n }\n set enableCustomHighlight(value) {\n this._data.enableCustomHighlight = value;\n this.change();\n }\n get sceneGraph() {\n return this._data.sceneGraph;\n }\n set sceneGraph(value) {\n this._data.sceneGraph = value;\n if (value) this._data.enablePartialMode = false;\n this.change();\n }\n get edgeModel() {\n return Boolean(this._data.edgeModel);\n }\n set edgeModel(value) {\n this._data.edgeModel = Boolean(value);\n this.change();\n }\n get reverseZoomWheel() {\n return this._data.reverseZoomWheel;\n }\n set reverseZoomWheel(value) {\n this._data.reverseZoomWheel = !!value;\n this.change();\n }\n get enableZoomWheel() {\n return this._data.enableZoomWheel;\n }\n set enableZoomWheel(value) {\n this._data.enableZoomWheel = !!value;\n this.change();\n }\n get enableGestures() {\n return this._data.enableGestures;\n }\n set enableGestures(value) {\n this._data.enableGestures = !!value;\n this.change();\n }\n get geometryType() {\n return this._data.geometryType;\n }\n set geometryType(value) {\n this._data.geometryType = value;\n this.change();\n }\n}\n\nconst CanvasEvents = [ \"click\", \"contextmenu\", \"dblclick\", \"mousedown\", \"mouseleave\", \"mousemove\", \"mouseup\", \"pointercancel\", \"pointerdown\", \"pointerleave\", \"pointermove\", \"pointerup\", \"touchcancel\", \"touchend\", \"touchmove\", \"touchstart\", \"wheel\" ];\n\nconst CANVAS_EVENTS = CanvasEvents;\n\nclass Dragger {\n constructor(viewer) {\n this.name = \"\";\n }\n initialize() {}\n dispose() {}\n updatePreview() {}\n}\n\nexport { CANVAS_EVENTS, CanvasEvents, Dragger, Options, commands, defaultOptions };\n//# sourceMappingURL=viewer-core.module.js.map\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { Model, File, Assembly } from \"@inweb/client\";\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\n// gltf root object don't have model handle\nfunction applyModelTransform(viewer: Viewer, model: Model | File | Assembly) {\n console.warn(\"applyModelTransform not implemented\");\n}\n\ncommands(\"ThreeJS\").registerCommand(\"applyModelTransform\", applyModelTransform);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\n// markup should be as a separate library\ncommands(\"ThreeJS\").registerCommand(\"clearMarkup\", (viewer: Viewer) => console.warn(\"clearMarkup not implemented\"));\ncommands(\"ThreeJS\").registerCommandAlias(\"clearMarkup\", \"clearOverlay\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction clearSlices(viewer: Viewer) {\n viewer.renderer.clippingPlanes = [];\n viewer.update();\n}\n\ncommands(\"ThreeJS\").registerCommand(\"clearSlices\", clearSlices);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction createPreview(viewer: Viewer, type = \"image/jpeg\", encoderOptions = 0.25): string {\n viewer.update(true);\n return viewer.canvas.toDataURL(type, encoderOptions);\n}\n\ncommands(\"ThreeJS\").registerCommand(\"createPreview\", createPreview);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction calcObjectDepth(object: Object3D, depth: number) {\n let res = depth;\n object.children.forEach((x) => {\n const objectDepth = calcObjectDepth(x, depth + 1);\n if (res < objectDepth) res = objectDepth;\n });\n\n (object as any).originalPosition = object.position.clone();\n\n return res;\n}\n\nfunction explodeScene(scene: Object3D, scale = 0) {\n scale /= 100;\n\n if (!(scene as any).maxDepth) (scene as any).maxDepth = calcObjectDepth(scene, 1);\n const maxDepth = (scene as any).maxDepth;\n\n let explodeDepth = scale * (maxDepth - 1) + 1;\n if (maxDepth === 1) explodeDepth = 1;\n\n function explodeObject(object: Object3D, depth: number, parentCenter: Vector3, parentOffset: Vector3) {\n const objectBox = new Box3().setFromObject(object);\n const objectCenter = objectBox.getCenter(new Vector3());\n\n const objectOffset = parentOffset.clone();\n if (depth > 0 && depth <= explodeDepth) {\n const offset = objectCenter.clone().sub(parentCenter).multiplyScalar(scale);\n objectOffset.add(offset);\n }\n\n object.children.forEach((object) => explodeObject(object, depth + 1, objectCenter, objectOffset));\n\n const originalPosition = (object as any).originalPosition;\n object.position.copy(originalPosition);\n if (scale > 0) {\n const direction = objectCenter.sub(parentCenter).normalize();\n object.position.add(direction.add(objectOffset));\n }\n }\n\n const sceneExtents = new Box3().setFromObject(scene);\n const sceneCenter = sceneExtents.getCenter(new Vector3());\n explodeObject(scene, 0, sceneCenter, new Vector3(0, 0, 0));\n}\n\nfunction explode(viewer: Viewer, index = 0): void {\n viewer.models.forEach((gltf) => explodeScene(gltf.scene, index));\n\n viewer.update();\n viewer.emit({ type: \"explode\", data: index });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"explode\", explode);\ncommands(\"ThreeJS\").registerCommand(\"collect\", (viewer: any) => explode(viewer, 0));\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { Sphere, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport const defaultViewPositions = {\n top: new Vector3(0, 0, 1),\n bottom: new Vector3(0, 0, -1),\n left: new Vector3(-1, 0, 0),\n right: new Vector3(1, 0, 0),\n front: new Vector3(0, 1, 0),\n back: new Vector3(0, -1, 0),\n sw: new Vector3(-0.5, -0.5, 1.0).normalize(),\n se: new Vector3(0.5, -0.5, 1.0).normalize(),\n ne: new Vector3(0.5, 0.5, 1.0).normalize(),\n nw: new Vector3(-0.5, 0.5, 1.0).normalize(),\n};\n\nfunction setDefaultViewPosition(viewer: Viewer, position: string): void {\n const direction = defaultViewPositions[position] || defaultViewPositions[\"sw\"];\n\n const camera = viewer.camera;\n const center = viewer.extents.getCenter(new Vector3());\n const sphere = viewer.extents.getBoundingSphere(new Sphere());\n const offset = new Vector3().copy(direction).multiplyScalar(sphere.radius);\n\n camera.position.copy(center);\n camera.position.add(offset);\n camera.rotation.set(0, 0, 0);\n camera.lookAt(center);\n camera.updateProjectionMatrix();\n\n viewer.update();\n viewer.emit({ type: \"viewposition\", data: position });\n\n viewer.executeCommand(\"zoomToExtents\");\n}\n\ncommands(\"ThreeJS\").registerCommand(\"setDefaultViewPosition\", setDefaultViewPosition);\ncommands(\"ThreeJS\").registerCommand(\"top\", (viewer) => setDefaultViewPosition(viewer, \"top\"));\ncommands(\"ThreeJS\").registerCommand(\"bottom\", (viewer) => setDefaultViewPosition(viewer, \"bottom\"));\ncommands(\"ThreeJS\").registerCommand(\"left\", (viewer) => setDefaultViewPosition(viewer, \"left\"));\ncommands(\"ThreeJS\").registerCommand(\"right\", (viewer) => setDefaultViewPosition(viewer, \"right\"));\ncommands(\"ThreeJS\").registerCommand(\"front\", (viewer) => setDefaultViewPosition(viewer, \"front\"));\ncommands(\"ThreeJS\").registerCommand(\"back\", (viewer) => setDefaultViewPosition(viewer, \"back\"));\ncommands(\"ThreeJS\").registerCommand(\"sw\", (viewer) => setDefaultViewPosition(viewer, \"sw\"));\ncommands(\"ThreeJS\").registerCommand(\"se\", (viewer) => setDefaultViewPosition(viewer, \"se\"));\ncommands(\"ThreeJS\").registerCommand(\"ne\", (viewer) => setDefaultViewPosition(viewer, \"ne\"));\ncommands(\"ThreeJS\").registerCommand(\"nw\", (viewer) => setDefaultViewPosition(viewer, \"nw\"));\n\ncommands(\"ThreeJS\").registerCommandAlias(\"top\", \"k3DViewTop\");\ncommands(\"ThreeJS\").registerCommandAlias(\"bottom\", \"k3DViewBottom\");\ncommands(\"ThreeJS\").registerCommandAlias(\"left\", \"k3DViewLeft\");\ncommands(\"ThreeJS\").registerCommandAlias(\"right\", \"k3DViewRight\");\ncommands(\"ThreeJS\").registerCommandAlias(\"front\", \"k3DViewFront\");\ncommands(\"ThreeJS\").registerCommandAlias(\"back\", \"k3DViewBack\");\ncommands(\"ThreeJS\").registerCommandAlias(\"se\", \"k3DViewSE\");\ncommands(\"ThreeJS\").registerCommandAlias(\"sw\", \"k3DViewSW\");\ncommands(\"ThreeJS\").registerCommandAlias(\"ne\", \"k3DViewNE\");\ncommands(\"ThreeJS\").registerCommandAlias(\"nw\", \"k3DViewNW\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport { defaultViewPositions } from \"./SetDefaultViewPosition\";\n\nfunction getDefaultViewPositions(): string[] {\n return Object.keys(defaultViewPositions);\n}\n\ncommands(\"ThreeJS\").registerCommand(\"getDefaultViewPositions\", getDefaultViewPositions);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction getModels(viewer: Viewer): string[] {\n const handles: string[] = viewer.models.map((model) => model.userData.handle || \"\").filter((handle) => handle);\n return handles;\n}\n\ncommands(\"ThreeJS\").registerCommand(\"getModels\", getModels);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction getSelected(viewer: Viewer): string[] {\n return viewer.selected.map((object) => object.userData?.handle).filter((handle) => handle);\n}\n\ncommands(\"ThreeJS\").registerCommand(\"getSelected\", getSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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, MeshBasicMaterial, Object3D, Raycaster, Vector2 } from \"three\";\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class SelectionComponent implements IDisposable {\n protected viewer: Viewer;\n protected raycaster: Raycaster;\n protected downPosition: Vector2;\n protected facesMaterial: MeshBasicMaterial;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.raycaster = new Raycaster();\n this.downPosition = new Vector2();\n\n const { facesColor, facesTransparancy } = this.viewer.options;\n this.facesMaterial = new MeshBasicMaterial();\n this.facesMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);\n this.facesMaterial.opacity = (255 - facesTransparancy) / 255;\n this.facesMaterial.transparent = true;\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(\"optionschange\", this.optionsChange);\n }\n\n dispose() {\n this.facesMaterial.dispose();\n\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(\"optionschange\", this.optionsChange);\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 (this.downPosition.distanceTo(upPosition) !== 0) return;\n\n const intersects = this.getPointerIntersects(upPosition);\n\n this.clearSelection();\n if (intersects.length > 0) this.select(intersects[0].object);\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, position: Vector2): Vector2 {\n const rect = this.viewer.canvas.getBoundingClientRect();\n\n position.setX((event.clientX - rect.left) / rect.width);\n position.setY((event.clientY - rect.top) / rect.height);\n\n return position;\n }\n\n getPointerIntersects(position: Vector2): Array<Intersection<Object3D>> {\n const mouse = new Vector2(position.x * 2 - 1, -(position.y * 2) + 1);\n this.raycaster.setFromCamera(mouse, this.viewer.camera);\n\n const objects = [];\n this.viewer.scene.traverseVisible((child) => objects.push(child));\n\n return this.raycaster.intersectObjects(objects, false);\n }\n\n select(object: any) {\n if (object.isSelected) return;\n\n object.isSelected = true;\n object.originalMaterial = object.material;\n object.material = this.facesMaterial;\n\n this.viewer.selected.push(object);\n }\n\n clearSelection() {\n this.viewer.selected.forEach((object: any) => {\n object.isSelected = false;\n object.material = object.originalMaterial;\n });\n this.viewer.selected.length = 0;\n }\n\n optionsChange = () => {\n const { facesColor, facesTransparancy } = this.viewer.options;\n this.facesMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);\n this.facesMaterial.opacity = (255 - facesTransparancy) / 255;\n\n this.viewer.update();\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport { SelectionComponent } from \"../components/SelectionComponent\";\n\nfunction hideSelected(viewer: Viewer): void {\n viewer.selected.forEach((object) => (object.visible = false));\n\n const selection = new SelectionComponent(viewer);\n selection.clearSelection();\n selection.dispose();\n\n viewer.update();\n viewer.emit({ type: \"hide\" });\n viewer.emit({ type: \"select\", data: undefined, handles: [] });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"hideSelected\", hideSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction isolateSelected(viewer: Viewer): void {\n const selectedSet = new Set(viewer.selected);\n\n function isolateObject(object: Object3D, depth: number): boolean {\n let canBeIsolated = true;\n object.children.forEach((object) => {\n if (selectedSet.has(object)) canBeIsolated = false;\n else isolateObject(object, depth + 1);\n });\n\n if (canBeIsolated && depth > 0) object.visible = false;\n\n return canBeIsolated;\n }\n\n isolateObject(viewer.scene, 0);\n\n viewer.update();\n viewer.emit({ type: \"isolate\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"isolateSelected\", isolateSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction regenerateAll(viewer: Viewer): void {\n console.warn(\"regenerateAll not implemented\");\n viewer.emit({ type: \"regenerateall\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"regenerateAll\", regenerateAll);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction resetView(viewer: Viewer): void {\n viewer.executeCommand(\"setActiveDragger\", \"\");\n viewer.executeCommand(\"clearSlices\");\n viewer.executeCommand(\"clearOverlay\");\n viewer.executeCommand(\"setMarkupColor\");\n viewer.executeCommand(\"unselect\");\n viewer.executeCommand(\"showAll\");\n viewer.executeCommand(\"explode\", 0);\n viewer.executeCommand(\"zoomToExtents\", true);\n viewer.executeCommand(\"k3DViewSW\");\n\n viewer.emit({ type: \"resetview\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"resetView\", resetView);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction selectModel(viewer: Viewer, handle: string): void {\n console.warn(\"selectModel not implemented\");\n viewer.emit({ type: \"select\", data: [] });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"selectModel\", selectModel);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\ncommands(\"ThreeJS\").registerCommand(\"setActiveDragger\", (viewer: Viewer, dragger = \"\") => {\n viewer.setActiveDragger(dragger);\n});\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\ncommands(\"ThreeJS\").registerCommand(\"setMarkupColor\", (viewer: Viewer, r = 255, g = 0, b = 0) => {\n console.warn(\"setMarkupColor not implemented\");\n // viewer.setMarkupColor(r, g, b);\n});\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport { SelectionComponent } from \"../components/SelectionComponent\";\n\nfunction setSelected(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 selection = new SelectionComponent(viewer);\n selection.clearSelection();\n objects.forEach((object) => selection.select(object));\n selection.dispose();\n\n viewer.update();\n viewer.emit({ type: \"select\", data: undefined, handles });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"setSelected\", setSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction showAll(viewer: Viewer): void {\n viewer.scene.traverse((object) => (object.visible = true));\n\n viewer.update();\n viewer.emit({ type: \"showall\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"showAll\", showAll);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport { SelectionComponent } from \"../components/SelectionComponent\";\n\nfunction unselect(viewer: Viewer): void {\n const selection = new SelectionComponent(viewer);\n selection.clearSelection();\n selection.dispose();\n\n viewer.update();\n viewer.emit({ type: \"select\", data: undefined, handles: [] });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"unselect\", unselect);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { Sphere, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction zoomToExtents(viewer: Viewer): void {\n if (viewer.extents.isEmpty()) return;\n\n const center = viewer.extents.getCenter(new Vector3());\n const distance = viewer.extents.getBoundingSphere(new Sphere()).radius;\n\n const delta = new Vector3(0, 0, 1);\n delta.applyQuaternion(viewer.camera.quaternion);\n delta.multiplyScalar(distance * 3);\n\n viewer.camera.position.copy(center).add(delta);\n viewer.target.copy(center);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"zoomToExtents\", zoomToExtents);\ncommands(\"ThreeJS\").registerCommandAlias(\"zoomToExtents\", \"zoomExtents\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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, Sphere, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction 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, object) => {\n const objectExtents = new Box3().setFromObject(object);\n return result.isEmpty() ? result.copy(objectExtents) : result.union(objectExtents);\n }, new Box3());\n\n const center = extents.getCenter(new Vector3());\n const distance = extents.getBoundingSphere(new Sphere()).radius;\n\n const delta = new Vector3(0, 0, 1);\n delta.applyQuaternion(viewer.camera.quaternion);\n delta.multiplyScalar(distance * 3);\n\n viewer.camera.position.copy(center).add(delta);\n viewer.target.copy(center);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"zoomToObjects\", zoomToObjects);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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, Sphere, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction zoomToSelected(viewer: Viewer): void {\n const extents = viewer.selected.reduce((result, object) => {\n const objectExtents = new Box3().setFromObject(object);\n return result.isEmpty() ? result.copy(objectExtents) : result.union(objectExtents);\n }, new Box3());\n\n if (extents.isEmpty()) extents.copy(viewer.extents);\n\n const center = extents.getCenter(new Vector3());\n const distance = extents.getBoundingSphere(new Sphere()).radius;\n\n const delta = new Vector3(0, 0, 1);\n delta.applyQuaternion(viewer.camera.quaternion);\n delta.multiplyScalar(distance * 3);\n\n viewer.camera.position.copy(center).add(delta);\n viewer.target.copy(center);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"zoomToSelected\", zoomToSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 class GLTFLoadingManager extends LoadingManager {\n public path = \"\";\n public resourcePath = \"\";\n public fileURL = \"\";\n public dataURLs = new Map();\n\n constructor(\n file: string | globalThis.File | ArrayBuffer | Blob,\n externalData: Map<string, string | File | ArrayBuffer | Blob> = new Map(),\n params: { path?: string } = {}\n ) {\n super();\n\n this.path = params.path || \"\";\n\n if (typeof file === \"string\") {\n this.fileURL = file;\n this.resourcePath = LoaderUtils.extractUrlBase(file);\n } else {\n externalData.forEach((value, key) => (this.fileURL = value === file ? key : this.fileURL));\n externalData.set(this.fileURL, file);\n }\n\n externalData.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","class EventEmitter2 {\n constructor() {\n this._listeners = {};\n }\n addEventListener(type, listener) {\n if (this._listeners[type] === undefined) this._listeners[type] = [];\n this._listeners[type].push(listener);\n return this;\n }\n removeEventListener(type, listener) {\n if (this._listeners[type] === undefined) return this;\n const listeners = this._listeners[type].filter((x => x !== listener));\n if (listeners.length !== 0) this._listeners[type] = listeners; else delete this._listeners[type];\n return this;\n }\n removeAllListeners(type) {\n if (type) delete this._listeners[type]; else this._listeners = {};\n return this;\n }\n emitEvent(event) {\n if (this._listeners[event.type] === undefined) return false;\n const invoke = this._listeners[event.type].slice();\n invoke.forEach((listener => listener.call(this, event)));\n return true;\n }\n on(type, listener) {\n return this.addEventListener(type, listener);\n }\n off(type, listener) {\n return this.removeEventListener(type, listener);\n }\n emit(type, ...args) {\n if (typeof type === \"string\") return this.emitEvent({\n type: type,\n args: args\n }); else if (typeof type === \"object\") return this.emitEvent(type); else return false;\n }\n}\n\nexport { EventEmitter2 };\n//# sourceMappingURL=eventemitter2.module.js.map\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\n\nimport type { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class OrbitDragger implements IDisposable {\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.on(\"geometryend\", this.updateControls);\n this.viewer.on(\"viewposition\", this.updateControls);\n this.viewer.on(\"zoom\", this.updateControls);\n this.viewer.on(\"contextmenu\", this.stopContextMenu);\n this.updateControls();\n }\n\n dispose(): void {\n this.viewer.off(\"contextmenu\", this.stopContextMenu);\n this.viewer.off(\"zoom\", this.updateControls);\n this.viewer.off(\"viewposition\", this.updateControls);\n this.viewer.off(\"geometryend\", this.updateControls);\n\n this.orbit.removeEventListener(\"change\", this.controlsChange);\n this.orbit.dispose();\n }\n\n updateControls = () => {\n this.orbit.maxDistance = this.viewer.camera.far;\n this.orbit.minDistance = this.viewer.camera.near;\n this.orbit.target.copy(this.viewer.target);\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 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-2024, 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-2024 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-2024, 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-2024 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-2024, 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-2024 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, EventDispatcher, Quaternion, Vector2, Vector3 } from \"three\";\n\nconst _changeEvent = { type: \"change\" };\n\nexport class WalkControls extends EventDispatcher {\n public camera: Camera;\n public canvas: HTMLElement;\n\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();\n\n this.camera = camera;\n this.canvas = 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.canvas.addEventListener(\"pointerdown\", this.onPointerDown);\n this.canvas.addEventListener(\"pointermove\", this.onPointerMove);\n this.canvas.addEventListener(\"pointerup\", this.onPointerUp);\n this.canvas.addEventListener(\"pointercancel\", this.onPointerCancel);\n this.canvas.addEventListener(\"wheel\", this.onWheel);\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n dispose() {\n this.canvas.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.canvas.removeEventListener(\"pointermove\", this.onPointerMove);\n this.canvas.removeEventListener(\"pointerup\", this.onPointerUp);\n this.canvas.removeEventListener(\"pointercancel\", this.onPointerCancel);\n this.canvas.removeEventListener(\"wheel\", this.onWheel);\n\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (!event.isPrimary || event.button !== 0) return;\n\n this.canvas.setPointerCapture(event.pointerId);\n this.downPosition.set(event.clientX, event.clientY);\n this.quaternion.copy(this.camera.quaternion);\n this.mouseDragOn = true;\n };\n\n onPointerMove = (event: PointerEvent) => {\n if (!event.isPrimary || !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(_changeEvent);\n };\n\n onPointerUp = (event: PointerEvent) => {\n if (!event.isPrimary || event.button !== 0) return;\n\n this.canvas.releasePointerCapture(event.pointerId);\n this.mouseDragOn = false;\n };\n\n onPointerCancel = (event: PointerEvent) => {\n this.canvas.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 switch (event.code) {\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.delete(event.code);\n this.update();\n break;\n }\n };\n\n 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.camera.translateZ(-moveDelta);\n if (this.moveKeys.has(\"KeyS\")) this.camera.translateZ(moveDelta);\n\n if (this.moveKeys.has(\"KeyA\")) this.camera.translateX(-moveDelta);\n if (this.moveKeys.has(\"KeyD\")) this.camera.translateX(moveDelta);\n\n if (this.moveKeys.has(\"KeyQ\")) this.camera.translateY(moveDelta);\n if (this.moveKeys.has(\"KeyE\")) this.camera.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(_changeEvent);\n }\n\n if (this.moveWheel !== 0) {\n const moveDelta = this.moveWheel * 0.0001 * this.movementSpeed * this.multiplier;\n this.camera.translateZ(-moveDelta);\n this.moveWheel += -1 * Math.sign(this.moveWheel);\n this.dispatchEvent(_changeEvent);\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.canvas.clientWidth;\n const rotateY = (Math.PI * delta.y) / this.canvas.clientHeight;\n\n const xRotation = new Quaternion();\n xRotation.setFromAxisAngle(this.camera.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.camera.setRotationFromQuaternion(quaternion);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { WalkControls } from \"../controls/WalkControls\";\n\nexport class WalkDragger {\n protected viewer: Viewer;\n public controls: WalkControls;\n\n constructor(viewer: Viewer) {\n this.controls = new WalkControls(viewer.camera, viewer.canvas);\n this.controls.addEventListener(\"change\", this.controlsChange);\n this.controls.addEventListener(\"walkspeedchange\", this.walkspeedChange);\n this.viewer = viewer;\n this.viewer.on(\"render\", this.viewerRender);\n this.viewer.on(\"zoom\", this.viewerZoom);\n this.updateControls();\n }\n\n dispose() {\n this.viewer.off(\"render\", this.viewerRender);\n this.viewer.off(\"zoom\", this.viewerZoom);\n this.controls.removeEventListener(\"walkspeedchange\", this.walkspeedChange);\n this.controls.removeEventListener(\"change\", this.controlsChange);\n this.controls.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 };\n\n controlsChange = () => {\n this.viewer.update();\n };\n\n walkspeedChange = (event: any) => {\n this.viewer.emitEvent(event);\n };\n\n viewerRender = () => {\n this.controls.update();\n };\n\n viewerZoom = () => {\n this.controls.rotateDelta.set(0, 0);\n };\n}\n","import {\n\tBoxGeometry,\n\tBufferGeometry,\n\tCylinderGeometry,\n\tDoubleSide,\n\tEuler,\n\tFloat32BufferAttribute,\n\tLine,\n\tLineBasicMaterial,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tObject3D,\n\tOctahedronGeometry,\n\tPlaneGeometry,\n\tQuaternion,\n\tRaycaster,\n\tSphereGeometry,\n\tTorusGeometry,\n\tVector3\n} from 'three';\n\nconst _raycaster = new Raycaster();\n\nconst _tempVector = new Vector3();\nconst _tempVector2 = new Vector3();\nconst _tempQuaternion = new Quaternion();\nconst _unit = {\n\tX: new Vector3( 1, 0, 0 ),\n\tY: new Vector3( 0, 1, 0 ),\n\tZ: new Vector3( 0, 0, 1 )\n};\n\nconst _changeEvent = { type: 'change' };\nconst _mouseDownEvent = { type: 'mouseDown' };\nconst _mouseUpEvent = { type: 'mouseUp', mode: null };\nconst _objectChangeEvent = { type: 'objectChange' };\n\nclass TransformControls extends Object3D {\n\n\tconstructor( camera, domElement ) {\n\n\t\tsuper();\n\n\t\tif ( domElement === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.TransformControls: The second parameter \"domElement\" is now mandatory.' );\n\t\t\tdomElement = document;\n\n\t\t}\n\n\t\tthis.isTransformControls = true;\n\n\t\tthis.visible = false;\n\t\tthis.domElement = domElement;\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t\tconst _gizmo = new TransformControlsGizmo();\n\t\tthis._gizmo = _gizmo;\n\t\tthis.add( _gizmo );\n\n\t\tconst _plane = new TransformControlsPlane();\n\t\tthis._plane = _plane;\n\t\tthis.add( _plane );\n\n\t\tconst scope = this;\n\n\t\t// Defined getter, setter and store for a property\n\t\tfunction defineProperty( propName, defaultValue ) {\n\n\t\t\tlet propValue = defaultValue;\n\n\t\t\tObject.defineProperty( scope, propName, {\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn propValue !== undefined ? propValue : defaultValue;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tif ( propValue !== value ) {\n\n\t\t\t\t\t\tpropValue = value;\n\t\t\t\t\t\t_plane[ propName ] = value;\n\t\t\t\t\t\t_gizmo[ propName ] = value;\n\n\t\t\t\t\t\tscope.dispatchEvent( { type: propName + '-changed', value: value } );\n\t\t\t\t\t\tscope.dispatchEvent( _changeEvent );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tscope[ propName ] = defaultValue;\n\t\t\t_plane[ propName ] = defaultValue;\n\t\t\t_gizmo[ propName ] = defaultValue;\n\n\t\t}\n\n\t\t// Define properties with getters/setter\n\t\t// Setting the defined property will automatically trigger change event\n\t\t// Defined properties are passed down to gizmo and plane\n\n\t\tdefineProperty( 'camera', camera );\n\t\tdefineProperty( 'object', undefined );\n\t\tdefineProperty( 'enabled', true );\n\t\tdefineProperty( 'axis', null );\n\t\tdefineProperty( 'mode', 'translate' );\n\t\tdefineProperty( 'translationSnap', null );\n\t\tdefineProperty( 'rotationSnap', null );\n\t\tdefineProperty( 'scaleSnap', null );\n\t\tdefineProperty( 'space', 'world' );\n\t\tdefineProperty( 'size', 1 );\n\t\tdefineProperty( 'dragging', false );\n\t\tdefineProperty( 'showX', true );\n\t\tdefineProperty( 'showY', true );\n\t\tdefineProperty( 'showZ', true );\n\n\t\t// Reusable utility variables\n\n\t\tconst worldPosition = new Vector3();\n\t\tconst worldPositionStart = new Vector3();\n\t\tconst worldQuaternion = new Quaternion();\n\t\tconst worldQuaternionStart = new Quaternion();\n\t\tconst cameraPosition = new Vector3();\n\t\tconst cameraQuaternion = new Quaternion();\n\t\tconst pointStart = new Vector3();\n\t\tconst pointEnd = new Vector3();\n\t\tconst rotationAxis = new Vector3();\n\t\tconst rotationAngle = 0;\n\t\tconst eye = new Vector3();\n\n\t\t// TODO: remove properties unused in plane and gizmo\n\n\t\tdefineProperty( 'worldPosition', worldPosition );\n\t\tdefineProperty( 'worldPositionStart', worldPositionStart );\n\t\tdefineProperty( 'worldQuaternion', worldQuaternion );\n\t\tdefineProperty( 'worldQuaternionStart', worldQuaternionStart );\n\t\tdefineProperty( 'cameraPosition', cameraPosition );\n\t\tdefineProperty( 'cameraQuaternion', cameraQuaternion );\n\t\tdefineProperty( 'pointStart', pointStart );\n\t\tdefineProperty( 'pointEnd', pointEnd );\n\t\tdefineProperty( 'rotationAxis', rotationAxis );\n\t\tdefineProperty( 'rotationAngle', rotationAngle );\n\t\tdefineProperty( 'eye', eye );\n\n\t\tthis._offset = new Vector3();\n\t\tthis._startNorm = new Vector3();\n\t\tthis._endNorm = new Vector3();\n\t\tthis._cameraScale = new Vector3();\n\n\t\tthis._parentPosition = new Vector3();\n\t\tthis._parentQuaternion = new Quaternion();\n\t\tthis._parentQuaternionInv = new Quaternion();\n\t\tthis._parentScale = new Vector3();\n\n\t\tthis._worldScaleStart = new Vector3();\n\t\tthis._worldQuaternionInv = new Quaternion();\n\t\tthis._worldScale = new Vector3();\n\n\t\tthis._positionStart = new Vector3();\n\t\tthis._quaternionStart = new Quaternion();\n\t\tthis._scaleStart = new Vector3();\n\n\t\tthis._getPointer = getPointer.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerHover = onPointerHover.bind( this );\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointermove', this._onPointerHover );\n\t\tthis.domElement.addEventListener( 'pointerup', this._onPointerUp );\n\n\t}\n\n\t// updateMatrixWorld updates key transformation variables\n\tupdateMatrixWorld() {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\tif ( this.object.parent === null ) {\n\n\t\t\t\tconsole.error( 'TransformControls: The attached 3D object must be a part of the scene graph.' );\n\n\t\t\t} else {\n\n\t\t\t\tthis.object.parent.matrixWorld.decompose( this._parentPosition, this._parentQuaternion, this._parentScale );\n\n\t\t\t}\n\n\t\t\tthis.object.matrixWorld.decompose( this.worldPosition, this.worldQuaternion, this._worldScale );\n\n\t\t\tthis._parentQuaternionInv.copy( this._parentQuaternion ).invert();\n\t\t\tthis._worldQuaternionInv.copy( this.worldQuaternion ).invert();\n\n\t\t}\n\n\t\tthis.camera.updateMatrixWorld();\n\t\tthis.camera.matrixWorld.decompose( this.cameraPosition, this.cameraQuaternion, this._cameraScale );\n\n\t\tif ( this.camera.isOrthographicCamera ) {\n\n\t\t\tthis.camera.getWorldDirection( this.eye ).negate();\n\n\t\t} else {\n\n\t\t\tthis.eye.copy( this.cameraPosition ).sub( this.worldPosition ).normalize();\n\n\t\t}\n\n\t\tsuper.updateMatrixWorld( this );\n\n\t}\n\n\tpointerHover( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true ) return;\n\n\t\t_raycaster.setFromCamera( pointer, this.camera );\n\n\t\tconst intersect = intersectObjectWithRay( this._gizmo.picker[ this.mode ], _raycaster );\n\n\t\tif ( intersect ) {\n\n\t\t\tthis.axis = intersect.object.name;\n\n\t\t} else {\n\n\t\t\tthis.axis = null;\n\n\t\t}\n\n\t}\n\n\tpointerDown( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true || pointer.button !== 0 ) return;\n\n\t\tif ( this.axis !== null ) {\n\n\t\t\t_raycaster.setFromCamera( pointer, this.camera );\n\n\t\t\tconst planeIntersect = intersectObjectWithRay( this._plane, _raycaster, true );\n\n\t\t\tif ( planeIntersect ) {\n\n\t\t\t\tthis.object.updateMatrixWorld();\n\t\t\t\tthis.object.parent.updateMatrixWorld();\n\n\t\t\t\tthis._positionStart.copy( this.object.position );\n\t\t\t\tthis._quaternionStart.copy( this.object.quaternion );\n\t\t\t\tthis._scaleStart.copy( this.object.scale );\n\n\t\t\t\tthis.object.matrixWorld.decompose( this.worldPositionStart, this.worldQuaternionStart, this._worldScaleStart );\n\n\t\t\t\tthis.pointStart.copy( planeIntersect.point ).sub( this.worldPositionStart );\n\n\t\t\t}\n\n\t\t\tthis.dragging = true;\n\t\t\t_mouseDownEvent.mode = this.mode;\n\t\t\tthis.dispatchEvent( _mouseDownEvent );\n\n\t\t}\n\n\t}\n\n\tpointerMove( pointer ) {\n\n\t\tconst axis = this.axis;\n\t\tconst mode = this.mode;\n\t\tconst object = this.object;\n\t\tlet space = this.space;\n\n\t\tif ( mode === 'scale' ) {\n\n\t\t\tspace = 'local';\n\n\t\t} else if ( axis === 'E' || axis === 'XYZE' || axis === 'XYZ' ) {\n\n\t\t\tspace = 'world';\n\n\t\t}\n\n\t\tif ( object === undefined || axis === null || this.dragging === false || pointer.button !== - 1 ) return;\n\n\t\t_raycaster.setFromCamera( pointer, this.camera );\n\n\t\tconst planeIntersect = intersectObjectWithRay( this._plane, _raycaster, true );\n\n\t\tif ( ! planeIntersect ) return;\n\n\t\tthis.pointEnd.copy( planeIntersect.point ).sub( this.worldPositionStart );\n\n\t\tif ( mode === 'translate' ) {\n\n\t\t\t// Apply translate\n\n\t\t\tthis._offset.copy( this.pointEnd ).sub( this.pointStart );\n\n\t\t\tif ( space === 'local' && axis !== 'XYZ' ) {\n\n\t\t\t\tthis._offset.applyQuaternion( this._worldQuaternionInv );\n\n\t\t\t}\n\n\t\t\tif ( axis.indexOf( 'X' ) === - 1 ) this._offset.x = 0;\n\t\t\tif ( axis.indexOf( 'Y' ) === - 1 ) this._offset.y = 0;\n\t\t\tif ( axis.indexOf( 'Z' ) === - 1 ) this._offset.z = 0;\n\n\t\t\tif ( space === 'local' && axis !== 'XYZ' ) {\n\n\t\t\t\tthis._offset.applyQuaternion( this._quaternionStart ).divide( this._parentScale );\n\n\t\t\t} else {\n\n\t\t\t\tthis._offset.applyQuaternion( this._parentQuaternionInv ).divide( this._parentScale );\n\n\t\t\t}\n\n\t\t\tobject.position.copy( this._offset ).add( this._positionStart );\n\n\t\t\t// Apply translation snap\n\n\t\t\tif ( this.translationSnap ) {\n\n\t\t\t\tif ( space === 'local' ) {\n\n\t\t\t\t\tobject.position.applyQuaternion( _tempQuaternion.copy( this._quaternionStart ).invert() );\n\n\t\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.position.applyQuaternion( this._quaternionStart );\n\n\t\t\t\t}\n\n\t\t\t\tif ( space === 'world' ) {\n\n\t\t\t\t\tif ( object.parent ) {\n\n\t\t\t\t\t\tobject.position.add( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.parent ) {\n\n\t\t\t\t\t\tobject.position.sub( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( mode === 'scale' ) {\n\n\t\t\tif ( axis.search( 'XYZ' ) !== - 1 ) {\n\n\t\t\t\tlet d = this.pointEnd.length() / this.pointStart.length();\n\n\t\t\t\tif ( this.pointEnd.dot( this.pointStart ) < 0 ) d *= - 1;\n\n\t\t\t\t_tempVector2.set( d, d, d );\n\n\t\t\t} else {\n\n\t\t\t\t_tempVector.copy( this.pointStart );\n\t\t\t\t_tempVector2.copy( this.pointEnd );\n\n\t\t\t\t_tempVector.applyQuaternion( this._worldQuaternionInv );\n\t\t\t\t_tempVector2.applyQuaternion( this._worldQuaternionInv );\n\n\t\t\t\t_tempVector2.divide( _tempVector );\n\n\t\t\t\tif ( axis.search( 'X' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.x = 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Y' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.y = 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Z' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.z = 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Apply scale\n\n\t\t\tobject.scale.copy( this._scaleStart ).multiply( _tempVector2 );\n\n\t\t\tif ( this.scaleSnap ) {\n\n\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.x = Math.round( object.scale.x / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.y = Math.round( object.scale.y / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.z = Math.round( object.scale.z / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( mode === 'rotate' ) {\n\n\t\t\tthis._offset.copy( this.pointEnd ).sub( this.pointStart );\n\n\t\t\tconst ROTATION_SPEED = 20 / this.worldPosition.distanceTo( _tempVector.setFromMatrixPosition( this.camera.matrixWorld ) );\n\n\t\t\tif ( axis === 'E' ) {\n\n\t\t\t\tthis.rotationAxis.copy( this.eye );\n\t\t\t\tthis.rotationAngle = this.pointEnd.angleTo( this.pointStart );\n\n\t\t\t\tthis._startNorm.copy( this.pointStart ).normalize();\n\t\t\t\tthis._endNorm.copy( this.pointEnd ).normalize();\n\n\t\t\t\tthis.rotationAngle *= ( this._endNorm.cross( this._startNorm ).dot( this.eye ) < 0 ? 1 : - 1 );\n\n\t\t\t} else if ( axis === 'XYZE' ) {\n\n\t\t\t\tthis.rotationAxis.copy( this._offset ).cross( this.eye ).normalize();\n\t\t\t\tthis.rotationAngle = this._offset.dot( _tempVector.copy( this.rotationAxis ).cross( this.eye ) ) * ROTATION_SPEED;\n\n\t\t\t} else if ( axis === 'X' || axis === 'Y' || axis === 'Z' ) {\n\n\t\t\t\tthis.rotationAxis.copy( _unit[ axis ] );\n\n\t\t\t\t_tempVector.copy( _unit[ axis ] );\n\n\t\t\t\tif ( space === 'local' ) {\n\n\t\t\t\t\t_tempVector.applyQuaternion( this.worldQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tthis.rotationAngle = this._offset.dot( _tempVector.cross( this.eye ).normalize() ) * ROTATION_SPEED;\n\n\t\t\t}\n\n\t\t\t// Apply rotation snap\n\n\t\t\tif ( this.rotationSnap ) this.rotationAngle = Math.round( this.rotationAngle / this.rotationSnap ) * this.rotationSnap;\n\n\t\t\t// Apply rotate\n\t\t\tif ( space === 'local' && axis !== 'E' && axis !== 'XYZE' ) {\n\n\t\t\t\tobject.quaternion.copy( this._quaternionStart );\n\t\t\t\tobject.quaternion.multiply( _tempQuaternion.setFromAxisAngle( this.rotationAxis, this.rotationAngle ) ).normalize();\n\n\t\t\t} else {\n\n\t\t\t\tthis.rotationAxis.applyQuaternion( this._parentQuaternionInv );\n\t\t\t\tobject.quaternion.copy( _tempQuaternion.setFromAxisAngle( this.rotationAxis, this.rotationAngle ) );\n\t\t\t\tobject.quaternion.multiply( this._quaternionStart ).normalize();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( _changeEvent );\n\t\tthis.dispatchEvent( _objectChangeEvent );\n\n\t}\n\n\tpointerUp( pointer ) {\n\n\t\tif ( pointer.button !== 0 ) return;\n\n\t\tif ( this.dragging && ( this.axis !== null ) ) {\n\n\t\t\t_mouseUpEvent.mode = this.mode;\n\t\t\tthis.dispatchEvent( _mouseUpEvent );\n\n\t\t}\n\n\t\tthis.dragging = false;\n\t\tthis.axis = null;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerHover );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\tthis.traverse( function ( child ) {\n\n\t\t\tif ( child.geometry ) child.geometry.dispose();\n\t\t\tif ( child.material ) child.material.dispose();\n\n\t\t} );\n\n\t}\n\n\t// Set current object\n\tattach( object ) {\n\n\t\tthis.object = object;\n\t\tthis.visible = true;\n\n\t\treturn this;\n\n\t}\n\n\t// Detach from object\n\tdetach() {\n\n\t\tthis.object = undefined;\n\t\tthis.visible = false;\n\t\tthis.axis = null;\n\n\t\treturn this;\n\n\t}\n\n\treset() {\n\n\t\tif ( ! this.enabled ) return;\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis.object.position.copy( this._positionStart );\n\t\t\tthis.object.quaternion.copy( this._quaternionStart );\n\t\t\tthis.object.scale.copy( this._scaleStart );\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\t\t\tthis.dispatchEvent( _objectChangeEvent );\n\n\t\t\tthis.pointStart.copy( this.pointEnd );\n\n\t\t}\n\n\t}\n\n\tgetRaycaster() {\n\n\t\treturn _raycaster;\n\n\t}\n\n\t// TODO: deprecate\n\n\tgetMode() {\n\n\t\treturn this.mode;\n\n\t}\n\n\tsetMode( mode ) {\n\n\t\tthis.mode = mode;\n\n\t}\n\n\tsetTranslationSnap( translationSnap ) {\n\n\t\tthis.translationSnap = translationSnap;\n\n\t}\n\n\tsetRotationSnap( rotationSnap ) {\n\n\t\tthis.rotationSnap = rotationSnap;\n\n\t}\n\n\tsetScaleSnap( scaleSnap ) {\n\n\t\tthis.scaleSnap = scaleSnap;\n\n\t}\n\n\tsetSize( size ) {\n\n\t\tthis.size = size;\n\n\t}\n\n\tsetSpace( space ) {\n\n\t\tthis.space = space;\n\n\t}\n\n}\n\n// mouse / touch event handlers\n\nfunction getPointer( event ) {\n\n\tif ( this.domElement.ownerDocument.pointerLockElement ) {\n\n\t\treturn {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tbutton: event.button\n\t\t};\n\n\t} else {\n\n\t\tconst rect = this.domElement.getBoundingClientRect();\n\n\t\treturn {\n\t\t\tx: ( event.clientX - rect.left ) / rect.width * 2 - 1,\n\t\t\ty: - ( event.clientY - rect.top ) / rect.height * 2 + 1,\n\t\t\tbutton: event.button\n\t\t};\n\n\t}\n\n}\n\nfunction onPointerHover( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tswitch ( event.pointerType ) {\n\n\t\tcase 'mouse':\n\t\tcase 'pen':\n\t\t\tthis.pointerHover( this._getPointer( event ) );\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tif ( ! document.pointerLockElement ) {\n\n\t\tthis.domElement.setPointerCapture( event.pointerId );\n\n\t}\n\n\tthis.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\n\tthis.pointerHover( this._getPointer( event ) );\n\tthis.pointerDown( this._getPointer( event ) );\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tthis.pointerMove( this._getPointer( event ) );\n\n}\n\nfunction onPointerUp( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tthis.domElement.releasePointerCapture( event.pointerId );\n\n\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\n\tthis.pointerUp( this._getPointer( event ) );\n\n}\n\nfunction intersectObjectWithRay( object, raycaster, includeInvisible ) {\n\n\tconst allIntersections = raycaster.intersectObject( object, true );\n\n\tfor ( let i = 0; i < allIntersections.length; i ++ ) {\n\n\t\tif ( allIntersections[ i ].object.visible || includeInvisible ) {\n\n\t\t\treturn allIntersections[ i ];\n\n\t\t}\n\n\t}\n\n\treturn false;\n\n}\n\n//\n\n// Reusable utility variables\n\nconst _tempEuler = new Euler();\nconst _alignVector = new Vector3( 0, 1, 0 );\nconst _zeroVector = new Vector3( 0, 0, 0 );\nconst _lookAtMatrix = new Matrix4();\nconst _tempQuaternion2 = new Quaternion();\nconst _identityQuaternion = new Quaternion();\nconst _dirVector = new Vector3();\nconst _tempMatrix = new Matrix4();\n\nconst _unitX = new Vector3( 1, 0, 0 );\nconst _unitY = new Vector3( 0, 1, 0 );\nconst _unitZ = new Vector3( 0, 0, 1 );\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _v3 = new Vector3();\n\nclass TransformControlsGizmo extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isTransformControlsGizmo = true;\n\n\t\tthis.type = 'TransformControlsGizmo';\n\n\t\t// shared materials\n\n\t\tconst gizmoMaterial = new MeshBasicMaterial( {\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tfog: false,\n\t\t\ttoneMapped: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\tconst gizmoLineMaterial = new LineBasicMaterial( {\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tfog: false,\n\t\t\ttoneMapped: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\t// Make unique material for each axis/color\n\n\t\tconst matInvisible = gizmoMaterial.clone();\n\t\tmatInvisible.opacity = 0.15;\n\n\t\tconst matHelper = gizmoLineMaterial.clone();\n\t\tmatHelper.opacity = 0.5;\n\n\t\tconst matRed = gizmoMaterial.clone();\n\t\tmatRed.color.setHex( 0xff0000 );\n\n\t\tconst matGreen = gizmoMaterial.clone();\n\t\tmatGreen.color.setHex( 0x00ff00 );\n\n\t\tconst matBlue = gizmoMaterial.clone();\n\t\tmatBlue.color.setHex( 0x0000ff );\n\n\t\tconst matRedTransparent = gizmoMaterial.clone();\n\t\tmatRedTransparent.color.setHex( 0xff0000 );\n\t\tmatRedTransparent.opacity = 0.5;\n\n\t\tconst matGreenTransparent = gizmoMaterial.clone();\n\t\tmatGreenTransparent.color.setHex( 0x00ff00 );\n\t\tmatGreenTransparent.opacity = 0.5;\n\n\t\tconst matBlueTransparent = gizmoMaterial.clone();\n\t\tmatBlueTransparent.color.setHex( 0x0000ff );\n\t\tmatBlueTransparent.opacity = 0.5;\n\n\t\tconst matWhiteTransparent = gizmoMaterial.clone();\n\t\tmatWhiteTransparent.opacity = 0.25;\n\n\t\tconst matYellowTransparent = gizmoMaterial.clone();\n\t\tmatYellowTransparent.color.setHex( 0xffff00 );\n\t\tmatYellowTransparent.opacity = 0.25;\n\n\t\tconst matYellow = gizmoMaterial.clone();\n\t\tmatYellow.color.setHex( 0xffff00 );\n\n\t\tconst matGray = gizmoMaterial.clone();\n\t\tmatGray.color.setHex( 0x787878 );\n\n\t\t// reusable geometry\n\n\t\tconst arrowGeometry = new CylinderGeometry( 0, 0.04, 0.1, 12 );\n\t\tarrowGeometry.translate( 0, 0.05, 0 );\n\n\t\tconst scaleHandleGeometry = new BoxGeometry( 0.08, 0.08, 0.08 );\n\t\tscaleHandleGeometry.translate( 0, 0.04, 0 );\n\n\t\tconst lineGeometry = new BufferGeometry();\n\t\tlineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0,\t1, 0, 0 ], 3 ) );\n\n\t\tconst lineGeometry2 = new CylinderGeometry( 0.0075, 0.0075, 0.5, 3 );\n\t\tlineGeometry2.translate( 0, 0.25, 0 );\n\n\t\tfunction CircleGeometry( radius, arc ) {\n\n\t\t\tconst geometry = new TorusGeometry( radius, 0.0075, 3, 64, arc * Math.PI * 2 );\n\t\t\tgeometry.rotateY( Math.PI / 2 );\n\t\t\tgeometry.rotateX( Math.PI / 2 );\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\t// Special geometry for transform helper. If scaled with position vector it spans from [0,0,0] to position\n\n\t\tfunction TranslateHelperGeometry() {\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 1, 1, 1 ], 3 ) );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\t// Gizmo definitions - custom hierarchy definitions for setupGizmo() function\n\n\t\tconst gizmoTranslate = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( arrowGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( arrowGeometry, matGreen ), [ 0, 0.5, 0 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matGreen ), [ 0, - 0.5, 0 ], [ Math.PI, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matGreen ) ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matBlue ), null, [ Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.1, 0 ), matWhiteTransparent.clone() ), [ 0, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent.clone() ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent.clone() ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent.clone() ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst pickerTranslate = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.2, 0 ), matInvisible ) ]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst helperTranslate = {\n\t\t\tSTART: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tEND: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tDELTA: [\n\t\t\t\t[ new Line( TranslateHelperGeometry(), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\tconst gizmoRotate = {\n\t\t\tXYZE: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 1 ), matGray ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matRed ) ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matGreen ), null, [ 0, 0, - Math.PI / 2 ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matBlue ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tE: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.75, 1 ), matYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst helperRotate = {\n\t\t\tAXIS: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\tconst pickerRotate = {\n\t\t\tXYZE: [\n\t\t\t\t[ new Mesh( new SphereGeometry( 0.25, 10, 8 ), matInvisible ) ]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, - Math.PI / 2, - Math.PI / 2 ]],\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t],\n\t\t\tE: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.75, 0.1, 2, 24 ), matInvisible ) ]\n\t\t\t]\n\t\t};\n\n\t\tconst gizmoScale = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matGreen ), [ 0, 0.5, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matGreen ) ],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matGreen ), [ 0, - 0.5, 0 ], [ 0, 0, Math.PI ]],\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matBlue ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.1, 0.1, 0.1 ), matWhiteTransparent.clone() ) ],\n\t\t\t]\n\t\t};\n\n\t\tconst pickerScale = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]],\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]],\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]],\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 0 ]],\n\t\t\t]\n\t\t};\n\n\t\tconst helperScale = {\n\t\t\tX: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\t// Creates an Object3D with gizmos described in custom hierarchy definition.\n\n\t\tfunction setupGizmo( gizmoMap ) {\n\n\t\t\tconst gizmo = new Object3D();\n\n\t\t\tfor ( const name in gizmoMap ) {\n\n\t\t\t\tfor ( let i = gizmoMap[ name ].length; i --; ) {\n\n\t\t\t\t\tconst object = gizmoMap[ name ][ i ][ 0 ].clone();\n\t\t\t\t\tconst position = gizmoMap[ name ][ i ][ 1 ];\n\t\t\t\t\tconst rotation = gizmoMap[ name ][ i ][ 2 ];\n\t\t\t\t\tconst scale = gizmoMap[ name ][ i ][ 3 ];\n\t\t\t\t\tconst tag = gizmoMap[ name ][ i ][ 4 ];\n\n\t\t\t\t\t// name and tag properties are essential for picking and updating logic.\n\t\t\t\t\tobject.name = name;\n\t\t\t\t\tobject.tag = tag;\n\n\t\t\t\t\tif ( position ) {\n\n\t\t\t\t\t\tobject.position.set( position[ 0 ], position[ 1 ], position[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( rotation ) {\n\n\t\t\t\t\t\tobject.rotation.set( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( scale ) {\n\n\t\t\t\t\t\tobject.scale.set( scale[ 0 ], scale[ 1 ], scale[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.updateMatrix();\n\n\t\t\t\t\tconst tempGeometry = object.geometry.clone();\n\t\t\t\t\ttempGeometry.applyMatrix4( object.matrix );\n\t\t\t\t\tobject.geometry = tempGeometry;\n\t\t\t\t\tobject.renderOrder = Infinity;\n\n\t\t\t\t\tobject.position.set( 0, 0, 0 );\n\t\t\t\t\tobject.rotation.set( 0, 0, 0 );\n\t\t\t\t\tobject.scale.set( 1, 1, 1 );\n\n\t\t\t\t\tgizmo.add( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn gizmo;\n\n\t\t}\n\n\t\t// Gizmo creation\n\n\t\tthis.gizmo = {};\n\t\tthis.picker = {};\n\t\tthis.helper = {};\n\n\t\tthis.add( this.gizmo[ 'translate' ] = setupGizmo( gizmoTranslate ) );\n\t\tthis.add( this.gizmo[ 'rotate' ] = setupGizmo( gizmoRotate ) );\n\t\tthis.add( this.gizmo[ 'scale' ] = setupGizmo( gizmoScale ) );\n\t\tthis.add( this.picker[ 'translate' ] = setupGizmo( pickerTranslate ) );\n\t\tthis.add( this.picker[ 'rotate' ] = setupGizmo( pickerRotate ) );\n\t\tthis.add( this.picker[ 'scale' ] = setupGizmo( pickerScale ) );\n\t\tthis.add( this.helper[ 'translate' ] = setupGizmo( helperTranslate ) );\n\t\tthis.add( this.helper[ 'rotate' ] = setupGizmo( helperRotate ) );\n\t\tthis.add( this.helper[ 'scale' ] = setupGizmo( helperScale ) );\n\n\t\t// Pickers should be hidden always\n\n\t\tthis.picker[ 'translate' ].visible = false;\n\t\tthis.picker[ 'rotate' ].visible = false;\n\t\tthis.picker[ 'scale' ].visible = false;\n\n\t}\n\n\t// updateMatrixWorld will update transformations and appearance of individual handles\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst space = ( this.mode === 'scale' ) ? 'local' : this.space; // scale always oriented to local rotation\n\n\t\tconst quaternion = ( space === 'local' ) ? this.worldQuaternion : _identityQuaternion;\n\n\t\t// Show only gizmos for current transform mode\n\n\t\tthis.gizmo[ 'translate' ].visible = this.mode === 'translate';\n\t\tthis.gizmo[ 'rotate' ].visible = this.mode === 'rotate';\n\t\tthis.gizmo[ 'scale' ].visible = this.mode === 'scale';\n\n\t\tthis.helper[ 'translate' ].visible = this.mode === 'translate';\n\t\tthis.helper[ 'rotate' ].visible = this.mode === 'rotate';\n\t\tthis.helper[ 'scale' ].visible = this.mode === 'scale';\n\n\n\t\tlet handles = [];\n\t\thandles = handles.concat( this.picker[ this.mode ].children );\n\t\thandles = handles.concat( this.gizmo[ this.mode ].children );\n\t\thandles = handles.concat( this.helper[ this.mode ].children );\n\n\t\tfor ( let i = 0; i < handles.length; i ++ ) {\n\n\t\t\tconst handle = handles[ i ];\n\n\t\t\t// hide aligned to camera\n\n\t\t\thandle.visible = true;\n\t\t\thandle.rotation.set( 0, 0, 0 );\n\t\t\thandle.position.copy( this.worldPosition );\n\n\t\t\tlet factor;\n\n\t\t\tif ( this.camera.isOrthographicCamera ) {\n\n\t\t\t\tfactor = ( this.camera.top - this.camera.bottom ) / this.camera.zoom;\n\n\t\t\t} else {\n\n\t\t\t\tfactor = this.worldPosition.distanceTo( this.cameraPosition ) * Math.min( 1.9 * Math.tan( Math.PI * this.camera.fov / 360 ) / this.camera.zoom, 7 );\n\n\t\t\t}\n\n\t\t\thandle.scale.set( 1, 1, 1 ).multiplyScalar( factor * this.size / 4 );\n\n\t\t\t// TODO: simplify helpers and consider decoupling from gizmo\n\n\t\t\tif ( handle.tag === 'helper' ) {\n\n\t\t\t\thandle.visible = false;\n\n\t\t\t\tif ( handle.name === 'AXIS' ) {\n\n\t\t\t\t\thandle.visible = !! this.axis;\n\n\t\t\t\t\tif ( this.axis === 'X' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, 0, 0 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'Y' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, 0, Math.PI / 2 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'Z' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, Math.PI / 2, 0 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'XYZE' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, Math.PI / 2, 0 ) );\n\t\t\t\t\t\t_alignVector.copy( this.rotationAxis );\n\t\t\t\t\t\thandle.quaternion.setFromRotationMatrix( _lookAtMatrix.lookAt( _zeroVector, _alignVector, _unitY ) );\n\t\t\t\t\t\thandle.quaternion.multiply( _tempQuaternion );\n\t\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'E' ) {\n\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else if ( handle.name === 'START' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else if ( handle.name === 'END' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPosition );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else if ( handle.name === 'DELTA' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.quaternion.copy( this.worldQuaternionStart );\n\t\t\t\t\t_tempVector.set( 1e-10, 1e-10, 1e-10 ).add( this.worldPositionStart ).sub( this.worldPosition ).multiplyScalar( - 1 );\n\t\t\t\t\t_tempVector.applyQuaternion( this.worldQuaternionStart.clone().invert() );\n\t\t\t\t\thandle.scale.copy( _tempVector );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thandle.quaternion.copy( quaternion );\n\n\t\t\t\t\tif ( this.dragging ) {\n\n\t\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\thandle.position.copy( this.worldPosition );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis ) {\n\n\t\t\t\t\t\thandle.visible = this.axis.search( handle.name ) !== - 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// If updating helper, skip rest of the loop\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// Align handles to current local or world rotation\n\n\t\t\thandle.quaternion.copy( quaternion );\n\n\t\t\tif ( this.mode === 'translate' || this.mode === 'scale' ) {\n\n\t\t\t\t// Hide translate and scale axis facing the camera\n\n\t\t\t\tconst AXIS_HIDE_THRESHOLD = 0.99;\n\t\t\t\tconst PLANE_HIDE_THRESHOLD = 0.2;\n\n\t\t\t\tif ( handle.name === 'X' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Y' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Z' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'XY' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'YZ' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'XZ' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.mode === 'rotate' ) {\n\n\t\t\t\t// Align handles to current local or world rotation\n\n\t\t\t\t_tempQuaternion2.copy( quaternion );\n\t\t\t\t_alignVector.copy( this.eye ).applyQuaternion( _tempQuaternion.copy( quaternion ).invert() );\n\n\t\t\t\tif ( handle.name.search( 'E' ) !== - 1 ) {\n\n\t\t\t\t\thandle.quaternion.setFromRotationMatrix( _lookAtMatrix.lookAt( this.eye, _zeroVector, _unitY ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'X' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitX, Math.atan2( - _alignVector.y, _alignVector.z ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Y' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitY, Math.atan2( _alignVector.x, _alignVector.z ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Z' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitZ, Math.atan2( _alignVector.y, _alignVector.x ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Hide disabled axes\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'X' ) === - 1 || this.showX );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'Y' ) === - 1 || this.showY );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'Z' ) === - 1 || this.showZ );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'E' ) === - 1 || ( this.showX && this.showY && this.showZ ) );\n\n\t\t\t// highlight selected axis\n\n\t\t\thandle.material._color = handle.material._color || handle.material.color.clone();\n\t\t\thandle.material._opacity = handle.material._opacity || handle.material.opacity;\n\n\t\t\thandle.material.color.copy( handle.material._color );\n\t\t\thandle.material.opacity = handle.material._opacity;\n\n\t\t\tif ( this.enabled && this.axis ) {\n\n\t\t\t\tif ( handle.name === this.axis ) {\n\n\t\t\t\t\thandle.material.color.setHex( 0xffff00 );\n\t\t\t\t\thandle.material.opacity = 1.0;\n\n\t\t\t\t} else if ( this.axis.split( '' ).some( function ( a ) {\n\n\t\t\t\t\treturn handle.name === a;\n\n\t\t\t\t} ) ) {\n\n\t\t\t\t\thandle.material.color.setHex( 0xffff00 );\n\t\t\t\t\thandle.material.opacity = 1.0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\n//\n\nclass TransformControlsPlane extends Mesh {\n\n\tconstructor() {\n\n\t\tsuper(\n\t\t\tnew PlaneGeometry( 100000, 100000, 2, 2 ),\n\t\t\tnew MeshBasicMaterial( { visible: false, wireframe: true, side: DoubleSide, transparent: true, opacity: 0.1, toneMapped: false } )\n\t\t);\n\n\t\tthis.isTransformControlsPlane = true;\n\n\t\tthis.type = 'TransformControlsPlane';\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tlet space = this.space;\n\n\t\tthis.position.copy( this.worldPosition );\n\n\t\tif ( this.mode === 'scale' ) space = 'local'; // scale always oriented to local rotation\n\n\t\t_v1.copy( _unitX ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\t\t_v2.copy( _unitY ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\t\t_v3.copy( _unitZ ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\n\t\t// Align the plane for current transform mode, axis and space.\n\n\t\t_alignVector.copy( _v2 );\n\n\t\tswitch ( this.mode ) {\n\n\t\t\tcase 'translate':\n\t\t\tcase 'scale':\n\t\t\t\tswitch ( this.axis ) {\n\n\t\t\t\t\tcase 'X':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v1 );\n\t\t\t\t\t\t_dirVector.copy( _v1 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Y':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v2 );\n\t\t\t\t\t\t_dirVector.copy( _v2 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v3 );\n\t\t\t\t\t\t_dirVector.copy( _v3 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XY':\n\t\t\t\t\t\t_dirVector.copy( _v3 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'YZ':\n\t\t\t\t\t\t_dirVector.copy( _v1 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XZ':\n\t\t\t\t\t\t_alignVector.copy( _v3 );\n\t\t\t\t\t\t_dirVector.copy( _v2 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XYZ':\n\t\t\t\t\tcase 'E':\n\t\t\t\t\t\t_dirVector.set( 0, 0, 0 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase 'rotate':\n\t\t\tdefault:\n\t\t\t\t// special case for rotate\n\t\t\t\t_dirVector.set( 0, 0, 0 );\n\n\t\t}\n\n\t\tif ( _dirVector.length() === 0 ) {\n\n\t\t\t// If in rotate mode, make the plane parallel to camera\n\t\t\tthis.quaternion.copy( this.cameraQuaternion );\n\n\t\t} else {\n\n\t\t\t_tempMatrix.lookAt( _tempVector.set( 0, 0, 0 ), _dirVector, _alignVector );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( _tempMatrix );\n\n\t\t}\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nexport { TransformControls, TransformControlsGizmo, TransformControlsPlane };\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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);\n\n this.viewer.on(\"explode\", this.viewerExplode);\n this.viewer.canvas.addEventListener(\"dblclick\", this.onDoubleClick, true);\n this.viewer.update();\n }\n\n override dispose() {\n this.viewer.off(\"explode\", this.viewerExplode);\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.removeFromParent();\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 viewerExplode = () => {\n this.planeHelper.size = this.viewer.extents.getSize(new Vector3()).length();\n this.viewer.update();\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-2024, 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-2024 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-2024, 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-2024 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-2024, 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-2024 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-2024, 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-2024 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, Vector3 } from \"three\";\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ExtentsComponent implements IDisposable {\n private viewer: Viewer;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.viewer.addEventListener(\"geometryend\", this.syncExtents);\n this.viewer.addEventListener(\"clear\", this.syncExtents);\n this.viewer.on(\"explode\", this.syncExtents);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"geometryend\", this.syncExtents);\n this.viewer.removeEventListener(\"clear\", this.syncExtents);\n this.viewer.off(\"explode\", this.syncExtents);\n }\n\n syncExtents = () => {\n const extents = this.viewer.models.reduce((result, gltf) => {\n const modelExtents = new Box3().setFromObject(gltf.scene);\n return result.isEmpty() ? result.copy(modelExtents) : result.union(modelExtents);\n }, new Box3());\n\n this.viewer.extents.copy(extents);\n this.viewer.target.copy(extents.getCenter(new Vector3()));\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 } from \"three\";\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class LightComponent implements IDisposable {\n protected viewer: Viewer;\n protected ambientLight: AmbientLight;\n protected directionalLight: DirectionalLight;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n this.ambientLight = new AmbientLight(0xffffff, 0);\n this.viewer.camera.add(this.ambientLight);\n\n this.directionalLight = new DirectionalLight(0xffffff, 1);\n this.directionalLight.position.set(0.5, 0, 0.866); // ~60º\n this.viewer.camera.add(this.directionalLight);\n }\n\n dispose(): void {\n this.ambientLight.removeFromParent();\n this.ambientLight = undefined;\n\n this.directionalLight.removeFromParent();\n this.directionalLight = undefined;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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, PMREMGenerator } from \"three\";\nimport { RoomEnvironment } from \"three/examples/jsm/environments/RoomEnvironment.js\";\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class BackgroundComponent implements IDisposable {\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 const environment = new RoomEnvironment();\n const pmremGenerator = new PMREMGenerator(this.viewer.renderer);\n\n this.viewer.renderer.setClearColor(this.backgroundColor);\n this.viewer.scene.background = this.backgroundColor;\n this.viewer.scene.environment = pmremGenerator.fromScene(environment).texture;\n this.viewer.addEventListener(\"optionschange\", this.syncOptions);\n\n environment.dispose();\n }\n\n dispose() {\n this.viewer.removeEventListener(\"optionschange\", this.syncOptions);\n this.viewer.scene.environment = undefined;\n this.viewer.scene.background = undefined;\n }\n\n syncOptions = () => {\n this.backgroundColor.setHex(0xffffff);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { GeometryEndEvent } from \"@inweb/viewer-core\";\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class DefaultPositionComponent implements IDisposable {\n protected viewer: Viewer;\n public defaultCameraPositions: any;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.viewer.addEventListener(\"geometryend\", this.geometryEnd);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"geometryend\", this.geometryEnd);\n }\n\n geometryEnd = (event: GeometryEndEvent) => {\n const box = this.viewer.extents;\n const size = box.getSize(new Vector3()).length();\n\n this.viewer.camera.near = size / 100;\n this.viewer.camera.far = size * 100;\n this.viewer.camera.updateMatrixWorld();\n this.viewer.camera.updateProjectionMatrix();\n\n // this.viewer.executeCommand(\"setDefaultViewPosition\", \"sw\");\n this.viewer.executeCommand(\"zoomToExtents\");\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ResizeCanvasComponent implements IDisposable {\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.camera.aspect = width / height;\n this.viewer.camera.updateProjectionMatrix();\n this.viewer.renderer.setSize(width, height, true);\n\n this.viewer.update(true);\n this.viewer.emitEvent({ type: \"resize\", width, height });\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class RenderLoopComponent implements IDisposable {\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 this.viewer.render(time);\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: \"#aa0000\" });\n const matGreen = new MeshBasicMaterial({ toneMapped: false, color: \"#00aa00\" });\n const matBlue = new MeshBasicMaterial({ toneMapped: false, color: \"#0000aa\" });\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 clippingPlanes = renderer.clippingPlanes;\n const viewport = renderer.getViewport(new Vector4());\n\n renderer.setViewport(this.position.x, this.position.y, this.size, this.size);\n renderer.clippingPlanes = [];\n renderer.clearDepth();\n renderer.render(this, this.orthoCamera);\n\n renderer.setViewport(viewport);\n renderer.clippingPlanes = clippingPlanes;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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 { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\nimport { WCSHelper } from \"../helpers/WCSHelper\";\n\nexport class WCSHelperComponent implements IDisposable {\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(\"render\", this.viewerRender);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"render\", this.viewerRender);\n this.wcsHelper.dispose();\n }\n\n viewerRender = () => {\n if (!this.viewer.extents.isEmpty()) this.wcsHelper.render(this.viewer.renderer);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, 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-2024 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, LinearToneMapping, Object3D, PerspectiveCamera, Scene, Vector3, WebGLRenderer } from \"three\";\nimport { GLTF, GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { GLTFLoadingManager } from \"./loaders/GLTFLoadingManager\";\n\nimport { EventEmitter2 } from \"@inweb/eventemitter2\";\nimport { Assembly, Client, Model, File } from \"@inweb/client\";\nimport {\n CANVAS_EVENTS,\n CanvasEventMap,\n commands,\n IDragger,\n IOptions,\n IViewer,\n IViewpoint,\n Options,\n OptionsEventMap,\n ViewerEventMap,\n} from \"@inweb/viewer-core\";\n\nimport { PanDragger } from \"./draggers/PanDragger\";\nimport { OrbitDragger } from \"./draggers/OrbitDragger\";\nimport { ZoomDragger } from \"./draggers/ZoomDragger\";\nimport { WalkDragger } from \"./draggers/WalkDragger\";\nimport { CuttingPlaneXAxisDragger } from \"./draggers/CuttingPlaneXAxis\";\nimport { CuttingPlaneYAxisDragger } from \"./draggers/CuttingPlaneYAxis\";\nimport { CuttingPlaneZAxisDragger } from \"./draggers/CuttingPlaneZAxis\";\n\nimport { IDisposable } from \"./IDisposable\";\nimport { ExtentsComponent } from \"./components/ExtentsComponent\";\nimport { LightComponent } from \"./components/LightComponent\";\nimport { BackgroundComponent } from \"./components/BackgroundComponent\";\nimport { DefaultPositionComponent } from \"./components/DefaultPositionComponent\";\nimport { ResizeCanvasComponent } from \"./components/ResizeCanvasComponent\";\nimport { RenderLoopComponent } from \"./components/RenderLoopComponent\";\nimport { SelectionComponent } from \"./components/SelectionComponent\";\n// import { ViewPositionComponent } from \"./components/ViewPositionComponent\";\nimport { WCSHelperComponent } from \"./components/WCSHelperComponent\";\n// import { AxesHelperComponent } from \"./components/AxesHelperComponent\";\n// import { ExtentsHelperComponent } from \"./components/ExtentsHelperComponent\";\n\n/**\n * 3D viewer powered by {@link https://threejs.org/ | Three.js}.\n */\nexport class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMap & OptionsEventMap> implements IViewer {\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: Scene | undefined;\n public camera: PerspectiveCamera | undefined;\n public renderer: WebGLRenderer | undefined;\n public models: Array<GLTF>;\n public selected: Array<Object3D>;\n public extents: Box3;\n public target: Vector3;\n\n private draggerFactory: Record<string, any>;\n private _activeDragger: IDragger | null;\n\n private components: Array<IDisposable>;\n\n private renderNeeded: boolean;\n private renderTime: DOMHighResTimeStamp;\n\n /**\n * @param client - The `Client` instance that is used to load model reference files from the\n * Open Cloud Server. Do not specify `Client` if you need a standalone viewer instance to\n * view `glTF` files from 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.extents = new Box3();\n this.target = new Vector3();\n\n this.draggerFactory = {\n Pan: PanDragger,\n Zoom: ZoomDragger,\n Orbit: OrbitDragger,\n Walk: WalkDragger,\n CuttingPlaneXAxis: CuttingPlaneXAxisDragger,\n CuttingPlaneYAxis: CuttingPlaneYAxisDragger,\n CuttingPlaneZAxis: CuttingPlaneZAxisDragger,\n };\n this._activeDragger = null;\n\n this.models = [];\n this.components = [];\n this.selected = [];\n\n this.renderTime = 0;\n\n this.render = this.render.bind(this);\n this.update = this.update.bind(this);\n }\n\n get options(): IOptions {\n return this._options;\n }\n\n get draggers(): string[] {\n return Object.keys(this.draggerFactory);\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 Scene();\n\n const rect = canvas.parentElement.getBoundingClientRect();\n const width = rect.width || 1;\n const height = rect.height || 1;\n this.camera = new PerspectiveCamera(45, width / height, 0.01, 1000);\n this.camera.up.set(0, 0, 1);\n\n this.renderer = new WebGLRenderer({ canvas, antialias: true, preserveDrawingBuffer: true });\n this.renderer.setPixelRatio(window.devicePixelRatio);\n this.renderer.setSize(width, height);\n this.renderer.toneMapping = LinearToneMapping;\n\n this.canvas = canvas;\n this.canvasEvents.forEach((x) => canvas.addEventListener(x, this.canvaseventlistener));\n\n this.components.push(new ExtentsComponent(this));\n this.components.push(new LightComponent(this));\n this.components.push(new BackgroundComponent(this));\n // this.components.push(new ViewPositionComponent(this));\n this.components.push(new DefaultPositionComponent(this));\n this.components.push(new ResizeCanvasComponent(this));\n this.components.push(new RenderLoopComponent(this));\n this.components.push(new SelectionComponent(this));\n this.components.push(new WCSHelperComponent(this));\n // this.components.push(new AxesHelperComponent(this));\n // this.components.push(new ExtentsHelperComponent(this));\n\n this.syncOptions();\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.emitEvent({ type: \"dispose\" });\n\n this.components.forEach((component: IDisposable) => component.dispose());\n this.components = [];\n\n this.setActiveDragger(\"\");\n this.removeAllListeners();\n\n this.clear();\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.renderer) this.renderer.dispose();\n\n this.renderer = undefined;\n this.camera = undefined;\n this.scene = undefined;\n this.helpers = undefined;\n\n return this;\n }\n\n isInitialized(): boolean {\n return !!this.renderer;\n }\n\n public render(time: DOMHighResTimeStamp): void {\n if (!this.renderNeeded) return;\n if (!this.renderer) return;\n\n const clippingPlanes = this.renderer.clippingPlanes;\n\n this.renderer.setViewport(0, 0, this.canvas.offsetWidth, this.canvas.offsetHeight);\n this.renderer.render(this.scene, this.camera);\n\n this.renderer.clippingPlanes = [];\n this.renderer.autoClear = false;\n this.renderer.render(this.helpers, this.camera);\n\n const deltaTime = (time - this.renderTime) / 1000;\n this.renderTime = time;\n this.emitEvent({ type: \"render\", time, deltaTime });\n\n this.renderer.autoClear = true;\n this.renderer.clippingPlanes = clippingPlanes;\n\n this.renderNeeded = false;\n }\n\n public update(force = false): void {\n this.renderNeeded = true;\n if (force) this.render(performance.now());\n this.emitEvent({ type: \"update\", data: force });\n }\n\n public syncOptions(options: IOptions = this.options): void {\n // this.update();\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 from Open Cloud Server into the viewer.\n *\n * The file geometry data on the server must be converted to `glTF` format.\n *\n * This method requires a `Client` instance to be specified when creating the viewer to load\n * model reference files from the Open Cloud Server. For a standalone viewer instance use\n * {@link openGltfFile | openGltfFile()}.\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, assembly or specific model to load. If a `File` instance with multiple\n * models is specified, the default model will be loaded. If there is no default model,\n * first availiable model will be loaded.\n */\n async open(file: Model | File | Assembly): Promise<this> {\n if (!this.renderer) return this;\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\", file, model: file });\n\n let model: Model | undefined = undefined;\n if (file) {\n const models = (await file.getModels()) || [];\n model = models.find((model: Model) => model.default) || models[0];\n }\n if (!model) throw new Error(\"No default model found\");\n\n const geometryType = model.database.split(\".\").pop();\n if (geometryType !== \"gltf\") throw new Error(`Unknown geometry type: ${geometryType}`);\n\n const url = `${model.httpClient.serverUrl}${model.path}/${model.database}`;\n const params = { requestHeader: model.httpClient.headers };\n\n await this.loadReferences(model);\n await this.loadGltfFile(url, undefined, params);\n\n return this;\n }\n\n cancel(): this {\n this.emitEvent({ type: \"cancel\" });\n return this;\n }\n\n /**\n * Loads a `glTF` file into the viewer.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param file - File URL or binary data buffer to load.\n * @param externalData - External resource map such as binary data buffers or images. Each\n * resource should be represented by a `uri` and a corresponding resource URL, 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 * or {@link https://developer.mozilla.org/docs/Web/API/Blob/Blob | Blob}, or\n * {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string,\n * @param params - Loader parameters.\n * @param params.path - The base path from which to find subsequent glTF resources such as\n * textures and .bin data files. If not defined, the base path of the file URL will be used.\n * @param params.requestHeader - The\n * {@link https://developer.mozilla.org/docs/Glossary/Request_header | request header} used\n * in HTTP request.\n * @param params.crossOrigin - The crossOrigin string to implement CORS for loading the url\n * from a different domain that allows CORS. Default is `anonymous`.\n * @param params.withCredentials - Whether the XMLHttpRequest uses credentials such as\n * cookies, authorization headers or TLS client certificates. See\n * {@link https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/withCredentials | XMLHttpRequest.withCredentials}.\n */\n openGltfFile(\n file: string | globalThis.File | ArrayBuffer | Blob,\n externalData: Map<string, string | globalThis.File | ArrayBuffer | Blob> = new Map(),\n params: {\n path?: string;\n requestHeader?: HeadersInit;\n crossOrigin?: string;\n withCredentials?: boolean;\n } = {}\n ): Promise<this> {\n if (!this.renderer) return Promise.resolve(this);\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\" });\n\n return this.loadGltfFile(file, externalData, params);\n }\n\n /**\n * Appends a `glTF` file to the existing opened file.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param file - File URL or binary data buffer to load.\n * @param externalData - External resource map such as binary data buffers or images. Each\n * resource should be represented by a `uri` and a corresponding resource URL, 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 * or {@link https://developer.mozilla.org/docs/Web/API/Blob/Blob | Blob}, or\n * {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string,\n * @param params - Loader parameters.\n * @param params.path - The base path from which to find subsequent glTF resources such as\n * textures and .bin data files.\n * @param params.requestHeader - The\n * {@link https://developer.mozilla.org/docs/Glossary/Request_header | request header} used\n * in HTTP request.\n * @param params.crossOrigin - The crossOrigin string to implement CORS for loading the url\n * from a different domain that allows CORS. Default is `anonymous`.\n * @param params.withCredentials - Whether the XMLHttpRequest uses credentials such as\n * cookies, authorization headers or TLS client certificates. See\n * {@link https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/withCredentials | XMLHttpRequest.withCredentials}.\n */\n async loadGltfFile(\n file: string | globalThis.File | ArrayBuffer | Blob,\n externalData: Map<string, string | globalThis.File | ArrayBuffer | Blob> = new Map(),\n params: {\n path?: string;\n requestHeader?: HeadersInit;\n crossOrigin?: string;\n withCredentials?: boolean;\n } = {}\n ): Promise<this> {\n const manager = new GLTFLoadingManager(file, externalData, params);\n try {\n this.emitEvent({ type: \"geometrystart\" });\n\n const loader = new GLTFLoader(manager);\n loader.setPath(manager.path);\n loader.setRequestHeader(params.requestHeader as any);\n loader.setCrossOrigin(params.crossOrigin || loader.crossOrigin);\n loader.setWithCredentials(params.withCredentials || loader.withCredentials);\n\n const gltf = await loader.loadAsync(manager.fileURL, (event: ProgressEvent) => {\n const { lengthComputable, loaded, total } = event;\n const progress = lengthComputable ? loaded / total : 1;\n this.emitEvent({ type: \"geometryprogress\", data: progress });\n });\n\n if (!this.scene) return this;\n if (!gltf.scene) throw new Error(\"No glTF scene found\");\n\n this.models.push(gltf);\n this.scene.add(gltf.scene);\n\n this.update();\n this.resetActiveDragger();\n\n this.emitEvent({ type: \"databasechunk\" });\n this.emitEvent({ type: \"geometryend\", data: gltf.scene });\n } catch (error) {\n this.emitEvent({ type: \"geometryerror\", data: error });\n throw error;\n } finally {\n manager.dispose();\n }\n\n return this;\n }\n\n clear(): this {\n if (!this.renderer) return this;\n\n function disposeMaterial(material: any) {\n const materials = Array.isArray(material) ? material : [material];\n materials.forEach((material: any) => {\n // Object.keys(material).forEach((key) => material[key]?.dispose?.());\n material.dispose();\n });\n }\n\n function disposeObject(object: any) {\n if (object.geometry) object.geometry.dispose();\n if (object.material) disposeMaterial(object.material);\n }\n\n this.setActiveDragger();\n\n this.selected = [];\n this.renderer.clippingPlanes = [];\n\n this.helpers.traverse(disposeObject);\n this.helpers.clear();\n\n this.models.forEach((gltf) => gltf.scene.traverse(disposeObject));\n this.models.forEach((gltf) => gltf.scene.removeFromParent());\n this.models = [];\n\n this.scene.clear();\n\n this.emitEvent({ type: \"clear\" });\n this.update(true);\n\n return this;\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 if (this._activeDragger) {\n this._activeDragger.dispose();\n this._activeDragger = null;\n }\n if (this.isInitialized()) {\n const Constructor = this.draggerFactory[name];\n if (Constructor) {\n this._activeDragger = new Constructor(this);\n this._activeDragger.name = name;\n }\n }\n const canvas = this.canvas;\n if (canvas) {\n canvas.className = canvas.className\n .split(\" \")\n .filter((x) => !x.startsWith(\"oda-cursor-\"))\n .filter((x) => x)\n .concat(`oda-cursor-${name.toLowerCase()}`)\n .join(\" \");\n }\n this.emitEvent({ type: \"changeactivedragger\", data: name });\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 is3D(): boolean {\n return true;\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 executeCommand(id: string, ...args: any[]): any {\n return commands(\"ThreeJS\").executeCommand(id, this, ...args);\n }\n\n getComponent(type): any {\n return this.components.find((component) => component instanceof type);\n }\n\n drawViewpoint(viewpoint: IViewpoint): void {}\n\n createViewpoint(): IViewpoint {\n const viewpoint: IViewpoint = {};\n\n viewpoint.snapshot = { data: this.canvas?.toDataURL(\"image/jpeg\", 0.25) };\n viewpoint.description = new Date().toDateString();\n\n return viewpoint;\n }\n}\n"],"names":["Commands","constructor","this","_commands","Map","registerCommand","id","handler","description","thisArg","set","registerCommandAlias","alias","viewer","args","executeCommand","getCommand","get","getCommands","map","forEach","value","key","command","isDraggerCommand","draggers","includes","setActiveDragger","console","warn","undefined","result","apply","emit","type","data","commands","viewerType","defaultOptions","showWCS","cameraAnimation","antialiasing","groundShadow","shadows","cameraAxisXSpeed","cameraAxisYSpeed","ambientOcclusion","enableStreamingMode","enablePartialMode","memoryLimit","cuttingPlaneFillColor","red","green","blue","edgesColor","r","g","b","facesColor","edgesVisibility","edgesOverlap","facesOverlap","facesTransparancy","enableCustomHighlight","sceneGraph","edgeModel","reverseZoomWheel","enableZoomWheel","enableGestures","geometryType","Options","emitter","_emitter","_data","loadFromStorage","defaults","notifierChangeEvent","change","saveToStorage","window","localStorage","setItem","JSON","stringify","error","item","getItem","parse","resetToDefaults","fields","resetData","reduce","acc","field","Boolean","CanvasEvents","CANVAS_EVENTS","Dragger","name","initialize","dispose","updatePreview","applyModelTransform","model","clearSlices","renderer","clippingPlanes","update","createPreview","encoderOptions","canvas","toDataURL","calcObjectDepth","object","depth","res","children","x","objectDepth","originalPosition","position","clone","explodeScene","scene","scale","maxDepth","explodeDepth","explodeObject","parentCenter","parentOffset","objectBox","Box3","setFromObject","objectCenter","getCenter","Vector3","objectOffset","offset","sub","multiplyScalar","add","copy","direction","normalize","sceneExtents","sceneCenter","explode","index","models","gltf","defaultViewPositions","top","bottom","left","right","front","back","sw","se","ne","nw","setDefaultViewPosition","camera","center","extents","sphere","getBoundingSphere","Sphere","radius","rotation","lookAt","updateProjectionMatrix","getDefaultViewPositions","Object","keys","getModels","handles","userData","handle","filter","getSelected","selected","_a","SelectionComponent","onPointerDown","event","isPrimary","button","getMousePosition","downPosition","onPointerUp","upPosition","Vector2","distanceTo","intersects","getPointerIntersects","clearSelection","length","select","emitEvent","onDoubleClick","optionsChange","options","facesMaterial","color","setRGB","opacity","raycaster","Raycaster","MeshBasicMaterial","transparent","addEventListener","removeEventListener","rect","getBoundingClientRect","setX","clientX","width","setY","clientY","height","mouse","y","setFromCamera","objects","traverseVisible","child","push","intersectObjects","isSelected","originalMaterial","material","hideSelected","visible","selection","isolateSelected","selectedSet","Set","isolateObject","canBeIsolated","has","regenerateAll","resetView","selectModel","dragger","setSelected","handleSet","showAll","traverse","unselect","zoomToExtents","isEmpty","distance","delta","applyQuaternion","quaternion","target","zoomToObjects","objectExtents","union","zoomToSelected","GLTFLoadingManager","LoadingManager","file","externalData","params","super","path","resourcePath","fileURL","dataURLs","LoaderUtils","extractUrlBase","dataURL","URL","createObjectURL","Blob","setURLModifier","url","decodeURI","replace","revokeObjectURL","EventEmitter2","_listeners","listener","listeners","removeAllListeners","invoke","slice","call","on","off","OrbitDragger","updateControls","orbit","maxDistance","far","minDistance","near","controlsStart","changed","controlsChange","stopContextMenu","preventDefault","stopPropagation","OrbitControls","mouseButtons","LEFT","MOUSE","ROTATE","MIDDLE","PAN","RIGHT","touches","ONE","TOUCH","TWO","DOLLY_PAN","screenSpacePanning","rotateSpeed","PanDragger","ZoomDragger","DOLLY","_changeEvent","WalkControls","EventDispatcher","movementSpeed","lookSpeed","multiplier","moveWheel","mouseDragOn","setPointerCapture","pointerId","onPointerMove","movePosition","rotateDelta","rotateCamera","dispatchEvent","releasePointerCapture","onPointerCancel","PointerEvent","onWheel","deltaY","onKeyDown","code","moveKeys","onKeyUp","delete","moveClock","Clock","size","timeDelta","getDelta","moveDelta","translateZ","translateX","translateY","lookDelta","Math","sign","stop","autoStart","rotateX","PI","clientWidth","rotateY","clientHeight","xRotation","Quaternion","setFromAxisAngle","up","yRotation","premultiply","multiply","setRotationFromQuaternion","WalkDragger","getSize","controls","min","z","walkspeedChange","viewerRender","viewerZoom","_raycaster","_tempVector","_tempVector2","_tempQuaternion","_unit","X","Y","Z","_mouseDownEvent","_mouseUpEvent","mode","_objectChangeEvent","TransformControls","Object3D","domElement","document","isTransformControls","style","touchAction","_gizmo","TransformControlsGizmo","_plane","TransformControlsPlane","scope","defineProperty","propName","defaultValue","propValue","worldPosition","worldPositionStart","worldQuaternion","worldQuaternionStart","cameraPosition","cameraQuaternion","pointStart","pointEnd","rotationAxis","rotationAngle","eye","_offset","_startNorm","_endNorm","_cameraScale","_parentPosition","_parentQuaternion","_parentQuaternionInv","_parentScale","_worldScaleStart","_worldQuaternionInv","_worldScale","_positionStart","_quaternionStart","_scaleStart","_getPointer","getPointer","bind","_onPointerDown","_onPointerHover","onPointerHover","_onPointerMove","_onPointerUp","updateMatrixWorld","parent","matrixWorld","decompose","invert","isOrthographicCamera","getWorldDirection","negate","pointerHover","pointer","dragging","intersect","intersectObjectWithRay","picker","axis","pointerDown","planeIntersect","point","pointerMove","space","indexOf","divide","translationSnap","search","round","setFromMatrixPosition","d","dot","scaleSnap","ROTATION_SPEED","angleTo","cross","rotationSnap","pointerUp","geometry","attach","detach","reset","enabled","getRaycaster","getMode","setMode","setTranslationSnap","setRotationSnap","setScaleSnap","setSize","setSpace","ownerDocument","pointerLockElement","pointerType","includeInvisible","allIntersections","intersectObject","i","_tempEuler","Euler","_alignVector","_zeroVector","_lookAtMatrix","Matrix4","_tempQuaternion2","_identityQuaternion","_dirVector","_tempMatrix","_unitX","_unitY","_unitZ","_v1","_v2","_v3","isTransformControlsGizmo","gizmoMaterial","depthTest","depthWrite","fog","toneMapped","gizmoLineMaterial","LineBasicMaterial","matInvisible","matHelper","matRed","setHex","matGreen","matBlue","matRedTransparent","matGreenTransparent","matBlueTransparent","matWhiteTransparent","matYellowTransparent","matYellow","matGray","arrowGeometry","CylinderGeometry","translate","scaleHandleGeometry","BoxGeometry","lineGeometry","BufferGeometry","setAttribute","Float32BufferAttribute","lineGeometry2","CircleGeometry","arc","TorusGeometry","TranslateHelperGeometry","gizmoTranslate","Mesh","XYZ","OctahedronGeometry","XY","YZ","XZ","pickerTranslate","helperTranslate","START","END","DELTA","Line","gizmoRotate","XYZE","E","helperRotate","AXIS","pickerRotate","SphereGeometry","gizmoScale","pickerScale","helperScale","setupGizmo","gizmoMap","gizmo","tag","updateMatrix","tempGeometry","applyMatrix4","matrix","renderOrder","Infinity","helper","force","concat","factor","zoom","tan","fov","setFromEuler","abs","setFromRotationMatrix","AXIS_HIDE_THRESHOLD","PLANE_HIDE_THRESHOLD","atan2","multiplyQuaternions","showX","showY","showZ","_color","_opacity","split","some","a","PlaneGeometry","wireframe","side","DoubleSide","isTransformControlsPlane","PlaneHelper","plane","positions","computeBoundingSphere","positions2","geometry2","normal","constant","CuttingPlaneDragger","transformChange","planeCenter","transformDrag","viewerExplode","planeHelper","Plane","helpers","transform","removeFromParent","CuttingPlaneXAxisDragger","CuttingPlaneYAxisDragger","CuttingPlaneZAxisDragger","ExtentsComponent","syncExtents","modelExtents","LightComponent","ambientLight","AmbientLight","directionalLight","DirectionalLight","BackgroundComponent","syncOptions","backgroundColor","Color","environment","RoomEnvironment","pmremGenerator","PMREMGenerator","setClearColor","background","fromScene","texture","DefaultPositionComponent","geometryEnd","box","ResizeCanvasComponent","resizeViewer","entries","contentRect","aspect","resizeObserver","ResizeObserver","observe","parentElement","disconnect","RenderLoopComponent","animate","time","requestId","requestAnimationFrame","render","cancelAnimationFrame","WCSHelper","orthoCamera","OrthographicCamera","spriteRed","getSpriteMaterial","spriteGreen","spriteBlue","axesMap","Sprite","text","createElement","context","getContext","clearRect","font","textAlign","fillStyle","getStyle","fillText","CanvasTexture","colorSpace","SRGBColorSpace","SpriteMaterial","viewport","getViewport","Vector4","setViewport","clearDepth","WCSHelperComponent","wcsHelper","Viewer","client","_options","canvasEvents","canvaseventlistener","draggerFactory","Pan","Zoom","Orbit","Walk","CuttingPlaneXAxis","CuttingPlaneYAxis","CuttingPlaneZAxis","_activeDragger","components","renderTime","onProgress","Scene","PerspectiveCamera","WebGLRenderer","antialias","preserveDrawingBuffer","setPixelRatio","devicePixelRatio","toneMapping","LinearToneMapping","performance","now","ProgressEvent","lengthComputable","loaded","total","Promise","resolve","cancel","component","clear","isInitialized","renderNeeded","offsetWidth","offsetHeight","autoClear","deltaTime","loadReferences","open","find","default","Error","database","pop","httpClient","serverUrl","requestHeader","headers","loadGltfFile","openGltfFile","manager","loader","GLTFLoader","setPath","setRequestHeader","setCrossOrigin","crossOrigin","setWithCredentials","withCredentials","loadAsync","progress","resetActiveDragger","disposeMaterial","materials","Array","isArray","disposeObject","activeDragger","Constructor","className","startsWith","toLowerCase","join","is3D","getComponent","drawViewpoint","viewpoint","createViewpoint","snapshot","Date","toDateString"],"mappings":"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","x_google_ignoreList":[31]}