@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.
Files changed (147) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/floorplan.js +1 -1
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js +270 -35
  5. package/dist/index.js.map +1 -0
  6. package/dist/internal/{BasePlugin-CT5K8m36.js → BasePlugin-DC5m72La.js} +3 -3
  7. package/dist/internal/{BasePlugin-CT5K8m36.js.map → BasePlugin-DC5m72La.js.map} +1 -1
  8. package/dist/internal/BasePluginWithData-D_0W46_q.js +7 -0
  9. package/dist/internal/{BasePluginWithData-9z4tpAT4.js.map → BasePluginWithData-D_0W46_q.js.map} +1 -1
  10. package/dist/internal/{BetterTween-BX0aTvP1.js → BetterTween-DmptqE8m.js} +2 -2
  11. package/dist/internal/{BetterTween-BX0aTvP1.js.map → BetterTween-DmptqE8m.js.map} +1 -1
  12. package/dist/internal/{CSS3DRenderPlugin-ccSpcvwd.js → CSS3DRenderPlugin-CEatgl0m.js} +3 -3
  13. package/dist/internal/CSS3DRenderPlugin-CEatgl0m.js.map +1 -0
  14. package/dist/internal/{Controller-Csut_kcH.js → Controller-D6o4OGWJ.js} +8 -8
  15. package/dist/internal/{Controller-Csut_kcH.js.map → Controller-D6o4OGWJ.js.map} +1 -1
  16. package/dist/internal/{FiveDomEvents-3H9NvDOz.js → FiveDomEvents-BUBLFzti.js} +2 -2
  17. package/dist/internal/{FiveDomEvents-3H9NvDOz.js.map → FiveDomEvents-BUBLFzti.js.map} +1 -1
  18. package/dist/internal/FivePuppet-C6QmVY70.js +67 -0
  19. package/dist/internal/FivePuppet-C6QmVY70.js.map +1 -0
  20. package/dist/internal/{PointHelper-D565h9b_.js → PointHelper-DIhgdjY2.js} +48 -48
  21. package/dist/internal/{PointHelper-D565h9b_.js.map → PointHelper-DIhgdjY2.js.map} +1 -1
  22. package/dist/internal/{Polygon-CBGvYUfJ.js → Polygon-D3xIL1Pl.js} +30 -30
  23. package/dist/internal/{Polygon-CBGvYUfJ.js.map → Polygon-D3xIL1Pl.js.map} +1 -1
  24. package/dist/internal/{Prism-Dm5ESkgg.js → Prism-CJlyAEAU.js} +13 -13
  25. package/dist/internal/{Prism-Dm5ESkgg.js.map → Prism-CJlyAEAU.js.map} +1 -1
  26. package/dist/internal/{Rectangle-D-zkDycu.js → Rectangle-BpL9lNKU.js} +118 -129
  27. package/dist/internal/Rectangle-BpL9lNKU.js.map +1 -0
  28. package/dist/internal/{Work-DF8j5GnL.js → Work-BE4AgdwH.js} +9 -9
  29. package/dist/internal/{Work-DF8j5GnL.js.map → Work-BE4AgdwH.js.map} +1 -1
  30. package/dist/internal/{animationFrame-XGKHIeQK.js → animationFrame-CacKXN8l.js} +14 -3
  31. package/dist/internal/animationFrame-CacKXN8l.js.map +1 -0
  32. package/dist/internal/{area-maker-Bd9l2pIp.js → area-maker-Bnhx4SkH.js} +4 -4
  33. package/dist/internal/{area-maker-Bd9l2pIp.js.map → area-maker-Bnhx4SkH.js.map} +1 -1
  34. package/dist/internal/{boundingBox-DvCor5Hd.js → boundingBox-CIqXgNXW.js} +2 -2
  35. package/dist/internal/{boundingBox-DvCor5Hd.js.map → boundingBox-CIqXgNXW.js.map} +1 -1
  36. package/dist/internal/{camera-movement-CwI7UqUk.js → camera-movement-C1pwfMk_.js} +2 -2
  37. package/dist/internal/camera-movement-C1pwfMk_.js.map +1 -0
  38. package/dist/internal/{changeMode-BVGYCoqu.js → changeMode-D_I2AOjH.js} +2 -2
  39. package/dist/internal/{changeMode-BVGYCoqu.js.map → changeMode-D_I2AOjH.js.map} +1 -1
  40. package/dist/internal/{controller-BWkZT0l1.js → controller-DIDtFrBE.js} +1991 -2050
  41. package/dist/internal/controller-DIDtFrBE.js.map +1 -0
  42. package/dist/internal/{cruise-C3F0eNQ-.js → cruise-B50Tcq66.js} +2 -2
  43. package/dist/internal/{cruise-C3F0eNQ-.js.map → cruise-B50Tcq66.js.map} +1 -1
  44. package/dist/internal/{current-pano-image-DKUWluR-.js → current-pano-image-BCFr6njt.js} +4 -4
  45. package/dist/internal/{current-pano-image-DKUWluR-.js.map → current-pano-image-BCFr6njt.js.map} +1 -1
  46. package/dist/internal/{defaultUrls-CjKkS9k9.js → defaultUrls-CfMtGzqM.js} +14 -3
  47. package/dist/internal/defaultUrls-CfMtGzqM.js.map +1 -0
  48. package/dist/internal/{fire-scene-CczaBz2_.js → fire-scene-BzZGvyh_.js} +9 -4
  49. package/dist/internal/fire-scene-BzZGvyh_.js.map +1 -0
  50. package/dist/internal/{fiveModelLoad-mg-TnpnM.js → fiveModelLoad-BUIBYxzp.js} +2 -2
  51. package/dist/internal/{fiveModelLoad-mg-TnpnM.js.map → fiveModelLoad-BUIBYxzp.js.map} +1 -1
  52. package/dist/internal/{floorplan-KWlIsTvO.js → floorplan-C8BGw87S.js} +5 -5
  53. package/dist/internal/{floorplan-KWlIsTvO.js.map → floorplan-C8BGw87S.js.map} +1 -1
  54. package/dist/internal/{generatePolygonGeometry-B_5JFq8y.js → generatePolygonGeometry-BOnzdCaG.js} +181 -178
  55. package/dist/internal/generatePolygonGeometry-BOnzdCaG.js.map +1 -0
  56. package/dist/internal/{lookObject-wesf8xt6.js → lookObject-DuRab5wf.js} +2 -2
  57. package/dist/internal/{lookObject-wesf8xt6.js.map → lookObject-DuRab5wf.js.map} +1 -1
  58. package/dist/internal/{measure-BX6boAC7.js → measure-B4jFwdQ6.js} +5 -5
  59. package/dist/internal/{measure-BX6boAC7.js.map → measure-B4jFwdQ6.js.map} +1 -1
  60. package/dist/internal/{model-chassis-compass-InVNmOAQ.js → model-chassis-compass-C6NTVMLo.js} +2 -2
  61. package/dist/internal/{model-chassis-compass-InVNmOAQ.js.map → model-chassis-compass-C6NTVMLo.js.map} +1 -1
  62. package/dist/internal/{model-entry-door-guide-wZbyY77a.js → model-entry-door-guide-DnGTLY2s.js} +2 -2
  63. package/dist/internal/{model-entry-door-guide-wZbyY77a.js.map → model-entry-door-guide-DnGTLY2s.js.map} +1 -1
  64. package/dist/internal/{model-maker-uO8xlTuO.js → model-maker-B1mnDdKY.js} +15 -15
  65. package/dist/internal/{model-maker-uO8xlTuO.js.map → model-maker-B1mnDdKY.js.map} +1 -1
  66. package/dist/internal/{model-tv-video-DzXb2JRf.js → model-tv-video-BP-7HoDC.js} +2 -2
  67. package/dist/internal/{model-tv-video-DzXb2JRf.js.map → model-tv-video-BP-7HoDC.js.map} +1 -1
  68. package/dist/internal/{model-view-CBeeMM98.js → model-view-BWUU0-uq.js} +2 -2
  69. package/dist/internal/{model-view-CBeeMM98.js.map → model-view-BWUU0-uq.js.map} +1 -1
  70. package/dist/internal/object3d-helper-CbRRhnLV.js +7 -0
  71. package/dist/internal/{object3d-helper-DDYsVPN6.js.map → object3d-helper-CbRRhnLV.js.map} +1 -1
  72. package/dist/internal/{pano-compass-jSr629BP.js → pano-compass-BRTM0dCc.js} +7 -7
  73. package/dist/internal/{pano-compass-jSr629BP.js.map → pano-compass-BRTM0dCc.js.map} +1 -1
  74. package/dist/internal/{pano-door-label-DKoYIKLa.js → pano-door-label-BLjYGZrr.js} +3 -3
  75. package/dist/internal/{pano-door-label-DKoYIKLa.js.map → pano-door-label-BLjYGZrr.js.map} +1 -1
  76. package/dist/internal/{pano-measure-DW9mdx1O.js → pano-measure-BIgCWkVJ.js} +14 -14
  77. package/dist/internal/{pano-measure-DW9mdx1O.js.map → pano-measure-BIgCWkVJ.js.map} +1 -1
  78. package/dist/internal/{pano-ruler-pro-D7q0Ob21.js → pano-ruler-pro-D9yTbHJz.js} +2 -2
  79. package/dist/internal/{pano-ruler-pro-D7q0Ob21.js.map → pano-ruler-pro-D9yTbHJz.js.map} +1 -1
  80. package/dist/internal/{pano-spatial-tag-D0qn-__S.js → pano-spatial-tag-B7Gxn3BS.js} +3 -3
  81. package/dist/internal/{pano-spatial-tag-D0qn-__S.js.map → pano-spatial-tag-B7Gxn3BS.js.map} +1 -1
  82. package/dist/internal/{pano-tag-BW5MXXws.js → pano-tag-Bchz-jED.js} +2 -2
  83. package/dist/internal/{pano-tag-BW5MXXws.js.map → pano-tag-Bchz-jED.js.map} +1 -1
  84. package/dist/internal/{pano-video-Bmud_CAn.js → pano-video-BufYQMqo.js} +3 -3
  85. package/dist/internal/{pano-video-Bmud_CAn.js.map → pano-video-BufYQMqo.js.map} +1 -1
  86. package/dist/internal/{pipeline-DDqgb1gw.js → pipeline-t_3IMXKB.js} +4 -4
  87. package/dist/internal/{pipeline-DDqgb1gw.js.map → pipeline-t_3IMXKB.js.map} +1 -1
  88. package/dist/internal/{sculpt-BNkLJR6p.js → sculpt-BCK4PMwL.js} +64 -63
  89. package/dist/internal/{sculpt-BNkLJR6p.js.map → sculpt-BCK4PMwL.js.map} +1 -1
  90. package/dist/internal/tagPosition-DA9YguT8.js +176 -0
  91. package/dist/internal/tagPosition-DA9YguT8.js.map +1 -0
  92. package/dist/internal/withResolvers-DVr4bnnk.js +15 -0
  93. package/dist/internal/withResolvers-DVr4bnnk.js.map +1 -0
  94. package/dist/plugins/area-maker.js +1 -1
  95. package/dist/plugins/camera-movement.js +1 -1
  96. package/dist/plugins/cruise.js +2 -2
  97. package/dist/plugins/css3d-render.js +1 -1
  98. package/dist/plugins/current-pano-image.js +1 -1
  99. package/dist/plugins/digital-performance.d.ts +1 -1
  100. package/dist/plugins/digital-performance.js +1 -1
  101. package/dist/plugins/fire-scene.d.ts +1 -1
  102. package/dist/plugins/fire-scene.js +1 -1
  103. package/dist/plugins/guide-line.js +1 -1
  104. package/dist/plugins/measure.js +1 -1
  105. package/dist/plugins/model-chassis-compass.js +1 -1
  106. package/dist/plugins/model-entry-door-guide.js +1 -1
  107. package/dist/plugins/model-maker.d.ts +1 -1
  108. package/dist/plugins/model-maker.js +1 -1
  109. package/dist/plugins/model-tv-video.js +1 -1
  110. package/dist/plugins/model-view.js +1 -1
  111. package/dist/plugins/object3d-helper.d.ts +1 -1
  112. package/dist/plugins/object3d-helper.js +3 -1
  113. package/dist/plugins/pano-compass.js +1 -1
  114. package/dist/plugins/pano-door-label.js +1 -1
  115. package/dist/plugins/pano-measure.js +1 -1
  116. package/dist/plugins/pano-ruler-pro.js +1 -1
  117. package/dist/plugins/pano-spatial-tag.js +1 -1
  118. package/dist/plugins/pano-tag.d.ts +1 -1
  119. package/dist/plugins/pano-tag.js +4 -1
  120. package/dist/plugins/pano-video.js +1 -1
  121. package/dist/plugins/pipeline.js +1 -1
  122. package/dist/plugins/sculpt.d.ts +1 -1
  123. package/dist/plugins/sculpt.js +7 -1
  124. package/dist/types/public/index.d.ts +2 -0
  125. package/dist/types/public/plugins/digital-performance.d.ts +1 -0
  126. package/dist/types/public/plugins/fire-scene.d.ts +1 -0
  127. package/dist/types/public/plugins/model-maker.d.ts +1 -0
  128. package/dist/types/public/plugins/object3d-helper.d.ts +1 -0
  129. package/dist/types/public/plugins/pano-tag.d.ts +2 -0
  130. package/dist/types/public/plugins/sculpt.d.ts +8 -0
  131. package/dist/types/public/utils.d.ts +5 -0
  132. package/dist/utils.d.ts +1 -1
  133. package/dist/utils.js +16 -50
  134. package/package.json +1 -1
  135. package/dist/internal/BasePluginWithData-9z4tpAT4.js +0 -7
  136. package/dist/internal/CSS3DRenderPlugin-ccSpcvwd.js.map +0 -1
  137. package/dist/internal/Rectangle-D-zkDycu.js.map +0 -1
  138. package/dist/internal/animationFrame-XGKHIeQK.js.map +0 -1
  139. package/dist/internal/blink-DD_0mH-m.js +0 -113
  140. package/dist/internal/blink-DD_0mH-m.js.map +0 -1
  141. package/dist/internal/camera-movement-CwI7UqUk.js.map +0 -1
  142. package/dist/internal/controller-BWkZT0l1.js.map +0 -1
  143. package/dist/internal/defaultUrls-CjKkS9k9.js.map +0 -1
  144. package/dist/internal/fire-scene-CczaBz2_.js.map +0 -1
  145. package/dist/internal/generatePolygonGeometry-B_5JFq8y.js.map +0 -1
  146. package/dist/internal/object3d-helper-DDYsVPN6.js +0 -7
  147. package/dist/utils.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rectangle-BpL9lNKU.js","names":["Subscribe","getIntersectByRaycaster","PointSelector","bindFiveOwner","LightTag","LineMesh","worldToLocal","localToWorld","anyPositionToVector3","centerPoint","IObject3D","getNormal","notNil","FiveDomEvents","rayOnLine","Cursor","Object3DHelperController","withResolvers","PointMesh","PolygonMesh","PolylineWithDotsMesh","PolygonWithEdgeMesh","PolylineMesh","PrismMesh","THREE","SculptModules","five","config","magnifierConfig","helperConfig","objectModules","bindObjectModules","object","modules","getObjectModules","removeAllTag","removeTag","child","line","obj","tag","point","selectedObjectsMap","BaseObject","data","event","callback","args","mesh","material","selectedObjects","params","selected","index","fromObject","BaseEditor","originObject","BaseEditorWithObjectHelper","objectHelperConfig","helper","direction","isHandleEnd","RectangleMeshEditor","rectangleMesh","points","leftCenter","rightCenter","topCenter","bottomCenter","scalePosition","offset","intersectPoint","basePosition","buildFromOpposite","b","baseIndex","o","a","c","base","dragged","vBA0","vBC0","wLen0","hLen0","p","eBA","eBC","vDragged","alpha","beta","newA","newC","newO","newPts","id","RectangleGeometry","RectangleMesh","vectors","v1","v2","v3","v4","RectangleWithEdgeMesh","style","sortPositionsByCameraPosition","normal","sourcePositions","centerPosition","centerToCamera","cameraPosition","LineEditorAbstract","pointMesh","dragMesh","LineEditor","intersects","vector3ToArray","vector3","v","AreaMesh","PolygonEditor","distance","areaMesh","lineColor","areaColor","pointColor","lineOpacity","newPoints","sync","currentMeshes","options","dragSelectPixelDistance","pointOpacity","isIntersecting","lines","line2","i","p1","line1","q1","p2","q2","equals","areLinesIntersecting3D","isLinesIntersecting","isPolygenIntersecting","dirVec1","line1End","line1Start","dirVec2","line2End","line2Start","rows","j","A","detA","determinant","t","matrixVectorMultiply","inverseMatrix","isInSegmentRange","det","matrix","vector","value","Polygon","snapshot","createPolygon","container","limit","simpleMode","pointSelector","autoClosePixelDistance","maxY","previewLine","verticalLine","pointMeshes","syncCreationPointMeshes","sourcePoints","idx","updatePointMeshes","pt","clearPointMeshes","previewPoint","planeHelper","closed","lastIntersection","undoStack","canUndo","canRedo","undo","onPreview","redo","onSelect","intersection","rejectedPoint","selectEnd","resolve","clearPreview","lastPoint","startPoint","shouldClose","fiveElement","width","height","toScreen","ndc","sp","pp","ip","dist1","dist2","cancel","reject","promise","BoxMeshEditor","boxMesh","bottomPosition","topPosition","yOffset","xOffset","zOffset","center","frontCenter","backCenter","bottomPositions","topPositions","heightOffset","newBottomPositions","offsetToTop","offsetToRight","offsetToLeft","offsetToBack","offsetToFront","BoxMesh","Box","createBox","bottom","top","faces","buildFace","vertices","ni","bottomRectangle","createRectangle","lineHelper","lineCenterPoint","endPoint","pointOnLineHelper","Rectangle","createRectangleByDiagonal","createRectangleByVertex","getAllSculptPoints","_p","tempLine","normalIfNeed","plane","pointOnLine","rectangleLine","pointOnPlane","radius","sortedPoints","lineIsVertical","lineDirection"],"sources":["../../src/Sculpt/utils/Modules/Global.ts","../../src/Sculpt/utils/removeAllTag.ts","../../src/Sculpt/Objects/Base/index.ts","../../src/Sculpt/Objects/Base/Editor.ts","../../src/Sculpt/Editors/RectangleMeshEditor.ts","../../src/Sculpt/utils/three/RectangleGeometry.ts","../../src/Sculpt/Meshes/Rectangle.ts","../../src/Sculpt/Meshes/RectangleWithEdge.ts","../../src/Sculpt/utils/sortPositionsByCameraPosition.ts","../../src/Sculpt/Objects/Line/Editor.ts","../../src/shared-utils/three/vector3ToArray.ts","../../src/Sculpt/Meshes/Area.ts","../../src/Sculpt/Objects/Polygon/Editor.ts","../../src/Sculpt/utils/isIntersecting.ts","../../src/Sculpt/Objects/Polygon/index.ts","../../src/Sculpt/Editors/BoxMeshEditor.ts","../../src/Sculpt/Meshes/Box.ts","../../src/Sculpt/Objects/Box/index.ts","../../src/Sculpt/Objects/Rectangle/index.ts"],"sourcesContent":["import { bindFiveOwner } from '../../../shared-utils/five/getFiveFromParentChain'\nimport type { Object3D } from 'three/webgpu'\nimport type { Five } from '@realsee/five-webgpu'\nimport { Cursor } from './Cursor'\nimport { Object3DHelperController } from '../../../Object3DHelperPlugin'\nimport { FiveDomEvents } from '../../../shared-utils/five/FiveDomEvents'\nimport { PointSelector } from '../../../shared-utils/three/PointSelector'\nimport type { SculptConfig } from '../..'\n\nexport class SculptModules {\n public constructor(public readonly five: Five, public readonly config?: SculptConfig) {}\n\n public _cursor?: Cursor\n public _pointSelector?: PointSelector\n public _fiveDomEvents?: FiveDomEvents\n public _object3DHelper?: Object3DHelperController\n\n public get cursor() {\n if (this._cursor) return this._cursor\n this._cursor = new Cursor(this.five.getElement())\n return this._cursor\n }\n\n public get pointSelector() {\n if (this._pointSelector) return this._pointSelector\n\n // 根据配置决定是否启用放大镜\n const magnifierConfig = this.config?.magnifier\n let helperConfig: any =\n magnifierConfig === null || magnifierConfig === false ? { magnifier: null } : { magnifierParams: magnifierConfig }\n\n // 根据配置决定是否隐藏圆圈效果\n if (this.config?.hideCursorCircle) {\n helperConfig = { ...helperConfig, pointHelper: null }\n }\n\n this._pointSelector = new PointSelector(this.five, {\n mode: 'cursor',\n helper: helperConfig,\n hitFilter: this.config?.hitFilter,\n })\n return this._pointSelector\n }\n\n public get fiveDomEvents() {\n if (this._fiveDomEvents) return this._fiveDomEvents\n this._fiveDomEvents = new FiveDomEvents(this.five, { noEmitWhenNotInScene: true })\n return this._fiveDomEvents\n }\n\n public get object3DHelper() {\n if (this._object3DHelper) return this._object3DHelper\n this._object3DHelper = new Object3DHelperController(this.five)\n return this._object3DHelper\n }\n\n public dispose() {\n this._pointSelector?.dispose()\n this._fiveDomEvents?.dispose()\n this._object3DHelper?.dispose()\n this._cursor?.removeDeleteButton()\n this._cursor?.reset()\n }\n}\n\nconst objectModules = new WeakMap<Object3D, SculptModules>()\nexport function bindObjectModules(object: Object3D, modules: SculptModules) {\n objectModules.set(object, modules)\n bindFiveOwner(object, modules.five)\n}\nexport function getObjectModules(object: Object3D): SculptModules {\n const modules = objectModules.get(object)\n if (modules) return modules\n if (object.parent) return getObjectModules(object.parent)\n throw new Error('Sculpt object has no owning instance')\n}\n","import type * as THREE from 'three/webgpu'\nimport { LightTag } from '../../shared-utils/tag'\nimport type { LineMesh } from '../Meshes/Line'\nimport type { PointMesh } from '../Meshes/Point'\n\nexport function removeAllTag(object: THREE.Object3D) {\n removeTag(object)\n object.traverse((child) => removeTag(child))\n}\n\nfunction removeTag(obj: any) {\n const line = obj as LineMesh\n\n if (Array.isArray(line.doms) && line.doms[0] instanceof LightTag) {\n line.doms.forEach((tag) => tag.destroy())\n }\n\n const point = obj as PointMesh\n if (point.dom && point.dom instanceof LightTag) {\n point.dom.destroy()\n }\n\n if (obj.areaDom instanceof LightTag) {\n obj.areaDom.destroy()\n }\n}\n","import { removeAllTag } from '../../utils/removeAllTag'\nimport type * as THREE from 'three/webgpu'\n\nimport { bindObjectModules, type SculptModules } from '../../utils/Modules/Global'\nimport type { EventHandlerConfig, FiveDomEventMap, FiveDomEvents } from '../../../shared-utils/five/FiveDomEvents'\nimport { IObject3D } from '../../../shared-utils/three/IObject3D'\nimport type { BaseEditor } from './Editor'\nimport type { RequiredDeep } from 'type-fest'\nimport type { ImportDataToExportData } from '../../typings/utils.type'\nimport { localToWorld, worldToLocal } from '../../../shared-utils/three/applyObjectMatrixWorld'\nimport { notNil } from '../../../shared-utils'\n\nconst selectedObjectsMap = new WeakMap<THREE.Object3D, BaseObject[]>()\n\nexport interface BaseImportData {\n /**\n * @description: 唯一标识\n */\n id?: string\n /**\n * @description: 物体类型\n */\n type: string\n}\n\nexport interface BaseExportData extends RequiredDeep<BaseImportData> {}\n\nexport interface BaseObjectConfig {\n /**\n * @description: 是否启用默认行为,包括:\n * - 点击物体后高亮选中,同时启用 editor;\n * - esc 取消选中;\n * - delete 删除选中的物体;\n * - createXXXX 创建物体完成后自动启用 editor;\n * @default true\n */\n defaultAction: boolean\n /**\n * @description: 是否以一种半透明的方式显示遮挡的部分\n * @default true\n */\n occlusionVisibility?: boolean\n /**\n * @description 当 occlusionVisibility 为 true 时,以哪种方式显示被遮挡的部分\n * @params 'depthTest': 关闭深度测试, 'translucence': 半透明\n * @default 'translucence'\n */\n occlusionMode?: 'translucence' | 'depthTest'\n}\n\n/**\n * @description: 基础对象\n */\nexport abstract class BaseObject<\n ImportData extends BaseImportData = BaseImportData,\n ExportData extends BaseExportData = ImportDataToExportData<ImportData> & BaseExportData, // 有性能问题,先注释掉\n Config extends BaseObjectConfig = BaseObjectConfig,\n> extends IObject3D {\n public name = 'Sculpt'\n\n public readonly isSculptObject = true\n\n public draggable: boolean\n\n /**\n * @description 是否被选中\n */\n public selected: boolean\n\n /**\n * @description 配置\n */\n public config: Config\n\n public abstract get editor(): BaseEditor\n\n public abstract _editor?: BaseEditor\n\n public get editing() {\n return this.pointSelector.enabled\n }\n\n public abstract type: string\n\n /**\n * @description 物体导出数据\n */\n public abstract get data(): ExportData\n\n protected get baseData() {\n return {\n id: this.uuid,\n type: this.type,\n }\n }\n\n protected get pointSelector() {\n return this.modules.pointSelector\n }\n\n public constructor(public readonly modules: SculptModules, data?: Partial<ImportData>, config?: Partial<Config>) {\n super()\n bindObjectModules(this, modules)\n if (data?.id) this.uuid = data.id\n this.config = { defaultAction: true, occlusionVisibility: true, occlusionMode: 'translucence', ...config } as any\n\n if (data as any) {\n // TODO\n if (notNil(this.config?.occlusionMode)) {\n ;(data as any).style = { ...(data as any).style, occlusionMode: this.config.occlusionMode }\n }\n\n if (notNil(this.config?.occlusionVisibility)) {\n ;(data as any).style = { ...(data as any).style, occlusionVisibility: this.config.occlusionVisibility }\n }\n }\n\n this.modules.five.getElement().addEventListener('keydown', this.onKeyDown)\n\n if (this.config.defaultAction) {\n this.on('click', () => {\n if (this.editing) return\n this.select({ only: true })\n this.editor.enable()\n\n this.parent?.children.forEach((object) => {\n if (object instanceof BaseObject) {\n if (object !== this) object._editor?.disable()\n }\n })\n })\n\n }\n }\n\n private onKeyDown = (event: KeyboardEvent) => {\n if ((event.target as HTMLElement)?.closest('input, textarea, select, [contenteditable=\"true\"]')) return\n if (event.key === 'Escape') {\n this.stopCreating()\n if (this.selected) this.unselect()\n }\n if (this.config.defaultAction && this.selected && ['Backspace', 'Delete'].includes(event.key)) {\n event.preventDefault()\n this.delete()\n }\n }\n\n public abstract setData(data: Partial<ImportData>): void\n\n public on = <T extends keyof FiveDomEventMap>(event: T, callback: FiveDomEventMap[T], config?: EventHandlerConfig) =>\n this.modules.fiveDomEvents.addEventListener(this, event, callback, config)\n\n public off = (...args: Parameters<FiveDomEvents['removeEventListener']> extends [infer _, ...infer Rest] ? Rest : never) =>\n this.modules.fiveDomEvents.removeEventListener(this, ...args)\n\n /**\n * @description 撤销\n */\n public undo(): void {}\n\n /**\n * @description 重做\n */\n public redo(): void {}\n\n /**\n * @description 是否可以撤销\n */\n public canUndo() {\n return false\n }\n\n /**\n * @description 是否可以重做\n */\n public canRedo() {\n return false\n }\n\n /**\n * @description 停止创建当前物体,等同于`esc`\n */\n public stopCreating() {\n this.modules.pointSelector.disable()\n }\n\n /**\n * @description 从场景中删除当前物体,并且移除事件监听\n */\n public delete() {\n this.stopCreating()\n this.unselect()\n this.modules.five.getElement().removeEventListener('keydown', this.onKeyDown)\n this._editor?.disable()\n this.off()\n removeAllTag(this)\n this.traverse((object) => {\n const mesh = object as THREE.Mesh\n mesh.geometry?.dispose()\n const materials = mesh.material ? (Array.isArray(mesh.material) ? mesh.material : [mesh.material]) : []\n materials.forEach((material) => material.dispose())\n })\n this.removeFromParent()\n }\n\n /**\n * @description 选择当前物体\n * @param params.only 只选择当前物体,自动取消选择其他物体;默认 `false`\n *\n */\n public select(params: { only?: boolean } = { only: false }) {\n if (this.selected) return\n\n this.selected = true\n this.highlight()\n\n if (!selectedObjectsMap.has(this.parent)) {\n selectedObjectsMap.set(this.parent, [])\n }\n const selectedObjects = selectedObjectsMap.get(this.parent)\n selectedObjects.push(this)\n\n if (params.only) {\n selectedObjects?.slice().forEach((object) => {\n if (object !== this) object.unselect()\n })\n }\n }\n\n /**\n * @description 取消选择当前物体\n */\n public unselect() {\n if (!this.selected) return\n\n this.selected = false\n const selected = this.parent && selectedObjectsMap.get(this.parent)\n if (selected) {\n const index = selected.indexOf(this)\n if (index !== -1) selected.splice(index, 1)\n }\n this.unhighlight()\n this._editor?.disable()\n }\n\n /**\n * @description 高亮当前物体\n */\n public highlight() {}\n\n /**\n * @description 取消高亮当前物体\n */\n public unhighlight() {}\n\n /**\n * @description 显示删除按钮\n */\n public showDeleteButton(clientX: number, clientY: number) {\n this.modules.cursor.showDeleteButton({ clientX, clientY, container: document.body, onClick: () => this.delete() })\n this.modules.five.once('cameraUpdate', () => {\n this.modules.cursor.removeDeleteButton()\n })\n }\n\n protected applyObjectMatrixWorld = <P extends THREE.Vector3 | THREE.Vector3[]>(point: P, fromObject?: THREE.Object3D): P => {\n const object = fromObject ?? this\n object.updateMatrixWorld()\n return localToWorld(object, point)\n }\n\n protected applyObjectReversalMatrixWorld = <P extends THREE.Vector3 | THREE.Vector3[]>(point: P, fromObject?: THREE.Object3D): P => {\n const object = fromObject ?? this\n object.updateMatrixWorld()\n return worldToLocal(object, point)\n }\n\n public abstract create(...args: any): Promise<void>\n}\n","import { getObjectModules } from '../../utils/Modules/Global'\nimport type * as THREE from 'three/webgpu'\nimport { IObject3D } from '../../../shared-utils/three/IObject3D'\nimport type { AddObject3DHelperConfig } from '../../../Object3DHelperPlugin'\nimport { Subscribe } from '../../../shared-utils/Subscribe'\nimport type { Direction, Direction4 } from '../../../shared-utils/Object3DHelper/typings/Direction'\n\nexport type ObjectUpdateType = 'move' | 'rotate' | 'scale'\n\nexport interface ObjectUpdateParams {\n /** 操作类型:移动、旋转、缩放 */\n type?: ObjectUpdateType\n /** 开始时间戳 */\n start_timestamp?: number\n /** 结束时间戳 */\n end_timestamp?: number\n /** 轴向 */\n axis?: Direction | Direction4\n /** 进行中的状态 */\n status?: 'moving' | 'rotating' | 'scaling'\n /** 是否为操作结束,true 表示松手,false 表示拖动中 */\n is_handle_end?: boolean\n}\n\nexport class BaseEditor<OriginObject extends THREE.Object3D = THREE.Object3D> extends IObject3D {\n public hooks: Subscribe<{ objectUpdate: (params?: ObjectUpdateParams) => void }> = new Subscribe<{\n objectUpdate: (params?: ObjectUpdateParams) => void\n }>()\n\n protected get modules() { return getObjectModules(this.originObject) }\n\n protected originObject: OriginObject\n\n public constructor(originObject: OriginObject) {\n super()\n this.originObject = originObject\n }\n\n /**\n * @description: 开启编辑器\n */\n public enable() {\n this.originObject.add(this)\n }\n\n /**\n * @description: 禁用编辑器\n */\n public disable() {\n this.originObject.remove(this)\n }\n}\n\nexport class BaseEditorWithObjectHelper<OriginObject extends THREE.Object3D = THREE.Object3D> extends BaseEditor<OriginObject> {\n private get helper() {\n return this.modules.object3DHelper.getObject3DHelper(this.originObject)?.helper\n }\n\n private objectHelperConfig: AddObject3DHelperConfig | (() => AddObject3DHelperConfig)\n\n // 记录当前操作的类型、开始时间和轴向\n private currentOperation: ObjectUpdateParams | null = null\n\n public constructor(originObject: OriginObject, objectHelperConfig?: AddObject3DHelperConfig | (() => AddObject3DHelperConfig)) {\n super(originObject)\n this.objectHelperConfig = objectHelperConfig\n }\n\n public enable() {\n super.enable()\n const objectHelperConfig = typeof this.objectHelperConfig === 'function' ? this.objectHelperConfig() : this.objectHelperConfig\n this.modules.object3DHelper.addObject3DHelper(this.originObject, { positionFrom: 'boundingBox', ...objectHelperConfig })\n\n const helper = this.modules.object3DHelper.getObject3DHelper(this.originObject).helper\n\n // 监听开始事件,记录操作类型和开始时间\n helper.hooks.on('moveStart', this.onMoveStart)\n helper.hooks.on('rotateStart', this.onRotateStart)\n helper.hooks.on('scaleStart', this.onScaleStart)\n\n // 监听操作中的事件,用于实时更新\n helper.hooks.on('move', this.onMove)\n helper.hooks.on('rotate', this.onRotate)\n helper.hooks.on('scale', this.onScale)\n\n // 监听结束事件,触发 objectUpdate 并传递参数\n helper.hooks.on('moveEnd', this.onMoveEnd)\n helper.hooks.on('rotateEnd', this.onRotateEnd)\n helper.hooks.on('scaleEnd', this.onScaleEnd)\n }\n\n public disable() {\n super.disable()\n\n this.helper?.hooks.off('moveStart', this.onMoveStart)\n this.helper?.hooks.off('rotateStart', this.onRotateStart)\n this.helper?.hooks.off('scaleStart', this.onScaleStart)\n this.helper?.hooks.off('move', this.onMove)\n this.helper?.hooks.off('rotate', this.onRotate)\n this.helper?.hooks.off('scale', this.onScale)\n this.helper?.hooks.off('moveEnd', this.onMoveEnd)\n this.helper?.hooks.off('rotateEnd', this.onRotateEnd)\n this.helper?.hooks.off('scaleEnd', this.onScaleEnd)\n\n this.modules.object3DHelper.removeObject3DHelper(this.originObject)\n }\n\n public initialHelperMatrix() {\n this.helper?.initialHelperMatrix()\n }\n\n // 记录移动操作开始\n private onMoveStart = (direction?: Direction) => {\n this.currentOperation = {\n type: 'move',\n start_timestamp: Date.now(),\n axis: direction,\n }\n }\n\n // 记录旋转操作开始\n private onRotateStart = (direction?: Direction) => {\n this.currentOperation = {\n type: 'rotate',\n start_timestamp: Date.now(),\n axis: direction,\n }\n }\n\n // 记录缩放操作开始\n private onScaleStart = (direction?: Direction | Direction4) => {\n this.currentOperation = {\n type: 'scale',\n start_timestamp: Date.now(),\n axis: direction,\n }\n }\n\n // 移动中的处理\n private onMove = () => {\n if (this.currentOperation) {\n this.currentOperation = {\n ...this.currentOperation,\n status: 'moving',\n }\n this.onObjectUpdate(false)\n }\n }\n\n // 旋转中的处理\n private onRotate = () => {\n if (this.currentOperation) {\n this.currentOperation = {\n ...this.currentOperation,\n status: 'rotating',\n }\n this.onObjectUpdate(false)\n }\n }\n\n // 缩放中的处理\n private onScale = () => {\n if (this.currentOperation) {\n this.currentOperation = {\n ...this.currentOperation,\n status: 'scaling',\n }\n this.onObjectUpdate(false)\n }\n }\n\n private onMoveEnd = () => {\n this.onObjectUpdate(true)\n }\n\n private onRotateEnd = () => {\n this.onObjectUpdate(true)\n }\n\n private onScaleEnd = () => {\n this.onObjectUpdate(true)\n }\n\n // 统一的触发 objectUpdate 方法\n // @param isHandleEnd 是否为操作结束,true 表示松手,false 表示拖动中\n private onObjectUpdate = (isHandleEnd = true) => {\n if (!this.currentOperation) {\n this.hooks.emit('objectUpdate')\n return\n }\n\n const params: ObjectUpdateParams = {\n ...this.currentOperation,\n end_timestamp: isHandleEnd ? Date.now() : undefined, // 只在松手时设置结束时间\n is_handle_end: isHandleEnd,\n }\n\n this.hooks.emit('objectUpdate', params)\n\n // 仅在操作结束时清空当前操作记录\n if (isHandleEnd) {\n this.currentOperation = null\n }\n }\n}\n","import { BaseEditorWithObjectHelper } from '../Objects/Base/Editor'\nimport type { RectangleMesh } from '../Meshes/Rectangle'\nimport getNormal from '../../shared-utils/three/getNormal'\n\nexport class RectangleMeshEditor extends BaseEditorWithObjectHelper<RectangleMesh> {\n public constructor(rectangleMesh: RectangleMesh) {\n super(rectangleMesh, () => {\n return {\n yAxis: () => {\n const points = rectangleMesh.points\n const normal = getNormal(points)\n return normal.normalize()\n },\n zAxis: () => {\n const points = rectangleMesh.points\n return points[0].clone().sub(points[1]).normalize()\n },\n\n scaleHelper: {\n enable: true,\n positions: () => {\n const points = rectangleMesh.points\n /**\n * 0 - 1\n * | |\n * 3 - 2\n */\n const leftCenter = points[0].clone().lerp(points[3], 0.5)\n const rightCenter = points[1].clone().lerp(points[2], 0.5)\n const topCenter = points[0].clone().lerp(points[1], 0.5)\n const bottomCenter = points[3].clone().lerp(points[2], 0.5)\n\n return [\n {\n id: 'left',\n handlePosition: leftCenter,\n basePosition: rightCenter,\n },\n {\n id: 'right',\n handlePosition: rightCenter,\n basePosition: leftCenter,\n },\n {\n id: 'top',\n handlePosition: topCenter,\n basePosition: bottomCenter,\n },\n {\n id: 'bottom',\n handlePosition: bottomCenter,\n basePosition: topCenter,\n },\n\n {\n id: 'topleft',\n handlePosition: points[0],\n basePosition: points[2],\n },\n {\n id: 'topright',\n handlePosition: points[1],\n basePosition: points[3],\n },\n {\n id: 'bottomleft',\n handlePosition: points[3],\n basePosition: points[1],\n },\n {\n id: 'bottomright',\n handlePosition: points[2],\n basePosition: points[0],\n },\n ]\n },\n scaleCallback: (params) => {\n const { intersectPoint, scalePosition } = params\n const { id, basePosition } = scalePosition\n\n const offset = intersectPoint.clone().sub(basePosition)\n const points = rectangleMesh.points\n\n const buildFromOpposite = (baseIndex: number) => {\n const b = baseIndex\n const o = (b + 2) % 4\n const a = (b + 1) % 4\n const c = (b + 3) % 4\n\n const base = points[b].clone()\n const dragged = intersectPoint.clone()\n\n // 原始边向量\n const vBA0 = points[a].clone().sub(base)\n const vBC0 = points[c].clone().sub(base)\n\n const wLen0 = vBA0.length()\n const hLen0 = vBC0.length()\n if (wLen0 < 1e-6 || hLen0 < 1e-6) return points.map((p) => p.clone())\n\n const eBA = vBA0.clone().normalize() // 宽方向单位向量\n const eBC = vBC0.clone().normalize() // 高方向单位向量\n\n // 计算鼠标拖动向量在宽/高方向上的投影\n const vDragged = dragged.clone().sub(base)\n const alpha = vDragged.dot(eBA)\n const beta = vDragged.dot(eBC)\n\n const newA = base.clone().add(eBA.clone().multiplyScalar(alpha))\n const newC = base.clone().add(eBC.clone().multiplyScalar(beta))\n const newO = base.clone().add(eBA.clone().multiplyScalar(alpha)).add(eBC.clone().multiplyScalar(beta))\n\n const newPts = points.map((p) => p.clone())\n newPts[b] = base\n newPts[a] = newA\n newPts[c] = newC\n newPts[o] = newO\n\n return newPts\n }\n\n if (id === 'top') {\n rectangleMesh.setPoints([\n // 2,3 不变\n points[3].clone().add(offset),\n points[2].clone().add(offset),\n points[2],\n points[3],\n ])\n } else if (id === 'bottom') {\n rectangleMesh.setPoints([\n // 0,1 不变\n points[0],\n points[1],\n points[1].clone().add(offset),\n points[0].clone().add(offset),\n ])\n } else if (id === 'left') {\n rectangleMesh.setPoints([\n // 1,2 不变\n points[1].clone().add(offset),\n points[1],\n points[2],\n points[2].clone().add(offset),\n ])\n } else if (id === 'right') {\n rectangleMesh.setPoints([\n // 0,3 不变\n points[0],\n points[0].clone().add(offset),\n points[3].clone().add(offset),\n points[3],\n ])\n } else if (id === 'topleft') {\n rectangleMesh.setPoints(buildFromOpposite(2))\n // 2 不变\n } else if (id === 'topright') {\n // 3 不变\n rectangleMesh.setPoints(buildFromOpposite(3))\n } else if (id === 'bottomleft') {\n // 1 不变\n rectangleMesh.setPoints(buildFromOpposite(1))\n } else if (id === 'bottomright') {\n // 0 不变\n rectangleMesh.setPoints(buildFromOpposite(0))\n }\n },\n },\n }\n })\n }\n}\n","import * as THREE from 'three/webgpu'\n\nexport class RectangleGeometry extends THREE.BufferGeometry {\n public name = 'RectangleGeometry'\n public points: THREE.Vector3[]\n public constructor(points: THREE.Vector3[]) {\n super()\n\n if (points.length !== 4) {\n console.error(\"Invalid number of points, it's not a rectangle\")\n return\n }\n\n this.points = points.slice(0, 4)\n\n this.setAttribute('position', new THREE.BufferAttribute(new Float32Array(this.points.flatMap((p) => p.toArray())), 3))\n // 两个三角形 0,1,2 和 0,2,3\n this.setIndex(new THREE.BufferAttribute(new Uint16Array([0, 1, 2, 0, 2, 3]), 1))\n }\n}\n","import { anyPositionToVector3, type AnyPositions } from '../../shared-utils/positionToVector3'\nimport { notNil } from '../../shared-utils'\nimport type * as THREE from 'three/webgpu'\nimport { PolygonMesh } from './Polygon'\nimport { RectangleGeometry } from '../utils/three/RectangleGeometry'\nimport type { PointsData } from '../utils/data'\nimport type { ColoredMeshStyle } from '../utils/three/ColoredMesh'\n\nexport type RectangleStyle = ColoredMeshStyle\n\nexport type RectangleData = PointsData\n\n/**\n * @description: 矩形\n */\nexport class RectangleMesh extends PolygonMesh {\n public name = 'RectangleMesh'\n\n public declare meshFont: THREE.Mesh<RectangleGeometry, THREE.MeshBasicMaterial>\n public declare meshBackground: THREE.Mesh<RectangleGeometry, THREE.MeshBasicMaterial>\n\n public get color() {\n return this.meshFont.material.color\n }\n\n public constructor(params?: Partial<RectangleStyle & RectangleData>) {\n super(params)\n }\n\n public setPoints(points: AnyPositions) {\n const vectors = points.map(anyPositionToVector3).filter(notNil)\n if (vectors.length < 3) {\n console.error('Invalid position')\n return\n }\n\n /**\n * v1 -- v2\n * | |\n * v4 -- v3\n */\n if (points.length === 3) {\n // 补齐四个点\n const [v1, v2, v3] = vectors\n const v4 = v1.clone().add(v3).sub(v2)\n vectors.push(v4)\n }\n\n this.points = vectors\n\n this.geometry = new RectangleGeometry(vectors)\n\n this.planeHelperNeedUpdate = true\n this.geometryInfoNeedUpdate = true\n }\n}\n","import type { AnyPositions } from '../../shared-utils/positionToVector3'\nimport { RectangleMesh, type RectangleData, type RectangleStyle } from './Rectangle'\nimport { PolylineMesh } from './Polyline'\nimport type { LineStyle } from '../typings/style'\n\nexport type RectangleWithEdgeMeshStyle = RectangleStyle & LineStyle\n\n/**\n * @description: 带边线的矩形\n */\nexport class RectangleWithEdgeMesh extends RectangleMesh {\n public name = 'RectangleWithEdgeMesh'\n\n public get style() {\n return {\n ...super.style,\n ...this.line.style,\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<RectangleWithEdgeMeshStyle & RectangleData>) {\n const { points, ...style } = params ?? {}\n super()\n\n if (points) this.setPoints(points)\n if (style) this.setStyle(style)\n }\n\n public setPoints(points: AnyPositions) {\n super.setPoints(points)\n if (this.points) {\n this.line.setPoints([this.points[0], this.points[1], this.points[2], this.points[3], this.points[0]])\n this.addIfNotExists(this.line)\n }\n }\n\n public setStyle(style: Partial<RectangleWithEdgeMeshStyle>) {\n super.setStyle(style)\n this.line.setStyle(style)\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 type * as THREE from 'three/webgpu'\nimport getNormal from '../../shared-utils/three/getNormal'\nimport { centerPoint } from '../../shared-utils/three/centerPoint'\n\n/**\n * @description 根据camera的位置,将positions重新排序,使positions的正面朝向camera\n */\nexport function sortPositionsByCameraPosition(sourcePositions: THREE.Vector3[], cameraPosition: THREE.Vector3) {\n const normal = getNormal(sourcePositions)\n const centerPosition = centerPoint(...sourcePositions)\n const centerToCamera = cameraPosition.clone().sub(centerPosition)\n\n if (normal.dot(centerToCamera) >= 0) {\n return sourcePositions\n }\n\n return sourcePositions.slice().reverse()\n}\n","import type * as THREE from 'three/webgpu'\nimport { BaseEditor } from '../Base/Editor'\nimport type { FiveDomEvent } from '../../../shared-utils/five/FiveDomEvents'\nimport type { Line } from '.'\nimport { PointMesh } from '../../Meshes/Point'\nimport { getIntersectByRaycaster } from '../../../shared-utils/five/getPosition'\nimport { notNil } from '../../../shared-utils'\n\nexport abstract class LineEditorAbstract<OriginObject extends THREE.Object3D = THREE.Object3D> extends BaseEditor<OriginObject> {\n protected draggingPoints: PointMesh[] = []\n protected get pointMeshes() {\n return this.children.filter((child) => child instanceof PointMesh) as PointMesh[]\n }\n\n public abstract get points(): THREE.Vector3[]\n\n public get pointHandles() {\n return this.children as PointMesh[]\n }\n\n public constructor(originObject: OriginObject) {\n super(originObject)\n }\n\n public enable() {\n super.enable()\n this.points.filter(notNil).forEach((point) => {\n const pointMesh = new PointMesh()\n pointMesh.visible = false\n pointMesh.position.copy(point)\n ;(pointMesh as any).draggable = true\n this.modules.fiveDomEvents.addEventListener(pointMesh, 'drag', this.onDrag)\n this.modules.fiveDomEvents.addEventListener(pointMesh, 'dragstart', this.onDragstart)\n this.modules.fiveDomEvents.addEventListener(pointMesh, 'dragend', this.onDragend)\n this.add(pointMesh)\n })\n }\n\n public disable() {\n super.disable()\n this.removeChildren()\n }\n\n protected onDragstart = (event: FiveDomEvent) => {\n const dragMesh = event.target as PointMesh\n this.draggingPoints = this.pointMeshes.filter((point) => point.position.equals(dragMesh.position))\n }\n\n protected onDragend = (event: FiveDomEvent) => {\n this.draggingPoints = []\n }\n\n protected abstract onDrag(event: FiveDomEvent): void\n}\n\nexport class LineEditor extends LineEditorAbstract<Line> {\n public get points() {\n return this.originObject.lineMesh.points\n }\n\n public constructor(originObject: Line) {\n super(originObject)\n }\n\n protected onDrag = (event: FiveDomEvent) => {\n if (!this.draggingPoints || this.draggingPoints.length === 0) return\n const intersects = getIntersectByRaycaster(this.modules.five, event.raycaster)\n\n this.draggingPoints.forEach((point) => point.position.copy(intersects.point))\n this.originObject.lineMesh.setPoints(this.pointMeshes.map((point) => point.position))\n }\n}\n","import type * as THREE from 'three/webgpu'\nimport type { ReplaceDeep } from '../../Sculpt/typings/utils.type'\n\nexport default function vector3ToArray<V extends THREE.Vector3 | THREE.Vector3[]>(\n vector3: V,\n): ReplaceDeep<V, THREE.Vector3, [number, number, number]> {\n if (Array.isArray(vector3)) {\n return vector3.map((v) => [v.x, v.y, v.z]) as any\n } else {\n return [vector3.x, vector3.y, vector3.z] as any\n }\n}\n","import type { LineStyle } from '../typings/style'\nimport type { PointsData } from '../utils/data'\nimport type { ColoredMeshStyle } from '../utils/three/ColoredMesh'\nimport { PolygonWithEdgeMesh } from './PolygonWithEdge'\n\nexport type AreaStyle = ColoredMeshStyle & LineStyle\n\nexport type AreaData = PointsData\n\nexport class AreaMesh extends PolygonWithEdgeMesh {\n public name = 'AreaMesh'\n}\n","import type * as THREE from 'three/webgpu'\nimport type { Polygon } from '.'\nimport type { FiveDomEvent } from '../../../shared-utils/five/FiveDomEvents'\nimport { getIntersectByRaycaster } from '../../../shared-utils/five/getPosition'\nimport { LineEditorAbstract } from '../Line/Editor'\nimport { PointMesh } from '../../Meshes/Point'\n\nexport class PolygonEditor extends LineEditorAbstract<Polygon> {\n public get points() {\n return this.originObject.areaMesh.points\n }\n\n public constructor(originObject: Polygon) {\n super(originObject)\n }\n\n public enable() {\n super.enable()\n this.updatePointMeshes()\n }\n\n public disable() {\n this.pointMeshes.forEach((mesh) => this.disposePointMesh(mesh))\n super.disable()\n }\n\n /**\n * 更新所有 PointMesh 的位置\n */\n public updatePointMeshes() {\n const points = this.originObject.areaMesh.points\n const distance = this.originObject.areaMesh?.userData?.dragSelectPixelDistance ?? 10\n const areaMesh = this.originObject.areaMesh\n const lineColor = areaMesh.lineColor?.getHex?.()\n const areaColor = areaMesh.color?.getHex?.()\n const pointColor = lineColor ?? areaColor ?? 0xffffff\n const lineOpacity = areaMesh.line?.style?.opacity ?? areaMesh.opacity ?? 1\n\n this.syncPointMeshCount(points, {\n dragSelectPixelDistance: distance,\n pointColor,\n pointOpacity: lineOpacity,\n })\n\n this.pointMeshes.forEach((mesh, index) => {\n const point = points[index]\n if (!point) return\n mesh.position.copy(point)\n mesh.visible = true\n })\n }\n\n protected onDragstart = (event: FiveDomEvent) => {\n const dragMesh = event.target as any\n this.draggingPoints = this.pointMeshes.filter((point) => point.position.equals(dragMesh.position))\n }\n\n protected onDrag = (event: FiveDomEvent) => {\n if (!this.draggingPoints || this.draggingPoints.length === 0) return\n const intersects = getIntersectByRaycaster(this.modules.five, event.raycaster)\n if (!intersects) return\n const newPoints = this.originObject.areaMesh.projectPoint(intersects.point)\n\n this.draggingPoints.forEach((point) => point.position.copy(newPoints))\n this.originObject.areaMesh.setPoints(this.pointMeshes.map((point) => point.position))\n this.hooks.emit('objectUpdate')\n if (this.modules.five) {\n this.modules.five.needsRender = true\n }\n const sync = this.originObject.areaMesh?.userData?.syncCreationPointMeshes\n if (typeof sync === 'function') {\n sync()\n }\n }\n\n protected onDragend = (event: FiveDomEvent) => {\n this.draggingPoints = []\n // 通知 Polygon 记录历史\n this.originObject.recordHistory()\n this.hooks.emit('objectUpdate')\n }\n\n private syncPointMeshCount(\n points: THREE.Vector3[],\n options: { dragSelectPixelDistance: number; pointColor: number; pointOpacity: number },\n ) {\n const currentMeshes = [...this.pointMeshes]\n const { dragSelectPixelDistance, pointColor, pointOpacity } = options\n\n if (currentMeshes.length > points.length) {\n currentMeshes.slice(points.length).forEach((mesh) => this.disposePointMesh(mesh))\n }\n\n while (this.pointMeshes.length < points.length) {\n const mesh = this.createPointMesh({ dragSelectPixelDistance, pointColor, pointOpacity })\n this.add(mesh)\n }\n\n this.pointMeshes.forEach((mesh) => {\n mesh.userData = mesh.userData ?? {}\n mesh.userData.dragSelectPixelDistance = dragSelectPixelDistance\n mesh.setStyle({\n color: pointColor,\n opacity: pointOpacity,\n })\n })\n }\n\n private createPointMesh(options: { dragSelectPixelDistance: number; pointColor: number; pointOpacity: number }) {\n const { dragSelectPixelDistance, pointColor, pointOpacity } = options\n const pointMesh = new PointMesh()\n pointMesh.visible = true\n pointMesh.userData = pointMesh.userData ?? {}\n pointMesh.userData.dragSelectPixelDistance = dragSelectPixelDistance\n ;(pointMesh as any).draggable = true\n pointMesh.setStyle({\n color: pointColor,\n opacity: pointOpacity,\n })\n this.modules.fiveDomEvents.addEventListener(pointMesh, 'drag', this.onDrag)\n this.modules.fiveDomEvents.addEventListener(pointMesh, 'dragstart', this.onDragstart)\n this.modules.fiveDomEvents.addEventListener(pointMesh, 'dragend', this.onDragend)\n return pointMesh\n }\n\n private disposePointMesh(mesh: PointMesh) {\n this.modules.fiveDomEvents.removeEventListener(mesh)\n this.remove(mesh)\n }\n}\n","interface Point3D {\n x: number\n y: number\n z: number\n}\n\ninterface Line3D {\n start: Point3D\n end: Point3D\n}\n\n/**\n * @description 判断线段是否相交\n * @todo ai写的一些变量名起的比较怪,懒得改了\n */\nexport function isIntersecting(line1: Line3D, line2: Line3D | Line3D[]): boolean {\n const lines = Array.isArray(line2) ? line2 : [line2]\n\n for (let i = 0; i < lines.length; i++) {\n const p1 = line1.start\n const q1 = line1.end\n const p2 = lines[i].start\n const q2 = lines[i].end\n\n // 重合不算相交\n if (equals(p1, p2) || equals(p1, q2) || equals(q1, p2) || equals(q1, q2) || equals(p1, q1)) {\n continue\n }\n\n if (areLinesIntersecting3D([p1.x, p1.y, p1.z], [q1.x, q1.y, q1.z], [p2.x, p2.y, p2.z], [q2.x, q2.y, q2.z])) return true\n }\n\n return false\n}\n\n\nexport function isLinesIntersecting(lines: Line3D[]): boolean {\n if (lines.length < 2) {\n return false;\n }\n for (let i = 0; i < lines.length; i++) {\n const hasIntersect = isIntersecting(lines[i], lines.slice(i + 1))\n if (hasIntersect) return true// 有交点,返回空\n }\n return false\n}\n\nexport function isPolygenIntersecting(points: Point3D[]): boolean {\n const lines: Line3D[] = []\n for (let i = 1; i < points.length; i++) {\n const line: Line3D = { start: points[i - 1], end: points[i] }\n lines.push(line)\n }\n return isLinesIntersecting(lines)\n}\n\nfunction areLinesIntersecting3D(line1Start, line1End, line2Start, line2End) {\n // 计算方向向量\n const dirVec1 = [line1End[0] - line1Start[0], line1End[1] - line1Start[1], line1End[2] - line1Start[2]]\n const dirVec2 = [line2End[0] - line2Start[0], line2End[1] - line2Start[1], line2End[2] - line2Start[2]]\n\n // 设定两个参数方程相等,解三个标量方程\n // 三行对应 X, Y, Z 三个方向\n const rows = [\n { a: [dirVec1[0], -dirVec2[0]], b: line2Start[0] - line1Start[0] },\n { a: [dirVec1[1], -dirVec2[1]], b: line2Start[1] - line1Start[1] },\n { a: [dirVec1[2], -dirVec2[2]], b: line2Start[2] - line1Start[2] },\n ]\n\n // 尝试所有两行组合 (XY, XZ, YZ),找到行列式非零的组合\n const combinations = [\n [0, 1], // X 和 Y\n [0, 2], // X 和 Z\n [1, 2], // Y 和 Z\n ]\n\n for (const [i, j] of combinations) {\n const A = [rows[i].a, rows[j].a]\n const b = [rows[i].b, rows[j].b]\n\n const detA = determinant(A)\n if (Math.abs(detA) < 1e-10) {\n continue // 这个组合行列式为零,换下一个\n }\n\n const A_inv = inverseMatrix(A, detA)\n const [t, s] = matrixVectorMultiply(A_inv, b)\n\n // 检查解是否在线段范围内\n if (isInSegmentRange(t) && isInSegmentRange(s)) {\n return true\n }\n\n // 找到有效解后就返回,不需要继续\n return false\n }\n\n // 所有组合行列式都为零,说明线段平行或共线\n return false\n}\n\nfunction determinant(A) {\n // 计算2x2矩阵的行列式\n return A[0][0] * A[1][1] - A[0][1] * A[1][0]\n}\n\nfunction inverseMatrix(A, det) {\n // 计算2x2矩阵的逆矩阵,传入已计算的行列式值\n return [\n [A[1][1] / det, -A[0][1] / det],\n [-A[1][0] / det, A[0][0] / det],\n ]\n}\n\nfunction matrixVectorMultiply(matrix, vector) {\n return [matrix[0][0] * vector[0] + matrix[0][1] * vector[1], matrix[1][0] * vector[0] + matrix[1][1] * vector[1]]\n}\n\nfunction isInSegmentRange(value) {\n return value >= 0 && value <= 1\n}\n\nfunction equals(p1: Point3D, p2: Point3D): boolean {\n return p1.x === p2.x && p1.y === p2.y && p1.z === p2.z\n}\n","import type { SculptModules } from '../../utils/Modules/Global'\nimport { BaseObject, type BaseImportData, type BaseObjectConfig } from '../Base'\nimport * as THREE from 'three/webgpu'\nimport type { PointIntersection } from '../../../shared-utils'\nimport { PolylineMesh } from '../../Meshes/Polyline'\nimport { AreaMesh, type AreaStyle } from '../../Meshes/Area'\nimport { PolygonEditor } from './Editor'\nimport type { PointSelector } from '../../../shared-utils/three/PointSelector'\nimport type { LiteralString } from '../../../typings/utils.type'\nimport type { PolygonData, PolygonStyle } from '../../Meshes/Polygon'\nimport vector3ToArray from '../../../shared-utils/three/vector3ToArray'\nimport type { CreateLimitConfig, PolygonDrawConfig } from '../../typings/style'\nimport { withResolvers } from '../../../shared-utils/promise/withResolvers'\nimport { anyPositionToVector3 } from '../../../shared-utils/positionToVector3'\nimport { getFiveFromParentChain } from '../../../shared-utils/five/getFiveFromParentChain'\nimport { PointMesh } from '../../Meshes/Point'\nimport { isPolygenIntersecting } from '../../utils/isIntersecting';\n\nexport interface PolygonImportData extends BaseImportData, PolygonData {\n type: LiteralString<'Polygon'>\n style?: Partial<AreaStyle>\n}\n\n// 新增:PolygonCreateConfig 类型\nexport type PolygonCreateConfig = Partial<PolygonStyle & CreateLimitConfig & PolygonDrawConfig> & {\n onPointPlaced?: (points: THREE.Vector3[]) => void\n onUndo?: () => void\n onRedo?: () => void\n /**\n * @description 检测到自相交时的回调\n * @param point 尝试添加但被拒绝的点坐标\n */\n __onSelfIntersect?: (point: THREE.Vector3) => void\n /**\n * @description 将要添加的下一个点\n */\n __onWillAddPoint?: (point: THREE.Vector3, points: THREE.Vector3[]) => void\n /**\n * @description 检测是否自相交,如果自交,禁止添加下一个点\n * @default false\n */\n experimental_self_intersect_check?: boolean\n /**\n * 最多允许能添加的点数\n */\n experimental_max_point_count?: number\n}\n\nexport class Polygon extends BaseObject<PolygonImportData> {\n public readonly type = 'Polygon'\n public areaMesh: AreaMesh\n\n // 新增:Polygon 专属的历史记录\n private historyStack: Array<{\n points: THREE.Vector3[]\n }> = []\n private currentHistoryIndex: number = -1\n private maxHistorySize: number = 50\n\n public get editor() {\n if (!this._editor) {\n this._editor = new PolygonEditor(this)\n }\n return this._editor\n }\n\n public _editor: PolygonEditor\n\n private creatingObject?: ReturnType<typeof createPolygon>\n\n private updateCreationPointMeshes() {\n const sync = this.areaMesh?.userData?.syncCreationPointMeshes\n if (typeof sync === 'function') {\n sync()\n }\n if (this._editor) {\n this._editor.updatePointMeshes()\n }\n }\n\n public get data() {\n this.updateMatrixWorld()\n return {\n ...this.baseData,\n points: vector3ToArray(this.applyObjectMatrixWorld(this.areaMesh.points)),\n style: {\n color: this.areaMesh.color.getHex(),\n lineColor: this.areaMesh.lineColor.getHex(),\n lineWidth: this.areaMesh.lineWidth,\n },\n }\n }\n\n public constructor(modules: SculptModules, data?: PolygonImportData, config?: Partial<BaseObjectConfig>) {\n super(modules, data, config)\n\n if (data) {\n this.areaMesh = new AreaMesh({ ...data.style, ...data })\n this.areaMesh.userData = this.areaMesh.userData ?? {}\n if (typeof this.areaMesh.userData.dragSelectPixelDistance !== 'number') {\n this.areaMesh.userData.dragSelectPixelDistance = 10\n }\n this.add(this.areaMesh)\n }\n }\n\n public setData(data: Partial<PolygonImportData>): void {\n if (data.points) this.areaMesh.setPoints(this.applyObjectReversalMatrixWorld(data.points.map(anyPositionToVector3)))\n this.areaMesh.setStyle(data.style)\n this.updateCreationPointMeshes()\n }\n\n public highlight() {\n this.areaMesh?.highlight()\n }\n\n public unhighlight() {\n this.areaMesh?.unhighlight()\n }\n\n public canUndo() {\n // 创建阶段使用创建对象的撤销\n if (this.creatingObject) {\n const result = this.creatingObject?.canUndo?.() ?? false\n return result\n }\n // 编辑阶段使用 Polygon 自己的历史记录\n const result = this.currentHistoryIndex > 0\n return result\n }\n\n public canRedo() {\n // 创建阶段使用创建对象的重做\n if (this.creatingObject) {\n return this.creatingObject?.canRedo?.() ?? false\n }\n // 编辑阶段使用 Polygon 自己的历史记录\n return this.currentHistoryIndex < this.historyStack.length - 1\n }\n\n public undo() {\n // 创建阶段使用创建对象的撤销\n if (this.creatingObject) {\n return this.creatingObject?.undo?.()\n }\n // 编辑阶段使用 Polygon 自己的历史记录\n if (this.canUndo()) {\n this.currentHistoryIndex--\n const snapshot = this.historyStack[this.currentHistoryIndex]\n this.restoreSnapshot(snapshot)\n } else {\n console.log('[Polygon] undo: 无法撤销', { uuid: this.uuid })\n }\n }\n\n public redo() {\n // 创建阶段使用创建对象的重做\n if (this.creatingObject) {\n return this.creatingObject?.redo?.()\n }\n\n // 编辑阶段使用 Polygon 自己的历史记录\n if (this.canRedo()) {\n this.currentHistoryIndex++\n const snapshot = this.historyStack[this.currentHistoryIndex]\n this.restoreSnapshot(snapshot)\n }\n }\n\n /**\n * 记录当前状态到历史记录\n */\n public recordHistory() {\n // 创建阶段不记录\n if (this.creatingObject) {\n return\n }\n\n // 截断当前索引之后的历史记录\n this.historyStack = this.historyStack.slice(0, this.currentHistoryIndex + 1)\n\n // 创建当前状态的快照\n const snapshot = {\n points: this.areaMesh.points.map((p) => p.clone()),\n }\n\n this.historyStack.push(snapshot)\n\n // 限制历史记录数量\n if (this.historyStack.length > this.maxHistorySize) {\n this.historyStack.shift()\n } else {\n this.currentHistoryIndex++\n }\n }\n\n /**\n * 恢复快照\n */\n private restoreSnapshot(snapshot: { points: THREE.Vector3[] }) {\n this.areaMesh.setPoints(snapshot.points.map((p) => p.clone()))\n this.updateCreationPointMeshes()\n\n // 更新编辑器中的点\n if (this._editor) {\n this._editor.updatePointMeshes()\n }\n }\n\n public async create(params?: PolygonCreateConfig) {\n this.children.forEach((child) => {\n if (child.parent === this) {\n this.remove(child)\n }\n })\n this.children.length = 0\n\n const areaMesh = new AreaMesh(params)\n this.areaMesh = areaMesh\n this.add(this.areaMesh)\n\n this.creatingObject = createPolygon(this.areaMesh, this.pointSelector, params)\n\n await this.creatingObject?.finished\n\n // 创建完成后,清空创建对象,进入编辑阶段\n this.creatingObject = null\n\n // 记录初始状态(创建完成后的状态)\n this.recordHistory()\n this.updateCreationPointMeshes()\n\n if (this.config.defaultAction) this.editor.enable()\n }\n}\n\nexport function createPolygon(areaMesh: AreaMesh, pointSelector: PointSelector, config?: PolygonCreateConfig) {\n const { promise, resolve, reject } = withResolvers<void>()\n const container = areaMesh.parent\n if (!container) {\n reject(new Error('No container'))\n return\n }\n\n const limit = config?.limit ?? 'none'\n const simpleMode = config?.simpleMode\n\n // 获取 five 实例\n const five = pointSelector.five\n // 获取吸附像素距离\n const autoClosePixelDistance = config?.autoClosePixelDistance ?? 10\n areaMesh.userData = areaMesh.userData ?? {}\n areaMesh.userData.dragSelectPixelDistance = autoClosePixelDistance\n\n // 获取最高高度\n let maxY = 0\n if (simpleMode) {\n if (five && five.model && five.model.bounding && typeof five.model.bounding.max?.y === 'number') {\n maxY = five.model.bounding.max.y + 1\n }\n }\n\n // 预览线\n const previewLine = new PolylineMesh(areaMesh.style)\n container?.add(previewLine)\n // 垂直辅助线\n const verticalLine = new PolylineMesh({ ...areaMesh.style, dashed: true, lengthEnable: false })\n container?.add(verticalLine)\n\n // 新增:用于显示所有点的 PointMesh\n let pointMeshes: PointMesh[] = []\n const syncCreationPointMeshes = (sourcePoints: THREE.Vector3[] = points) => {\n pointMeshes.forEach((mesh, idx) => {\n const point = sourcePoints[idx]\n if (point) {\n mesh.position.copy(point)\n }\n })\n }\n function updatePointMeshes() {\n // 先移除所有旧的点\n pointMeshes.forEach((mesh) => mesh.parent?.remove(mesh))\n // 复用线段的 style,保证一致\n const style = areaMesh.line?.style ?? areaMesh.style\n pointMeshes = points.map((pt, idx) => {\n const mesh = new PointMesh({\n ...style,\n color: (style as any).pointColor ?? style.lineColor,\n tip: undefined,\n point: pt,\n })\n mesh.name = `PolygonPointMesh_${idx}`\n mesh.userData = mesh.userData ?? {}\n mesh.userData.dragSelectPixelDistance = autoClosePixelDistance\n container?.add(mesh)\n return mesh\n })\n syncCreationPointMeshes()\n }\n function clearPointMeshes() {\n pointMeshes.forEach((mesh) => mesh.parent?.remove(mesh))\n pointMeshes = []\n if (areaMesh.userData) {\n delete areaMesh.userData.creationPointMeshes\n delete areaMesh.userData.syncCreationPointMeshes\n delete areaMesh.userData.disposeCreationPointMeshes\n }\n }\n\n pointSelector.enable()\n if (simpleMode) pointSelector.setAdherePoints([])\n\n const points: THREE.Vector3[] = []\n\n let previewPoint: THREE.Vector3\n let planeHelper: THREE.Plane // 有值则表明已经确定了所在平面\n let closed = false\n let lastIntersection: PointIntersection\n\n const undoStack: THREE.Vector3[] = []\n\n const canUndo = () => points.length > 0\n\n const canRedo = () => undoStack.length > 0\n\n const undo = () => {\n if (!canUndo()) return\n undoStack.push(points.pop())\n onPreview(lastIntersection)\n updatePointMeshes() // 撤销时也要更新点\n config?.onUndo?.()\n if (pointSelector.pointSelectorHelper && pointSelector.pointSelectorHelper.magnifier) {\n pointSelector.pointSelectorHelper.magnifier.render()\n }\n }\n\n const redo = () => {\n if (!canRedo()) return\n points.push(undoStack.pop())\n onPreview(lastIntersection)\n updatePointMeshes() // 重做时也要更新点\n config?.onRedo?.()\n if (pointSelector.pointSelectorHelper && pointSelector.pointSelectorHelper.magnifier) {\n pointSelector.pointSelectorHelper.magnifier.render()\n }\n }\n\n // 选点处理函数\n const onSelect = (intersection: PointIntersection) => {\n undoStack.length = 0 // 一旦有了新的动作,就要清空撤销栈\n let point = points.length === 0 ? intersection.point : previewPoint.clone()\n if (simpleMode) point = point.clone().setY(maxY)\n\n config.__onWillAddPoint(point, points)\n if (config?.experimental_max_point_count != null && points.length === config.experimental_max_point_count) {\n return\n }\n\n points.push(point)\n areaMesh.setPoints(points, { closed: false })\n\n // 如果开启了自相交检测且检测到自相交,撤销添加的点\n if (config?.experimental_self_intersect_check && isPolygenIntersecting(points)) {\n const rejectedPoint = points.pop()\n areaMesh.setPoints(points, { closed: false })\n updatePointMeshes()\n console.warn('[Polygon] 检测到自相交,无法添加该点')\n config?.__onSelfIntersect?.(rejectedPoint)\n return\n }\n\n updatePointMeshes() // 新增点时也要更新\n config?.onPointPlaced?.(points)\n if (closed) {\n selectEnd()\n resolve()\n }\n }\n\n // 预览\n const onPreview = (intersection: PointIntersection) => {\n const clearPreview = () => {\n previewLine.setPoints([])\n verticalLine.setPoints([])\n areaMesh.setPoints(points)\n if (pointSelector.pointSelectorHelper && pointSelector.pointSelectorHelper.magnifier) {\n pointSelector.pointSelectorHelper.magnifier.render()\n }\n }\n\n if (!intersection) {\n clearPreview()\n updatePointMeshes() // 预览清空时也要清理点\n return\n }\n lastIntersection = intersection\n if (!points?.length) return clearPreview()\n\n const lastPoint = points.at(-1).clone()\n\n if (points.length < 3) {\n if (simpleMode) {\n previewPoint = intersection.point.clone().setY(maxY)\n previewLine.setPoints([lastPoint, previewPoint])\n verticalLine.setPoints([])\n } else if (limit === 'none') {\n previewPoint = intersection.point\n previewLine.setPoints([lastPoint, previewPoint])\n verticalLine.setPoints([])\n } else if (limit === 'xoz') {\n planeHelper = planeHelper ?? new THREE.Plane().setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), points[0])\n pointSelector.plane = planeHelper\n previewPoint = planeHelper.projectPoint(intersection.point, new THREE.Vector3())\n previewLine.setPoints([lastPoint, previewPoint])\n verticalLine.setPoints([previewPoint, intersection.point])\n } else if (limit === 'y') {\n if (points.length === 1) {\n previewPoint = intersection.point\n previewLine.setPoints([lastPoint, previewPoint])\n verticalLine.setPoints([])\n } else {\n planeHelper =\n planeHelper ?? new THREE.Plane().setFromCoplanarPoints(points[0], points[1], new THREE.Vector3(0, 1, 0).add(points[0]))\n pointSelector.plane = planeHelper\n previewPoint = planeHelper.projectPoint(intersection.point, new THREE.Vector3())\n previewLine.setPoints([lastPoint, previewPoint])\n verticalLine.setPoints([previewPoint, intersection.point])\n }\n }\n }\n\n // 已经画了3个点或以上时,需要检测是否可以闭合\n if (points.length >= 3) {\n if (simpleMode) {\n previewPoint = intersection.point.clone().setY(maxY)\n } else {\n previewPoint = areaMesh.projectPoint(intersection.point)\n }\n const startPoint = points[0]\n\n let shouldClose = false\n if (typeof config?.autoClosePixelDistance === 'number') {\n // 使用像素距离检测\n if (five && five.camera && five.getElement) {\n const fiveElement = five.getElement()\n const width = fiveElement.clientWidth\n const height = fiveElement.clientHeight\n const toScreen = (v: THREE.Vector3) => {\n const ndc = v.clone().project(five.camera)\n return {\n x: (ndc.x * 0.5 + 0.5) * width,\n y: (1 - (ndc.y * 0.5 + 0.5)) * height,\n }\n }\n const sp = toScreen(startPoint)\n const pp = toScreen(previewPoint)\n const ip = toScreen(intersection.point)\n const dist1 = Math.sqrt((sp.x - pp.x) ** 2 + (sp.y - pp.y) ** 2)\n const dist2 = Math.sqrt((sp.x - ip.x) ** 2 + (sp.y - ip.y) ** 2)\n if (dist1 < config.autoClosePixelDistance || dist2 < config.autoClosePixelDistance) {\n shouldClose = true\n }\n }\n } else {\n // 默认物理距离检测\n if (startPoint.distanceTo(previewPoint) < 0.2 || startPoint.distanceTo(intersection.point) < 0.2) {\n shouldClose = true\n }\n }\n if (shouldClose) {\n previewPoint = startPoint\n intersection.point.copy(startPoint)\n pointSelector.pointSelectorHelper.updateWithIntersect(intersection, { emitEvent: false })\n closed = true\n } else {\n closed = false\n }\n\n previewLine.setPoints([lastPoint, previewPoint])\n verticalLine.setPoints([previewPoint, intersection.point])\n }\n\n if (points.length >= 2) {\n areaMesh.setPoints([...points, previewPoint], { closed: false })\n areaMesh.line.setPoints(areaMesh.points.slice(0, -1))\n if (config?.experimental_self_intersect_check && isPolygenIntersecting([...points, previewPoint])) {\n pointSelector.cursorError = true\n previewLine.setStyle({ lineColor: 0xff5959 })\n verticalLine.setStyle({ lineColor: 0xff5959 })\n } else {\n pointSelector.cursorError = false\n previewLine.setStyle({ lineColor: areaMesh.lineColor })\n verticalLine.setStyle({ lineColor: areaMesh.lineColor })\n }\n } else {\n areaMesh.setPoints([])\n }\n updatePointMeshes() // 预览时也要更新点\n }\n\n const selectEnd = () => {\n pointSelector.off('select', onSelect)\n pointSelector.off('intersectionUpdate', onPreview)\n pointSelector.off('disable', cancel)\n pointSelector.plane = null\n pointSelector.disable()\n container?.remove(previewLine, verticalLine)\n clearPointMeshes() // 结束时清理点\n }\n\n const cancel = () => {\n selectEnd()\n container?.remove(areaMesh, verticalLine, previewLine)\n clearPointMeshes() // 取消时清理点\n reject(new Error('Cancelled'))\n }\n\n pointSelector.on('select', onSelect)\n pointSelector.on('intersectionUpdate', onPreview)\n pointSelector.on('disable', cancel)\n\n return {\n finished: promise,\n canUndo,\n canRedo,\n undo,\n redo,\n }\n}\n","import type { BoxMesh } from '../Meshes/Box'\nimport { BaseEditorWithObjectHelper } from '../Objects/Base/Editor'\nimport * as THREE from 'three/webgpu'\n\nexport class BoxMeshEditor extends BaseEditorWithObjectHelper<BoxMesh> {\n public constructor(boxMesh: BoxMesh) {\n super(boxMesh, () => {\n return {\n positionFrom: () => boxMesh.worldCenter,\n yAxis: () => new THREE.Vector3().subVectors(boxMesh.topPosition, boxMesh.bottomPositions[0]).normalize(),\n zAxis: () => new THREE.Vector3().subVectors(boxMesh.bottomPositions[0], boxMesh.bottomPositions[1]).normalize(),\n scaleHelper: {\n enable: true,\n positions: () => {\n const bottomPosition = boxMesh.bottomPositions\n const topPosition = boxMesh.topPosition\n const yOffset = new THREE.Vector3().subVectors(topPosition, bottomPosition[0])\n const xOffset = new THREE.Vector3().subVectors(bottomPosition[1], bottomPosition[0])\n const zOffset = new THREE.Vector3().subVectors(bottomPosition[2], bottomPosition[1])\n\n const center = boxMesh.geometryInfo.center\n\n const bottomCenter = center.clone().sub(yOffset.clone().divideScalar(2))\n const topCenter = center.clone().add(yOffset.clone().divideScalar(2))\n const leftCenter = center.clone().sub(xOffset.clone().divideScalar(2))\n const rightCenter = center.clone().add(xOffset.clone().divideScalar(2))\n const frontCenter = center.clone().sub(zOffset.clone().divideScalar(2))\n const backCenter = center.clone().add(zOffset.clone().divideScalar(2))\n\n return [\n {\n id: 'top',\n handlePosition: topCenter,\n basePosition: bottomCenter,\n },\n {\n id: 'bottom',\n handlePosition: bottomCenter,\n basePosition: topCenter,\n },\n {\n id: 'left',\n handlePosition: leftCenter,\n basePosition: rightCenter,\n },\n {\n id: 'right',\n handlePosition: rightCenter,\n basePosition: leftCenter,\n },\n {\n id: 'front',\n handlePosition: frontCenter,\n basePosition: backCenter,\n },\n {\n id: 'back',\n handlePosition: backCenter,\n basePosition: frontCenter,\n },\n ]\n },\n scaleCallback: (params) => {\n const { intersectPoint, scalePosition } = params\n const { id, basePosition } = scalePosition\n\n const bottomPositions = boxMesh.bottomPositions\n const topPositions = boxMesh.topPositions\n\n let heightOffset = new THREE.Vector3().subVectors(boxMesh.topPosition, bottomPositions[0])\n let newBottomPositions: THREE.Vector3[]\n\n if (id === 'top') {\n const offsetToBottom = intersectPoint.clone().sub(basePosition)\n heightOffset = offsetToBottom\n newBottomPositions = bottomPositions\n } else if (id === 'bottom') {\n const offsetToTop = intersectPoint.clone().sub(basePosition)\n newBottomPositions = topPositions.map((v) => v.clone().add(offsetToTop))\n heightOffset = undefined\n } else if (id === 'left') {\n // 1,2 边为右边,生成新的 0,3 边\n const offsetToRight = intersectPoint.clone().sub(basePosition)\n newBottomPositions = [\n bottomPositions[1].clone().add(offsetToRight),\n bottomPositions[1],\n bottomPositions[2],\n bottomPositions[2].clone().add(offsetToRight),\n ]\n } else if (id === 'right') {\n // 0,3 边为左边,生成新的 1,2 边\n const offsetToLeft = intersectPoint.clone().sub(basePosition)\n newBottomPositions = [\n bottomPositions[0],\n bottomPositions[0].clone().add(offsetToLeft),\n bottomPositions[3].clone().add(offsetToLeft),\n bottomPositions[3],\n ]\n } else if (id === 'front') {\n // 2,3 边为后边,生成新的 0,1 边\n const offsetToBack = intersectPoint.clone().sub(basePosition)\n newBottomPositions = [\n bottomPositions[3].clone().add(offsetToBack),\n bottomPositions[2].clone().add(offsetToBack),\n bottomPositions[2],\n bottomPositions[3],\n ]\n } else if (id === 'back') {\n // 0,1 边为前边,生成新的 2,3 边\n const offsetToFront = intersectPoint.clone().sub(basePosition)\n newBottomPositions = [\n bottomPositions[0],\n bottomPositions[1],\n bottomPositions[1].clone().add(offsetToFront),\n bottomPositions[0].clone().add(offsetToFront),\n ]\n }\n\n boxMesh.setPoints({\n points: newBottomPositions,\n heightPoint: heightOffset ? newBottomPositions[0].clone().add(heightOffset) : undefined,\n })\n },\n },\n }\n })\n }\n}\n","import { type AnyPosition } from '../../shared-utils/positionToVector3'\nimport { centerPoint } from '../../shared-utils/three/centerPoint'\nimport type { LineStyle } from '../typings/style'\nimport type { PointsData } from '../utils/data'\nimport type { ColoredMeshStyle } from '../utils/three/ColoredMesh'\nimport { PrismMesh } from './Prism'\n\nexport type BoxStyle = ColoredMeshStyle & LineStyle\n\nexport type BoxData = PointsData & { heightPoint: AnyPosition }\n\n/**\n * @description: Box\n */\nexport class BoxMesh extends PrismMesh {\n public name = 'BoxMesh'\n\n public get geometryInfo() {\n if (this.geometryInfoNeedUpdate) {\n this.geometryInfoNeedUpdate = false\n\n const bottomPositions = this.bottomPositions\n const topPosition = this.topPosition\n\n if (!bottomPositions || bottomPositions.length < 3 || !topPosition) {\n this._geometryInfoCache = undefined\n return\n }\n\n const bottomCenter = centerPoint(...bottomPositions)\n const offset = topPosition.clone().sub(bottomPositions[0])\n const center = bottomCenter.clone().add(offset.clone().divideScalar(2))\n\n this._geometryInfoCache = { center }\n }\n return this._geometryInfoCache\n }\n}\n","import type { SculptModules } from '../../utils/Modules/Global'\nimport { BaseObject, type BaseImportData, type BaseObjectConfig } from '../Base'\nimport * as THREE from 'three/webgpu'\nimport type { PointIntersection } from '../../../shared-utils'\n\nimport type { PointSelector } from '../../../shared-utils/three/PointSelector'\nimport { BoxMeshEditor } from '../../Editors/BoxMeshEditor'\nimport { BoxMesh, type BoxData, type BoxStyle } from '../../Meshes/Box'\nimport { createRectangle } from '../Rectangle'\nimport { LineMesh } from '../../Meshes/Line'\nimport getNormal from '../../../shared-utils/three/getNormal'\nimport { rayOnLine } from '../../utils/three/rayOnLine'\nimport vector3ToArray from '../../../shared-utils/three/vector3ToArray'\nimport type { LiteralString } from '../../../typings/utils.type'\nimport { RectangleWithEdgeMesh } from '../../Meshes/RectangleWithEdge'\nimport { centerPoint } from '../../../shared-utils/three/centerPoint'\nimport type { CreateLimitConfig, DrawMethodConfig } from '../../typings/style'\nimport { anyPositionToVector3 } from '../../../shared-utils/positionToVector3'\n\nexport interface BoxImportData extends BaseImportData, BoxData {\n type: LiteralString<'Box'>\n style?: Partial<BoxStyle>\n}\n\nexport type BoxCreateConfig = Partial<BoxStyle & CreateLimitConfig & DrawMethodConfig> & {\n onPointPlaced?: () => void\n}\n\nexport class Box extends BaseObject<BoxImportData> {\n public readonly type = 'Box'\n public boxMesh: BoxMesh\n\n public get editor() {\n if (!this._editor) {\n this._editor = new BoxMeshEditor(this.boxMesh)\n }\n return this._editor\n }\n\n public _editor: BoxMeshEditor\n\n public get data() {\n return {\n ...this.baseData,\n points: vector3ToArray(this.applyObjectMatrixWorld(this.boxMesh.bottomPositions, this.boxMesh)),\n heightPoint: vector3ToArray(this.applyObjectMatrixWorld(this.boxMesh.topPosition, this.boxMesh)),\n style: {\n color: this.boxMesh.color.getHex(),\n opacity: this.boxMesh.opacity,\n lineWidth: this.boxMesh.lineWidth,\n lineColor: this.boxMesh.lineColor.getHex(),\n },\n }\n }\n\n public constructor(modules: SculptModules, data?: BoxImportData, config?: Partial<BaseObjectConfig>) {\n super(modules, data, config)\n\n if (data) {\n this.boxMesh = new BoxMesh({ ...data.style, ...data })\n this.add(this.boxMesh)\n }\n }\n\n public setData(data: Partial<BoxImportData>): void {\n this.boxMesh.setPoints({\n points: data.points ? this.applyObjectReversalMatrixWorld(data.points.map(anyPositionToVector3), this.boxMesh) : undefined,\n heightPoint: data.heightPoint ? this.applyObjectReversalMatrixWorld(anyPositionToVector3(data.heightPoint), this.boxMesh) : undefined,\n })\n this.boxMesh.setStyle(data.style)\n if (this._editor) this._editor.initialHelperMatrix()\n }\n\n public highlight() {\n this.boxMesh?.highlight()\n }\n\n public unhighlight() {\n this.boxMesh?.unhighlight()\n }\n\n public async create(params?: BoxCreateConfig) {\n this.removeChildren()\n\n this.boxMesh = new BoxMesh(params)\n this.add(this.boxMesh)\n\n await createBox(this.boxMesh, this.pointSelector, params)\n\n if (this.config.defaultAction) this.editor.enable()\n }\n\n /**\n * 获取盒子在世界坐标中的6个面的几何信息\n * 返回顺序:bottom、top、side0~side3(自底面第0点起顺时针)\n */\n public getWorldFacesGeometry(): Array<{\n name: 'bottom' | 'top' | `side${number}`\n vertices: THREE.Vector3[]\n center: THREE.Vector3\n normal: THREE.Vector3\n }> {\n if (!this.boxMesh) return []\n\n // 获取世界坐标下的底面与顶面四点\n const bottom = this.applyObjectMatrixWorld(this.boxMesh.bottomPositions, this.boxMesh)\n const top = this.applyObjectMatrixWorld(this.boxMesh.topPositions, this.boxMesh)\n\n if (!bottom || !top || bottom.length !== 4 || top.length !== 4) return []\n\n const faces: Array<{\n name: 'bottom' | 'top' | `side${number}`\n vertices: THREE.Vector3[]\n center: THREE.Vector3\n normal: THREE.Vector3\n }> = []\n\n const buildFace = (name: 'bottom' | 'top' | `side${number}`, vertices: THREE.Vector3[]) => {\n const normal = new THREE.Triangle(vertices[0], vertices[1], vertices[2]).getNormal(new THREE.Vector3())\n const center = centerPoint(...vertices)\n faces.push({ name, vertices, center, normal })\n }\n\n // 底面与顶面(保持输入顺序)\n buildFace('bottom', [bottom[0], bottom[1], bottom[2], bottom[3]])\n buildFace('top', [top[0], top[1], top[2], top[3]])\n\n // 四个侧面:bi -> b(i+1) -> t(i+1) -> ti\n for (let i = 0; i < 4; i++) {\n const ni = (i + 1) % 4\n buildFace(`side${i}`, [bottom[i], bottom[ni], top[ni], top[i]])\n }\n\n return faces\n }\n}\n\nexport async function createBox(boxMesh: BoxMesh, pointSelector: PointSelector, config?: BoxCreateConfig) {\n return new Promise<void>(async (resolve, reject) => {\n const container = boxMesh.parent\n if (!container) {\n reject(new Error('No container'))\n return\n }\n\n const bottomRectangle = new RectangleWithEdgeMesh(boxMesh.style)\n container.add(bottomRectangle)\n // 传递 onPointPlaced 到 createRectangle,用于底面矩形的点放置回调\n await createRectangle(bottomRectangle, pointSelector, {\n ...config,\n onPointPlaced: () => {\n config?.onPointPlaced?.()\n }\n })\n container.remove(bottomRectangle)\n\n boxMesh.setPoints({ points: bottomRectangle.points })\n\n const lineHelper = new LineMesh()\n const normal = getNormal(boxMesh.bottomPositions)\n const lineCenterPoint = centerPoint(...boxMesh.bottomPositions)\n const startPoint = lineCenterPoint.clone().add(normal.clone().multiplyScalar(100))\n const endPoint = lineCenterPoint.clone().sub(normal.clone().multiplyScalar(100))\n lineHelper.setPoints([startPoint, endPoint])\n\n container.add(lineHelper)\n\n pointSelector.enable()\n\n // 选点处理函数\n const onSelect = (intersection: PointIntersection) => {\n // 触发 onPointPlaced 回调\n config?.onPointPlaced?.()\n\n selectEnd()\n resolve()\n }\n\n // 预览\n const onPreview = (intersection: PointIntersection) => {\n if (!intersection?.raycaster) return\n\n const pointOnLineHelper = rayOnLine({\n raycaster: intersection.raycaster,\n line: new THREE.Line3(startPoint, endPoint),\n })\n\n if (pointOnLineHelper) {\n const offset = pointOnLineHelper.clone().sub(lineCenterPoint)\n boxMesh.setPoints({ heightPoint: boxMesh.bottomPositions[0].clone().add(offset) })\n }\n }\n\n const selectEnd = () => {\n pointSelector.off('select', onSelect)\n pointSelector.off('intersectionUpdate', onPreview)\n pointSelector.off('disable', cancel)\n pointSelector.disable()\n container?.remove(lineHelper)\n }\n\n const cancel = () => {\n selectEnd()\n container?.remove(boxMesh)\n reject(new Error('Cancelled'))\n }\n\n pointSelector.on('select', onSelect)\n pointSelector.on('intersectionUpdate', onPreview)\n pointSelector.on('disable', cancel)\n })\n}\n","import type { SculptModules } from '../../utils/Modules/Global'\nimport { BaseObject, type BaseImportData, type BaseObjectConfig } from '../Base'\nimport * as THREE from 'three/webgpu'\nimport type { PointIntersection } from '../../../shared-utils'\nimport { PolylineWithDotsMesh } from '../../Meshes/Polyline'\n\nimport type { AdherePoint, PointSelector } from '../../../shared-utils/three/PointSelector'\nimport { RectangleMeshEditor } from '../../Editors/RectangleMeshEditor'\nimport { RectangleMesh, type RectangleData } from '../../Meshes/Rectangle'\nimport { RectangleWithEdgeMesh, type RectangleWithEdgeMeshStyle } from '../../Meshes/RectangleWithEdge'\nimport type { LiteralString } from '../../../typings/utils.type'\nimport type { DrawMethodConfig, CreateLimitConfig } from '../../typings/style'\nimport { sortPositionsByCameraPosition } from '../../utils/sortPositionsByCameraPosition'\nimport { Sculpt } from '../..'\nimport vector3ToArray from '../../../shared-utils/three/vector3ToArray'\nimport { anyPositionToVector3 } from '../../../shared-utils/positionToVector3'\nimport { withResolvers } from '../../../shared-utils/promise/withResolvers'\nimport type { Five } from '@realsee/five-webgpu'\nimport { PolygonMesh } from '../../Meshes/Polygon'\nimport getNormal from '../../../shared-utils/three/getNormal'\n\nexport interface RectangleImportData extends BaseImportData, RectangleData {\n type: LiteralString<'Rectangle'>\n style?: Partial<RectangleWithEdgeMeshStyle>\n}\n\nexport type RectangleCreateConfig = Partial<RectangleWithEdgeMeshStyle & CreateLimitConfig & DrawMethodConfig> & {\n onPointPlaced?: () => void\n}\n\nexport class Rectangle extends BaseObject<RectangleImportData> {\n public readonly type = 'Rectangle'\n public rectangleMesh: RectangleWithEdgeMesh\n\n public get editor() {\n if (!this._editor) {\n this._editor = new RectangleMeshEditor(this.rectangleMesh)\n }\n return this._editor\n }\n\n public _editor: RectangleMeshEditor\n\n public get data() {\n return {\n ...this.baseData,\n points: vector3ToArray(this.applyObjectMatrixWorld(this.rectangleMesh.points, this.rectangleMesh)),\n style: {\n color: this.rectangleMesh.color.getHex(),\n opacity: this.rectangleMesh.opacity,\n lineWidth: this.rectangleMesh.lineWidth,\n lineColor: this.rectangleMesh.lineColor.getHex(),\n },\n }\n }\n\n public constructor(modules: SculptModules, data?: RectangleImportData, config?: Partial<BaseObjectConfig>) {\n super(modules, data, config)\n\n if (data) {\n this.rectangleMesh = new RectangleWithEdgeMesh({ ...data.style, ...data })\n this.add(this.rectangleMesh)\n }\n }\n\n public setData(data: Partial<RectangleImportData>): void {\n if (data.points)\n this.rectangleMesh.setPoints(this.applyObjectReversalMatrixWorld(data.points.map(anyPositionToVector3), this.rectangleMesh))\n this.rectangleMesh.setStyle(data.style)\n if (this._editor) this._editor.initialHelperMatrix()\n }\n\n public highlight() {\n this.rectangleMesh?.highlight()\n }\n\n public unhighlight() {\n this.rectangleMesh?.unhighlight()\n }\n\n public async create(config?: RectangleCreateConfig) {\n this.removeChildren()\n\n const rectangleMesh = new RectangleWithEdgeMesh(config)\n this.rectangleMesh = rectangleMesh\n this.add(this.rectangleMesh)\n\n await createRectangle(this.rectangleMesh, this.pointSelector, config)\n\n if (this.config.defaultAction) this.editor.enable()\n }\n}\n\n/**\n * @description 创建矩形\n */\nexport function createRectangle(\n rectangleMesh: RectangleMesh,\n pointSelector: PointSelector,\n config?: RectangleCreateConfig,\n) {\n const drawMethod = config?.drawMethod ?? 'diagonal'\n\n return drawMethod === 'diagonal'\n ? createRectangleByDiagonal(rectangleMesh, pointSelector, config)\n : createRectangleByVertex(rectangleMesh, pointSelector, config)\n}\n\nfunction getAllSculptPoints(five: Five, params?: { excludes?: THREE.Object3D[] }) {\n const points = []\n five.scene.traverse((object) => {\n if (!object.visible) return\n if (params?.excludes?.includes(object)) return\n if (object instanceof RectangleMesh || object instanceof PolygonMesh) {\n const p = object.points.map((point) => {\n const _p = point.clone() as AdherePoint\n _p.normal = object.normal.clone()\n if (object.style.occlusionVisibility) {\n _p.IsAlwaysVisible = true\n }\n return _p\n })\n points.push(...p)\n }\n })\n\n return points\n}\n\n/**\n * @description 对角线创建矩形(两步)\n */\nexport function createRectangleByDiagonal(rectangleMesh: RectangleMesh, pointSelector: PointSelector, config?: RectangleCreateConfig) {\n const { promise, reject, resolve } = withResolvers<void>()\n const container = rectangleMesh.parent\n if (!container) return reject(new Error('No container'))\n\n const limit = config?.limit ?? 'none'\n\n const previewLine = new PolylineWithDotsMesh({ ...rectangleMesh.style, dashed: true }) // 预览线\n const verticalLine = new PolylineWithDotsMesh({ ...rectangleMesh.style, dashed: true, lengthEnable: false }) // 垂直辅助线\n const tempLine = new PolylineWithDotsMesh({ ...rectangleMesh.style, dashed: false, lengthEnable: false }) // 对角线 或 边线,在无法绘制出矩形时,用于辅助绘制\n\n container.add(previewLine, tempLine, verticalLine)\n\n pointSelector.enable()\n\n const points: THREE.Vector3[] = []\n\n let previewPoint: THREE.Vector3 = new THREE.Vector3()\n let normalIfNeed: THREE.Vector3 = new THREE.Vector3()\n const plane = new THREE.Plane()\n\n // 选点处理函数\n const onSelect = () => {\n points.push(previewPoint.clone())\n config?.onPointPlaced?.()\n\n if (points.length === 1) {\n if (limit === 'xoz') plane.setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), points[0])\n if (limit === 'none') plane.setFromNormalAndCoplanarPoint(normalIfNeed, points[0])\n } else if (points.length === 2) {\n if (limit === 'y' || limit === 'xoz') {\n // 锁定平面时面画矩形两个点就可以了\n selectEnd()\n resolve()\n } else {\n tempLine.setPoints([points[0], points[1]])\n }\n } else if (points.length === 3) {\n selectEnd()\n resolve()\n }\n }\n\n // 预览\n const onPreview = (intersection: PointIntersection) => {\n if (!intersection?.raycaster) return\n\n const lastPoint = points.at(-1)?.clone()\n\n if (points.length === 0) {\n // 确认平面\n previewPoint = intersection.point.clone()\n normalIfNeed = intersection.face?.normal\n return\n }\n\n if (points.length === 1 && limit === 'y') {\n const rectangleLine = new THREE.Line3(new THREE.Vector3(0, 1, 0).add(points[0]), new THREE.Vector3(0, -1, 0).add(points[0]))\n const pointOnLine = rectangleLine.closestPointToPoint(intersection.point, false, new THREE.Vector3())\n rectangleMesh.setPoints([points[0], pointOnLine, intersection.point])\n return\n }\n\n if (points.length === 1 && limit === 'xoz') {\n const rectangleLine = new THREE.Line3(new THREE.Vector3(1, 0, 0).add(points[0]), new THREE.Vector3(-1, 0, 0).add(points[0]))\n const pointOnPlane = intersection.raycaster.ray.intersectPlane(plane, new THREE.Vector3())\n const pointOnLine = rectangleLine.closestPointToPoint(pointOnPlane, false, new THREE.Vector3())\n rectangleMesh.setPoints([points[0], pointOnLine, pointOnPlane])\n return\n }\n\n if (points.length === 1 && limit === 'none') {\n // 画出第一条线,是对角线\n if (plane) {\n previewPoint = intersection.raycaster.ray.intersectPlane(plane, new THREE.Vector3())\n verticalLine.setPoints([previewPoint, intersection.point])\n } else {\n previewPoint = intersection.point.clone()\n }\n previewLine.setPoints([lastPoint, previewPoint])\n return\n }\n\n if (points.length === 2 && limit === 'none') {\n container.remove(previewLine)\n const pointOnPlane = intersection.raycaster.ray.intersectPlane(plane, new THREE.Vector3())\n // 确定第3个点,与对角线构成直角三角形\n const radius = points[0].distanceTo(points[1]) / 2\n const center = new THREE.Vector3().lerpVectors(points[0], points[1], 0.5)\n const normal = new THREE.Vector3().subVectors(pointOnPlane, center).normalize()\n previewPoint = new THREE.Vector3().addVectors(center, normal.multiplyScalar(radius))\n\n const rectanglePoints = [points[0], previewPoint, points[1]]\n const sortedPoints = sortPositionsByCameraPosition(rectanglePoints, pointSelector.five.camera.position)\n rectangleMesh.setPoints(sortedPoints)\n return\n }\n }\n\n const selectEnd = () => {\n pointSelector.off('select', onSelect)\n pointSelector.off('intersectionUpdate', onPreview)\n pointSelector.off('disable', cancel)\n pointSelector.disable()\n container?.remove(previewLine, tempLine, verticalLine)\n }\n\n const cancel = () => {\n selectEnd()\n container?.remove(rectangleMesh)\n reject(new Error('Cancelled'))\n }\n\n pointSelector.on('select', onSelect)\n pointSelector.on('intersectionUpdate', onPreview)\n pointSelector.on('disable', cancel)\n\n return promise\n}\n\n/**\n * @description 正常创建矩形(三步)\n */\nexport function createRectangleByVertex(rectangleMesh: RectangleMesh, pointSelector: PointSelector, config?: RectangleCreateConfig) {\n const { promise, reject, resolve } = withResolvers<void>()\n const container = rectangleMesh.parent\n if (!container) return reject(new Error('No container'))\n\n const limit = config?.limit ?? 'none'\n\n const previewLine = new PolylineWithDotsMesh({ ...rectangleMesh.style, dashed: true }) // 预览线\n const verticalLine = new PolylineWithDotsMesh({ ...rectangleMesh.style, dashed: true, lengthEnable: false }) // 垂直辅助线\n const tempLine = new PolylineWithDotsMesh({ ...rectangleMesh.style, dashed: false, lengthEnable: false }) // 对角线 或 边线,在无法绘制出矩形时,用于辅助绘制\n\n container.add(previewLine, tempLine, verticalLine)\n\n pointSelector.enable()\n pointSelector.setAdherePoints(getAllSculptPoints(pointSelector.five, { excludes: [rectangleMesh] }))\n\n const points: THREE.Vector3[] = []\n\n let previewPoint: THREE.Vector3 = new THREE.Vector3()\n let normalIfNeed: THREE.Vector3 = new THREE.Vector3()\n const plane = new THREE.Plane()\n\n // 选点处理函数\n const onSelect = () => {\n points.push(previewPoint.clone())\n config?.onPointPlaced?.()\n\n if (points.length === 1) {\n pointSelector.planeMode = 'onlyPlane'\n\n if (limit === 'y') {\n pointSelector.adhereLine = [new THREE.Line3(points[0], new THREE.Vector3(0, 1, 0).add(points[0]))]\n }\n\n if (limit === 'xoz') {\n plane.setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), points[0])\n pointSelector.plane = plane\n }\n if (limit === 'none') {\n plane.setFromNormalAndCoplanarPoint(normalIfNeed, points[0])\n pointSelector.plane = plane\n }\n } else if (points.length === 2) {\n pointSelector.planeMode = 'vertical'\n\n if (limit === 'y') {\n pointSelector.adhereLine = []\n }\n\n let lineIsVertical = false\n if (points[0].x === points[1].x && points[0].z === points[1].z) {\n lineIsVertical = true\n }\n if (limit === 'y' && !lineIsVertical) {\n plane.setFromCoplanarPoints(points[0], points[1], new THREE.Vector3(0, 1, 0).add(points[0]))\n pointSelector.plane = plane\n }\n\n tempLine.setPoints([points[0], points[1]])\n } else if (points.length === 3) {\n selectEnd()\n resolve()\n }\n }\n\n // 预览\n const onPreview = (intersection: PointIntersection) => {\n if (!intersection) return\n if (!intersection?.raycaster) return\n\n const lastPoint = points.at(-1)?.clone()\n\n if (points.length === 0) {\n // 确认平面\n previewPoint = intersection.point.clone()\n normalIfNeed = intersection.face?.normal\n return\n }\n\n if (points.length === 1) {\n // 画出矩形第一条边\n previewPoint = intersection.point\n verticalLine.setPoints([intersection.originalPoint ?? intersection.point, intersection.point])\n previewLine.setPoints([lastPoint, previewPoint])\n return\n }\n\n if (points.length === 2) {\n if (!pointSelector.plane) {\n const normal = getNormal([points[0], points[1], intersection.point])\n plane.setFromNormalAndCoplanarPoint(normal, points[0])\n }\n\n verticalLine.setPoints([intersection.originalPoint ?? intersection.point, intersection.point])\n // 确定第3个点\n const lineDirection = new THREE.Vector3().crossVectors(points[0].clone().sub(points[1]), plane.normal).normalize() // 点1 -> 点2 的线的方向(矩形的第一条边)\n const rectangleLine = new THREE.Line3(points[1].clone().add(lineDirection), points[1].clone().sub(lineDirection)) // 矩形的第二条边\n previewPoint = rectangleLine.closestPointToPoint(intersection.point, false, new THREE.Vector3())\n const rectanglePoints = [points[0], points[1], previewPoint]\n const sortedPoints = sortPositionsByCameraPosition(rectanglePoints, pointSelector.five.camera.position)\n rectangleMesh.setPoints(sortedPoints)\n return\n }\n }\n\n const selectEnd = () => {\n pointSelector.setAdherePoints([])\n pointSelector.adhereLine = []\n pointSelector.adherePlane = []\n pointSelector.plane = undefined\n\n pointSelector.off('select', onSelect)\n pointSelector.off('intersectionUpdate', onPreview)\n pointSelector.off('disable', cancel)\n pointSelector.disable()\n container?.remove(previewLine, tempLine, verticalLine)\n }\n\n const cancel = () => {\n selectEnd()\n container?.remove(rectangleMesh)\n reject(new Error('Cancelled'))\n }\n\n pointSelector.on('select', onSelect)\n pointSelector.on('intersectionUpdate', onPreview)\n pointSelector.on('disable', cancel)\n\n return promise\n}\n"],"mappings":"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"}
@@ -2,19 +2,19 @@ import { r as e, t } from "./rolldown-runtime-B0aSnxlc.js";
2
2
  import { n } from "./loadTexture-CJ3EbTXw.js";
3
3
  import { t as r } from "./transformPosition-Cc92Wf0o.js";
4
4
  import { t as i } from "./Subscribe-DLlAl88n.js";
5
- import { t as a } from "./fiveModelLoad-mg-TnpnM.js";
5
+ import { n as a } from "./fiveModelLoad-BUIBYxzp.js";
6
6
  import { i as o } from "./util-vGeVT4oo.js";
7
- import { a as s, i as c, t as l } from "./blink-DD_0mH-m.js";
7
+ import { m as s, p as c, u as l } from "./tagPosition-DA9YguT8.js";
8
8
  import { t as u } from "./vectorToCoordinate-DIOgfeEi.js";
9
9
  import { n as d } from "./isNil-CQNA0Sbe.js";
10
10
  import { t as f } from "./uuid-BfVaI9vM.js";
11
- import { a as p, o as m } from "./defaultUrls-CjKkS9k9.js";
12
- import { i as h, r as g, t as _ } from "./changeMode-BVGYCoqu.js";
13
- import { t as v } from "./BetterTween-BX0aTvP1.js";
11
+ import { o as p, s as m } from "./defaultUrls-CfMtGzqM.js";
12
+ import { i as h, r as g, t as _ } from "./changeMode-D_I2AOjH.js";
13
+ import { t as v } from "./BetterTween-DmptqE8m.js";
14
14
  import { t as y } from "./equal-BiDAilPV.js";
15
- import { t as b } from "./controller-BWkZT0l1.js";
16
- import { t as x } from "./BasePlugin-CT5K8m36.js";
17
- import { t as S } from "./BasePluginWithData-9z4tpAT4.js";
15
+ import { t as b } from "./controller-DIDtFrBE.js";
16
+ import { t as x } from "./BasePlugin-DC5m72La.js";
17
+ import { t as S } from "./BasePluginWithData-D_0W46_q.js";
18
18
  import { C, G as w, J as T, K as E, M as D, P as O, Q as k, R as ee, U as A, W as te, X as j, Y as M, it as ne, j as N, n as P, o as re, ot as ie, p as F, rt as ae, st as I, t as L, z as R } from "./component.svelte-D5LYqt50.js";
19
19
  import { i as z, n as oe, r as se, t as ce } from "./fontSize-DMhRSrtx.js";
20
20
  import { n as le } from "./safeObj-ic96Cf8D.js";
@@ -1634,4 +1634,4 @@ var $ = class extends J {
1634
1634
  //#endregion
1635
1635
  export { W as a, X as i, Ve as n, Q as r, $ as t };
1636
1636
 
1637
- //# sourceMappingURL=Work-DF8j5GnL.js.map
1637
+ //# sourceMappingURL=Work-BE4AgdwH.js.map