@planara/core 3.0.0 → 3.2.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.
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/renderer.d.ts +15 -18
- package/dist/core/renderer.d.ts.map +1 -1
- package/dist/handlers/benchmark/base-benchmark-handler.d.ts +81 -0
- package/dist/handlers/benchmark/base-benchmark-handler.d.ts.map +1 -0
- package/dist/handlers/benchmark/heavy-benchmark-handler.d.ts +33 -0
- package/dist/handlers/benchmark/heavy-benchmark-handler.d.ts.map +1 -0
- package/dist/handlers/benchmark/index.d.ts +6 -0
- package/dist/handlers/benchmark/index.d.ts.map +1 -0
- package/dist/handlers/benchmark/light-benchmark-handler.d.ts +33 -0
- package/dist/handlers/benchmark/light-benchmark-handler.d.ts.map +1 -0
- package/dist/handlers/benchmark/medium-benchmark-handler.d.ts +33 -0
- package/dist/handlers/benchmark/medium-benchmark-handler.d.ts.map +1 -0
- package/dist/handlers/benchmark/mixed-benchmark-handler.d.ts +37 -0
- package/dist/handlers/benchmark/mixed-benchmark-handler.d.ts.map +1 -0
- package/dist/handlers/display/index.d.ts +2 -0
- package/dist/handlers/display/index.d.ts.map +1 -0
- package/dist/handlers/display/wireframe-handler.d.ts +2 -2
- package/dist/handlers/display/wireframe-handler.d.ts.map +1 -1
- package/dist/handlers/scene/add-figure-scene-handler.d.ts +2 -2
- package/dist/handlers/scene/add-figure-scene-handler.d.ts.map +1 -1
- package/dist/handlers/scene/delete-figure-scene-handler.d.ts +3 -3
- package/dist/handlers/scene/delete-figure-scene-handler.d.ts.map +1 -1
- package/dist/handlers/scene/export-scene-handler.d.ts +23 -0
- package/dist/handlers/scene/export-scene-handler.d.ts.map +1 -0
- package/dist/handlers/scene/index.d.ts +6 -0
- package/dist/handlers/scene/index.d.ts.map +1 -0
- package/dist/handlers/scene/load-figure-scene-handler.d.ts +23 -0
- package/dist/handlers/scene/load-figure-scene-handler.d.ts.map +1 -0
- package/dist/handlers/scene/load-scene-handler.d.ts +23 -0
- package/dist/handlers/scene/load-scene-handler.d.ts.map +1 -0
- package/dist/handlers/select/edge-select-handler.d.ts +5 -8
- package/dist/handlers/select/edge-select-handler.d.ts.map +1 -1
- package/dist/handlers/select/face-select-handler.d.ts +5 -8
- package/dist/handlers/select/face-select-handler.d.ts.map +1 -1
- package/dist/handlers/select/index.d.ts +5 -0
- package/dist/handlers/select/index.d.ts.map +1 -0
- package/dist/handlers/select/mesh-select-handler.d.ts +5 -6
- package/dist/handlers/select/mesh-select-handler.d.ts.map +1 -1
- package/dist/handlers/select/vertex-select-handler.d.ts +5 -8
- package/dist/handlers/select/vertex-select-handler.d.ts.map +1 -1
- package/dist/handlers/tool/base-tool-handler.d.ts +3 -3
- package/dist/handlers/tool/base-tool-handler.d.ts.map +1 -1
- package/dist/handlers/tool/index.d.ts +4 -0
- package/dist/handlers/tool/index.d.ts.map +1 -0
- package/dist/handlers/tool/rotate-tool-handler.d.ts +2 -2
- package/dist/handlers/tool/rotate-tool-handler.d.ts.map +1 -1
- package/dist/handlers/tool/scale-tool-handler.d.ts +2 -2
- package/dist/handlers/tool/scale-tool-handler.d.ts.map +1 -1
- package/dist/handlers/tool/translate-tool-handler.d.ts +2 -2
- package/dist/handlers/tool/translate-tool-handler.d.ts.map +1 -1
- package/dist/hub/benchmark-hub.d.ts +65 -0
- package/dist/hub/benchmark-hub.d.ts.map +1 -0
- package/dist/hub/editor-hub.d.ts +12 -9
- package/dist/hub/editor-hub.d.ts.map +1 -1
- package/dist/hub/index.d.ts +38 -0
- package/dist/hub/index.d.ts.map +1 -0
- package/dist/hub/viewer-hub.d.ts +30 -0
- package/dist/hub/viewer-hub.d.ts.map +1 -0
- package/dist/index.cjs.js +20 -2
- package/dist/index.d.ts +15 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +2838 -1041
- package/dist/index.full.d.ts +275 -97
- package/dist/index.public.d.ts +275 -97
- package/dist/index.umd.js +20 -2
- package/dist/interfaces/api/index.d.ts +12 -0
- package/dist/interfaces/api/index.d.ts.map +1 -0
- package/dist/interfaces/api/interaction-api.d.ts +26 -0
- package/dist/interfaces/api/interaction-api.d.ts.map +1 -0
- package/dist/interfaces/api/metrics-api.d.ts +49 -0
- package/dist/interfaces/api/metrics-api.d.ts.map +1 -0
- package/dist/interfaces/api/renderer/index.d.ts +7 -0
- package/dist/interfaces/api/renderer/index.d.ts.map +1 -0
- package/dist/interfaces/api/renderer/renderer-info-access.d.ts +20 -0
- package/dist/interfaces/api/renderer/renderer-info-access.d.ts.map +1 -0
- package/dist/interfaces/api/renderer-info-api.d.ts +19 -0
- package/dist/interfaces/api/renderer-info-api.d.ts.map +1 -0
- package/dist/interfaces/api/scene-api.d.ts +2 -1
- package/dist/interfaces/api/scene-api.d.ts.map +1 -1
- package/dist/interfaces/api/transform-api.d.ts +1 -1
- package/dist/interfaces/api/transform-api.d.ts.map +1 -1
- package/dist/interfaces/command/index.d.ts +1 -1
- package/dist/interfaces/command/index.d.ts.map +1 -1
- package/dist/interfaces/handler/benchmark-handler.d.ts +22 -0
- package/dist/interfaces/handler/benchmark-handler.d.ts.map +1 -0
- package/dist/interfaces/handler/index.d.ts +7 -0
- package/dist/interfaces/handler/index.d.ts.map +1 -0
- package/dist/interfaces/manager/benchmark-manager.d.ts +10 -0
- package/dist/interfaces/manager/benchmark-manager.d.ts.map +1 -0
- package/dist/interfaces/manager/display-manager.d.ts.map +1 -1
- package/dist/interfaces/manager/index.d.ts +7 -0
- package/dist/interfaces/manager/index.d.ts.map +1 -0
- package/dist/interfaces/manager/manager.d.ts +1 -1
- package/dist/interfaces/manager/manager.d.ts.map +1 -1
- package/dist/interfaces/manager/select-manager.d.ts.map +1 -1
- package/dist/interfaces/manager/tool-manager.d.ts.map +1 -1
- package/dist/interfaces/mediator/index.d.ts +1 -1
- package/dist/interfaces/mediator/index.d.ts.map +1 -1
- package/dist/interfaces/middleware/index.d.ts +1 -1
- package/dist/interfaces/middleware/index.d.ts.map +1 -1
- package/dist/interfaces/module/index.d.ts +6 -0
- package/dist/interfaces/module/index.d.ts.map +1 -0
- package/dist/interfaces/module/interactive-module.d.ts +32 -0
- package/dist/interfaces/module/interactive-module.d.ts.map +1 -0
- package/dist/interfaces/module/observer-module.d.ts +27 -0
- package/dist/interfaces/module/observer-module.d.ts.map +1 -0
- package/dist/interfaces/module/renderable-module.d.ts +1 -1
- package/dist/interfaces/module/renderable-module.d.ts.map +1 -1
- package/dist/interfaces/store/export-store.d.ts +8 -0
- package/dist/interfaces/store/export-store.d.ts.map +1 -0
- package/dist/interfaces/store/index.d.ts +7 -0
- package/dist/interfaces/store/index.d.ts.map +1 -0
- package/dist/interfaces/store/metrics-store.d.ts +60 -0
- package/dist/interfaces/store/metrics-store.d.ts.map +1 -0
- package/dist/interfaces/store/select-store.d.ts +1 -1
- package/dist/interfaces/store/select-store.d.ts.map +1 -1
- package/dist/interfaces/store/tool-store.d.ts +1 -1
- package/dist/interfaces/store/tool-store.d.ts.map +1 -1
- package/dist/interfaces/validator/index.d.ts +21 -0
- package/dist/interfaces/validator/index.d.ts.map +1 -0
- package/dist/interfaces/{controller/controller.d.ts → worker/index.d.ts} +5 -5
- package/dist/interfaces/worker/index.d.ts.map +1 -0
- package/dist/managers/benchmark/benchmark-manager.d.ts +27 -0
- package/dist/managers/benchmark/benchmark-manager.d.ts.map +1 -0
- package/dist/managers/benchmark/index.d.ts +2 -0
- package/dist/managers/benchmark/index.d.ts.map +1 -0
- package/dist/managers/display/display-manager.d.ts +4 -4
- package/dist/managers/display/display-manager.d.ts.map +1 -1
- package/dist/managers/display/index.d.ts +2 -0
- package/dist/managers/display/index.d.ts.map +1 -0
- package/dist/managers/index.d.ts +6 -0
- package/dist/managers/index.d.ts.map +1 -0
- package/dist/managers/scene/index.d.ts +2 -0
- package/dist/managers/scene/index.d.ts.map +1 -0
- package/dist/managers/scene/scene-manager.d.ts +5 -5
- package/dist/managers/scene/scene-manager.d.ts.map +1 -1
- package/dist/managers/select/index.d.ts +2 -0
- package/dist/managers/select/index.d.ts.map +1 -0
- package/dist/managers/select/select-manager.d.ts +5 -5
- package/dist/managers/select/select-manager.d.ts.map +1 -1
- package/dist/managers/tool/index.d.ts +2 -0
- package/dist/managers/tool/index.d.ts.map +1 -0
- package/dist/managers/tool/tool-manager.d.ts +4 -4
- package/dist/managers/tool/tool-manager.d.ts.map +1 -1
- package/dist/mediator/index.d.ts +2 -2
- package/dist/mediator/index.d.ts.map +1 -1
- package/dist/middlewares/exception-middleware.d.ts +7 -2
- package/dist/middlewares/exception-middleware.d.ts.map +1 -1
- package/dist/middlewares/index.d.ts +2 -0
- package/dist/middlewares/index.d.ts.map +1 -0
- package/dist/modules/controls-module.d.ts +40 -13
- package/dist/modules/controls-module.d.ts.map +1 -1
- package/dist/modules/gizmo-module.d.ts +18 -6
- package/dist/modules/gizmo-module.d.ts.map +1 -1
- package/dist/modules/index.d.ts +7 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/metrics-module.d.ts +156 -0
- package/dist/modules/metrics-module.d.ts.map +1 -0
- package/dist/modules/raycast-module.d.ts +23 -10
- package/dist/modules/raycast-module.d.ts.map +1 -1
- package/dist/modules/scene-module.d.ts +2 -3
- package/dist/modules/scene-module.d.ts.map +1 -1
- package/dist/modules/scene-preview-module.d.ts +26 -0
- package/dist/modules/scene-preview-module.d.ts.map +1 -0
- package/dist/{api → shared/api}/modules/controls-state-api.d.ts +1 -1
- package/dist/shared/api/modules/controls-state-api.d.ts.map +1 -0
- package/dist/shared/api/modules/index.d.ts +6 -0
- package/dist/shared/api/modules/index.d.ts.map +1 -0
- package/dist/shared/api/modules/interaction-api.d.ts +21 -0
- package/dist/shared/api/modules/interaction-api.d.ts.map +1 -0
- package/dist/{api → shared/api}/modules/mesh-api.d.ts +1 -1
- package/dist/shared/api/modules/mesh-api.d.ts.map +1 -0
- package/dist/{api → shared/api}/modules/raycast-api.d.ts +1 -1
- package/dist/shared/api/modules/raycast-api.d.ts.map +1 -0
- package/dist/{api → shared/api}/modules/transform-api.d.ts +2 -2
- package/dist/shared/api/modules/transform-api.d.ts.map +1 -0
- package/dist/{api → shared/api}/renderer/camera-api.d.ts +2 -2
- package/dist/shared/api/renderer/camera-api.d.ts.map +1 -0
- package/dist/{api → shared/api}/renderer/dom-api.d.ts +2 -2
- package/dist/shared/api/renderer/dom-api.d.ts.map +1 -0
- package/dist/shared/api/renderer/index.d.ts +5 -0
- package/dist/shared/api/renderer/index.d.ts.map +1 -0
- package/dist/shared/api/renderer/renderer-info-api.d.ts +25 -0
- package/dist/shared/api/renderer/renderer-info-api.d.ts.map +1 -0
- package/dist/{api → shared/api}/renderer/scene-api.d.ts +21 -3
- package/dist/shared/api/renderer/scene-api.d.ts.map +1 -0
- package/dist/shared/constants/benchmark.d.ts +5 -0
- package/dist/shared/constants/benchmark.d.ts.map +1 -0
- package/dist/shared/constants/colors.d.ts.map +1 -0
- package/dist/shared/constants/figure-geometries.d.ts.map +1 -0
- package/dist/shared/constants/index.d.ts +7 -0
- package/dist/shared/constants/index.d.ts.map +1 -0
- package/dist/shared/constants/layers.d.ts.map +1 -0
- package/dist/shared/constants/messages.d.ts.map +1 -0
- package/dist/shared/constants/threshold.d.ts.map +1 -0
- package/dist/shared/decorators/index.d.ts +3 -0
- package/dist/shared/decorators/index.d.ts.map +1 -0
- package/dist/{decorators → shared/decorators}/use-policy.d.ts +1 -1
- package/dist/shared/decorators/use-policy.d.ts.map +1 -0
- package/dist/shared/decorators/use-validator.d.ts +5 -0
- package/dist/shared/decorators/use-validator.d.ts.map +1 -0
- package/dist/shared/errors/index.d.ts +3 -0
- package/dist/shared/errors/index.d.ts.map +1 -0
- package/dist/{errors → shared/errors}/policy-error.d.ts +1 -1
- package/dist/shared/errors/policy-error.d.ts.map +1 -0
- package/dist/shared/errors/validation-error.d.ts +9 -0
- package/dist/shared/errors/validation-error.d.ts.map +1 -0
- package/dist/{events → shared/events}/editor-events.d.ts +1 -1
- package/dist/shared/events/editor-events.d.ts.map +1 -0
- package/dist/{events → shared/events}/event-bus.d.ts +1 -1
- package/dist/shared/events/event-bus.d.ts.map +1 -0
- package/dist/shared/events/event-topics.d.ts.map +1 -0
- package/dist/shared/events/index.d.ts +4 -0
- package/dist/shared/events/index.d.ts.map +1 -0
- package/dist/shared/ioc/container.d.ts +10 -0
- package/dist/shared/ioc/container.d.ts.map +1 -0
- package/dist/shared/loaders/obj-loader.d.ts.map +1 -0
- package/dist/shared/policy/index.d.ts +2 -0
- package/dist/shared/policy/index.d.ts.map +1 -0
- package/dist/{policy → shared/policy}/tool-policy.d.ts +2 -2
- package/dist/shared/policy/tool-policy.d.ts.map +1 -0
- package/dist/shared/utils/default-renderer-config.d.ts +9 -0
- package/dist/shared/utils/default-renderer-config.d.ts.map +1 -0
- package/dist/shared/utils/helpers.d.ts +26 -0
- package/dist/shared/utils/helpers.d.ts.map +1 -0
- package/dist/shared/utils/index.d.ts +3 -0
- package/dist/shared/utils/index.d.ts.map +1 -0
- package/dist/shared/validators/index.d.ts +2 -0
- package/dist/shared/validators/index.d.ts.map +1 -0
- package/dist/shared/validators/obj-validator.d.ts +12 -0
- package/dist/shared/validators/obj-validator.d.ts.map +1 -0
- package/dist/store/editor-store.d.ts +33 -0
- package/dist/store/editor-store.d.ts.map +1 -0
- package/dist/store/export-store.d.ts +12 -0
- package/dist/store/export-store.d.ts.map +1 -0
- package/dist/store/index.d.ts +3 -35
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/metrics-store.d.ts +32 -0
- package/dist/store/metrics-store.d.ts.map +1 -0
- package/dist/types/camera/index.d.ts +2 -0
- package/dist/types/camera/index.d.ts.map +1 -0
- package/dist/types/event/index.d.ts +2 -0
- package/dist/types/event/index.d.ts.map +1 -0
- package/dist/types/feature/feature-type.d.ts +3 -1
- package/dist/types/feature/feature-type.d.ts.map +1 -1
- package/dist/types/feature/index.d.ts +2 -0
- package/dist/types/feature/index.d.ts.map +1 -0
- package/dist/types/listener/index.d.ts +4 -0
- package/dist/types/listener/index.d.ts.map +1 -0
- package/dist/types/listener/metrics-listener.d.ts +4 -0
- package/dist/types/listener/metrics-listener.d.ts.map +1 -0
- package/dist/types/renderer/index.d.ts +2 -0
- package/dist/types/renderer/index.d.ts.map +1 -0
- package/dist/types/renderer/renderer-info-metrics.d.ts +8 -0
- package/dist/types/renderer/renderer-info-metrics.d.ts.map +1 -0
- package/dist/types/select/index.d.ts +2 -0
- package/dist/types/select/index.d.ts.map +1 -0
- package/dist/workers/index.d.ts +2 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/{controllers/renderer-controller.d.ts → workers/renderer-worker.d.ts} +15 -14
- package/dist/workers/renderer-worker.d.ts.map +1 -0
- package/package.json +3 -3
- package/dist/api/modules/controls-state-api.d.ts.map +0 -1
- package/dist/api/modules/mesh-api.d.ts.map +0 -1
- package/dist/api/modules/raycast-api.d.ts.map +0 -1
- package/dist/api/modules/transform-api.d.ts.map +0 -1
- package/dist/api/renderer/camera-api.d.ts.map +0 -1
- package/dist/api/renderer/dom-api.d.ts.map +0 -1
- package/dist/api/renderer/scene-api.d.ts.map +0 -1
- package/dist/constants/colors.d.ts.map +0 -1
- package/dist/constants/figure-geometries.d.ts.map +0 -1
- package/dist/constants/layers.d.ts.map +0 -1
- package/dist/constants/messages.d.ts.map +0 -1
- package/dist/constants/threshold.d.ts.map +0 -1
- package/dist/controllers/renderer-controller.d.ts.map +0 -1
- package/dist/decorators/use-policy.d.ts.map +0 -1
- package/dist/errors/policy-error.d.ts.map +0 -1
- package/dist/events/editor-events.d.ts.map +0 -1
- package/dist/events/event-bus.d.ts.map +0 -1
- package/dist/events/event-topics.d.ts.map +0 -1
- package/dist/hub/app-hub.d.ts +0 -13
- package/dist/hub/app-hub.d.ts.map +0 -1
- package/dist/interfaces/controller/controller.d.ts.map +0 -1
- package/dist/interfaces/response/index.d.ts +0 -22
- package/dist/interfaces/response/index.d.ts.map +0 -1
- package/dist/ioc/container.d.ts +0 -5
- package/dist/ioc/container.d.ts.map +0 -1
- package/dist/loaders/obj-loader.d.ts.map +0 -1
- package/dist/policy/tool-policy.d.ts.map +0 -1
- package/dist/types/response/response-type.d.ts +0 -19
- package/dist/types/response/response-type.d.ts.map +0 -1
- package/dist/utils/helpers.d.ts +0 -13
- package/dist/utils/helpers.d.ts.map +0 -1
- /package/dist/{constants → shared/constants}/colors.d.ts +0 -0
- /package/dist/{constants → shared/constants}/figure-geometries.d.ts +0 -0
- /package/dist/{constants → shared/constants}/layers.d.ts +0 -0
- /package/dist/{constants → shared/constants}/messages.d.ts +0 -0
- /package/dist/{constants → shared/constants}/threshold.d.ts +0 -0
- /package/dist/{events → shared/events}/event-topics.d.ts +0 -0
- /package/dist/{loaders → shared/loaders}/obj-loader.d.ts +0 -0
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,20 @@
|
|
|
1
|
-
(function(
|
|
2
|
-
`);for(const i of r){if(!i.trim()||i.startsWith("#"))continue;const n=i.trim().split(/\s+/);switch(n[0]){case"v":this._tmpPositions.push(n.slice(1).map(Number));break;case"vn":this._tmpNormals.push(n.slice(1).map(Number));break;case"vt":this._tmpUVs.push(n.slice(1).map(Number));break;case"f":this.processFaceLine(n);break}}const s={type:d.FigureType.Custom,position:this._positions,...this._normals.length>0&&{normal:this._normals},...this._uvs.length>0&&{uv:this._uvs}};return new d.Figure(s)}processFaceLine(t){for(let r=1;r<t.length;r++){const s=t[r];if(!s)continue;const[i,n,o]=s.split("/"),l=i?parseInt(i,10):void 0,_=n?parseInt(n,10):void 0,u=o?parseInt(o,10):void 0;if(l!==void 0){const p=this._tmpPositions[l-1];p&&this._positions.push(...p)}if(_!==void 0){const p=this._tmpUVs[_-1];p&&this._uvs.push(...p)}if(u!==void 0){const p=this._tmpNormals[u-1];p&&this._normals.push(...p)}}}}var Je=Object.getOwnPropertyDescriptor,et=(e,t,r,s)=>{for(var i=s>1?void 0:s?Je(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},W=(e,t)=>(r,s)=>t(r,s,e);let q=class{constructor(e,t,r,s){this._updatable=e,this._renderable=t,this._runtime=r,this._renderer=s}_animationId=null;start(){const e=[...this._runtime,...this._updatable,...this._renderable];new Set(e).forEach(t=>t.init()),this._loop()}_loop(){this._updatable.forEach(e=>e.update()),this._renderer.render(),this._renderable.forEach(e=>e.render()),this._animationId=requestAnimationFrame(()=>this._loop())}stop(){this._animationId&&(cancelAnimationFrame(this._animationId),this._animationId=null)}dispose(){this._animationId=null}};q=et([a.injectable(),W(0,a.injectAll("IUpdatableModule")),W(1,a.injectAll("IRenderableModule")),W(2,a.injectAll("IRuntimeModule")),W(3,a.inject("IRenderable"))],q);var tt=Object.getOwnPropertyDescriptor,st=(e,t,r,s)=>{for(var i=s>1?void 0:s?tt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},rt=(e,t)=>(r,s)=>t(r,s,e);let Y=class{constructor(e){this._sceneModule=e}addMesh(e){this._sceneModule.addMesh(e)}addMeshes(e){this._sceneModule.addMeshes(e)}removeMesh(e){this._sceneModule.removeMesh(e)}removeMeshes(e){this._sceneModule.removeMeshes(e)}getMeshes(){return this._sceneModule.getMeshes()}};Y=st([a.injectable(),rt(0,a.inject("SceneModule"))],Y);var it=Object.getOwnPropertyDescriptor,nt=(e,t,r,s)=>{for(var i=s>1?void 0:s?it(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},ot=(e,t)=>(r,s)=>t(r,s,e);let Z=class{constructor(e){this._raycastModule=e}setRaycastMode(e){this._raycastModule.setRaycastMode(e)}};Z=nt([a.injectable(),ot(0,a.inject("RaycastModule"))],Z);var at=Object.getOwnPropertyDescriptor,ct=(e,t,r,s)=>{for(var i=s>1?void 0:s?at(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},lt=(e,t)=>(r,s)=>t(r,s,e);let K=class{constructor(e){this._controlsModule=e}attachTransform(e){this._controlsModule.attachTransform(e)}detachTransform(){this._controlsModule.detachTransform()}setTransformMode(e){this._controlsModule.setTransformMode(e)}onTransformChange(e){return this._controlsModule.onTransformChange(e)}};K=ct([a.injectable(),lt(0,a.inject("ControlsModule"))],K);var ht=Object.getOwnPropertyDescriptor,dt=(e,t,r,s)=>{for(var i=s>1?void 0:s?ht(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},_t=(e,t)=>(r,s)=>t(r,s,e);let Q=class{constructor(e){this._cameraAccessApi=e}getCamera(){return this._cameraAccessApi.getCamera()}enableCameraLayer(e){this._cameraAccessApi.getCamera().layers.enable(e)}disableCameraLayer(e){this._cameraAccessApi.getCamera().layers.disable(e)}};Q=dt([a.injectable(),_t(0,a.inject("IRendererCameraAccess"))],Q);var ut=Object.getOwnPropertyDescriptor,pt=(e,t,r,s)=>{for(var i=s>1?void 0:s?ut(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},mt=(e,t)=>(r,s)=>t(r,s,e);let J=class{constructor(e){this._domAccessApi=e}getCanvas(){return this._domAccessApi.getCanvas()}getDomElement(){return this._domAccessApi.getDomElement()}};J=pt([a.injectable(),mt(0,a.inject("IRendererDomAccess"))],J);var vt=Object.getOwnPropertyDescriptor,ft=(e,t,r,s)=>{for(var i=s>1?void 0:s?vt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},gt=(e,t)=>(r,s)=>t(r,s,e);let ee=class{constructor(e){this._sceneAccessApi=e}getScene(){return this._sceneAccessApi.getScene()}addToScene(e){this._sceneAccessApi.getScene().add(e)}removeFromScene(e){this._sceneAccessApi.getScene().remove(e)}addObject(e,t){const r=this._sceneAccessApi.getScene();r&&(typeof t=="number"&&e.layers.set(t),r.add(e))}};ee=ft([a.injectable(),gt(0,a.inject("IRendererSceneAccess"))],ee);var Mt=Object.getOwnPropertyDescriptor,bt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Mt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},St=(e,t)=>(r,s)=>t(r,s,e);let te=class{constructor(e){this._controlsModule=e}isOrbitInteracting(){return this._controlsModule.isOrbitInteracting()}isTransformDragging(){return this._controlsModule.isTransformDragging()}};te=bt([a.injectable(),St(0,a.inject("ControlsModule"))],te);var At=Object.getOwnPropertyDescriptor,wt=(e,t,r,s)=>{for(var i=s>1?void 0:s?At(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},se=(e,t)=>(r,s)=>t(r,s,e);let re=class{constructor(e,t,r){this._cameraApi=e,this._domApi=t,this._sceneApi=r}_orbit=null;_transform=null;_transformHelper=null;_transformListeners=new Set;_isEventListenersAdded=!1;init(){this._orbit=new F.OrbitWithState(this._cameraApi.getCamera(),this._domApi.getDomElement()),this._orbit.enableDamping=!0,this._orbit.dampingFactor=.05,this._transform=new F.ModelingTransformControls(this._cameraApi.getCamera(),this._domApi.getDomElement()),this._transformHelper=this._transform.getHelper(),this._sceneApi.addToScene(this._transformHelper),this._initMouseListeners()}attachTransform(e){this._transform?.attach(e)}detachTransform(){this._transform?.detach()}update(){this._orbit?.update()}setTransformMode(e){this._transform?.setMode(e)}onTransformChange(e){return this._transformListeners.add(e),()=>this._transformListeners.delete(e)}isOrbitInteracting(){return!!this._orbit?.isInteracting}isTransformDragging(){return!!this._transform?.dragging}dispose(){if(this._isEventListenersAdded){const e=this._domApi.getCanvas();if(!this._transform||!this._orbit)return;e.removeEventListener("pointerdown",t=>this._transform?.pointerDown(t)),e.removeEventListener("pointermove",t=>this._transform?.pointerMove(t)),e.removeEventListener("pointerup",t=>this._transform?.pointerUp(t)),e.removeEventListener("pointerleave",()=>this._transform?.pointerHover(null)),this._transform.removeEventListener("dragging-changed",()=>{this._orbit.enabled=!this._transform?.dragging}),this._transformListeners.clear(),this._isEventListenersAdded=!1}this._orbit?.dispose(),this._orbit=null,this._transform?.dispose(),this._transform=null,this._transformHelper?.parent&&this._transformHelper.parent.remove(this._transformHelper)}_initMouseListeners(){const e=this._domApi.getCanvas();!this._transform||!this._orbit||(e.addEventListener("pointerdown",t=>this._transform?.pointerDown(t)),e.addEventListener("pointermove",t=>this._transform?.pointerMove(t)),e.addEventListener("pointerup",t=>this._transform?.pointerUp(t)),e.addEventListener("pointerleave",()=>this._transform?.pointerHover(null)),this._transform.addEventListener("dragging-changed",()=>{this._orbit.enabled=!this._transform?.dragging}),this._transform.addEventListener("objectChange",()=>{for(const t of this._transformListeners)t()}),this._isEventListenersAdded=!0)}};re=wt([a.injectable(),se(0,a.inject("ICameraApi")),se(1,a.inject("IDomApi")),se(2,a.inject("ISceneApi"))],re);var yt=Object.getOwnPropertyDescriptor,Ot=(e,t,r,s)=>{for(var i=s>1?void 0:s?yt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},ie=(e,t)=>(r,s)=>t(r,s,e);let ne=class{constructor(e,t,r){this._cameraApi=e,this._domApi=t,this._rendererApi=r}_cameraGizmo=null;init(){const e=this._cameraApi.getCamera(),t=this._rendererApi.getRenderer();this._cameraGizmo=new F.CameraAxesGizmo(t,e,{size:96,margin:36})}render(){const e=this._domApi.getCanvas();this._cameraGizmo?.render(e.width,e.height)}dispose(){this._cameraGizmo?.dispose(),this._cameraGizmo=null}};ne=Ot([a.injectable(),ie(0,a.inject("ICameraApi")),ie(1,a.inject("IDomApi")),ie(2,a.inject("IRendererAccess"))],ne);var T=(e=>(e.SelectHover="select.hover",e.SelectClick="select.click",e))(T||{});const xt=.03,jt=.05,$=0,Ce=1,Te=2,O=31;var Ct=Object.getOwnPropertyDescriptor,Tt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ct(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},H=(e,t)=>(r,s)=>t(r,s,e);let oe=class{constructor(e,t,r,s,i){this._domApi=e,this._cameraApi=t,this._meshApi=r,this._controlsState=s,this._bus=i}_raycaster;_mouse;_lastHoverKey=null;_currentRaycastMode=d.SelectMode.Mesh;_isEventListenersAdded=!1;init(){this._raycaster=new c.Raycaster,this._mouse=new c.Vector2,this._applyRaycastParamsByMode(),this._isEventListenersAdded||(this._initMouseListeners(),this._isEventListenersAdded=!0)}setRaycastMode(e){if(this._currentRaycastMode===e)return;const t=this._raycaster;t.params.Line.threshold=0,t.params.Points.threshold=0,this._currentRaycastMode=e,this._lastHoverKey=null,this._applyRaycastParamsByMode()}_applyRaycastParamsByMode(){const e=this._raycaster;switch(e.params.Line.threshold=0,e.params.Points.threshold=0,this._currentRaycastMode){case d.SelectMode.Mesh:case d.SelectMode.Face:e.layers.set($);break;case d.SelectMode.Edge:e.layers.set(Ce),e.params.Line.threshold=xt;break;case d.SelectMode.Vertex:e.layers.set(Te),e.params.Points.threshold=jt;break}}_getHitIntersection(e){const t=this._controlsState.isOrbitInteracting()||this._controlsState.isTransformDragging(),r=this._domApi.getCanvas(),s=this._cameraApi.getCamera(),i=this._meshApi.getMeshes();if(t)return;const n=r.getBoundingClientRect();this._mouse.x=(e.clientX-n.left)/n.width*2-1,this._mouse.y=-((e.clientY-n.top)/n.height)*2+1,this._raycaster.setFromCamera(this._mouse,s);const o=this._raycaster.intersectObjects(i,!0)[0]??null;if(this._currentRaycastMode===d.SelectMode.Mesh||this._currentRaycastMode===d.SelectMode.Face)return o;const l=this._raycaster.layers.mask;this._raycaster.layers.set($);const _=this._raycaster.intersectObjects(i,!0)[0]??null;return this._raycaster.layers.mask=l,this._getVisibleHit(o,_)}_processRaycastEvent(e,t,r){const s=this._getHitIntersection(e),i=this._meshApi.getMeshes();if(s===void 0)return;const n=s?.object??null;if(r){if(!s){i.forEach(l=>l.userData.isHit=!1),this._lastHoverKey=null,this._bus.emit(t,null);return}const o=this._makeHoverKey(s);o!==this._lastHoverKey&&(i.forEach(l=>l.userData.isHit=!1),n&&(n.userData.isHit=!0),this._lastHoverKey=o,this._bus.emit(t,{intersection:s}));return}s&&this._bus.emit(t,{intersection:s})}_getVisibleHit(e,t,r=1e-4){return e?t?e.distance<=t.distance+r?e:null:e:null}_makeHoverKey(e){if(!e)return null;const t=e.object.uuid;switch(this._currentRaycastMode){case d.SelectMode.Face:return`${t}:face:${e.faceIndex??-1}`;case d.SelectMode.Edge:return`${t}:edge:${Math.floor((e.index??-1)/2)}`;case d.SelectMode.Vertex:return`${t}:vertex:${e.index??-1}`;case d.SelectMode.Mesh:default:return`${t}:mesh`}}_handleMouseMove=e=>{this._processRaycastEvent(e,T.SelectHover,!0)};_handleMouseClick=e=>{this._processRaycastEvent(e,T.SelectClick,!1)};_handleDoubleClick=e=>{const t=this._getHitIntersection(e);t!==void 0&&(t||this._bus.emit(T.SelectClick,null))};_handleMouseLeave=()=>{this._lastHoverKey=null,this._bus.emit(T.SelectHover,null)};_initMouseListeners(){const e=this._domApi.getCanvas();e.addEventListener("mousemove",this._handleMouseMove,!1),e.addEventListener("click",this._handleMouseClick,!1),e.addEventListener("dblclick",this._handleDoubleClick,!1),e.addEventListener("mouseleave",this._handleMouseLeave),this._isEventListenersAdded=!0}_removeMouseListeners(){const e=this._domApi.getCanvas();e.removeEventListener("mousemove",this._handleMouseMove),e.removeEventListener("click",this._handleMouseClick),e.removeEventListener("dblclick",this._handleDoubleClick),e.removeEventListener("mouseleave",this._handleMouseLeave)}dispose(){this._removeMouseListeners(),this._isEventListenersAdded=!1,this._lastHoverKey=null}};oe=Tt([a.injectable(),H(0,a.inject("IDomApi")),H(1,a.inject("ICameraApi")),H(2,a.inject("IMeshApi")),H(3,a.inject("IControlsStateApi")),H(4,a.inject("EventBus"))],oe);var It=Object.getOwnPropertyDescriptor,Et=(e,t,r,s)=>{for(var i=s>1?void 0:s?It(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Pt=(e,t)=>(r,s)=>t(r,s,e);let ae=class{constructor(e){this._api=e}_meshes=[];_grid=null;_axes=null;_light=null;init(){this._grid=new c.GridHelper(10,10),this._grid.position.y=-.001,this._api.addToScene(this._grid),this._axes=new F.SymmetricAxesHelper(6),this._api.addToScene(this._axes),this._light=new c.HemisphereLight(16777215,4473924,.6),this._api.addToScene(this._light)}getMeshes(){return this._meshes}addMesh(e){this._meshes.includes(e)||(this._meshes.push(e),this._api.addToScene(e))}removeMesh(e){const t=this._meshes.indexOf(e);t>=0&&this._meshes.splice(t,1),this._api.removeFromScene(e)}addMeshes(e){for(const t of e)this.addMesh(t)}removeMeshes(e){for(const t of e)this.removeMesh(t)}dispose(){for(const e of this._meshes)this._api.removeFromScene(e);this._meshes.length=0,this._grid&&(this._api.removeFromScene(this._grid),this._grid.geometry.dispose(),this._grid.material.dispose(),this._grid=null),this._axes&&(this._api.removeFromScene(this._axes),this._axes=null),this._light&&(this._api.removeFromScene(this._light),this._light=null)}};ae=Et([a.injectable(),Pt(0,a.inject("ISceneApi"))],ae);var x=(e=>(e[e.Display=0]="Display",e[e.Scene=1]="Scene",e[e.Select=2]="Select",e[e.Tool=3]="Tool",e))(x||{}),Lt=Object.getOwnPropertyDescriptor,Dt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Lt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ie=(e,t)=>(r,s)=>t(r,s,e);let ce=class{constructor(e,t){this._store=t,this._handlers=new Map(e.map(r=>[r.mode,r]))}_currentMode=d.DisplayMode.Plane;_handlers;type=x.Display;manage(e){e!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),e!==d.DisplayMode.Plane&&this._handlers.get(e)?.handle(),this._currentMode=e,this._store.setDisplayMode(this._currentMode))}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=d.DisplayMode.Plane,this._store.setDisplayMode(this._currentMode)}};ce=Dt([a.injectable(),Ie(0,a.injectAll("IDisplayHandler")),Ie(1,a.inject("EditorStore"))],ce);var j=(e=>(e.Hover="hover",e.Click="click",e))(j||{}),Vt=Object.getOwnPropertyDescriptor,$t=(e,t,r,s)=>{for(var i=s>1?void 0:s?Vt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},le=(e,t)=>(r,s)=>t(r,s,e);let he=class{constructor(e,t,r){this._eventBus=e,this._store=r,this._handlers=new Map(t.map(s=>[s.mode,s])),this._eventBus.on(T.SelectHover,this._onHover),this._eventBus.on(T.SelectClick,this._onClick)}_currentMode=d.SelectMode.Mesh;_handlers;type=x.Select;manage(e){e!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),this._currentMode=e,this._store.setSelectMode(this._currentMode))}_onHover=e=>{this._handlers.get(this._currentMode)?.handle(e,j.Hover)};_onClick=e=>{this._handlers.get(this._currentMode)?.handle(e,j.Click)};dispose(){this._handlers&&this._handlers.clear(),this._eventBus.off(T.SelectHover,this._onHover),this._currentMode=d.SelectMode.Mesh,this._store.setSelectMode(this._currentMode)}};he=$t([a.injectable(),le(0,a.inject("EventBus")),le(1,a.injectAll("ISelectHandler")),le(2,a.inject("EditorStore"))],he);const Ht=e=>(t,r,s)=>{const i=s.value;if(!i)throw new Error("usePolicy can only be applied to method");return s.value=function(...n){return e(this).check(...n),i.apply(this,n)},s};var Rt=Object.defineProperty,Ft=Object.getOwnPropertyDescriptor,Ee=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ft(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=(s?o(t,r,i):o(i))||i);return s&&i&&Rt(t,r,i),i},de=(e,t)=>(r,s)=>t(r,s,e);let k=class{constructor(e,t,r){this._store=t,this._policy=r,this._handlers=new Map(e.map(s=>[s.mode,s])),this._unsubSelected=this._store.onSelectedObjectChange(()=>{this._handlers.get(this._currentTool)?.handle()})}_currentTool=d.ToolType.Translate;_handlers;_unsubSelected;type=x.Tool;manage(e){this._currentTool!==e&&(this._handlers.get(this._currentTool)?.rollback(),this._currentTool=e,this._store.setToolType(this._currentTool),this._handlers.get(this._currentTool)?.handle())}dispose(){this._unsubSelected?.(),this._handlers&&this._handlers.clear(),this._currentTool=d.ToolType.Translate,this._store.setToolType(this._currentTool)}};Ee([Ht(e=>e._policy)],k.prototype,"manage",1),k=Ee([a.injectable(),de(0,a.injectAll("IToolHandler")),de(1,a.inject("EditorStore")),de(2,a.inject("ToolPolicy"))],k);var Wt=Object.getOwnPropertyDescriptor,kt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Wt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Gt=(e,t)=>(r,s)=>t(r,s,e);let _e=class{_currentMode=d.SceneMode.AddFigure;_handlers;type=x.Scene;constructor(e){this._handlers=new Map(e.map(t=>[t.mode,t]))}manage(e,t){e===d.SceneMode.AddFigure?this._handlers.get(e)?.handle(t):this._handlers.get(e)?.handle(),this._currentMode=e}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=d.SceneMode.AddFigure}};_e=kt([a.injectable(),Gt(0,a.injectAll("ISceneHandler"))],_e);var Bt=Object.getOwnPropertyDescriptor,zt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Bt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Nt=(e,t)=>(r,s)=>t(r,s,e);let ue=class{constructor(e){this._api=e}mode=d.DisplayMode.Wireframe;_prevWireframe=new Map;_prevColorMesh=new Map;_prevColorLines=new Map;_wireColor=new c.Color(65535);handle(){const e=this._api.getMeshes();for(const t of e){const r=Array.isArray(t.material)?t.material:[t.material];for(const s of r)this._enableWireframeOnMaterial(s);t.traverse(s=>{if(s.isLineSegments){const i=s;if(!this._prevColorLines.has(i.material)){const o=i.material;this._prevColorLines.set(o,o.color.clone())}const n=i.material;n.color.copy(this._wireColor),n.needsUpdate=!0}})}}rollback(){for(const[e,t]of this._prevWireframe)"wireframe"in e&&(e.wireframe=t),e.needsUpdate=!0;this._prevWireframe.clear();for(const[e,t]of this._prevColorMesh){const r=e;r.color?.isColor&&r.color.copy(t)}this._prevColorMesh.clear();for(const[e,t]of this._prevColorLines)e.color.copy(t);this._prevColorLines.clear()}dispose(){this.rollback()}_enableWireframeOnMaterial(e){const t=e;"wireframe"in t&&!this._prevWireframe.has(e)&&(this._prevWireframe.set(e,!!t.wireframe),t.wireframe=!0,e.needsUpdate=!0),t.color?.isColor&&(this._prevColorMesh.has(e)||this._prevColorMesh.set(e,t.color.clone()),t.color.copy(this._wireColor))}};ue=zt([a.injectable(),Nt(0,a.inject("IMeshApi"))],ue);const G=16776960,B=16755200,Ut=2236962,Xt=2236962;var qt=Object.getOwnPropertyDescriptor,Yt=(e,t,r,s)=>{for(var i=s>1?void 0:s?qt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Pe=(e,t)=>(r,s)=>t(r,s,e);let pe=class{constructor(e,t){this._api=e,this._store=t}mode=d.SelectMode.Mesh;_hoveredMesh=null;_selectedMesh=null;_hoverColor=G;_selectColor=B;_origLineColors=new WeakMap;handle(e,t){if(this._api.setRaycastMode(this.mode),t===j.Hover){if(!e){this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),this._hoveredMesh=null;return}const r=e.intersection.object;this._hoveredMesh!==r&&(this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),r!==this._selectedMesh&&this._paintEdges(r,this._hoverColor),this._hoveredMesh=r)}if(t===j.Click){if(!e){this._selectedMesh&&(this._restoreEdgesColor(this._selectedMesh),this._selectedMesh=null,this._store.setSelectedObject(null));return}const r=e.intersection.object;this._selectedMesh&&this._selectedMesh!==r&&this._restoreEdgesColor(this._selectedMesh),this._paintEdges(r,this._selectColor),this._selectedMesh=r,this._store.setSelectedObject(r)}}rollback(){this._hoveredMesh&&this._restoreEdgesColor(this._hoveredMesh),this._selectedMesh&&this._restoreEdgesColor(this._selectedMesh),this._hoveredMesh=this._selectedMesh=null,this._store.setSelectedObject(null)}dispose(){this.rollback()}_paintEdges(e,t){e.children.forEach(r=>{const s=r;if(s.isLineSegments&&s.material){const i=s.material;this._origLineColors.has(s)||this._origLineColors.set(s,i.color.clone()),i.color.setHex(t),i.needsUpdate=!0}})}_restoreEdgesColor(e){e.children.forEach(t=>{const r=t;if(r.isLineSegments&&r.material){const s=this._origLineColors.get(r);if(s){const i=r.material;i.color.copy(s),i.needsUpdate=!0}}})}};pe=Yt([a.injectable(),Pe(0,a.inject("IRaycastApi")),Pe(1,a.inject("EditorStore"))],pe);var Zt=Object.getOwnPropertyDescriptor,Kt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Zt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},z=(e,t)=>(r,s)=>t(r,s,e);let me=class{constructor(e,t,r,s){this._cameraApi=e,this._sceneApi=t,this._raycastApi=r,this._store=s,this._cameraApi.enableCameraLayer(O),this._hoverFace=this._makeOverlayFace(this._hoverColor),this._selectFace=this._makeOverlayFace(this._selectColor),this._sceneApi.addObject(this._hoverFace,O),this._sceneApi.addObject(this._selectFace,O)}mode=d.SelectMode.Face;_hoverFace;_selectFace;_hovered=null;_selected=null;_hoverColor=G;_selectColor=B;_normalEps=1e-4;_planeEps=1e-4;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===j.Hover){if(!e){this._hoverFace.visible=!1,this._hovered=null;return}const r=e.intersection.object;if(!r?.isMesh)return;const s=r,i=e.intersection.faceIndex??-1;if(i<0)return;const n=this._collectFaceGroup(s,i);if(!n)return;this._selected&&this._same(n,this._selected)?this._hoverFace.visible=!1:(this._writeWorldFaceGroup(this._hoverFace,n),this._hoverFace.visible=!0),this._hovered=n;return}if(t===j.Click){if(!e){this._selectFace.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const r=e.intersection.object;if(!r?.isMesh)return;const s=r,i=e.intersection.faceIndex??-1;if(i<0)return;const n=this._collectFaceGroup(s,i);if(!n)return;this._writeWorldFaceGroup(this._selectFace,n),this._centerFaceProxy(this._selectFace),this._selectFace.visible=!0,this._prepareFaceMetadata(n),this._store.setSelectedObject(this._selectFace),this._selected=n,this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverFace.visible=!1)}}rollback(){this._hoverFace.visible=!1,this._selectFace.visible=!1,this._resetFaceProxyTransform(this._selectFace),this._resetFaceProxyTransform(this._hoverFace),this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverFace),this._sceneApi.removeFromScene(this._selectFace),this._hoverFace.geometry.dispose(),this._hoverFace.material.dispose(),this._selectFace.geometry.dispose(),this._selectFace.material.dispose()}_makeOverlayFace(e){const t=new c.BufferGeometry,r=new c.MeshBasicMaterial({color:e,transparent:!0,opacity:.35,depthTest:!1,depthWrite:!1,side:c.DoubleSide,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1}),s=new c.Mesh(t,r);return s.renderOrder=1e3,s.layers.set(O),s.visible=!1,s.raycast=()=>{},s}_collectFaceGroup(e,t){const r=e.geometry,s=r.getAttribute("position");if(!s)return null;const i=r.index;if(!i){const A=t*3,y=t*3+1,C=t*3+2;return{mesh:e,faceIndex:t,triangleIndices:[t],vertexIndices:[A,y,C],proxyVertexMap:[A,y,C]}}const n=Math.floor(i.count/3);if(t<0||t>=n)return null;const o=this._buildTriangleAdjacency(i,s),[l,_,u]=this._getTriangleIndices(i,t),p=this._readVertex(s,l),M=this._readVertex(s,_),f=this._readVertex(s,u),g=new c.Vector3().subVectors(M,p).cross(new c.Vector3().subVectors(f,p)).normalize(),v=new c.Plane().setFromNormalAndCoplanarPoint(g,p),b=new Set,S=[],I=[t];for(;I.length>0;){const A=I.pop();if(b.has(A))continue;b.add(A);const[y,C,L]=this._getTriangleIndices(i,A),w=this._readVertex(s,y),ke=this._readVertex(s,C),Ge=this._readVertex(s,L),$s=new c.Vector3().subVectors(ke,w).cross(new c.Vector3().subVectors(Ge,w)).normalize(),Hs=Math.abs($s.dot(g))>=1-this._normalEps,Rs=Math.abs(v.distanceToPoint(w))<this._planeEps&&Math.abs(v.distanceToPoint(ke))<this._planeEps&&Math.abs(v.distanceToPoint(Ge))<this._planeEps;if(!Hs||!Rs)continue;S.push(A);const Be=o.get(A);if(Be)for(const ze of Be)b.has(ze)||I.push(ze)}S.sort((A,y)=>A-y);const E=new Set,P=[];for(const A of S){const[y,C,L]=this._getTriangleIndices(i,A);E.add(y),E.add(C),E.add(L),P.push(y,C,L)}return{mesh:e,faceIndex:t,triangleIndices:S,vertexIndices:Array.from(E),proxyVertexMap:P}}_writeWorldFaceGroup(e,t){const r=t.mesh.geometry,s=r.getAttribute("position"),i=r.index,n=new Float32Array(t.triangleIndices.length*9);let o=0;for(const _ of t.triangleIndices){let u,p,M;i?[u,p,M]=this._getTriangleIndices(i,_):(u=_*3,p=_*3+1,M=_*3+2);const f=this._readVertex(s,u).applyMatrix4(t.mesh.matrixWorld),g=this._readVertex(s,p).applyMatrix4(t.mesh.matrixWorld),v=this._readVertex(s,M).applyMatrix4(t.mesh.matrixWorld);n[o++]=f.x,n[o++]=f.y,n[o++]=f.z,n[o++]=g.x,n[o++]=g.y,n[o++]=g.z,n[o++]=v.x,n[o++]=v.y,n[o++]=v.z}const l=e.geometry;l.setAttribute("position",new c.BufferAttribute(n,3)),l.setIndex(null),l.computeVertexNormals(),l.computeBoundingBox(),l.computeBoundingSphere()}_same(e,t){return!!e&&!!t&&e.mesh===t.mesh&&e.triangleIndices.length===t.triangleIndices.length&&e.triangleIndices.every((r,s)=>r===t.triangleIndices[s])}_prepareFaceMetadata(e){const{vertexIndexGroups:t,proxyVertexMap:r,lines:s,lineVertexIndexGroups:i}=this._buildFaceVertexGroups(e);this._selectFace.userData.faceInfo={mesh:e.mesh,faceIndex:e.faceIndex,triangleIndices:e.triangleIndices,vertexIndices:e.vertexIndices,vertexIndexGroups:t,proxyVertexMap:r,lines:s,lineVertexIndexGroups:i}}_centerFaceProxy(e){const t=e.geometry,r=t.getAttribute("position");if(!r||r.count===0)return;const s=new c.Vector3;for(let i=0;i<r.count;i++)s.x+=r.getX(i),s.y+=r.getY(i),s.z+=r.getZ(i);s.multiplyScalar(1/r.count);for(let i=0;i<r.count;i++)r.setXYZ(i,r.getX(i)-s.x,r.getY(i)-s.y,r.getZ(i)-s.z);r.needsUpdate=!0,e.position.copy(s),e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0),t.computeBoundingBox(),t.computeBoundingSphere()}_pushEdge(e,t,r,s){const i=t<r?`${t}_${r}`:`${r}_${t}`,n=e.get(i);n?n.push(s):e.set(i,[s])}_buildTriangleAdjacency(e,t){const r=Math.floor(e.count/3),s=new Map,i=this._buildWeldMap(e,t);for(let l=0;l<r;l++){const[_,u,p]=this._getTriangleIndices(e,l),M=i.get(_),f=i.get(u),g=i.get(p);this._pushEdge(s,M,f,l),this._pushEdge(s,f,g,l),this._pushEdge(s,g,M,l)}const n=new Map;for(let l=0;l<r;l++)n.set(l,new Set);for(const l of s.values())if(!(l.length<2))for(let _=0;_<l.length;_++)for(let u=0;u<l.length;u++)_!==u&&n.get(l[_])?.add(l[u]);const o=new Map;for(const[l,_]of n)o.set(l,Array.from(_));return o}_getTriangleIndices(e,t){return[e.getX(t*3),e.getX(t*3+1),e.getX(t*3+2)]}_readVertex(e,t){return new c.Vector3(e.getX(t),e.getY(t),e.getZ(t))}_vertexKey(e,t,r=1e-6){const s=Math.round(e.getX(t)/r),i=Math.round(e.getY(t)/r),n=Math.round(e.getZ(t)/r);return`${s}_${i}_${n}`}_buildWeldMap(e,t){const r=new Map,s=new Map;let i=0;for(let n=0;n<e.count;n++){const o=e.getX(n);if(s.has(o))continue;const l=this._vertexKey(t,o);let _=r.get(l);_==null&&(_=i++,r.set(l,_)),s.set(o,_)}return s}_resetFaceProxyTransform(e){e.position.set(0,0,0),e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0)}_buildFaceVertexGroups(e){const r=e.mesh.geometry.getAttribute("position"),s=1e-6,i=new c.Vector3,n=e.vertexIndices,o=[],l=new Map;for(const f of n){const g=this._readVertex(r,f),v=[];for(let S=0;S<r.count;S++)i.fromBufferAttribute(r,S),i.distanceToSquared(g)<s*s&&v.push(S);const b=o.length;o.push(v);for(const S of v)l.set(S,b)}const _=[];for(const f of e.proxyVertexMap){const g=l.get(f);_.push(g??-1)}const u=this._findChildLines(e.mesh),p=u?this._buildLineVertexGroups(e,u):void 0,M={vertexIndexGroups:o,proxyVertexMap:_};return u&&(M.lines=u),p&&(M.lineVertexIndexGroups=p),M}_findChildLines(e){for(const t of e.children)if(t.isLineSegments)return t;return null}_buildLineVertexGroups(e,t){const s=t.geometry.getAttribute("position"),n=e.mesh.geometry.getAttribute("position"),o=1e-6,l=new c.Vector3,_=t.matrixWorld,u=e.mesh.matrixWorld,p=[];for(const M of e.vertexIndices){const f=this._readVertex(n,M).applyMatrix4(u),g=[];for(let v=0;v<s.count;v++)l.fromBufferAttribute(s,v).applyMatrix4(_),l.distanceToSquared(f)<o*o&&g.push(v);p.push(g)}return p}};me=Kt([a.injectable(),z(0,a.inject("ICameraApi")),z(1,a.inject("ISceneApi")),z(2,a.inject("IRaycastApi")),z(3,a.inject("EditorStore"))],me);const Qt={[d.FigureType.Plane]:()=>new c.PlaneGeometry(1,1,1,1),[d.FigureType.Cube]:()=>new c.BoxGeometry(1,1,1,1,1,1),[d.FigureType.UVSphere]:()=>new c.SphereGeometry(.5,32,16),[d.FigureType.Icosphere]:()=>new c.IcosahedronGeometry(.5,0),[d.FigureType.Cylinder]:()=>new c.CylinderGeometry(.5,.5,1,32,1,!1),[d.FigureType.Cone]:()=>new c.ConeGeometry(.5,1,32,1,!1),[d.FigureType.Torus]:()=>new c.TorusGeometry(.5,.2,16,64),[d.FigureType.Circle]:()=>new c.CircleGeometry(.5,32),[d.FigureType.Sphere]:()=>new c.SphereGeometry(.5,32,16),[d.FigureType.Custom]:function(){throw new Error("Custom geometry is not generated here.")}},Jt=new c.MeshStandardMaterial({color:12566463,metalness:0,roughness:.6}),es=8,ts=e=>!!e&&e.isMesh,Le=e=>{let t=e;for(;t;){if(t.isMesh)return t;t=t.parent}return null},ss=e=>{const t=new c.BufferGeometry;t.setAttribute("position",e.getAttribute("position")),t.computeBoundingSphere(),t.computeBoundingBox();const r=new c.PointsMaterial({color:Xt,size:6,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.9}),s=new c.Points(t,r);return s.layers.set(Te),s.renderOrder=1e3,s.visible=!1,s},rs=e=>{const t=new c.EdgesGeometry(e),r=new c.LineSegments(t,new c.LineBasicMaterial({color:Ut,linewidth:1}));return r.layers.set(Ce),r},is=e=>{const t={x:e.position.x,y:e.position.y,z:e.position.z},r={x:e.rotation.x,y:e.rotation.y,z:e.rotation.z},s={x:e.scale.x,y:e.scale.y,z:e.scale.z},i=new c.Box3().setFromObject(e),n=new c.Vector3;i.getSize(n);const o={x:n.x,y:n.y,z:n.z};return{position:t,rotation:r,scale:s,size:o}};var ns=Object.getOwnPropertyDescriptor,os=(e,t,r,s)=>{for(var i=s>1?void 0:s?ns(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},N=(e,t)=>(r,s)=>t(r,s,e);let ve=class{constructor(e,t,r,s){this._cameraApi=e,this._sceneApi=t,this._raycastApi=r,this._store=s,this._cameraApi.enableCameraLayer(O),this._hoverVertex=this._makeOverlayVertex(this._hoverColor),this._selectVertex=this._makeOverlayVertex(this._selectColor),this._sceneApi.addObject(this._hoverVertex,O),this._sceneApi.addObject(this._selectVertex,O)}mode=d.SelectMode.Vertex;_hovered=null;_selected=null;_hoverVertex;_selectVertex;_hoverColor=G;_selectColor=B;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===j.Hover){if(!e){this._hoverVertex.visible=!1,this._hovered=null;return}const r=e.intersection.object;if(!r?.isPoints)return;const s=r,i=e.intersection.index??-1;if(i<0)return;this._selected&&this._same({points:s,index:i},this._selected)?this._hoverVertex.visible=!1:(this._writeWorldVertex(this._hoverVertex,s,i),this._hoverVertex.visible=!0);return}if(t===j.Click){if(!e){this._selectVertex.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const r=e.intersection.object;if(!r?.isPoints)return;const s=r,i=e.intersection.index??-1;if(i<0)return;this._writeWorldVertex(this._selectVertex,s,i),this._centerVertexOnPoint(this._selectVertex,s,i),this._selectVertex.visible=!0,this._prepareVertexMetadata(s,i),this._store.setSelectedObject(this._selectVertex),this._selected={points:s,index:i},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverVertex.visible=!1);return}}rollback(){this._hoverVertex.visible=!1,this._selectVertex.visible=!1,this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverVertex),this._sceneApi.removeFromScene(this._selectVertex),this._hoverVertex.geometry.dispose(),this._hoverVertex.material.dispose(),this._selectVertex.geometry.dispose(),this._selectVertex.material.dispose()}_makeOverlayVertex(e,t=es){const r=new c.BufferGeometry;r.setAttribute("position",new c.Float32BufferAttribute([0,0,0],3));const s=new c.PointsMaterial({color:e,size:t,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),i=new c.Points(r,s);return i.renderOrder=1e3,i.raycast=()=>{},i.layers.set(O),i.visible=!1,i}_writeWorldVertex(e,t,r){const s=t.geometry.getAttribute("position"),i=new c.Vector3(s.getX(r),s.getY(r),s.getZ(r)).applyMatrix4(t.matrixWorld),n=e.geometry.getAttribute("position");n.setXYZ(0,i.x,i.y,i.z),n.needsUpdate=!0}_same(e,t){return!!e&&!!t&&e.points===t.points&&e.index===t.index}_prepareVertexMetadata(e,t){const r=Le(e);if(!r)return;const s=e.geometry.getAttribute("position"),i=new c.Vector3(s.getX(t),s.getY(t),s.getZ(t)).applyMatrix4(e.matrixWorld),n=new c.Matrix4().copy(r.matrixWorld).invert(),o=i.clone().applyMatrix4(n),_=r.geometry.getAttribute("position"),u=1e-6,p=u*u,M=new c.Vector3,f=[];for(let b=0;b<_.count;b++)M.fromBufferAttribute(_,b),M.distanceToSquared(o)<p&&f.push(b);const g=r.children.find(b=>b?.isLineSegments);let v=[];if(g){const b=new c.Matrix4().copy(g.matrixWorld).invert(),S=i.clone().applyMatrix4(b),I=g.geometry.getAttribute("position"),E=new c.Vector3;for(let P=0;P<I.count;P++)E.fromBufferAttribute(I,P),E.distanceToSquared(S)<p&&v.push(P)}this._selectVertex.userData.vertexInfo={points:e,index:t,mesh:r,vertexIndices:f,lines:g??null,edgeVertexIndices:v}}_centerVertexOnPoint(e,t,r){const s=t.geometry.getAttribute("position"),i=new c.Vector3(s.getX(r),s.getY(r),s.getZ(r)).applyMatrix4(t.matrixWorld);e.position.copy(i);const n=e.geometry;let o=n.getAttribute("position");(!o||o.count<1)&&(n.setAttribute("position",new c.BufferAttribute(new Float32Array(3),3)),o=n.getAttribute("position")),o.setXYZ(0,0,0,0),o.needsUpdate=!0,e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0)}};ve=os([a.injectable(),N(0,a.inject("ICameraApi")),N(1,a.inject("ISceneApi")),N(2,a.inject("IRaycastApi")),N(3,a.inject("EditorStore"))],ve);class fe{constructor(t,r){this.api=t,this.store=r,this._unsubscribeTransform=this.api.onTransformChange(()=>{this.store.getSelectedObject()&&this.store.notifySelectedTransformChange?.()})}_unsubscribeTransform;handle(){const t=this.store.getSelectedObject();this.api.setTransformMode(this.mode),t?this.api.attachTransform(t):this.api.detachTransform()}rollback(){this.api.detachTransform()}dispose(){this.rollback(),this._unsubscribeTransform&&this._unsubscribeTransform()}}var as=Object.getOwnPropertyDescriptor,cs=(e,t,r,s)=>{for(var i=s>1?void 0:s?as(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},De=(e,t)=>(r,s)=>t(r,s,e);let ge=class extends fe{mode=d.ToolType.Translate;constructor(e,t){super(e,t)}};ge=cs([a.injectable(),De(0,a.inject("ITransformApi")),De(1,a.inject("EditorStore"))],ge);var ls=Object.getOwnPropertyDescriptor,hs=(e,t,r,s)=>{for(var i=s>1?void 0:s?ls(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ve=(e,t)=>(r,s)=>t(r,s,e);let Me=class extends fe{mode=d.ToolType.Scale;constructor(e,t){super(e,t)}};Me=hs([a.injectable(),Ve(0,a.inject("ITransformApi")),Ve(1,a.inject("EditorStore"))],Me);var ds=Object.getOwnPropertyDescriptor,_s=(e,t,r,s)=>{for(var i=s>1?void 0:s?ds(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},$e=(e,t)=>(r,s)=>t(r,s,e);let be=class extends fe{mode=d.ToolType.Rotate;constructor(e,t){super(e,t)}};be=_s([a.injectable(),$e(0,a.inject("ITransformApi")),$e(1,a.inject("EditorStore"))],be);var us=Object.getOwnPropertyDescriptor,ps=(e,t,r,s)=>{for(var i=s>1?void 0:s?us(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},U=(e,t)=>(r,s)=>t(r,s,e);let Se=class{constructor(e,t,r,s){this._sceneApi=e,this._cameraApi=t,this._raycastApi=r,this._store=s,this._cameraApi.enableCameraLayer(O),this._hoverLine=this._makeOverlayLine(this._hoverColor),this._selectLine=this._makeOverlayLine(this._selectColor),this._sceneApi.addObject(this._hoverLine,O),this._sceneApi.addObject(this._selectLine,O)}mode=d.SelectMode.Edge;_hoverLine;_selectLine;_hovered=null;_selected=null;_hoverColor=G;_selectColor=B;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===j.Hover){if(!e){this._hoverLine.visible=!1,this._hovered=null;return}const r=e.intersection.object;if(!r?.isLineSegments)return;const s=r,i=Math.floor((e.intersection.index??-1)/2);if(i<0)return;this._selected&&this._same({lines:s,seg:i},this._selected)?this._hoverLine.visible=!1:(this._writeWorldSegment(this._hoverLine,s,i),this._hoverLine.visible=!0),this._hovered={lines:s,seg:i};return}if(t===j.Click){if(!e){this._selectLine.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const r=e.intersection.object;if(!r?.isLineSegments)return;const s=r,i=Math.floor((e.intersection.index??-1)/2);if(i<0)return;this._writeWorldSegment(this._selectLine,s,i),this._centerAndOrientLineOnSegment(this._selectLine,s,i),this._selectLine.visible=!0,this._prepareEdgeMetadata(s,i),this._store.setSelectedObject(this._selectLine),this._selected={lines:s,seg:i},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverLine.visible=!1)}}rollback(){this._hoverLine.visible=!1,this._selectLine.visible=!1,this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverLine),this._sceneApi.removeFromScene(this._selectLine),this._hoverLine.geometry.dispose(),this._hoverLine.material.dispose(),this._selectLine.geometry.dispose(),this._selectLine.material.dispose()}_makeOverlayLine(e){const t=new c.BufferGeometry;t.setAttribute("position",new c.Float32BufferAttribute(6,3));const r=new c.LineBasicMaterial({color:e,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),s=new c.Line(t,r);return s.renderOrder=1e3,s.raycast=()=>{},s.layers.set(O),s.visible=!1,s}_writeWorldSegment(e,t,r){const s=t.geometry.getAttribute("position"),i=r*2,n=i+1,o=new c.Vector3(s.getX(i),s.getY(i),s.getZ(i)).applyMatrix4(t.matrixWorld),l=new c.Vector3(s.getX(n),s.getY(n),s.getZ(n)).applyMatrix4(t.matrixWorld),_=e.geometry.getAttribute("position");_.setXYZ(0,o.x,o.y,o.z),_.setXYZ(1,l.x,l.y,l.z),_.needsUpdate=!0}_same(e,t){return!!e&&!!t&&e.lines===t.lines&&e.seg===t.seg}_centerAndOrientLineOnSegment(e,t,r){const s=t.geometry.getAttribute("position"),i=r*2,n=i+1,o=new c.Vector3(s.getX(i),s.getY(i),s.getZ(i)).applyMatrix4(t.matrixWorld),l=new c.Vector3(s.getX(n),s.getY(n),s.getZ(n)).applyMatrix4(t.matrixWorld),_=new c.Vector3().subVectors(l,o),u=_.length();if(!isFinite(u)||u===0)return;const p=new c.Vector3().addVectors(o,l).multiplyScalar(.5);e.position.copy(p);const M=e.geometry;let f=M.getAttribute("position");(!f||f.count<2)&&(M.setAttribute("position",new c.BufferAttribute(new Float32Array(6),3)),f=M.getAttribute("position")),f.setXYZ(0,-u/2,0,0),f.setXYZ(1,u/2,0,0),f.needsUpdate=!0,_.normalize();const g=new c.Quaternion().setFromUnitVectors(new c.Vector3(1,0,0),_);e.quaternion.copy(g),e.updateMatrixWorld(!0)}_prepareEdgeMetadata(e,t){const r=Le(e);if(!r)return;const s=e.geometry.getAttribute("position"),i=t*2,n=i+1,o=new c.Vector3(s.getX(i),s.getY(i),s.getZ(i)).applyMatrix4(e.matrixWorld),l=new c.Vector3(s.getX(n),s.getY(n),s.getZ(n)).applyMatrix4(e.matrixWorld),_=new c.Matrix4().copy(r.matrixWorld).invert(),u=o.clone().applyMatrix4(_),p=l.clone().applyMatrix4(_),f=r.geometry.getAttribute("position"),g=new c.Vector3,v=1e-6,b=[],S=[];for(let w=0;w<f.count;w++)g.fromBufferAttribute(f,w),g.distanceToSquared(u)<v*v?b.push(w):g.distanceToSquared(p)<v*v&&S.push(w);const I=new c.Matrix4().copy(e.matrixWorld).invert(),E=o.clone().applyMatrix4(I),P=l.clone().applyMatrix4(I),A=e.geometry.getAttribute("position"),y=new c.Vector3,C=[],L=[];for(let w=0;w<A.count;w++)y.fromBufferAttribute(A,w),y.distanceToSquared(E)<v*v?C.push(w):y.distanceToSquared(P)<v*v&&L.push(w);this._selectLine.userData.edgeInfo={lines:e,seg:t,mesh:r,aIndices:b,bIndices:S,aEdgeIndices:C,bEdgeIndices:L}}};Se=ps([a.injectable(),U(0,a.inject("ISceneApi")),U(1,a.inject("ICameraApi")),U(2,a.inject("IRaycastApi")),U(3,a.inject("EditorStore"))],Se);var ms=Object.getOwnPropertyDescriptor,vs=(e,t,r,s)=>{for(var i=s>1?void 0:s?ms(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},fs=(e,t)=>(r,s)=>t(r,s,e);let Ae=class{constructor(e){this._api=e}mode=d.SceneMode.AddFigure;_lastAddedMesh=null;handle(e){const t=Qt[e](),r=t.getAttribute("position");r&&r.setUsage&&r.setUsage(c.DynamicDrawUsage);const s=new c.Mesh(t,Jt);s.layers.enable($);const i=t.index?t.toNonIndexed():t,n=rs(i);n.layers.enable($),s.add(n);const o=ss(i);o.layers.enable($),s.add(o),this._api.addMesh(s),this._lastAddedMesh=s}rollback(){this._lastAddedMesh!==null&&(this._api.removeMesh(this._lastAddedMesh),this._lastAddedMesh=null)}dispose(){this._lastAddedMesh=null}};Ae=vs([a.injectable(),fs(0,a.inject("IMeshApi"))],Ae);var gs=Object.getOwnPropertyDescriptor,Ms=(e,t,r,s)=>{for(var i=s>1?void 0:s?gs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},He=(e,t)=>(r,s)=>t(r,s,e);let we=class{constructor(e,t){this._api=e,this._store=t}mode=d.SceneMode.DeleteFigure;_lastDeletedMesh=null;handle(){const e=this._store.getSelectedObject();ts(e)&&(this._api.removeMesh(e),this._store.setSelectedObject(null),this._lastDeletedMesh=e)}rollback(){this._lastDeletedMesh&&(this._api.addMesh(this._lastDeletedMesh),this._lastDeletedMesh=null)}dispose(){this._lastDeletedMesh=null}};we=Ms([a.injectable(),He(0,a.inject("IMeshApi")),He(1,a.inject("EditorStore"))],we);var bs=Object.getOwnPropertyDescriptor,Ss=(e,t,r,s)=>{for(var i=s>1?void 0:s?bs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},X=(e,t)=>(r,s)=>t(r,s,e);m.EditorHub=class{constructor(t,r,s,i){this._renderer=t,this._mediator=r,this._store=s,this._controller=i,this.setSelectMode(d.SelectMode.Mesh),this.setToolMode(d.ToolType.Translate)}setDisplayMode(t){return this._mediator.send({type:x.Display,payload:[t]})}setSceneMode(t){return this._mediator.send({type:x.Scene,payload:[t]})}setSelectMode(t){return this._mediator.send({type:x.Select,payload:[t]})}setToolMode(t){return this._mediator.send({type:x.Tool,payload:[t]})}addFigure(t,r){return this._mediator.send({type:x.Scene,payload:[t,r]})}resizeRenderer(){this._renderer.resize()}start(){this._controller.start()}stop(){this._controller.stop()}getSelectionStats(){return this._store.getSelectionStats()}onSelectionStatsChange(t){const r=this._store.onSelectedObjectChange(()=>{t()}),s=this._store.onSelectedTransformChange(()=>{t()});return()=>{r(),s()}}dispose(){this._mediator.dispose()}},m.EditorHub=Ss([a.injectable(),X(0,a.inject("Renderer")),X(1,a.inject("IMediator")),X(2,a.inject("EditorStore")),X(3,a.inject("IController"))],m.EditorHub);var As=Object.getOwnPropertyDescriptor,ws=(e,t,r,s)=>{for(var i=s>1?void 0:s?As(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};m.EventBus=class{_emitter;constructor(){this._emitter=new Ue.EventEmitter}emit(t,r){this._emitter.emit(t,r)}on(t,r){this._emitter.on(t,r)}off(t,r){this._emitter.off(t,r)}},m.EventBus=ws([a.injectable()],m.EventBus);var ys=Object.getOwnPropertyDescriptor,Os=(e,t,r,s)=>{for(var i=s>1?void 0:s?ys(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};let ye=class{_selectMode=d.SelectMode.Mesh;_toolType=d.ToolType.Translate;_displayMode=d.DisplayMode.Plane;_selectedObject=null;_selectedListeners=new Set;_transformListeners=new Set;constructor(){Xe.makeAutoObservable(this,{},{autoBind:!0})}getSelectMode(){return this._selectMode}getToolType(){return this._toolType}getDisplayMode(){return this._displayMode}setSelectMode(e){this._selectMode=e}setToolType(e){this._toolType=e}setDisplayMode(e){this._displayMode=e}getSelectedObject(){return this._selectedObject}getSelectionStats(){const e=this._selectedObject;return e?is(e):null}setSelectedObject(e){if(this._selectedObject!==e){this._selectedObject=e;for(const t of this._selectedListeners)t(this._selectedObject)}}onSelectedObjectChange(e){return this._selectedListeners.add(e),()=>this._selectedListeners.delete(e)}onSelectedTransformChange(e){return this._transformListeners.add(e),()=>this._transformListeners.delete(e)}notifySelectedTransformChange(){for(const e of this._transformListeners)e()}};ye=Os([a.injectable()],ye);var D=(e=>(e.ToolNotAllowed="TOOL_NOT_ALLOWED",e.Success="SUCCESS",e.NoChange="NO_CHANGE",e.Error="ERROR",e))(D||{});class Re extends Error{constructor(t,r,s,i){super(r),this.type=t,this.code=s,this.meta=i,this.name=this._name}_name="PolicyException"}var xs=Object.getOwnPropertyDescriptor,js=(e,t,r,s)=>{for(var i=s>1?void 0:s?xs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Cs=(e,t)=>(r,s)=>t(r,s,e);let Oe=class{constructor(e){this._store=e}check(e){const t=this._store.getSelectMode();if(!d.DEFAULT_TOOL_RULES[t].includes(e))throw new Re(D.ToolNotAllowed,`Tool ${e} is not allowed`,"TOOL_NOT_ALLOWED")}};Oe=js([a.injectable(),Cs(0,a.inject("EditorStore"))],Oe);var Ts=Object.getOwnPropertyDescriptor,Is=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ts(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};let xe=class{handle(e){try{return e()}catch(t){return t instanceof Re?{type:t.type,message:t.message,code:t.code,blocked:!0}:t instanceof Error?{type:D.Error,message:t.message,code:"UNHANDLED_EXCEPTION",blocked:!0}:{type:D.Error,message:"Unknown exception",code:"UNKNOWN_EXCEPTION",blocked:!0}}}};xe=Is([a.injectable()],xe);var Es=Object.getOwnPropertyDescriptor,Ps=(e,t,r,s)=>{for(var i=s>1?void 0:s?Es(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Fe=(e,t)=>(r,s)=>t(r,s,e);let je=class{constructor(e,t){this._middlewares=t,this._managers=new Map(e.map(r=>[r.type,r]))}_managers;send(e){const t=this._managers.get(e.type);if(!t)return{type:D.Error,message:`Manager for feature "${String(e.type)}" not found`,code:"MANAGER_NOT_FOUND",blocked:!0};const r=()=>(t.manage(...e.payload),null);return this._middlewares.reduceRight((i,n)=>()=>n.handle(i),r)()}dispose(){this._managers&&this._managers.clear()}};je=Ps([a.injectable(),Fe(0,a.injectAll("IManager")),Fe(1,a.injectAll("IMiddleware"))],je);let We=!1;const h=a.container.createChildContainer();function Ls(e){return We||(h.registerInstance("Canvas",e),h.registerSingleton("EventBus",m.EventBus),h.registerSingleton("IController",q),h.registerSingleton("Renderer",m.Renderer),h.register("IRenderable",{useToken:"Renderer"}),h.register("IRendererAccess",{useToken:"Renderer"}),h.register("IRendererCameraAccess",{useToken:"Renderer"}),h.register("IRendererDomAccess",{useToken:"Renderer"}),h.register("IRendererSceneAccess",{useToken:"Renderer"}),h.registerSingleton("ToolPolicy",Oe),h.registerSingleton("IMeshApi",Y),h.registerSingleton("IControlsStateApi",te),h.registerSingleton("IRaycastApi",Z),h.registerSingleton("ITransformApi",K),h.registerSingleton("ICameraApi",Q),h.registerSingleton("IDomApi",J),h.registerSingleton("ISceneApi",ee),h.registerSingleton("ControlsModule",re),h.registerSingleton("GizmoModule",ne),h.registerSingleton("RaycastModule",oe),h.registerSingleton("SceneModule",ae),h.register("IUpdatableModule",{useToken:"ControlsModule"}),h.register("IRenderableModule",{useToken:"GizmoModule"}),h.register("IRuntimeModule",{useToken:"RaycastModule"}),h.register("IRuntimeModule",{useToken:"SceneModule"}),h.registerSingleton("IDisplayHandler",ue),h.registerSingleton("ISelectHandler",pe),h.registerSingleton("ISelectHandler",me),h.registerSingleton("ISelectHandler",Se),h.registerSingleton("ISelectHandler",ve),h.registerSingleton("IToolHandler",ge),h.registerSingleton("IToolHandler",Me),h.registerSingleton("IToolHandler",be),h.registerSingleton("ISceneHandler",Ae),h.registerSingleton("ISceneHandler",we),h.registerSingleton("DisplayManager",ce),h.register("IDisplayManager",{useToken:"DisplayManager"}),h.register("IManager",{useToken:"DisplayManager"}),h.registerSingleton("SelectManager",he),h.register("ISelectManager",{useToken:"SelectManager"}),h.register("IManager",{useToken:"SelectManager"}),h.registerSingleton("ToolManager",k),h.register("IToolManager",{useToken:"ToolManager"}),h.register("IManager",{useToken:"ToolManager"}),h.registerSingleton("SceneManager",_e),h.register("ISceneManager",{useToken:"SceneManager"}),h.register("IManager",{useToken:"SceneManager"}),h.registerSingleton("IMiddleware",xe),h.registerSingleton("IMediator",je),h.registerSingleton("EditorHub",m.EditorHub),h.registerSingleton("EditorStore",ye),We=!0),h}let V=null;const Ds=e=>(V||(V=Ls(e)),V.resolve("EditorHub")),Vs=()=>{if(!V)throw new Error("EditorHub is not initialized. Call createAppHub(canvas) first.");return V.resolve("EditorHub")};m.EventTopics=T,m.FeatureType=x,m.ObjLoader=Qe,m.ResponseType=D,m.createAppHub=Ds,m.getAppHub=Vs,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})}));
|
|
1
|
+
(function(w,X){typeof exports=="object"&&typeof module<"u"?X(exports,require("reflect-metadata"),require("three"),require("tsyringe"),require("@planara/types"),require("@planara/three"),require("events"),require("mobx")):typeof define=="function"&&define.amd?define(["exports","reflect-metadata","three","tsyringe","@planara/types","@planara/three","events","mobx"],X):(w=typeof globalThis<"u"?globalThis:w||self,X(w.PlanaraCore={},w.Reflect,w.THREE,w.tsyringe,w.PlanaraTypes,w.PlanaraThree,w.events,w.mobx))})(this,(function(w,X,b,a,h,q,Qt,Y){"use strict";function er(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const c=er(b),tr=/^[og]\s*(.+)?/,rr=/^mtllib /,sr=/^usemtl /,ir=/^usemap /,ht=/\s+/,dt=new b.Vector3,fe=new b.Vector3,ut=new b.Vector3,_t=new b.Vector3,L=new b.Vector3,K=new b.Color;function nr(){const e={objects:[],object:{},vertices:[],normals:[],colors:[],uvs:[],materials:{},materialLibraries:[],startObject:function(t,r){if(this.object&&this.object.fromDeclaration===!1){this.object.name=t,this.object.fromDeclaration=r!==!1;return}const s=this.object&&typeof this.object.currentMaterial=="function"?this.object.currentMaterial():void 0;if(this.object&&typeof this.object._finalize=="function"&&this.object._finalize(!0),this.object={name:t||"",fromDeclaration:r!==!1,geometry:{vertices:[],normals:[],colors:[],uvs:[],hasUVIndices:!1},materials:[],smooth:!0,startMaterial:function(i,n){const o=this._finalize(!1);o&&(o.inherited||o.groupCount<=0)&&this.materials.splice(o.index,1);const l={index:this.materials.length,name:i||"",mtllib:Array.isArray(n)&&n.length>0?n[n.length-1]:"",smooth:o!==void 0?o.smooth:this.smooth,groupStart:o!==void 0?o.groupEnd:0,groupEnd:-1,groupCount:-1,inherited:!1,clone:function(d){const u={index:typeof d=="number"?d:this.index,name:this.name,mtllib:this.mtllib,smooth:this.smooth,groupStart:0,groupEnd:-1,groupCount:-1,inherited:!1};return u.clone=this.clone.bind(u),u}};return this.materials.push(l),l},currentMaterial:function(){if(this.materials.length>0)return this.materials[this.materials.length-1]},_finalize:function(i){const n=this.currentMaterial();if(n&&n.groupEnd===-1&&(n.groupEnd=this.geometry.vertices.length/3,n.groupCount=n.groupEnd-n.groupStart,n.inherited=!1),i&&this.materials.length>1)for(let o=this.materials.length-1;o>=0;o--)this.materials[o].groupCount<=0&&this.materials.splice(o,1);return i&&this.materials.length===0&&this.materials.push({name:"",smooth:this.smooth}),n}},s&&s.name&&typeof s.clone=="function"){const i=s.clone(0);i.inherited=!0,this.object.materials.push(i)}this.objects.push(this.object)},finalize:function(){this.object&&typeof this.object._finalize=="function"&&this.object._finalize(!0)},parseVertexIndex:function(t,r){const s=parseInt(t,10);return(s>=0?s-1:s+r/3)*3},parseNormalIndex:function(t,r){const s=parseInt(t,10);return(s>=0?s-1:s+r/3)*3},parseUVIndex:function(t,r){const s=parseInt(t,10);return(s>=0?s-1:s+r/2)*2},addVertex:function(t,r,s){const i=this.vertices,n=this.object.geometry.vertices;n.push(i[t+0],i[t+1],i[t+2]),n.push(i[r+0],i[r+1],i[r+2]),n.push(i[s+0],i[s+1],i[s+2])},addVertexPoint:function(t){const r=this.vertices;this.object.geometry.vertices.push(r[t+0],r[t+1],r[t+2])},addVertexLine:function(t){const r=this.vertices;this.object.geometry.vertices.push(r[t+0],r[t+1],r[t+2])},addNormal:function(t,r,s){const i=this.normals,n=this.object.geometry.normals;n.push(i[t+0],i[t+1],i[t+2]),n.push(i[r+0],i[r+1],i[r+2]),n.push(i[s+0],i[s+1],i[s+2])},addFaceNormal:function(t,r,s){const i=this.vertices,n=this.object.geometry.normals;dt.fromArray(i,t),fe.fromArray(i,r),ut.fromArray(i,s),L.subVectors(ut,fe),_t.subVectors(dt,fe),L.cross(_t),L.normalize(),n.push(L.x,L.y,L.z),n.push(L.x,L.y,L.z),n.push(L.x,L.y,L.z)},addColor:function(t,r,s){const i=this.colors,n=this.object.geometry.colors;i[t]!==void 0&&n.push(i[t+0],i[t+1],i[t+2]),i[r]!==void 0&&n.push(i[r+0],i[r+1],i[r+2]),i[s]!==void 0&&n.push(i[s+0],i[s+1],i[s+2])},addUV:function(t,r,s){const i=this.uvs,n=this.object.geometry.uvs;n.push(i[t+0],i[t+1]),n.push(i[r+0],i[r+1]),n.push(i[s+0],i[s+1])},addDefaultUV:function(){const t=this.object.geometry.uvs;t.push(0,0),t.push(0,0),t.push(0,0)},addUVLine:function(t){const r=this.uvs;this.object.geometry.uvs.push(r[t+0],r[t+1])},addFace:function(t,r,s,i,n,o,l,d,u){const p=this.vertices.length;let m=this.parseVertexIndex(t,p),f=this.parseVertexIndex(r,p),g=this.parseVertexIndex(s,p);if(this.addVertex(m,f,g),this.addColor(m,f,g),l!==void 0&&l!==""){const _=this.normals.length;m=this.parseNormalIndex(l,_),f=this.parseNormalIndex(d,_),g=this.parseNormalIndex(u,_),this.addNormal(m,f,g)}else this.addFaceNormal(m,f,g);if(i!==void 0&&i!==""){const _=this.uvs.length;m=this.parseUVIndex(i,_),f=this.parseUVIndex(n,_),g=this.parseUVIndex(o,_),this.addUV(m,f,g),this.object.geometry.hasUVIndices=!0}else this.addDefaultUV()},addPointGeometry:function(t){this.object.geometry.type="Points";const r=this.vertices.length;for(let s=0,i=t.length;s<i;s++){const n=this.parseVertexIndex(t[s],r);this.addVertexPoint(n),this.addColor(n)}},addLineGeometry:function(t,r){this.object.geometry.type="Line";const s=this.vertices.length,i=this.uvs.length;for(let n=0,o=t.length;n<o;n++)this.addVertexLine(this.parseVertexIndex(t[n],s));for(let n=0,o=r.length;n<o;n++)this.addUVLine(this.parseUVIndex(r[n],i))}};return e.startObject("",!1),e}class or extends b.Loader{constructor(t){super(t),this.materials=null}load(t,r,s,i){const n=this,o=new b.FileLoader(this.manager);o.setPath(this.path),o.setRequestHeader(this.requestHeader),o.setWithCredentials(this.withCredentials),o.load(t,function(l){try{r(n.parse(l))}catch(d){i?i(d):console.error(d),n.manager.itemError(t)}},s,i)}setMaterials(t){return this.materials=t,this}parse(t){const r=new nr;t.indexOf(`\r
|
|
2
|
+
`)!==-1&&(t=t.replace(/\r\n/g,`
|
|
3
|
+
`)),t.indexOf(`\\
|
|
4
|
+
`)!==-1&&(t=t.replace(/\\\n/g,""));const s=t.split(`
|
|
5
|
+
`);let i=[];for(let l=0,d=s.length;l<d;l++){const u=s[l].trimStart();if(u.length===0)continue;const p=u.charAt(0);if(p!=="#")if(p==="v"){const m=u.split(ht);switch(m[0]){case"v":r.vertices.push(parseFloat(m[1]),parseFloat(m[2]),parseFloat(m[3])),m.length>=7?(K.setRGB(parseFloat(m[4]),parseFloat(m[5]),parseFloat(m[6]),b.SRGBColorSpace),r.colors.push(K.r,K.g,K.b)):r.colors.push(void 0,void 0,void 0);break;case"vn":r.normals.push(parseFloat(m[1]),parseFloat(m[2]),parseFloat(m[3]));break;case"vt":r.uvs.push(parseFloat(m[1]),parseFloat(m[2]));break}}else if(p==="f"){const f=u.slice(1).trim().split(ht),g=[];for(let v=0,M=f.length;v<M;v++){const y=f[v];if(y.length>0){const j=y.split("/");g.push(j)}}const _=g[0];for(let v=1,M=g.length-1;v<M;v++){const y=g[v],j=g[v+1];r.addFace(_[0],y[0],j[0],_[1],y[1],j[1],_[2],y[2],j[2])}}else if(p==="l"){const m=u.substring(1).trim().split(" ");let f=[];const g=[];if(u.indexOf("/")===-1)f=m;else for(let _=0,v=m.length;_<v;_++){const M=m[_].split("/");M[0]!==""&&f.push(M[0]),M[1]!==""&&g.push(M[1])}r.addLineGeometry(f,g)}else if(p==="p"){const f=u.slice(1).trim().split(" ");r.addPointGeometry(f)}else if((i=tr.exec(u))!==null){const m=(" "+i[0].slice(1).trim()).slice(1);r.startObject(m)}else if(sr.test(u))r.object.startMaterial(u.substring(7).trim(),r.materialLibraries);else if(rr.test(u))r.materialLibraries.push(u.substring(7).trim());else if(ir.test(u))console.warn('THREE.OBJLoader: Rendering identifier "usemap" not supported. Textures must be defined in MTL files.');else if(p==="s"){if(i=u.split(" "),i.length>1){const f=i[1].trim().toLowerCase();r.object.smooth=f!=="0"&&f!=="off"}else r.object.smooth=!0;const m=r.object.currentMaterial();m&&(m.smooth=r.object.smooth)}else{if(u==="\0")continue;console.warn('THREE.OBJLoader: Unexpected line: "'+u+'"')}}r.finalize();const n=new b.Group;if(n.materialLibraries=[].concat(r.materialLibraries),!(r.objects.length===1&&r.objects[0].geometry.vertices.length===0)===!0)for(let l=0,d=r.objects.length;l<d;l++){const u=r.objects[l],p=u.geometry,m=u.materials,f=p.type==="Line",g=p.type==="Points";let _=!1;if(p.vertices.length===0)continue;const v=new b.BufferGeometry;v.setAttribute("position",new b.Float32BufferAttribute(p.vertices,3)),p.normals.length>0&&v.setAttribute("normal",new b.Float32BufferAttribute(p.normals,3)),p.colors.length>0&&(_=!0,v.setAttribute("color",new b.Float32BufferAttribute(p.colors,3))),p.hasUVIndices===!0&&v.setAttribute("uv",new b.Float32BufferAttribute(p.uvs,2));const M=[];for(let j=0,x=m.length;j<x;j++){const S=m[j],C=S.name+"_"+S.smooth+"_"+_;let A=r.materials[C];if(this.materials!==null){if(A=this.materials.create(S.name),f&&A&&!(A instanceof b.LineBasicMaterial)){const O=new b.LineBasicMaterial;b.Material.prototype.copy.call(O,A),O.color.copy(A.color),A=O}else if(g&&A&&!(A instanceof b.PointsMaterial)){const O=new b.PointsMaterial({size:10,sizeAttenuation:!1});b.Material.prototype.copy.call(O,A),O.color.copy(A.color),O.map=A.map,A=O}}A===void 0&&(f?A=new b.LineBasicMaterial:g?A=new b.PointsMaterial({size:1,sizeAttenuation:!1}):A=new b.MeshPhongMaterial,A.name=S.name,A.flatShading=!S.smooth,A.vertexColors=_,r.materials[C]=A),M.push(A)}let y;if(M.length>1){for(let j=0,x=m.length;j<x;j++){const S=m[j];v.addGroup(S.groupStart,S.groupCount,j)}f?y=new b.LineSegments(v,M):g?y=new b.Points(v,M):y=new b.Mesh(v,M)}else f?y=new b.LineSegments(v,M[0]):g?y=new b.Points(v,M[0]):y=new b.Mesh(v,M[0]);y.name=u.name,n.add(y)}else if(r.vertices.length>0){const l=new b.PointsMaterial({size:1,sizeAttenuation:!1}),d=new b.BufferGeometry;d.setAttribute("position",new b.Float32BufferAttribute(r.vertices,3)),r.colors.length>0&&r.colors[0]!==void 0&&(d.setAttribute("color",new b.Float32BufferAttribute(r.colors,3)),l.vertexColors=!0);const u=new b.Points(d,l);n.add(u)}return n}}const Z=16776960,J=16755200,ar=2236962,cr=2236962,lr={[h.FigureType.Plane]:()=>new c.PlaneGeometry(1,1,1,1),[h.FigureType.Cube]:()=>new c.BoxGeometry(1,1,1,1,1,1),[h.FigureType.Sphere]:()=>new c.SphereGeometry(.5,32,16),[h.FigureType.UVSphere]:()=>new c.SphereGeometry(.5,32,16),[h.FigureType.Icosphere]:()=>new c.IcosahedronGeometry(.5,0),[h.FigureType.Cylinder]:()=>new c.CylinderGeometry(.5,.5,1,32,1,!1),[h.FigureType.Cone]:()=>new c.ConeGeometry(.5,1,32,1,!1),[h.FigureType.Pyramid]:()=>new c.ConeGeometry(.5,1,4,1,!1),[h.FigureType.Tetrahedron]:()=>new c.TetrahedronGeometry(.5,0),[h.FigureType.Octahedron]:()=>new c.OctahedronGeometry(.5,0),[h.FigureType.Dodecahedron]:()=>new c.DodecahedronGeometry(.5,0),[h.FigureType.Torus]:()=>new c.TorusGeometry(.5,.2,16,64),[h.FigureType.TorusKnot]:()=>new c.TorusKnotGeometry(.4,.12,96,16),[h.FigureType.Circle]:()=>new c.CircleGeometry(.5,32),[h.FigureType.Ring]:()=>new c.RingGeometry(.25,.5,32),[h.FigureType.Capsule]:()=>new c.CapsuleGeometry(.3,.8,8,16),[h.FigureType.Custom]:function(){throw new Error("Custom geometry is not generated here.")}},mt=new c.MeshStandardMaterial({color:12566463,metalness:0,roughness:.6}),hr=8,k=0,pt=1,ft=2,D=31,dr=.03,ur=.05,ge=900,gt=300,vt=300,bt=300,ve=e=>!!e&&e.isMesh,Mt=e=>{let t=e;for(;t;){if(t.isMesh)return t;t=t.parent}return null},wt=e=>{const t=new c.BufferGeometry;t.setAttribute("position",e.getAttribute("position")),t.computeBoundingSphere(),t.computeBoundingBox();const r=new c.PointsMaterial({color:cr,size:6,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.9}),s=new c.Points(t,r);return s.layers.set(ft),s.renderOrder=1e3,s.visible=!1,s},St=e=>{const t=new c.EdgesGeometry(e),r=new c.LineSegments(t,new c.LineBasicMaterial({color:ar,linewidth:1}));return r.layers.set(pt),r},_r=e=>{const t={x:e.position.x,y:e.position.y,z:e.position.z},r={x:e.rotation.x,y:e.rotation.y,z:e.rotation.z},s={x:e.scale.x,y:e.scale.y,z:e.scale.z},i=new c.Box3().setFromObject(e),n=new c.Vector3;i.getSize(n);const o={x:n.x,y:n.y,z:n.z};return{position:t,rotation:r,scale:s,size:o}},mr=(e,t)=>t?{background:{...e.background,...t.background},camera:{...e.camera,...t.camera,position:{...e.camera.position,...t.camera?.position}},renderer:{...e.renderer,...t.renderer},lights:{ambient:{...e.lights.ambient,...t.lights?.ambient},directional:{...e.lights.directional,...t.lights?.directional,position:{...e.lights.directional.position,...t.lights?.directional?.position}}}}:e,R=e=>(e.userData.isProxy=!0,e.userData.isExportable=!1,e),H=e=>(e.userData.isExportable=!1,e),At=e=>e.userData.isProxy===!0,pr=e=>{let t=e;for(;t;){if(t.userData.isExportable===!1)return!0;t=t.parent}return!1},fr=e=>!ve(e)||!e.visible||At(e)||pr(e)?!1:e.userData.isExportable!==!1,gr=e=>{const t=new c.Group;return t.name="Planara_OBJ_Export",e.updateMatrixWorld(!0),e.traverse(r=>{if(!fr(r))return;const s=r.clone(!1);s.geometry=r.geometry.clone(),Array.isArray(r.material)?s.material=r.material.map(i=>i.clone()):s.material=r.material.clone(),s.matrix.copy(r.matrixWorld),s.matrixAutoUpdate=!1,t.add(s)}),t},xt=e=>{const r=new or().parse(e);r.updateMatrixWorld(!0);const s=[];return r.traverse(i=>{if(!ve(i))return;const n=i.geometry.clone();n.applyMatrix4(i.matrixWorld),n.computeBoundingBox();const o=n.boundingBox;if(!o)return;const l=new c.Vector3;o.getCenter(l),n.translate(-l.x,-l.y,-l.z),n.computeBoundingBox(),n.computeBoundingSphere(),n.computeVertexNormals();const d=n.getAttribute("position");d&&d.setUsage&&d.setUsage(c.DynamicDrawUsage);const u=new c.Mesh(n,mt.clone());u.position.copy(l),u.layers.enable(k);const p=n.index?n.toNonIndexed():n,m=H(St(p));m.layers.enable(k),u.add(m);const f=H(wt(p));f.layers.enable(k),u.add(f),s.push(u)}),s},vr={background:{color:1710618,transparent:!1},camera:{fov:45,near:.1,far:1e3,position:{x:1,y:1,z:7}},renderer:{antialias:!0,alpha:!1},lights:{ambient:{enabled:!0,color:16777215,intensity:.5},directional:{enabled:!0,color:16777215,intensity:1,position:{x:5,y:10,z:7}}}};var br=Object.getOwnPropertyDescriptor,Mr=(e,t,r,s)=>{for(var i=s>1?void 0:s?br(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},jt=(e,t)=>(r,s)=>t(r,s,e);w.Renderer=class{constructor(t,r){if(this._config=r,this.canvas=t,this.scene=new c.Scene,this._config.background.transparent?this.scene.background=null:this.scene.background=new c.Color(this._config.background.color),this.camera=new c.PerspectiveCamera(this._config.camera.fov,this.canvas.clientWidth/this.canvas.clientHeight,this._config.camera.near,this._config.camera.far),this.camera.position.set(this._config.camera.position.x,this._config.camera.position.y,this._config.camera.position.z),this.renderer=new c.WebGLRenderer({canvas:this.canvas,antialias:this._config.renderer.antialias,alpha:this._config.background.transparent||this._config.renderer.alpha}),this.renderer.setSize(this.canvas.clientWidth,this.canvas.clientHeight),this._config.background.transparent?this.renderer.setClearAlpha(0):this.renderer.setClearColor(this._config.background.color,1),this._config.lights.ambient.enabled){const s=new c.AmbientLight(this._config.lights.ambient.color,this._config.lights.ambient.intensity);this.scene.add(H(s))}if(this._config.lights.directional.enabled){const s=new c.DirectionalLight(this._config.lights.directional.color,this._config.lights.directional.intensity);s.position.set(this._config.lights.directional.position.x,this._config.lights.directional.position.y,this._config.lights.directional.position.z),this.scene.add(H(s))}}scene;camera;renderer;canvas;resize(){this.camera.aspect=this.canvas.clientWidth/this.canvas.clientHeight,this.camera.updateProjectionMatrix(),this.renderer.setSize(this.canvas.clientWidth,this.canvas.clientHeight)}render(){this.renderer.render(this.scene,this.camera)}update(){}loop(){this.update(),this.render(),requestAnimationFrame(()=>this.loop())}getCamera(){return this.camera}getRenderer(){return this.renderer}getCanvas(){return this.canvas}getDomElement(){return this.renderer.domElement}getScene(){return this.scene}getRendererInfo(){const t=this.renderer.info;return{drawCalls:t.render.calls,triangles:t.render.triangles,geometries:t.memory.geometries,textures:t.memory.textures}}dispose(){this.scene=null,this.camera=null,this.renderer?.dispose(),this.canvas=null}},w.Renderer=Mr([a.injectable(),jt(0,a.inject("Canvas")),jt(1,a.inject("RendererConfig"))],w.Renderer);class wr{_positions=[];_normals=[];_uvs=[];_tmpPositions=[];_tmpNormals=[];_tmpUVs=[];load(t){const r=t.split(`
|
|
6
|
+
`);for(const i of r){if(!i.trim()||i.startsWith("#"))continue;const n=i.trim().split(/\s+/);switch(n[0]){case"v":this._tmpPositions.push(n.slice(1).map(Number));break;case"vn":this._tmpNormals.push(n.slice(1).map(Number));break;case"vt":this._tmpUVs.push(n.slice(1).map(Number));break;case"f":this.processFaceLine(n);break}}const s={type:h.FigureType.Custom,position:this._positions,...this._normals.length>0&&{normal:this._normals},...this._uvs.length>0&&{uv:this._uvs}};return new h.Figure(s)}processFaceLine(t){for(let r=1;r<t.length;r++){const s=t[r];if(!s)continue;const[i,n,o]=s.split("/"),l=i?parseInt(i,10):void 0,d=n?parseInt(n,10):void 0,u=o?parseInt(o,10):void 0;if(l!==void 0){const p=this._tmpPositions[l-1];p&&this._positions.push(...p)}if(d!==void 0){const p=this._tmpUVs[d-1];p&&this._uvs.push(...p)}if(u!==void 0){const p=this._tmpNormals[u-1];p&&this._normals.push(...p)}}}}var Sr=Object.getOwnPropertyDescriptor,Ar=(e,t,r,s)=>{for(var i=s>1?void 0:s?Sr(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},G=(e,t)=>(r,s)=>t(r,s,e);let be=class{constructor(e,t,r,s,i){this._updatable=e,this._renderable=t,this._observers=r,this._runtime=s,this._renderer=i}_animationId=null;start(){const e=[...this._runtime,...this._updatable,...this._renderable];new Set(e).forEach(t=>t.init()),this._loop()}_loop(){this._updatable.forEach(e=>e.update()),this._renderer.render(),this._renderable.forEach(e=>e.render()),this._observers.forEach(e=>e.observe()),this._animationId=requestAnimationFrame(()=>this._loop())}stop(){this._animationId&&(cancelAnimationFrame(this._animationId),this._animationId=null)}dispose(){this._animationId=null}};be=Ar([a.injectable(),G(0,a.injectAll("IUpdatableModule",{isOptional:!0})),G(1,a.injectAll("IRenderableModule",{isOptional:!0})),G(2,a.injectAll("IObserverModule",{isOptional:!0})),G(3,a.injectAll("IRuntimeModule",{isOptional:!0})),G(4,a.inject("IRenderable"))],be);var xr=Object.getOwnPropertyDescriptor,jr=(e,t,r,s)=>{for(var i=s>1?void 0:s?xr(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},yr=(e,t)=>(r,s)=>t(r,s,e);let Me=class{constructor(e){this._controlsModule=e}isOrbitInteracting(){return this._controlsModule.isOrbitInteracting()}isTransformDragging(){return this._controlsModule.isTransformDragging()}};Me=jr([a.injectable(),yr(0,a.inject("ControlsModule"))],Me);var Ir=Object.getOwnPropertyDescriptor,Cr=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ir(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Or=(e,t)=>(r,s)=>t(r,s,e);let we=class{constructor(e){this._sceneModule=e}addMesh(e){this._sceneModule.addMesh(e)}addMeshes(e){this._sceneModule.addMeshes(e)}removeMesh(e){this._sceneModule.removeMesh(e)}removeMeshes(e){this._sceneModule.removeMeshes(e)}getMeshes(){return this._sceneModule.getMeshes()}};we=Cr([a.injectable(),Or(0,a.inject("SceneModule"))],we);var Pr=Object.getOwnPropertyDescriptor,Tr=(e,t,r,s)=>{for(var i=s>1?void 0:s?Pr(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Lr=(e,t)=>(r,s)=>t(r,s,e);let Se=class{constructor(e){this._raycastModule=e}setRaycastMode(e){this._raycastModule.setRaycastMode(e)}};Se=Tr([a.injectable(),Lr(0,a.inject("RaycastModule"))],Se);var Dr=Object.getOwnPropertyDescriptor,Er=(e,t,r,s)=>{for(var i=s>1?void 0:s?Dr(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Vr=(e,t)=>(r,s)=>t(r,s,e);let Ae=class{constructor(e){this._controlsModule=e}attachTransform(e){this._controlsModule.attachTransform(e)}detachTransform(){this._controlsModule.detachTransform()}setTransformMode(e){this._controlsModule.setTransformMode(e)}onTransformChange(e){return this._controlsModule.onTransformChange(e)}};Ae=Er([a.injectable(),Vr(0,a.inject("ControlsModule"))],Ae);var Br=Object.getOwnPropertyDescriptor,Fr=(e,t,r,s)=>{for(var i=s>1?void 0:s?Br(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},$r=(e,t)=>(r,s)=>t(r,s,e);let xe=class{constructor(e){this._interactive=e}isInteractionEnabled(){return this._interactive.every(e=>e.isInteractionEnabled())}setInteractionEnabled(e){this._interactive.forEach(t=>t.setInteractionEnabled(e))}};xe=Fr([a.injectable(),$r(0,a.injectAll("IInteractiveModule"))],xe);var kr=Object.getOwnPropertyDescriptor,Hr=(e,t,r,s)=>{for(var i=s>1?void 0:s?kr(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Rr=(e,t)=>(r,s)=>t(r,s,e);let je=class{constructor(e){this._cameraAccessApi=e}getCamera(){return this._cameraAccessApi.getCamera()}enableCameraLayer(e){this._cameraAccessApi.getCamera().layers.enable(e)}disableCameraLayer(e){this._cameraAccessApi.getCamera().layers.disable(e)}};je=Hr([a.injectable(),Rr(0,a.inject("IRendererCameraAccess"))],je);var Gr=Object.getOwnPropertyDescriptor,zr=(e,t,r,s)=>{for(var i=s>1?void 0:s?Gr(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Wr=(e,t)=>(r,s)=>t(r,s,e);let ye=class{constructor(e){this._domAccessApi=e}getCanvas(){return this._domAccessApi.getCanvas()}getDomElement(){return this._domAccessApi.getDomElement()}};ye=zr([a.injectable(),Wr(0,a.inject("IRendererDomAccess"))],ye);var Nr=Object.getOwnPropertyDescriptor,Ur=(e,t,r,s)=>{for(var i=s>1?void 0:s?Nr(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Xr=(e,t)=>(r,s)=>t(r,s,e);let Ie=class{constructor(e){this._sceneAccessApi=e}getScene(){return this._sceneAccessApi.getScene()}addToScene(e){this._sceneAccessApi.getScene().add(e)}removeFromScene(e,t){this._sceneAccessApi.getScene().remove(e),t&&this._disposeObject(e)}addObject(e,t){const r=this._sceneAccessApi.getScene();r&&(typeof t=="number"&&e.layers.set(t),r.add(e))}_disposeObject(e){e.traverse(t=>{if(t instanceof c.Mesh){if(t.geometry.dispose(),Array.isArray(t.material)){t.material.forEach(r=>this._disposeMaterial(r));return}this._disposeMaterial(t.material)}})}_disposeMaterial(e){Object.values(e).forEach(t=>{t instanceof c.Texture&&t.dispose()}),e.dispose()}};Ie=Ur([a.injectable(),Xr(0,a.inject("IRendererSceneAccess"))],Ie);var qr=Object.getOwnPropertyDescriptor,Yr=(e,t,r,s)=>{for(var i=s>1?void 0:s?qr(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Kr=(e,t)=>(r,s)=>t(r,s,e);let Ce=class{constructor(e){this._rendererInfoAccess=e}getRendererInfo(){return this._rendererInfoAccess.getRendererInfo()}};Ce=Yr([a.injectable(),Kr(0,a.inject("IRendererInfoAccess"))],Ce);var Zr=Object.getOwnPropertyDescriptor,Jr=(e,t,r,s)=>{for(var i=s>1?void 0:s?Zr(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Oe=(e,t)=>(r,s)=>t(r,s,e);let Q=class{constructor(e,t,r){this._cameraApi=e,this._domApi=t,this._sceneApi=r}_orbit=null;_transform=null;_transformHelper=null;_transformListeners=new Set;_isEventListenersAdded=!1;_isInteractionEnabled=!0;init(){this._orbit=new q.OrbitWithState(this._cameraApi.getCamera(),this._domApi.getDomElement()),this._orbit.enableDamping=!0,this._orbit.dampingFactor=.05,this._transform=new q.ModelingTransformControls(this._cameraApi.getCamera(),this._domApi.getDomElement()),this._transformHelper=this._transform.getHelper(),this._sceneApi.addToScene(H(this._transformHelper)),this._initMouseListeners()}attachTransform(e){this._transform?.attach(e)}detachTransform(){this._transform?.detach()}update(){this._orbit?.update()}setTransformMode(e){this._transform?.setMode(e)}onTransformChange(e){return this._transformListeners.add(e),()=>this._transformListeners.delete(e)}isOrbitInteracting(){return!!this._orbit?.isInteracting}isTransformDragging(){return!!this._transform?.dragging}setInteractionEnabled(e){this._isInteractionEnabled=e,this._orbit&&(this._orbit.enabled=e),this._transform&&(this._transform.enabled=e),e||this._transform?.detach()}isInteractionEnabled(){return this._isInteractionEnabled}_handlePointerDown=e=>{this._isInteractionEnabled&&this._transform?.pointerDown(e)};_handlePointerMove=e=>{this._isInteractionEnabled&&this._transform?.pointerMove(e)};_handlePointerUp=e=>{this._isInteractionEnabled&&this._transform?.pointerUp(e)};_handlePointerLeave=()=>{this._isInteractionEnabled&&this._transform?.pointerHover(null)};_handleDraggingChanged=()=>{this._orbit&&(this._orbit.enabled=this._isInteractionEnabled&&!this._transform?.dragging)};_handleObjectChange=()=>{for(const e of this._transformListeners)e()};_initMouseListeners(){const e=this._domApi.getCanvas();!this._transform||!this._orbit||(e.addEventListener("pointerdown",this._handlePointerDown),e.addEventListener("pointermove",this._handlePointerMove),e.addEventListener("pointerup",this._handlePointerUp),e.addEventListener("pointerleave",this._handlePointerLeave),this._transform.addEventListener("dragging-changed",this._handleDraggingChanged),this._transform.addEventListener("objectChange",this._handleObjectChange),this._isEventListenersAdded=!0)}dispose(){if(this._isEventListenersAdded){const e=this._domApi.getCanvas();this._transform&&(this._transform.removeEventListener("dragging-changed",this._handleDraggingChanged),this._transform.removeEventListener("objectChange",this._handleObjectChange)),e.removeEventListener("pointerdown",this._handlePointerDown),e.removeEventListener("pointermove",this._handlePointerMove),e.removeEventListener("pointerup",this._handlePointerUp),e.removeEventListener("pointerleave",this._handlePointerLeave),this._transformListeners.clear(),this._isEventListenersAdded=!1,this._isInteractionEnabled=!0}this._orbit?.dispose(),this._orbit=null,this._transform?.dispose(),this._transform=null,this._transformHelper?.parent&&this._transformHelper.parent.remove(this._transformHelper)}};Q=Jr([a.injectable(),Oe(0,a.inject("ICameraApi")),Oe(1,a.inject("IDomApi")),Oe(2,a.inject("ISceneApi"))],Q);var Qr=Object.getOwnPropertyDescriptor,es=(e,t,r,s)=>{for(var i=s>1?void 0:s?Qr(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Pe=(e,t)=>(r,s)=>t(r,s,e);let Te=class{constructor(e,t,r){this._cameraApi=e,this._domApi=t,this._rendererApi=r}_cameraGizmo=null;_isInteractionEnabled=!0;setInteractionEnabled(e){this._isInteractionEnabled=e,this._cameraGizmo?.setVisible(e)}isInteractionEnabled(){return this._isInteractionEnabled}init(){const e=this._cameraApi.getCamera(),t=this._rendererApi.getRenderer();this._cameraGizmo=new q.CameraAxesGizmo(t,e,{size:96,margin:36})}render(){if(!this._isInteractionEnabled)return;const e=this._domApi.getCanvas();this._cameraGizmo?.render(e.width,e.height)}dispose(){this._cameraGizmo?.dispose(),this._cameraGizmo=null}};Te=es([a.injectable(),Pe(0,a.inject("ICameraApi")),Pe(1,a.inject("IDomApi")),Pe(2,a.inject("IRendererAccess"))],Te);var ts=Object.getOwnPropertyDescriptor,rs=(e,t,r,s)=>{for(var i=s>1?void 0:s?ts(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};w.EventBus=class{_emitter;constructor(){this._emitter=new Qt.EventEmitter}emit(t,r){this._emitter.emit(t,r)}on(t,r){this._emitter.on(t,r)}off(t,r){this._emitter.off(t,r)}},w.EventBus=rs([a.injectable()],w.EventBus);var B=(e=>(e.SelectHover="select.hover",e.SelectClick="select.click",e))(B||{}),ss=Object.getOwnPropertyDescriptor,is=(e,t,r,s)=>{for(var i=s>1?void 0:s?ss(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},z=(e,t)=>(r,s)=>t(r,s,e);let Le=class{constructor(e,t,r,s,i){this._domApi=e,this._cameraApi=t,this._meshApi=r,this._controlsState=s,this._bus=i}_raycaster;_mouse;_lastHoverKey=null;_currentRaycastMode=h.SelectMode.Mesh;_isEventListenersAdded=!1;_isInteractionEnabled=!0;init(){this._raycaster=new c.Raycaster,this._mouse=new c.Vector2,this._applyRaycastParamsByMode(),this._isEventListenersAdded||(this._initMouseListeners(),this._isEventListenersAdded=!0)}setRaycastMode(e){if(this._currentRaycastMode===e)return;const t=this._raycaster;t.params.Line.threshold=0,t.params.Points.threshold=0,this._currentRaycastMode=e,this._lastHoverKey=null,this._applyRaycastParamsByMode()}setInteractionEnabled(e){this._isInteractionEnabled=e,e||this._clearState()}isInteractionEnabled(){return this._isInteractionEnabled}_clearState(){this._meshApi.getMeshes().forEach(t=>{t.userData.isHit=!1}),this._lastHoverKey=null,this._bus.emit(B.SelectHover,null),this._bus.emit(B.SelectClick,null)}_applyRaycastParamsByMode(){const e=this._raycaster;switch(e.params.Line.threshold=0,e.params.Points.threshold=0,this._currentRaycastMode){case h.SelectMode.Mesh:case h.SelectMode.Face:e.layers.set(k);break;case h.SelectMode.Edge:e.layers.set(pt),e.params.Line.threshold=dr;break;case h.SelectMode.Vertex:e.layers.set(ft),e.params.Points.threshold=ur;break}}_getHitIntersection(e){const t=this._controlsState.isOrbitInteracting()||this._controlsState.isTransformDragging(),r=this._domApi.getCanvas(),s=this._cameraApi.getCamera(),i=this._meshApi.getMeshes();if(t)return;const n=r.getBoundingClientRect();this._mouse.x=(e.clientX-n.left)/n.width*2-1,this._mouse.y=-((e.clientY-n.top)/n.height)*2+1,this._raycaster.setFromCamera(this._mouse,s);const o=this._raycaster.intersectObjects(i,!0)[0]??null;if(this._currentRaycastMode===h.SelectMode.Mesh||this._currentRaycastMode===h.SelectMode.Face)return o;const l=this._raycaster.layers.mask;this._raycaster.layers.set(k);const d=this._raycaster.intersectObjects(i,!0)[0]??null;return this._raycaster.layers.mask=l,this._getVisibleHit(o,d)}_processRaycastEvent(e,t,r){const s=this._getHitIntersection(e),i=this._meshApi.getMeshes();if(s===void 0)return;const n=s?.object??null;if(r){if(!s){i.forEach(l=>l.userData.isHit=!1),this._lastHoverKey=null,this._bus.emit(t,null);return}const o=this._makeHoverKey(s);o!==this._lastHoverKey&&(i.forEach(l=>l.userData.isHit=!1),n&&(n.userData.isHit=!0),this._lastHoverKey=o,this._bus.emit(t,{intersection:s}));return}s&&this._bus.emit(t,{intersection:s})}_getVisibleHit(e,t,r=1e-4){return e?t?e.distance<=t.distance+r?e:null:e:null}_makeHoverKey(e){if(!e)return null;const t=e.object.uuid;switch(this._currentRaycastMode){case h.SelectMode.Face:return`${t}:face:${e.faceIndex??-1}`;case h.SelectMode.Edge:return`${t}:edge:${Math.floor((e.index??-1)/2)}`;case h.SelectMode.Vertex:return`${t}:vertex:${e.index??-1}`;case h.SelectMode.Mesh:default:return`${t}:mesh`}}_handleMouseMove=e=>{this._isInteractionEnabled&&this._processRaycastEvent(e,B.SelectHover,!0)};_handleMouseClick=e=>{this._isInteractionEnabled&&this._processRaycastEvent(e,B.SelectClick,!1)};_handleDoubleClick=e=>{if(!this._isInteractionEnabled)return;const t=this._getHitIntersection(e);t!==void 0&&(t||this._bus.emit(B.SelectClick,null))};_handleMouseLeave=()=>{this._isInteractionEnabled&&(this._lastHoverKey=null,this._bus.emit(B.SelectHover,null))};_initMouseListeners(){const e=this._domApi.getCanvas();e.addEventListener("mousemove",this._handleMouseMove,!1),e.addEventListener("click",this._handleMouseClick,!1),e.addEventListener("dblclick",this._handleDoubleClick,!1),e.addEventListener("mouseleave",this._handleMouseLeave),this._isEventListenersAdded=!0}_removeMouseListeners(){const e=this._domApi.getCanvas();e.removeEventListener("mousemove",this._handleMouseMove),e.removeEventListener("click",this._handleMouseClick),e.removeEventListener("dblclick",this._handleDoubleClick),e.removeEventListener("mouseleave",this._handleMouseLeave)}dispose(){this._removeMouseListeners(),this._isEventListenersAdded=!1,this._isInteractionEnabled=!0,this._lastHoverKey=null}};Le=is([a.injectable(),z(0,a.inject("IDomApi")),z(1,a.inject("ICameraApi")),z(2,a.inject("IMeshApi")),z(3,a.inject("IControlsStateApi")),z(4,a.inject("EventBus"))],Le);var ns=Object.getOwnPropertyDescriptor,os=(e,t,r,s)=>{for(var i=s>1?void 0:s?ns(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},as=(e,t)=>(r,s)=>t(r,s,e);let De=class{constructor(e){this._api=e}_meshes=[];_grid=null;_axes=null;_light=null;init(){this._grid=new c.GridHelper(10,10),this._grid.position.y=-.001,this._api.addToScene(this._grid),this._axes=new q.SymmetricAxesHelper(6),this._api.addToScene(this._axes),this._light=new c.HemisphereLight(16777215,4473924,.6),this._api.addToScene(this._light)}getMeshes(){return this._meshes}addMesh(e){this._meshes.includes(e)||(this._meshes.push(e),this._api.addToScene(e))}removeMesh(e){const t=this._meshes.indexOf(e);t>=0&&this._meshes.splice(t,1),this._api.removeFromScene(e)}addMeshes(e){for(const t of e)this.addMesh(t)}removeMeshes(e){for(const t of e)this.removeMesh(t)}dispose(){for(const e of this._meshes)this._api.removeFromScene(e);this._meshes.length=0,this._grid&&(this._api.removeFromScene(this._grid),this._grid.geometry.dispose(),this._grid.material.dispose(),this._grid=null),this._axes&&(this._api.removeFromScene(this._axes),this._axes=null),this._light&&(this._api.removeFromScene(this._light),this._light=null)}};De=os([a.injectable(),as(0,a.inject("ISceneApi"))],De);var cs=Object.getOwnPropertyDescriptor,ls=(e,t,r,s)=>{for(var i=s>1?void 0:s?cs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},hs=(e,t)=>(r,s)=>t(r,s,e);let Ee=class{constructor(e){this._api=e}_meshes=[];_light=null;init(){this._light=new c.HemisphereLight(16777215,4473924,.6),this._api.addToScene(this._light)}getMeshes(){return this._meshes}addMesh(e){this._meshes.includes(e)||(this._meshes.push(e),this._api.addToScene(e))}removeMesh(e){const t=this._meshes.indexOf(e);t>=0&&this._meshes.splice(t,1),this._api.removeFromScene(e)}addMeshes(e){for(const t of e)this.addMesh(t)}removeMeshes(e){for(const t of e)this.removeMesh(t)}dispose(){for(const e of this._meshes)this._api.removeFromScene(e);this._meshes.length=0,this._light&&(this._api.removeFromScene(this._light),this._light=null)}};Ee=ls([a.injectable(),hs(0,a.inject("ISceneApi"))],Ee);var ds=Object.getOwnPropertyDescriptor,us=(e,t,r,s)=>{for(var i=s>1?void 0:s?ds(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},_s=(e,t)=>(r,s)=>t(r,s,e);let Ve=class{constructor(e){this._rendererInfoApi=e}_isRunning=!1;_startedAt=0;_stoppedAt=0;_lastFrameAt=0;_frames=0;_frameTimeSum=0;_maxFrameTime=0;_objectsCount=0;_drawCalls=0;_triangles=0;_geometries=0;_textures=0;_memoryUsedMb=void 0;_listeners=new Set;_lastNotifyAt=0;_notifyIntervalMs=250;init(){this.reset()}start(e=0){this.reset();const t=performance.now();this._isRunning=!0,this._startedAt=t,this._lastFrameAt=t,this._objectsCount=e}stop(){this._isRunning&&(this._isRunning=!1,this._stoppedAt=performance.now(),this._captureRendererInfo(),this._captureMemoryInfo())}reset(){this._isRunning=!1,this._startedAt=0,this._stoppedAt=0,this._lastFrameAt=0,this._frames=0,this._frameTimeSum=0,this._maxFrameTime=0,this._objectsCount=0,this._drawCalls=0,this._triangles=0,this._geometries=0,this._textures=0,this._memoryUsedMb=void 0,this._lastNotifyAt=0}observe(){if(!this._isRunning)return;const e=performance.now(),t=e-this._lastFrameAt;this._lastFrameAt=e,!(t<=0)&&(this._frames+=1,this._frameTimeSum+=t,this._maxFrameTime=Math.max(this._maxFrameTime,t),this._captureRendererInfo(),this._captureMemoryInfo(),this._notify())}getMetrics(){const e=this._getDurationMs(),t=this._frames>0?this._frameTimeSum/this._frames:0,r={durationMs:e,frames:this._frames,averageFps:t>0?1e3/t:0,minFps:this._maxFrameTime>0?1e3/this._maxFrameTime:0,averageFrameTime:t,maxFrameTime:this._maxFrameTime,objectsCount:this._objectsCount,drawCalls:this._drawCalls,triangles:this._triangles,geometries:this._geometries,textures:this._textures};return this._memoryUsedMb!==void 0&&(r.memoryUsedMb=this._memoryUsedMb),r}subscribe(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}dispose(){this.reset()}_getDurationMs(){if(!this._startedAt)return 0;const e=this._isRunning?performance.now():this._stoppedAt;return Math.max(0,e-this._startedAt)}_captureRendererInfo(){const e=this._rendererInfoApi.getRendererInfo();this._drawCalls=Math.max(this._drawCalls,e.drawCalls),this._triangles=Math.max(this._triangles,e.triangles),this._geometries=Math.max(this._geometries,e.geometries),this._textures=Math.max(this._textures,e.textures)}_captureMemoryInfo(){const e=performance.memory;e&&(this._memoryUsedMb=e.usedJSHeapSize/1024/1024)}_notify(){if(this._listeners.size===0)return;const e=performance.now();if(e-this._lastNotifyAt<this._notifyIntervalMs)return;this._lastNotifyAt=e;const t=this.getMetrics();this._listeners.forEach(r=>r(t))}};Ve=us([a.injectable(),_s(0,a.inject("IRendererInfoApi"))],Ve);var P=(e=>(e[e.Display=0]="Display",e[e.Scene=1]="Scene",e[e.Select=2]="Select",e[e.Tool=3]="Tool",e[e.Benchmark=4]="Benchmark",e))(P||{}),ms=Object.getOwnPropertyDescriptor,ps=(e,t,r,s)=>{for(var i=s>1?void 0:s?ms(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},yt=(e,t)=>(r,s)=>t(r,s,e);let Be=class{constructor(e,t){this._store=t,this._handlers=new Map(e.map(r=>[r.mode,r]))}_currentMode=h.DisplayMode.Plane;_handlers;type=P.Display;manage(e){e!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),e!==h.DisplayMode.Plane&&this._handlers.get(e)?.handle(),this._currentMode=e,this._store.setDisplayMode(this._currentMode))}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=h.DisplayMode.Plane,this._store.setDisplayMode(this._currentMode)}};Be=ps([a.injectable(),yt(0,a.injectAll("IDisplayHandler")),yt(1,a.inject("EditorStore"))],Be);var fs=Object.getOwnPropertyDescriptor,gs=(e,t,r,s)=>{for(var i=s>1?void 0:s?fs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},vs=(e,t)=>(r,s)=>t(r,s,e);let Fe=class{_currentMode=h.SceneMode.AddFigure;_handlers;type=P.Scene;constructor(e){this._handlers=new Map(e.map(t=>[t.mode,t]))}manage(e,t){this._handlers.get(e)?.handle(t),this._currentMode=e}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=h.SceneMode.AddFigure}};Fe=gs([a.injectable(),vs(0,a.injectAll("ISceneHandler"))],Fe);var F=(e=>(e.Hover="hover",e.Click="click",e))(F||{}),bs=Object.getOwnPropertyDescriptor,Ms=(e,t,r,s)=>{for(var i=s>1?void 0:s?bs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},$e=(e,t)=>(r,s)=>t(r,s,e);let ke=class{constructor(e,t,r){this._eventBus=e,this._store=r,this._handlers=new Map(t.map(s=>[s.mode,s])),this._eventBus.on(B.SelectHover,this._onHover),this._eventBus.on(B.SelectClick,this._onClick)}_currentMode=h.SelectMode.Mesh;_handlers;type=P.Select;manage(e){e!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),this._currentMode=e,this._store.setSelectMode(this._currentMode))}_onHover=e=>{this._handlers.get(this._currentMode)?.handle(e,F.Hover)};_onClick=e=>{this._handlers.get(this._currentMode)?.handle(e,F.Click)};dispose(){this._handlers&&this._handlers.clear(),this._eventBus.off(B.SelectHover,this._onHover),this._currentMode=h.SelectMode.Mesh,this._store.setSelectMode(this._currentMode)}};ke=Ms([a.injectable(),$e(0,a.inject("EventBus")),$e(1,a.injectAll("ISelectHandler")),$e(2,a.inject("EditorStore"))],ke);const ws=e=>(t,r,s)=>{const i=s.value;if(!i)throw new Error("usePolicy can only be applied to method");return s.value=function(...n){return e(this).check(...n),i.apply(this,n)},s},It=e=>(t,r,s)=>{const i=s.value;if(!i)throw new Error("useValidator can only be applied to method");return s.value=function(...n){return e(this).validate(...n),i.apply(this,n)},s};var Ss=Object.defineProperty,As=Object.getOwnPropertyDescriptor,Ct=(e,t,r,s)=>{for(var i=s>1?void 0:s?As(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=(s?o(t,r,i):o(i))||i);return s&&i&&Ss(t,r,i),i},He=(e,t)=>(r,s)=>t(r,s,e);let ee=class{constructor(e,t,r){this._store=t,this._policy=r,this._handlers=new Map(e.map(s=>[s.mode,s])),this._unsubSelected=this._store.onSelectedObjectChange(()=>{this._handlers.get(this._currentTool)?.handle()})}_currentTool=h.ToolType.Translate;_handlers;_unsubSelected;type=P.Tool;manage(e){this._currentTool!==e&&(this._handlers.get(this._currentTool)?.rollback(),this._currentTool=e,this._store.setToolType(this._currentTool),this._handlers.get(this._currentTool)?.handle())}dispose(){this._unsubSelected?.(),this._handlers&&this._handlers.clear(),this._currentTool=h.ToolType.Translate,this._store.setToolType(this._currentTool)}};Ct([ws(e=>e._policy)],ee.prototype,"manage",1),ee=Ct([a.injectable(),He(0,a.injectAll("IToolHandler")),He(1,a.inject("EditorStore")),He(2,a.inject("ToolPolicy"))],ee);var xs=Object.getOwnPropertyDescriptor,js=(e,t,r,s)=>{for(var i=s>1?void 0:s?xs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},ys=(e,t)=>(r,s)=>t(r,s,e);let Re=class{type=P.Benchmark;_currentMode=h.BenchmarkTestType.Light;_handlers;constructor(e){this._handlers=new Map(e.map(t=>[t.mode,t]))}manage(e,t){this._handlers.get(this._currentMode)?.rollback(),this._currentMode=e,this._handlers.get(this._currentMode)?.handle(t)}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=h.BenchmarkTestType.Light}};Re=js([a.injectable(),ys(0,a.injectAll("IBenchmarkHandler"))],Re);var Is=Object.getOwnPropertyDescriptor,Cs=(e,t,r,s)=>{for(var i=s>1?void 0:s?Is(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Os=(e,t)=>(r,s)=>t(r,s,e);let Ge=class{constructor(e){this._api=e}mode=h.DisplayMode.Wireframe;_prevWireframe=new Map;_prevColorMesh=new Map;_prevColorLines=new Map;_wireColor=new c.Color(65535);handle(){const e=this._api.getMeshes();for(const t of e){const r=Array.isArray(t.material)?t.material:[t.material];for(const s of r)this._enableWireframeOnMaterial(s);t.traverse(s=>{if(s.isLineSegments){const i=s;if(!this._prevColorLines.has(i.material)){const o=i.material;this._prevColorLines.set(o,o.color.clone())}const n=i.material;n.color.copy(this._wireColor),n.needsUpdate=!0}})}}rollback(){for(const[e,t]of this._prevWireframe)"wireframe"in e&&(e.wireframe=t),e.needsUpdate=!0;this._prevWireframe.clear();for(const[e,t]of this._prevColorMesh){const r=e;r.color?.isColor&&r.color.copy(t)}this._prevColorMesh.clear();for(const[e,t]of this._prevColorLines)e.color.copy(t);this._prevColorLines.clear()}dispose(){this.rollback()}_enableWireframeOnMaterial(e){const t=e;"wireframe"in t&&!this._prevWireframe.has(e)&&(this._prevWireframe.set(e,!!t.wireframe),t.wireframe=!0,e.needsUpdate=!0),t.color?.isColor&&(this._prevColorMesh.has(e)||this._prevColorMesh.set(e,t.color.clone()),t.color.copy(this._wireColor))}};Ge=Cs([a.injectable(),Os(0,a.inject("IMeshApi"))],Ge);var Ps=Object.getOwnPropertyDescriptor,Ts=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ps(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},te=(e,t)=>(r,s)=>t(r,s,e);let ze=class{constructor(e,t,r,s){this._sceneApi=e,this._cameraApi=t,this._raycastApi=r,this._store=s,this._cameraApi.enableCameraLayer(D),this._hoverLine=R(this._makeOverlayLine(this._hoverColor)),this._selectLine=R(this._makeOverlayLine(this._selectColor)),this._sceneApi.addObject(this._hoverLine,D),this._sceneApi.addObject(this._selectLine,D)}mode=h.SelectMode.Edge;_hoverLine;_selectLine;_hovered=null;_selected=null;_hoverColor=Z;_selectColor=J;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===F.Hover){if(!e){this._hoverLine.visible=!1,this._hovered=null;return}const r=e.intersection.object;if(!r?.isLineSegments)return;const s=r,i=Math.floor((e.intersection.index??-1)/2);if(i<0)return;this._selected&&this._same({lines:s,seg:i},this._selected)?this._hoverLine.visible=!1:(this._writeWorldSegment(this._hoverLine,s,i),this._hoverLine.visible=!0),this._hovered={lines:s,seg:i};return}if(t===F.Click){if(!e){this._selectLine.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const r=e.intersection.object;if(!r?.isLineSegments)return;const s=r,i=Math.floor((e.intersection.index??-1)/2);if(i<0)return;this._writeWorldSegment(this._selectLine,s,i),this._centerAndOrientLineOnSegment(this._selectLine,s,i),this._selectLine.visible=!0,this._prepareEdgeMetadata(s,i),this._store.setSelectedObject(this._selectLine),this._selected={lines:s,seg:i},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverLine.visible=!1)}}rollback(){this._hoverLine.visible=!1,this._selectLine.visible=!1,this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverLine),this._sceneApi.removeFromScene(this._selectLine),this._hoverLine.geometry.dispose(),this._hoverLine.material.dispose(),this._selectLine.geometry.dispose(),this._selectLine.material.dispose()}_makeOverlayLine(e){const t=new c.BufferGeometry;t.setAttribute("position",new c.Float32BufferAttribute(6,3));const r=new c.LineBasicMaterial({color:e,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),s=new c.Line(t,r);return s.renderOrder=1e3,s.raycast=()=>{},s.layers.set(D),s.visible=!1,s}_writeWorldSegment(e,t,r){const s=t.geometry.getAttribute("position"),i=r*2,n=i+1,o=new c.Vector3(s.getX(i),s.getY(i),s.getZ(i)).applyMatrix4(t.matrixWorld),l=new c.Vector3(s.getX(n),s.getY(n),s.getZ(n)).applyMatrix4(t.matrixWorld),d=e.geometry.getAttribute("position");d.setXYZ(0,o.x,o.y,o.z),d.setXYZ(1,l.x,l.y,l.z),d.needsUpdate=!0}_same(e,t){return!!e&&!!t&&e.lines===t.lines&&e.seg===t.seg}_centerAndOrientLineOnSegment(e,t,r){const s=t.geometry.getAttribute("position"),i=r*2,n=i+1,o=new c.Vector3(s.getX(i),s.getY(i),s.getZ(i)).applyMatrix4(t.matrixWorld),l=new c.Vector3(s.getX(n),s.getY(n),s.getZ(n)).applyMatrix4(t.matrixWorld),d=new c.Vector3().subVectors(l,o),u=d.length();if(!isFinite(u)||u===0)return;const p=new c.Vector3().addVectors(o,l).multiplyScalar(.5);e.position.copy(p);const m=e.geometry;let f=m.getAttribute("position");(!f||f.count<2)&&(m.setAttribute("position",new c.BufferAttribute(new Float32Array(6),3)),f=m.getAttribute("position")),f.setXYZ(0,-u/2,0,0),f.setXYZ(1,u/2,0,0),f.needsUpdate=!0,d.normalize();const g=new c.Quaternion().setFromUnitVectors(new c.Vector3(1,0,0),d);e.quaternion.copy(g),e.updateMatrixWorld(!0)}_prepareEdgeMetadata(e,t){const r=Mt(e);if(!r)return;const s=e.geometry.getAttribute("position"),i=t*2,n=i+1,o=new c.Vector3(s.getX(i),s.getY(i),s.getZ(i)).applyMatrix4(e.matrixWorld),l=new c.Vector3(s.getX(n),s.getY(n),s.getZ(n)).applyMatrix4(e.matrixWorld),d=new c.Matrix4().copy(r.matrixWorld).invert(),u=o.clone().applyMatrix4(d),p=l.clone().applyMatrix4(d),f=r.geometry.getAttribute("position"),g=new c.Vector3,_=1e-6,v=[],M=[];for(let I=0;I<f.count;I++)g.fromBufferAttribute(f,I),g.distanceToSquared(u)<_*_?v.push(I):g.distanceToSquared(p)<_*_&&M.push(I);const y=new c.Matrix4().copy(e.matrixWorld).invert(),j=o.clone().applyMatrix4(y),x=l.clone().applyMatrix4(y),S=e.geometry.getAttribute("position"),C=new c.Vector3,A=[],O=[];for(let I=0;I<S.count;I++)C.fromBufferAttribute(S,I),C.distanceToSquared(j)<_*_?A.push(I):C.distanceToSquared(x)<_*_&&O.push(I);this._selectLine.userData.edgeInfo={lines:e,seg:t,mesh:r,aIndices:v,bIndices:M,aEdgeIndices:A,bEdgeIndices:O}}};ze=Ts([a.injectable(),te(0,a.inject("ISceneApi")),te(1,a.inject("ICameraApi")),te(2,a.inject("IRaycastApi")),te(3,a.inject("EditorStore"))],ze);var Ls=Object.getOwnPropertyDescriptor,Ds=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ls(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},re=(e,t)=>(r,s)=>t(r,s,e);let We=class{constructor(e,t,r,s){this._cameraApi=e,this._sceneApi=t,this._raycastApi=r,this._store=s,this._cameraApi.enableCameraLayer(D),this._hoverFace=R(this._makeOverlayFace(this._hoverColor)),this._selectFace=R(this._makeOverlayFace(this._selectColor)),this._sceneApi.addObject(this._hoverFace,D),this._sceneApi.addObject(this._selectFace,D)}mode=h.SelectMode.Face;_hoverFace;_selectFace;_hovered=null;_selected=null;_hoverColor=Z;_selectColor=J;_normalEps=1e-4;_planeEps=1e-4;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===F.Hover){if(!e){this._hoverFace.visible=!1,this._hovered=null;return}const r=e.intersection.object;if(!r?.isMesh)return;const s=r,i=e.intersection.faceIndex??-1;if(i<0)return;const n=this._collectFaceGroup(s,i);if(!n)return;this._selected&&this._same(n,this._selected)?this._hoverFace.visible=!1:(this._writeWorldFaceGroup(this._hoverFace,n),this._hoverFace.visible=!0),this._hovered=n;return}if(t===F.Click){if(!e){this._selectFace.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const r=e.intersection.object;if(!r?.isMesh)return;const s=r,i=e.intersection.faceIndex??-1;if(i<0)return;const n=this._collectFaceGroup(s,i);if(!n)return;this._writeWorldFaceGroup(this._selectFace,n),this._centerFaceProxy(this._selectFace),this._selectFace.visible=!0,this._prepareFaceMetadata(n),this._store.setSelectedObject(this._selectFace),this._selected=n,this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverFace.visible=!1)}}rollback(){this._hoverFace.visible=!1,this._selectFace.visible=!1,this._resetFaceProxyTransform(this._selectFace),this._resetFaceProxyTransform(this._hoverFace),this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverFace),this._sceneApi.removeFromScene(this._selectFace),this._hoverFace.geometry.dispose(),this._hoverFace.material.dispose(),this._selectFace.geometry.dispose(),this._selectFace.material.dispose()}_makeOverlayFace(e){const t=new c.BufferGeometry,r=new c.MeshBasicMaterial({color:e,transparent:!0,opacity:.35,depthTest:!1,depthWrite:!1,side:c.DoubleSide,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1}),s=new c.Mesh(t,r);return s.renderOrder=1e3,s.layers.set(D),s.visible=!1,s.raycast=()=>{},s}_collectFaceGroup(e,t){const r=e.geometry,s=r.getAttribute("position");if(!s)return null;const i=r.index;if(!i){const S=t*3,C=t*3+1,A=t*3+2;return{mesh:e,faceIndex:t,triangleIndices:[t],vertexIndices:[S,C,A],proxyVertexMap:[S,C,A]}}const n=Math.floor(i.count/3);if(t<0||t>=n)return null;const o=this._buildTriangleAdjacency(i,s),[l,d,u]=this._getTriangleIndices(i,t),p=this._readVertex(s,l),m=this._readVertex(s,d),f=this._readVertex(s,u),g=new c.Vector3().subVectors(m,p).cross(new c.Vector3().subVectors(f,p)).normalize(),_=new c.Plane().setFromNormalAndCoplanarPoint(g,p),v=new Set,M=[],y=[t];for(;y.length>0;){const S=y.pop();if(v.has(S))continue;v.add(S);const[C,A,O]=this._getTriangleIndices(i,S),I=this._readVertex(s,C),E=this._readVertex(s,A),V=this._readVertex(s,O),$=new c.Vector3().subVectors(E,I).cross(new c.Vector3().subVectors(V,I)).normalize(),dn=Math.abs($.dot(g))>=1-this._normalEps,un=Math.abs(_.distanceToPoint(I))<this._planeEps&&Math.abs(_.distanceToPoint(E))<this._planeEps&&Math.abs(_.distanceToPoint(V))<this._planeEps;if(!dn||!un)continue;M.push(S);const Zt=o.get(S);if(Zt)for(const Jt of Zt)v.has(Jt)||y.push(Jt)}M.sort((S,C)=>S-C);const j=new Set,x=[];for(const S of M){const[C,A,O]=this._getTriangleIndices(i,S);j.add(C),j.add(A),j.add(O),x.push(C,A,O)}return{mesh:e,faceIndex:t,triangleIndices:M,vertexIndices:Array.from(j),proxyVertexMap:x}}_writeWorldFaceGroup(e,t){const r=t.mesh.geometry,s=r.getAttribute("position"),i=r.index,n=new Float32Array(t.triangleIndices.length*9);let o=0;for(const d of t.triangleIndices){let u,p,m;i?[u,p,m]=this._getTriangleIndices(i,d):(u=d*3,p=d*3+1,m=d*3+2);const f=this._readVertex(s,u).applyMatrix4(t.mesh.matrixWorld),g=this._readVertex(s,p).applyMatrix4(t.mesh.matrixWorld),_=this._readVertex(s,m).applyMatrix4(t.mesh.matrixWorld);n[o++]=f.x,n[o++]=f.y,n[o++]=f.z,n[o++]=g.x,n[o++]=g.y,n[o++]=g.z,n[o++]=_.x,n[o++]=_.y,n[o++]=_.z}const l=e.geometry;l.setAttribute("position",new c.BufferAttribute(n,3)),l.setIndex(null),l.computeVertexNormals(),l.computeBoundingBox(),l.computeBoundingSphere()}_same(e,t){return!!e&&!!t&&e.mesh===t.mesh&&e.triangleIndices.length===t.triangleIndices.length&&e.triangleIndices.every((r,s)=>r===t.triangleIndices[s])}_prepareFaceMetadata(e){const{vertexIndexGroups:t,proxyVertexMap:r,lines:s,lineVertexIndexGroups:i}=this._buildFaceVertexGroups(e);this._selectFace.userData.faceInfo={mesh:e.mesh,faceIndex:e.faceIndex,triangleIndices:e.triangleIndices,vertexIndices:e.vertexIndices,vertexIndexGroups:t,proxyVertexMap:r,lines:s,lineVertexIndexGroups:i}}_centerFaceProxy(e){const t=e.geometry,r=t.getAttribute("position");if(!r||r.count===0)return;const s=new c.Vector3;for(let i=0;i<r.count;i++)s.x+=r.getX(i),s.y+=r.getY(i),s.z+=r.getZ(i);s.multiplyScalar(1/r.count);for(let i=0;i<r.count;i++)r.setXYZ(i,r.getX(i)-s.x,r.getY(i)-s.y,r.getZ(i)-s.z);r.needsUpdate=!0,e.position.copy(s),e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0),t.computeBoundingBox(),t.computeBoundingSphere()}_pushEdge(e,t,r,s){const i=t<r?`${t}_${r}`:`${r}_${t}`,n=e.get(i);n?n.push(s):e.set(i,[s])}_buildTriangleAdjacency(e,t){const r=Math.floor(e.count/3),s=new Map,i=this._buildWeldMap(e,t);for(let l=0;l<r;l++){const[d,u,p]=this._getTriangleIndices(e,l),m=i.get(d),f=i.get(u),g=i.get(p);this._pushEdge(s,m,f,l),this._pushEdge(s,f,g,l),this._pushEdge(s,g,m,l)}const n=new Map;for(let l=0;l<r;l++)n.set(l,new Set);for(const l of s.values())if(!(l.length<2))for(let d=0;d<l.length;d++)for(let u=0;u<l.length;u++)d!==u&&n.get(l[d])?.add(l[u]);const o=new Map;for(const[l,d]of n)o.set(l,Array.from(d));return o}_getTriangleIndices(e,t){return[e.getX(t*3),e.getX(t*3+1),e.getX(t*3+2)]}_readVertex(e,t){return new c.Vector3(e.getX(t),e.getY(t),e.getZ(t))}_vertexKey(e,t,r=1e-6){const s=Math.round(e.getX(t)/r),i=Math.round(e.getY(t)/r),n=Math.round(e.getZ(t)/r);return`${s}_${i}_${n}`}_buildWeldMap(e,t){const r=new Map,s=new Map;let i=0;for(let n=0;n<e.count;n++){const o=e.getX(n);if(s.has(o))continue;const l=this._vertexKey(t,o);let d=r.get(l);d==null&&(d=i++,r.set(l,d)),s.set(o,d)}return s}_resetFaceProxyTransform(e){e.position.set(0,0,0),e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0)}_buildFaceVertexGroups(e){const r=e.mesh.geometry.getAttribute("position"),s=1e-6,i=new c.Vector3,n=e.vertexIndices,o=[],l=new Map;for(const f of n){const g=this._readVertex(r,f),_=[];for(let M=0;M<r.count;M++)i.fromBufferAttribute(r,M),i.distanceToSquared(g)<s*s&&_.push(M);const v=o.length;o.push(_);for(const M of _)l.set(M,v)}const d=[];for(const f of e.proxyVertexMap){const g=l.get(f);d.push(g??-1)}const u=this._findChildLines(e.mesh),p=u?this._buildLineVertexGroups(e,u):void 0,m={vertexIndexGroups:o,proxyVertexMap:d};return u&&(m.lines=u),p&&(m.lineVertexIndexGroups=p),m}_findChildLines(e){for(const t of e.children)if(t.isLineSegments)return t;return null}_buildLineVertexGroups(e,t){const s=t.geometry.getAttribute("position"),n=e.mesh.geometry.getAttribute("position"),o=1e-6,l=new c.Vector3,d=t.matrixWorld,u=e.mesh.matrixWorld,p=[];for(const m of e.vertexIndices){const f=this._readVertex(n,m).applyMatrix4(u),g=[];for(let _=0;_<s.count;_++)l.fromBufferAttribute(s,_).applyMatrix4(d),l.distanceToSquared(f)<o*o&&g.push(_);p.push(g)}return p}};We=Ds([a.injectable(),re(0,a.inject("ICameraApi")),re(1,a.inject("ISceneApi")),re(2,a.inject("IRaycastApi")),re(3,a.inject("EditorStore"))],We);var Es=Object.getOwnPropertyDescriptor,Vs=(e,t,r,s)=>{for(var i=s>1?void 0:s?Es(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ot=(e,t)=>(r,s)=>t(r,s,e);let Ne=class{constructor(e,t){this._api=e,this._store=t}mode=h.SelectMode.Mesh;_hoveredMesh=null;_selectedMesh=null;_hoverColor=Z;_selectColor=J;_origLineColors=new WeakMap;handle(e,t){if(this._api.setRaycastMode(this.mode),t===F.Hover){if(!e){this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),this._hoveredMesh=null;return}const r=e.intersection.object;this._hoveredMesh!==r&&(this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),r!==this._selectedMesh&&this._paintEdges(r,this._hoverColor),this._hoveredMesh=r)}if(t===F.Click){if(!e){this._selectedMesh&&(this._restoreEdgesColor(this._selectedMesh),this._selectedMesh=null,this._store.setSelectedObject(null));return}const r=e.intersection.object;this._selectedMesh&&this._selectedMesh!==r&&this._restoreEdgesColor(this._selectedMesh),this._paintEdges(r,this._selectColor),this._selectedMesh=r,this._store.setSelectedObject(r)}}rollback(){this._hoveredMesh&&this._restoreEdgesColor(this._hoveredMesh),this._selectedMesh&&this._restoreEdgesColor(this._selectedMesh),this._hoveredMesh=this._selectedMesh=null,this._store.setSelectedObject(null)}dispose(){this.rollback()}_paintEdges(e,t){e.children.forEach(r=>{const s=r;if(s.isLineSegments&&s.material){const i=s.material;this._origLineColors.has(s)||this._origLineColors.set(s,i.color.clone()),i.color.setHex(t),i.needsUpdate=!0}})}_restoreEdgesColor(e){e.children.forEach(t=>{const r=t;if(r.isLineSegments&&r.material){const s=this._origLineColors.get(r);if(s){const i=r.material;i.color.copy(s),i.needsUpdate=!0}}})}};Ne=Vs([a.injectable(),Ot(0,a.inject("IRaycastApi")),Ot(1,a.inject("EditorStore"))],Ne);var Bs=Object.getOwnPropertyDescriptor,Fs=(e,t,r,s)=>{for(var i=s>1?void 0:s?Bs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},se=(e,t)=>(r,s)=>t(r,s,e);let Ue=class{constructor(e,t,r,s){this._cameraApi=e,this._sceneApi=t,this._raycastApi=r,this._store=s,this._cameraApi.enableCameraLayer(D),this._hoverVertex=R(this._makeOverlayVertex(this._hoverColor)),this._selectVertex=R(this._makeOverlayVertex(this._selectColor)),this._sceneApi.addObject(this._hoverVertex,D),this._sceneApi.addObject(this._selectVertex,D)}mode=h.SelectMode.Vertex;_hovered=null;_selected=null;_hoverVertex;_selectVertex;_hoverColor=Z;_selectColor=J;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===F.Hover){if(!e){this._hoverVertex.visible=!1,this._hovered=null;return}const r=e.intersection.object;if(!r?.isPoints)return;const s=r,i=e.intersection.index??-1;if(i<0)return;this._selected&&this._same({points:s,index:i},this._selected)?this._hoverVertex.visible=!1:(this._writeWorldVertex(this._hoverVertex,s,i),this._hoverVertex.visible=!0);return}if(t===F.Click){if(!e){this._selectVertex.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const r=e.intersection.object;if(!r?.isPoints)return;const s=r,i=e.intersection.index??-1;if(i<0)return;this._writeWorldVertex(this._selectVertex,s,i),this._centerVertexOnPoint(this._selectVertex,s,i),this._selectVertex.visible=!0,this._prepareVertexMetadata(s,i),this._store.setSelectedObject(this._selectVertex),this._selected={points:s,index:i},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverVertex.visible=!1);return}}rollback(){this._hoverVertex.visible=!1,this._selectVertex.visible=!1,this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverVertex),this._sceneApi.removeFromScene(this._selectVertex),this._hoverVertex.geometry.dispose(),this._hoverVertex.material.dispose(),this._selectVertex.geometry.dispose(),this._selectVertex.material.dispose()}_makeOverlayVertex(e,t=hr){const r=new c.BufferGeometry;r.setAttribute("position",new c.Float32BufferAttribute([0,0,0],3));const s=new c.PointsMaterial({color:e,size:t,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),i=new c.Points(r,s);return i.renderOrder=1e3,i.raycast=()=>{},i.layers.set(D),i.visible=!1,i}_writeWorldVertex(e,t,r){const s=t.geometry.getAttribute("position"),i=new c.Vector3(s.getX(r),s.getY(r),s.getZ(r)).applyMatrix4(t.matrixWorld),n=e.geometry.getAttribute("position");n.setXYZ(0,i.x,i.y,i.z),n.needsUpdate=!0}_same(e,t){return!!e&&!!t&&e.points===t.points&&e.index===t.index}_prepareVertexMetadata(e,t){const r=Mt(e);if(!r)return;const s=e.geometry.getAttribute("position"),i=new c.Vector3(s.getX(t),s.getY(t),s.getZ(t)).applyMatrix4(e.matrixWorld),n=new c.Matrix4().copy(r.matrixWorld).invert(),o=i.clone().applyMatrix4(n),d=r.geometry.getAttribute("position"),u=1e-6,p=u*u,m=new c.Vector3,f=[];for(let v=0;v<d.count;v++)m.fromBufferAttribute(d,v),m.distanceToSquared(o)<p&&f.push(v);const g=r.children.find(v=>v?.isLineSegments);let _=[];if(g){const v=new c.Matrix4().copy(g.matrixWorld).invert(),M=i.clone().applyMatrix4(v),y=g.geometry.getAttribute("position"),j=new c.Vector3;for(let x=0;x<y.count;x++)j.fromBufferAttribute(y,x),j.distanceToSquared(M)<p&&_.push(x)}this._selectVertex.userData.vertexInfo={points:e,index:t,mesh:r,vertexIndices:f,lines:g??null,edgeVertexIndices:_}}_centerVertexOnPoint(e,t,r){const s=t.geometry.getAttribute("position"),i=new c.Vector3(s.getX(r),s.getY(r),s.getZ(r)).applyMatrix4(t.matrixWorld);e.position.copy(i);const n=e.geometry;let o=n.getAttribute("position");(!o||o.count<1)&&(n.setAttribute("position",new c.BufferAttribute(new Float32Array(3),3)),o=n.getAttribute("position")),o.setXYZ(0,0,0,0),o.needsUpdate=!0,e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0)}};Ue=Fs([a.injectable(),se(0,a.inject("ICameraApi")),se(1,a.inject("ISceneApi")),se(2,a.inject("IRaycastApi")),se(3,a.inject("EditorStore"))],Ue);class Xe{constructor(t,r){this.api=t,this.store=r,this._unsubscribeTransform=this.api.onTransformChange(()=>{this.store.getSelectedObject()&&this.store.notifySelectedTransformChange?.()})}_unsubscribeTransform;handle(){const t=this.store.getSelectedObject();this.api.setTransformMode(this.mode),t?this.api.attachTransform(t):this.api.detachTransform()}rollback(){this.api.detachTransform()}dispose(){this.rollback(),this._unsubscribeTransform&&this._unsubscribeTransform()}}var $s=Object.getOwnPropertyDescriptor,ks=(e,t,r,s)=>{for(var i=s>1?void 0:s?$s(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Pt=(e,t)=>(r,s)=>t(r,s,e);let qe=class extends Xe{mode=h.ToolType.Rotate;constructor(e,t){super(e,t)}};qe=ks([a.injectable(),Pt(0,a.inject("ITransformApi")),Pt(1,a.inject("EditorStore"))],qe);var Hs=Object.getOwnPropertyDescriptor,Rs=(e,t,r,s)=>{for(var i=s>1?void 0:s?Hs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Tt=(e,t)=>(r,s)=>t(r,s,e);let Ye=class extends Xe{mode=h.ToolType.Scale;constructor(e,t){super(e,t)}};Ye=Rs([a.injectable(),Tt(0,a.inject("ITransformApi")),Tt(1,a.inject("EditorStore"))],Ye);var Gs=Object.getOwnPropertyDescriptor,zs=(e,t,r,s)=>{for(var i=s>1?void 0:s?Gs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Lt=(e,t)=>(r,s)=>t(r,s,e);let Ke=class extends Xe{mode=h.ToolType.Translate;constructor(e,t){super(e,t)}};Ke=zs([a.injectable(),Lt(0,a.inject("ITransformApi")),Lt(1,a.inject("EditorStore"))],Ke);var Ws=Object.getOwnPropertyDescriptor,Ns=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ws(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Us=(e,t)=>(r,s)=>t(r,s,e);let ie=class{constructor(e){this._api=e}mode=h.SceneMode.AddFigure;_lastAddedMesh=null;handle(e){const t=lr[e](),r=t.getAttribute("position");r&&r.setUsage&&r.setUsage(c.DynamicDrawUsage);const s=new c.Mesh(t,mt.clone());s.layers.enable(k);const i=t.index?t.toNonIndexed():t,n=H(St(i));n.layers.enable(k),s.add(n);const o=H(wt(i));o.layers.enable(k),s.add(o),this._api.addMesh(s),this._lastAddedMesh=s}rollback(){this._lastAddedMesh!==null&&(this._api.removeMesh(this._lastAddedMesh),this._lastAddedMesh=null)}dispose(){this._lastAddedMesh=null}};ie=Ns([a.injectable(),Us(0,a.inject("IMeshApi"))],ie);var Xs=Object.getOwnPropertyDescriptor,qs=(e,t,r,s)=>{for(var i=s>1?void 0:s?Xs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Dt=(e,t)=>(r,s)=>t(r,s,e);let Ze=class{constructor(e,t){this._api=e,this._store=t}mode=h.SceneMode.DeleteFigure;_lastDeletedMesh=null;handle(){const e=this._store.getSelectedObject();ve(e)&&!At(e)&&(this._api.removeMesh(e),this._store.setSelectedObject(null),this._lastDeletedMesh=e)}rollback(){this._lastDeletedMesh&&(this._api.addMesh(this._lastDeletedMesh),this._lastDeletedMesh=null)}dispose(){this._lastDeletedMesh=null}};Ze=qs([a.injectable(),Dt(0,a.inject("IMeshApi")),Dt(1,a.inject("EditorStore"))],Ze);class Ys{parse(t){let r="",s=0,i=0,n=0;const o=new b.Vector3,l=new b.Color,d=new b.Vector3,u=new b.Vector2,p=[];function m(_){let v=0,M=0,y=0;const j=_.geometry,x=new b.Matrix3,S=j.getAttribute("position"),C=j.getAttribute("normal"),A=j.getAttribute("uv"),O=j.getIndex();if(r+="o "+_.name+`
|
|
7
|
+
`,_.material&&_.material.name&&(r+="usemtl "+_.material.name+`
|
|
8
|
+
`),S!==void 0)for(let I=0,E=S.count;I<E;I++,v++)o.fromBufferAttribute(S,I),o.applyMatrix4(_.matrixWorld),r+="v "+o.x+" "+o.y+" "+o.z+`
|
|
9
|
+
`;if(A!==void 0)for(let I=0,E=A.count;I<E;I++,y++)u.fromBufferAttribute(A,I),r+="vt "+u.x+" "+u.y+`
|
|
10
|
+
`;if(C!==void 0){x.getNormalMatrix(_.matrixWorld);for(let I=0,E=C.count;I<E;I++,M++)d.fromBufferAttribute(C,I),d.applyMatrix3(x).normalize(),r+="vn "+d.x+" "+d.y+" "+d.z+`
|
|
11
|
+
`}if(O!==null)for(let I=0,E=O.count;I<E;I+=3){for(let V=0;V<3;V++){const $=O.getX(I+V)+1;p[V]=s+$+(C||A?"/"+(A?i+$:"")+(C?"/"+(n+$):""):"")}r+="f "+p.join(" ")+`
|
|
12
|
+
`}else for(let I=0,E=S.count;I<E;I+=3){for(let V=0;V<3;V++){const $=I+V+1;p[V]=s+$+(C||A?"/"+(A?i+$:"")+(C?"/"+(n+$):""):"")}r+="f "+p.join(" ")+`
|
|
13
|
+
`}s+=v,i+=y,n+=M}function f(_){let v=0;const M=_.geometry,y=_.type,j=M.getAttribute("position");if(r+="o "+_.name+`
|
|
14
|
+
`,j!==void 0)for(let x=0,S=j.count;x<S;x++,v++)o.fromBufferAttribute(j,x),o.applyMatrix4(_.matrixWorld),r+="v "+o.x+" "+o.y+" "+o.z+`
|
|
15
|
+
`;if(y==="Line"){r+="l ";for(let x=1,S=j.count;x<=S;x++)r+=s+x+" ";r+=`
|
|
16
|
+
`}if(y==="LineSegments")for(let x=1,S=x+1,C=j.count;x<C;x+=2,S=x+1)r+="l "+(s+x)+" "+(s+S)+`
|
|
17
|
+
`;s+=v}function g(_){let v=0;const M=_.geometry,y=M.getAttribute("position"),j=M.getAttribute("color");if(r+="o "+_.name+`
|
|
18
|
+
`,y!==void 0){for(let x=0,S=y.count;x<S;x++,v++)o.fromBufferAttribute(y,x),o.applyMatrix4(_.matrixWorld),r+="v "+o.x+" "+o.y+" "+o.z,j!==void 0&&(l.fromBufferAttribute(j,x),b.ColorManagement.workingToColorSpace(l,b.SRGBColorSpace),r+=" "+l.r+" "+l.g+" "+l.b),r+=`
|
|
19
|
+
`;r+="p ";for(let x=1,S=y.count;x<=S;x++)r+=s+x+" ";r+=`
|
|
20
|
+
`}s+=v}return t.traverse(function(_){_.isMesh===!0&&m(_),_.isLine===!0&&f(_),_.isPoints===!0&&g(_)}),r}}var Ks=Object.getOwnPropertyDescriptor,Zs=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ks(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Et=(e,t)=>(r,s)=>t(r,s,e);let ne=class{constructor(e,t){this._api=e,this._exportStore=t}mode=h.SceneMode.Export;handle(){const e=this._api.getScene(),t=gr(e),s=new Ys().parse(t),i=Date.now();this._exportStore.setResult({format:"obj",filename:`scene-${i}.obj`,mimeType:"text/plain;charset=utf-8",content:s,createdAt:i})}rollback(){}dispose(){this._exportStore.clearResult()}};ne=Zs([a.injectable(),Et(0,a.inject("ISceneApi")),Et(1,a.inject("ExportStore"))],ne);var Js=Object.defineProperty,Qs=Object.getOwnPropertyDescriptor,Vt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Qs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=(s?o(t,r,i):o(i))||i);return s&&i&&Js(t,r,i),i},Bt=(e,t)=>(r,s)=>t(r,s,e);let W=class{constructor(e,t){this._api=e,this._validator=t}mode=h.SceneMode.Load;handle(e){const t=[...this._api.getMeshes()];this._api.removeMeshes(t);const r=xt(e);this._api.addMeshes(r)}rollback(){}dispose(){}};Vt([It(e=>e._validator)],W.prototype,"handle",1),W=Vt([a.injectable(),Bt(0,a.inject("IMeshApi")),Bt(1,a.inject("ObjValidator"))],W);var ei=Object.defineProperty,ti=Object.getOwnPropertyDescriptor,Ft=(e,t,r,s)=>{for(var i=s>1?void 0:s?ti(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=(s?o(t,r,i):o(i))||i);return s&&i&&ei(t,r,i),i},$t=(e,t)=>(r,s)=>t(r,s,e);let N=class{constructor(e,t){this._api=e,this._validator=t}mode=h.SceneMode.LoadFigure;handle(e){const t=xt(e);this._api.addMeshes(t)}rollback(){}dispose(){}};Ft([It(e=>e._validator)],N.prototype,"handle",1),N=Ft([a.injectable(),$t(0,a.inject("IMeshApi")),$t(1,a.inject("ObjValidator"))],N);class oe{constructor(t,r,s,i){this._sceneApi=t,this._interactionApi=r,this._metricsApi=s,this._store=i}_group=null;_liveTimerId=null;async handle(t){this._interactionApi.setInteractionEnabled(!1),this._prepareScene(),this._metricsApi.start(this.objectsCount),this._startLiveMetrics(),await this._wait(t),this._stopLiveMetrics(),this._metricsApi.stop();const r=this._metricsApi.getMetrics();this._store.setCurrentMetrics(r),this._store.addMetrics(this.mode,r),this._interactionApi.setInteractionEnabled(!0)}rollback(){this._interactionApi.setInteractionEnabled(!0),this._stopLiveMetrics(),this._metricsApi.stop(),this._metricsApi.reset(),this._store.setCurrentMetrics(null),this._group&&(this._sceneApi.removeFromScene(this._group,!0),this._group.clear(),this._group=null)}dispose(){this.rollback()}_prepareScene(){const t=new c.Group;t.name=this.groupName,this.fillGroup(t),this._group=t,this._sceneApi.addToScene(t)}_wait(t){return new Promise(r=>{window.setTimeout(r,t)})}_startLiveMetrics(){this._stopLiveMetrics(),this._liveTimerId=window.setInterval(()=>{this._store.setCurrentMetrics(this._metricsApi.getMetrics())},250)}_stopLiveMetrics(){this._liveTimerId!==null&&(window.clearInterval(this._liveTimerId),this._liveTimerId=null)}}var ri=Object.getOwnPropertyDescriptor,si=(e,t,r,s)=>{for(var i=s>1?void 0:s?ri(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},ae=(e,t)=>(r,s)=>t(r,s,e);let Je=class extends oe{mode=h.BenchmarkTestType.Light;groupName="__LIGHT_BENCHMARK__";objectsCount=ge;constructor(e,t,r,s){super(e,t,r,s)}fillGroup(e){const t=Math.ceil(Math.sqrt(this.objectsCount)),r=t/2;for(let s=0;s<this.objectsCount;s+=1){const i=s%t,n=Math.floor(s/t),o=new c.BoxGeometry(.4,.4,.4),l=new c.MeshStandardMaterial,d=new c.Mesh(o,l);d.position.set(i-r,.2,n-r),e.add(d)}}};Je=si([a.injectable(),ae(0,a.inject("ISceneApi")),ae(1,a.inject("IInteractionApi")),ae(2,a.inject("IMetricsApi")),ae(3,a.inject("MetricsStore"))],Je);var ii=Object.getOwnPropertyDescriptor,ni=(e,t,r,s)=>{for(var i=s>1?void 0:s?ii(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},ce=(e,t)=>(r,s)=>t(r,s,e);let Qe=class extends oe{mode=h.BenchmarkTestType.Medium;groupName="__MEDIUM_BENCHMARK__";objectsCount=ge;constructor(e,t,r,s){super(e,t,r,s)}fillGroup(e){const t=Math.ceil(Math.sqrt(this.objectsCount)),r=t/2;for(let s=0;s<this.objectsCount;s+=1){const i=s%t,n=Math.floor(s/t),o=new c.CylinderGeometry(.18,.18,.45,24),l=new c.MeshStandardMaterial,d=new c.Mesh(o,l);d.position.set((i-r)*.6,.225,(n-r)*.6),e.add(d)}}};Qe=ni([a.injectable(),ce(0,a.inject("ISceneApi")),ce(1,a.inject("IInteractionApi")),ce(2,a.inject("IMetricsApi")),ce(3,a.inject("MetricsStore"))],Qe);var oi=Object.getOwnPropertyDescriptor,ai=(e,t,r,s)=>{for(var i=s>1?void 0:s?oi(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},le=(e,t)=>(r,s)=>t(r,s,e);let et=class extends oe{mode=h.BenchmarkTestType.Heavy;groupName="__HEAVY_BENCHMARK__";objectsCount=ge;constructor(e,t,r,s){super(e,t,r,s)}fillGroup(e){const t=Math.ceil(Math.sqrt(this.objectsCount)),r=t/2;for(let s=0;s<this.objectsCount;s+=1){const i=s%t,n=Math.floor(s/t),o=new c.TorusKnotGeometry(.16,.05,64,12),l=new c.MeshStandardMaterial,d=new c.Mesh(o,l);d.position.set((i-r)*.7,.25,(n-r)*.7),e.add(d)}}};et=ai([a.injectable(),le(0,a.inject("ISceneApi")),le(1,a.inject("IInteractionApi")),le(2,a.inject("IMetricsApi")),le(3,a.inject("MetricsStore"))],et);var ci=Object.getOwnPropertyDescriptor,li=(e,t,r,s)=>{for(var i=s>1?void 0:s?ci(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},he=(e,t)=>(r,s)=>t(r,s,e);let tt=class extends oe{mode=h.BenchmarkTestType.Mixed;groupName="__MIXED_BENCHMARK__";objectsCount=gt+vt+bt;constructor(e,t,r,s){super(e,t,r,s)}fillGroup(e){this._addLightObjects(e,-10),this._addMediumObjects(e,0),this._addHardObjects(e,10)}_addLightObjects(e,t){this._addGrid(e,gt,t,()=>new c.Mesh(new c.BoxGeometry(.3,.3,.3),new c.MeshStandardMaterial))}_addMediumObjects(e,t){this._addGrid(e,vt,t,()=>new c.Mesh(new c.CylinderGeometry(.18,.18,.45,24),new c.MeshStandardMaterial))}_addHardObjects(e,t){this._addGrid(e,bt,t,()=>new c.Mesh(new c.TorusKnotGeometry(.16,.05,64,12),new c.MeshStandardMaterial))}_addGrid(e,t,r,s){const i=Math.ceil(Math.sqrt(t)),n=i/2;for(let o=0;o<t;o+=1){const l=o%i,d=Math.floor(o/i),u=s(o);u.position.set(r+(l-n)*.65,.25,(d-n)*.65),e.add(u)}}};tt=li([a.injectable(),he(0,a.inject("ISceneApi")),he(1,a.inject("IInteractionApi")),he(2,a.inject("IMetricsApi")),he(3,a.inject("MetricsStore"))],tt);var hi=Object.getOwnPropertyDescriptor,di=(e,t,r,s)=>{for(var i=s>1?void 0:s?hi(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},U=(e,t)=>(r,s)=>t(r,s,e);w.EditorHub=class{constructor(t,r,s,i,n){this._renderer=t,this._mediator=r,this._store=s,this._exportStore=i,this._worker=n,this.setSelectMode(h.SelectMode.Mesh),this.setToolMode(h.ToolType.Translate)}setDisplayMode(t){return this._mediator.send({type:P.Display,payload:[t]})}setSelectMode(t){return this._mediator.send({type:P.Select,payload:[t]})}setToolMode(t){return this._mediator.send({type:P.Tool,payload:[t]})}addFigure(t){return this._mediator.send({type:P.Scene,payload:[h.SceneMode.AddFigure,t]})}deleteFigure(){return this._mediator.send({type:P.Scene,payload:[h.SceneMode.DeleteFigure]})}loadFigure(t){return this._mediator.send({type:P.Scene,payload:[h.SceneMode.LoadFigure,t]})}loadScene(t){return this._mediator.send({type:P.Scene,payload:[h.SceneMode.Load,t]})}exportScene(){return this._exportStore.clearResult(),{response:this._mediator.send({type:P.Scene,payload:[h.SceneMode.Export]}),result:this._exportStore.getResult()}}resizeRenderer(){this._renderer.resize()}start(){this._worker.start()}stop(){this._worker.stop()}getSelectionStats(){return this._store.getSelectionStats()}onSelectionStatsChange(t){const r=this._store.onSelectedObjectChange(()=>{t()}),s=this._store.onSelectedTransformChange(()=>{t()});return()=>{r(),s()}}dispose(){this._mediator.dispose()}},w.EditorHub=di([a.injectable(),U(0,a.inject("Renderer")),U(1,a.inject("IMediator")),U(2,a.inject("EditorStore")),U(3,a.inject("ExportStore")),U(4,a.inject("IWorker"))],w.EditorHub);var ui=Object.getOwnPropertyDescriptor,_i=(e,t,r,s)=>{for(var i=s>1?void 0:s?ui(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},rt=(e,t)=>(r,s)=>t(r,s,e);w.ViewerHub=class{constructor(t,r,s){this._renderer=t,this._mediator=r,this._worker=s}addFigure(t){return this._mediator.send({type:P.Scene,payload:[h.SceneMode.AddFigure,t]})}loadFigure(t){return this._mediator.send({type:P.Scene,payload:[h.SceneMode.LoadFigure,t]})}loadScene(t){return this._mediator.send({type:P.Scene,payload:[h.SceneMode.Load,t]})}resizeRenderer(){this._renderer.resize()}start(){this._worker.start()}stop(){this._worker.stop()}dispose(){this._mediator.dispose()}},w.ViewerHub=_i([a.injectable(),rt(0,a.inject("Renderer")),rt(1,a.inject("IMediator")),rt(2,a.inject("IWorker"))],w.ViewerHub);var mi=Object.getOwnPropertyDescriptor,pi=(e,t,r,s)=>{for(var i=s>1?void 0:s?mi(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},de=(e,t)=>(r,s)=>t(r,s,e);w.BenchmarkHub=class{constructor(t,r,s,i){this._renderer=t,this._mediator=r,this._store=s,this._worker=i}run(t){this._store.clear();const r=[];for(const s of t.tests){const i=this._mediator.send({type:P.Benchmark,payload:[s,t.durationMs]});r.push({type:s,status:i===null?h.BenchmarkTestStatus.Success:h.BenchmarkTestStatus.Failed})}return{tests:r}}getReport(){return this._store.getReport()}subscribeMetrics(t){return this._store.subscribe(t)}resizeRenderer(){this._renderer.resize()}start(){this._worker.start()}stop(){this._worker.stop()}},w.BenchmarkHub=pi([a.injectable(),de(0,a.inject("Renderer")),de(1,a.inject("IMediator")),de(2,a.inject("MetricsStore")),de(3,a.inject("IWorker"))],w.BenchmarkHub);var fi=Object.getOwnPropertyDescriptor,gi=(e,t,r,s)=>{for(var i=s>1?void 0:s?fi(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};let st=class{_selectMode=h.SelectMode.Mesh;_toolType=h.ToolType.Translate;_displayMode=h.DisplayMode.Plane;_selectedObject=null;_selectedListeners=new Set;_transformListeners=new Set;constructor(){Y.makeAutoObservable(this,{},{autoBind:!0})}getSelectMode(){return this._selectMode}getToolType(){return this._toolType}getDisplayMode(){return this._displayMode}setSelectMode(e){this._selectMode=e}setToolType(e){this._toolType=e}setDisplayMode(e){this._displayMode=e}getSelectedObject(){return this._selectedObject}getSelectionStats(){const e=this._selectedObject;return e?_r(e):null}setSelectedObject(e){if(this._selectedObject!==e){this._selectedObject=e;for(const t of this._selectedListeners)t(this._selectedObject)}}onSelectedObjectChange(e){return this._selectedListeners.add(e),()=>this._selectedListeners.delete(e)}onSelectedTransformChange(e){return this._transformListeners.add(e),()=>this._transformListeners.delete(e)}notifySelectedTransformChange(){for(const e of this._transformListeners)e()}};st=gi([a.injectable()],st);class kt{_result=null;constructor(){Y.makeAutoObservable(this,{_result:Y.observable.ref},{autoBind:!0})}get result(){return this._result}get hasResult(){return this._result!==null}setResult(t){this._result=t}getResult(){return this._result}clearResult(){this._result=null}}var vi=Object.getOwnPropertyDescriptor,bi=(e,t,r,s)=>{for(var i=s>1?void 0:s?vi(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};let it=class{_createdAt=new Date().toISOString();_metrics=new Map;_currentMetrics=null;_listeners=new Set;constructor(){Y.makeAutoObservable(this,{},{autoBind:!0})}clear(){this._createdAt=new Date().toISOString(),this._metrics.clear(),this.setCurrentMetrics(null)}addMetrics(e,t){this._metrics.set(e,t)}setCurrentMetrics(e){this._currentMetrics=e;for(const t of this._listeners)t(this._currentMetrics)}getCurrentMetrics(){return this._currentMetrics}subscribe(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}getReport(){const e=[...this._metrics.entries()].map(([t,r])=>({type:t,status:h.BenchmarkTestStatus.Success,metrics:r}));return{createdAt:this._createdAt,tests:e}}};it=bi([a.injectable()],it);class Ht extends Error{constructor(t,r,s,i){super(r),this.type=t,this.code=s,this.meta=i,this.name=this._name}_name="PolicyException"}class ue extends Error{constructor(t,r,s,i){super(r),this.type=t,this.code=s,this.meta=i,this.name=this._name}_name="ValidationException"}var Mi=Object.getOwnPropertyDescriptor,wi=(e,t,r,s)=>{for(var i=s>1?void 0:s?Mi(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Si=(e,t)=>(r,s)=>t(r,s,e);let nt=class{constructor(e){this._store=e}check(e){const t=this._store.getSelectMode();if(!h.DEFAULT_TOOL_RULES[t].includes(e))throw new Ht(h.ResponseType.NotAllowed,`Tool ${e} is not allowed`,"TOOL_NOT_ALLOWED")}};nt=wi([a.injectable(),Si(0,a.inject("EditorStore"))],nt);class Ai{constructor(){}validate(t){const r=t.trim();if(!r)throw new ue(h.ResponseType.ValidationError,"File content is empty.","FILE_CONTENT_EMPTY");if(!/^v\s+[-+.\deE]+\s+[-+.\deE]+\s+[-+.\deE]+/m.test(r))throw new ue(h.ResponseType.ValidationError,"OBJ content does not contain vertices.","WRONG_FILE_CONTENT");if(!/^f\s+/m.test(r))throw new ue(h.ResponseType.ValidationError,"OBJ content does not contain faces.","WRONG_FILE_CONTENT")}}var xi=Object.getOwnPropertyDescriptor,ji=(e,t,r,s)=>{for(var i=s>1?void 0:s?xi(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};let ot=class{handle(e){try{return e()}catch(t){return t instanceof Ht?{type:t.type,message:t.message,code:t.code,blocked:!0}:t instanceof ue?{type:t.type,message:t.message,code:t.code,blocked:!0}:t instanceof Error?{type:h.ResponseType.Error,message:t.message,code:"UNHANDLED_EXCEPTION",blocked:!0}:{type:h.ResponseType.Error,message:"Unknown exception",code:"UNKNOWN_EXCEPTION",blocked:!0}}}};ot=ji([a.injectable()],ot);var yi=Object.getOwnPropertyDescriptor,Ii=(e,t,r,s)=>{for(var i=s>1?void 0:s?yi(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Rt=(e,t)=>(r,s)=>t(r,s,e);let at=class{constructor(e,t){this._middlewares=t,this._managers=new Map(e.map(r=>[r.type,r]))}_managers;send(e){const t=this._managers.get(e.type);if(!t)return{type:h.ResponseType.Error,message:`Manager for feature "${String(e.type)}" not found`,code:"MANAGER_NOT_FOUND",blocked:!0};const r=()=>(t.manage(...e.payload),null);return this._middlewares.reduceRight((i,n)=>()=>n.handle(i),r)()}dispose(){this._managers&&this._managers.clear()}};at=Ii([a.injectable(),Rt(0,a.injectAll("IManager")),Rt(1,a.injectAll("IMiddleware"))],at);let _e=null,me=null,pe=null;function ct(){return a.container.createChildContainer()}function Gt(e,t){e.registerInstance("Canvas",t)}function zt(e,t){e.registerInstance("RendererConfig",mr(vr,t))}function lt(e){e.registerSingleton("IWorker",be),e.registerSingleton("Renderer",w.Renderer),e.register("IRenderable",{useToken:"Renderer"}),e.register("IRendererAccess",{useToken:"Renderer"}),e.register("IRendererCameraAccess",{useToken:"Renderer"}),e.register("IRendererDomAccess",{useToken:"Renderer"}),e.register("IRendererSceneAccess",{useToken:"Renderer"})}function Ci(e){lt(e),e.register("IRendererInfoAccess",{useToken:"Renderer"})}function Oi(e){e.registerSingleton("EventBus",w.EventBus)}function Pi(e){e.registerSingleton("ToolPolicy",nt)}function Wt(e){e.registerSingleton("ObjValidator",Ai)}function Nt(e){e.registerSingleton("IMeshApi",we),e.registerSingleton("ICameraApi",je),e.registerSingleton("IDomApi",ye),e.registerSingleton("ISceneApi",Ie)}function Ut(e){Nt(e),e.registerSingleton("IControlsStateApi",Me),e.registerSingleton("IRaycastApi",Se),e.registerSingleton("ITransformApi",Ae),e.registerSingleton("IInteractionApi",xe)}function Ti(e){Nt(e)}function Li(e){Ut(e),e.registerSingleton("IRendererInfoApi",Ce)}function Xt(e){e.registerSingleton("ControlsModule",Q),e.registerSingleton("GizmoModule",Te),e.registerSingleton("RaycastModule",Le),e.registerSingleton("SceneModule",De),e.register("IUpdatableModule",{useToken:"ControlsModule"}),e.register("IRenderableModule",{useToken:"GizmoModule"}),e.register("IRuntimeModule",{useToken:"RaycastModule"}),e.register("IRuntimeModule",{useToken:"SceneModule"}),e.register("IInteractiveModule",{useToken:"ControlsModule"}),e.register("IInteractiveModule",{useToken:"RaycastModule"}),e.register("IInteractiveModule",{useToken:"GizmoModule"})}function Di(e){e.registerSingleton("ControlsModule",Q),e.registerSingleton("SceneModule",Ee),e.register("IUpdatableModule",{useToken:"ControlsModule"}),e.register("IRuntimeModule",{useToken:"SceneModule"}),e.register("IInteractiveModule",{useToken:"ControlsModule"})}function Ei(e){Xt(e),e.registerSingleton("MetricsModule",Ve),e.register("IObserverModule",{useToken:"MetricsModule"}),e.register("IMetricsApi",{useToken:"MetricsModule"})}function Vi(e){e.registerSingleton("IDisplayHandler",Ge)}function Bi(e){e.registerSingleton("ISelectHandler",Ne),e.registerSingleton("ISelectHandler",We),e.registerSingleton("ISelectHandler",ze),e.registerSingleton("ISelectHandler",Ue)}function Fi(e){e.registerSingleton("IToolHandler",Ke),e.registerSingleton("IToolHandler",Ye),e.registerSingleton("IToolHandler",qe)}function $i(e){e.registerSingleton("ISceneHandler",ie),e.registerSingleton("ISceneHandler",Ze),e.registerSingleton("ISceneHandler",ne),e.registerSingleton("ISceneHandler",N),e.registerSingleton("ISceneHandler",W)}function ki(e){e.registerSingleton("ISceneHandler",ie),e.registerSingleton("ISceneHandler",ne),e.registerSingleton("ISceneHandler",N),e.registerSingleton("ISceneHandler",W)}function Hi(e){e.registerSingleton("IBenchmarkHandler",Je),e.registerSingleton("IBenchmarkHandler",Qe),e.registerSingleton("IBenchmarkHandler",et),e.registerSingleton("IBenchmarkHandler",tt)}function Ri(e){e.registerSingleton("DisplayManager",Be),e.register("IDisplayManager",{useToken:"DisplayManager"}),e.register("IManager",{useToken:"DisplayManager"})}function Gi(e){e.registerSingleton("SelectManager",ke),e.register("ISelectManager",{useToken:"SelectManager"}),e.register("IManager",{useToken:"SelectManager"})}function zi(e){e.registerSingleton("ToolManager",ee),e.register("IToolManager",{useToken:"ToolManager"}),e.register("IManager",{useToken:"ToolManager"})}function qt(e){e.registerSingleton("SceneManager",Fe),e.register("ISceneManager",{useToken:"SceneManager"}),e.register("IManager",{useToken:"SceneManager"})}function Wi(e){e.registerSingleton("BenchmarkManager",Re),e.register("IBenchmarkManager",{useToken:"BenchmarkManager"}),e.register("IManager",{useToken:"BenchmarkManager"})}function Ni(e){Ri(e),Gi(e),zi(e),qt(e)}function Ui(e){qt(e)}function Yt(e){e.registerSingleton("IMiddleware",ot),e.registerSingleton("IMediator",at)}function Xi(e){e.registerSingleton("EditorStore",st),e.registerSingleton("ExportStore",kt)}function qi(e){e.registerSingleton("ExportStore",kt)}function Yi(e){e.registerSingleton("MetricsStore",it)}function Ki(e){e.registerSingleton("EditorHub",w.EditorHub)}function Zi(e){e.registerSingleton("ViewerHub",w.ViewerHub)}function Ji(e){e.registerSingleton("BenchmarkHub",w.BenchmarkHub)}function Kt(e,t,r){return Gt(e,t),zt(e,r),Oi(e),lt(e),Pi(e),Wt(e),Ut(e),Xt(e),Vi(e),Bi(e),Fi(e),$i(e),Ni(e),Yt(e),Ki(e),Xi(e),e}function Qi(e,t,r){return Kt(e,t,r),Ci(e),Ei(e),Li(e),Hi(e),Wi(e),Yi(e),Ji(e),e}function en(e,t,r){return Gt(e,t),zt(e,r),lt(e),Wt(e),Ti(e),Di(e),ki(e),Ui(e),Yt(e),Zi(e),qi(e),e}function tn(e,t){return _e||(_e=Kt(ct(),e,t),_e)}function rn(e,t){return me||(me=en(ct(),e,t),me)}function sn(e,t){return pe||(pe=Qi(ct(),e,t),pe)}let T=null;const nn=(e,t)=>(T||(T=tn(e,t)),T.resolve("EditorHub")),on=()=>{if(!T)throw new Error("EditorHub is not initialized. Call createEditorHub(canvas) first.");return T.resolve("EditorHub")},an=(e,t)=>(T||(T=rn(e,t)),T.resolve("ViewerHub")),cn=()=>{if(!T)throw new Error("ViewerHub is not initialized. Call createViewerHub(canvas) first.");return T.resolve("ViewerHub")},ln=(e,t)=>(T||(T=sn(e,t)),T.resolve("BenchmarkHub")),hn=()=>{if(!T)throw new Error("ViewerHub is not initialized. Call createBenchmarkHub(canvas) first.");return T.resolve("BenchmarkHub")};w.EventTopics=B,w.FeatureType=P,w.ObjLoader=wr,w.createBenchmarkHub=ln,w.createEditorHub=nn,w.createViewerHub=an,w.getBenchmarkHub=hn,w.getEditorHub=on,w.getViewerHub=cn,Object.defineProperty(w,Symbol.toStringTag,{value:"Module"})}));
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './camera-api';
|
|
2
|
+
export * from './controls-state-api';
|
|
3
|
+
export * from './dom-api';
|
|
4
|
+
export * from './mesh-api';
|
|
5
|
+
export * from './raycast-api';
|
|
6
|
+
export * from './renderer-api';
|
|
7
|
+
export * from './scene-api';
|
|
8
|
+
export * from './transform-api';
|
|
9
|
+
export * from './interaction-api';
|
|
10
|
+
export * from './metrics-api';
|
|
11
|
+
export * from './renderer-info-api';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Высокоуровневый API для временного включения и отключения пользовательского взаимодействия.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Используется для управления модулями, которые обрабатывают ввод пользователя
|
|
6
|
+
* или реагируют на действия в сцене. Отключение не освобождает ресурсы
|
|
7
|
+
* и не удаляет обработчики событий, а только приостанавливает интерактивную логику.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
* @interface
|
|
11
|
+
*/
|
|
12
|
+
export interface IInteractionApi {
|
|
13
|
+
/**
|
|
14
|
+
* Включает или отключает пользовательское взаимодействие модуля.
|
|
15
|
+
*
|
|
16
|
+
* @param enabled - `true`, если взаимодействие должно быть включено
|
|
17
|
+
*/
|
|
18
|
+
setInteractionEnabled(enabled: boolean): void;
|
|
19
|
+
/**
|
|
20
|
+
* Возвращает текущее состояние пользовательского взаимодействия модуля.
|
|
21
|
+
*
|
|
22
|
+
* @returns `true`, если взаимодействие включено
|
|
23
|
+
*/
|
|
24
|
+
isInteractionEnabled(): boolean;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=interaction-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/interaction-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAE9C;;;;OAIG;IACH,oBAAoB,IAAI,OAAO,CAAC;CACjC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { BenchmarkMetrics } from '@planara/types';
|
|
2
|
+
import { MetricsListener } from '../../types/listener';
|
|
3
|
+
/**
|
|
4
|
+
* Верхнеуровневый API для получения метрик производительности.
|
|
5
|
+
*
|
|
6
|
+
* @internal
|
|
7
|
+
* @interface
|
|
8
|
+
*/
|
|
9
|
+
export interface IMetricsApi {
|
|
10
|
+
/**
|
|
11
|
+
* Запускает сбор метрик.
|
|
12
|
+
*
|
|
13
|
+
* @param objectsCount - количество объектов, участвующих в текущем тесте
|
|
14
|
+
*
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
start(objectsCount?: number): void;
|
|
18
|
+
/**
|
|
19
|
+
* Останавливает сбор метрик.
|
|
20
|
+
*
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
stop(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Сбрасывает накопленные метрики.
|
|
26
|
+
*
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
reset(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Возвращает текущие или последние собранные метрики.
|
|
32
|
+
*
|
|
33
|
+
* @returns Метрики производительности
|
|
34
|
+
*
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
getMetrics(): BenchmarkMetrics;
|
|
38
|
+
/**
|
|
39
|
+
* Регистрирует слушатель изменения метрик.
|
|
40
|
+
*
|
|
41
|
+
* @param listener - обработчик обновления метрик
|
|
42
|
+
*
|
|
43
|
+
* @returns Функция отписки
|
|
44
|
+
*
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
subscribe(listener: MetricsListener): () => void;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=metrics-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/metrics-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC;;;;OAIG;IACH,IAAI,IAAI,IAAI,CAAC;IAEb;;;;OAIG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;;;;;OAMG;IACH,UAAU,IAAI,gBAAgB,CAAC;IAE/B;;;;;;;;OAQG;IACH,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,IAAI,CAAC;CAClD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './renderable';
|
|
2
|
+
export * from './renderer-access';
|
|
3
|
+
export * from './renderer-camera-access';
|
|
4
|
+
export * from './renderer-dom-access';
|
|
5
|
+
export * from './renderer-scene-access';
|
|
6
|
+
export * from './renderer-info-access';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/api/renderer/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { RendererInfoMetrics } from '../../../types/renderer';
|
|
2
|
+
/**
|
|
3
|
+
* API доступа к метрикам WebGL-рендерера.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* Предоставляет только статистику рендеринга без доступа к самому renderer.
|
|
7
|
+
* Используется модулями диагностики и сбора метрик.
|
|
8
|
+
*
|
|
9
|
+
* @public
|
|
10
|
+
* @interface
|
|
11
|
+
*/
|
|
12
|
+
export interface IRendererInfoAccess {
|
|
13
|
+
/**
|
|
14
|
+
* Возвращает текущую статистику рендерера.
|
|
15
|
+
*
|
|
16
|
+
* @returns Метрики WebGL-рендера за текущий кадр
|
|
17
|
+
*/
|
|
18
|
+
getRendererInfo(): RendererInfoMetrics;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=renderer-info-access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-info-access.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/api/renderer/renderer-info-access.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;;;;;;;;GASG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,eAAe,IAAI,mBAAmB,CAAC;CACxC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { RendererInfoMetrics } from '../../types/renderer';
|
|
2
|
+
/**
|
|
3
|
+
* API доступа к метрикам WebGL-рендерера.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* Предоставляет только статистику рендеринга без доступа к самому renderer.
|
|
7
|
+
* Используется модулями диагностики и сбора метрик.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export interface IRendererInfoApi {
|
|
12
|
+
/**
|
|
13
|
+
* Возвращает текущую статистику рендерера.
|
|
14
|
+
*
|
|
15
|
+
* @returns Метрики WebGL-рендера за текущий кадр
|
|
16
|
+
*/
|
|
17
|
+
getRendererInfo(): RendererInfoMetrics;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=renderer-info-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-info-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/renderer-info-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,eAAe,IAAI,mBAAmB,CAAC;CACxC"}
|
|
@@ -55,6 +55,7 @@ export interface ISceneApi {
|
|
|
55
55
|
* Удаляет объект со сцены.
|
|
56
56
|
*
|
|
57
57
|
* @param object - объект Three.js для удаления
|
|
58
|
+
* @param dispose - нужно ли освободить ресурсы объекта и его дочерних элементов
|
|
58
59
|
*
|
|
59
60
|
* @remarks
|
|
60
61
|
* Объект перестаёт отображаться на сцене.
|
|
@@ -67,7 +68,7 @@ export interface ISceneApi {
|
|
|
67
68
|
* @internal
|
|
68
69
|
* @method
|
|
69
70
|
*/
|
|
70
|
-
removeFromScene(object: THREE.Object3D): void;
|
|
71
|
+
removeFromScene(object: THREE.Object3D, dispose?: boolean): void;
|
|
71
72
|
/**
|
|
72
73
|
* Добавляет объект в сцену и (опционально) выставляет ему слой.
|
|
73
74
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/scene-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,SAAS;IACxB;;;;;;;;;;;;OAYG;IACH,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC;IAExB;;;;;;;;;;;;;;;;;OAiBG;IACH,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;IAEzC
|
|
1
|
+
{"version":3,"file":"scene-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/scene-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,SAAS;IACxB;;;;;;;;;;;;OAYG;IACH,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC;IAExB;;;;;;;;;;;;;;;;;OAiBG;IACH,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;IAEzC;;;;;;;;;;;;;;;;OAgBG;IACH,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAEjE;;;;;;;;;;;;;;;;OAgBG;IACH,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ToolType } from '@planara/types';
|
|
2
|
-
import { TransformListener } from '../../types/listener
|
|
2
|
+
import { TransformListener } from '../../types/listener';
|
|
3
3
|
import * as THREE from 'three';
|
|
4
4
|
/**
|
|
5
5
|
* API для взаимодействия и настройки элементов управления сценой.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/transform-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"transform-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/transform-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;IAE9C;;;;;;;;;;;;;;;;;;;OAmBG;IACH,eAAe,IAAI,IAAI,CAAC;IAExB;;;;;;;;;;;;;;;;;;OAkBG;IACH,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAEvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAAC;CAC5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/interfaces/command/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/interfaces/command/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,OAAO,EAAE,CAAC;CACpB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { IHandler } from './handler';
|
|
2
|
+
import { BenchmarkTestType } from '@planara/types';
|
|
3
|
+
/**
|
|
4
|
+
* Маркерный интерфейс для всех Benchmark-хендлеров.
|
|
5
|
+
* Используется только для DI.
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* Расширяет {@link IHandler} и добавляет поле `mode`
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
* @interface
|
|
12
|
+
*/
|
|
13
|
+
export interface IBenchmarkHandler extends IHandler {
|
|
14
|
+
/**
|
|
15
|
+
* Режим тестирования, за который отвечает хендлер.
|
|
16
|
+
*
|
|
17
|
+
* @internal
|
|
18
|
+
* @member
|
|
19
|
+
*/
|
|
20
|
+
mode: BenchmarkTestType;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=benchmark-handler.d.ts.map
|