@realsee/dnalogel 4.0.0-webgpu.3 → 4.0.0-webgpu.4
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 +6 -0
- package/dist/floorplan.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +270 -35
- package/dist/index.js.map +1 -0
- package/dist/internal/{BasePlugin-CT5K8m36.js → BasePlugin-DC5m72La.js} +3 -3
- package/dist/internal/{BasePlugin-CT5K8m36.js.map → BasePlugin-DC5m72La.js.map} +1 -1
- package/dist/internal/BasePluginWithData-D_0W46_q.js +7 -0
- package/dist/internal/{BasePluginWithData-9z4tpAT4.js.map → BasePluginWithData-D_0W46_q.js.map} +1 -1
- package/dist/internal/{BetterTween-BX0aTvP1.js → BetterTween-DmptqE8m.js} +2 -2
- package/dist/internal/{BetterTween-BX0aTvP1.js.map → BetterTween-DmptqE8m.js.map} +1 -1
- package/dist/internal/{CSS3DRenderPlugin-ccSpcvwd.js → CSS3DRenderPlugin-CEatgl0m.js} +3 -3
- package/dist/internal/CSS3DRenderPlugin-CEatgl0m.js.map +1 -0
- package/dist/internal/{Controller-Csut_kcH.js → Controller-D6o4OGWJ.js} +8 -8
- package/dist/internal/{Controller-Csut_kcH.js.map → Controller-D6o4OGWJ.js.map} +1 -1
- package/dist/internal/{FiveDomEvents-3H9NvDOz.js → FiveDomEvents-BUBLFzti.js} +2 -2
- package/dist/internal/{FiveDomEvents-3H9NvDOz.js.map → FiveDomEvents-BUBLFzti.js.map} +1 -1
- package/dist/internal/FivePuppet-C6QmVY70.js +67 -0
- package/dist/internal/FivePuppet-C6QmVY70.js.map +1 -0
- package/dist/internal/{PointHelper-D565h9b_.js → PointHelper-DIhgdjY2.js} +48 -48
- package/dist/internal/{PointHelper-D565h9b_.js.map → PointHelper-DIhgdjY2.js.map} +1 -1
- package/dist/internal/{Polygon-CBGvYUfJ.js → Polygon-D3xIL1Pl.js} +30 -30
- package/dist/internal/{Polygon-CBGvYUfJ.js.map → Polygon-D3xIL1Pl.js.map} +1 -1
- package/dist/internal/{Prism-Dm5ESkgg.js → Prism-CJlyAEAU.js} +13 -13
- package/dist/internal/{Prism-Dm5ESkgg.js.map → Prism-CJlyAEAU.js.map} +1 -1
- package/dist/internal/{Rectangle-D-zkDycu.js → Rectangle-BpL9lNKU.js} +118 -129
- package/dist/internal/Rectangle-BpL9lNKU.js.map +1 -0
- package/dist/internal/{Work-DF8j5GnL.js → Work-BE4AgdwH.js} +9 -9
- package/dist/internal/{Work-DF8j5GnL.js.map → Work-BE4AgdwH.js.map} +1 -1
- package/dist/internal/{animationFrame-XGKHIeQK.js → animationFrame-CacKXN8l.js} +14 -3
- package/dist/internal/animationFrame-CacKXN8l.js.map +1 -0
- package/dist/internal/{area-maker-Bd9l2pIp.js → area-maker-Bnhx4SkH.js} +4 -4
- package/dist/internal/{area-maker-Bd9l2pIp.js.map → area-maker-Bnhx4SkH.js.map} +1 -1
- package/dist/internal/{boundingBox-DvCor5Hd.js → boundingBox-CIqXgNXW.js} +2 -2
- package/dist/internal/{boundingBox-DvCor5Hd.js.map → boundingBox-CIqXgNXW.js.map} +1 -1
- package/dist/internal/{camera-movement-CwI7UqUk.js → camera-movement-C1pwfMk_.js} +2 -2
- package/dist/internal/camera-movement-C1pwfMk_.js.map +1 -0
- package/dist/internal/{changeMode-BVGYCoqu.js → changeMode-D_I2AOjH.js} +2 -2
- package/dist/internal/{changeMode-BVGYCoqu.js.map → changeMode-D_I2AOjH.js.map} +1 -1
- package/dist/internal/{controller-BWkZT0l1.js → controller-DIDtFrBE.js} +1991 -2050
- package/dist/internal/controller-DIDtFrBE.js.map +1 -0
- package/dist/internal/{cruise-C3F0eNQ-.js → cruise-B50Tcq66.js} +2 -2
- package/dist/internal/{cruise-C3F0eNQ-.js.map → cruise-B50Tcq66.js.map} +1 -1
- package/dist/internal/{current-pano-image-DKUWluR-.js → current-pano-image-BCFr6njt.js} +4 -4
- package/dist/internal/{current-pano-image-DKUWluR-.js.map → current-pano-image-BCFr6njt.js.map} +1 -1
- package/dist/internal/{defaultUrls-CjKkS9k9.js → defaultUrls-CfMtGzqM.js} +14 -3
- package/dist/internal/defaultUrls-CfMtGzqM.js.map +1 -0
- package/dist/internal/{fire-scene-CczaBz2_.js → fire-scene-BzZGvyh_.js} +9 -4
- package/dist/internal/fire-scene-BzZGvyh_.js.map +1 -0
- package/dist/internal/{fiveModelLoad-mg-TnpnM.js → fiveModelLoad-BUIBYxzp.js} +2 -2
- package/dist/internal/{fiveModelLoad-mg-TnpnM.js.map → fiveModelLoad-BUIBYxzp.js.map} +1 -1
- package/dist/internal/{floorplan-KWlIsTvO.js → floorplan-C8BGw87S.js} +5 -5
- package/dist/internal/{floorplan-KWlIsTvO.js.map → floorplan-C8BGw87S.js.map} +1 -1
- package/dist/internal/{generatePolygonGeometry-B_5JFq8y.js → generatePolygonGeometry-BOnzdCaG.js} +181 -178
- package/dist/internal/generatePolygonGeometry-BOnzdCaG.js.map +1 -0
- package/dist/internal/{lookObject-wesf8xt6.js → lookObject-DuRab5wf.js} +2 -2
- package/dist/internal/{lookObject-wesf8xt6.js.map → lookObject-DuRab5wf.js.map} +1 -1
- package/dist/internal/{measure-BX6boAC7.js → measure-B4jFwdQ6.js} +5 -5
- package/dist/internal/{measure-BX6boAC7.js.map → measure-B4jFwdQ6.js.map} +1 -1
- package/dist/internal/{model-chassis-compass-InVNmOAQ.js → model-chassis-compass-C6NTVMLo.js} +2 -2
- package/dist/internal/{model-chassis-compass-InVNmOAQ.js.map → model-chassis-compass-C6NTVMLo.js.map} +1 -1
- package/dist/internal/{model-entry-door-guide-wZbyY77a.js → model-entry-door-guide-DnGTLY2s.js} +2 -2
- package/dist/internal/{model-entry-door-guide-wZbyY77a.js.map → model-entry-door-guide-DnGTLY2s.js.map} +1 -1
- package/dist/internal/{model-maker-uO8xlTuO.js → model-maker-B1mnDdKY.js} +15 -15
- package/dist/internal/{model-maker-uO8xlTuO.js.map → model-maker-B1mnDdKY.js.map} +1 -1
- package/dist/internal/{model-tv-video-DzXb2JRf.js → model-tv-video-BP-7HoDC.js} +2 -2
- package/dist/internal/{model-tv-video-DzXb2JRf.js.map → model-tv-video-BP-7HoDC.js.map} +1 -1
- package/dist/internal/{model-view-CBeeMM98.js → model-view-BWUU0-uq.js} +2 -2
- package/dist/internal/{model-view-CBeeMM98.js.map → model-view-BWUU0-uq.js.map} +1 -1
- package/dist/internal/object3d-helper-CbRRhnLV.js +7 -0
- package/dist/internal/{object3d-helper-DDYsVPN6.js.map → object3d-helper-CbRRhnLV.js.map} +1 -1
- package/dist/internal/{pano-compass-jSr629BP.js → pano-compass-BRTM0dCc.js} +7 -7
- package/dist/internal/{pano-compass-jSr629BP.js.map → pano-compass-BRTM0dCc.js.map} +1 -1
- package/dist/internal/{pano-door-label-DKoYIKLa.js → pano-door-label-BLjYGZrr.js} +3 -3
- package/dist/internal/{pano-door-label-DKoYIKLa.js.map → pano-door-label-BLjYGZrr.js.map} +1 -1
- package/dist/internal/{pano-measure-DW9mdx1O.js → pano-measure-BIgCWkVJ.js} +14 -14
- package/dist/internal/{pano-measure-DW9mdx1O.js.map → pano-measure-BIgCWkVJ.js.map} +1 -1
- package/dist/internal/{pano-ruler-pro-D7q0Ob21.js → pano-ruler-pro-D9yTbHJz.js} +2 -2
- package/dist/internal/{pano-ruler-pro-D7q0Ob21.js.map → pano-ruler-pro-D9yTbHJz.js.map} +1 -1
- package/dist/internal/{pano-spatial-tag-D0qn-__S.js → pano-spatial-tag-B7Gxn3BS.js} +3 -3
- package/dist/internal/{pano-spatial-tag-D0qn-__S.js.map → pano-spatial-tag-B7Gxn3BS.js.map} +1 -1
- package/dist/internal/{pano-tag-BW5MXXws.js → pano-tag-Bchz-jED.js} +2 -2
- package/dist/internal/{pano-tag-BW5MXXws.js.map → pano-tag-Bchz-jED.js.map} +1 -1
- package/dist/internal/{pano-video-Bmud_CAn.js → pano-video-BufYQMqo.js} +3 -3
- package/dist/internal/{pano-video-Bmud_CAn.js.map → pano-video-BufYQMqo.js.map} +1 -1
- package/dist/internal/{pipeline-DDqgb1gw.js → pipeline-t_3IMXKB.js} +4 -4
- package/dist/internal/{pipeline-DDqgb1gw.js.map → pipeline-t_3IMXKB.js.map} +1 -1
- package/dist/internal/{sculpt-BNkLJR6p.js → sculpt-BCK4PMwL.js} +64 -63
- package/dist/internal/{sculpt-BNkLJR6p.js.map → sculpt-BCK4PMwL.js.map} +1 -1
- package/dist/internal/tagPosition-DA9YguT8.js +176 -0
- package/dist/internal/tagPosition-DA9YguT8.js.map +1 -0
- package/dist/internal/withResolvers-DVr4bnnk.js +15 -0
- package/dist/internal/withResolvers-DVr4bnnk.js.map +1 -0
- package/dist/plugins/area-maker.js +1 -1
- package/dist/plugins/camera-movement.js +1 -1
- package/dist/plugins/cruise.js +2 -2
- package/dist/plugins/css3d-render.js +1 -1
- package/dist/plugins/current-pano-image.js +1 -1
- package/dist/plugins/digital-performance.d.ts +1 -1
- package/dist/plugins/digital-performance.js +1 -1
- package/dist/plugins/fire-scene.d.ts +1 -1
- package/dist/plugins/fire-scene.js +1 -1
- package/dist/plugins/guide-line.js +1 -1
- package/dist/plugins/measure.js +1 -1
- package/dist/plugins/model-chassis-compass.js +1 -1
- package/dist/plugins/model-entry-door-guide.js +1 -1
- package/dist/plugins/model-maker.d.ts +1 -1
- package/dist/plugins/model-maker.js +1 -1
- package/dist/plugins/model-tv-video.js +1 -1
- package/dist/plugins/model-view.js +1 -1
- package/dist/plugins/object3d-helper.d.ts +1 -1
- package/dist/plugins/object3d-helper.js +3 -1
- package/dist/plugins/pano-compass.js +1 -1
- package/dist/plugins/pano-door-label.js +1 -1
- package/dist/plugins/pano-measure.js +1 -1
- package/dist/plugins/pano-ruler-pro.js +1 -1
- package/dist/plugins/pano-spatial-tag.js +1 -1
- package/dist/plugins/pano-tag.d.ts +1 -1
- package/dist/plugins/pano-tag.js +4 -1
- package/dist/plugins/pano-video.js +1 -1
- package/dist/plugins/pipeline.js +1 -1
- package/dist/plugins/sculpt.d.ts +1 -1
- package/dist/plugins/sculpt.js +7 -1
- package/dist/types/public/index.d.ts +2 -0
- package/dist/types/public/plugins/digital-performance.d.ts +1 -0
- package/dist/types/public/plugins/fire-scene.d.ts +1 -0
- package/dist/types/public/plugins/model-maker.d.ts +1 -0
- package/dist/types/public/plugins/object3d-helper.d.ts +1 -0
- package/dist/types/public/plugins/pano-tag.d.ts +2 -0
- package/dist/types/public/plugins/sculpt.d.ts +8 -0
- package/dist/types/public/utils.d.ts +5 -0
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +16 -50
- package/package.json +1 -1
- package/dist/internal/BasePluginWithData-9z4tpAT4.js +0 -7
- package/dist/internal/CSS3DRenderPlugin-ccSpcvwd.js.map +0 -1
- package/dist/internal/Rectangle-D-zkDycu.js.map +0 -1
- package/dist/internal/animationFrame-XGKHIeQK.js.map +0 -1
- package/dist/internal/blink-DD_0mH-m.js +0 -113
- package/dist/internal/blink-DD_0mH-m.js.map +0 -1
- package/dist/internal/camera-movement-CwI7UqUk.js.map +0 -1
- package/dist/internal/controller-BWkZT0l1.js.map +0 -1
- package/dist/internal/defaultUrls-CjKkS9k9.js.map +0 -1
- package/dist/internal/fire-scene-CczaBz2_.js.map +0 -1
- package/dist/internal/generatePolygonGeometry-B_5JFq8y.js.map +0 -1
- package/dist/internal/object3d-helper-DDYsVPN6.js +0 -7
- package/dist/utils.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Prism-Dm5ESkgg.js","names":["triangleArea","triangleCenter","earcut3D","LineMesh","IObject3D","intersectWithoutLine","LineGeometry","ColoredMesh","LineWithDotsMesh","PolygonMesh","THREE","closeVectors","v","vectors","last","first","PolylineBaseMesh","line","style","params","withDots","points","anyPositionToVector3","nextPoint","index","mesh","point","PolylineMesh","PolylineWithDotsMesh","PolygonWithEdgeMesh","child","raycaster","intersects","convexPolygonVertexIndex","_vectors","i","concavePolygonVertexIndex","PrismGeometry","b","t","bottemIndex","o","topVectors","topIndex","PrismAnimationGeometry","bottomVectors","offset","positions","uvs","indices","groups","indexOffset","nextI","group","minX","maxX","minZ","maxZ","sizeX","sizeZ","vector","u","startIndex","faceIndices","bottom1","bottom2","top2","top1","PrismAnimationMaterial","color","sourceUv","radius","edge","edgeBoost","intensity","normalizedY","sweep","PrismMesh","p","bottomPositions","topPosition","triangles","area","bottomCenter","p1","p2","p3","triArea","triCenter","center","key","five","id","animatedBoxMesh","material","currentTime","remove","AnimationFrameLoop","deltaTime","progress","_progress","resolve","animation","targetId","easeInAnimation","edgeMeshCount","originalPrismMeshOpacity","interval","callback","min","max","pos","topPositions","originalGeometry","originalBottomPositions","originalTopPosition","animationGeometry","minWorld","maxWorld"],"sources":["../../src/shared-utils/three/closeVectors.ts","../../src/Sculpt/Meshes/Polyline.ts","../../src/Sculpt/Meshes/PolygonWithEdge.ts","../../src/shared-utils/three/core/polygonVertex.ts","../../src/shared-utils/three/core/PrismGeometry.ts","../../src/shared-utils/three/core/PrismAnimationGeometry.ts","../../src/Sculpt/Meshes/Prism.ts"],"sourcesContent":["import type * as THREE from 'three/webgpu'\n\nexport default function closeVectors(vectors: THREE.Vector3[]) {\n const v: THREE.Vector3[] = [...vectors]\n if (vectors.length < 3) return vectors\n const last = vectors[vectors.length - 1]\n const first = vectors[0]\n if (!last.equals(first)) v.push(first)\n return v\n}\n","import { anyPositionToVector3, type AnyPositions } from '../../shared-utils/positionToVector3'\nimport { IObject3D } from '../../shared-utils/three/IObject3D'\nimport { notNil } from '../../shared-utils'\nimport { LineWithDotsMesh } from './LineWithDots'\nimport type { LineMeshStyle } from './Line'\nimport type { PointsData } from '../utils/data'\nimport * as THREE from 'three/webgpu'\nimport closeVectors from '../../shared-utils/three/closeVectors'\nimport { removeAllTag } from '../utils/removeAllTag'\n\nexport type PolylineStyle = LineMeshStyle\n\nexport type PolylineData = PointsData\n\nexport abstract class PolylineBaseMesh extends IObject3D {\n public name = 'PolylineBaseMesh'\n\n public get style() {\n return {\n lineColor: this.lineColor,\n lineWidth: this.lineWidth,\n opacity: this.opacity,\n dashed: this.dashed,\n occlusionVisibility: this.occlusionVisibility,\n occlusionMode: this.occlusionMode,\n lengthEnable: this.paramsStyle?.lengthEnable,\n }\n }\n\n public get opacity() {\n return this.lines[0]?.lineOpacity ?? this.paramsStyle?.lineOpacity\n }\n\n public get lineColor() {\n return this.lines[0]?.color ?? (this.paramsStyle?.lineColor ? new THREE.Color(this.paramsStyle.lineColor) : undefined)\n }\n\n public get lineWidth() {\n return this.lines[0]?.lineWidth ?? this.paramsStyle?.lineWidth\n }\n\n public get dashed() {\n return this.lines[0]?.dashed ?? this.paramsStyle?.dashed\n }\n\n public get occlusionVisibility() {\n return this.lines[0]?.occlusionVisibility ?? this.paramsStyle?.occlusionVisibility\n }\n\n public get occlusionMode() {\n return this.lines[0]?.occlusionMode ?? this.paramsStyle?.occlusionMode\n }\n\n public get points() {\n return this.lines\n .map((line) => line.points[0])\n .concat(this.lines?.[this.lines?.length - 1]?.points[1])\n .filter(Boolean)\n }\n public lines: Array<LineWithDotsMesh> = []\n\n private withDots: boolean\n\n private paramsStyle: Partial<PolylineStyle>\n\n public constructor(params?: Partial<PolylineStyle & PolylineData & { withDots: boolean }>) {\n super()\n const { withDots, points, ...style } = params\n this.withDots = withDots ?? true\n if (points) this.setPoints(points)\n if (style) this.setStyle(style)\n }\n\n public setPoints(points: AnyPositions, params = { closed: false }) {\n let vectors = points.map(anyPositionToVector3)\n\n if (params.closed) vectors = closeVectors(vectors)\n\n vectors.forEach((point, index) => {\n const nextPoint = vectors[index + 1]\n if (index !== 0 && nextPoint === undefined) return\n const line =\n this.lines[index] ??\n (() => {\n const mesh = new LineWithDotsMesh({\n ...this.style,\n pointVisibility: this.withDots ? { startPoint: index === 0, endPoint: true } : false,\n })\n this.lines[index] = mesh\n this.add(mesh)\n return mesh\n })()\n\n line.setStyle(this.style)\n line.setPoints([point, nextPoint])\n })\n\n if (vectors.length === 0) {\n this.lines.forEach((line) => line.removeFromParent())\n this.lines = []\n } else if (vectors.length === 1) {\n // 跳过特殊情况:一个点,一条线\n } else {\n if (this.lines.length > vectors.length - 1) {\n this.lines.splice(vectors.length - 1).forEach((line) => line.removeFromParent())\n }\n }\n }\n\n public setStyle(style: Partial<PolylineStyle>) {\n this.paramsStyle = { ...this.paramsStyle, ...style }\n this.lines.forEach((line) => line.setStyle(this.paramsStyle))\n }\n\n public highlight() {\n this.lines.forEach((line) => line.highlight())\n }\n\n public unhighlight() {\n this.lines.forEach((line) => line.unhighlight())\n }\n}\n\nexport class PolylineMesh extends PolylineBaseMesh {\n public name = 'PolylineMesh'\n public constructor(...params: ConstructorParameters<typeof PolylineBaseMesh>) {\n super({ ...params[0], withDots: false })\n }\n}\n\nexport class PolylineWithDotsMesh extends PolylineBaseMesh {\n public name = 'PolylineWithDotsMesh'\n public constructor(...params: ConstructorParameters<typeof PolylineBaseMesh>) {\n super({ ...params[0], withDots: true })\n }\n}\n","import type * as THREE from 'three/webgpu'\nimport type { AnyPositions } from '../../shared-utils/positionToVector3'\nimport { PolylineMesh } from './Polyline'\nimport type { LineStyle } from '../typings/style'\nimport { PolygonMesh, type PolygonData, type PolygonStyle } from './Polygon'\nimport { intersectWithoutLine } from '../../shared-utils/three/core/Raycaster'\n\nexport type PolygonWithEdgeMeshStyle = PolygonStyle & LineStyle\n\n/**\n * @description: 带边线的多边形\n */\nexport class PolygonWithEdgeMesh extends PolygonMesh {\n public name = 'PolygonWithEdgeMesh'\n\n public get style() {\n return {\n ...super.style,\n lineWidth: this.lineWidth,\n lineColor: this.lineColor,\n }\n }\n\n public get lineWidth() {\n return this.line.lineWidth\n }\n\n public get lineColor() {\n return this.line.lineColor\n }\n\n public line: PolylineMesh = new PolylineMesh()\n\n public constructor(params?: Partial<PolygonWithEdgeMeshStyle & PolygonData>) {\n const { points, ...style } = params ?? {}\n super()\n\n if (points) this.setPoints(points)\n if (style) this.setStyle(style)\n }\n\n public raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]) {\n this.children.forEach((child) => {\n intersectWithoutLine(child, raycaster, intersects, true)\n })\n return false\n }\n\n public setPoints(points: AnyPositions, params?: { closed?: boolean; checkLinesIntersect?: boolean }) {\n super.setPoints(points, { closed: true, ...params })\n if (this.points) {\n this.line.setPoints(this.points, { closed: true, ...params })\n this.addIfNotExists(this.line)\n }\n }\n\n public setStyle(style: Partial<PolygonWithEdgeMeshStyle>) {\n super.setStyle(style)\n // 特别处理lineOpacity属性,确保传递给line\n if (style.lineOpacity !== undefined) {\n this.line.setStyle({\n ...style,\n // 强制设置line的lineOpacity\n lineOpacity: style.lineOpacity,\n })\n } else {\n this.line.setStyle(style)\n }\n // 确保更新渲染\n this.needsRender = true\n }\n\n public highlight() {\n super.highlight()\n this.line.highlight()\n }\n\n public unhighlight() {\n super.unhighlight()\n this.line.unhighlight()\n }\n}\n","import * as THREE from 'three/webgpu'\nimport earcut3D from '../earcut3D'\n\n/**\n * @description 凸多边形的顶点\n */\nexport function convexPolygonVertexIndex(_vectors: number[][]) {\n const vectors = [..._vectors]\n const index: number[] = []\n\n // 底面索引\n for (let i = 0; i < vectors.length - 2; i++) {\n index.push(0, i + 1, i + 2)\n }\n\n return index\n}\n\n/**\n * @description 凹多边形的顶点\n */\nexport function concavePolygonVertexIndex(vectors: number[][]) {\n const points = vectors.map((v) => new THREE.Vector3(v[0], v[1], v[2]))\n\n const index = earcut3D(points)\n\n return index\n}\n","import * as THREE from 'three/webgpu'\nimport { concavePolygonVertexIndex, convexPolygonVertexIndex } from './polygonVertex'\n\nexport class PrismGeometry extends THREE.BufferGeometry {\n public bottomPositions: number[][] = []\n public topPosition: number[] = []\n\n private _type: 'Concave' | 'Convex' = 'Concave'\n\n public constructor(params?: { bottomPositions?: number[][]; topPosition?: number[]; type?: 'Concave' | 'Convex' }) {\n super()\n if (params) this.setPosition(params)\n }\n\n /**\n * @description 设置底面和顶面的位置\n * @param params.bottomPositions 底面多边形的有序顶点,顺时针或逆时针均可\n * @param params.topPosition 底面多边形的第一个点对应的顶面的顶点\n * @param params.type 棱柱的类型,凹多边形(Concave)或凸多边形(Convex),默认为凹多边形。如果可以确定是凸多边形,建议设置为凸多边形,性能更好\n */\n public setPosition(params: { bottomPositions?: number[][]; topPosition?: number[]; type?: 'Concave' | 'Convex' }) {\n const b = params.bottomPositions ?? this.bottomPositions\n const t = params.topPosition ?? this.topPosition\n this._type = params.type ?? this._type\n\n this.bottomPositions = b\n this.topPosition = t\n\n if (!b || b.length < 3) {\n console.error('PrismGeometry: Invalid parameters', b, t, params)\n this.bottomPositions = []\n this.setAttribute('position', new THREE.BufferAttribute(new Float32Array([]), 3))\n return\n }\n\n const index: number[] = []\n const vectors: number[][] = []\n\n // 底面顶点\n vectors.push(...b)\n\n // 检查头尾点是否相等,相等则删除\n if (vectors[0][0] === vectors.at(-1)[0] && vectors[0][1] === vectors.at(-1)[1] && vectors[0][2] === vectors.at(-1)[2]) {\n vectors.length -= 1\n }\n\n const bottemIndex = this._type === 'Concave' ? concavePolygonVertexIndex(vectors) : convexPolygonVertexIndex(vectors)\n index.push(...bottemIndex)\n\n if (t && t.length === 3) {\n const o = [t[0] - b[0][0], t[1] - b[0][1], t[2] - b[0][2]] // offset\n\n // 顶面顶点\n const topVectors = vectors.map((v) => [v[0] + o[0], v[1] + o[1], v[2] + o[2]])\n vectors.push(...topVectors)\n\n // 顶面索引\n const topIndex = index.map((i) => i + vectors.length / 2)\n index.push(...topIndex)\n\n // 侧面索引\n for (let i = 0; i < vectors.length / 2 - 1; i++) {\n index.push(i, i + 1, i + vectors.length / 2)\n index.push(i + 1, i + vectors.length / 2 + 1, i + vectors.length / 2)\n }\n\n // 闭合侧面\n index.push(0, vectors.length / 2, vectors.length / 2 - 1)\n index.push(vectors.length / 2, vectors.length - 1, vectors.length / 2 - 1)\n }\n\n this.setAttribute('position', new THREE.Float32BufferAttribute(vectors.flat(), 3))\n this.setIndex(index)\n\n this.computeBoundingSphere()\n }\n}\n","import * as THREE from 'three/webgpu'\nimport { concavePolygonVertexIndex, convexPolygonVertexIndex } from './polygonVertex'\n\nexport class PrismAnimationGeometry extends THREE.BufferGeometry {\n public bottomPositions: number[][] = []\n public topPosition: number[] = []\n public faceCount: number = 0\n\n private _type: 'Concave' | 'Convex' = 'Concave'\n\n public constructor(params?: { bottomPositions?: number[][]; topPosition?: number[]; type?: 'Concave' | 'Convex' }) {\n super()\n if (params) this.setPosition(params)\n }\n\n /**\n * 设置底面和顶面的位置,创建类似BoxGeometry的多面结构\n */\n public setPosition(params: { bottomPositions?: number[][]; topPosition?: number[]; type?: 'Concave' | 'Convex' }) {\n const b = params.bottomPositions ?? this.bottomPositions\n const t = params.topPosition ?? this.topPosition\n this._type = params.type ?? this._type\n\n this.bottomPositions = b\n this.topPosition = t\n\n if (!b || b.length < 3 || !t || t.length !== 3) {\n console.error('PrismAnimationGeometry: Invalid parameters', b, t, params)\n return\n }\n\n // 检查头尾点是否相等,相等则删除\n const bottomVectors = [...b]\n if (bottomVectors[0][0] === bottomVectors.at(-1)[0] && \n bottomVectors[0][1] === bottomVectors.at(-1)[1] && \n bottomVectors[0][2] === bottomVectors.at(-1)[2]) {\n bottomVectors.length -= 1\n }\n\n const offset = [t[0] - b[0][0], t[1] - b[0][1], t[2] - b[0][2]]\n const topVectors = bottomVectors.map(v => [v[0] + offset[0], v[1] + offset[1], v[2] + offset[2]])\n\n // 计算面数:底面 + 顶面 + 侧面数\n this.faceCount = 2 + bottomVectors.length\n\n const positions: number[] = []\n const uvs: number[] = []\n const indices: number[] = []\n const groups: { start: number; count: number; materialIndex: number }[] = []\n\n let indexOffset = 0\n\n // 1. 底面\n this.addBottomFace(bottomVectors, positions, uvs, indices, indexOffset, groups, 0)\n indexOffset += this.getBottomFaceVertexCount(bottomVectors)\n\n // 2. 顶面\n this.addTopFace(topVectors, positions, uvs, indices, indexOffset, groups, 1)\n indexOffset += this.getTopFaceVertexCount(topVectors)\n\n // 3. 侧面\n for (let i = 0; i < bottomVectors.length; i++) {\n const nextI = (i + 1) % bottomVectors.length\n this.addSideFace(\n bottomVectors[i], bottomVectors[nextI], \n topVectors[i], topVectors[nextI],\n positions, uvs, indices, indexOffset, groups, 2 + i\n )\n indexOffset += 4 // 每个侧面4个顶点\n }\n\n this.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3))\n this.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2))\n this.setIndex(indices)\n\n // 设置材质组\n this.clearGroups()\n groups.forEach(group => {\n this.addGroup(group.start, group.count, group.materialIndex)\n })\n\n this.computeBoundingSphere()\n\n console.log('PrismAnimationGeometry UV debug:', {\n totalUVs: uvs.length / 2,\n totalPositions: positions.length / 3,\n faceCount: this.faceCount,\n uvSample: uvs.slice(0, 20)\n })\n }\n\n private addBottomFace(\n vectors: number[][], \n positions: number[], \n uvs: number[], \n indices: number[], \n indexOffset: number,\n groups: { start: number; count: number; materialIndex: number }[],\n materialIndex: number\n ) {\n // 计算底面边界框用于UV映射\n const minX = Math.min(...vectors.map(v => v[0]))\n const maxX = Math.max(...vectors.map(v => v[0]))\n const minZ = Math.min(...vectors.map(v => v[2]))\n const maxZ = Math.max(...vectors.map(v => v[2]))\n const sizeX = maxX - minX || 1\n const sizeZ = maxZ - minZ || 1\n\n // 添加顶点和UV\n for (const vector of vectors) {\n positions.push(vector[0], vector[1], vector[2])\n const u = (vector[0] - minX) / sizeX\n const v = (vector[2] - minZ) / sizeZ\n uvs.push(u, v)\n }\n\n // 添加索引\n const startIndex = indices.length\n const faceIndices = this._type === 'Concave' ? \n concavePolygonVertexIndex(vectors) : \n convexPolygonVertexIndex(vectors)\n \n for (const index of faceIndices) {\n indices.push(index + indexOffset)\n }\n\n groups.push({\n start: startIndex,\n count: indices.length - startIndex,\n materialIndex\n })\n }\n\n private addTopFace(\n vectors: number[][], \n positions: number[], \n uvs: number[], \n indices: number[], \n indexOffset: number,\n groups: { start: number; count: number; materialIndex: number }[],\n materialIndex: number\n ) {\n // 计算顶面边界框用于UV映射\n const minX = Math.min(...vectors.map(v => v[0]))\n const maxX = Math.max(...vectors.map(v => v[0]))\n const minZ = Math.min(...vectors.map(v => v[2]))\n const maxZ = Math.max(...vectors.map(v => v[2]))\n const sizeX = maxX - minX || 1\n const sizeZ = maxZ - minZ || 1\n\n // 添加顶点和UV\n for (const vector of vectors) {\n positions.push(vector[0], vector[1], vector[2])\n const u = (vector[0] - minX) / sizeX\n const v = (vector[2] - minZ) / sizeZ\n uvs.push(u, v)\n }\n\n // 添加索引(顶面需要反向,因为法向量朝上)\n const startIndex = indices.length\n const faceIndices = this._type === 'Concave' ? \n concavePolygonVertexIndex(vectors) : \n convexPolygonVertexIndex(vectors)\n \n // 反向索引以确保正确的法向量\n for (let i = faceIndices.length - 1; i >= 0; i--) {\n indices.push(faceIndices[i] + indexOffset)\n }\n\n groups.push({\n start: startIndex,\n count: indices.length - startIndex,\n materialIndex\n })\n }\n\n private addSideFace(\n bottom1: number[], bottom2: number[],\n top1: number[], top2: number[],\n positions: number[], \n uvs: number[], \n indices: number[], \n indexOffset: number,\n groups: { start: number; count: number; materialIndex: number }[],\n materialIndex: number\n ) {\n // 添加四个顶点:bottom1, bottom2, top2, top1\n positions.push(\n bottom1[0], bottom1[1], bottom1[2], // 0\n bottom2[0], bottom2[1], bottom2[2], // 1\n top2[0], top2[1], top2[2], // 2\n top1[0], top1[1], top1[2] // 3\n )\n\n // 添加UV坐标(每个侧面都是0-1的矩形)\n // 顶点顺序:bottom1, bottom2, top2, top1\n // UV应该从底部到顶部:(0,0) -> (1,0) -> (1,1) -> (0,1)\n uvs.push(\n 0, 0, // bottom1 (左下)\n 1, 0, // bottom2 (右下) \n 1, 1, // top2 (右上)\n 0, 1 // top1 (左上)\n )\n\n // 添加索引(两个三角形组成四边形)\n const startIndex = indices.length\n indices.push(\n indexOffset + 0, indexOffset + 1, indexOffset + 2, // 第一个三角形\n indexOffset + 0, indexOffset + 2, indexOffset + 3 // 第二个三角形\n )\n\n groups.push({\n start: startIndex,\n count: 6, // 两个三角形,6个索引\n materialIndex\n })\n }\n\n private getBottomFaceVertexCount(vectors: number[][]): number {\n return vectors.length\n }\n\n private getTopFaceVertexCount(vectors: number[][]): number {\n return vectors.length\n }\n}","import { IObject3D } from '../../shared-utils/three/IObject3D'\nimport { anyPositionToVector3, type AnyPosition } from '../../shared-utils/positionToVector3'\nimport type { AreaData } from './Area'\nimport * as THREE from 'three/webgpu'\nimport type { LineStyle } from '../typings/style'\nimport type { ColoredMeshStyle } from '../utils/three/ColoredMesh'\nimport { intersectWithoutLine } from '../../shared-utils/three/core/Raycaster'\nimport ColoredMesh from '../utils/three/ColoredMesh'\nimport { PrismGeometry } from '../../shared-utils/three/core/PrismGeometry'\nimport { PrismAnimationGeometry } from '../../shared-utils/three/core/PrismAnimationGeometry'\nimport { triangleArea, triangleCenter } from '../../shared-utils/three/geometryUtil'\nimport { LineMesh } from './Line'\nimport { LineGeometry } from '../../shared-utils/three/core/LineGeometry'\nimport { AnimationFrameLoop, type Five } from '@realsee/five-webgpu'\n\nclass PrismAnimationMaterial extends THREE.MeshBasicNodeMaterial {\n public readonly colorValue = THREE.TSL.uniform(new THREE.Color())\n public readonly sizeValue = THREE.TSL.uniform(new THREE.Vector3(1, 1, 1))\n public readonly minPosition = THREE.TSL.uniform(new THREE.Vector3())\n public readonly progressValue = THREE.TSL.uniform(0.5)\n\n public constructor(color: string) {\n super({ depthTest: false, side: THREE.DoubleSide, transparent: true })\n this.colorValue.value.set(color)\n\n const sourceUv = THREE.TSL.uv()\n const radius = THREE.TSL.length(sourceUv).mul(0.3).add(0.1)\n const edge = sourceUv.x.lessThan(0.003)\n .or(sourceUv.x.greaterThan(0.997))\n .or(sourceUv.y.lessThan(0.003))\n .or(sourceUv.y.greaterThan(0.997))\n const edgeBoost = THREE.TSL.float(1).sub(\n THREE.TSL.min(THREE.TSL.abs(sourceUv.x.sub(0.5)), THREE.TSL.abs(sourceUv.y.sub(0.5))).mul(2),\n )\n const intensity = radius.add(THREE.TSL.select(edge, edgeBoost, 0))\n const normalizedY = THREE.TSL.positionWorld.y.sub(this.minPosition.y).div(this.sizeValue.y)\n const sweep = THREE.TSL.clamp(\n THREE.TSL.float(1).sub(THREE.TSL.abs(normalizedY.sub(this.progressValue)).div(0.3)),\n 0,\n 1,\n ).pow(2)\n\n this.colorNode = this.colorValue\n this.opacityNode = THREE.TSL.clamp(intensity.mul(sweep).mul(1.5), 0, 1)\n this.polygonOffset = true\n this.polygonOffsetFactor = 1\n this.polygonOffsetUnits = 1\n }\n}\n\nexport type PrismStyle = ColoredMeshStyle & LineStyle\n\nexport interface PrismData extends AreaData {\n heightPoint: AnyPosition\n}\n\n/**\n * @description: 多棱柱\n */\nexport class PrismMesh extends IObject3D {\n public name = 'PrismMesh'\n\n private five?: Five\n private animatedBoxMesh?: THREE.Mesh<PrismAnimationGeometry, PrismAnimationMaterial>\n private activeAnimations: Map<string | number, { animatedBoxMesh: THREE.Mesh<PrismAnimationGeometry, PrismAnimationMaterial>; remove: () => void; resolve: () => void }> = new Map()\n private activeEaseInAnimations: Map<string | number, { interval: NodeJS.Timeout; model: PrismMesh }> = new Map()\n\n public get topPosition() {\n return new THREE.Vector3().fromArray(this.prismMesh.geometry.topPosition)\n }\n\n public get bottomPositions() {\n return this.prismMesh.geometry.bottomPositions.map((p) => new THREE.Vector3().fromArray(p))\n }\n\n public get topPositions() {\n const offset = this.bottomPositions[0].clone().sub(this.topPosition)\n return this.bottomPositions.map((p) => p.clone().sub(offset))\n }\n\n public get style() {\n return {\n color: this.color,\n lineColor: this.lineColor,\n lineWidth: this.lineWidth,\n opacity: this.opacity,\n occlusionVisibility: this.occlusionVisibility,\n occlusionMode: this.occlusionMode,\n }\n }\n\n public get opacity() {\n return this.prismMesh.opacity\n }\n\n public get occlusionVisibility() {\n return this.prismMesh.occlusionVisibility\n }\n\n public get occlusionMode() {\n return this.prismMesh.occlusionMode\n }\n\n public get localCenter() {\n return this.geometryInfo.center.clone() ?? new THREE.Vector3(9999, 9999, 9999)\n }\n\n public get geometryInfo() {\n if (this.geometryInfoNeedUpdate) {\n this.geometryInfoNeedUpdate = false\n\n const bottomPositions = this.prismMesh.geometry.bottomPositions\n const topPosition = this.prismMesh.geometry.topPosition\n\n if (!bottomPositions || bottomPositions.length < 3 || !topPosition) {\n this._geometryInfoCache = undefined\n return undefined\n }\n\n const triangles = bottomPositions\n .map((_, i) => {\n if (i >= bottomPositions.length - 2) return null\n return [\n new THREE.Vector3().fromArray(bottomPositions[0]),\n new THREE.Vector3().fromArray(bottomPositions[i + 1]),\n new THREE.Vector3().fromArray(bottomPositions[i + 2]),\n ]\n })\n .filter(Boolean)\n\n if (triangles.length === 0) {\n this._geometryInfoCache = undefined\n return undefined\n }\n\n let area = 0\n let bottomCenter = new THREE.Vector3()\n\n for (const [p1, p2, p3] of triangles) {\n const triArea = triangleArea(p1, p2, p3)\n const triCenter = triangleCenter(p1, p2, p3, triArea)\n\n area += triArea\n bottomCenter.add(triCenter)\n }\n\n bottomCenter = bottomCenter.divideScalar(area)\n\n const offset = new THREE.Vector3().fromArray(topPosition).sub(new THREE.Vector3().fromArray(bottomPositions[0]))\n\n const center = bottomCenter.clone().add(offset.divideScalar(2))\n\n this._geometryInfoCache = { center }\n }\n return this._geometryInfoCache\n }\n\n public get worldCenter(): THREE.Vector3 {\n this.updateMatrixWorld()\n return this.localToWorld(this.localCenter)\n }\n\n public get color() {\n return this.prismMesh.color\n }\n\n public get lineWidth() {\n return this.edgeMesh.style.lineWidth\n }\n\n public get lineColor() {\n return this.edgeMesh.color\n }\n\n protected _geometryInfoCache?: { center: THREE.Vector3 }\n\n protected geometryInfoNeedUpdate = true\n\n public edgeMesh: LineMesh = new LineMesh()\n\n public prismMesh: ColoredMesh & { geometry: PrismGeometry } = new ColoredMesh() as ColoredMesh & { geometry: PrismGeometry }\n\n public paramStyle: Partial<PrismStyle>\n\n public constructor(params?: Partial<PrismData & PrismStyle & { five?: Five }>) {\n super()\n\n this.five = (params as any)?.five\n this.prismMesh.name = 'PrismMesh'\n this.prismMesh.geometry = new PrismGeometry()\n\n this.edgeMesh.name = 'EdgeMesh'\n\n this.addIfNotExists(this.prismMesh, this.edgeMesh)\n\n if (params && Object.keys(params).some((key) => key !== 'five')) {\n this.setPoints(params)\n }\n\n this.setStyle(params)\n }\n\n public setStyle(params: Partial<PrismStyle> = {}) {\n this.paramStyle = { ...this.paramStyle, ...params }\n this.prismMesh.setStyle(this.paramStyle)\n this.edgeMesh.setStyle(this.paramStyle)\n }\n\n /**\n * Check if the prism is a box (has 4 bottom positions)\n */\n public isBox(): boolean {\n const bottomPositions = this.prismMesh.geometry.bottomPositions\n return bottomPositions && bottomPositions.length === 4\n }\n\n public setPoints(params: Partial<PrismData>) {\n this.prismMesh.geometry.setPosition({\n bottomPositions: params.points?.map(anyPositionToVector3).map((v) => v.toArray()),\n topPosition: params.heightPoint ? anyPositionToVector3(params.heightPoint).toArray() : undefined,\n })\n this.edgeMesh.geometry = new LineGeometry().fromEdgesGeometry(new THREE.EdgesGeometry(this.prismMesh.geometry))\n this.geometryInfoNeedUpdate = true\n }\n\n public highlight() {\n this.prismMesh.highlight()\n }\n\n public unhighlight() {\n this.prismMesh.unhighlight()\n }\n\n public raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]) {\n this.children.forEach((child) => intersectWithoutLine(child, raycaster, intersects, true))\n return false\n }\n\n /**\n * 设置Five实例\n * @param five Five实例\n */\n public setFive(five: Five): void {\n this.five = five\n }\n\n /**\n * 播放盒子上下动画\n * @param id 盒子项目ID\n * @param color 动画颜色,默认为浅蓝色 (#4DF0FF)\n * @returns Promise,动画完成时解析\n */\n public playBoxAnimation(id: string | number, color: string = '#4DF0FF'): Promise<void> {\n if (!this.five) {\n console.warn('Five instance not available for box animation')\n return Promise.resolve()\n }\n\n // 强制结束任何现有动画\n if (this.activeAnimations.has(id)) {\n this.forceFinishBoxAnimation(id)\n }\n\n return new Promise<void>((resolve) => {\n // 首先隐藏原始网格\n this.prismMesh.visible = false\n this.edgeMesh.visible = false\n\n // 创建或更新动画盒子\n const animatedBoxMesh = this.createOrUpdateAnimatedBoxMesh(color)\n\n const material = animatedBoxMesh.material\n\n const duration = 3000\n let currentTime = 0\n const remove = AnimationFrameLoop.shared.add((_, deltaTime) => {\n currentTime += deltaTime\n let progress = currentTime / duration\n if (progress > 1) {\n progress = 1\n }\n // 简化进度计算,实现往返扫光:0-1过程中,0-0.5是从底到顶,0.5-1是从顶到底\n let _progress = progress\n if (progress <= 0.5) {\n // 前半段:从底到顶 (0 -> 1)\n _progress = progress * 2\n } else {\n // 后半段:从顶到底 (1 -> 0)\n _progress = 2 - progress * 2\n }\n\n material.progressValue.value = _progress\n\n if (progress === 1) {\n remove()\n animatedBoxMesh.visible = false\n this.playEaseInAnimation(id, () => {\n this.activeAnimations.delete(id)\n resolve()\n })\n }\n this.five!.needsRender = true\n })\n\n // 存储动画以便潜在中断\n this.activeAnimations.set(id, { animatedBoxMesh, remove, resolve })\n\n // 显示动画盒子\n animatedBoxMesh.visible = true\n })\n }\n\n /**\n * 强制立即完成所有活动的盒子动画\n * @param id 可选的盒子项目ID。如果未提供,完成所有活动的盒子动画。\n */\n public forceFinishBoxAnimation(id?: string | number): void {\n if (!this.five) {\n console.warn('Five instance not available for finishing box animation')\n return\n }\n\n const targetIds = id ? [id] : Array.from(this.activeAnimations.keys())\n\n targetIds.forEach((targetId) => {\n const animation = this.activeAnimations.get(targetId)\n if (animation) {\n // 移除动画循环\n animation.remove()\n\n // 隐藏动画盒子\n if (this.animatedBoxMesh) {\n this.animatedBoxMesh.visible = false\n }\n\n // 从活动动画中移除\n this.activeAnimations.delete(targetId)\n animation.resolve()\n }\n\n // 同时检查并清除任何淡入动画\n const easeInAnimation = this.activeEaseInAnimations.get(targetId)\n if (easeInAnimation) {\n clearInterval(easeInAnimation.interval)\n this.activeEaseInAnimations.delete(targetId)\n }\n })\n\n this.showBoxFinalState()\n this.five.needsRender = true\n }\n\n /** Release the independently mounted sweep mesh when its owning marker is removed. */\n public disposeAnimation(): void {\n if (this.five) this.forceFinishBoxAnimation()\n this.animatedBoxMesh?.removeFromParent()\n this.animatedBoxMesh?.geometry.dispose()\n this.animatedBoxMesh?.material.dispose()\n this.animatedBoxMesh = undefined\n }\n\n private playEaseInAnimation(id: string | number, callback: () => void) {\n if (!this.five) return\n\n this.prismMesh.visible = true\n this.edgeMesh.visible = true\n let edgeMeshCount = 0\n const originalPrismMeshOpacity = this.prismMesh.style.opacity\n this.prismMesh.setStyle({ opacity: 0 })\n this.edgeMesh.setStyle({ lineOpacity: 0 })\n\n const interval = setInterval(() => {\n if (edgeMeshCount === 61) {\n clearInterval(interval)\n this.activeEaseInAnimations.delete(id)\n this.showBoxFinalState()\n callback()\n }\n this.edgeMesh.setStyle({ lineOpacity: edgeMeshCount / 60 })\n this.prismMesh.setStyle({ opacity: (edgeMeshCount / 60) * originalPrismMeshOpacity })\n this.five!.needsRender = true\n edgeMeshCount++\n }, 16)\n\n // 存储间隔以便潜在中断\n this.activeEaseInAnimations.set(id, { interval, model: this })\n }\n\n /**\n * 创建或更新动画盒子网格\n * @param color 动画颜色\n */\n private createOrUpdateAnimatedBoxMesh(color: string): THREE.Mesh<PrismAnimationGeometry, PrismAnimationMaterial> {\n if (!this.five) {\n throw new Error('Five instance not available')\n }\n\n // 计算边界框\n const min = new THREE.Vector3(Infinity, Infinity, Infinity)\n const max = new THREE.Vector3(-Infinity, -Infinity, -Infinity)\n\n // 获取网格位置\n const bottomPositions = this.bottomPositions\n for (const pos of bottomPositions) {\n min.min(pos)\n max.max(pos)\n }\n\n const topPositions = this.topPositions\n for (const pos of topPositions) {\n min.min(pos)\n max.max(pos)\n }\n\n const size = max.clone().sub(min)\n // 获取原始几何体的局部坐标\n const originalGeometry = this.prismMesh.geometry\n const originalBottomPositions = originalGeometry.bottomPositions\n const originalTopPosition = originalGeometry.topPosition\n\n // 如果已存在动画网格,更新几何体和材质\n if (this.animatedBoxMesh) {\n // 更新矩阵\n this.matrixWorld.decompose(this.animatedBoxMesh.position, this.animatedBoxMesh.quaternion, this.animatedBoxMesh.scale);\n this.animatedBoxMesh.updateMatrixWorld();\n this.animatedBoxMesh.matrixAutoUpdate = false\n return this.animatedBoxMesh\n }\n\n // 创建新的动画几何体\n const animationGeometry = new PrismAnimationGeometry({\n bottomPositions: originalBottomPositions,\n topPosition: originalTopPosition,\n type: 'Concave'\n })\n\n const material = new PrismAnimationMaterial(color)\n animationGeometry.clearGroups()\n this.animatedBoxMesh = new THREE.Mesh(animationGeometry, material)\n this.matrixWorld.decompose(this.animatedBoxMesh.position, this.animatedBoxMesh.quaternion, this.animatedBoxMesh.scale);\n this.animatedBoxMesh.updateMatrixWorld();\n this.animatedBoxMesh.matrixAutoUpdate = false\n\n // 添加动画回调\n this.animatedBoxMesh.onBeforeRender = () => {\n if (!animationGeometry.boundingBox) {\n animationGeometry.computeBoundingBox()\n }\n const minWorld = animationGeometry.boundingBox!.min.clone().applyMatrix4(this.animatedBoxMesh!.matrixWorld)\n const maxWorld = animationGeometry.boundingBox!.max.clone().applyMatrix4(this.animatedBoxMesh!.matrixWorld)\n material.minPosition.value.copy(minWorld)\n material.sizeValue.value.subVectors(maxWorld, minWorld)\n this.five!.needsRender = true\n }\n\n // 添加到场景\n this.five.scene.add(this.animatedBoxMesh)\n\n return this.animatedBoxMesh\n }\n\n /**\n * 显示盒子模型的最终状态(完全可见且不透明度完整)\n */\n private showBoxFinalState(): void {\n this.prismMesh.visible = true\n this.edgeMesh.visible = true\n this.prismMesh.setStyle({ opacity: this.prismMesh.style.opacity })\n this.edgeMesh.setStyle({ lineOpacity: 1 })\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Prism-CJlyAEAU.js","names":["LineMesh","triangleArea","earcut3D","triangleCenter","IObject3D","intersectWithoutLine","LineGeometry","ColoredMesh","LineWithDotsMesh","PolygonMesh","THREE","closeVectors","v","vectors","last","first","PolylineBaseMesh","line","style","params","withDots","points","anyPositionToVector3","nextPoint","index","mesh","point","PolylineMesh","PolylineWithDotsMesh","PolygonWithEdgeMesh","child","raycaster","intersects","convexPolygonVertexIndex","_vectors","i","concavePolygonVertexIndex","PrismGeometry","b","t","bottemIndex","o","topVectors","topIndex","PrismAnimationGeometry","bottomVectors","offset","positions","uvs","indices","groups","indexOffset","nextI","group","minX","maxX","minZ","maxZ","sizeX","sizeZ","vector","u","startIndex","faceIndices","bottom1","bottom2","top2","top1","PrismAnimationMaterial","color","sourceUv","radius","edge","edgeBoost","intensity","normalizedY","sweep","PrismMesh","p","bottomPositions","topPosition","triangles","area","bottomCenter","p1","p2","p3","triArea","triCenter","center","key","five","id","animatedBoxMesh","material","currentTime","remove","AnimationFrameLoop","deltaTime","progress","_progress","resolve","animation","targetId","easeInAnimation","edgeMeshCount","originalPrismMeshOpacity","interval","callback","min","max","pos","topPositions","originalGeometry","originalBottomPositions","originalTopPosition","animationGeometry","minWorld","maxWorld"],"sources":["../../src/shared-utils/three/closeVectors.ts","../../src/Sculpt/Meshes/Polyline.ts","../../src/Sculpt/Meshes/PolygonWithEdge.ts","../../src/shared-utils/three/core/polygonVertex.ts","../../src/shared-utils/three/core/PrismGeometry.ts","../../src/shared-utils/three/core/PrismAnimationGeometry.ts","../../src/Sculpt/Meshes/Prism.ts"],"sourcesContent":["import type * as THREE from 'three/webgpu'\n\nexport default function closeVectors(vectors: THREE.Vector3[]) {\n const v: THREE.Vector3[] = [...vectors]\n if (vectors.length < 3) return vectors\n const last = vectors[vectors.length - 1]\n const first = vectors[0]\n if (!last.equals(first)) v.push(first)\n return v\n}\n","import { anyPositionToVector3, type AnyPositions } from '../../shared-utils/positionToVector3'\nimport { IObject3D } from '../../shared-utils/three/IObject3D'\nimport { notNil } from '../../shared-utils'\nimport { LineWithDotsMesh } from './LineWithDots'\nimport type { LineMeshStyle } from './Line'\nimport type { PointsData } from '../utils/data'\nimport * as THREE from 'three/webgpu'\nimport closeVectors from '../../shared-utils/three/closeVectors'\nimport { removeAllTag } from '../utils/removeAllTag'\n\nexport type PolylineStyle = LineMeshStyle\n\nexport type PolylineData = PointsData\n\nexport abstract class PolylineBaseMesh extends IObject3D {\n public name = 'PolylineBaseMesh'\n\n public get style() {\n return {\n lineColor: this.lineColor,\n lineWidth: this.lineWidth,\n opacity: this.opacity,\n dashed: this.dashed,\n occlusionVisibility: this.occlusionVisibility,\n occlusionMode: this.occlusionMode,\n lengthEnable: this.paramsStyle?.lengthEnable,\n }\n }\n\n public get opacity() {\n return this.lines[0]?.lineOpacity ?? this.paramsStyle?.lineOpacity\n }\n\n public get lineColor() {\n return this.lines[0]?.color ?? (this.paramsStyle?.lineColor ? new THREE.Color(this.paramsStyle.lineColor) : undefined)\n }\n\n public get lineWidth() {\n return this.lines[0]?.lineWidth ?? this.paramsStyle?.lineWidth\n }\n\n public get dashed() {\n return this.lines[0]?.dashed ?? this.paramsStyle?.dashed\n }\n\n public get occlusionVisibility() {\n return this.lines[0]?.occlusionVisibility ?? this.paramsStyle?.occlusionVisibility\n }\n\n public get occlusionMode() {\n return this.lines[0]?.occlusionMode ?? this.paramsStyle?.occlusionMode\n }\n\n public get points() {\n return this.lines\n .map((line) => line.points[0])\n .concat(this.lines?.[this.lines?.length - 1]?.points[1])\n .filter(Boolean)\n }\n public lines: Array<LineWithDotsMesh> = []\n\n private withDots: boolean\n\n private paramsStyle: Partial<PolylineStyle>\n\n public constructor(params?: Partial<PolylineStyle & PolylineData & { withDots: boolean }>) {\n super()\n const { withDots, points, ...style } = params\n this.withDots = withDots ?? true\n if (points) this.setPoints(points)\n if (style) this.setStyle(style)\n }\n\n public setPoints(points: AnyPositions, params = { closed: false }) {\n let vectors = points.map(anyPositionToVector3)\n\n if (params.closed) vectors = closeVectors(vectors)\n\n vectors.forEach((point, index) => {\n const nextPoint = vectors[index + 1]\n if (index !== 0 && nextPoint === undefined) return\n const line =\n this.lines[index] ??\n (() => {\n const mesh = new LineWithDotsMesh({\n ...this.style,\n pointVisibility: this.withDots ? { startPoint: index === 0, endPoint: true } : false,\n })\n this.lines[index] = mesh\n this.add(mesh)\n return mesh\n })()\n\n line.setStyle(this.style)\n line.setPoints([point, nextPoint])\n })\n\n if (vectors.length === 0) {\n this.lines.forEach((line) => line.removeFromParent())\n this.lines = []\n } else if (vectors.length === 1) {\n // 跳过特殊情况:一个点,一条线\n } else {\n if (this.lines.length > vectors.length - 1) {\n this.lines.splice(vectors.length - 1).forEach((line) => line.removeFromParent())\n }\n }\n }\n\n public setStyle(style: Partial<PolylineStyle>) {\n this.paramsStyle = { ...this.paramsStyle, ...style }\n this.lines.forEach((line) => line.setStyle(this.paramsStyle))\n }\n\n public highlight() {\n this.lines.forEach((line) => line.highlight())\n }\n\n public unhighlight() {\n this.lines.forEach((line) => line.unhighlight())\n }\n}\n\nexport class PolylineMesh extends PolylineBaseMesh {\n public name = 'PolylineMesh'\n public constructor(...params: ConstructorParameters<typeof PolylineBaseMesh>) {\n super({ ...params[0], withDots: false })\n }\n}\n\nexport class PolylineWithDotsMesh extends PolylineBaseMesh {\n public name = 'PolylineWithDotsMesh'\n public constructor(...params: ConstructorParameters<typeof PolylineBaseMesh>) {\n super({ ...params[0], withDots: true })\n }\n}\n","import type * as THREE from 'three/webgpu'\nimport type { AnyPositions } from '../../shared-utils/positionToVector3'\nimport { PolylineMesh } from './Polyline'\nimport type { LineStyle } from '../typings/style'\nimport { PolygonMesh, type PolygonData, type PolygonStyle } from './Polygon'\nimport { intersectWithoutLine } from '../../shared-utils/three/core/Raycaster'\n\nexport type PolygonWithEdgeMeshStyle = PolygonStyle & LineStyle\n\n/**\n * @description: 带边线的多边形\n */\nexport class PolygonWithEdgeMesh extends PolygonMesh {\n public name = 'PolygonWithEdgeMesh'\n\n public get style() {\n return {\n ...super.style,\n lineWidth: this.lineWidth,\n lineColor: this.lineColor,\n }\n }\n\n public get lineWidth() {\n return this.line.lineWidth\n }\n\n public get lineColor() {\n return this.line.lineColor\n }\n\n public line: PolylineMesh = new PolylineMesh()\n\n public constructor(params?: Partial<PolygonWithEdgeMeshStyle & PolygonData>) {\n const { points, ...style } = params ?? {}\n super()\n\n if (points) this.setPoints(points)\n if (style) this.setStyle(style)\n }\n\n public raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]) {\n this.children.forEach((child) => {\n intersectWithoutLine(child, raycaster, intersects, true)\n })\n return false\n }\n\n public setPoints(points: AnyPositions, params?: { closed?: boolean; checkLinesIntersect?: boolean }) {\n super.setPoints(points, { closed: true, ...params })\n if (this.points) {\n this.line.setPoints(this.points, { closed: true, ...params })\n this.addIfNotExists(this.line)\n }\n }\n\n public setStyle(style: Partial<PolygonWithEdgeMeshStyle>) {\n super.setStyle(style)\n // 特别处理lineOpacity属性,确保传递给line\n if (style.lineOpacity !== undefined) {\n this.line.setStyle({\n ...style,\n // 强制设置line的lineOpacity\n lineOpacity: style.lineOpacity,\n })\n } else {\n this.line.setStyle(style)\n }\n // 确保更新渲染\n this.needsRender = true\n }\n\n public highlight() {\n super.highlight()\n this.line.highlight()\n }\n\n public unhighlight() {\n super.unhighlight()\n this.line.unhighlight()\n }\n}\n","import * as THREE from 'three/webgpu'\nimport earcut3D from '../earcut3D'\n\n/**\n * @description 凸多边形的顶点\n */\nexport function convexPolygonVertexIndex(_vectors: number[][]) {\n const vectors = [..._vectors]\n const index: number[] = []\n\n // 底面索引\n for (let i = 0; i < vectors.length - 2; i++) {\n index.push(0, i + 1, i + 2)\n }\n\n return index\n}\n\n/**\n * @description 凹多边形的顶点\n */\nexport function concavePolygonVertexIndex(vectors: number[][]) {\n const points = vectors.map((v) => new THREE.Vector3(v[0], v[1], v[2]))\n\n const index = earcut3D(points)\n\n return index\n}\n","import * as THREE from 'three/webgpu'\nimport { concavePolygonVertexIndex, convexPolygonVertexIndex } from './polygonVertex'\n\nexport class PrismGeometry extends THREE.BufferGeometry {\n public bottomPositions: number[][] = []\n public topPosition: number[] = []\n\n private _type: 'Concave' | 'Convex' = 'Concave'\n\n public constructor(params?: { bottomPositions?: number[][]; topPosition?: number[]; type?: 'Concave' | 'Convex' }) {\n super()\n if (params) this.setPosition(params)\n }\n\n /**\n * @description 设置底面和顶面的位置\n * @param params.bottomPositions 底面多边形的有序顶点,顺时针或逆时针均可\n * @param params.topPosition 底面多边形的第一个点对应的顶面的顶点\n * @param params.type 棱柱的类型,凹多边形(Concave)或凸多边形(Convex),默认为凹多边形。如果可以确定是凸多边形,建议设置为凸多边形,性能更好\n */\n public setPosition(params: { bottomPositions?: number[][]; topPosition?: number[]; type?: 'Concave' | 'Convex' }) {\n const b = params.bottomPositions ?? this.bottomPositions\n const t = params.topPosition ?? this.topPosition\n this._type = params.type ?? this._type\n\n this.bottomPositions = b\n this.topPosition = t\n\n if (!b || b.length < 3) {\n console.error('PrismGeometry: Invalid parameters', b, t, params)\n this.bottomPositions = []\n this.setAttribute('position', new THREE.BufferAttribute(new Float32Array([]), 3))\n return\n }\n\n const index: number[] = []\n const vectors: number[][] = []\n\n // 底面顶点\n vectors.push(...b)\n\n // 检查头尾点是否相等,相等则删除\n if (vectors[0][0] === vectors.at(-1)[0] && vectors[0][1] === vectors.at(-1)[1] && vectors[0][2] === vectors.at(-1)[2]) {\n vectors.length -= 1\n }\n\n const bottemIndex = this._type === 'Concave' ? concavePolygonVertexIndex(vectors) : convexPolygonVertexIndex(vectors)\n index.push(...bottemIndex)\n\n if (t && t.length === 3) {\n const o = [t[0] - b[0][0], t[1] - b[0][1], t[2] - b[0][2]] // offset\n\n // 顶面顶点\n const topVectors = vectors.map((v) => [v[0] + o[0], v[1] + o[1], v[2] + o[2]])\n vectors.push(...topVectors)\n\n // 顶面索引\n const topIndex = index.map((i) => i + vectors.length / 2)\n index.push(...topIndex)\n\n // 侧面索引\n for (let i = 0; i < vectors.length / 2 - 1; i++) {\n index.push(i, i + 1, i + vectors.length / 2)\n index.push(i + 1, i + vectors.length / 2 + 1, i + vectors.length / 2)\n }\n\n // 闭合侧面\n index.push(0, vectors.length / 2, vectors.length / 2 - 1)\n index.push(vectors.length / 2, vectors.length - 1, vectors.length / 2 - 1)\n }\n\n this.setAttribute('position', new THREE.Float32BufferAttribute(vectors.flat(), 3))\n this.setIndex(index)\n\n this.computeBoundingSphere()\n }\n}\n","import * as THREE from 'three/webgpu'\nimport { concavePolygonVertexIndex, convexPolygonVertexIndex } from './polygonVertex'\n\nexport class PrismAnimationGeometry extends THREE.BufferGeometry {\n public bottomPositions: number[][] = []\n public topPosition: number[] = []\n public faceCount: number = 0\n\n private _type: 'Concave' | 'Convex' = 'Concave'\n\n public constructor(params?: { bottomPositions?: number[][]; topPosition?: number[]; type?: 'Concave' | 'Convex' }) {\n super()\n if (params) this.setPosition(params)\n }\n\n /**\n * 设置底面和顶面的位置,创建类似BoxGeometry的多面结构\n */\n public setPosition(params: { bottomPositions?: number[][]; topPosition?: number[]; type?: 'Concave' | 'Convex' }) {\n const b = params.bottomPositions ?? this.bottomPositions\n const t = params.topPosition ?? this.topPosition\n this._type = params.type ?? this._type\n\n this.bottomPositions = b\n this.topPosition = t\n\n if (!b || b.length < 3 || !t || t.length !== 3) {\n console.error('PrismAnimationGeometry: Invalid parameters', b, t, params)\n return\n }\n\n // 检查头尾点是否相等,相等则删除\n const bottomVectors = [...b]\n if (bottomVectors[0][0] === bottomVectors.at(-1)[0] && \n bottomVectors[0][1] === bottomVectors.at(-1)[1] && \n bottomVectors[0][2] === bottomVectors.at(-1)[2]) {\n bottomVectors.length -= 1\n }\n\n const offset = [t[0] - b[0][0], t[1] - b[0][1], t[2] - b[0][2]]\n const topVectors = bottomVectors.map(v => [v[0] + offset[0], v[1] + offset[1], v[2] + offset[2]])\n\n // 计算面数:底面 + 顶面 + 侧面数\n this.faceCount = 2 + bottomVectors.length\n\n const positions: number[] = []\n const uvs: number[] = []\n const indices: number[] = []\n const groups: { start: number; count: number; materialIndex: number }[] = []\n\n let indexOffset = 0\n\n // 1. 底面\n this.addBottomFace(bottomVectors, positions, uvs, indices, indexOffset, groups, 0)\n indexOffset += this.getBottomFaceVertexCount(bottomVectors)\n\n // 2. 顶面\n this.addTopFace(topVectors, positions, uvs, indices, indexOffset, groups, 1)\n indexOffset += this.getTopFaceVertexCount(topVectors)\n\n // 3. 侧面\n for (let i = 0; i < bottomVectors.length; i++) {\n const nextI = (i + 1) % bottomVectors.length\n this.addSideFace(\n bottomVectors[i], bottomVectors[nextI], \n topVectors[i], topVectors[nextI],\n positions, uvs, indices, indexOffset, groups, 2 + i\n )\n indexOffset += 4 // 每个侧面4个顶点\n }\n\n this.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3))\n this.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2))\n this.setIndex(indices)\n\n // 设置材质组\n this.clearGroups()\n groups.forEach(group => {\n this.addGroup(group.start, group.count, group.materialIndex)\n })\n\n this.computeBoundingSphere()\n\n console.log('PrismAnimationGeometry UV debug:', {\n totalUVs: uvs.length / 2,\n totalPositions: positions.length / 3,\n faceCount: this.faceCount,\n uvSample: uvs.slice(0, 20)\n })\n }\n\n private addBottomFace(\n vectors: number[][], \n positions: number[], \n uvs: number[], \n indices: number[], \n indexOffset: number,\n groups: { start: number; count: number; materialIndex: number }[],\n materialIndex: number\n ) {\n // 计算底面边界框用于UV映射\n const minX = Math.min(...vectors.map(v => v[0]))\n const maxX = Math.max(...vectors.map(v => v[0]))\n const minZ = Math.min(...vectors.map(v => v[2]))\n const maxZ = Math.max(...vectors.map(v => v[2]))\n const sizeX = maxX - minX || 1\n const sizeZ = maxZ - minZ || 1\n\n // 添加顶点和UV\n for (const vector of vectors) {\n positions.push(vector[0], vector[1], vector[2])\n const u = (vector[0] - minX) / sizeX\n const v = (vector[2] - minZ) / sizeZ\n uvs.push(u, v)\n }\n\n // 添加索引\n const startIndex = indices.length\n const faceIndices = this._type === 'Concave' ? \n concavePolygonVertexIndex(vectors) : \n convexPolygonVertexIndex(vectors)\n \n for (const index of faceIndices) {\n indices.push(index + indexOffset)\n }\n\n groups.push({\n start: startIndex,\n count: indices.length - startIndex,\n materialIndex\n })\n }\n\n private addTopFace(\n vectors: number[][], \n positions: number[], \n uvs: number[], \n indices: number[], \n indexOffset: number,\n groups: { start: number; count: number; materialIndex: number }[],\n materialIndex: number\n ) {\n // 计算顶面边界框用于UV映射\n const minX = Math.min(...vectors.map(v => v[0]))\n const maxX = Math.max(...vectors.map(v => v[0]))\n const minZ = Math.min(...vectors.map(v => v[2]))\n const maxZ = Math.max(...vectors.map(v => v[2]))\n const sizeX = maxX - minX || 1\n const sizeZ = maxZ - minZ || 1\n\n // 添加顶点和UV\n for (const vector of vectors) {\n positions.push(vector[0], vector[1], vector[2])\n const u = (vector[0] - minX) / sizeX\n const v = (vector[2] - minZ) / sizeZ\n uvs.push(u, v)\n }\n\n // 添加索引(顶面需要反向,因为法向量朝上)\n const startIndex = indices.length\n const faceIndices = this._type === 'Concave' ? \n concavePolygonVertexIndex(vectors) : \n convexPolygonVertexIndex(vectors)\n \n // 反向索引以确保正确的法向量\n for (let i = faceIndices.length - 1; i >= 0; i--) {\n indices.push(faceIndices[i] + indexOffset)\n }\n\n groups.push({\n start: startIndex,\n count: indices.length - startIndex,\n materialIndex\n })\n }\n\n private addSideFace(\n bottom1: number[], bottom2: number[],\n top1: number[], top2: number[],\n positions: number[], \n uvs: number[], \n indices: number[], \n indexOffset: number,\n groups: { start: number; count: number; materialIndex: number }[],\n materialIndex: number\n ) {\n // 添加四个顶点:bottom1, bottom2, top2, top1\n positions.push(\n bottom1[0], bottom1[1], bottom1[2], // 0\n bottom2[0], bottom2[1], bottom2[2], // 1\n top2[0], top2[1], top2[2], // 2\n top1[0], top1[1], top1[2] // 3\n )\n\n // 添加UV坐标(每个侧面都是0-1的矩形)\n // 顶点顺序:bottom1, bottom2, top2, top1\n // UV应该从底部到顶部:(0,0) -> (1,0) -> (1,1) -> (0,1)\n uvs.push(\n 0, 0, // bottom1 (左下)\n 1, 0, // bottom2 (右下) \n 1, 1, // top2 (右上)\n 0, 1 // top1 (左上)\n )\n\n // 添加索引(两个三角形组成四边形)\n const startIndex = indices.length\n indices.push(\n indexOffset + 0, indexOffset + 1, indexOffset + 2, // 第一个三角形\n indexOffset + 0, indexOffset + 2, indexOffset + 3 // 第二个三角形\n )\n\n groups.push({\n start: startIndex,\n count: 6, // 两个三角形,6个索引\n materialIndex\n })\n }\n\n private getBottomFaceVertexCount(vectors: number[][]): number {\n return vectors.length\n }\n\n private getTopFaceVertexCount(vectors: number[][]): number {\n return vectors.length\n }\n}","import { IObject3D } from '../../shared-utils/three/IObject3D'\nimport { anyPositionToVector3, type AnyPosition } from '../../shared-utils/positionToVector3'\nimport type { AreaData } from './Area'\nimport * as THREE from 'three/webgpu'\nimport type { LineStyle } from '../typings/style'\nimport type { ColoredMeshStyle } from '../utils/three/ColoredMesh'\nimport { intersectWithoutLine } from '../../shared-utils/three/core/Raycaster'\nimport ColoredMesh from '../utils/three/ColoredMesh'\nimport { PrismGeometry } from '../../shared-utils/three/core/PrismGeometry'\nimport { PrismAnimationGeometry } from '../../shared-utils/three/core/PrismAnimationGeometry'\nimport { triangleArea, triangleCenter } from '../../shared-utils/three/geometryUtil'\nimport { LineMesh } from './Line'\nimport { LineGeometry } from '../../shared-utils/three/core/LineGeometry'\nimport { AnimationFrameLoop, type Five } from '@realsee/five-webgpu'\n\nclass PrismAnimationMaterial extends THREE.MeshBasicNodeMaterial {\n public readonly colorValue = THREE.TSL.uniform(new THREE.Color())\n public readonly sizeValue = THREE.TSL.uniform(new THREE.Vector3(1, 1, 1))\n public readonly minPosition = THREE.TSL.uniform(new THREE.Vector3())\n public readonly progressValue = THREE.TSL.uniform(0.5)\n\n public constructor(color: string) {\n super({ depthTest: false, side: THREE.DoubleSide, transparent: true })\n this.colorValue.value.set(color)\n\n const sourceUv = THREE.TSL.uv()\n const radius = THREE.TSL.length(sourceUv).mul(0.3).add(0.1)\n const edge = sourceUv.x.lessThan(0.003)\n .or(sourceUv.x.greaterThan(0.997))\n .or(sourceUv.y.lessThan(0.003))\n .or(sourceUv.y.greaterThan(0.997))\n const edgeBoost = THREE.TSL.float(1).sub(\n THREE.TSL.min(THREE.TSL.abs(sourceUv.x.sub(0.5)), THREE.TSL.abs(sourceUv.y.sub(0.5))).mul(2),\n )\n const intensity = radius.add(THREE.TSL.select(edge, edgeBoost, 0))\n const normalizedY = THREE.TSL.positionWorld.y.sub(this.minPosition.y).div(this.sizeValue.y)\n const sweep = THREE.TSL.clamp(\n THREE.TSL.float(1).sub(THREE.TSL.abs(normalizedY.sub(this.progressValue)).div(0.3)),\n 0,\n 1,\n ).pow(2)\n\n this.colorNode = this.colorValue\n this.opacityNode = THREE.TSL.clamp(intensity.mul(sweep).mul(1.5), 0, 1)\n this.polygonOffset = true\n this.polygonOffsetFactor = 1\n this.polygonOffsetUnits = 1\n }\n}\n\nexport type PrismStyle = ColoredMeshStyle & LineStyle\n\nexport interface PrismData extends AreaData {\n heightPoint: AnyPosition\n}\n\n/**\n * @description: 多棱柱\n */\nexport class PrismMesh extends IObject3D {\n public name = 'PrismMesh'\n\n private five?: Five\n private animatedBoxMesh?: THREE.Mesh<PrismAnimationGeometry, PrismAnimationMaterial>\n private activeAnimations: Map<string | number, { animatedBoxMesh: THREE.Mesh<PrismAnimationGeometry, PrismAnimationMaterial>; remove: () => void; resolve: () => void }> = new Map()\n private activeEaseInAnimations: Map<string | number, { interval: NodeJS.Timeout; model: PrismMesh }> = new Map()\n\n public get topPosition() {\n return new THREE.Vector3().fromArray(this.prismMesh.geometry.topPosition)\n }\n\n public get bottomPositions() {\n return this.prismMesh.geometry.bottomPositions.map((p) => new THREE.Vector3().fromArray(p))\n }\n\n public get topPositions() {\n const offset = this.bottomPositions[0].clone().sub(this.topPosition)\n return this.bottomPositions.map((p) => p.clone().sub(offset))\n }\n\n public get style() {\n return {\n color: this.color,\n lineColor: this.lineColor,\n lineWidth: this.lineWidth,\n opacity: this.opacity,\n occlusionVisibility: this.occlusionVisibility,\n occlusionMode: this.occlusionMode,\n }\n }\n\n public get opacity() {\n return this.prismMesh.opacity\n }\n\n public get occlusionVisibility() {\n return this.prismMesh.occlusionVisibility\n }\n\n public get occlusionMode() {\n return this.prismMesh.occlusionMode\n }\n\n public get localCenter() {\n return this.geometryInfo.center.clone() ?? new THREE.Vector3(9999, 9999, 9999)\n }\n\n public get geometryInfo() {\n if (this.geometryInfoNeedUpdate) {\n this.geometryInfoNeedUpdate = false\n\n const bottomPositions = this.prismMesh.geometry.bottomPositions\n const topPosition = this.prismMesh.geometry.topPosition\n\n if (!bottomPositions || bottomPositions.length < 3 || !topPosition) {\n this._geometryInfoCache = undefined\n return undefined\n }\n\n const triangles = bottomPositions\n .map((_, i) => {\n if (i >= bottomPositions.length - 2) return null\n return [\n new THREE.Vector3().fromArray(bottomPositions[0]),\n new THREE.Vector3().fromArray(bottomPositions[i + 1]),\n new THREE.Vector3().fromArray(bottomPositions[i + 2]),\n ]\n })\n .filter(Boolean)\n\n if (triangles.length === 0) {\n this._geometryInfoCache = undefined\n return undefined\n }\n\n let area = 0\n let bottomCenter = new THREE.Vector3()\n\n for (const [p1, p2, p3] of triangles) {\n const triArea = triangleArea(p1, p2, p3)\n const triCenter = triangleCenter(p1, p2, p3, triArea)\n\n area += triArea\n bottomCenter.add(triCenter)\n }\n\n bottomCenter = bottomCenter.divideScalar(area)\n\n const offset = new THREE.Vector3().fromArray(topPosition).sub(new THREE.Vector3().fromArray(bottomPositions[0]))\n\n const center = bottomCenter.clone().add(offset.divideScalar(2))\n\n this._geometryInfoCache = { center }\n }\n return this._geometryInfoCache\n }\n\n public get worldCenter(): THREE.Vector3 {\n this.updateMatrixWorld()\n return this.localToWorld(this.localCenter)\n }\n\n public get color() {\n return this.prismMesh.color\n }\n\n public get lineWidth() {\n return this.edgeMesh.style.lineWidth\n }\n\n public get lineColor() {\n return this.edgeMesh.color\n }\n\n protected _geometryInfoCache?: { center: THREE.Vector3 }\n\n protected geometryInfoNeedUpdate = true\n\n public edgeMesh: LineMesh = new LineMesh()\n\n public prismMesh: ColoredMesh & { geometry: PrismGeometry } = new ColoredMesh() as ColoredMesh & { geometry: PrismGeometry }\n\n public paramStyle: Partial<PrismStyle>\n\n public constructor(params?: Partial<PrismData & PrismStyle & { five?: Five }>) {\n super()\n\n this.five = (params as any)?.five\n this.prismMesh.name = 'PrismMesh'\n this.prismMesh.geometry = new PrismGeometry()\n\n this.edgeMesh.name = 'EdgeMesh'\n\n this.addIfNotExists(this.prismMesh, this.edgeMesh)\n\n if (params && Object.keys(params).some((key) => key !== 'five')) {\n this.setPoints(params)\n }\n\n this.setStyle(params)\n }\n\n public setStyle(params: Partial<PrismStyle> = {}) {\n this.paramStyle = { ...this.paramStyle, ...params }\n this.prismMesh.setStyle(this.paramStyle)\n this.edgeMesh.setStyle(this.paramStyle)\n }\n\n /**\n * Check if the prism is a box (has 4 bottom positions)\n */\n public isBox(): boolean {\n const bottomPositions = this.prismMesh.geometry.bottomPositions\n return bottomPositions && bottomPositions.length === 4\n }\n\n public setPoints(params: Partial<PrismData>) {\n this.prismMesh.geometry.setPosition({\n bottomPositions: params.points?.map(anyPositionToVector3).map((v) => v.toArray()),\n topPosition: params.heightPoint ? anyPositionToVector3(params.heightPoint).toArray() : undefined,\n })\n this.edgeMesh.geometry = new LineGeometry().fromEdgesGeometry(new THREE.EdgesGeometry(this.prismMesh.geometry))\n this.geometryInfoNeedUpdate = true\n }\n\n public highlight() {\n this.prismMesh.highlight()\n }\n\n public unhighlight() {\n this.prismMesh.unhighlight()\n }\n\n public raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]) {\n this.children.forEach((child) => intersectWithoutLine(child, raycaster, intersects, true))\n return false\n }\n\n /**\n * 设置Five实例\n * @param five Five实例\n */\n public setFive(five: Five): void {\n this.five = five\n }\n\n /**\n * 播放盒子上下动画\n * @param id 盒子项目ID\n * @param color 动画颜色,默认为浅蓝色 (#4DF0FF)\n * @returns Promise,动画完成时解析\n */\n public playBoxAnimation(id: string | number, color: string = '#4DF0FF'): Promise<void> {\n if (!this.five) {\n console.warn('Five instance not available for box animation')\n return Promise.resolve()\n }\n\n // 强制结束任何现有动画\n if (this.activeAnimations.has(id)) {\n this.forceFinishBoxAnimation(id)\n }\n\n return new Promise<void>((resolve) => {\n // 首先隐藏原始网格\n this.prismMesh.visible = false\n this.edgeMesh.visible = false\n\n // 创建或更新动画盒子\n const animatedBoxMesh = this.createOrUpdateAnimatedBoxMesh(color)\n\n const material = animatedBoxMesh.material\n\n const duration = 3000\n let currentTime = 0\n const remove = AnimationFrameLoop.shared.add((_, deltaTime) => {\n currentTime += deltaTime\n let progress = currentTime / duration\n if (progress > 1) {\n progress = 1\n }\n // 简化进度计算,实现往返扫光:0-1过程中,0-0.5是从底到顶,0.5-1是从顶到底\n let _progress = progress\n if (progress <= 0.5) {\n // 前半段:从底到顶 (0 -> 1)\n _progress = progress * 2\n } else {\n // 后半段:从顶到底 (1 -> 0)\n _progress = 2 - progress * 2\n }\n\n material.progressValue.value = _progress\n\n if (progress === 1) {\n remove()\n animatedBoxMesh.visible = false\n this.playEaseInAnimation(id, () => {\n this.activeAnimations.delete(id)\n resolve()\n })\n }\n this.five!.needsRender = true\n })\n\n // 存储动画以便潜在中断\n this.activeAnimations.set(id, { animatedBoxMesh, remove, resolve })\n\n // 显示动画盒子\n animatedBoxMesh.visible = true\n })\n }\n\n /**\n * 强制立即完成所有活动的盒子动画\n * @param id 可选的盒子项目ID。如果未提供,完成所有活动的盒子动画。\n */\n public forceFinishBoxAnimation(id?: string | number): void {\n if (!this.five) {\n console.warn('Five instance not available for finishing box animation')\n return\n }\n\n const targetIds = id ? [id] : Array.from(this.activeAnimations.keys())\n\n targetIds.forEach((targetId) => {\n const animation = this.activeAnimations.get(targetId)\n if (animation) {\n // 移除动画循环\n animation.remove()\n\n // 隐藏动画盒子\n if (this.animatedBoxMesh) {\n this.animatedBoxMesh.visible = false\n }\n\n // 从活动动画中移除\n this.activeAnimations.delete(targetId)\n animation.resolve()\n }\n\n // 同时检查并清除任何淡入动画\n const easeInAnimation = this.activeEaseInAnimations.get(targetId)\n if (easeInAnimation) {\n clearInterval(easeInAnimation.interval)\n this.activeEaseInAnimations.delete(targetId)\n }\n })\n\n this.showBoxFinalState()\n this.five.needsRender = true\n }\n\n /** Release the independently mounted sweep mesh when its owning marker is removed. */\n public disposeAnimation(): void {\n if (this.five) this.forceFinishBoxAnimation()\n this.animatedBoxMesh?.removeFromParent()\n this.animatedBoxMesh?.geometry.dispose()\n this.animatedBoxMesh?.material.dispose()\n this.animatedBoxMesh = undefined\n }\n\n private playEaseInAnimation(id: string | number, callback: () => void) {\n if (!this.five) return\n\n this.prismMesh.visible = true\n this.edgeMesh.visible = true\n let edgeMeshCount = 0\n const originalPrismMeshOpacity = this.prismMesh.style.opacity\n this.prismMesh.setStyle({ opacity: 0 })\n this.edgeMesh.setStyle({ lineOpacity: 0 })\n\n const interval = setInterval(() => {\n if (edgeMeshCount === 61) {\n clearInterval(interval)\n this.activeEaseInAnimations.delete(id)\n this.showBoxFinalState()\n callback()\n }\n this.edgeMesh.setStyle({ lineOpacity: edgeMeshCount / 60 })\n this.prismMesh.setStyle({ opacity: (edgeMeshCount / 60) * originalPrismMeshOpacity })\n this.five!.needsRender = true\n edgeMeshCount++\n }, 16)\n\n // 存储间隔以便潜在中断\n this.activeEaseInAnimations.set(id, { interval, model: this })\n }\n\n /**\n * 创建或更新动画盒子网格\n * @param color 动画颜色\n */\n private createOrUpdateAnimatedBoxMesh(color: string): THREE.Mesh<PrismAnimationGeometry, PrismAnimationMaterial> {\n if (!this.five) {\n throw new Error('Five instance not available')\n }\n\n // 计算边界框\n const min = new THREE.Vector3(Infinity, Infinity, Infinity)\n const max = new THREE.Vector3(-Infinity, -Infinity, -Infinity)\n\n // 获取网格位置\n const bottomPositions = this.bottomPositions\n for (const pos of bottomPositions) {\n min.min(pos)\n max.max(pos)\n }\n\n const topPositions = this.topPositions\n for (const pos of topPositions) {\n min.min(pos)\n max.max(pos)\n }\n\n const size = max.clone().sub(min)\n // 获取原始几何体的局部坐标\n const originalGeometry = this.prismMesh.geometry\n const originalBottomPositions = originalGeometry.bottomPositions\n const originalTopPosition = originalGeometry.topPosition\n\n // 如果已存在动画网格,更新几何体和材质\n if (this.animatedBoxMesh) {\n // 更新矩阵\n this.matrixWorld.decompose(this.animatedBoxMesh.position, this.animatedBoxMesh.quaternion, this.animatedBoxMesh.scale);\n this.animatedBoxMesh.updateMatrixWorld();\n this.animatedBoxMesh.matrixAutoUpdate = false\n return this.animatedBoxMesh\n }\n\n // 创建新的动画几何体\n const animationGeometry = new PrismAnimationGeometry({\n bottomPositions: originalBottomPositions,\n topPosition: originalTopPosition,\n type: 'Concave'\n })\n\n const material = new PrismAnimationMaterial(color)\n animationGeometry.clearGroups()\n this.animatedBoxMesh = new THREE.Mesh(animationGeometry, material)\n this.matrixWorld.decompose(this.animatedBoxMesh.position, this.animatedBoxMesh.quaternion, this.animatedBoxMesh.scale);\n this.animatedBoxMesh.updateMatrixWorld();\n this.animatedBoxMesh.matrixAutoUpdate = false\n\n // 添加动画回调\n this.animatedBoxMesh.onBeforeRender = () => {\n if (!animationGeometry.boundingBox) {\n animationGeometry.computeBoundingBox()\n }\n const minWorld = animationGeometry.boundingBox!.min.clone().applyMatrix4(this.animatedBoxMesh!.matrixWorld)\n const maxWorld = animationGeometry.boundingBox!.max.clone().applyMatrix4(this.animatedBoxMesh!.matrixWorld)\n material.minPosition.value.copy(minWorld)\n material.sizeValue.value.subVectors(maxWorld, minWorld)\n this.five!.needsRender = true\n }\n\n // 添加到场景\n this.five.scene.add(this.animatedBoxMesh)\n\n return this.animatedBoxMesh\n }\n\n /**\n * 显示盒子模型的最终状态(完全可见且不透明度完整)\n */\n private showBoxFinalState(): void {\n this.prismMesh.visible = true\n this.edgeMesh.visible = true\n this.prismMesh.setStyle({ opacity: this.prismMesh.style.opacity })\n this.edgeMesh.setStyle({ lineOpacity: 1 })\n }\n}\n"],"mappings":"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"}
|