@realsee/dnalogel 4.0.0-webgpu.18 → 4.0.0-webgpu.19
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/CHANGELOG.md +5 -0
- package/dist/floorplan.js +1 -1
- package/dist/index.js +18 -18
- package/dist/internal/{BasePlugin-Cr_atQUC.js → BasePlugin-AYcNjiyG.js} +2 -2
- package/dist/internal/{BasePlugin-Cr_atQUC.js.map → BasePlugin-AYcNjiyG.js.map} +1 -1
- package/dist/internal/BasePluginWithData-CWgZY4u8.js +7 -0
- package/dist/internal/{BasePluginWithData-CIQpqYGe.js.map → BasePluginWithData-CWgZY4u8.js.map} +1 -1
- package/dist/internal/{Controller-Cq-mYkzT.js → Controller-DPpDpYsR.js} +3 -3
- package/dist/internal/{Controller-Cq-mYkzT.js.map → Controller-DPpDpYsR.js.map} +1 -1
- package/dist/internal/{Controller-5BvatEWD.js → Controller-DSKeCecj.js} +171 -154
- package/dist/internal/Controller-DSKeCecj.js.map +1 -0
- package/dist/internal/{Controller-BDT5_ZNe.js → Controller-DZwww-c4.js} +2 -2
- package/dist/internal/{Controller-BDT5_ZNe.js.map → Controller-DZwww-c4.js.map} +1 -1
- package/dist/internal/PointHelper-G9EgUMWo.js +1052 -0
- package/dist/internal/PointHelper-G9EgUMWo.js.map +1 -0
- package/dist/internal/{Rectangle-Z2T_h74M.js → Rectangle-DSOdWXl_.js} +3 -3
- package/dist/internal/{Rectangle-Z2T_h74M.js.map → Rectangle-DSOdWXl_.js.map} +1 -1
- package/dist/internal/{Work-PKaUMpXd.js → Work-HQHipxJj.js} +4 -4
- package/dist/internal/{Work-PKaUMpXd.js.map → Work-HQHipxJj.js.map} +1 -1
- package/dist/internal/{area-maker-BTGqxG6D.js → area-maker-Diy_UkTD.js} +2 -2
- package/dist/internal/{area-maker-BTGqxG6D.js.map → area-maker-Diy_UkTD.js.map} +1 -1
- package/dist/internal/{controller-B0hqJtoB.js → controller-DZUdbdd8.js} +4 -4
- package/dist/internal/{controller-B0hqJtoB.js.map → controller-DZUdbdd8.js.map} +1 -1
- package/dist/internal/{cruise-BkSbiLjd.js → cruise-Bo8CD4vF.js} +2 -2
- package/dist/internal/{cruise-BkSbiLjd.js.map → cruise-Bo8CD4vF.js.map} +1 -1
- package/dist/internal/{current-pano-image-DqyUFIP6.js → current-pano-image-Cqq4DRPh.js} +2 -2
- package/dist/internal/{current-pano-image-DqyUFIP6.js.map → current-pano-image-Cqq4DRPh.js.map} +1 -1
- package/dist/internal/{edgeSnap-8fdFCcXB.js → edgeSnap-CH0HidZm.js} +206 -83
- package/dist/internal/edgeSnap-CH0HidZm.js.map +1 -0
- package/dist/internal/{floorplan-Dkp7omYn.js → floorplan-DwcrbASA.js} +2 -2
- package/dist/internal/{floorplan-Dkp7omYn.js.map → floorplan-DwcrbASA.js.map} +1 -1
- package/dist/internal/{measure-KVSCjRnS.js → measure-DIstq55p.js} +2 -2
- package/dist/internal/{measure-KVSCjRnS.js.map → measure-DIstq55p.js.map} +1 -1
- package/dist/internal/measure-v2-Byp1mE5q.js +215 -0
- package/dist/internal/measure-v2-Byp1mE5q.js.map +1 -0
- package/dist/internal/{model-maker-L5eqUgkU.js → model-maker-pQcaAh5M.js} +2 -2
- package/dist/internal/{model-maker-L5eqUgkU.js.map → model-maker-pQcaAh5M.js.map} +1 -1
- package/dist/internal/object3d-helper-zRXHAcbm.js +7 -0
- package/dist/internal/{object3d-helper-CUhRRdCQ.js.map → object3d-helper-zRXHAcbm.js.map} +1 -1
- package/dist/internal/{pano-compass-dmcsnFDQ.js → pano-compass-CMIljzhC.js} +2 -2
- package/dist/internal/{pano-compass-dmcsnFDQ.js.map → pano-compass-CMIljzhC.js.map} +1 -1
- package/dist/internal/{pano-door-label-C0sd66vf.js → pano-door-label-B4nqTTzN.js} +2 -2
- package/dist/internal/{pano-door-label-C0sd66vf.js.map → pano-door-label-B4nqTTzN.js.map} +1 -1
- package/dist/internal/{pano-measure-NbB7-uVE.js → pano-measure-C2r0ecHk.js} +2 -2
- package/dist/internal/{pano-measure-NbB7-uVE.js.map → pano-measure-C2r0ecHk.js.map} +1 -1
- package/dist/internal/{pano-measure-v2-CRPvPs0e.js → pano-measure-v2-BfSAjO-I.js} +4 -4
- package/dist/internal/{pano-measure-v2-CRPvPs0e.js.map → pano-measure-v2-BfSAjO-I.js.map} +1 -1
- package/dist/internal/{pano-tag-j8ZPJDDK.js → pano-tag-BXo_4I6D.js} +2 -2
- package/dist/internal/{pano-tag-j8ZPJDDK.js.map → pano-tag-BXo_4I6D.js.map} +1 -1
- package/dist/internal/{pano-video-Dcspq4j1.js → pano-video-CS6-eXci.js} +2 -2
- package/dist/internal/{pano-video-Dcspq4j1.js.map → pano-video-CS6-eXci.js.map} +1 -1
- package/dist/internal/{pipeline-CD2YkN5U.js → pipeline-BN9A4lPZ.js} +2 -2
- package/dist/internal/{pipeline-CD2YkN5U.js.map → pipeline-BN9A4lPZ.js.map} +1 -1
- package/dist/internal/{sculpt-CbEBEh9F.js → sculpt-e0IRMtjB.js} +3 -3
- package/dist/internal/{sculpt-CbEBEh9F.js.map → sculpt-e0IRMtjB.js.map} +1 -1
- package/dist/plugins/area-maker.js +1 -1
- package/dist/plugins/cruise.js +2 -2
- package/dist/plugins/current-pano-image.js +1 -1
- package/dist/plugins/guide-line.js +1 -1
- package/dist/plugins/measure-v2.js +2 -2
- package/dist/plugins/measure.js +2 -2
- package/dist/plugins/model-maker.js +1 -1
- package/dist/plugins/object3d-helper.js +2 -2
- package/dist/plugins/pano-compass.js +1 -1
- package/dist/plugins/pano-door-label.js +1 -1
- package/dist/plugins/pano-measure-v2.js +1 -1
- package/dist/plugins/pano-measure.js +1 -1
- package/dist/plugins/pano-tag.js +2 -2
- package/dist/plugins/pano-video.js +1 -1
- package/dist/plugins/pipeline.js +1 -1
- package/dist/plugins/sculpt.js +2 -2
- package/dist/types/MeasurePlugin/Controller.d.ts +7 -0
- package/dist/types/MeasurePlugin/utils/MeasureMesh.d.ts +5 -0
- package/dist/types/MeasurePluginV2/Controller.d.ts +9 -0
- package/dist/types/MeasurePluginV2/Magnifier.d.ts +33 -0
- package/dist/types/MeasurePluginV2/PointOverlay.d.ts +5 -0
- package/dist/types/MeasurePluginV2/closeupView.d.ts +69 -0
- package/dist/types/MeasurePluginV2/normalMeasure.d.ts +116 -0
- package/dist/types/shared-utils/three/Magnifier.d.ts +55 -0
- package/dist/utils.js +1 -1
- package/package.json +1 -1
- package/dist/internal/BasePluginWithData-CIQpqYGe.js +0 -7
- package/dist/internal/Controller-5BvatEWD.js.map +0 -1
- package/dist/internal/PointHelper-grrf8vu1.js +0 -953
- package/dist/internal/PointHelper-grrf8vu1.js.map +0 -1
- package/dist/internal/edgeSnap-8fdFCcXB.js.map +0 -1
- package/dist/internal/measure-v2-DqjBlSeF.js +0 -83
- package/dist/internal/measure-v2-DqjBlSeF.js.map +0 -1
- package/dist/internal/object3d-helper-CUhRRdCQ.js +0 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-CD2YkN5U.js","names":["BasePlugin.Controller","loadTexture","notNil","BetterTween","requestAnimationFrameInterval","equal","Controller$1","THREE","uniqPipe","map","pipelines","pipeline","pipe","getPipesFromLibrary","params","startLibraryID","endLibraryID","getDefaultPipeUrl","water","format","origin","pipeIDs","item","pipeID","path","radius","options","texture","Bezier","points","QuadraticBezierCurve3","t","CubicBezierCurve3","interpolated","point","count","index","CustomBezierCurve3","controlPoints","optionalTarget","bezierPoint","source","baseData","json","ObjectPipe","uvBufferAttribute","geometry","pathLength","uPreMeter","tubularSegments","radialSegments","sourceUv","offsetU","sampleUv","clampPositiveU","material","startOpacity","progress","resolve","value","ObjectFlowPipe","distance","direction","uOffset","displacement","moveDisplacement","rotate","stopFlowAnime","time","timeInterval","distanceInterval","rotateInterval","vOffset","speed","defaultSpeed","Controller","five","prevData","data","textureURL","pipeMesh","offset","initialState","prevState","state","userAction","mergedOptions","target","baseAnimeOptions","hideAnimeOptions","_options","promise","animeOptions","pipeObjects","showAnimeOptions","mapPromise","url","customID","id","ray","intersectObjects","pipeData","pipelineData","PipelinePlugin"],"sources":["../../src/PipelinePlugin/utils/formatData.ts","../../src/shared-utils/three/Extras/Core/Interpolations.ts","../../src/shared-utils/three/Extras/Curves/BezierCurve3.ts","../../src/PipelinePlugin/utils/Objects/Pipe.ts","../../src/PipelinePlugin/utils/Objects/FlowPipe.ts","../../src/PipelinePlugin/Controller.ts","../../src/PipelinePlugin/index.ts"],"sourcesContent":["import type { PluginData, ServerData, LoadOptions } from '../typing'\nimport { notNil } from '../../shared-utils/isNil'\n\nfunction chunk<T>(collection: T[], size = 2) {\n const result: T[][] = []\n\n // add each chunk to the result\n for (let x = 0; x < Math.ceil(collection.length / size); x++) {\n let start = x * size\n let end = start + size\n\n result.push(collection.slice(start, end))\n }\n\n return result\n}\n\n/** 通过 pipeline 获得去重后的 pipes */\nfunction uniqPipe(pipelines: PluginData.Pipeline[]) {\n // pipelines 里面会有重复的 pipe,需要根据 ID 去重\n const map = new Map<string, PluginData.Pipe>()\n pipelines.forEach((pipeline) => pipeline.pipes.forEach((pipe) => map.set(pipe.id, pipe)))\n return Array.from(map.values())\n}\n\n/** 从 PluginData 中找到符合「从 ID 为 startLibraryID 的设备到 ID 为 endLibraryID 的设备」的 pipe data */\nexport function getPipesFromLibrary(params: { data: PluginData.RootObject; target: { startLibraryID: number; endLibraryID: number }[] }) {\n const pipelines = params.target\n .map(({ startLibraryID, endLibraryID }) => {\n const pipeline = params.data.pipelines.find(\n (pipeline) => pipeline.startLibraryID === startLibraryID && pipeline.endLibraryID === endLibraryID,\n )\n if (!pipeline) {\n console.warn(`Cannot find pipeline with startLibraryID ${startLibraryID} and endLibraryID ${endLibraryID}`)\n }\n return pipeline\n })\n .filter(notNil)\n return uniqPipe(pipelines)\n}\n\n/** 获取默认的管道贴图 */\nexport function getDefaultPipeUrl<T extends PluginData.Water>(water: T): string | undefined {\n if (water.quality === 0) return '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/19/1.png'\n if (water.quality === 1) return '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/19/2.png'\n if (water.quality === 2) return '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/19/3.png'\n if (water.quality === 3) return '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/19/4.png'\n if (water.quality === 4) return '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/19/5.png'\n if (water.isHot) return '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/19/6.png'\n}\n\nexport function format(origin: ServerData.RootObject, options?: Partial<LoadOptions>): PluginData.RootObject {\n const pipelines: PluginData.Pipeline[] = origin.ConnectsDataset.map((pipeline) => {\n const pipeIDs = pipeline.data\n const startLibraryID = pipeline.start\n const endLibraryID = pipeline.end\n const water: PluginData.Water = { isHot: pipeline.waterType === 5, quality: pipeline.waterType }\n const pipes: PluginData.Pipe[] = pipeIDs\n .map((pipeID) => {\n const pipe = origin.LinesDataset.find((item) => item.id === pipeID)\n if (!pipe) return null\n const path = pipe.data\n // 原始管道模型是 1.5cm 的半径,要大一点点,就用 1.6cm 了。\n const radius = options?.getPipeRadius ? options.getPipeRadius(pipe) : 1.6 / 100\n const texture = options?.getPipeUrl ? options.getPipeUrl(water) : getDefaultPipeUrl(water)\n return { id: pipe.id, radius, water, path, texture }\n })\n .filter(notNil)\n return { startLibraryID, endLibraryID, pipes }\n })\n const pipes = uniqPipe(pipelines)\n return { pipes, pipelines }\n}\n","import type { Vector3} from 'three/webgpu';\nimport { QuadraticBezierCurve3, CubicBezierCurve3 } from 'three/webgpu'\n\n/** Native Three curves for common orders, de Casteljau for arbitrary degree. */\nexport function Bezier(t: number, points: Vector3[]): Vector3 {\n if (points.length < 2) throw new RangeError('Bezier requires at least two control points')\n if (points.length === 3) return new QuadraticBezierCurve3(...points as [Vector3, Vector3, Vector3]).getPoint(t)\n if (points.length === 4) return new CubicBezierCurve3(...points as [Vector3, Vector3, Vector3, Vector3]).getPoint(t)\n const interpolated = points.map((point) => point.clone())\n for (let count = interpolated.length - 1; count > 0; count--) {\n for (let index = 0; index < count; index++) interpolated[index].lerp(interpolated[index + 1], t)\n }\n return interpolated[0]\n}\n","import * as THREE from 'three/webgpu'\nimport { Bezier } from '../Core/Interpolations'\n\nclass CustomBezierCurve3 extends THREE.Curve<THREE.Vector3> {\n public declare type: string\n public controlPoints: THREE.Vector3[]\n\n public constructor(controlPoints: THREE.Vector3[] = []) {\n super()\n\n this.type = 'CustomBezierCurve3'\n this.controlPoints = controlPoints\n }\n\n public getPoint(t: number, optionalTarget = new THREE.Vector3()) {\n const point = optionalTarget\n\n const bezierPoint = Bezier(t, this.controlPoints)\n\n point.copy(bezierPoint)\n\n return point\n }\n\n public copy(source: CustomBezierCurve3) {\n super.copy(source)\n\n this.controlPoints = source.controlPoints.map((point) => point.clone())\n\n return this\n }\n\n public toJSON() {\n const baseData = super.toJSON()\n\n const controlPoints = this.controlPoints.map((point) => point.toArray())\n const data = Object.assign(baseData, { controlPoints })\n\n return data\n }\n\n public fromJSON(json: any) {\n super.fromJSON(json)\n\n this.controlPoints = json.controlPoints.map((point: number[]) => new THREE.Vector3().fromArray(point))\n\n return this\n }\n}\n\nexport { CustomBezierCurve3 }\n","import * as THREE from 'three/webgpu'\nimport { BetterTween } from '../../../shared-utils'\nimport { CustomBezierCurve3 } from '../../../shared-utils/three/Extras/Curves/BezierCurve3'\n\nexport interface PipeParams {\n id?: string\n path: number[][]\n texture: THREE.Texture\n geometryConfig?: {\n radius?: number\n radialSegments?: number\n tubularSegments?: number\n }\n}\n\nexport interface AnimeOptions {\n duration?: number\n}\n\nexport class ObjectPipe extends THREE.Mesh<THREE.TubeGeometry, THREE.MeshBasicNodeMaterial> {\n public static calculatePath(points: THREE.Vector3[]) {\n return points.length === 2 ? new THREE.LineCurve3(points[0], points[1]) : new CustomBezierCurve3(points)\n }\n\n public static formatGeometryUV<T extends THREE.BufferGeometry>(geometry: T, pathLength: number, uPreMeter: number) {\n const uvBufferAttribute = geometry.getAttribute('uv')\n for (let index = 0; index < uvBufferAttribute.count; index++) {\n uvBufferAttribute.setX(index, uvBufferAttribute.getX(index) * pathLength * uPreMeter)\n }\n return geometry\n }\n\n public static formatTexture(texture: THREE.Texture) {\n texture.wrapS = THREE.RepeatWrapping\n texture.wrapT = THREE.RepeatWrapping\n return texture\n }\n\n public geometryConfig = {\n radius: 1.5 / 100,\n tubularSegments: 20,\n radialSegments: 8,\n }\n public customID: string\n public path: THREE.LineCurve3 | CustomBezierCurve3\n public pathLength = 0\n public pathPoints: number[][]\n public texture: THREE.Texture\n public readonly opacityUniform = THREE.TSL.uniform(1)\n public readonly uOffsetUniform = THREE.TSL.uniform(0)\n public readonly vOffsetUniform = THREE.TSL.uniform(0)\n protected opacityAnime?: BetterTween<{ progress: number }>\n protected uPreMeter = 1\n\n public constructor(params: PipeParams, clampPositiveU = false) {\n super()\n if (params.geometryConfig) this.geometryConfig = { ...this.geometryConfig, ...params.geometryConfig }\n this.customID = params.id || this.uuid\n this.pathPoints = params.path\n this.path = ObjectPipe.calculatePath(params.path.map((points) => new THREE.Vector3().fromArray(points)))\n this.pathLength = this.path.getLength()\n this.texture = ObjectPipe.formatTexture(params.texture)\n const { radius, tubularSegments, radialSegments } = this.geometryConfig\n this.geometry = ObjectPipe.formatGeometryUV(\n new THREE.TubeGeometry(this.path, tubularSegments, radius, radialSegments),\n this.pathLength,\n this.uPreMeter,\n )\n\n const sourceUv = THREE.TSL.uv()\n const offsetU = sourceUv.x.add(this.uOffsetUniform)\n const sampleUv = THREE.TSL.vec2(clampPositiveU ? THREE.TSL.min(offsetU, 0) : offsetU, sourceUv.y.add(this.vOffsetUniform))\n const material = new THREE.MeshBasicNodeMaterial({ transparent: true })\n material.colorNode = THREE.TSL.texture(this.texture, sampleUv)\n material.opacityNode = this.opacityUniform\n this.material = material\n }\n\n public async hide(options?: AnimeOptions): Promise<boolean> {\n this.opacityAnime?.dispose()\n const endOpacity = 0\n if (typeof options?.duration !== 'number') return this.setOpacity(endOpacity)\n const startOpacity = this.opacityUniform.value\n if (startOpacity === endOpacity) return true\n return new Promise<boolean>((resolve) => {\n this.opacityAnime = new BetterTween({ progress: startOpacity })\n .to({ progress: endOpacity })\n .onUpdate(({ progress }) => this.setOpacity(progress))\n .onComplete(() => resolve(true))\n .onDispose(() => {\n this.setOpacity(endOpacity)\n resolve(false)\n })\n .play()\n })\n }\n\n public async show(options?: AnimeOptions) {\n this.opacityAnime?.dispose()\n const endOpacity = 1\n if (typeof options?.duration !== 'number') return this.setOpacity(endOpacity)\n const startOpacity = this.opacityUniform.value\n return new Promise<boolean>((resolve) => {\n this.opacityAnime = new BetterTween({ progress: startOpacity })\n .to({ progress: endOpacity })\n .onUpdate(({ progress }) => this.setOpacity(progress))\n .onComplete(() => resolve(true))\n .onDispose(() => {\n this.setOpacity(endOpacity)\n resolve(false)\n })\n .play()\n })\n }\n\n public setOpacity(value: number) {\n this.opacityUniform.value = value\n ;(this as any).needsRender = true\n return true\n }\n\n public disposeAnime() {\n this.opacityAnime?.dispose()\n this.opacityAnime = undefined\n }\n\n public dispose(): void {\n this.disposeAnime()\n this.geometry.dispose()\n this.material.dispose()\n }\n}\n","import { requestAnimationFrameInterval } from '../../../shared-utils'\nimport type { PipeParams as BasePipeParams } from './Pipe'\nimport { ObjectPipe } from './Pipe'\n\nexport type PipeParams = BasePipeParams\n\nexport class ObjectFlowPipe extends ObjectPipe {\n /** 初始状态下,当前水管内的水流在整体管道上的位移\n * @description 因为水管是不连续的,而要达到水流的连续效果,需要用过贴图的 uOffset 控制每根水管的初始状态\n */\n private initialDisplacement = 0\n private oldTime = new Date().getTime()\n /** 横向流动速度:m / s */\n private flowSpeed = 0.6\n /** 纵向旋转速度:deg / s */\n private rotateSpeed = 0\n\n public constructor(params: PipeParams) {\n super(params, true)\n }\n\n public setInitialDisplacement(distance: number, direction: 'forward' | 'backward' = 'backward') {\n this.initialDisplacement = Math.abs(distance) * (direction === 'forward' ? -1 : 1)\n this.moveFromOrigin(this.initialDisplacement)\n }\n\n /** 水流移动「基于初始位置」\n * @description 因为贴图的运动与 u 的 uOffset 相反,比较反直觉,所以封装方法易于理解\n * @param displacement 位移:米 * 方向(向前 -> 正, 向后 -> 负)\n */\n public moveFromOrigin(displacement: number) {\n const uOffset = displacement * this.uPreMeter\n this.uOffsetUniform.value = uOffset\n ;(this as any).needsRender = true\n return true\n }\n\n /** 水流移动「基于调整管道差值之后的位置」\n *\n * @param distance 位移:米 * 方向\n */\n public moveForwardFromInitialOffset(distance: number) {\n const moveDisplacement = distance * -1\n const displacement = this.initialDisplacement + moveDisplacement\n this.moveFromOrigin(displacement)\n }\n\n public flow() {\n this.flowAnimationDisposer()\n this.oldTime = new Date().getTime()\n let distance = 0\n let rotate = 0\n\n const stopFlowAnime = requestAnimationFrameInterval(() => {\n const time = new Date().getTime()\n const timeInterval = time - this.oldTime\n const distanceInterval = this.flowSpeed * (timeInterval / 1000)\n const rotateInterval = this.rotateSpeed * (timeInterval / 1000)\n distance = distance + distanceInterval\n rotate = rotate + rotateInterval\n const vPreDeg = 1 / 360\n const vOffset = rotate * vPreDeg\n this.vOffsetUniform.value = vOffset\n this.moveForwardFromInitialOffset(distance)\n this.oldTime = time\n })\n\n this.flowAnimationDisposer = function () {\n stopFlowAnime()\n this.moveForwardFromInitialOffset(0)\n }\n\n return\n }\n\n public stopFlow() {\n this.flowAnimationDisposer()\n }\n\n public setSpeed(speed?: { flowSpeed?: number; rotateSpeed?: number }) {\n typeof speed?.flowSpeed === 'number' && (this.flowSpeed = speed.flowSpeed)\n typeof speed?.rotateSpeed === 'number' && (this.rotateSpeed = speed.rotateSpeed)\n }\n\n public disposeAnime() {\n super.disposeAnime()\n this.flowAnimationDisposer()\n }\n\n private flowAnimationDisposer: () => void = () => undefined\n}\n","import type { Five, EventCallback } from '@realsee/five-webgpu'\nimport type {\n State,\n Speed,\n EventMap,\n ServerData,\n PluginData,\n LoadOptions,\n ShowHideOptions,\n SetSpeedOptions,\n ShowPipelinesOptions,\n} from './typing'\nimport * as THREE from 'three/webgpu'\nimport * as BasePlugin from '../base/BasePluginWithData'\nimport { equal, notNil } from '../shared-utils'\nimport { loadTexture } from '../shared-utils/three/loadTexture'\nimport { format, getPipesFromLibrary } from './utils/formatData'\nimport { ObjectFlowPipe } from './utils/Objects/FlowPipe'\n// import { ObjectHighlightPipe } from './utils/three/Objects/HighlightPipe'\n\nconst defaultSpeed: Speed = { flowSpeed: 0.6, rotateSpeed: 0 }\n\nexport class Controller extends BasePlugin.Controller<State, EventMap, ServerData.RootObject, PluginData.RootObject> {\n // ==================== public properties ====================\n public data?: PluginData.RootObject\n /** 插件状态\n * @property `visible` `<boolean>` 是否可见\n * @property `enabled` `<boolean>` 是否启用\n * @property `visiblePipeIDs` `<string[]>` 可见的管道 ID\n * @property `speed` `<Speed>` 水流速度\n * @property `speed.flowSpeed` `<number>` 横向流动速度,默认是 0.6 m/s\n * @property `speed.rotateSpeed` `<number>` 纵向旋转速度:默认是 0 deg/s\n */\n public state: State\n /** 当前插件所有新增 THREE 相关副作用都在 group 下 */\n public group: THREE.Group\n /** 用于展示水流的水管 */\n public pipeObjects: ObjectFlowPipe[] = []\n\n // ==================== private properties ====================\n /** 水管贴图缓存 */\n private texturePromiseCache = new Map<string, Promise<THREE.Texture>>()\n\n public constructor(five: Five) {\n super(five)\n\n this.state = {\n target: null,\n visible: true,\n enabled: true,\n isFlowing: false,\n speed: defaultSpeed,\n }\n this.five = five\n this.group = new THREE.Group()\n this.group.name = 'water-pipe-group'\n this.five.scene.add(this.group)\n this.five.once('dispose', this.dispose)\n this.five.on('wantsTapGesture', this.onWantsFiveTapGesture)\n }\n\n /** 加载管道数据,重复调用会使用新数据覆盖旧数据\n * @param `data` `<Plugin.ServerData>` Open API 接口返回的数据。\n * @param `initialState` `<Plugin.State> | <undefined>` 数据加载后,要应用的 state,默认是 undefined。\n * @param `userAction` `<boolean> | <undefined>` 是否是用户操作,默认是 true。\n * @param `options` `<Plugin.LoadOptions> | <undefined>` 数据加载配置项。\n * @param `options.getPipeRadius` `<(pipe: ServerData.LinesDataset) => number> | <undefined>` 允许用户通过函数自定义管道半径。\n * @param `options.getPipeUrl` `<(water: Water) => string> | <undefined>` 允许用户通过函数自定义管道贴图,\n * 函数返回的 string 就是当前 water 对应的贴图地址。\n */\n\n public async load(data: ServerData.RootObject, initialState?: Partial<State>, userAction?: boolean, options?: Partial<LoadOptions>) {\n const prevData = this.data\n this.data = await this.formatData(data, options)\n this.removeAllPipes()\n this.hooks.emit('dataChange', this.data, prevData)\n this.pipeObjects = await Promise.all(\n this.data.pipes\n .filter((pipe) => !!pipe?.texture)\n .map(async ({ id, texture: textureURL, path, radius }) => {\n const texture = await this.loadPipeTexture(textureURL!)\n const params = { id, path, textureURL, texture, geometryConfig: { radius } }\n const pipe: ObjectFlowPipe = new ObjectFlowPipe(params)\n return pipe\n }),\n )\n\n // 设置管道的初始 offset\n this.data.pipelines.forEach((pipeLine) => {\n pipeLine.pipes.reduce((offset, pipe) => {\n const pipeMesh = this.findPipeObjectWithID(pipe.id)\n pipeMesh?.setInitialDisplacement(offset)\n const nextOffset = offset + (pipeMesh?.pathLength || 0)\n return nextOffset\n }, 0)\n })\n this.hooks.emit('dataLoaded', this.data)\n\n // load 后,如果当前 visible 是 false,需要把管道都隐藏\n if (this.state.visible === false) {\n this.pipeObjects.forEach((pipe) => pipe.setOpacity(0))\n }\n // 只有 enable 为 true 时,才回添加模型到场景中\n if (this.state.enabled) {\n this.group.add(...this.pipeObjects)\n this.five.needsRender = true\n }\n\n if (initialState) this.setState(initialState, { userAction })\n }\n\n /** 更改插件 State\n * @param `state` `<Partial<Plugin.State>>` 插件属性 `state` 的子集。\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public setState(state: Partial<State>, options: BasePlugin.BaseOptions = {}) {\n const prevState = this.state\n if (equal(state, prevState, { deep: true })) return\n\n const userAction = options.userAction !== undefined ? options.userAction : true\n this.updateState(state, userAction)\n\n if (state.enabled !== undefined && prevState.enabled !== state.enabled) {\n state.enabled ? this._enable({ userAction }) : this._disable({ userAction })\n }\n\n if (state.visible !== undefined && prevState.visible !== state.visible) {\n const options = { userAction, anime: { duration: 500 } }\n state.visible ? this._show(options) : this._hide(options)\n }\n\n if (state.isFlowing !== undefined && prevState.isFlowing !== state.isFlowing) {\n state.isFlowing ? this._flow() : this._stopFlow()\n }\n\n if (state.speed !== undefined && !equal(prevState.speed, this.state.speed, { deep: true })) {\n this._setSpeed(state.speed)\n }\n\n if (state.target !== undefined && !equal(prevState.target, this.state.target, { deep: true })) {\n const options = {\n target: state.target,\n showAnime: { duration: 500 },\n hideAnime: { duration: 500 },\n }\n this._switchPipelines(options)\n }\n }\n\n /** 启用插件\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public enable(options: BasePlugin.BaseOptions = {}) {\n if (this.state.enabled) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: true }, userAction)\n this._enable({ userAction })\n }\n\n /** 禁用插件\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public disable(options: BasePlugin.BaseOptions = {}) {\n if (this.state.enabled === false) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: false, isFlowing: false }, userAction)\n this._disable({ userAction })\n }\n\n /** 展示管道模型,注意如果通过 `switchPipelines` 更改过 `visibleIDs`,则只会展示这一部分模型。\n * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n * @param `options.anime` `<AnimeOptions> | <undefined>` 动画配置。\n * @param `options.anime.duration` `<number> | <undefined>` 动画时间,默认是 500ms。\n */\n public async show(options: Partial<ShowHideOptions> = {}) {\n if (this.state.visible) return\n const mergedOptions: ShowHideOptions = {\n userAction: true,\n anime: { duration: 500 },\n ...options,\n }\n this.updateState({ visible: true }, mergedOptions.userAction)\n await this._show(mergedOptions)\n }\n\n /** 插件内容整体隐藏\n * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n * @param `options.anime` `<AnimeOptions> | <undefined>` 动画配置。\n * @param `options.anime.duration` `<number> | <undefined>` 动画时间,默认是 500ms。\n */\n public async hide(options: Partial<ShowHideOptions> = {}) {\n if (this.state.visible === false) return\n const mergedOptions: ShowHideOptions = {\n userAction: true,\n anime: { duration: 500 },\n ...options,\n }\n this.updateState({ visible: false }, mergedOptions.userAction)\n await this._hide(mergedOptions)\n }\n\n /** 切换管路\n * @param `options` `Partial<ShowPipelinesOptions> | <undefined>`\n * @param `options.target` `<{ startLibraryID: number; endLibraryID: number }[]> | <undefined>`\n * 目标管路,存在时,展示目标管路包含的管道,同时隐藏其他管道。不存在则展示所有管道。\n * startLibraryID 和 endLibraryID 是起始和结束的设备 ID。\n * @param `options.showAnime` `<AnimeOptions> | <undefined>` 展示的动画配置。\n * @param `options.hideAnime` `<AnimeOptions> | <undefined>` 隐藏的动画配置。\n * @param `options.anime` `<AnimeOptions> | <undefined>` 兜底的动画配置。\n * @param `options.userAction` `<boolean> | <undefined>` 是否是否是用户操作。\n * */\n public async switchPipelines(options?: Partial<ShowPipelinesOptions>) {\n if (!this.data) return\n const target = options?.target ?? null\n const userAction = options?.userAction ?? true\n this.updateState({ target }, userAction)\n const baseAnimeOptions = { duration: 500 }\n const hideAnimeOptions = options?.hideAnime ?? options?.anime ?? baseAnimeOptions\n const showAnimeOptions = options?.showAnime ?? options?.anime ?? baseAnimeOptions\n const _options = {\n target,\n showAnime: showAnimeOptions,\n hideAnime: hideAnimeOptions,\n }\n this._switchPipelines(_options)\n }\n\n /** 开始流动 */\n public flow(options: BasePlugin.BaseOptions = {}) {\n if (this.state.isFlowing) return\n const userAction = options.userAction ?? true\n this.updateState({ isFlowing: true }, userAction)\n this._flow()\n }\n\n /** 停止流动 */\n public stopFlow(options: BasePlugin.BaseOptions = {}) {\n if (this.state.isFlowing === false) return\n const userAction = options.userAction ?? true\n this.updateState({ isFlowing: false }, userAction)\n this._stopFlow()\n }\n\n /** 更改水管流速\n * @param `options` `<SetSpeedOptions> | <undefined>`\n * @param `options.speed` `<Speed> | <undefined>` 参考 `state.speed` 的描述。\n * @param `options.userAction` `<boolean> | <undefined>` 是否是否是用户操作。\n */\n public setSpeed(options?: Partial<SetSpeedOptions>) {\n const speed = options?.speed ?? defaultSpeed\n const userAction = options.userAction ?? true\n this.updateState({ speed }, userAction)\n this._setSpeed(speed)\n }\n\n /** 销毁插件,移除所有副作用,销毁后将不响应任何 API */\n public dispose = () => {\n this.disable()\n this.five.scene.remove(this.group)\n this.texturePromiseCache.forEach((promise) => promise.then((texture) => texture.dispose()))\n this.texturePromiseCache.clear()\n }\n\n protected async formatData(data: ServerData.RootObject, options?: Partial<LoadOptions>) {\n return format(data, options)\n }\n\n private _enable(options: { userAction: boolean }) {\n this.hooks.emit('enable', { userAction: options.userAction })\n // resume model effects\n this.five.scene.add(this.group)\n this.five.needsRender = true\n // resume event effects\n this.five.on('wantsTapGesture', this.onWantsFiveTapGesture)\n }\n\n private _disable(options: { userAction: boolean }) {\n this.hooks.emit('disable', { userAction: options.userAction })\n // dispose model effects\n this.disposeAnime()\n this.five.scene.remove(this.group)\n this.five.needsRender = true\n // dispose event effects\n this.five.off('wantsTapGesture', this.onWantsFiveTapGesture)\n }\n\n private async _show(options: ShowHideOptions) {\n this.hooks.emit('show', { userAction: options.userAction })\n const animeOptions = options?.anime ?? { duration: 500 }\n const pipeObjects = this.findPipeObjectWithTarget(this.state.target)\n await Promise.all(pipeObjects.map((pipe) => pipe?.show(animeOptions)))\n this.five.needsRender = true\n }\n\n private async _hide(options: ShowHideOptions) {\n this.hooks.emit('hide', { userAction: options.userAction })\n const animeOptions = options?.anime ?? { duration: 500 }\n await Promise.all(this.pipeObjects.map((pipe) => pipe.hide(animeOptions)))\n this.five.needsRender = true\n }\n\n private async _switchPipelines(options: Omit<ShowPipelinesOptions, 'userAction' | 'anime'>) {\n if (!this.data) return\n const pipeObjects = this.findPipeObjectWithTarget(options.target)\n // // 销毁所有动画\n // this.disposeAnime()\n // // 展示之前,先初始化贴图位移\n // pipeObjects.forEach((pipe) => pipe.moveForwardFromInitialOffset(0))\n // 隐藏旧的管道模型\n const hideAnimeOptions = options.hideAnime\n await Promise.all(this.pipeObjects.map((pipe) => pipe.hide(hideAnimeOptions)))\n // 展示新的管道模型\n const showAnimeOptions = options.showAnime\n await Promise.all(pipeObjects.map((pipe) => pipe.show(showAnimeOptions)))\n }\n\n private _flow() {\n this.pipeObjects.forEach((pipe) => pipe.flow())\n }\n\n private _stopFlow() {\n this.pipeObjects.forEach((pipe) => pipe.stopFlow())\n }\n\n private _setSpeed(speed: Speed) {\n this.pipeObjects.forEach((pipe) => pipe.setSpeed(speed))\n }\n\n private updateState(state: Partial<State>, userAction: boolean) {\n const prevState = this.state\n this.state = { ...this.state, ...state }\n this.hooks.emit('stateChange', { state: this.state, prevState, userAction })\n }\n\n /** 加载管道贴图,如果再加载中,复用之前的加载 Promise */\n private async loadPipeTexture(url: string) {\n const mapPromise = this.texturePromiseCache.get(url)\n if (mapPromise) return mapPromise\n const promise = loadTexture(url)\n this.texturePromiseCache.set(url, promise)\n return promise\n }\n\n /** 销毁所有动画 */\n private disposeAnime() {\n this.pipeObjects.forEach((pipe) => pipe.disposeAnime())\n this.five.needsRender = true\n }\n\n /** 移除所有管道模型 */\n private removeAllPipes() {\n this.disposeAnime()\n this.group.remove(...this.pipeObjects)\n this.pipeObjects.forEach((pipe) => pipe.dispose())\n this.pipeObjects = []\n this.five.needsRender = true\n }\n\n /** 根据 ID 查找管道模型 */\n private findPipeObjectWithID(id: string) {\n return this.pipeObjects.find(({ customID }) => customID === id)\n }\n\n /** 根据 target 查找管道模型 */\n private findPipeObjectWithTarget(target: State['target']) {\n const pipeObjects = target\n ? getPipesFromLibrary({ data: this.data, target })\n .map(({ id }) => this.findPipeObjectWithID(id))\n .filter(notNil)\n : this.pipeObjects\n return pipeObjects\n }\n\n private onWantsFiveTapGesture: EventCallback['wantsTapGesture'] = (...params) => {\n const [ray] = params\n const intersectObjects = ray.intersectObjects(this.pipeObjects, false)\n if (intersectObjects.length === 0) return\n if (!this.data) return\n const intersectObject = intersectObjects[0]\n const pipeObject = intersectObject.object as ObjectFlowPipe\n const pipeID = pipeObject.customID\n const pipeData = this.data.pipes.find(({ id }) => id === pipeID)\n const pipelineData = this.data.pipelines.find((pipeline) => pipeData && pipeline.pipes.includes(pipeData))\n\n if (!pipeData || !pipelineData) return\n\n // const highlightTextureURL = '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/pipe-highlight.ec4c607b.png'\n // this.loadPipeTexture(highlightTextureURL).then((texture) => {\n // const id = 'highlight_' + pipeData.id\n // const path = pipeData.path\n // const geometryConfig = { radius: pipeObject.geometryConfig.radius + 0.1 / 100 }\n // const highlightPipe = new ObjectHighlightPipe({ id, path, texture, geometryConfig })\n // this.group.add(highlightPipe)\n // highlightPipe.highlight()\n // })\n\n this.hooks.emit('tap', {\n intersectObjects,\n pipe: pipeData,\n pipeline: pipelineData,\n wantsFiveTapGestureParams: params,\n })\n return false\n }\n}\n","import type { FivePlugin } from '@realsee/five-webgpu'\nimport { Controller } from './Controller'\n\nexport const PipelinePlugin: FivePlugin<undefined, Controller> = (five) => {\n return new Controller(five)\n}\n\nexport type PipelinePluginParameterType = undefined\nexport type PipelinePluginReturnType = InstanceType<typeof Controller>\nexport default PipelinePlugin\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pipeline-BN9A4lPZ.js","names":["BasePlugin.Controller","loadTexture","notNil","BetterTween","requestAnimationFrameInterval","equal","Controller$1","THREE","uniqPipe","map","pipelines","pipeline","pipe","getPipesFromLibrary","params","startLibraryID","endLibraryID","getDefaultPipeUrl","water","format","origin","pipeIDs","item","pipeID","path","radius","options","texture","Bezier","points","QuadraticBezierCurve3","t","CubicBezierCurve3","interpolated","point","count","index","CustomBezierCurve3","controlPoints","optionalTarget","bezierPoint","source","baseData","json","ObjectPipe","uvBufferAttribute","geometry","pathLength","uPreMeter","tubularSegments","radialSegments","sourceUv","offsetU","sampleUv","clampPositiveU","material","startOpacity","progress","resolve","value","ObjectFlowPipe","distance","direction","uOffset","displacement","moveDisplacement","rotate","stopFlowAnime","time","timeInterval","distanceInterval","rotateInterval","vOffset","speed","defaultSpeed","Controller","five","prevData","data","textureURL","pipeMesh","offset","initialState","prevState","state","userAction","mergedOptions","target","baseAnimeOptions","hideAnimeOptions","_options","promise","animeOptions","pipeObjects","showAnimeOptions","mapPromise","url","customID","id","ray","intersectObjects","pipeData","pipelineData","PipelinePlugin"],"sources":["../../src/PipelinePlugin/utils/formatData.ts","../../src/shared-utils/three/Extras/Core/Interpolations.ts","../../src/shared-utils/three/Extras/Curves/BezierCurve3.ts","../../src/PipelinePlugin/utils/Objects/Pipe.ts","../../src/PipelinePlugin/utils/Objects/FlowPipe.ts","../../src/PipelinePlugin/Controller.ts","../../src/PipelinePlugin/index.ts"],"sourcesContent":["import type { PluginData, ServerData, LoadOptions } from '../typing'\nimport { notNil } from '../../shared-utils/isNil'\n\nfunction chunk<T>(collection: T[], size = 2) {\n const result: T[][] = []\n\n // add each chunk to the result\n for (let x = 0; x < Math.ceil(collection.length / size); x++) {\n let start = x * size\n let end = start + size\n\n result.push(collection.slice(start, end))\n }\n\n return result\n}\n\n/** 通过 pipeline 获得去重后的 pipes */\nfunction uniqPipe(pipelines: PluginData.Pipeline[]) {\n // pipelines 里面会有重复的 pipe,需要根据 ID 去重\n const map = new Map<string, PluginData.Pipe>()\n pipelines.forEach((pipeline) => pipeline.pipes.forEach((pipe) => map.set(pipe.id, pipe)))\n return Array.from(map.values())\n}\n\n/** 从 PluginData 中找到符合「从 ID 为 startLibraryID 的设备到 ID 为 endLibraryID 的设备」的 pipe data */\nexport function getPipesFromLibrary(params: { data: PluginData.RootObject; target: { startLibraryID: number; endLibraryID: number }[] }) {\n const pipelines = params.target\n .map(({ startLibraryID, endLibraryID }) => {\n const pipeline = params.data.pipelines.find(\n (pipeline) => pipeline.startLibraryID === startLibraryID && pipeline.endLibraryID === endLibraryID,\n )\n if (!pipeline) {\n console.warn(`Cannot find pipeline with startLibraryID ${startLibraryID} and endLibraryID ${endLibraryID}`)\n }\n return pipeline\n })\n .filter(notNil)\n return uniqPipe(pipelines)\n}\n\n/** 获取默认的管道贴图 */\nexport function getDefaultPipeUrl<T extends PluginData.Water>(water: T): string | undefined {\n if (water.quality === 0) return '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/19/1.png'\n if (water.quality === 1) return '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/19/2.png'\n if (water.quality === 2) return '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/19/3.png'\n if (water.quality === 3) return '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/19/4.png'\n if (water.quality === 4) return '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/19/5.png'\n if (water.isHot) return '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/19/6.png'\n}\n\nexport function format(origin: ServerData.RootObject, options?: Partial<LoadOptions>): PluginData.RootObject {\n const pipelines: PluginData.Pipeline[] = origin.ConnectsDataset.map((pipeline) => {\n const pipeIDs = pipeline.data\n const startLibraryID = pipeline.start\n const endLibraryID = pipeline.end\n const water: PluginData.Water = { isHot: pipeline.waterType === 5, quality: pipeline.waterType }\n const pipes: PluginData.Pipe[] = pipeIDs\n .map((pipeID) => {\n const pipe = origin.LinesDataset.find((item) => item.id === pipeID)\n if (!pipe) return null\n const path = pipe.data\n // 原始管道模型是 1.5cm 的半径,要大一点点,就用 1.6cm 了。\n const radius = options?.getPipeRadius ? options.getPipeRadius(pipe) : 1.6 / 100\n const texture = options?.getPipeUrl ? options.getPipeUrl(water) : getDefaultPipeUrl(water)\n return { id: pipe.id, radius, water, path, texture }\n })\n .filter(notNil)\n return { startLibraryID, endLibraryID, pipes }\n })\n const pipes = uniqPipe(pipelines)\n return { pipes, pipelines }\n}\n","import type { Vector3} from 'three/webgpu';\nimport { QuadraticBezierCurve3, CubicBezierCurve3 } from 'three/webgpu'\n\n/** Native Three curves for common orders, de Casteljau for arbitrary degree. */\nexport function Bezier(t: number, points: Vector3[]): Vector3 {\n if (points.length < 2) throw new RangeError('Bezier requires at least two control points')\n if (points.length === 3) return new QuadraticBezierCurve3(...points as [Vector3, Vector3, Vector3]).getPoint(t)\n if (points.length === 4) return new CubicBezierCurve3(...points as [Vector3, Vector3, Vector3, Vector3]).getPoint(t)\n const interpolated = points.map((point) => point.clone())\n for (let count = interpolated.length - 1; count > 0; count--) {\n for (let index = 0; index < count; index++) interpolated[index].lerp(interpolated[index + 1], t)\n }\n return interpolated[0]\n}\n","import * as THREE from 'three/webgpu'\nimport { Bezier } from '../Core/Interpolations'\n\nclass CustomBezierCurve3 extends THREE.Curve<THREE.Vector3> {\n public declare type: string\n public controlPoints: THREE.Vector3[]\n\n public constructor(controlPoints: THREE.Vector3[] = []) {\n super()\n\n this.type = 'CustomBezierCurve3'\n this.controlPoints = controlPoints\n }\n\n public getPoint(t: number, optionalTarget = new THREE.Vector3()) {\n const point = optionalTarget\n\n const bezierPoint = Bezier(t, this.controlPoints)\n\n point.copy(bezierPoint)\n\n return point\n }\n\n public copy(source: CustomBezierCurve3) {\n super.copy(source)\n\n this.controlPoints = source.controlPoints.map((point) => point.clone())\n\n return this\n }\n\n public toJSON() {\n const baseData = super.toJSON()\n\n const controlPoints = this.controlPoints.map((point) => point.toArray())\n const data = Object.assign(baseData, { controlPoints })\n\n return data\n }\n\n public fromJSON(json: any) {\n super.fromJSON(json)\n\n this.controlPoints = json.controlPoints.map((point: number[]) => new THREE.Vector3().fromArray(point))\n\n return this\n }\n}\n\nexport { CustomBezierCurve3 }\n","import * as THREE from 'three/webgpu'\nimport { BetterTween } from '../../../shared-utils'\nimport { CustomBezierCurve3 } from '../../../shared-utils/three/Extras/Curves/BezierCurve3'\n\nexport interface PipeParams {\n id?: string\n path: number[][]\n texture: THREE.Texture\n geometryConfig?: {\n radius?: number\n radialSegments?: number\n tubularSegments?: number\n }\n}\n\nexport interface AnimeOptions {\n duration?: number\n}\n\nexport class ObjectPipe extends THREE.Mesh<THREE.TubeGeometry, THREE.MeshBasicNodeMaterial> {\n public static calculatePath(points: THREE.Vector3[]) {\n return points.length === 2 ? new THREE.LineCurve3(points[0], points[1]) : new CustomBezierCurve3(points)\n }\n\n public static formatGeometryUV<T extends THREE.BufferGeometry>(geometry: T, pathLength: number, uPreMeter: number) {\n const uvBufferAttribute = geometry.getAttribute('uv')\n for (let index = 0; index < uvBufferAttribute.count; index++) {\n uvBufferAttribute.setX(index, uvBufferAttribute.getX(index) * pathLength * uPreMeter)\n }\n return geometry\n }\n\n public static formatTexture(texture: THREE.Texture) {\n texture.wrapS = THREE.RepeatWrapping\n texture.wrapT = THREE.RepeatWrapping\n return texture\n }\n\n public geometryConfig = {\n radius: 1.5 / 100,\n tubularSegments: 20,\n radialSegments: 8,\n }\n public customID: string\n public path: THREE.LineCurve3 | CustomBezierCurve3\n public pathLength = 0\n public pathPoints: number[][]\n public texture: THREE.Texture\n public readonly opacityUniform = THREE.TSL.uniform(1)\n public readonly uOffsetUniform = THREE.TSL.uniform(0)\n public readonly vOffsetUniform = THREE.TSL.uniform(0)\n protected opacityAnime?: BetterTween<{ progress: number }>\n protected uPreMeter = 1\n\n public constructor(params: PipeParams, clampPositiveU = false) {\n super()\n if (params.geometryConfig) this.geometryConfig = { ...this.geometryConfig, ...params.geometryConfig }\n this.customID = params.id || this.uuid\n this.pathPoints = params.path\n this.path = ObjectPipe.calculatePath(params.path.map((points) => new THREE.Vector3().fromArray(points)))\n this.pathLength = this.path.getLength()\n this.texture = ObjectPipe.formatTexture(params.texture)\n const { radius, tubularSegments, radialSegments } = this.geometryConfig\n this.geometry = ObjectPipe.formatGeometryUV(\n new THREE.TubeGeometry(this.path, tubularSegments, radius, radialSegments),\n this.pathLength,\n this.uPreMeter,\n )\n\n const sourceUv = THREE.TSL.uv()\n const offsetU = sourceUv.x.add(this.uOffsetUniform)\n const sampleUv = THREE.TSL.vec2(clampPositiveU ? THREE.TSL.min(offsetU, 0) : offsetU, sourceUv.y.add(this.vOffsetUniform))\n const material = new THREE.MeshBasicNodeMaterial({ transparent: true })\n material.colorNode = THREE.TSL.texture(this.texture, sampleUv)\n material.opacityNode = this.opacityUniform\n this.material = material\n }\n\n public async hide(options?: AnimeOptions): Promise<boolean> {\n this.opacityAnime?.dispose()\n const endOpacity = 0\n if (typeof options?.duration !== 'number') return this.setOpacity(endOpacity)\n const startOpacity = this.opacityUniform.value\n if (startOpacity === endOpacity) return true\n return new Promise<boolean>((resolve) => {\n this.opacityAnime = new BetterTween({ progress: startOpacity })\n .to({ progress: endOpacity })\n .onUpdate(({ progress }) => this.setOpacity(progress))\n .onComplete(() => resolve(true))\n .onDispose(() => {\n this.setOpacity(endOpacity)\n resolve(false)\n })\n .play()\n })\n }\n\n public async show(options?: AnimeOptions) {\n this.opacityAnime?.dispose()\n const endOpacity = 1\n if (typeof options?.duration !== 'number') return this.setOpacity(endOpacity)\n const startOpacity = this.opacityUniform.value\n return new Promise<boolean>((resolve) => {\n this.opacityAnime = new BetterTween({ progress: startOpacity })\n .to({ progress: endOpacity })\n .onUpdate(({ progress }) => this.setOpacity(progress))\n .onComplete(() => resolve(true))\n .onDispose(() => {\n this.setOpacity(endOpacity)\n resolve(false)\n })\n .play()\n })\n }\n\n public setOpacity(value: number) {\n this.opacityUniform.value = value\n ;(this as any).needsRender = true\n return true\n }\n\n public disposeAnime() {\n this.opacityAnime?.dispose()\n this.opacityAnime = undefined\n }\n\n public dispose(): void {\n this.disposeAnime()\n this.geometry.dispose()\n this.material.dispose()\n }\n}\n","import { requestAnimationFrameInterval } from '../../../shared-utils'\nimport type { PipeParams as BasePipeParams } from './Pipe'\nimport { ObjectPipe } from './Pipe'\n\nexport type PipeParams = BasePipeParams\n\nexport class ObjectFlowPipe extends ObjectPipe {\n /** 初始状态下,当前水管内的水流在整体管道上的位移\n * @description 因为水管是不连续的,而要达到水流的连续效果,需要用过贴图的 uOffset 控制每根水管的初始状态\n */\n private initialDisplacement = 0\n private oldTime = new Date().getTime()\n /** 横向流动速度:m / s */\n private flowSpeed = 0.6\n /** 纵向旋转速度:deg / s */\n private rotateSpeed = 0\n\n public constructor(params: PipeParams) {\n super(params, true)\n }\n\n public setInitialDisplacement(distance: number, direction: 'forward' | 'backward' = 'backward') {\n this.initialDisplacement = Math.abs(distance) * (direction === 'forward' ? -1 : 1)\n this.moveFromOrigin(this.initialDisplacement)\n }\n\n /** 水流移动「基于初始位置」\n * @description 因为贴图的运动与 u 的 uOffset 相反,比较反直觉,所以封装方法易于理解\n * @param displacement 位移:米 * 方向(向前 -> 正, 向后 -> 负)\n */\n public moveFromOrigin(displacement: number) {\n const uOffset = displacement * this.uPreMeter\n this.uOffsetUniform.value = uOffset\n ;(this as any).needsRender = true\n return true\n }\n\n /** 水流移动「基于调整管道差值之后的位置」\n *\n * @param distance 位移:米 * 方向\n */\n public moveForwardFromInitialOffset(distance: number) {\n const moveDisplacement = distance * -1\n const displacement = this.initialDisplacement + moveDisplacement\n this.moveFromOrigin(displacement)\n }\n\n public flow() {\n this.flowAnimationDisposer()\n this.oldTime = new Date().getTime()\n let distance = 0\n let rotate = 0\n\n const stopFlowAnime = requestAnimationFrameInterval(() => {\n const time = new Date().getTime()\n const timeInterval = time - this.oldTime\n const distanceInterval = this.flowSpeed * (timeInterval / 1000)\n const rotateInterval = this.rotateSpeed * (timeInterval / 1000)\n distance = distance + distanceInterval\n rotate = rotate + rotateInterval\n const vPreDeg = 1 / 360\n const vOffset = rotate * vPreDeg\n this.vOffsetUniform.value = vOffset\n this.moveForwardFromInitialOffset(distance)\n this.oldTime = time\n })\n\n this.flowAnimationDisposer = function () {\n stopFlowAnime()\n this.moveForwardFromInitialOffset(0)\n }\n\n return\n }\n\n public stopFlow() {\n this.flowAnimationDisposer()\n }\n\n public setSpeed(speed?: { flowSpeed?: number; rotateSpeed?: number }) {\n typeof speed?.flowSpeed === 'number' && (this.flowSpeed = speed.flowSpeed)\n typeof speed?.rotateSpeed === 'number' && (this.rotateSpeed = speed.rotateSpeed)\n }\n\n public disposeAnime() {\n super.disposeAnime()\n this.flowAnimationDisposer()\n }\n\n private flowAnimationDisposer: () => void = () => undefined\n}\n","import type { Five, EventCallback } from '@realsee/five-webgpu'\nimport type {\n State,\n Speed,\n EventMap,\n ServerData,\n PluginData,\n LoadOptions,\n ShowHideOptions,\n SetSpeedOptions,\n ShowPipelinesOptions,\n} from './typing'\nimport * as THREE from 'three/webgpu'\nimport * as BasePlugin from '../base/BasePluginWithData'\nimport { equal, notNil } from '../shared-utils'\nimport { loadTexture } from '../shared-utils/three/loadTexture'\nimport { format, getPipesFromLibrary } from './utils/formatData'\nimport { ObjectFlowPipe } from './utils/Objects/FlowPipe'\n// import { ObjectHighlightPipe } from './utils/three/Objects/HighlightPipe'\n\nconst defaultSpeed: Speed = { flowSpeed: 0.6, rotateSpeed: 0 }\n\nexport class Controller extends BasePlugin.Controller<State, EventMap, ServerData.RootObject, PluginData.RootObject> {\n // ==================== public properties ====================\n public data?: PluginData.RootObject\n /** 插件状态\n * @property `visible` `<boolean>` 是否可见\n * @property `enabled` `<boolean>` 是否启用\n * @property `visiblePipeIDs` `<string[]>` 可见的管道 ID\n * @property `speed` `<Speed>` 水流速度\n * @property `speed.flowSpeed` `<number>` 横向流动速度,默认是 0.6 m/s\n * @property `speed.rotateSpeed` `<number>` 纵向旋转速度:默认是 0 deg/s\n */\n public state: State\n /** 当前插件所有新增 THREE 相关副作用都在 group 下 */\n public group: THREE.Group\n /** 用于展示水流的水管 */\n public pipeObjects: ObjectFlowPipe[] = []\n\n // ==================== private properties ====================\n /** 水管贴图缓存 */\n private texturePromiseCache = new Map<string, Promise<THREE.Texture>>()\n\n public constructor(five: Five) {\n super(five)\n\n this.state = {\n target: null,\n visible: true,\n enabled: true,\n isFlowing: false,\n speed: defaultSpeed,\n }\n this.five = five\n this.group = new THREE.Group()\n this.group.name = 'water-pipe-group'\n this.five.scene.add(this.group)\n this.five.once('dispose', this.dispose)\n this.five.on('wantsTapGesture', this.onWantsFiveTapGesture)\n }\n\n /** 加载管道数据,重复调用会使用新数据覆盖旧数据\n * @param `data` `<Plugin.ServerData>` Open API 接口返回的数据。\n * @param `initialState` `<Plugin.State> | <undefined>` 数据加载后,要应用的 state,默认是 undefined。\n * @param `userAction` `<boolean> | <undefined>` 是否是用户操作,默认是 true。\n * @param `options` `<Plugin.LoadOptions> | <undefined>` 数据加载配置项。\n * @param `options.getPipeRadius` `<(pipe: ServerData.LinesDataset) => number> | <undefined>` 允许用户通过函数自定义管道半径。\n * @param `options.getPipeUrl` `<(water: Water) => string> | <undefined>` 允许用户通过函数自定义管道贴图,\n * 函数返回的 string 就是当前 water 对应的贴图地址。\n */\n\n public async load(data: ServerData.RootObject, initialState?: Partial<State>, userAction?: boolean, options?: Partial<LoadOptions>) {\n const prevData = this.data\n this.data = await this.formatData(data, options)\n this.removeAllPipes()\n this.hooks.emit('dataChange', this.data, prevData)\n this.pipeObjects = await Promise.all(\n this.data.pipes\n .filter((pipe) => !!pipe?.texture)\n .map(async ({ id, texture: textureURL, path, radius }) => {\n const texture = await this.loadPipeTexture(textureURL!)\n const params = { id, path, textureURL, texture, geometryConfig: { radius } }\n const pipe: ObjectFlowPipe = new ObjectFlowPipe(params)\n return pipe\n }),\n )\n\n // 设置管道的初始 offset\n this.data.pipelines.forEach((pipeLine) => {\n pipeLine.pipes.reduce((offset, pipe) => {\n const pipeMesh = this.findPipeObjectWithID(pipe.id)\n pipeMesh?.setInitialDisplacement(offset)\n const nextOffset = offset + (pipeMesh?.pathLength || 0)\n return nextOffset\n }, 0)\n })\n this.hooks.emit('dataLoaded', this.data)\n\n // load 后,如果当前 visible 是 false,需要把管道都隐藏\n if (this.state.visible === false) {\n this.pipeObjects.forEach((pipe) => pipe.setOpacity(0))\n }\n // 只有 enable 为 true 时,才回添加模型到场景中\n if (this.state.enabled) {\n this.group.add(...this.pipeObjects)\n this.five.needsRender = true\n }\n\n if (initialState) this.setState(initialState, { userAction })\n }\n\n /** 更改插件 State\n * @param `state` `<Partial<Plugin.State>>` 插件属性 `state` 的子集。\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public setState(state: Partial<State>, options: BasePlugin.BaseOptions = {}) {\n const prevState = this.state\n if (equal(state, prevState, { deep: true })) return\n\n const userAction = options.userAction !== undefined ? options.userAction : true\n this.updateState(state, userAction)\n\n if (state.enabled !== undefined && prevState.enabled !== state.enabled) {\n state.enabled ? this._enable({ userAction }) : this._disable({ userAction })\n }\n\n if (state.visible !== undefined && prevState.visible !== state.visible) {\n const options = { userAction, anime: { duration: 500 } }\n state.visible ? this._show(options) : this._hide(options)\n }\n\n if (state.isFlowing !== undefined && prevState.isFlowing !== state.isFlowing) {\n state.isFlowing ? this._flow() : this._stopFlow()\n }\n\n if (state.speed !== undefined && !equal(prevState.speed, this.state.speed, { deep: true })) {\n this._setSpeed(state.speed)\n }\n\n if (state.target !== undefined && !equal(prevState.target, this.state.target, { deep: true })) {\n const options = {\n target: state.target,\n showAnime: { duration: 500 },\n hideAnime: { duration: 500 },\n }\n this._switchPipelines(options)\n }\n }\n\n /** 启用插件\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public enable(options: BasePlugin.BaseOptions = {}) {\n if (this.state.enabled) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: true }, userAction)\n this._enable({ userAction })\n }\n\n /** 禁用插件\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public disable(options: BasePlugin.BaseOptions = {}) {\n if (this.state.enabled === false) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: false, isFlowing: false }, userAction)\n this._disable({ userAction })\n }\n\n /** 展示管道模型,注意如果通过 `switchPipelines` 更改过 `visibleIDs`,则只会展示这一部分模型。\n * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n * @param `options.anime` `<AnimeOptions> | <undefined>` 动画配置。\n * @param `options.anime.duration` `<number> | <undefined>` 动画时间,默认是 500ms。\n */\n public async show(options: Partial<ShowHideOptions> = {}) {\n if (this.state.visible) return\n const mergedOptions: ShowHideOptions = {\n userAction: true,\n anime: { duration: 500 },\n ...options,\n }\n this.updateState({ visible: true }, mergedOptions.userAction)\n await this._show(mergedOptions)\n }\n\n /** 插件内容整体隐藏\n * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n * @param `options.anime` `<AnimeOptions> | <undefined>` 动画配置。\n * @param `options.anime.duration` `<number> | <undefined>` 动画时间,默认是 500ms。\n */\n public async hide(options: Partial<ShowHideOptions> = {}) {\n if (this.state.visible === false) return\n const mergedOptions: ShowHideOptions = {\n userAction: true,\n anime: { duration: 500 },\n ...options,\n }\n this.updateState({ visible: false }, mergedOptions.userAction)\n await this._hide(mergedOptions)\n }\n\n /** 切换管路\n * @param `options` `Partial<ShowPipelinesOptions> | <undefined>`\n * @param `options.target` `<{ startLibraryID: number; endLibraryID: number }[]> | <undefined>`\n * 目标管路,存在时,展示目标管路包含的管道,同时隐藏其他管道。不存在则展示所有管道。\n * startLibraryID 和 endLibraryID 是起始和结束的设备 ID。\n * @param `options.showAnime` `<AnimeOptions> | <undefined>` 展示的动画配置。\n * @param `options.hideAnime` `<AnimeOptions> | <undefined>` 隐藏的动画配置。\n * @param `options.anime` `<AnimeOptions> | <undefined>` 兜底的动画配置。\n * @param `options.userAction` `<boolean> | <undefined>` 是否是否是用户操作。\n * */\n public async switchPipelines(options?: Partial<ShowPipelinesOptions>) {\n if (!this.data) return\n const target = options?.target ?? null\n const userAction = options?.userAction ?? true\n this.updateState({ target }, userAction)\n const baseAnimeOptions = { duration: 500 }\n const hideAnimeOptions = options?.hideAnime ?? options?.anime ?? baseAnimeOptions\n const showAnimeOptions = options?.showAnime ?? options?.anime ?? baseAnimeOptions\n const _options = {\n target,\n showAnime: showAnimeOptions,\n hideAnime: hideAnimeOptions,\n }\n this._switchPipelines(_options)\n }\n\n /** 开始流动 */\n public flow(options: BasePlugin.BaseOptions = {}) {\n if (this.state.isFlowing) return\n const userAction = options.userAction ?? true\n this.updateState({ isFlowing: true }, userAction)\n this._flow()\n }\n\n /** 停止流动 */\n public stopFlow(options: BasePlugin.BaseOptions = {}) {\n if (this.state.isFlowing === false) return\n const userAction = options.userAction ?? true\n this.updateState({ isFlowing: false }, userAction)\n this._stopFlow()\n }\n\n /** 更改水管流速\n * @param `options` `<SetSpeedOptions> | <undefined>`\n * @param `options.speed` `<Speed> | <undefined>` 参考 `state.speed` 的描述。\n * @param `options.userAction` `<boolean> | <undefined>` 是否是否是用户操作。\n */\n public setSpeed(options?: Partial<SetSpeedOptions>) {\n const speed = options?.speed ?? defaultSpeed\n const userAction = options.userAction ?? true\n this.updateState({ speed }, userAction)\n this._setSpeed(speed)\n }\n\n /** 销毁插件,移除所有副作用,销毁后将不响应任何 API */\n public dispose = () => {\n this.disable()\n this.five.scene.remove(this.group)\n this.texturePromiseCache.forEach((promise) => promise.then((texture) => texture.dispose()))\n this.texturePromiseCache.clear()\n }\n\n protected async formatData(data: ServerData.RootObject, options?: Partial<LoadOptions>) {\n return format(data, options)\n }\n\n private _enable(options: { userAction: boolean }) {\n this.hooks.emit('enable', { userAction: options.userAction })\n // resume model effects\n this.five.scene.add(this.group)\n this.five.needsRender = true\n // resume event effects\n this.five.on('wantsTapGesture', this.onWantsFiveTapGesture)\n }\n\n private _disable(options: { userAction: boolean }) {\n this.hooks.emit('disable', { userAction: options.userAction })\n // dispose model effects\n this.disposeAnime()\n this.five.scene.remove(this.group)\n this.five.needsRender = true\n // dispose event effects\n this.five.off('wantsTapGesture', this.onWantsFiveTapGesture)\n }\n\n private async _show(options: ShowHideOptions) {\n this.hooks.emit('show', { userAction: options.userAction })\n const animeOptions = options?.anime ?? { duration: 500 }\n const pipeObjects = this.findPipeObjectWithTarget(this.state.target)\n await Promise.all(pipeObjects.map((pipe) => pipe?.show(animeOptions)))\n this.five.needsRender = true\n }\n\n private async _hide(options: ShowHideOptions) {\n this.hooks.emit('hide', { userAction: options.userAction })\n const animeOptions = options?.anime ?? { duration: 500 }\n await Promise.all(this.pipeObjects.map((pipe) => pipe.hide(animeOptions)))\n this.five.needsRender = true\n }\n\n private async _switchPipelines(options: Omit<ShowPipelinesOptions, 'userAction' | 'anime'>) {\n if (!this.data) return\n const pipeObjects = this.findPipeObjectWithTarget(options.target)\n // // 销毁所有动画\n // this.disposeAnime()\n // // 展示之前,先初始化贴图位移\n // pipeObjects.forEach((pipe) => pipe.moveForwardFromInitialOffset(0))\n // 隐藏旧的管道模型\n const hideAnimeOptions = options.hideAnime\n await Promise.all(this.pipeObjects.map((pipe) => pipe.hide(hideAnimeOptions)))\n // 展示新的管道模型\n const showAnimeOptions = options.showAnime\n await Promise.all(pipeObjects.map((pipe) => pipe.show(showAnimeOptions)))\n }\n\n private _flow() {\n this.pipeObjects.forEach((pipe) => pipe.flow())\n }\n\n private _stopFlow() {\n this.pipeObjects.forEach((pipe) => pipe.stopFlow())\n }\n\n private _setSpeed(speed: Speed) {\n this.pipeObjects.forEach((pipe) => pipe.setSpeed(speed))\n }\n\n private updateState(state: Partial<State>, userAction: boolean) {\n const prevState = this.state\n this.state = { ...this.state, ...state }\n this.hooks.emit('stateChange', { state: this.state, prevState, userAction })\n }\n\n /** 加载管道贴图,如果再加载中,复用之前的加载 Promise */\n private async loadPipeTexture(url: string) {\n const mapPromise = this.texturePromiseCache.get(url)\n if (mapPromise) return mapPromise\n const promise = loadTexture(url)\n this.texturePromiseCache.set(url, promise)\n return promise\n }\n\n /** 销毁所有动画 */\n private disposeAnime() {\n this.pipeObjects.forEach((pipe) => pipe.disposeAnime())\n this.five.needsRender = true\n }\n\n /** 移除所有管道模型 */\n private removeAllPipes() {\n this.disposeAnime()\n this.group.remove(...this.pipeObjects)\n this.pipeObjects.forEach((pipe) => pipe.dispose())\n this.pipeObjects = []\n this.five.needsRender = true\n }\n\n /** 根据 ID 查找管道模型 */\n private findPipeObjectWithID(id: string) {\n return this.pipeObjects.find(({ customID }) => customID === id)\n }\n\n /** 根据 target 查找管道模型 */\n private findPipeObjectWithTarget(target: State['target']) {\n const pipeObjects = target\n ? getPipesFromLibrary({ data: this.data, target })\n .map(({ id }) => this.findPipeObjectWithID(id))\n .filter(notNil)\n : this.pipeObjects\n return pipeObjects\n }\n\n private onWantsFiveTapGesture: EventCallback['wantsTapGesture'] = (...params) => {\n const [ray] = params\n const intersectObjects = ray.intersectObjects(this.pipeObjects, false)\n if (intersectObjects.length === 0) return\n if (!this.data) return\n const intersectObject = intersectObjects[0]\n const pipeObject = intersectObject.object as ObjectFlowPipe\n const pipeID = pipeObject.customID\n const pipeData = this.data.pipes.find(({ id }) => id === pipeID)\n const pipelineData = this.data.pipelines.find((pipeline) => pipeData && pipeline.pipes.includes(pipeData))\n\n if (!pipeData || !pipelineData) return\n\n // const highlightTextureURL = '//vr-static.realsee-cdn.cn/release/web/aqueous-system-demo/pipe-highlight.ec4c607b.png'\n // this.loadPipeTexture(highlightTextureURL).then((texture) => {\n // const id = 'highlight_' + pipeData.id\n // const path = pipeData.path\n // const geometryConfig = { radius: pipeObject.geometryConfig.radius + 0.1 / 100 }\n // const highlightPipe = new ObjectHighlightPipe({ id, path, texture, geometryConfig })\n // this.group.add(highlightPipe)\n // highlightPipe.highlight()\n // })\n\n this.hooks.emit('tap', {\n intersectObjects,\n pipe: pipeData,\n pipeline: pipelineData,\n wantsFiveTapGestureParams: params,\n })\n return false\n }\n}\n","import type { FivePlugin } from '@realsee/five-webgpu'\nimport { Controller } from './Controller'\n\nexport const PipelinePlugin: FivePlugin<undefined, Controller> = (five) => {\n return new Controller(five)\n}\n\nexport type PipelinePluginParameterType = undefined\nexport type PipelinePluginReturnType = InstanceType<typeof Controller>\nexport default PipelinePlugin\n"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { t as e } from "./Subscribe-DLlAl88n.js";
|
|
2
|
-
import { a as t } from "./PointHelper-
|
|
2
|
+
import { a as t } from "./PointHelper-G9EgUMWo.js";
|
|
3
3
|
import { C as n, c as r } from "./generatePolygonGeometry-DEr9kX3D.js";
|
|
4
4
|
import { i } from "./util-vGeVT4oo.js";
|
|
5
5
|
import { n as a, t as o } from "./getNormal-BatLuzsS.js";
|
|
6
6
|
import { n as s } from "./isNil-CQNA0Sbe.js";
|
|
7
7
|
import { t as c } from "./rayOnLine-CrCXTByv.js";
|
|
8
|
-
import { a as l, c as u, d, f, i as p, l as m, n as h, o as g, p as _, r as v, s as y, t as b, u as x } from "./Rectangle-
|
|
8
|
+
import { a as l, c as u, d, f, i as p, l as m, n as h, o as g, p as _, r as v, s as y, t as b, u as x } from "./Rectangle-DSOdWXl_.js";
|
|
9
9
|
import { t as S } from "./withResolvers-DVr4bnnk.js";
|
|
10
10
|
import { i as C, n as w, r as T } from "./Polygon-BJfVfdCw.js";
|
|
11
11
|
import { i as E, r as D, t as O } from "./Prism-DxArNvOM.js";
|
|
@@ -877,4 +877,4 @@ function te(e) {
|
|
|
877
877
|
//#endregion
|
|
878
878
|
export { I as a, Q as i, $ as n, ee as r, te as t };
|
|
879
879
|
|
|
880
|
-
//# sourceMappingURL=sculpt-
|
|
880
|
+
//# sourceMappingURL=sculpt-e0IRMtjB.js.map
|