@realsee/dnalogel 4.0.0-webgpu.17 → 4.0.0-webgpu.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/floorplan.js +1 -1
  3. package/dist/index.js +16 -16
  4. package/dist/internal/{BasePlugin-BW03eBFv.js → BasePlugin-Cr_atQUC.js} +2 -2
  5. package/dist/internal/{BasePlugin-BW03eBFv.js.map → BasePlugin-Cr_atQUC.js.map} +1 -1
  6. package/dist/internal/BasePluginWithData-CIQpqYGe.js +7 -0
  7. package/dist/internal/{BasePluginWithData-5iUuu45u.js.map → BasePluginWithData-CIQpqYGe.js.map} +1 -1
  8. package/dist/internal/{Controller-CS5gPzPg.js → Controller-BDT5_ZNe.js} +2 -2
  9. package/dist/internal/{Controller-CS5gPzPg.js.map → Controller-BDT5_ZNe.js.map} +1 -1
  10. package/dist/internal/{Controller-DPvcZw20.js → Controller-Cq-mYkzT.js} +2 -2
  11. package/dist/internal/{Controller-DPvcZw20.js.map → Controller-Cq-mYkzT.js.map} +1 -1
  12. package/dist/internal/{Rectangle-Bw-_5i6A.js → Rectangle-Z2T_h74M.js} +2 -2
  13. package/dist/internal/{Rectangle-Bw-_5i6A.js.map → Rectangle-Z2T_h74M.js.map} +1 -1
  14. package/dist/internal/{Work-njB4pAsT.js → Work-PKaUMpXd.js} +4 -4
  15. package/dist/internal/{Work-njB4pAsT.js.map → Work-PKaUMpXd.js.map} +1 -1
  16. package/dist/internal/{area-maker-T7a6vfXC.js → area-maker-BTGqxG6D.js} +2 -2
  17. package/dist/internal/{area-maker-T7a6vfXC.js.map → area-maker-BTGqxG6D.js.map} +1 -1
  18. package/dist/internal/{controller-Vl3H6GBQ.js → controller-B0hqJtoB.js} +3 -3
  19. package/dist/internal/{controller-Vl3H6GBQ.js.map → controller-B0hqJtoB.js.map} +1 -1
  20. package/dist/internal/{cruise-rzsfiLn-.js → cruise-BkSbiLjd.js} +2 -2
  21. package/dist/internal/{cruise-rzsfiLn-.js.map → cruise-BkSbiLjd.js.map} +1 -1
  22. package/dist/internal/{current-pano-image-CAodOmyS.js → current-pano-image-DqyUFIP6.js} +2 -2
  23. package/dist/internal/{current-pano-image-CAodOmyS.js.map → current-pano-image-DqyUFIP6.js.map} +1 -1
  24. package/dist/internal/{floorplan-B82VmXnE.js → floorplan-Dkp7omYn.js} +2 -2
  25. package/dist/internal/{floorplan-B82VmXnE.js.map → floorplan-Dkp7omYn.js.map} +1 -1
  26. package/dist/internal/{model-maker-BHPMSkqn.js → model-maker-L5eqUgkU.js} +2 -2
  27. package/dist/internal/{model-maker-BHPMSkqn.js.map → model-maker-L5eqUgkU.js.map} +1 -1
  28. package/dist/internal/object3d-helper-CUhRRdCQ.js +7 -0
  29. package/dist/internal/{object3d-helper-CxJ_Ju1y.js.map → object3d-helper-CUhRRdCQ.js.map} +1 -1
  30. package/dist/internal/{pano-compass-2S5mt7af.js → pano-compass-dmcsnFDQ.js} +2 -2
  31. package/dist/internal/{pano-compass-2S5mt7af.js.map → pano-compass-dmcsnFDQ.js.map} +1 -1
  32. package/dist/internal/{pano-door-label-CK0sYPKY.js → pano-door-label-C0sd66vf.js} +2 -2
  33. package/dist/internal/{pano-door-label-CK0sYPKY.js.map → pano-door-label-C0sd66vf.js.map} +1 -1
  34. package/dist/internal/{pano-measure-DEofgQkM.js → pano-measure-NbB7-uVE.js} +2 -2
  35. package/dist/internal/{pano-measure-DEofgQkM.js.map → pano-measure-NbB7-uVE.js.map} +1 -1
  36. package/dist/internal/{pano-measure-v2-DVlj0AUQ.js → pano-measure-v2-CRPvPs0e.js} +2 -2
  37. package/dist/internal/{pano-measure-v2-DVlj0AUQ.js.map → pano-measure-v2-CRPvPs0e.js.map} +1 -1
  38. package/dist/internal/pano-ruler-BW78w4lv.js +240 -0
  39. package/dist/internal/pano-ruler-BW78w4lv.js.map +1 -0
  40. package/dist/internal/{pano-tag-BwRqx3wU.js → pano-tag-j8ZPJDDK.js} +2 -2
  41. package/dist/internal/{pano-tag-BwRqx3wU.js.map → pano-tag-j8ZPJDDK.js.map} +1 -1
  42. package/dist/internal/{pano-video-DF7h9OyJ.js → pano-video-Dcspq4j1.js} +2 -2
  43. package/dist/internal/{pano-video-DF7h9OyJ.js.map → pano-video-Dcspq4j1.js.map} +1 -1
  44. package/dist/internal/{pipeline-Bcxx8i_q.js → pipeline-CD2YkN5U.js} +2 -2
  45. package/dist/internal/{pipeline-Bcxx8i_q.js.map → pipeline-CD2YkN5U.js.map} +1 -1
  46. package/dist/internal/{sculpt-heTYi32h.js → sculpt-CbEBEh9F.js} +2 -2
  47. package/dist/internal/{sculpt-heTYi32h.js.map → sculpt-CbEBEh9F.js.map} +1 -1
  48. package/dist/plugins/area-maker.js +1 -1
  49. package/dist/plugins/cruise.js +2 -2
  50. package/dist/plugins/current-pano-image.js +1 -1
  51. package/dist/plugins/guide-line.js +1 -1
  52. package/dist/plugins/model-maker.js +1 -1
  53. package/dist/plugins/object3d-helper.js +2 -2
  54. package/dist/plugins/pano-compass.js +1 -1
  55. package/dist/plugins/pano-door-label.js +1 -1
  56. package/dist/plugins/pano-measure-v2.js +1 -1
  57. package/dist/plugins/pano-measure.js +1 -1
  58. package/dist/plugins/pano-ruler.js +1 -1
  59. package/dist/plugins/pano-tag.js +2 -2
  60. package/dist/plugins/pano-video.js +1 -1
  61. package/dist/plugins/pipeline.js +1 -1
  62. package/dist/plugins/sculpt.js +2 -2
  63. package/dist/types/PanoRulerPlugin/room-height.d.ts +19 -0
  64. package/package.json +1 -1
  65. package/dist/internal/BasePluginWithData-5iUuu45u.js +0 -7
  66. package/dist/internal/object3d-helper-CxJ_Ju1y.js +0 -7
  67. package/dist/internal/pano-ruler-fzlUTkVu.js +0 -236
  68. package/dist/internal/pano-ruler-fzlUTkVu.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pano-measure-v2-DVlj0AUQ.js","names":["isTouchDevice","EditController","WatchController","MixedController","Point","RangePieceController","Line","PanoMeasureController","MeasurePointHelperV2","resolveEdgeSnapOptions","EdgeSnapCache","MeasureMagnifier","MeasurePointSelector","PanoMagnifier","element","PanoPointSelector","event","five","config","sharedMagnifier","refreshManualInput","edges","intersection","edgeOptions","helper","original","container","magnifier","ndc","resolved","PanoPreviewLine","start","end","geometry","from","to","distanceStart","distanceEnd","points","configurePreview","material","line","PanoEditControllerV2","params","PanoRangePieceV2","group","mesh","PanoMixedControllerV2","PanoWatchControllerV2","mouse","PanoMeasureControllerV2","mobile","controller","enabled","Controller","mode","data","working","id","polyline","options","v2Params","PanoMeasurePluginV2"],"sources":["../../src/PanoMeasurePluginV2/PointSelector.ts","../../src/PanoMeasurePluginV2/PreviewLine.ts","../../src/PanoMeasurePluginV2/controllers.ts","../../src/PanoMeasurePluginV2/Controller.ts","../../src/PanoMeasurePluginV2/index.ts"],"sourcesContent":["import type { Five } from '@realsee/five-webgpu'\nimport { MeasurePointSelector } from '../MeasurePluginV2/PointSelector'\nimport { MeasureMagnifier } from '../MeasurePluginV2/Magnifier'\nimport { MeasurePointHelperV2 } from '../MeasurePluginV2/PointHelper'\nimport { EdgeSnapCache, type ResolvedEdgeSnapOptions } from '../MeasurePluginV2/edgeSnap'\nimport type { PointIntersection, PointSelectorConfig } from '../shared-utils/three/PointSelector'\n\n/** The panorama entry uses the same snapping engine as spatial measurement V2. */\nclass PanoMagnifier extends MeasureMagnifier {\n public override appendTo(element: Element) {\n if (this.containerDom && this.canvas.parentNode !== this.containerDom) this.containerDom = undefined\n return super.appendTo(element)\n }\n}\nexport { PanoMagnifier }\n\nexport class PanoPointSelector extends MeasurePointSelector {\n private readonly edgeCache = new EdgeSnapCache()\n private suppliedNdc?: { x: number; y: number }\n private overlayMagnifier?: MeasureMagnifier\n public lastEdgeSnapEdgeCount = 0\n\n private readonly onModifiersChanged = (event: KeyboardEvent) => {\n this.adhereEnabled = !event.shiftKey\n if (!this.adhereEnabled) this.clearDynamicAdhereLine()\n this.refreshManualInput?.()\n }\n\n private readonly onWindowBlur = () => {\n this.adhereEnabled = true\n this.clearDynamicAdhereLine()\n this.refreshManualInput?.()\n }\n\n public constructor(five: Five, config: PointSelectorConfig, edgeOptions: ResolvedEdgeSnapOptions, private readonly sharedMagnifier?: MeasureMagnifier, private readonly refreshManualInput?: () => void) {\n super(five, config)\n this.adhereLineProvider = ({ intersection }) => {\n const edges = this.edgeCache.query(five.model, intersection.point, edgeOptions)\n this.lastEdgeSnapEdgeCount = edges.length\n return edges\n }\n const helper = this.pointSelectorHelper\n const original = helper.magnifier\n if (sharedMagnifier) {\n // Mixed and Watch resolve hits manually, without PointSelector.enable().\n document.addEventListener('keydown', this.onModifiersChanged)\n document.addEventListener('keyup', this.onModifiersChanged)\n window.addEventListener('blur', this.onWindowBlur)\n original?.dispose()\n helper.magnifier = sharedMagnifier\n const container = config.helper?.container ?? five.getElement()?.parentElement ?? document.body\n if (sharedMagnifier.containerDom !== container) sharedMagnifier.appendTo(container)\n this.overlayMagnifier = sharedMagnifier\n } else if (original) {\n const magnifier = new PanoMagnifier(five, { ...original.config, width: original.width, height: original.height, scale: (original as unknown as { scale: number }).scale })\n if (original.containerDom) magnifier.appendTo(original.containerDom)\n if (original.state.enabled) magnifier.enable()\n helper.magnifier = magnifier\n original.dispose()\n this.overlayMagnifier = magnifier\n }\n if (helper.pointHelper) {\n helper.pointHelper.dispose()\n helper.pointHelper = new MeasurePointHelperV2(five)\n }\n this.on('intersectionUpdate', intersection => this.overlayMagnifier?.setIntersection(intersection ?? null))\n }\n\n protected override get mouseNdcPosition() {\n return this.suppliedNdc ?? super.mouseNdcPosition\n }\n\n /** Resolve fixed-center and endpoint-drag input without installing another pointer listener. */\n public resolveIntersection<T extends PointIntersection>(intersection: T | null, ndc: { x: number; y: number }) {\n this.suppliedNdc = ndc\n try {\n this.pointSelectorHelper.enable()\n this.updatePointSelectorHelperIntersect(intersection)\n const resolved = this.pointSelectorHelper.position\n return intersection && resolved ? { ...intersection, ...resolved } : null\n } finally {\n this.suppliedNdc = undefined\n }\n }\n\n public resetSnap() {\n this.edgeCache.clear()\n this.lastEdgeSnapEdgeCount = 0\n this.clearDynamicAdhereLine()\n this.overlayMagnifier?.setIntersection(null)\n }\n\n public override dispose() {\n if (this.sharedMagnifier) {\n document.removeEventListener('keydown', this.onModifiersChanged)\n document.removeEventListener('keyup', this.onModifiersChanged)\n window.removeEventListener('blur', this.onWindowBlur)\n this.pointSelectorHelper.magnifier = null\n this.sharedMagnifier.setIntersection(null)\n this.sharedMagnifier.disable()\n }\n super.dispose()\n }\n}\n","import type { Vector3, InterleavedBufferAttribute } from 'three/webgpu'\nimport Line from '../PanoMeasurePlugin/Model/line'\n\n/** WebGPU caches attribute bindings. Keep the preview buffers alive while endpoints move. */\nexport class PanoPreviewLine extends Line {\n public override setPoints(start: Vector3, end: Vector3) {\n this.points[0].position.copy(start)\n this.points[1].position.copy(end)\n const geometry = this.mesh.line.geometry\n const from = geometry.getAttribute('instanceStart') as InterleavedBufferAttribute\n const to = geometry.getAttribute('instanceEnd') as InterleavedBufferAttribute\n from.setXYZ(0, start.x, start.y, start.z)\n to.setXYZ(0, end.x, end.y, end.z)\n from.data.needsUpdate = true\n const distanceStart = geometry.getAttribute('instanceDistanceStart') as InterleavedBufferAttribute\n const distanceEnd = geometry.getAttribute('instanceDistanceEnd') as InterleavedBufferAttribute\n distanceStart.setX(0, 0)\n distanceEnd.setX(0, start.distanceTo(end))\n distanceStart.data.needsUpdate = true\n geometry.computeBoundingBox()\n geometry.computeBoundingSphere()\n const points = this.mesh.points.geometry.getAttribute('position')\n points.setXYZ(0, start.x, start.y, start.z)\n points.setXYZ(1, end.x, end.y, end.z)\n points.needsUpdate = true\n this.mesh.needsRender = true\n }\n}\n","import type { Intersection, IntersectMeshInterface } from '@realsee/five-webgpu'\nimport type { Vector2 } from 'three/webgpu'\nimport EditController from '../PanoMeasurePlugin/Controller/EditController'\nimport MixedController from '../PanoMeasurePlugin/Controller/MixedController'\nimport WatchController from '../PanoMeasurePlugin/Controller/WatchController'\nimport type Line from '../PanoMeasurePlugin/Model/line'\nimport Point from '../PanoMeasurePlugin/Model/point'\nimport { PanoPreviewLine } from './PreviewLine'\nimport RangePieceController from '../PanoMeasurePlugin/Modules/rangePiece'\nimport type { ControllerParams } from '../PanoMeasurePlugin/Controller/BaseController'\nimport type { ResolvedEdgeSnapOptions } from '../MeasurePluginV2/edgeSnap'\nimport type { MeasureMagnifier } from '../MeasurePluginV2/Magnifier'\nimport { PanoPointSelector } from './PointSelector'\n\nexport interface PanoControllerParamsV2 extends ControllerParams {\n edgeSnapOptions: ResolvedEdgeSnapOptions\n}\n\n// A dashed-material reset must not put the measurement preview behind the model.\nfunction configurePreview(line: Line) {\n const material = line.mesh.line.material\n material.depthTest = false\n material.depthWrite = false\n material.transparent = true\n material.needsUpdate = true\n}\n\nexport class PanoEditControllerV2 extends EditController {\n protected override createPreviewLine() {\n return new PanoPreviewLine(new Point([0, 0, 0]), new Point([0, 0, 0]), this.model)\n }\n\n private readonly updateLivePreview = () => this.updateDashed()\n\n public constructor(params: PanoControllerParamsV2) {\n super(params)\n configurePreview(this.dashed)\n configurePreview(this.perpendicularDashed)\n this.pointSelector.on('intersectionUpdate', this.updateLivePreview)\n }\n\n public override dispose() {\n this.pointSelector.off('intersectionUpdate', this.updateLivePreview)\n super.dispose()\n }\n\n public get selector() { return this.pointSelector as PanoPointSelector }\n\n protected override createPointSelector(params: ControllerParams) {\n return new PanoPointSelector(params.five, {\n ...params.pointSelectorConfig,\n mode: params.editParams.pointSelectorMode,\n helper: { magnifierParams: this.magnifierParams, container: params.container, ...params.pointSelectorConfig?.helper },\n }, (params as PanoControllerParamsV2).edgeSnapOptions)\n }\n}\n\nclass PanoRangePieceV2 extends RangePieceController {\n public refresh() { this.onCameraDirectionUpdate() }\n public readonly selector: PanoPointSelector\n\n public constructor(params: PanoControllerParamsV2) {\n super(params)\n this.selector = new PanoPointSelector(params.five, {\n ...params.pointSelectorConfig,\n mode: 'fixed',\n helper: { ...params.pointSelectorConfig?.helper, container: params.container },\n }, params.edgeSnapOptions, params.magnifier as MeasureMagnifier, () => this.refresh())\n }\n\n protected override getIntersection() {\n const intersection = super.getIntersection()\n if (!this.centerMouseXY) return null\n return this.selector.resolveIntersection(intersection ?? null, { x: (this.centerMouseXY.x + 1) / 2, y: (this.centerMouseXY.y + 1) / 2 })\n }\n\n protected override updateMouseGroup(intersection: Intersection, mesh?: IntersectMeshInterface) {\n const group = super.updateMouseGroup(intersection, mesh)\n group.visible = false\n return group\n }\n\n public override dispose() {\n this.selector.dispose()\n super.dispose()\n }\n}\n\nexport class PanoMixedControllerV2 extends MixedController {\n public refreshPoint() { (this.rangePieceController as PanoRangePieceV2).refresh() }\n protected override createPreviewLine() {\n return new PanoPreviewLine(new Point([0, 0, 0]), new Point([0, 0, 0]), this.model)\n }\n\n public constructor(params: PanoControllerParamsV2) {\n super(params)\n configurePreview(this.dashed)\n configurePreview(this.perpendicularDashed)\n }\n\n public get selector() { return (this.rangePieceController as PanoRangePieceV2).selector }\n\n protected override createRangePieceController(params: ControllerParams) {\n return new PanoRangePieceV2(params as PanoControllerParamsV2)\n }\n}\n\nexport class PanoWatchControllerV2 extends WatchController {\n public readonly selector: PanoPointSelector\n\n public constructor(params: PanoControllerParamsV2) {\n super(params)\n this.selector = new PanoPointSelector(params.five, { ...params.pointSelectorConfig, helper: { ...params.pointSelectorConfig?.helper, container: params.container } }, params.edgeSnapOptions, params.magnifier as MeasureMagnifier)\n }\n\n protected override resolveIntersection(intersection: Intersection, mouse: Vector2): Intersection {\n this.mouseGroup.visible = false\n return this.selector.resolveIntersection(intersection, { x: (mouse.x + 1) / 2, y: (mouse.y + 1) / 2 }) ?? intersection\n }\n\n protected override onPointEditEnd() {\n this.selector.resetSnap()\n this.selector.pointSelectorHelper.hide()\n }\n\n public override dispose() {\n this.selector.dispose()\n super.dispose()\n }\n}\n","import type { Five } from '@realsee/five-webgpu'\nimport PanoMeasureController, { type ModeControllerConstructor, type PanoMeasureParameterType } from '../PanoMeasurePlugin/Controller'\nimport EditController from '../PanoMeasurePlugin/Controller/EditController'\nimport MixedController from '../PanoMeasurePlugin/Controller/MixedController'\nimport WatchController from '../PanoMeasurePlugin/Controller/WatchController'\nimport type { ControllerParams } from '../PanoMeasurePlugin/Controller/BaseController'\nimport { PanoMagnifier } from './PointSelector'\nimport { resolveEdgeSnapOptions, type EdgeSnapOptions, type ResolvedEdgeSnapOptions } from '../MeasurePluginV2/edgeSnap'\nimport type { MagnifierParameter } from '../shared-utils'\nimport { isTouchDevice } from '../shared-utils/isTouchDevice'\nimport { PanoEditControllerV2, PanoMixedControllerV2, PanoWatchControllerV2 } from './controllers'\n\nexport type PanoMeasurePluginV2Config = PanoMeasureParameterType & { edgeSnap?: boolean | EdgeSnapOptions }\n\n/** Reuses panorama modes, events, models and serialization; only V2 picking changes. */\nexport class PanoMeasureControllerV2 extends PanoMeasureController {\n private readonly edgeSnapOptions: ResolvedEdgeSnapOptions\n private mobileStyle?: HTMLStyleElement\n private readonly mixedSavedPolylineIDs = new WeakMap<PanoMixedControllerV2, Set<string>>()\n\n public constructor(five: Five, params: PanoMeasurePluginV2Config = {}) {\n const mobile = params.openParams?.isMobile ?? isTouchDevice\n const resolved: PanoMeasurePluginV2Config = {\n ...params,\n openParams: { ...params.openParams, isMobile: mobile },\n editParams: { ...params.editParams, pointSelectorMode: params.editParams?.pointSelectorMode ?? (mobile ? 'fixed' : 'cursor'), autoEndConfig: mobile ? { line: 2, ...params.editParams?.autoEndConfig } : params.editParams?.autoEndConfig },\n useUIController: mobile && params.useUIController !== false\n ? { useNewUI: true, mode: 'mobile', ...(typeof params.useUIController === 'object' ? params.useUIController : {}) }\n : params.useUIController,\n pointSelectorConfig: {\n ...params.pointSelectorConfig,\n helper: {\n ...params.pointSelectorConfig?.helper,\n magnifierParams: {\n ...(mobile ? { width: 150, height: 150, dragEnabled: false, autoFixPCPosition: false, initialPosition: { left: '12px', top: '12px' } } : {}),\n ...params.pointSelectorConfig?.helper?.magnifierParams,\n },\n },\n },\n }\n super(five, resolved)\n this.edgeSnapOptions = resolveEdgeSnapOptions(params.edgeSnap)\n }\n\n public get pointSelector() {\n const controller = this.controller\n return controller instanceof PanoEditControllerV2 || controller instanceof PanoMixedControllerV2 || controller instanceof PanoWatchControllerV2 ? controller.selector : undefined\n }\n\n public get lastEdgeSnapEdgeCount() { return this.pointSelector?.lastEdgeSnapEdgeCount ?? 0 }\n public get edgeSnapEnabled() { return this.edgeSnapOptions.enabled }\n\n public setEdgeSnapEnabled(enabled: boolean) {\n this.edgeSnapOptions.enabled = enabled\n this.pointSelector?.resetSnap()\n if (this.controller instanceof PanoMixedControllerV2) this.controller.refreshPoint()\n else this.pointSelector?.refresh()\n this.five.needsRender = true\n }\n\n public override clear() {\n const Controller = this.controller instanceof PanoEditControllerV2 ? EditController\n : this.controller instanceof PanoMixedControllerV2 ? MixedController : undefined\n if (Controller) {\n const mode = Controller === EditController ? 'Edit' : 'Mixed'\n // Discard both the working lines and an unfinished start point. Recreate the\n // same mode so its input, cursor and UI return to their initial state.\n this.controller!.dispose()\n super.clear()\n this.controller = this.createModeController(this.createControllerParams(), Controller)\n this.hooks.emit('modeChange', mode)\n this.resetUIController()\n return\n }\n super.clear()\n }\n\n public override load(data: Parameters<PanoMeasureController['load']>[0]) {\n // Finish the old session before parsing replacement data. The inherited load\n // calls save() virtually and must not merge the previous Mixed working model.\n if (this.hasOpen) {\n this.save({ mode: 'View' })\n this.changeMode('View')\n }\n super.load(data)\n }\n\n public override save(config?: Parameters<PanoMeasureController['save']>[0]) {\n if (this.controller instanceof PanoMixedControllerV2) {\n // Only reconcile lines committed by this working session. Older saved\n // measurements are absent from Mixed's working model and must be retained.\n const working = this.controller.model\n for (const id of this.mixedSavedPolylineIDs.get(this.controller) ?? []) {\n if (!working.getPolylineByID(id)) this.removePolylineByID(id)\n }\n for (const polyline of working.polylines) {\n if (!this.model.getPolylineByID(polyline.id)) this.model.addPolyline(polyline)\n }\n this.mixedSavedPolylineIDs.set(this.controller, new Set(working.polylines.map(polyline => polyline.id)))\n }\n return super.save(config)\n }\n\n public override removePolylineByID(id: string) {\n const polyline = this.model.getPolylineByID(id)\n ?? (this.controller instanceof PanoMixedControllerV2 ? this.controller.model.getPolylineByID(id) : undefined)\n if (polyline) this.removePolyline(polyline)\n }\n\n public override removePolyline(polyline: Parameters<PanoMeasureController['removePolyline']>[0]) {\n if (this.controller instanceof PanoMixedControllerV2) {\n const working = this.controller.model.getPolylineByID(polyline.id)\n if (working) this.controller.model.removePolyline(working)\n }\n super.removePolyline(polyline)\n }\n\n public override dispose() {\n super.dispose()\n this.mobileStyle?.remove()\n this.mobileStyle = undefined\n }\n\n protected override createControllerParams() {\n const params = super.createControllerParams()\n params.container.classList.add('pano-measure-v2-container')\n if (!this.mobileStyle) {\n this.mobileStyle = document.createElement('style')\n this.mobileStyle.textContent = `\n @media (max-height: 500px) and (pointer: coarse) {\n .pano-measure-v2-container .Measure-Controller .bottom .center {\n align-items: flex-end; margin-bottom: 12px; padding-right: 12px;\n }\n .pano-measure-v2-container .Measure-Controller .main-button { margin-inline: 0; }\n }\n `\n params.container.append(this.mobileStyle)\n }\n return params\n }\n\n protected override createMagnifier(five: Five, options: MagnifierParameter) {\n return new PanoMagnifier(five, options)\n }\n\n protected override createModeController(params: ControllerParams, Controller: ModeControllerConstructor) {\n const v2Params = { ...params, edgeSnapOptions: this.edgeSnapOptions }\n if (Controller === EditController) return new PanoEditControllerV2(v2Params)\n if (Controller === MixedController) return new PanoMixedControllerV2(v2Params)\n if (Controller === WatchController) return new PanoWatchControllerV2(v2Params)\n return super.createModeController(params, Controller)\n }\n}\n","import type { Five } from '@realsee/five-webgpu'\nimport { PanoMeasureControllerV2, type PanoMeasurePluginV2Config } from './Controller'\n\nexport { PanoMeasureControllerV2 }\nexport type { PanoMeasurePluginV2Config }\nexport type { MeasurePluginData as PanoMeasurePluginV2Data, MeasurePluginServerData as PanoMeasurePluginV2ServerData } from '../PanoMeasurePlugin/typings/data'\nexport type PanoMeasurePluginV2Instance = PanoMeasureControllerV2\nexport const PanoMeasurePluginV2 = (five: Five, params: PanoMeasurePluginV2Config = {}) => new PanoMeasureControllerV2(five, params)\nexport default PanoMeasurePluginV2\n"],"mappings":"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"}
1
+ {"version":3,"file":"pano-measure-v2-CRPvPs0e.js","names":["isTouchDevice","EditController","WatchController","MixedController","Point","RangePieceController","Line","PanoMeasureController","MeasurePointHelperV2","resolveEdgeSnapOptions","EdgeSnapCache","MeasureMagnifier","MeasurePointSelector","PanoMagnifier","element","PanoPointSelector","event","five","config","sharedMagnifier","refreshManualInput","edges","intersection","edgeOptions","helper","original","container","magnifier","ndc","resolved","PanoPreviewLine","start","end","geometry","from","to","distanceStart","distanceEnd","points","configurePreview","material","line","PanoEditControllerV2","params","PanoRangePieceV2","group","mesh","PanoMixedControllerV2","PanoWatchControllerV2","mouse","PanoMeasureControllerV2","mobile","controller","enabled","Controller","mode","data","working","id","polyline","options","v2Params","PanoMeasurePluginV2"],"sources":["../../src/PanoMeasurePluginV2/PointSelector.ts","../../src/PanoMeasurePluginV2/PreviewLine.ts","../../src/PanoMeasurePluginV2/controllers.ts","../../src/PanoMeasurePluginV2/Controller.ts","../../src/PanoMeasurePluginV2/index.ts"],"sourcesContent":["import type { Five } from '@realsee/five-webgpu'\nimport { MeasurePointSelector } from '../MeasurePluginV2/PointSelector'\nimport { MeasureMagnifier } from '../MeasurePluginV2/Magnifier'\nimport { MeasurePointHelperV2 } from '../MeasurePluginV2/PointHelper'\nimport { EdgeSnapCache, type ResolvedEdgeSnapOptions } from '../MeasurePluginV2/edgeSnap'\nimport type { PointIntersection, PointSelectorConfig } from '../shared-utils/three/PointSelector'\n\n/** The panorama entry uses the same snapping engine as spatial measurement V2. */\nclass PanoMagnifier extends MeasureMagnifier {\n public override appendTo(element: Element) {\n if (this.containerDom && this.canvas.parentNode !== this.containerDom) this.containerDom = undefined\n return super.appendTo(element)\n }\n}\nexport { PanoMagnifier }\n\nexport class PanoPointSelector extends MeasurePointSelector {\n private readonly edgeCache = new EdgeSnapCache()\n private suppliedNdc?: { x: number; y: number }\n private overlayMagnifier?: MeasureMagnifier\n public lastEdgeSnapEdgeCount = 0\n\n private readonly onModifiersChanged = (event: KeyboardEvent) => {\n this.adhereEnabled = !event.shiftKey\n if (!this.adhereEnabled) this.clearDynamicAdhereLine()\n this.refreshManualInput?.()\n }\n\n private readonly onWindowBlur = () => {\n this.adhereEnabled = true\n this.clearDynamicAdhereLine()\n this.refreshManualInput?.()\n }\n\n public constructor(five: Five, config: PointSelectorConfig, edgeOptions: ResolvedEdgeSnapOptions, private readonly sharedMagnifier?: MeasureMagnifier, private readonly refreshManualInput?: () => void) {\n super(five, config)\n this.adhereLineProvider = ({ intersection }) => {\n const edges = this.edgeCache.query(five.model, intersection.point, edgeOptions)\n this.lastEdgeSnapEdgeCount = edges.length\n return edges\n }\n const helper = this.pointSelectorHelper\n const original = helper.magnifier\n if (sharedMagnifier) {\n // Mixed and Watch resolve hits manually, without PointSelector.enable().\n document.addEventListener('keydown', this.onModifiersChanged)\n document.addEventListener('keyup', this.onModifiersChanged)\n window.addEventListener('blur', this.onWindowBlur)\n original?.dispose()\n helper.magnifier = sharedMagnifier\n const container = config.helper?.container ?? five.getElement()?.parentElement ?? document.body\n if (sharedMagnifier.containerDom !== container) sharedMagnifier.appendTo(container)\n this.overlayMagnifier = sharedMagnifier\n } else if (original) {\n const magnifier = new PanoMagnifier(five, { ...original.config, width: original.width, height: original.height, scale: (original as unknown as { scale: number }).scale })\n if (original.containerDom) magnifier.appendTo(original.containerDom)\n if (original.state.enabled) magnifier.enable()\n helper.magnifier = magnifier\n original.dispose()\n this.overlayMagnifier = magnifier\n }\n if (helper.pointHelper) {\n helper.pointHelper.dispose()\n helper.pointHelper = new MeasurePointHelperV2(five)\n }\n this.on('intersectionUpdate', intersection => this.overlayMagnifier?.setIntersection(intersection ?? null))\n }\n\n protected override get mouseNdcPosition() {\n return this.suppliedNdc ?? super.mouseNdcPosition\n }\n\n /** Resolve fixed-center and endpoint-drag input without installing another pointer listener. */\n public resolveIntersection<T extends PointIntersection>(intersection: T | null, ndc: { x: number; y: number }) {\n this.suppliedNdc = ndc\n try {\n this.pointSelectorHelper.enable()\n this.updatePointSelectorHelperIntersect(intersection)\n const resolved = this.pointSelectorHelper.position\n return intersection && resolved ? { ...intersection, ...resolved } : null\n } finally {\n this.suppliedNdc = undefined\n }\n }\n\n public resetSnap() {\n this.edgeCache.clear()\n this.lastEdgeSnapEdgeCount = 0\n this.clearDynamicAdhereLine()\n this.overlayMagnifier?.setIntersection(null)\n }\n\n public override dispose() {\n if (this.sharedMagnifier) {\n document.removeEventListener('keydown', this.onModifiersChanged)\n document.removeEventListener('keyup', this.onModifiersChanged)\n window.removeEventListener('blur', this.onWindowBlur)\n this.pointSelectorHelper.magnifier = null\n this.sharedMagnifier.setIntersection(null)\n this.sharedMagnifier.disable()\n }\n super.dispose()\n }\n}\n","import type { Vector3, InterleavedBufferAttribute } from 'three/webgpu'\nimport Line from '../PanoMeasurePlugin/Model/line'\n\n/** WebGPU caches attribute bindings. Keep the preview buffers alive while endpoints move. */\nexport class PanoPreviewLine extends Line {\n public override setPoints(start: Vector3, end: Vector3) {\n this.points[0].position.copy(start)\n this.points[1].position.copy(end)\n const geometry = this.mesh.line.geometry\n const from = geometry.getAttribute('instanceStart') as InterleavedBufferAttribute\n const to = geometry.getAttribute('instanceEnd') as InterleavedBufferAttribute\n from.setXYZ(0, start.x, start.y, start.z)\n to.setXYZ(0, end.x, end.y, end.z)\n from.data.needsUpdate = true\n const distanceStart = geometry.getAttribute('instanceDistanceStart') as InterleavedBufferAttribute\n const distanceEnd = geometry.getAttribute('instanceDistanceEnd') as InterleavedBufferAttribute\n distanceStart.setX(0, 0)\n distanceEnd.setX(0, start.distanceTo(end))\n distanceStart.data.needsUpdate = true\n geometry.computeBoundingBox()\n geometry.computeBoundingSphere()\n const points = this.mesh.points.geometry.getAttribute('position')\n points.setXYZ(0, start.x, start.y, start.z)\n points.setXYZ(1, end.x, end.y, end.z)\n points.needsUpdate = true\n this.mesh.needsRender = true\n }\n}\n","import type { Intersection, IntersectMeshInterface } from '@realsee/five-webgpu'\nimport type { Vector2 } from 'three/webgpu'\nimport EditController from '../PanoMeasurePlugin/Controller/EditController'\nimport MixedController from '../PanoMeasurePlugin/Controller/MixedController'\nimport WatchController from '../PanoMeasurePlugin/Controller/WatchController'\nimport type Line from '../PanoMeasurePlugin/Model/line'\nimport Point from '../PanoMeasurePlugin/Model/point'\nimport { PanoPreviewLine } from './PreviewLine'\nimport RangePieceController from '../PanoMeasurePlugin/Modules/rangePiece'\nimport type { ControllerParams } from '../PanoMeasurePlugin/Controller/BaseController'\nimport type { ResolvedEdgeSnapOptions } from '../MeasurePluginV2/edgeSnap'\nimport type { MeasureMagnifier } from '../MeasurePluginV2/Magnifier'\nimport { PanoPointSelector } from './PointSelector'\n\nexport interface PanoControllerParamsV2 extends ControllerParams {\n edgeSnapOptions: ResolvedEdgeSnapOptions\n}\n\n// A dashed-material reset must not put the measurement preview behind the model.\nfunction configurePreview(line: Line) {\n const material = line.mesh.line.material\n material.depthTest = false\n material.depthWrite = false\n material.transparent = true\n material.needsUpdate = true\n}\n\nexport class PanoEditControllerV2 extends EditController {\n protected override createPreviewLine() {\n return new PanoPreviewLine(new Point([0, 0, 0]), new Point([0, 0, 0]), this.model)\n }\n\n private readonly updateLivePreview = () => this.updateDashed()\n\n public constructor(params: PanoControllerParamsV2) {\n super(params)\n configurePreview(this.dashed)\n configurePreview(this.perpendicularDashed)\n this.pointSelector.on('intersectionUpdate', this.updateLivePreview)\n }\n\n public override dispose() {\n this.pointSelector.off('intersectionUpdate', this.updateLivePreview)\n super.dispose()\n }\n\n public get selector() { return this.pointSelector as PanoPointSelector }\n\n protected override createPointSelector(params: ControllerParams) {\n return new PanoPointSelector(params.five, {\n ...params.pointSelectorConfig,\n mode: params.editParams.pointSelectorMode,\n helper: { magnifierParams: this.magnifierParams, container: params.container, ...params.pointSelectorConfig?.helper },\n }, (params as PanoControllerParamsV2).edgeSnapOptions)\n }\n}\n\nclass PanoRangePieceV2 extends RangePieceController {\n public refresh() { this.onCameraDirectionUpdate() }\n public readonly selector: PanoPointSelector\n\n public constructor(params: PanoControllerParamsV2) {\n super(params)\n this.selector = new PanoPointSelector(params.five, {\n ...params.pointSelectorConfig,\n mode: 'fixed',\n helper: { ...params.pointSelectorConfig?.helper, container: params.container },\n }, params.edgeSnapOptions, params.magnifier as MeasureMagnifier, () => this.refresh())\n }\n\n protected override getIntersection() {\n const intersection = super.getIntersection()\n if (!this.centerMouseXY) return null\n return this.selector.resolveIntersection(intersection ?? null, { x: (this.centerMouseXY.x + 1) / 2, y: (this.centerMouseXY.y + 1) / 2 })\n }\n\n protected override updateMouseGroup(intersection: Intersection, mesh?: IntersectMeshInterface) {\n const group = super.updateMouseGroup(intersection, mesh)\n group.visible = false\n return group\n }\n\n public override dispose() {\n this.selector.dispose()\n super.dispose()\n }\n}\n\nexport class PanoMixedControllerV2 extends MixedController {\n public refreshPoint() { (this.rangePieceController as PanoRangePieceV2).refresh() }\n protected override createPreviewLine() {\n return new PanoPreviewLine(new Point([0, 0, 0]), new Point([0, 0, 0]), this.model)\n }\n\n public constructor(params: PanoControllerParamsV2) {\n super(params)\n configurePreview(this.dashed)\n configurePreview(this.perpendicularDashed)\n }\n\n public get selector() { return (this.rangePieceController as PanoRangePieceV2).selector }\n\n protected override createRangePieceController(params: ControllerParams) {\n return new PanoRangePieceV2(params as PanoControllerParamsV2)\n }\n}\n\nexport class PanoWatchControllerV2 extends WatchController {\n public readonly selector: PanoPointSelector\n\n public constructor(params: PanoControllerParamsV2) {\n super(params)\n this.selector = new PanoPointSelector(params.five, { ...params.pointSelectorConfig, helper: { ...params.pointSelectorConfig?.helper, container: params.container } }, params.edgeSnapOptions, params.magnifier as MeasureMagnifier)\n }\n\n protected override resolveIntersection(intersection: Intersection, mouse: Vector2): Intersection {\n this.mouseGroup.visible = false\n return this.selector.resolveIntersection(intersection, { x: (mouse.x + 1) / 2, y: (mouse.y + 1) / 2 }) ?? intersection\n }\n\n protected override onPointEditEnd() {\n this.selector.resetSnap()\n this.selector.pointSelectorHelper.hide()\n }\n\n public override dispose() {\n this.selector.dispose()\n super.dispose()\n }\n}\n","import type { Five } from '@realsee/five-webgpu'\nimport PanoMeasureController, { type ModeControllerConstructor, type PanoMeasureParameterType } from '../PanoMeasurePlugin/Controller'\nimport EditController from '../PanoMeasurePlugin/Controller/EditController'\nimport MixedController from '../PanoMeasurePlugin/Controller/MixedController'\nimport WatchController from '../PanoMeasurePlugin/Controller/WatchController'\nimport type { ControllerParams } from '../PanoMeasurePlugin/Controller/BaseController'\nimport { PanoMagnifier } from './PointSelector'\nimport { resolveEdgeSnapOptions, type EdgeSnapOptions, type ResolvedEdgeSnapOptions } from '../MeasurePluginV2/edgeSnap'\nimport type { MagnifierParameter } from '../shared-utils'\nimport { isTouchDevice } from '../shared-utils/isTouchDevice'\nimport { PanoEditControllerV2, PanoMixedControllerV2, PanoWatchControllerV2 } from './controllers'\n\nexport type PanoMeasurePluginV2Config = PanoMeasureParameterType & { edgeSnap?: boolean | EdgeSnapOptions }\n\n/** Reuses panorama modes, events, models and serialization; only V2 picking changes. */\nexport class PanoMeasureControllerV2 extends PanoMeasureController {\n private readonly edgeSnapOptions: ResolvedEdgeSnapOptions\n private mobileStyle?: HTMLStyleElement\n private readonly mixedSavedPolylineIDs = new WeakMap<PanoMixedControllerV2, Set<string>>()\n\n public constructor(five: Five, params: PanoMeasurePluginV2Config = {}) {\n const mobile = params.openParams?.isMobile ?? isTouchDevice\n const resolved: PanoMeasurePluginV2Config = {\n ...params,\n openParams: { ...params.openParams, isMobile: mobile },\n editParams: { ...params.editParams, pointSelectorMode: params.editParams?.pointSelectorMode ?? (mobile ? 'fixed' : 'cursor'), autoEndConfig: mobile ? { line: 2, ...params.editParams?.autoEndConfig } : params.editParams?.autoEndConfig },\n useUIController: mobile && params.useUIController !== false\n ? { useNewUI: true, mode: 'mobile', ...(typeof params.useUIController === 'object' ? params.useUIController : {}) }\n : params.useUIController,\n pointSelectorConfig: {\n ...params.pointSelectorConfig,\n helper: {\n ...params.pointSelectorConfig?.helper,\n magnifierParams: {\n ...(mobile ? { width: 150, height: 150, dragEnabled: false, autoFixPCPosition: false, initialPosition: { left: '12px', top: '12px' } } : {}),\n ...params.pointSelectorConfig?.helper?.magnifierParams,\n },\n },\n },\n }\n super(five, resolved)\n this.edgeSnapOptions = resolveEdgeSnapOptions(params.edgeSnap)\n }\n\n public get pointSelector() {\n const controller = this.controller\n return controller instanceof PanoEditControllerV2 || controller instanceof PanoMixedControllerV2 || controller instanceof PanoWatchControllerV2 ? controller.selector : undefined\n }\n\n public get lastEdgeSnapEdgeCount() { return this.pointSelector?.lastEdgeSnapEdgeCount ?? 0 }\n public get edgeSnapEnabled() { return this.edgeSnapOptions.enabled }\n\n public setEdgeSnapEnabled(enabled: boolean) {\n this.edgeSnapOptions.enabled = enabled\n this.pointSelector?.resetSnap()\n if (this.controller instanceof PanoMixedControllerV2) this.controller.refreshPoint()\n else this.pointSelector?.refresh()\n this.five.needsRender = true\n }\n\n public override clear() {\n const Controller = this.controller instanceof PanoEditControllerV2 ? EditController\n : this.controller instanceof PanoMixedControllerV2 ? MixedController : undefined\n if (Controller) {\n const mode = Controller === EditController ? 'Edit' : 'Mixed'\n // Discard both the working lines and an unfinished start point. Recreate the\n // same mode so its input, cursor and UI return to their initial state.\n this.controller!.dispose()\n super.clear()\n this.controller = this.createModeController(this.createControllerParams(), Controller)\n this.hooks.emit('modeChange', mode)\n this.resetUIController()\n return\n }\n super.clear()\n }\n\n public override load(data: Parameters<PanoMeasureController['load']>[0]) {\n // Finish the old session before parsing replacement data. The inherited load\n // calls save() virtually and must not merge the previous Mixed working model.\n if (this.hasOpen) {\n this.save({ mode: 'View' })\n this.changeMode('View')\n }\n super.load(data)\n }\n\n public override save(config?: Parameters<PanoMeasureController['save']>[0]) {\n if (this.controller instanceof PanoMixedControllerV2) {\n // Only reconcile lines committed by this working session. Older saved\n // measurements are absent from Mixed's working model and must be retained.\n const working = this.controller.model\n for (const id of this.mixedSavedPolylineIDs.get(this.controller) ?? []) {\n if (!working.getPolylineByID(id)) this.removePolylineByID(id)\n }\n for (const polyline of working.polylines) {\n if (!this.model.getPolylineByID(polyline.id)) this.model.addPolyline(polyline)\n }\n this.mixedSavedPolylineIDs.set(this.controller, new Set(working.polylines.map(polyline => polyline.id)))\n }\n return super.save(config)\n }\n\n public override removePolylineByID(id: string) {\n const polyline = this.model.getPolylineByID(id)\n ?? (this.controller instanceof PanoMixedControllerV2 ? this.controller.model.getPolylineByID(id) : undefined)\n if (polyline) this.removePolyline(polyline)\n }\n\n public override removePolyline(polyline: Parameters<PanoMeasureController['removePolyline']>[0]) {\n if (this.controller instanceof PanoMixedControllerV2) {\n const working = this.controller.model.getPolylineByID(polyline.id)\n if (working) this.controller.model.removePolyline(working)\n }\n super.removePolyline(polyline)\n }\n\n public override dispose() {\n super.dispose()\n this.mobileStyle?.remove()\n this.mobileStyle = undefined\n }\n\n protected override createControllerParams() {\n const params = super.createControllerParams()\n params.container.classList.add('pano-measure-v2-container')\n if (!this.mobileStyle) {\n this.mobileStyle = document.createElement('style')\n this.mobileStyle.textContent = `\n @media (max-height: 500px) and (pointer: coarse) {\n .pano-measure-v2-container .Measure-Controller .bottom .center {\n align-items: flex-end; margin-bottom: 12px; padding-right: 12px;\n }\n .pano-measure-v2-container .Measure-Controller .main-button { margin-inline: 0; }\n }\n `\n params.container.append(this.mobileStyle)\n }\n return params\n }\n\n protected override createMagnifier(five: Five, options: MagnifierParameter) {\n return new PanoMagnifier(five, options)\n }\n\n protected override createModeController(params: ControllerParams, Controller: ModeControllerConstructor) {\n const v2Params = { ...params, edgeSnapOptions: this.edgeSnapOptions }\n if (Controller === EditController) return new PanoEditControllerV2(v2Params)\n if (Controller === MixedController) return new PanoMixedControllerV2(v2Params)\n if (Controller === WatchController) return new PanoWatchControllerV2(v2Params)\n return super.createModeController(params, Controller)\n }\n}\n","import type { Five } from '@realsee/five-webgpu'\nimport { PanoMeasureControllerV2, type PanoMeasurePluginV2Config } from './Controller'\n\nexport { PanoMeasureControllerV2 }\nexport type { PanoMeasurePluginV2Config }\nexport type { MeasurePluginData as PanoMeasurePluginV2Data, MeasurePluginServerData as PanoMeasurePluginV2ServerData } from '../PanoMeasurePlugin/typings/data'\nexport type PanoMeasurePluginV2Instance = PanoMeasureControllerV2\nexport const PanoMeasurePluginV2 = (five: Five, params: PanoMeasurePluginV2Config = {}) => new PanoMeasureControllerV2(five, params)\nexport default PanoMeasurePluginV2\n"],"mappings":"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"}
@@ -0,0 +1,240 @@
1
+ import { t as e } from "./throttle-YRIkRKaX.js";
2
+ import { n as t } from "./planimetry-us3E4V8W.js";
3
+ import { Raycaster as n, Vector3 as r } from "three/webgpu";
4
+ import { Five as i } from "@realsee/five-webgpu";
5
+ //#region src/shared-utils/nextFrame.ts
6
+ function a(e, t = 0) {
7
+ requestAnimationFrame(t <= 0 ? e : () => a(e, t - 1));
8
+ }
9
+ //#endregion
10
+ //#region src/PanoRulerPlugin/room-height.ts
11
+ var o = 2.7;
12
+ function s(e, t, n) {
13
+ let r = {}, i = {};
14
+ return t.forEach((t, a) => {
15
+ let o = t.standingPosition, s = e.observers[a];
16
+ if (!o || !s || !e.rooms[s]) return;
17
+ (r[s] ||= []).push(o.y);
18
+ let c = n(o);
19
+ c !== null && Number.isFinite(c) && c > o.y && (i[s] ||= []).push(c);
20
+ }), Object.keys(r).reduce((e, t) => {
21
+ let n = r[t].slice().sort((e, t) => e - t), a = n[Math.floor(n.length / 2)], s = i[t];
22
+ return e[t] = {
23
+ floor: a,
24
+ roof: s?.length ? Math.max(...s) : a + o
25
+ }, e;
26
+ }, {});
27
+ }
28
+ //#endregion
29
+ //#region src/PanoRulerPlugin/style.ts
30
+ var c = "<style type=\"text/css\">\n.PanoRulerPlugin-rule-line {\n position: absolute;\n transform-origin: left center;\n width: 0;\n height: 0.0625rem;\n}\n\n.PanoRulerPlugin-rule-line::after {\n content: '';\n position: absolute;\n left: -0.125rem;\n top: -0.1rem;\n width: 0.25rem;\n height: 0.25rem;\n border-radius: 50%;\n background: #FFFFFF;\n z-index: 1;\n animation: viewport-rule-point 0.1s 1s;\n animation-fill-mode: both;\n}\n\n.PanoRulerPlugin-rule-line::before {\n content: '';\n position: absolute;\n right: -0.125rem;\n top: -0.1rem;\n width: 0.25rem;\n height: 0.25rem;\n border-radius: 50%;\n background: #FFFFFF;\n animation: viewport-rule-point 0.1s 1.5s;\n animation-fill-mode: both;\n}\n\n.PanoRulerPlugin-rule-line em {\n background: #fff;\n display: block;\n height: 100%;\n animation: viewport-rule-line 0.5s ease 1s;\n animation-fill-mode: both;\n box-shadow: 0 0 0.25rem rgb(0 0 0 / 40%);\n}\n\n.PanoRulerPlugin-rule-label {\n position: absolute;\n width: 0;\n height: 0;\n top: 0.0625rem;\n}\n\n.PanoRulerPlugin-rule-label-name {\n position: absolute;\n padding: 0.1875rem 0.375rem;\n background: rgba(195,195,195,0.30);\n backdrop-filter: blur(0.25rem);\n -webkit-backdrop-filter: blur(0.25rem);\n border-radius: 6.25rem;\n border: 0.0625rem solid rgba(255,255,255,0.6);\n white-space: nowrap;\n overflow: hidden;\n color: #FFFFFF;\n font-weight: 500;\n font-size: 0.75rem;\n line-height: 1;\n -webkit-animation: viewport-rule-label 0.25s ease 1s;\n animation: viewport-rule-label 0.25s ease 1s;\n animation-fill-mode: both;\n box-shadow: inset 0 0 0.625rem 0 rgba(255,255,255,0.30);\n}\n\n@keyframes viewport-rule-line {\n 0% { width: 0% }\n 100% { width: 100% }\n}\n\n@keyframes viewport-rule-label {\n 0% { opacity: 0; transform: scaleX(0); }\n 100% { opacity: 1; transform: translate(-50%, -50%) scaleX(1); }\n}\n\n@keyframes viewport-rule-point {\n 0% { transform: scaleX(0); }\n 100% { transform: scaleX(1); }\n}\n</style>\n", l = (e, t) => Math.sqrt((e.z - t.z) ** 2 + (e.x - t.x) ** 2), u = (o, u) => {
31
+ let d = {
32
+ enable: !1,
33
+ loaded: !1,
34
+ options: u.options || { distanceText: (e) => `${e.toFixed(1)}m` }
35
+ }, f = (e, t) => {
36
+ let n = `
37
+ <div class="PanoRulerPlugin-rule-line">
38
+ <em></em>
39
+ <div class="PanoRulerPlugin-rule-label">
40
+ <div class="PanoRulerPlugin-rule-label-name">${d.options.distanceText(t)}</div>
41
+ </div>
42
+ </div>
43
+ `, r = document.createElement("div");
44
+ return r.setAttribute("class", "PanoRulerPlugin-rule"), r.setAttribute("data-name", e), r.setAttribute("style", "display: none"), r.innerHTML = n, r;
45
+ }, p = document.createElement("div");
46
+ p.setAttribute("style", "position: absolute;pointer-events: none;width: 100%;height: 100%;left: 0;top: 0;overflow: hidden;");
47
+ let m = document.createElement("div");
48
+ m.innerHTML = c, p.appendChild(m);
49
+ let h = {}, g = (e, t) => {
50
+ if (d.loaded) throw Error("标尺被重复初始化!");
51
+ let i = o.work;
52
+ if (!i) return !1;
53
+ let a = new n(), c = new r(0, 1, 0), u = s(e, i.observers, (e) => {
54
+ a.set(e, c);
55
+ let [t] = o.model.intersectRaycaster(a);
56
+ return t ? t.point.y : null;
57
+ });
58
+ for (let n in t) {
59
+ let a = t[n], o = i.observers[0]?.standingPosition;
60
+ if (!o) return;
61
+ let s = a.map(({ x: t, z: n, observers: a }) => {
62
+ let s = a.length > 0 ? e.observers[a[0]] : "", c = u[s], d = c?.floor ?? null, f = Infinity, p = {
63
+ index: 0,
64
+ x: o.x,
65
+ y: o.y,
66
+ z: o.z
67
+ };
68
+ a.forEach((e) => {
69
+ if (!i.observers[e]) return;
70
+ let { standingPosition: r } = i.observers[e], a = {
71
+ index: e,
72
+ x: r.x,
73
+ y: r.y,
74
+ z: r.z
75
+ }, o = l({
76
+ x: t,
77
+ z: n
78
+ }, a);
79
+ d === null ? o < f && (f = o, p = a) : o < f && Math.abs(a.y - d) < .3 && (f = o, p = a);
80
+ });
81
+ let m = new r(t, p.y, n);
82
+ Object.assign(m, { observers: a });
83
+ let h = c?.roof ?? null, g = h ? new r(t, h, n) : null;
84
+ return g && Object.assign(g, { observers: a }), {
85
+ origin: m,
86
+ vertical: g
87
+ };
88
+ });
89
+ h[n] = {
90
+ origins: s.map((e) => e.origin),
91
+ rules: []
92
+ };
93
+ for (let { origin: e, vertical: t } of s) {
94
+ if (!t) continue;
95
+ let r = f(n, e.distanceTo(t));
96
+ p.append(r), h[n].rules.push({
97
+ vertical: !0,
98
+ rule: [e, t],
99
+ $element: r
100
+ });
101
+ }
102
+ for (let e = 0; e < s.length; e++) {
103
+ let t = e + 1;
104
+ t >= s.length && (t = 0);
105
+ let { origin: r } = s[e], { origin: i } = s[t], a = f(n, r.distanceTo(i));
106
+ p.append(a), h[n].rules.push({
107
+ vertical: !1,
108
+ rule: [r, i],
109
+ $element: a
110
+ });
111
+ }
112
+ }
113
+ return d.loaded = !0, !0;
114
+ }, _ = async (e, t, n) => {
115
+ let r = e || u.roomInfo, i = t || u.roomRules;
116
+ if (!r || !i) throw Error("标尺数据依赖不齐全!");
117
+ return d.loaded = !1, d.options = {
118
+ ...d.options,
119
+ ...n || {}
120
+ }, o.model.loaded ? g(r, i) : await new Promise((e) => o.once("modelLoaded", () => e(g(r, i))));
121
+ };
122
+ u.roomInfo && u.roomRules && _(u.roomInfo, u.roomRules);
123
+ let v = (e, n, r, i) => {
124
+ let a = [
125
+ [{
126
+ x: 0,
127
+ y: 0
128
+ }, {
129
+ x: r,
130
+ y: 0
131
+ }],
132
+ [{
133
+ x: 0,
134
+ y: 0
135
+ }, {
136
+ x: 0,
137
+ y: i
138
+ }],
139
+ [{
140
+ x: r,
141
+ y: 0
142
+ }, {
143
+ x: r,
144
+ y: i
145
+ }],
146
+ [{
147
+ x: 0,
148
+ y: i
149
+ }, {
150
+ x: r,
151
+ y: i
152
+ }]
153
+ ], o = [];
154
+ for (let r = 0; r < a.length; r++) {
155
+ let i = t([e, n], [a[r][0], a[r][1]], !0);
156
+ i && o.push(i);
157
+ }
158
+ return o.length !== 0 && o;
159
+ }, y = () => {
160
+ let e = o.getElement()?.parentElement;
161
+ if (!e || !d.loaded || Object.keys(h).length <= 0) return;
162
+ let { panoIndex: t, camera: n, currentMode: a } = o;
163
+ if (t === void 0) return;
164
+ let s;
165
+ for (let e in h) e.split(",").indexOf(t.toString()) >= 0 && (s = e);
166
+ if (!s) {
167
+ for (let e in h) for (let { $element: t } of h[e].rules) t.style.display = "none";
168
+ return;
169
+ }
170
+ let c = n.position, l = n.getWorldDirection(new r()), u = e.clientWidth, f = e.clientHeight;
171
+ if (a !== i.Mode.Panorama) {
172
+ for (let e in h) for (let { $element: t } of h[e].rules) t.style.display = "none";
173
+ return;
174
+ }
175
+ for (let e in h) for (let { $element: t } of h[e].rules) t.style.display = e === s ? "block" : "none";
176
+ let p = [], [m] = h[s].origins.slice().filter((e) => e.observers.indexOf(t) >= 0).sort((e, t) => e.clone().setY(0).sub(c).normalize().angleTo(l.clone().setY(0)) - t.clone().setY(0).sub(c).normalize().angleTo(l.clone().setY(0))), g = [];
177
+ for (let { rule: e, vertical: i, $element: a } of h[s].rules) {
178
+ let [o, s] = e, d = a.querySelector(".PanoRulerPlugin-rule-line");
179
+ if (!d) return;
180
+ if (!m || o !== m && s !== m || o.distanceTo(s) < .3 || o.observers.indexOf(t) === -1 || s.observers.indexOf(t) === -1) {
181
+ a.style.display = "none";
182
+ continue;
183
+ }
184
+ let h = o.clone().sub(c).normalize().angleTo(l);
185
+ if (h > Math.PI / 2 || s.clone().sub(c).normalize().angleTo(l) > Math.PI / 2) {
186
+ a.style.display = "none";
187
+ continue;
188
+ }
189
+ let _ = o.distanceTo(s);
190
+ if (s.clone().sub(s.clone().sub(o).divide(new r(2, 2, 2))).distanceTo(c) / _ > 8) {
191
+ a.style.display = "none";
192
+ continue;
193
+ }
194
+ i || g.push(e), i && p.push({
195
+ $element: a,
196
+ startAngle: h
197
+ });
198
+ let y = o.clone().project(n), b = (y.x + 1) / 2 * u, x = (-y.y + 1) / 2 * f, S = s.clone().project(n), C = (S.x + 1) / 2 * u, w = (-S.y + 1) / 2 * f, T = Math.sqrt((C - b) ** 2 + (w - x) ** 2), E = T, D = 50, O = v({
199
+ x: ~~b,
200
+ y: ~~x
201
+ }, {
202
+ x: ~~C,
203
+ y: ~~w
204
+ }, u, f);
205
+ if (O && O.length === 1 && (m === o ? (E = Math.sqrt((O[0].x - b) ** 2 + (O[0].y - x) ** 2), D = E / T * 50) : m === s && (E = Math.sqrt((O[0].x - C) ** 2 + (O[0].y - w) ** 2), D = 100 - E / T * 50)), O && O.length === 2) {
206
+ let e = {
207
+ x: (O[0].x + O[1].x) / 2,
208
+ y: (O[0].y + O[1].y) / 2
209
+ };
210
+ D = Math.sqrt((e.x - b) ** 2 + (e.y - x) ** 2) / T * 100;
211
+ }
212
+ let k = (Math.PI / 2 - Math.atan2(C - b, x - w)) / Math.PI * 180, A = d.querySelector(".PanoRulerPlugin-rule-label"), j = A.children[0].clientWidth;
213
+ j >= T || j / 2 >= D / 100 * T || j / 2 >= (1 - D / 100) * T ? d.style.display = "none" : (d.style.display = "block", d.style.width = T + "px", d.style.left = b + "px", d.style.top = x + "px", d.style.transform = `rotate(${-k}deg)`, A.style.left = `${D}%`);
214
+ }
215
+ }, b = () => a(y);
216
+ e(y, 80);
217
+ let x = () => d.loaded ? (d.enable ||= (p.setAttribute("class", "PanoRulerPlugin" + (d.options.className ? " " + d.options.className : "")), o.getElement()?.parentElement?.append(p), y(), o.on("modeChange", y), o.on("cameraUpdate", b), !0), !0) : !1, S = () => (d.enable &&= (o.off("modeChange", y), o.off("cameraUpdate", b), p && p.remove(), !1), !0);
218
+ function C(e) {
219
+ if (e.distanceText && e.distanceText !== d.options.distanceText) {
220
+ let t = e.distanceText;
221
+ d.options.distanceText = t, Object.values(h).forEach((e) => {
222
+ e.rules.forEach((e) => {
223
+ let [n, r] = e.rule, i = n.distanceTo(r), a = e.$element.querySelector(".PanoRulerPlugin-rule-label-name");
224
+ a && (a.innerText = t(i));
225
+ });
226
+ });
227
+ }
228
+ }
229
+ return {
230
+ enable: x,
231
+ disable: S,
232
+ load: _,
233
+ state: d,
234
+ changeConfigs: C
235
+ };
236
+ };
237
+ //#endregion
238
+ export { u as t };
239
+
240
+ //# sourceMappingURL=pano-ruler-BW78w4lv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pano-ruler-BW78w4lv.js","names":["throttle","intersectionOfLine","nextFrame","delay","fn","DEFAULT_ROOM_HEIGHT","getRoomHeightInfo","floors","roofs","observers","position","observer","roomId","roomInfo","index","roofY","resolveIntersectionY","floorValues","a","b","floor","roofValues","result","PanoRulerStyle","getDistance","p1","p2","PanoRulerPlugin","state","params","distance","tpl","domStr","res","name","$rule","style","__rule","_load","work","five","raycaster","Raycaster","upward","Vector3","roomHeightInfo","point","intersection","obKey","roomRules","points","defaultPosition","roomPoints","pointRoomId","roomHeight","medianFloorHeight","minDistance","nearestPoint","observerPoint","_origin","x","z","verticalY","_vertical","roomPoint","vertical","$element","origin","nextIndex","next","load","_roomInfo","_roomRules","options","resolve","getRuleScreenIntr","screenLines","canvasWidth","canvasHeight","intr","i","startPoint","endPoint","freshRule","element","panoIndex","_name","cameraPosition","camera","cameraDirection","width","height","currentMode","Five","verticalLines","visibleOrigin","pointA","pointB","shownNotVerticalRules","start","end","rule","$line","startAngle","ruleLength","mouseStart","startLeft","startTop","mouseEnd","endLeft","endTop","visibleLength","labelOffset","middlePoint","deg","$label","labelWidth","nextFrameFreshRule","enable","disable","changeConfigs","config","distanceText","textEle"],"sources":["../../src/shared-utils/nextFrame.ts","../../src/PanoRulerPlugin/room-height.ts","../../src/PanoRulerPlugin/style.ts","../../src/PanoRulerPlugin/Plugin.ts"],"sourcesContent":["export function nextFrame(fn: () => void, delay = 0) {\n if (delay <= 0) requestAnimationFrame(fn)\n else requestAnimationFrame(() => nextFrame(fn, delay - 1))\n}\n","import type { Vector3 } from 'three/webgpu'\nimport type { RoomInfo } from './typings'\n\nexport const DEFAULT_ROOM_HEIGHT = 2.7\n\nexport interface RoomHeight {\n floor: number\n roof: number\n}\n\ninterface ObserverPosition {\n standingPosition?: Vector3\n}\n\nexport type IntersectionYResolver = (point: Vector3) => number | null\n\n/**\n * 按房间 ID 计算地面和屋顶高度。\n *\n * 房间名称可能重复(例如多个房间都叫 OTHER),不能作为高度分组的键。\n * 射线未命中时按“地面 + 默认层高”回退,不能把默认层高当成世界坐标 Y。\n */\nexport function getRoomHeightInfo(\n roomInfo: RoomInfo,\n observers: readonly ObserverPosition[],\n resolveIntersectionY: IntersectionYResolver,\n): Record<string, RoomHeight> {\n const floors: Record<string, number[]> = {}\n const roofs: Record<string, number[]> = {}\n\n observers.forEach((observer, index) => {\n const position = observer.standingPosition\n const roomId = roomInfo.observers[index]\n if (!position || !roomId || !roomInfo.rooms[roomId]) return\n ;(floors[roomId] ||= []).push(position.y)\n\n const roofY = resolveIntersectionY(position)\n if (roofY !== null && Number.isFinite(roofY) && roofY > position.y) {\n ;(roofs[roomId] ||= []).push(roofY)\n }\n })\n\n return Object.keys(floors).reduce<Record<string, RoomHeight>>((result, roomId) => {\n const floorValues = floors[roomId].slice().sort((a, b) => a - b)\n const floor = floorValues[Math.floor(floorValues.length / 2)]\n const roofValues = roofs[roomId]\n const roof = roofValues?.length ? Math.max(...roofValues) : floor + DEFAULT_ROOM_HEIGHT\n\n result[roomId] = { floor, roof }\n return result\n }, {})\n}\n","const PanoRulerStyle =\n`<style type=\"text/css\">\n.PanoRulerPlugin-rule-line {\n position: absolute;\n transform-origin: left center;\n width: 0;\n height: 0.0625rem;\n}\n\n.PanoRulerPlugin-rule-line::after {\n content: '';\n position: absolute;\n left: -0.125rem;\n top: -0.1rem;\n width: 0.25rem;\n height: 0.25rem;\n border-radius: 50%;\n background: #FFFFFF;\n z-index: 1;\n animation: viewport-rule-point 0.1s 1s;\n animation-fill-mode: both;\n}\n\n.PanoRulerPlugin-rule-line::before {\n content: '';\n position: absolute;\n right: -0.125rem;\n top: -0.1rem;\n width: 0.25rem;\n height: 0.25rem;\n border-radius: 50%;\n background: #FFFFFF;\n animation: viewport-rule-point 0.1s 1.5s;\n animation-fill-mode: both;\n}\n\n.PanoRulerPlugin-rule-line em {\n background: #fff;\n display: block;\n height: 100%;\n animation: viewport-rule-line 0.5s ease 1s;\n animation-fill-mode: both;\n box-shadow: 0 0 0.25rem rgb(0 0 0 / 40%);\n}\n\n.PanoRulerPlugin-rule-label {\n position: absolute;\n width: 0;\n height: 0;\n top: 0.0625rem;\n}\n\n.PanoRulerPlugin-rule-label-name {\n position: absolute;\n padding: 0.1875rem 0.375rem;\n background: rgba(195,195,195,0.30);\n backdrop-filter: blur(0.25rem);\n -webkit-backdrop-filter: blur(0.25rem);\n border-radius: 6.25rem;\n border: 0.0625rem solid rgba(255,255,255,0.6);\n white-space: nowrap;\n overflow: hidden;\n color: #FFFFFF;\n font-weight: 500;\n font-size: 0.75rem;\n line-height: 1;\n -webkit-animation: viewport-rule-label 0.25s ease 1s;\n animation: viewport-rule-label 0.25s ease 1s;\n animation-fill-mode: both;\n box-shadow: inset 0 0 0.625rem 0 rgba(255,255,255,0.30);\n}\n\n@keyframes viewport-rule-line {\n 0% { width: 0% }\n 100% { width: 100% }\n}\n\n@keyframes viewport-rule-label {\n 0% { opacity: 0; transform: scaleX(0); }\n 100% { opacity: 1; transform: translate(-50%, -50%) scaleX(1); }\n}\n\n@keyframes viewport-rule-point {\n 0% { transform: scaleX(0); }\n 100% { transform: scaleX(1); }\n}\n</style>\n`\n\nexport default PanoRulerStyle\n","\n\nimport type { FivePlugin } from '@realsee/five-webgpu'\nimport type { RoomInfo, RoomRules } from './typings'\nimport { Five } from '@realsee/five-webgpu'\nimport { Raycaster, Vector3 } from 'three/webgpu'\nimport { intersectionOfLine } from '../shared-utils/math/planimetry'\nimport { nextFrame } from '../shared-utils/nextFrame'\nimport throttle from '../shared-utils/throttle'\nimport { getRoomHeightInfo } from './room-height'\nimport PanoRulerStyle from './style'\n\ninterface PanoRulerPluginConfig {\n distanceText: (distance: number) => string\n}\n\nexport interface PanoRulerPluginOptions extends Partial<PanoRulerPluginConfig> {\n className?: string\n}\n\ninterface PanoRulerPluginPluginState {\n enable: boolean\n loaded: boolean\n options: PanoRulerPluginOptions\n}\n\nexport interface PanoRulerPluginParameterType {\n roomInfo?: RoomInfo\n roomRules?: RoomRules\n options?: PanoRulerPluginOptions\n}\n\nexport interface PanoRulerPluginExportType {\n enable: () => void\n disable: () => void\n load: (roomInfo?: RoomInfo, roomRules?: RoomRules, options?: PanoRulerPluginOptions) => Promise<boolean>\n state: PanoRulerPluginPluginState\n changeConfigs: (config: Partial<PanoRulerPluginConfig>) => void\n}\n\nconst getDistance = (p1: { x: number; z: number }, p2: { x: number; z: number }) => {\n return Math.sqrt(Math.pow(p1.z - p2.z, 2) + Math.pow(p1.x - p2.x, 2))\n}\n\ninterface Origin extends Vector3 {\n observers: number[]\n}\n\ninterface Rule {\n [key: string]: {\n origins: Origin[]\n rules: {\n vertical: boolean\n rule: Origin[]\n $element: HTMLDivElement\n }[]\n }\n}\n\n/**\n * 全景标尺插件\n */\nexport const PanoRulerPlugin: FivePlugin<PanoRulerPluginParameterType, PanoRulerPluginExportType> = (five: Five, params) => {\n const state: PanoRulerPluginPluginState = {\n enable: false,\n loaded: false,\n options: params.options || {\n distanceText: (distance) => `${distance.toFixed(1)}m`,\n },\n }\n\n const tpl = (name: string, distance: number) => {\n const domStr = `\n <div class=\"PanoRulerPlugin-rule-line\">\n <em></em>\n <div class=\"PanoRulerPlugin-rule-label\">\n <div class=\"PanoRulerPlugin-rule-label-name\">${state.options.distanceText!(distance)}</div>\n </div>\n </div>\n `\n const res = document.createElement('div')\n res.setAttribute('class', 'PanoRulerPlugin-rule')\n res.setAttribute('data-name', name)\n res.setAttribute('style', 'display: none')\n res.innerHTML = domStr\n return res\n }\n\n const $rule = document.createElement('div')\n $rule.setAttribute('style', `position: absolute;pointer-events: none;width: 100%;height: 100%;left: 0;top: 0;overflow: hidden;`)\n\n // 添加标尺样式\n const style = document.createElement('div')\n style.innerHTML = PanoRulerStyle\n $rule.appendChild(style)\n\n const __rule: Rule = {}\n\n const _load = (roomInfo: RoomInfo, roomRules: RoomRules) => {\n if (state.loaded) {\n throw new Error('标尺被重复初始化!')\n }\n const work = five.work\n if (!work) return false\n const raycaster = new Raycaster()\n const upward = new Vector3(0, 1, 0)\n const roomHeightInfo = getRoomHeightInfo(roomInfo, work.observers, (point) => {\n raycaster.set(point, upward)\n const [intersection] = five.model.intersectRaycaster(raycaster)\n return intersection ? intersection.point.y : null\n })\n for (const obKey in roomRules) {\n const points = roomRules[obKey]\n const defaultPosition = work.observers[0]?.standingPosition\n if (!defaultPosition) return\n const roomPoints = points.map(({ x, z, observers }) => {\n const pointRoomId = observers.length > 0 ? roomInfo.observers[observers[0]] : ''\n const roomHeight = roomHeightInfo[pointRoomId]\n const medianFloorHeight = roomHeight?.floor ?? null\n let minDistance = Infinity\n let nearestPoint = {\n index: 0,\n x: defaultPosition.x,\n y: defaultPosition.y,\n z: defaultPosition.z,\n }\n\n observers.forEach((index) => {\n if (!work.observers[index]) return\n const { standingPosition: position } = work.observers[index]\n const observerPoint = {\n index,\n x: position.x,\n y: position.y,\n z: position.z,\n }\n const distance = getDistance({ x, z }, observerPoint)\n if (medianFloorHeight !== null) {\n // 取最近点时排除高度与房间平均高度差大于0.3米的点\n if (distance < minDistance && Math.abs(observerPoint.y - medianFloorHeight) < 0.3) {\n minDistance = distance\n nearestPoint = observerPoint\n }\n } else {\n if (distance < minDistance) {\n minDistance = distance\n nearestPoint = observerPoint\n }\n }\n })\n const _origin = new Vector3(x, nearestPoint.y, z)\n Object.assign(_origin, { observers })\n\n const verticalY = roomHeight?.roof ?? null\n const _vertical = !verticalY ? null : new Vector3(x, verticalY, z)\n if (_vertical) Object.assign(_vertical, { observers })\n\n const origin = _origin as Origin\n const vertical = _vertical as Origin\n return { origin, vertical }\n })\n\n __rule[obKey] = {\n origins: roomPoints.map((roomPoint) => roomPoint.origin) as Origin[],\n rules: [],\n }\n\n for (const { origin, vertical } of roomPoints) {\n if (!vertical) continue\n\n const $element = tpl(obKey, origin.distanceTo(vertical))\n $rule.append($element)\n __rule[obKey].rules.push({ vertical: true, rule: [origin, vertical], $element })\n }\n\n for (let index = 0; index < roomPoints.length; index++) {\n let nextIndex = index + 1\n if (nextIndex >= roomPoints.length) nextIndex = 0\n\n const { origin } = roomPoints[index]\n const { origin: next } = roomPoints[nextIndex]\n\n const $element = tpl(obKey, origin.distanceTo(next))\n $rule.append($element)\n __rule[obKey].rules.push({ vertical: false, rule: [origin, next], $element })\n }\n }\n\n state.loaded = true\n\n // freshRule()\n return true\n }\n\n const load = async (_roomInfo?: RoomInfo, _roomRules?: RoomRules, options?: PanoRulerPluginOptions) => {\n const roomInfo = _roomInfo || params.roomInfo\n const roomRules = _roomRules || params.roomRules\n\n if (!roomInfo || !roomRules) {\n throw new Error('标尺数据依赖不齐全!')\n }\n\n state.loaded = false\n\n state.options = { ...state.options, ...(options || {}) }\n if (five.model.loaded) {\n return _load(roomInfo, roomRules)\n } else {\n return await new Promise<boolean>((resolve) => five.once('modelLoaded', () => resolve(_load(roomInfo!, roomRules!))))\n }\n }\n\n if (params.roomInfo && params.roomRules) {\n load(params.roomInfo, params.roomRules)\n }\n\n const getRuleScreenIntr = (\n startPoint: { x: number; y: number },\n endPoint: { x: number; y: number },\n canvasWidth: number,\n canvasHeight: number,\n ) => {\n const screenLines = [\n [\n { x: 0, y: 0 },\n { x: canvasWidth, y: 0 },\n ],\n [\n { x: 0, y: 0 },\n { x: 0, y: canvasHeight },\n ],\n [\n { x: canvasWidth, y: 0 },\n { x: canvasWidth, y: canvasHeight },\n ],\n [\n { x: 0, y: canvasHeight },\n { x: canvasWidth, y: canvasHeight },\n ],\n ]\n const intr = []\n for (let i = 0; i < screenLines.length; i++) {\n const result = intersectionOfLine([startPoint, endPoint], [screenLines[i][0], screenLines[i][1]], true)\n if (result) intr.push(result)\n }\n if (intr.length === 0) return false\n else {\n return intr\n }\n }\n\n const freshRule = () => {\n const element = five.getElement()?.parentElement\n if (!element) return\n if (!state.loaded) return\n if (Object.keys(__rule).length <= 0) return\n const { panoIndex, camera, currentMode } = five\n\n if (panoIndex === undefined) return\n\n let name\n for (const _name in __rule) {\n if (_name.split(',').indexOf(panoIndex.toString()) >= 0) name = _name\n }\n if (!name) {\n for (const _name in __rule) {\n for (const { $element } of __rule[_name].rules) {\n $element.style.display = 'none'\n }\n }\n\n return\n }\n\n const cameraPosition = camera.position\n const cameraDirection = camera.getWorldDirection(new Vector3())\n\n const width = element.clientWidth\n const height = element.clientHeight\n\n // 非全景模式下隐藏所有标尺\n if (currentMode !== Five.Mode.Panorama) {\n for (const _name in __rule) {\n for (const { $element } of __rule[_name].rules) {\n $element.style.display = 'none'\n }\n }\n\n return\n }\n\n // 隐藏非当前点位的标尺\n for (const _name in __rule) {\n for (const { $element } of __rule[_name].rules) {\n $element.style.display = _name === name ? 'block' : 'none'\n }\n }\n\n const verticalLines = []\n // 可以看到的角度最小的拐点\n const [visibleOrigin] = __rule[name].origins\n .slice()\n .filter((point) => point.observers.indexOf(panoIndex) >= 0)\n .sort((pointA, pointB) => {\n const angleA = pointA.clone().setY(0).sub(cameraPosition).normalize().angleTo(cameraDirection.clone().setY(0))\n const angleB = pointB.clone().setY(0).sub(cameraPosition).normalize().angleTo(cameraDirection.clone().setY(0))\n\n return angleA - angleB\n })\n\n const shownNotVerticalRules = []\n for (const { rule, vertical, $element } of __rule[name].rules) {\n const [start, end] = rule\n const $line = $element.querySelector<HTMLDivElement>('.PanoRulerPlugin-rule-line')\n\n if (!$line) return\n if (!visibleOrigin) {\n $element.style.display = 'none'\n continue\n }\n if (start !== visibleOrigin && end !== visibleOrigin) {\n $element.style.display = 'none'\n continue\n }\n // 线小于0.3m隐藏\n if (start.distanceTo(end) < 0.3) {\n $element.style.display = 'none'\n continue\n }\n\n if (start.observers.indexOf(panoIndex) === -1 || end.observers.indexOf(panoIndex) === -1) {\n $element.style.display = 'none'\n\n continue\n }\n\n const startAngle = start.clone().sub(cameraPosition).normalize().angleTo(cameraDirection)\n if (startAngle > Math.PI / 2) {\n $element.style.display = 'none'\n continue\n }\n\n const endAngle = end.clone().sub(cameraPosition).normalize().angleTo(cameraDirection)\n if (endAngle > Math.PI / 2) {\n $element.style.display = 'none'\n continue\n }\n\n const ruleLength = start.distanceTo(end)\n const midPoint = end.clone().sub(\n end\n .clone()\n .sub(start)\n .divide(new Vector3(2, 2, 2)),\n )\n const disFromCameraToMid = midPoint.distanceTo(cameraPosition)\n if (disFromCameraToMid / ruleLength > 8) {\n $element.style.display = 'none'\n\n continue\n }\n\n if (!vertical) shownNotVerticalRules.push(rule)\n if (vertical) verticalLines.push({ $element, startAngle })\n\n const mouseStart = start.clone().project(camera)\n const startLeft = ((mouseStart.x + 1) / 2) * width\n const startTop = ((-mouseStart.y + 1) / 2) * height\n\n const mouseEnd = end.clone().project(camera)\n const endLeft = ((mouseEnd.x + 1) / 2) * width\n const endTop = ((-mouseEnd.y + 1) / 2) * height\n\n const distance = Math.sqrt(Math.pow(endLeft - startLeft, 2) + Math.pow(endTop - startTop, 2))\n let visibleLength = distance\n let labelOffset = 50\n const intr = getRuleScreenIntr(\n { x: ~~startLeft, y: ~~startTop },\n {\n x: ~~endLeft,\n y: ~~endTop,\n },\n width,\n height,\n )\n if (intr && intr.length === 1) {\n if (visibleOrigin === start) {\n visibleLength = Math.sqrt(Math.pow(intr[0].x - startLeft, 2) + Math.pow(intr[0].y - startTop, 2))\n labelOffset = (visibleLength / distance) * 50\n } else if (visibleOrigin === end) {\n visibleLength = Math.sqrt(Math.pow(intr[0].x - endLeft, 2) + Math.pow(intr[0].y - endTop, 2))\n labelOffset = 100 - (visibleLength / distance) * 50\n }\n }\n if (intr && intr.length === 2) {\n const middlePoint = {\n x: (intr[0].x + intr[1].x) / 2,\n y: (intr[0].y + intr[1].y) / 2,\n }\n const distanceFromStart = Math.sqrt(Math.pow(middlePoint.x - startLeft, 2) + Math.pow(middlePoint.y - startTop, 2))\n labelOffset = (distanceFromStart / distance) * 100\n }\n const rad = Math.PI / 2 - Math.atan2(endLeft - startLeft, startTop - endTop)\n\n const deg = (rad / Math.PI) * 180\n\n const $label = $line.querySelector('.PanoRulerPlugin-rule-label') as HTMLDivElement\n\n // 线的长度小于标签时或者标签与线两端点重合时隐藏,\n const labelWidth = $label.children[0].clientWidth\n if (\n labelWidth >= distance ||\n labelWidth / 2 >= (labelOffset / 100) * distance ||\n labelWidth / 2 >= (1 - labelOffset / 100) * distance\n ) {\n $line.style.display = 'none'\n } else {\n $line.style.display = 'block'\n $line.style.width = distance + 'px'\n $line.style.left = startLeft + 'px'\n $line.style.top = startTop + 'px'\n $line.style.transform = `rotate(${-deg}deg)`\n\n $label.style.left = `${labelOffset}%`\n }\n }\n }\n\n const nextFrameFreshRule = () => nextFrame(freshRule)\n const throttleFreshRule = throttle(freshRule, 80)\n\n const enable = () => {\n if (!state.loaded) return false\n if (state.enable) return true\n $rule.setAttribute('class', 'PanoRulerPlugin' + (state.options.className ? ' ' + state.options.className : ''))\n five.getElement()?.parentElement?.append($rule)\n freshRule()\n five.on('modeChange', freshRule)\n five.on('cameraUpdate', nextFrameFreshRule)\n state.enable = true\n return true\n }\n\n const disable = () => {\n if (!state.enable) return true\n five.off('modeChange', freshRule)\n five.off('cameraUpdate', nextFrameFreshRule)\n\n if ($rule) {\n $rule.remove()\n }\n\n state.enable = false\n return true\n }\n\n function changeConfigs(config: Partial<PanoRulerPluginConfig>) {\n if (config.distanceText && config.distanceText !== state.options.distanceText) {\n const distanceText = config.distanceText\n state.options.distanceText = distanceText\n Object.values(__rule).forEach((item) => {\n item.rules.forEach((rule) => {\n const [origin, vertical] = rule.rule\n const distance = origin.distanceTo(vertical)\n const textEle = rule.$element.querySelector<HTMLDivElement>('.PanoRulerPlugin-rule-label-name')\n if (!textEle) return\n textEle.innerText = distanceText(distance)\n })\n })\n }\n }\n\n return {\n enable,\n disable,\n load,\n state,\n changeConfigs,\n }\n}\n\nexport const panoRulerPluginServerParams = {\n name: 'PanoRulerPlugin',\n version: 0,\n}\nexport default PanoRulerPlugin\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { t as e } from "./controller-Vl3H6GBQ.js";
1
+ import { t as e } from "./controller-B0hqJtoB.js";
2
2
  //#region src/PanoTagPlugin/index.ts
3
3
  var t = (t, n) => new e(t, n);
4
4
  //#endregion
5
5
  export { t };
6
6
 
7
- //# sourceMappingURL=pano-tag-BwRqx3wU.js.map
7
+ //# sourceMappingURL=pano-tag-j8ZPJDDK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pano-tag-BwRqx3wU.js","names":["PanoTagPluginController","PanoTagPlugin","five","params"],"sources":["../../src/PanoTagPlugin/index.ts"],"sourcesContent":["import type { Five } from '@realsee/five-webgpu'\nimport PanoTagPluginController from './controller'\nexport { pluginFlag, PanoTagPluginController } from './controller'\nexport { defaultGlobalConfig } from './typings'\nexport type { ContentTypeMap, TagContentType, TagHooks, State, TemporaryState, TagClickParams, PluginEventMap, TagEvents, TagCacheInterface, MediaStore, PointTagInstance, Tags, Tag, TagId, ArrayPosition, Position, PanoIndex, WorkCode, ModelId, MinMax, StickType, BoxPosition, BoxTag, PolygonPosition, PolygonTag, MaskPosition, MaskTag, TagIconAnimationConfig, TagIconUrl, TagStyle, TagGLTFObject, ElementRenderer, TagRendererMap, TagContentTypeMapping, TagObjectGroup, TagGLTFObjectGroup, ImagePlaneGroup, AudioAppearance, ContentTypeConfigKeySplit, ContentTypeConfigKey, PickTagContentTypeInContentTypeConfigKey, TagConfigByKey, Point2DTag, Point3DTag, PlaneTag, TagState, MediaData, ObjectFit, ContentTypeMapInterface, TagPlacement, TagConfig, TagInstance } from './typings'\n\nexport type PanoTagPluginExportInterface = InstanceType<typeof PanoTagPluginController>\nexport type PanoTagPluginParamsInterface = ConstructorParameters<typeof PanoTagPluginController>[1]\n\nexport const PanoTagPlugin = (five: Five, params?: PanoTagPluginParamsInterface) => new PanoTagPluginController(five, params)\n\nexport default PanoTagPlugin\n"],"mappings":";;AASA,IAAaC,KAAiB,GAAY,MAA0C,IAAID,EAAwBE,GAAMC,CAAM"}
1
+ {"version":3,"file":"pano-tag-j8ZPJDDK.js","names":["PanoTagPluginController","PanoTagPlugin","five","params"],"sources":["../../src/PanoTagPlugin/index.ts"],"sourcesContent":["import type { Five } from '@realsee/five-webgpu'\nimport PanoTagPluginController from './controller'\nexport { pluginFlag, PanoTagPluginController } from './controller'\nexport { defaultGlobalConfig } from './typings'\nexport type { ContentTypeMap, TagContentType, TagHooks, State, TemporaryState, TagClickParams, PluginEventMap, TagEvents, TagCacheInterface, MediaStore, PointTagInstance, Tags, Tag, TagId, ArrayPosition, Position, PanoIndex, WorkCode, ModelId, MinMax, StickType, BoxPosition, BoxTag, PolygonPosition, PolygonTag, MaskPosition, MaskTag, TagIconAnimationConfig, TagIconUrl, TagStyle, TagGLTFObject, ElementRenderer, TagRendererMap, TagContentTypeMapping, TagObjectGroup, TagGLTFObjectGroup, ImagePlaneGroup, AudioAppearance, ContentTypeConfigKeySplit, ContentTypeConfigKey, PickTagContentTypeInContentTypeConfigKey, TagConfigByKey, Point2DTag, Point3DTag, PlaneTag, TagState, MediaData, ObjectFit, ContentTypeMapInterface, TagPlacement, TagConfig, TagInstance } from './typings'\n\nexport type PanoTagPluginExportInterface = InstanceType<typeof PanoTagPluginController>\nexport type PanoTagPluginParamsInterface = ConstructorParameters<typeof PanoTagPluginController>[1]\n\nexport const PanoTagPlugin = (five: Five, params?: PanoTagPluginParamsInterface) => new PanoTagPluginController(five, params)\n\nexport default PanoTagPlugin\n"],"mappings":";;AASA,IAAaC,KAAiB,GAAY,MAA0C,IAAID,EAAwBE,GAAMC,CAAM"}
@@ -1,7 +1,7 @@
1
1
  import { n as e } from "./rolldown-runtime-B0aSnxlc.js";
2
2
  import { i as t } from "./animationFrame-CacKXN8l.js";
3
3
  import { t as n } from "./animation-D9rPUNWJ.js";
4
- import { t as r } from "./BasePlugin-BW03eBFv.js";
4
+ import { t as r } from "./BasePlugin-Cr_atQUC.js";
5
5
  import { t as i } from "./loadVideoTexture-CWoiMWRg.js";
6
6
  import * as a from "three/webgpu";
7
7
  import { Mesh as o, MeshBasicNodeMaterial as s, Quaternion as c, SphereGeometry as l, Vector3 as u } from "three/webgpu";
@@ -375,4 +375,4 @@ var f = class {
375
375
  //#endregion
376
376
  export { m as n, h as t };
377
377
 
378
- //# sourceMappingURL=pano-video-DF7h9OyJ.js.map
378
+ //# sourceMappingURL=pano-video-Dcspq4j1.js.map