@galacean/effects-plugin-editor-gizmo 2.10.3 → 2.11.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -5
- package/dist/2d/configs/builtin-configs.d.ts +14 -0
- package/dist/2d/configs/config-definition.d.ts +40 -0
- package/dist/2d/configs/config-manager.d.ts +52 -0
- package/dist/2d/configs/index.d.ts +6 -0
- package/dist/2d/configs/loading-config.d.ts +3 -0
- package/dist/2d/configs/types.d.ts +321 -0
- package/dist/2d/cursor-icons.d.ts +8 -0
- package/dist/2d/cursor.d.ts +36 -0
- package/dist/2d/drag-threshold.d.ts +13 -0
- package/dist/2d/drawing.d.ts +148 -0
- package/dist/2d/frame/frame-assisted-layout.d.ts +115 -0
- package/dist/2d/frame/frame-auto-layout.d.ts +47 -0
- package/dist/2d/frame/frame-manager.d.ts +169 -0
- package/dist/2d/frame/frame-resize.d.ts +13 -0
- package/dist/2d/frame/index.d.ts +5 -0
- package/dist/2d/frame/layout-calculations.d.ts +109 -0
- package/dist/2d/frame/types.d.ts +41 -0
- package/dist/2d/gesture-handler.d.ts +253 -0
- package/dist/2d/gizmo-action.d.ts +159 -0
- package/dist/2d/gizmo-manager.d.ts +105 -0
- package/dist/2d/gizmo-owner.d.ts +65 -0
- package/dist/2d/gizmo-tool.d.ts +15 -0
- package/dist/2d/gizmo-tools/hand-gizmo-tool.d.ts +4 -0
- package/dist/2d/gizmo-tools/image-cut-gizmo-tool.d.ts +7 -0
- package/dist/2d/gizmo-tools/image-expand-gizmo-tool.d.ts +7 -0
- package/dist/2d/gizmo-tools/index.d.ts +7 -0
- package/dist/2d/gizmo-tools/item-create-gizmo-tool.d.ts +10 -0
- package/dist/2d/gizmo-tools/mask-gizmo-tool.d.ts +7 -0
- package/dist/2d/gizmo-tools/move-gizmo-tool.d.ts +6 -0
- package/dist/2d/gizmo-tools/sprite-text-edit-gizmo-tool.d.ts +7 -0
- package/dist/2d/gizmo-type.d.ts +37 -0
- package/dist/2d/gizmo.d.ts +60 -0
- package/dist/2d/gizmos/box-selection-gizmo.d.ts +67 -0
- package/dist/2d/gizmos/change-selection-gizmo.d.ts +45 -0
- package/dist/2d/gizmos/click-drag-multiplex-gizmo.d.ts +95 -0
- package/dist/2d/gizmos/corner-rotation-gizmo.d.ts +101 -0
- package/dist/2d/gizmos/enter-edit-mode-gizmo.d.ts +11 -0
- package/dist/2d/gizmos/hand-gizmo.d.ts +67 -0
- package/dist/2d/gizmos/icon-gizmo.d.ts +107 -0
- package/dist/2d/gizmos/image-cut-gizmo.d.ts +140 -0
- package/dist/2d/gizmos/image-expand-gizmo.d.ts +135 -0
- package/dist/2d/gizmos/image-interaction.d.ts +40 -0
- package/dist/2d/gizmos/item-create-gizmo.d.ts +146 -0
- package/dist/2d/gizmos/leave-effects-edit-gizmo.d.ts +11 -0
- package/dist/2d/gizmos/leave-text-edit-gizmo.d.ts +11 -0
- package/dist/2d/gizmos/loading-gizmo.d.ts +110 -0
- package/dist/2d/gizmos/loading-manager.d.ts +74 -0
- package/dist/2d/gizmos/mask-gizmo.d.ts +153 -0
- package/dist/2d/gizmos/move-selection-gizmo.d.ts +64 -0
- package/dist/2d/gizmos/resize-selection-gizmo/anchored-resize.d.ts +40 -0
- package/dist/2d/gizmos/resize-selection-gizmo/index.d.ts +2 -0
- package/dist/2d/gizmos/resize-selection-gizmo/resize-selection-gizmo.d.ts +364 -0
- package/dist/2d/gizmos/resize-selection-gizmo/transform-types.d.ts +27 -0
- package/dist/2d/gizmos/select-text-gizmo.d.ts +77 -0
- package/dist/2d/gizmos/sprite-text-edit-gizmo.d.ts +149 -0
- package/dist/2d/gizmos/text-gizmo.d.ts +65 -0
- package/dist/2d/gizmos/viewport-overlay-gizmo.d.ts +66 -0
- package/dist/2d/index.d.ts +44 -0
- package/dist/2d/items/default-vfx-items.d.ts +45 -0
- package/dist/2d/items/index.d.ts +6 -0
- package/dist/2d/items/item-geometry.d.ts +69 -0
- package/dist/2d/items/item-hierarchy.d.ts +39 -0
- package/dist/2d/items/item-predicates.d.ts +31 -0
- package/dist/2d/items/media-controls.d.ts +39 -0
- package/dist/2d/items/vfx-item-factory.d.ts +13 -0
- package/dist/2d/math/core.d.ts +26 -0
- package/dist/2d/math/geometry.d.ts +83 -0
- package/dist/2d/math/index.d.ts +4 -0
- package/dist/2d/math/ray-caster.d.ts +56 -0
- package/dist/2d/math/utils.d.ts +6 -0
- package/dist/2d/modes/default-selection-mode.d.ts +19 -0
- package/dist/2d/modes/edit-mode.d.ts +18 -0
- package/dist/2d/modes/effects-edit-mode.d.ts +34 -0
- package/dist/2d/modes/index.d.ts +4 -0
- package/dist/2d/modes/text-edit-mode.d.ts +34 -0
- package/dist/2d/selection/create-selection-interaction-gizmo.d.ts +14 -0
- package/dist/2d/selection/index.d.ts +3 -0
- package/dist/2d/selection/selection.d.ts +338 -0
- package/dist/2d/selection/snap-manager.d.ts +130 -0
- package/dist/2d/text/index.d.ts +2 -0
- package/dist/2d/text/text-caret-mapper.d.ts +61 -0
- package/dist/2d/text/text-edit-session.d.ts +169 -0
- package/dist/2d/viewport/coordinates.d.ts +89 -0
- package/dist/2d/viewport/gizmo-viewport.d.ts +108 -0
- package/dist/2d/viewport/index.d.ts +6 -0
- package/dist/2d/viewport/types.d.ts +11 -0
- package/dist/2d/viewport/viewport-navigation-controller.d.ts +110 -0
- package/dist/2d/viewport/viewport-operations.d.ts +15 -0
- package/dist/2d/viewport/viewport-range.d.ts +9 -0
- package/dist/2d/viewport/viewport-utils.d.ts +32 -0
- package/dist/{gizmo-component.d.ts → 3d/gizmo-component.d.ts} +3 -5
- package/dist/3d/index.d.ts +4 -0
- package/dist/index.d.ts +2 -5
- package/dist/index.js +15030 -171
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +2 -2
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +14871 -173
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -3
- /package/dist/{constants.d.ts → 3d/constants.d.ts} +0 -0
- /package/dist/{define.d.ts → 3d/define.d.ts} +0 -0
- /package/dist/{geometry → 3d/geometry}/box.d.ts +0 -0
- /package/dist/{geometry → 3d/geometry}/cone.d.ts +0 -0
- /package/dist/{geometry → 3d/geometry}/cylinder.d.ts +0 -0
- /package/dist/{geometry → 3d/geometry}/direction-light.d.ts +0 -0
- /package/dist/{geometry → 3d/geometry}/floor-line-edge.d.ts +0 -0
- /package/dist/{geometry → 3d/geometry}/floor-line.d.ts +0 -0
- /package/dist/{geometry → 3d/geometry}/frustum.d.ts +0 -0
- /package/dist/{geometry → 3d/geometry}/geometry.d.ts +0 -0
- /package/dist/{geometry → 3d/geometry}/index.d.ts +0 -0
- /package/dist/{geometry → 3d/geometry}/plane.d.ts +0 -0
- /package/dist/{geometry → 3d/geometry}/point-light.d.ts +0 -0
- /package/dist/{geometry → 3d/geometry}/sphere.d.ts +0 -0
- /package/dist/{geometry → 3d/geometry}/spot-light.d.ts +0 -0
- /package/dist/{geometry → 3d/geometry}/torus.d.ts +0 -0
- /package/dist/{gizmo-loader.d.ts → 3d/gizmo-loader.d.ts} +0 -0
- /package/dist/{gizmo-vfx-item.d.ts → 3d/gizmo-vfx-item.d.ts} +0 -0
- /package/dist/{math-utils.d.ts → 3d/math-utils.d.ts} +0 -0
- /package/dist/{mesh.d.ts → 3d/mesh.d.ts} +0 -0
- /package/dist/{raycast.d.ts → 3d/raycast.d.ts} +0 -0
- /package/dist/{shape.d.ts → 3d/shape.d.ts} +0 -0
- /package/dist/{util.d.ts → 3d/util.d.ts} +0 -0
- /package/dist/{wireframe.d.ts → 3d/wireframe.d.ts} +0 -0
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.min.js","sources":["../src/define.ts","../src/gizmo-vfx-item.ts","../src/geometry/index.ts","../src/wireframe.ts","../src/gizmo-component.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_async_to_generator.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_set_prototype_of.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_inherits.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_is_native_reflect_construct.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_construct.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_get_prototype_of.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_wrap_native_super.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_is_native_function.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_array_like_to_array.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_create_for_of_iterator_helper_loose.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_unsupported_iterable_to_array.js","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs","../src/constants.ts","../src/util.ts","../src/math-utils.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_extends.js","../src/geometry/geometry.ts","../src/geometry/sphere.ts","../src/geometry/box.ts","../src/geometry/cylinder.ts","../src/geometry/cone.ts","../src/geometry/torus.ts","../src/geometry/plane.ts","../src/geometry/frustum.ts","../src/geometry/direction-light.ts","../src/geometry/point-light.ts","../src/geometry/spot-light.ts","../src/geometry/floor-line-edge.ts","../src/mesh.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_instanceof.js","../src/raycast.ts","../src/shape.ts","../src/gizmo-loader.ts","../src/index.ts"],"sourcesContent":["import type { GeometryDrawMode, spec } from '@galacean/effects';\n\nexport interface GizmoVFXItemOptions {\n target: string,\n subType: GizmoSubType,\n renderMode?: GeometryDrawMode,\n type: 'editor-gizmo',\n color: spec.vec3,\n size?: number,\n depthTest?: boolean,\n}\n\nexport const GizmoVFXItemType = 'gizmo' as spec.ItemType;\n\n/**\n * Gizmo 类型\n */\nexport enum GizmoSubType {\n particleEmitter = 1,\n modelWireframe = 2,\n box,\n sphere,\n cylinder,\n cone,\n torus,\n sprite,\n plane,\n rotation,\n translation,\n scale,\n viewHelper,\n camera,\n frustum,\n light,\n directionLight,\n pointLight,\n spotLight,\n boundingBox,\n floorGrid,\n}\n","import { math } from '@galacean/effects';\n\nexport type Ray = math.Ray;\nexport type TriangleLike = math.TriangleLike;\ntype Vector3 = math.Vector3;\n\nconst { Vector3, Ray } = math;\n\n/**\n * 包围盒类型\n */\nexport enum BoundingType {\n box,\n sphere,\n triangle,\n line\n}\n\n/**\n * 线条包围盒类型\n */\nexport interface GizmoItemBoundingLine {\n type: BoundingType.line,\n // 线条包围盒两端点\n points: [Vector3, Vector3],\n // 射线与线条距离阈值\n width: number,\n}\n\n/**\n * 立方体包围盒类型\n */\nexport interface GizmoItemBoundingBox {\n type: BoundingType.box,\n //包围形状相对于元素位置的偏移,默认[0,0,0]\n center?: Vector3,\n //包围盒的xyz长度,当type为box时生效\n size: Vector3,\n}\n\n/**\n * 球体包围盒类型\n */\nexport interface GizmoItemBoundingSphere {\n type: BoundingType.sphere,\n //包围形状相对于元素位置的偏移,默认[0,0,0]\n center?: Vector3,\n //包围球的半径,当type为sphere时生效\n radius: number,\n}\n\n/**\n * 三角数组包围盒类型\n */\nexport interface GizmoItemBoundingTriangle {\n type: BoundingType.triangle,\n triangles: TriangleLike[],\n backfaceCulling?: boolean,\n}\n\nexport type GizmoItemBounding =\n | GizmoItemBoundingBox\n | GizmoItemBoundingSphere\n | GizmoItemBoundingTriangle\n | GizmoItemBoundingLine\n ;\n","import type { Engine, GeometryDrawMode, spec } from '@galacean/effects';\nimport { Geometry } from '@galacean/effects';\nimport { SphereGeometryData } from './sphere';\nimport { BoxGeometryData } from './box';\nimport type { GeometryData } from './geometry';\nimport { CylinderGeometryData } from './cylinder';\nimport { ConeGeometryData } from './cone';\nimport { TorusGeometryData } from './torus';\nimport { PlaneGeometryData } from './plane';\nimport { FrustumGeometryData } from './frustum';\nimport { DirectionLightData } from './direction-light';\nimport { PointLightData } from './point-light';\nimport { SpotLightData } from './spot-light';\nimport { FloorLineEdgeGeometryData } from './floor-line-edge';\n\n/**\n * 几何体类型\n */\nexport enum GeometryType {\n Box,\n Sphere,\n Cylinder,\n Cone,\n Torus,\n Frustum,\n Sprite,\n Plane,\n DirectionLight,\n SpotLight,\n PointLight,\n FloorGrid,\n}\n\n/**\n * 几何体参数\n */\nexport interface MeshOption {\n size: any,\n color?: spec.vec3,\n renderMode: GeometryDrawMode,\n depthTest?: boolean,\n name?: string,\n alpha?: number,\n}\n\n/**\n * 合并多个几何体数据\n * @param geometries - 几何体数据数组\n * @returns 合并后的几何体数据\n */\n// export function combineGeometries (geometries: GeometryData[]): GeometryData {\n// const points: number[] = [];\n// const indices: number[] = [];\n// const uvs: number[] = [];\n// const normals: number[] = [];\n\n// for (let i = 0, indicesBase = 0; i < geometries.length; i++) {\n// const geometryData = geometries[i];\n// if (geometryData) {\n// points.push(...geometryData.points);\n// uvs.push(...geometryData.uvs);\n// normals.push(...geometryData.normals);\n// geometryData.indices.forEach(index => indices.push(index + indicesBase));\n// indicesBase += geometryData.points.length;\n// }\n// }\n\n// return {\n// points,\n// indices,\n// uvs,\n// normals,\n// };\n// }\n\n/**\n * 创建几何体对象\n * @param type - 几何体类型\n * @param size - 几何体尺寸\n * @param renderMode - 绘制模式:`gl.TRIANGLES`、`gl.LINES`\n * @returns\n */\nexport function createGeometry (engine: Engine, type: GeometryType, size: Record<string, any>, renderMode?: GeometryDrawMode): Geometry {\n let geometryData: GeometryData;\n\n switch (type) {\n case GeometryType.Sphere:\n geometryData = new SphereGeometryData(size.radius, size.widthSegments, size.heightSegments);\n\n break;\n case GeometryType.Cylinder:\n geometryData = new CylinderGeometryData(size.radius, size.radius, size.height);\n\n break;\n case GeometryType.Cone:\n geometryData = new ConeGeometryData(size.radius, size.height);\n\n break;\n case GeometryType.Torus:\n geometryData = new TorusGeometryData(size.radius, size.tube, size.radialSegments, size.tubularSegments, size.arc);\n\n break;\n case GeometryType.Sprite:\n case GeometryType.Plane:\n geometryData = new PlaneGeometryData(size.width, size.height);\n\n break;\n case GeometryType.Frustum:\n geometryData = new FrustumGeometryData(size.position, size.rotation, size.fov, size.aspect, size.near, size.far);\n\n break;\n case GeometryType.DirectionLight:\n geometryData = new DirectionLightData(size.radius, size.length, size.segments4, size.linesNumber, size.thetaStart, size.thetaLength);\n\n break;\n case GeometryType.PointLight:\n geometryData = new PointLightData(size.range, size.segments, size.thetaStart, size.thetaLength);\n\n break;\n case GeometryType.SpotLight:\n geometryData = new SpotLightData(size.range, size.spotAngle, size.segments, size.thetaStart, size.thetaLength);\n\n break;\n case GeometryType.FloorGrid:\n geometryData = new FloorLineEdgeGeometryData(size.sideLength, size.parts);\n\n break;\n default:\n geometryData = new BoxGeometryData(size.width, size.height, size.depth);\n\n break;\n }\n const result = Geometry.create(\n engine,\n {\n attributes: {\n a_Position: {\n size: 3,\n data: new Float32Array(geometryData.points),\n },\n a_Normal: {\n size: 3,\n data: new Float32Array(geometryData.normals),\n },\n a_UV1: {\n size: 2,\n data: new Float32Array(geometryData.uvs),\n },\n },\n indices: {\n data: new Uint16Array(geometryData.indices),\n },\n mode: renderMode,\n drawCount: geometryData.indices.length,\n });\n\n return result;\n}\n","import type { ShaderMacros, GeometryDrawMode, Engine, spec } from '@galacean/effects';\nimport { GLSLVersion, glContext, Geometry, DestroyOptions, Material, Mesh, math } from '@galacean/effects';\n\nconst { Vector4 } = math;\n\nexport function createParticleWireframe (engine: Engine, mesh: Mesh, color: spec.vec3): Mesh {\n const geometry = new SharedGeometry(\n engine,\n {\n geometry: mesh.firstGeometry(),\n mode: glContext.LINES,\n index: {\n data: new Uint16Array(0),\n },\n name: 'testtest',\n });\n\n const { vertex, fragment, macros, name } = mesh.material.props.shader;\n const materialOptions = { ...mesh.material.props };\n const newMacros = [...(macros || [] as ShaderMacros), ['PREVIEW_BORDER', 1]] as ShaderMacros;\n\n materialOptions.shader = {\n vertex,\n fragment,\n macros: newMacros,\n shared: true,\n name: name + '_wireframe',\n glslVersion: engine.gpuCapability.level === 2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,\n };\n const material = Material.create(engine, materialOptions);\n\n material.depthTest = mesh.material.depthTest;\n material.setVector4('uPreviewColor', new Vector4(color[0], color[1], color[2], 1));\n\n return updateWireframeMesh(mesh.geometry, mesh.material, Mesh.create(\n engine,\n {\n geometry,\n material,\n priority: 3000,\n name: materialOptions.shader.name,\n }), WireframeGeometryType.quad);\n}\n\nexport enum WireframeGeometryType {\n triangle,\n quad,\n}\n\nexport function destroyWireframeMesh (mesh: Mesh) {\n mesh.geometry?.dispose();\n mesh.dispose({ geometries: DestroyOptions.keep });\n}\n\nexport function updateWireframeMesh (originGeometry: Geometry, originMaterial: Material, wireframe: Mesh, type: WireframeGeometryType) {\n wireframe.material.cloneUniforms(originMaterial);\n\n const geometry = originGeometry;\n const wireframeGeometry = wireframe.firstGeometry();\n\n for (const macro of Object.keys(originMaterial.enabledMacros)) {\n wireframe.material.enableMacro(macro, originMaterial.enabledMacros[macro]);\n }\n\n if (type === WireframeGeometryType.triangle) {\n // 线框模式不绘制模型的时候,drawCount 为负数\n const drawCount = Math.abs(geometry.getDrawCount());\n\n if (drawCount !== 0) {\n if (drawCount !== wireframeGeometry.getDrawCount() / 2) {\n const indexData = geometry.getIndexData() as Uint16Array | undefined;\n const data = indexData ? getTriangleIndexData(indexData) : getTriangleIndexDataByCount(drawCount);\n\n wireframeGeometry.setIndexData(data);\n wireframeGeometry.setDrawCount(data.length);\n }\n }\n } else if (type === WireframeGeometryType.quad) {\n if (geometry.getDrawCount() / 6 !== wireframeGeometry.getDrawCount() / 8) {\n const data = getQuadIndexData(geometry.getDrawCount() / 6, geometry.getIndexData() as Uint16Array);\n\n wireframeGeometry.setIndexData(data);\n wireframeGeometry.setDrawCount(data.length);\n }\n }\n\n return wireframe;\n}\n\nfunction getQuadIndexData (faceCount: number, oid: Uint16Array): Uint16Array {\n const indexData = new Uint16Array(faceCount * 8);\n\n for (let i = 0; i < faceCount; i++) {\n const idx = i * 8;\n const base = i * 4;\n\n indexData[idx] = base;\n indexData[idx + 1] = 1 + base;\n indexData[idx + 2] = 1 + base;\n indexData[idx + 3] = 3 + base;\n indexData[idx + 4] = 3 + base;\n indexData[idx + 5] = 2 + base;\n indexData[idx + 6] = 2 + base;\n indexData[idx + 7] = base;\n }\n\n return indexData;\n}\n\nexport function createModeWireframe (engine: Engine, mesh: Mesh, color: spec.vec3): Mesh {\n const geometry = new SharedGeometry(\n engine,\n {\n geometry: mesh.firstGeometry(),\n mode: glContext.LINES,\n index: {\n data: new Uint32Array(0),\n },\n });\n const { vertex, fragment } = mesh.material.shader.shaderData;\n const materialOptions = { ...mesh.material.props };\n\n const newMacros = [['PREVIEW_BORDER', 1]] as ShaderMacros;\n\n materialOptions.shader = {\n vertex,\n fragment,\n macros: newMacros,\n shared: true,\n name: (mesh.name ?? 'unamedmesh') + '_wireframe',\n glslVersion: engine.gpuCapability.level === 2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,\n };\n\n const material = Material.create(engine, materialOptions);\n\n material.depthTest = true;\n material.setVector4('uPreviewColor', new Vector4(color[0], color[1], color[2], 1));\n\n return updateWireframeMesh(mesh.geometry, mesh.material, Mesh.create(\n engine,\n {\n geometry,\n material,\n priority: 3000,\n name: materialOptions.shader.name,\n }), WireframeGeometryType.triangle);\n}\n\nfunction getTriangleIndexDataByCount (drawCount: number): Uint32Array {\n const faceCount = drawCount / 3;\n const indexData = new Uint32Array(faceCount * 6);\n\n for (let i = 0; i < faceCount; i++) {\n const idx = i * 6;\n const p0 = i * 3;\n const p1 = p0 + 1;\n const p2 = p0 + 2;\n\n indexData[idx] = p0;\n indexData[idx + 1] = p1;\n indexData[idx + 2] = p1;\n indexData[idx + 3] = p2;\n indexData[idx + 4] = p2;\n indexData[idx + 5] = p0;\n }\n\n return indexData;\n}\n\nfunction getTriangleIndexData (oid: Uint16Array): Uint32Array {\n const faceCount = oid.length / 3;\n const indexData = new Uint32Array(faceCount * 6);\n\n for (let i = 0; i < faceCount; i++) {\n const idx = i * 6;\n const base = i * 3;\n const p0 = oid[base];\n const p1 = oid[base + 1];\n const p2 = oid[base + 2];\n\n indexData[idx] = p0;\n indexData[idx + 1] = p1;\n indexData[idx + 2] = p1;\n indexData[idx + 3] = p2;\n indexData[idx + 4] = p2;\n indexData[idx + 5] = p0;\n }\n\n return indexData;\n}\n\nexport interface SharedGeometryOptions {\n name?: string,\n drawStart?: number,\n drawCount?: number,\n mode?: GeometryDrawMode,\n index?: { data: Uint16Array | Uint32Array },\n geometry: Geometry,\n}\n\nexport class SharedGeometry extends Geometry {\n constructor (engine: Engine, options: SharedGeometryOptions) {\n const source = options.geometry;\n const sourceIndex = options.index?.data ?? source.getIndexData();\n const indexData = sourceIndex?.slice() as Uint16Array | Uint32Array | undefined;\n\n super(engine, {\n name: options.name,\n attributes: {},\n indices: indexData ? { data: indexData } : undefined,\n drawStart: options.drawStart ?? 0,\n drawCount: options.drawCount ?? 0,\n mode: options.mode ?? 0,\n });\n source.getAttributeNames().forEach(name => {\n const vertexBuffer = source.getVertexBuffer(name);\n\n if (vertexBuffer) {\n this.setVerticesBuffer(vertexBuffer);\n }\n });\n }\n}\n","import type { GeometryDrawMode, HitTestCustomParams, RenderFrame, Renderer, Texture, VFXItem } from '@galacean/effects';\nimport {\n RenderPass, Mesh, RenderPassPriorityPostprocess, RenderPassPriorityPrepare, HitTestType,\n TextureLoadAction, ParticleSystemRenderer, RendererComponent, Transform, assertExist,\n effectsClass, glContext, math, serialize, spec, PluginSystem,\n ParticleSystem,\n} from '@galacean/effects';\nimport type { GizmoVFXItemOptions } from './define';\nimport { GizmoSubType } from './define';\nimport type { EditorGizmoPlugin } from './gizmo-loader';\nimport { iconTextures } from './gizmo-loader';\nimport type { GizmoItemBoundingSphere, GizmoItemBounding, Ray, TriangleLike } from './gizmo-vfx-item';\nimport { BoundingType } from './gizmo-vfx-item';\nimport { computeOrthographicOffCenter } from './math-utils';\nimport { createMeshFromSubType } from './mesh';\nimport { intersectRayLine } from './raycast';\nimport { createMeshFromShape } from './shape';\nimport { moveToPointWidthFixDistance } from './util';\nimport { WireframeGeometryType, createModeWireframe, destroyWireframeMesh, updateWireframeMesh } from './wireframe';\nimport { GeometryType } from './geometry';\n\n// TODO: Move to spec\ninterface GizmoComponentData extends spec.ComponentData {\n options: GizmoVFXItemOptions,\n transform?: Record<string, unknown>,\n}\n\nconst editorRenderPassName = 'editor-gizmo';\nconst frontRenderPassName = 'front-gizmo';\nconst behindRenderPassName = 'behind-gizmo';\n\ntype Vector2 = math.Vector2;\ntype Vector3 = math.Vector3;\ntype Matrix4 = math.Matrix4;\n\nconst { Vector2, Vector3, Matrix4, Quaternion } = math;\nconst constants = glContext;\n\n@effectsClass('GizmoComponent')\nexport class GizmoComponent extends RendererComponent {\n gizmoPlugin: EditorGizmoPlugin;\n targetItem: VFXItem;\n needCreateModelContent: boolean;\n target: string;\n subType: GizmoSubType;\n size: any;\n contents?: Map<Mesh, Transform>;\n boundingMap: Map<string, GizmoItemBounding> = new Map();\n hitBounding?: { key: string, position: Vector3 };\n wireframeMesh: Mesh;\n @serialize()\n coordinateSpace: CoordinateSpace = CoordinateSpace.Local;\n\n color: spec.vec3;\n renderMode!: GeometryDrawMode;\n depthTest?: boolean;\n mat = Matrix4.fromIdentity();\n wireframeMeshes: Mesh[] = [];\n meshes: Mesh[] = [];\n mesh: Mesh | null = null;\n\n override onStart (): void {\n this.item.getHitTestParams = this.getHitTestParams;\n for (const item of this.item.composition?.items ?? []) {\n if (item.id === this.target) {\n this.targetItem = item;\n }\n }\n const targetItem = this.targetItem;\n\n if (!targetItem) {\n\n return;\n }\n const composition = this.item.composition;\n\n for (const plugin of PluginSystem.getPlugins() ?? []) {\n if (plugin.name === 'editor-gizmo') {\n this.gizmoPlugin = plugin as EditorGizmoPlugin;\n }\n }\n const gizmoPlugin = this.gizmoPlugin;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison\n if (targetItem.type === '7' || !gizmoPlugin) {\n return;\n }\n const gizmoSubType = this.subType;\n\n switch (gizmoSubType) {\n case GizmoSubType.particleEmitter:\n this.createParticleContent(targetItem);\n\n break;\n case GizmoSubType.modelWireframe:\n this.needCreateModelContent = true;\n this.createModelContent(targetItem);\n\n break;\n case GizmoSubType.box:\n case GizmoSubType.sphere:\n case GizmoSubType.cylinder:\n case GizmoSubType.cone:\n case GizmoSubType.torus:\n case GizmoSubType.sprite:\n case GizmoSubType.frustum:\n case GizmoSubType.directionLight:\n case GizmoSubType.pointLight:\n case GizmoSubType.spotLight:\n case GizmoSubType.floorGrid:\n this.createBasicContent(targetItem, gizmoSubType);\n\n break;\n case GizmoSubType.camera:\n case GizmoSubType.light:\n this.createBasicContent(targetItem, gizmoSubType, iconTextures);\n\n break;\n case GizmoSubType.rotation:\n case GizmoSubType.scale:\n case GizmoSubType.translation:\n this.createCombinationContent(targetItem, gizmoSubType);\n\n break;\n case GizmoSubType.viewHelper:\n this.createCombinationContent(targetItem, gizmoSubType, iconTextures);\n\n break;\n case GizmoSubType.boundingBox:\n this.createBoundingBoxContent(targetItem);\n\n break;\n default:\n break;\n }\n composition?.loaderData.gizmoItems.push(this.item);\n }\n\n override onEnable (): void {\n super.onEnable();\n if (!this.item.composition) {\n return;\n }\n\n const renderFrame = this.item.composition.renderFrame;\n\n for (const mesh of this.meshes) {\n if (mesh.name === GeometryType.FloorGrid.toString() || mesh.name === 'Box') {\n this.getFrontRenderPass(renderFrame).addMesh(mesh);\n } else if (mesh.name === 'translation' || mesh.name === 'scale' || mesh.name === 'rotation') {\n this.getBehindRenderPass(renderFrame).addMesh(mesh);\n } else {\n this.getEditorRenderPass(renderFrame).addMesh(mesh);\n }\n }\n }\n\n override onDisable (): void {\n super.onDisable();\n if (!this.item.composition) {\n return;\n }\n\n const renderFrame = this.item.composition.renderFrame;\n\n for (const mesh of this.meshes) {\n if (mesh.name === GeometryType.FloorGrid.toString() || mesh.name === 'Box') {\n this.getFrontRenderPass(renderFrame).removeMesh(mesh);\n } else if (mesh.name === 'translation' || mesh.name === 'scale' || mesh.name === 'rotation') {\n this.getBehindRenderPass(renderFrame).removeMesh(mesh);\n } else {\n this.getEditorRenderPass(renderFrame).removeMesh(mesh);\n }\n }\n }\n\n override onUpdate (dt: number): void {\n this.updateRenderData();\n }\n\n override onDestroy (): void {\n const gizmoMesh = this.mesh;\n const composition = this.item.composition;\n\n if (!composition) {\n return;\n }\n\n if (gizmoMesh && !gizmoMesh.isDestroyed) {\n gizmoMesh.dispose();\n\n if (gizmoMesh.name === GeometryType.FloorGrid.toString() || gizmoMesh.name === 'Box') {\n this.getFrontRenderPass(composition.renderFrame).removeMesh(gizmoMesh);\n } else {\n this.getEditorRenderPass(composition.renderFrame).removeMesh(gizmoMesh);\n }\n }\n if (this.contents) {\n for (const [mesh] of this.contents) {\n if (!mesh.isDestroyed) {\n mesh.dispose();\n if (mesh.name === 'translation' || mesh.name === 'scale' || mesh.name === 'rotation') {\n this.getBehindRenderPass(composition.renderFrame).removeMesh(mesh);\n } else {\n this.getEditorRenderPass(composition.renderFrame).removeMesh(mesh);\n }\n }\n }\n }\n\n if (this && this.wireframeMeshes.length > 0) {\n this.wireframeMeshes.forEach(mesh => {\n if (!mesh.isDestroyed) {\n destroyWireframeMesh(mesh);\n this.getEditorRenderPass(composition.renderFrame).removeMesh(mesh);\n }\n });\n } else {\n const wireframeMesh = this.wireframeMesh;\n\n if (wireframeMesh && !wireframeMesh.isDestroyed) {\n destroyWireframeMesh(wireframeMesh);\n this.getEditorRenderPass(composition.renderFrame).removeMesh(wireframeMesh);\n }\n }\n\n const arr: VFXItem[] = composition.loaderData.gizmoItems;\n const index = arr.indexOf(this.item);\n\n if (index > -1) {\n arr.splice(index, 1);\n }\n }\n\n override render (renderer: Renderer): void {\n // The material of the 3D plugin is updated during the render phase. In order to obtain the correct value, it is kept consistent here.\n if (this.subType === GizmoSubType.modelWireframe) { // 模型线框\n if (this.wireframeMesh && this.targetItem) {\n //@ts-expect-error TODO 和 3D 类型解耦\n const pMesh = this.targetItem.getComponent(RendererComponent)?.content;\n const meshes = pMesh.subMeshes;\n const wireframeMeshes = this.wireframeMeshes;\n\n if (meshes?.length > 0) {\n wireframeMeshes[0].worldMatrix.copyFrom(pMesh.matrix);\n updateWireframeMesh(meshes[0].geometry.geometry, meshes[0].material.effectMaterial, wireframeMeshes[0], WireframeGeometryType.triangle);\n }\n }\n }\n }\n\n updateRenderData () {\n const item = this.item;\n const gizmoSubType = this.subType;\n\n if (gizmoSubType === GizmoSubType.particleEmitter) { // 粒子发射器\n if (this.targetItem && this.mesh) {\n this.mat = this.targetItem.transform.getWorldMatrix();\n this.mesh.material.setMatrix('u_model', this.mat);\n }\n if (this.wireframeMesh && this.targetItem) {\n const particle = this.targetItem.getComponent(ParticleSystemRenderer);\n\n if (particle) {\n updateWireframeMesh(particle.particleMesh.mesh.geometry, particle.particleMesh.mesh.material, this.wireframeMesh, WireframeGeometryType.quad);\n this.wireframeMesh.worldMatrix = particle.particleMesh.mesh.worldMatrix;\n }\n }\n } else { // 几何体模型\n if (this.targetItem) {\n if (this.contents) { // 组合几何体\n // const targetTransform = this.targetItem.transform.clone();\n\n const worldPos = new Vector3();\n const worldQuat = new Quaternion();\n const worldScale = new Vector3(1, 1, 1);\n\n // Scale Gizmo 没有世界空间\n if (this.coordinateSpace == CoordinateSpace.Local || gizmoSubType === GizmoSubType.scale) {\n this.targetItem.transform.assignWorldTRS(worldPos, worldQuat);\n } else {\n this.targetItem.transform.assignWorldTRS(worldPos);\n }\n\n const targetTransform = new Transform({\n position: worldPos,\n quat: worldQuat,\n scale: worldScale,\n valid: true,\n });\n\n // 移动\\旋转\\缩放gizmo去除近大远小\n if (gizmoSubType === GizmoSubType.rotation || gizmoSubType === GizmoSubType.scale || gizmoSubType === GizmoSubType.translation) {\n const camera = item.composition!.camera;\n const cameraPos = camera.position || new Vector3();\n const itemPos = targetTransform.position;\n const newPos = moveToPointWidthFixDistance(cameraPos, itemPos);\n\n targetTransform.setPosition(newPos.x, newPos.y, newPos.z);\n }\n\n this.mat = targetTransform.getWorldMatrix();\n const center = targetTransform.position;\n\n for (const [mesh, transform] of this.contents) {\n let worldMat4: Matrix4;\n\n transform.parentTransform = targetTransform;\n const position = new Vector3();\n\n transform.assignWorldTRS(position);\n // 物体和中心点在屏幕空间上投影的距离\n let distanceToCneter = 100;\n let theta = 1;\n\n if (gizmoSubType === GizmoSubType.viewHelper) {\n // 正交投影只需要计算物体在XY平面上的投影与中心点的距离\n if (mesh.name === 'sprite') {\n distanceToCneter = position.toVector2().distance(center.toVector2());\n theta = (this.boundingMap.get('posX') as GizmoItemBoundingSphere).radius;\n }\n // 将物体挂到相机的transform上\n const fov = 30; // 指定fov角度\n const screenWidth = item.composition!.renderer.getWidth();\n const screenHeight = item.composition!.renderer.getHeight();\n const distance = 16; // 指定物体与相机的距离\n const width = 2 * Math.tan(fov * Math.PI / 360) * distance;\n const aspect = screenWidth / screenHeight;\n const height = width / aspect;\n const cameraModelMat4 = item.composition!.camera.getInverseViewMatrix();\n const padding = this.size.padding || 1; // 指定viewHelper与屏幕右上角的边距\n let localMat: Matrix4;\n\n localMat = transform.getWorldMatrix();\n const worldTransform: Transform = new Transform({\n valid: true,\n });\n\n worldTransform.cloneFromMatrix(localMat);\n worldTransform.setPosition((position.x + width / 2) - padding, (position.y + height / 2) - padding, position.z);\n localMat = worldTransform.getWorldMatrix();\n worldMat4 = cameraModelMat4.clone().multiply(localMat);\n // 正交投影到屏幕上\n const proMat5 = computeOrthographicOffCenter(-width / 2, width / 2, -height / 2, height / 2, -distance, distance);\n\n mesh.material.setMatrix('_MatrixP', proMat5);\n } else {\n if (gizmoSubType === GizmoSubType.rotation) {\n const cameraPos = item.composition!.camera.position || [0, 0, 0];\n\n mesh.material.setVector3('u_cameraPos', cameraPos);\n mesh.material.setVector3('u_center', center);\n }\n worldMat4 = transform.getWorldMatrix();\n // TODO 计算物体和中心点在屏幕空间上投影的距离 distanceToCneter\n }\n mesh.material.setMatrix('u_model', worldMat4);\n\n // 使用distanceToCneter处理坐标轴旋转到中心点附近时的遮挡问题\n if (distanceToCneter < theta) {\n if (distanceToCneter < theta * 0.5) {\n mesh.material.setVector2('u_alpha', new Vector2(0, 0));\n } else {\n mesh.material.setVector2('u_alpha', new Vector2((2 / theta) * distanceToCneter - 1, 0));\n }\n }\n }\n }\n if (this.mesh) { // 基础几何体\n const worldPos = new Vector3();\n const worldQuat = new Quaternion();\n const worldSca = new Vector3(1, 1, 1);\n\n this.targetItem.transform.assignWorldTRS(worldPos, worldQuat);\n\n const targetTransform = new Transform({\n position: worldPos,\n quat: worldQuat,\n scale: worldSca,\n valid: true,\n });\n\n if (gizmoSubType === GizmoSubType.light || gizmoSubType === GizmoSubType.camera) {\n const camera = item.composition!.camera;\n const cameraPos = camera.position || new Vector3(0, 0, 0);\n const itemPos = targetTransform.position;\n const newPos = moveToPointWidthFixDistance(cameraPos, itemPos);\n\n targetTransform.setPosition(newPos.x, newPos.y, newPos.z);\n }\n\n this.mat = targetTransform.getWorldMatrix();\n\n this.mesh.material.setMatrix('u_model', targetTransform.getWorldMatrix());\n }\n }\n }\n }\n\n /**\n * 获取默认绘制模式\n * @returns 绘制模式常量\n */\n getDefaultRenderMode (): GeometryDrawMode {\n let result: GeometryDrawMode;\n const gizmoSubType = this.subType;\n\n switch (gizmoSubType) {\n case GizmoSubType.particleEmitter:\n case GizmoSubType.modelWireframe:\n case GizmoSubType.frustum:\n case GizmoSubType.directionLight:\n case GizmoSubType.spotLight:\n case GizmoSubType.pointLight:\n case GizmoSubType.floorGrid:\n result = constants.LINES;\n\n break;\n default:\n result = constants.TRIANGLES;\n\n break;\n }\n\n return result;\n }\n\n /**\n * 获取默认尺寸\n * @returns 几何体尺寸\n */\n getDefaultSize () {\n let result = {};\n const gizmoSubType = this.subType;\n\n switch (gizmoSubType) {\n case GizmoSubType.box:\n result = { width: 1, height: 1, depth: 1 };\n\n break;\n case GizmoSubType.sphere:\n result = { radius: 1 };\n\n break;\n case GizmoSubType.cylinder:\n result = { radius: 1, height: 1 };\n\n break;\n case GizmoSubType.cone:\n result = { radius: 1, height: 1 };\n\n break;\n default:\n result = {};\n\n break;\n }\n\n return result;\n }\n\n createModelContent (item: VFXItem) {\n const modelComponent = item.getComponent(RendererComponent);\n //@ts-expect-error TODO 和 3D 类型解耦\n const psubMesh = modelComponent.content.subMeshes[0];\n const engine = item.composition?.renderer.engine;\n\n assertExist(engine);\n\n if (psubMesh) {\n this.targetItem = item;\n this.wireframeMeshes = [];\n\n const originMesh = Mesh.create(\n engine,\n {\n geometry: psubMesh.geometry.geometry,\n material: psubMesh.material.effectMaterial,\n priority: 3000,\n });\n const mesh = this.wireframeMesh = createModeWireframe(engine, originMesh, this.color);\n\n this.wireframeMeshes.push(mesh);\n this.meshes.push(mesh);\n }\n }\n\n createParticleContent (item: VFXItem) {\n const shape = item.getComponent(ParticleSystem).definition.shape;\n const engine = this.item.composition?.renderer.engine;\n\n assertExist(engine);\n\n this.targetItem = item;\n if (shape && shape.type) {\n const mesh = this.mesh = createMeshFromShape(engine, shape, { color: this.color });\n\n this.meshes.push(mesh);\n }\n }\n\n /**\n * 创建 BoundingBox 几何体模型\n * @param item - VFXItem\n */\n createBoundingBoxContent (item: VFXItem) {\n const gizmoItem = this.item;\n const shape = {\n shape: 'Box',\n width: this.size.width,\n height: this.size.height,\n depth: this.size.depth,\n center: this.size.center,\n };\n const engine = gizmoItem.composition?.renderer.engine;\n\n assertExist(engine);\n\n this.targetItem = item;\n if (shape) {\n const mesh = this.mesh = createMeshFromShape(engine, shape, { color: this.color, depthTest: this.depthTest });\n\n this.meshes.push(mesh);\n }\n }\n\n /**\n * 创建基础几何体模型\n * @param item - VFXItem\n * @param subType - GizmoSubType 类型\n */\n createBasicContent (item: VFXItem, subType: GizmoSubType, iconTextures?: Map<string, Texture>) {\n const gizmoItem = this.item;\n const options = {\n size: this.size,\n color: this.color,\n renderMode: this.renderMode,\n depthTest: this.depthTest,\n };\n const engine = gizmoItem.composition?.renderer.engine;\n\n assertExist(engine);\n\n const mesh = this.mesh = createMeshFromSubType(engine, subType, this.boundingMap, iconTextures, options) as Mesh;\n\n this.targetItem = item;\n this.meshes.push(mesh);\n }\n\n /**\n * 创建组合几何体模型\n * @param item - VFXItem\n * @param subType - GizmoSubType 类型\n * @param iconTextures - XYZ 图标纹理(viewHelper 专用)\n */\n createCombinationContent (item: VFXItem, subType: GizmoSubType, iconTextures?: Map<string, Texture>) {\n const gizmoItem = this.item;\n const options = {\n size: this.size,\n renderMode: this.renderMode,\n };\n\n const engine = gizmoItem.composition?.renderer.engine;\n\n assertExist(engine);\n\n this.contents = createMeshFromSubType(engine, subType, this.boundingMap, iconTextures, options) as Map<Mesh, Transform>;\n for (const mesh of this.contents.keys()) {\n this.meshes.push(mesh);\n }\n this.targetItem = item;\n }\n\n override fromData (data: GizmoComponentData): void {\n super.fromData(data);\n const item = this.item;\n\n item.duration = 999;\n const {\n target, subType, renderMode, size, depthTest,\n color = [255, 255, 255],\n } = data.options;\n\n this.target = target;\n this.subType = subType;\n this.renderMode = renderMode || this.getDefaultRenderMode();\n this.size = size || this.getDefaultSize();\n this.depthTest = depthTest;\n\n const [r, g, b] = color;\n\n this.color = [r / 255, g / 255, b / 255];\n if (data) {\n item.transform = new Transform(data.transform);\n }\n }\n\n /**\n * 射线检测算法\n * @returns 包含射线检测算法回调方法的参数\n */\n private getHitTestParams = (): void | HitTestCustomParams => {\n const item = this.item;\n const boundingMap = this.boundingMap;\n\n if (boundingMap.size > 0) {\n const boundingKeys = boundingMap.keys();\n let worldMat4: Matrix4;\n\n worldMat4 = this.transform.getWorldMatrix();\n const targetItem = this.targetItem;\n\n if (targetItem) {\n //const targetTransform = this.targetItem.transform.clone();\n const worldPos = new Vector3();\n const worldQuat = new Quaternion();\n const worldSca = new Vector3(1, 1, 1);\n const gizmoSubType = this.subType;\n\n // Scale Gizmo 没有世界空间\n if (this.coordinateSpace == CoordinateSpace.Local || gizmoSubType === GizmoSubType.scale) {\n this.targetItem.transform.assignWorldTRS(worldPos, worldQuat);\n } else {\n this.targetItem.transform.assignWorldTRS(worldPos);\n }\n\n const targetTransform = new Transform({\n position: worldPos,\n quat: worldQuat,\n scale: worldSca,\n valid: true,\n });\n\n // 移动\\旋转\\缩放gizmo去除近大远小\n if (\n gizmoSubType === GizmoSubType.rotation ||\n gizmoSubType === GizmoSubType.scale ||\n gizmoSubType === GizmoSubType.translation ||\n gizmoSubType === GizmoSubType.camera ||\n gizmoSubType === GizmoSubType.light\n ) {\n const camera = item.composition!.camera;\n const cameraPos = camera.position || [0, 0, 0];\n const itemPos = targetTransform.position;\n const newPos = moveToPointWidthFixDistance(cameraPos, itemPos);\n\n targetTransform.setPosition(newPos.x, newPos.y, newPos.z);\n worldMat4 = targetTransform.getWorldMatrix();\n } else {\n worldMat4 = targetTransform.getWorldMatrix();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = item;\n\n return {\n type: HitTestType.custom,\n clipMasks:this.frameClipMasks,\n /**\n * 自定义射线检测算法\n * @param ray 射线参数\n * @param pointInCanvas 屏幕坐标\n * @returns\n */\n collect (ray: Ray, pointInCanvas: Vector2): Vector3[] | void {\n const hitPositions = [];\n const gizmoComponent = self.getComponent(GizmoComponent);\n\n gizmoComponent.hitBounding = undefined;\n for (const key of boundingKeys) {\n const bounding = boundingMap.get(key);\n const center = new Vector3();\n const worldCenter = new Vector3();\n\n if (bounding?.type === BoundingType.box || bounding?.type === BoundingType.sphere) {\n if (bounding?.center) {\n center.copyFrom(bounding?.center);\n }\n worldMat4.projectPoint(center, worldCenter);\n }\n let position: Vector3 | undefined;\n\n switch (bounding?.type) {\n case BoundingType.box: // 立方体包围盒\n {\n const boxHalfSize = bounding.size.clone().multiply(0.5);\n const boxMax = center.clone().add(boxHalfSize);\n const boxMin = center.clone().subtract(boxHalfSize);\n\n position = ray.intersectBox({ min: boxMin, max: boxMax }, new Vector3());\n }\n\n break;\n case BoundingType.sphere: // 球体包围盒\n\n // viewHelper 使用了正交投影,使用屏幕投影点计算\n if (gizmoComponent.subType === GizmoSubType.viewHelper) {\n // 计算正交投影矩阵\n const viewMat4 = self.composition!.camera.getViewMatrix();\n const fov = 30; // 指定fov角度\n const screenWidth = self.composition!.renderer.getWidth();\n const screenHeight = self.composition!.renderer.getHeight();\n const distance = 16; // 指定物体与相机的距离\n const width = 2 * Math.tan(fov * Math.PI / 360) * distance;\n const aspect = screenWidth / screenHeight;\n const height = width / aspect;\n const proMat4 = computeOrthographicOffCenter(-width / 2, width / 2, -height / 2, height / 2, -distance, distance);\n\n // 将包围盒挂到相机的 transform 上\n const cameraModelMat4 = self.composition!.camera.getInverseViewMatrix();\n const localTransform = new Transform({\n valid: true,\n });\n\n localTransform.cloneFromMatrix(worldMat4);\n const pos = localTransform.position;\n const padding = gizmoComponent.size.padding || 1; // 指定viewHelper与屏幕右上角的边距\n\n localTransform.setPosition((pos.x + width / 2) - padding, (pos.y + height / 2) - padding, pos.z);\n const localMat4 = localTransform.getWorldMatrix();\n const modelMat4 = cameraModelMat4.clone().multiply(localMat4);\n\n modelMat4.projectPoint(center, worldCenter);\n\n // 包围球中心点正交投影到屏幕上\n const vpMat4 = proMat4.clone().multiply(viewMat4);\n const mvpMat4 = vpMat4.clone().multiply(modelMat4);\n const screenCenter = mvpMat4.projectPoint(center, new Vector3());\n // const screenCenterX = screenCenter.x;\n // const screenCenterY = screenCenter.y;\n\n // 包围球上的点正交投影到屏幕上\n const radius = bounding.radius;\n const up = new Vector3(\n localMat4.elements[1],\n localMat4.elements[5],\n localMat4.elements[9],\n ).normalize();\n\n const point = up.clone().multiply(radius);\n\n point.add(center);\n\n const screenPoint = mvpMat4.projectPoint(point, new Vector3());\n // const screenPointX = screenPoint.x;\n // const screenPointY = screenPoint.y;\n\n // 计算正交投影到屏幕上的包围球的半径\n const screenCenter2 = screenCenter.toVector2();\n const screenPoint2 = screenPoint.toVector2();\n const screenRadius = screenCenter2.distance(screenPoint2);\n\n if (pointInCanvas.distance(screenCenter2) < screenRadius * 1.2) {\n position = worldCenter;\n }\n } else {\n position = ray.intersectSphere({ center: worldCenter, radius: bounding.radius }, new Vector3());\n }\n\n break;\n case BoundingType.triangle: {// 三角数组包围盒\n const { triangles, backfaceCulling } = bounding;\n const tmpPositions: Vector3[] = [];\n let tmpPosition;\n\n for (let j = 0; j < triangles.length; j++) {\n const triangle = triangles[j];\n const worldTriangle: TriangleLike = {\n p0: worldMat4.projectPoint(triangle.p0 as Vector3, new Vector3()),\n p1: worldMat4.projectPoint(triangle.p1 as Vector3, new Vector3()),\n p2: worldMat4.projectPoint(triangle.p2 as Vector3, new Vector3()),\n };\n\n tmpPosition = ray.intersectTriangle(worldTriangle, new Vector3(), backfaceCulling);\n if (tmpPosition) {\n tmpPositions.push(tmpPosition);\n }\n }\n // 仅保存距离相机最近的点\n if (tmpPositions.length > 0) {\n let lastDistance: number;\n\n tmpPositions.forEach(item => {\n const distance = ray.origin.distanceSquared(item);\n\n if (!lastDistance || distance < lastDistance) {\n lastDistance = distance;\n position = item;\n }\n });\n }\n\n break;\n }\n case BoundingType.line: {// 线条包围盒,将线条转换到屏幕空间,计算线条与屏幕交互点的距离,小于阈值判定为点中\n const { points, width } = bounding;\n\n position = intersectRayLine(new Vector3(), pointInCanvas, points, width / 2, worldMat4, self.composition!.camera);\n\n break;\n }\n default:\n break;\n }\n if (position) {\n hitPositions.push(position);\n // 缓存距离相机最近的 BoundingKey\n if (gizmoComponent.hitBounding) {\n const distance = ray.origin.distanceSquared(position);\n const lastDistance = ray.origin.distanceSquared(gizmoComponent.hitBounding.position);\n\n if (distance < lastDistance) {\n gizmoComponent.hitBounding.key = key;\n gizmoComponent.hitBounding.position = position;\n }\n } else {\n gizmoComponent.hitBounding = {\n key,\n position,\n };\n }\n }\n }\n if (hitPositions.length === 0) {\n gizmoComponent.hitBounding = undefined;\n }\n\n return hitPositions;\n },\n behavior: spec.InteractBehavior.NOTIFY,\n };\n }\n };\n\n getBehindRenderPass (pipeline: RenderFrame): RenderPass {\n let rp = pipeline.renderPasses.find(renderPass => renderPass.name === behindRenderPassName);\n\n if (!rp) {\n rp = new DrawGizmoBehindPass(pipeline.renderer);\n pipeline.addRenderPass(rp);\n }\n\n return rp;\n }\n\n getEditorRenderPass (pipeline: RenderFrame): RenderPass {\n let rp = pipeline.renderPasses.find(renderPass => renderPass.name === editorRenderPassName);\n\n if (!rp) {\n rp = new DrawGizmoEditorPass(pipeline.renderer);\n pipeline.addRenderPass(rp);\n }\n\n return rp;\n }\n\n getFrontRenderPass (pipeline: RenderFrame): RenderPass {\n let rp = pipeline.renderPasses.find(renderPass => renderPass.name === frontRenderPassName);\n\n if (!rp) {\n rp = new DrawGizmoFrontPass(pipeline.renderer);\n pipeline.addRenderPass(rp);\n }\n\n return rp;\n }\n\n}\n\nexport enum CoordinateSpace {\n Local,\n World\n}\n\nclass DrawGizmoBehindPass extends RenderPass {\n constructor (renderer: Renderer) {\n super(renderer);\n this.priority = RenderPassPriorityPostprocess + RenderPassPriorityPostprocess;\n this.name = behindRenderPassName;\n }\n\n override execute (renderer: Renderer): void {\n renderer.clear({ depthAction: TextureLoadAction.clear });\n renderer.renderMeshes(this.meshes);\n }\n}\n\nclass DrawGizmoFrontPass extends RenderPass {\n constructor (renderer: Renderer) {\n super(renderer);\n this.priority = RenderPassPriorityPrepare + 2;\n this.name = frontRenderPassName;\n }\n\n override execute (renderer: Renderer): void {\n renderer.renderMeshes(this.meshes);\n }\n}\n\nclass DrawGizmoEditorPass extends RenderPass {\n constructor (renderer: Renderer) {\n super(renderer);\n this.priority = RenderPassPriorityPostprocess + 2;\n this.name = editorRenderPassName;\n }\n\n override execute (renderer: Renderer): void {\n renderer.renderMeshes(this.meshes);\n }\n}\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\nexport { _async_to_generator as _ };\n","function _set_prototype_of(o, p) {\n _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {\n o.__proto__ = p;\n\n return o;\n };\n\n return _set_prototype_of(o, p);\n}\nexport { _set_prototype_of as _ };\n","import { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });\n\n if (superClass) _set_prototype_of(subClass, superClass);\n}\nexport { _inherits as _ };\n","function _is_native_reflect_construct() {\n // Since Reflect.construct can't be properly polyfilled, some\n // implementations (e.g. core-js@2) don't set the correct internal slots.\n // Those polyfills don't allow us to subclass built-ins, so we need to\n // use our fallback implementation.\n try {\n // If the internal slots aren't set, this throws an error similar to\n // TypeError: this is not a Boolean object.\n var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));\n } catch (_) {}\n return (_is_native_reflect_construct = function() {\n return !!result;\n })();\n}\n\nexport { _is_native_reflect_construct as _ };\n","import { _ as _is_native_reflect_construct } from \"./_is_native_reflect_construct.js\";\nimport { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\nfunction _construct(Parent, args, Class) {\n if (_is_native_reflect_construct()) _construct = Reflect.construct;\n else {\n _construct = function construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n\n if (Class) _set_prototype_of(instance, Class.prototype);\n\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}\nexport { _construct as _ };\n","function _get_prototype_of(o) {\n _get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n\n return _get_prototype_of(o);\n}\nexport { _get_prototype_of as _ };\n","import { _ as _construct } from \"./_construct.js\";\nimport { _ as _get_prototype_of } from \"./_get_prototype_of.js\";\nimport { _ as _is_native_function } from \"./_is_native_function.js\";\nimport { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _wrap_native_super(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n _wrap_native_super = function(Class) {\n if (Class === null || !_is_native_function(Class)) return Class;\n if (typeof Class !== \"function\") throw new TypeError(\"Super expression must either be null or a function\");\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, _get_prototype_of(this).constructor);\n }\n Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } });\n\n return _set_prototype_of(Wrapper, Class);\n };\n\n return _wrap_native_super(Class);\n}\nexport { _wrap_native_super as _ };\n","function _is_native_function(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\nexport { _is_native_function as _ };\n","function _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\nexport { _array_like_to_array as _ };\n","import { _ as _unsupported_iterable_to_array } from \"./_unsupported_iterable_to_array.js\";\n\nfunction _create_for_of_iterator_helper_loose(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n\n if (it) return (it = it.call(o)).next.bind(it);\n // Fallback for engines without symbol support\n if (Array.isArray(o) || (it = _unsupported_iterable_to_array(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n\n var i = 0;\n\n return function() {\n if (i >= o.length) return { done: true };\n\n return { done: false, value: o[i++] };\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _create_for_of_iterator_helper_loose as _ };\n","import { _ as _array_like_to_array } from \"./_array_like_to_array.js\";\n\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n\n var n = Object.prototype.toString.call(o).slice(8, -1);\n\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\nexport { _unsupported_iterable_to_array as _ };\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import { glContext } from '@galacean/effects';\n\n// 坐标轴默认颜色\nexport const color = {\n xAxisColor: [216 / 255, 178 / 255, 76 / 255],\n yAxisColor: [38 / 255, 149 / 255, 235 / 255],\n zAxisColor: [134 / 255, 74 / 255, 245 / 255],\n};\nexport const renderMode = glContext.TRIANGLES;\n// 坐标轴默认图标\nexport const axisIconMap: Map<string, string> = new Map();\n\naxisIconMap.set(\n 'light', `data:image/png;base64,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`\n);\naxisIconMap.set(\n 'camera', `data:image/png;base64,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`\n);\naxisIconMap.set(\n 'posX', `data:image/png;base64,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\n RK5CYII=`\n);\naxisIconMap.set(\n 'posY', `data:image/png;base64,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`\n);\naxisIconMap.set(\n 'posZ', `data:image/png;base64,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`\n);\naxisIconMap.set(\n 'negX', `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABmCAYAAAFKLQTJAAABYWlDQ1BrQ0dDb2xvcl\n NwYWNlRGlzcGxheVAzAAAokWNgYFJJLCjIYWFgYMjNKykKcndSiIiMUmB/yMAOhLwMYgwKicnFBY4BAT5AJQwwGhV8u8bACKI\n v64LMOiU1tUm1XsDXYqbw1YuvRJsw1aMArpTU4mQg/QeIU5MLikoYGBhTgGzl8pICELsDyBYpAjoKyJ4DYqdD2BtA7CQI+whY\n TUiQM5B9A8hWSM5IBJrB+API1klCEk9HYkPtBQFul8zigpzESoUAYwKuJQOUpFaUgGjn/ILKosz0jBIFR2AopSp45iXr6SgYG\n RiaMzCAwhyi+nMgOCwZxc4gxJrvMzDY7v////9uhJjXfgaGjUCdXDsRYhoWDAyC3AwMJ3YWJBYlgoWYgZgpLY2B4dNyBgbeSA\n YG4QtAPdHFacZGYHlGHicGBtZ7//9/VmNgYJ/MwPB3wv//vxf9//93MVDzHQaGA3kAFSFl7jXH0fsAAAA4ZVhJZk1NACoAAAA\n IAAGHaQAEAAAAAQAAABoAAAAAAAKgAgAEAAAAAQAAAGSgAwAEAAAAAQAAAGYAAAAAdrOvGwAAFQlJREFUeAHtXQuQXFWZPufc\n 7nEmT8Agj4INBOZBpXZlTdx1A7VA5LFMpicJbuQRXB5qMLggYkG5taJZQKVgRVxZeVgVoJSUGCVJ98xoDAmCEFclSm1VypkMJ\n LI8IhjekEnSfe/Z77895/a5957uPv2Y6Z5kbtXMef3n/8///+d9/nOasSo+rucZ7E8tZq5cr8cpf1dvXwAbeAbTPTIPwD+uAA\n uu3Ex+lVFQYDCTeoVcxkwZCvEKsU8pHyiWwcc2+k9u5jx5qk9Jjy7l51z2S5l9VgxlUn8sBainSSnupLAA96/qCTZ+0ZXKnGk\n DmIfJSzHgCRL5gE1mErufqXP6/KRkcqB0pjwVgvEz8bNW5RjnP2WMEgqJBMCl9yEVp5Qb1AgCoE8pMB/K/3cYP7O9N/OEHleR\n P0TFRIGwqSKRP8hQAA5XI+Gxdk/Ie1VGPwMBQ7FPcMZvpgTzJzc7iZkzeTHM0UwOZwlXyo2jigwXIwpMYVeyHLmjGchr91WXI\n cHlcXb4USTOxYqcZA+Vy4B6t4ZgArHmM5RiXm4Oam5Bk+EKmEeSr5hO4sTWgEI+gbGhdOoXIH2OCiu3gFCrGiox6j7fv7Qj62\n aHovF6WEeoxyt/UP9UBLmFGqPFcrbTcdh1bo6/T7Foul1MyrtRD0M4OOfPd6YyJ2s5wwAh5JztYJKv1IHL+wuy5py905nqm0l\n 5glKECBTtxcuTyUMUiJEoQ9UEnO9FRMoWVWm4AiGxI5O6VgHXjwBhLNRr9CvyG4rIWLnCSfK/HwvkkEowxoR0kidWYLM24nmd\n QOv7fCKEbMxrlyoxJiKr0cCuUGFdeYU4s08w7x88xm9VqXovEHCiEsl9oe+Sw0e8d97Q42z9OnKVx0hEJeou5jQDUsrz9Tj03\n l/v6sl8JRTXqEBZTgbTqV2YbJxQtIBc3NqVSt9UNB0JRYmEa1spFKNpnL3Qleo7wQQZIzKcSX0EA/62KDC68NvQrW9S8cj4eQ\n xWF6iwcssqfjDTezuT3g0qA/jchu7+xiBc1FPoDAkkSijgZHhgyUluLvdcAU9lLV867GjuyodVfp1QMEmphQAh5i77M7qQsxU\n RXac+ET2iklauECpXSi7Rdu5S4R39qR7yB5yMJrysAKp2PZZReT1X+n6BKY0/k8on8H9RALW4mN926/mxmpEX6xH18GMivV/h\n Gcr09AfiAvUnVUI9XbSt7oAI2sfqeiLXcRWIiMRf9IR6+gtEuDe/noh1XAERyG7MxoWACIbdpE69Xn4hnHMErcnqhVDhQfcSt\n PqOng2Pifbuh99RiWolXAhX58Mw/dd6Tl9coHxREMnlLYG/Kk+h21c9sU8EU/xHAnySLcCOSNCbBvFWHvkLBYbG/XTBr3xw9d\n 4YI+HbqHGxkU8Dj3gLHFCC4oL8waBFAfp0QhQWnK32JA8GI4oLf/InCB+ux+kEKD5GhCKjhCjO6uMsjcnE4iiskYgCqoRYtPQ\n KB7kliSjAwYHUQp5jmzAsBI0XNXJny7RZc08868F9Cq6Ya0WkWOZovHxmRXJ49+6VGE960eYWouLE8KNwL2HXKi0FX9PVnQ5q\n YBRXpeEYIVsEGPCuR0G/ZQtvBcf57sNaDms/+rwf+FsFVnlGgSpiBFOOvVB9WyUEaoIV4uqunvQ9NjjKMrKjr3eF53n3lUKGq\n rQdlejfuMxvupSCjaZhLtiNCeGXovF6GJ2g19mbcfS4qL8oI0N9vZdJz3swmkGFk0L2ZD0xosL1crHzdK30ZKxbIvxoXxKjRd\n AZ6DSNjBTrrgTjmzzGbtMRjJVfONzxXC8YmnQ6YOhuMHRNKE4PDGWWfphOB/Q48mOMfAmHAJdF48cjjGo7BYoI1giKJqqbi+q\n WKIRHfeiFPo5e6DGVoFxI5hLPrfwAQ+Wvn+ufTgRbTgqvGsD8+iblMsfMhDi3OZigYvNuTGpeVQwodzDTs9tPpX+mNoF6+CWs\n L2PVTCFonBuecVE5HM7niV0/W3KCqVDNyQTmC4z/c7S8tDkjDmTd+6MJ0MY3o3HNEkY3+6apLOhRZWwvGPPdrSbgZo4T2MJ6L\n VpAwZzQxDya3oxhaITH9h5wpndpMxa2VJn8kd3Ua6G7M5z6l0I1PmkYLz6D85fQVha65d/44whGyS3RYmCWq22uRVMbF44yQS\n XB6d/HfEYw1MekD1UdhY7g9sYV2UQ5PoZw7iwiSJ8R8qihnvzBJ9k89Nwbg3CDPJjrnWLa5RFcXNeZ2uAbVsRmvzi3wLanbDG\n U+b/QbjYY4sc4Kq4FItiSFF1zzk8PKeIxRigBi6lFWEz1KSDdxb7KTzDOWK3a9HyV+JNCiKznBkcmet5iaxIjIyojlrZPodGf\n psIxl7N7MQ6tjcVXETFq+LEeWYsupafOapty/IK1xsVcSUZUeWw3GmhJKjlby5l4RErvbZU/5gr2UezTXomJU0csLRrBeRYmT\n aaqHoK0YkTPMdiXupd58io9rt5+EkirmD5rds8a47zKRK9iRqJIyALBk/I70fjKwvwZJ9Ha3d69dswOHyorTwOha9aIXvbBgd\n 7T0EouQf3vxYrzOD2N/NTj4P8WEE23H3PMPXz+/dkoTLXhmhnBofAtOPSq4RSH/ynpJM47adG6HdUyQfmqYuTPGz819a0Dbw1\n D8sfUQjyal5bX2ObxTTajaeXCFTOCxf6fUEFml0NcU7rDl3QtylQ0i7BmZLCvdyXzvO/VVMAKMqMLHsFkdoptFitGYPnyHI7U\n TiqH1G/Mkq/DVHSz9NhgFN5JyKmeyxdgtvBJaHVONN0Uph2S9lTm96Y0Pa4sI5imwAq0cPiiZ1Z+bF5/CyO6PwtVcTYuNq+ng\n qFvohBzS8Fj6nVVR086tkmi5ynJiHnlWMguPP45T7DhQkwNPlr7+MuGIji4uAPWQkVNZIoygvkVBmxzr8YF34Cqg2l9fb+k8N\n qyHjfOuokSF+Lyzp70QyaqRkbABJ23zjBlkA5fTqY0prS6xXF5D7RjnFA6icTJ7d3rn4/SClaIKgFMfLcYE8IR5445E1QQGNX\n SEYYqk+6G7ZkKKSGNDA8sn+Hm3jZOv9Ejne3bGhXyjrkPncxXUcAzYoRw1oip/bF6fEgjXs5s1YimkhpvJqiQGEtuprMZvcC+\n HzMKOsvR4wNGyJILEoif08HaC1LZq2caT3+xA6bogVTAiLIWixRyP9MsyiJp4xakwyYTMbTnYBvLZySqJpUJoyoO/hv/jR42v\n RwtCTql4ITNZ0Sy7M+jQHQ6pC52RNMaEUaPeYWJLp22UXy+akl2dAxIMmPGGNw4RaDqQ6481lZ3ZPb9gIogyBzXVBYs5bBR11\n yf4DJm0IwO6mIqJd0suCVaXHR5/dG4ZgiXOg4UaDAh81MqsCfFA81QcNsy0Dlo0P3qmTBuWO8n6fnGw49B8skonWzO7TUyEgV\n sqjCXMRsvmJUsmniMeDLYgVcCRg36qwnHiMfF64qBgiuPnXCM4HAHNSn8YahwJhwjWKt8MMyGH3pl4jHCc3PijPCJxwjGvQVR\n RtAlq5vB4ST0AjG7qDBEA0OcnxWlLpIyjevB/DfRBDDyqWhc04QNNxLa/ymzne45x3bSTYfyzcBIqQvcgq4tNEMhbcqQlSxmw\n ID24Vtt+L0WdkhitueIC+5o2BAZDxhU+aOidERixlKKG+1+nU9EAaL3QKLp4x4uYk6i7sD4jCgziGjhsGhZE41rRNjvRQ37wv\n SOgSrPqEagGth1qEjlkirzdiAqpjEuBJo2Ue5Mpb+v4gNGOlJp4xEzBqC7FXBD3PxNpsBQWZUBbfgi5Sc3YIQCZKhCbvwzG7b\n E4eodAxt5w0iOPcgDoRtVIBtihKxt0J3FFi754hWuUNW7uCZ8qNJ01etaU1rn9HlTo/FoBvGv1NlIEnfysjAdiueqXwx2S1Z6\n ksXse4kCTq96cHoV2xwJaUQVpdjVBkon8yO6969g6+2i7j9ajAlYHDxgYoLKYGSEEsikiFzTl3+8QPaRaZIpvao4LpeRlRzGr\n 5mm/FTlcZRwpSmN4oxVSwEPD1zzATe3Kzbqq/RR900u5dWSi9ci8VZBVKPl0EDRAvpI8CQSmDBWNUWkJCMKCM9PHLC6B0tPuJ\n Adscd+p/JGXQxiMyXzLsSVpGUYH4rWCJUPVc3KGsKKEUIKi4cN6ArHdXe+Tcw4wtZmy5oRYobe6tjnvbvHRpIEX/Un+H14huN\n zleSviBGFeDidOsNl8pcqXC8XDXoTzDbOrQZfVYwoQsMDy450c/tg8SDnq7hqXKzuvtCRytR0bl8TI3qhdz1+eev+91//Cnqw\n izE/m6On6X5IHb0324jTyv/s6s74iyI9vVp/3RiptgCV5pOPr8KrC9tbR95PJrMHRpIt09xELptIEp5EMpc98J6TS7a0ZdumZ\n rNHsrn7/BftKiXSQPimUQgGdL5zYPG8rMcW4oAGf+x09PaxuWFdZMUZ3Wl+CvOaLUnBtszp3rANm0nYeG381xCF0MRHei9cBi\n Vcib/YDa9GioV2+fC3movZD7V3f3f/eJdlXBTySiY15T3JvggTu+uggFnjzWQt9KCcPWg7d03j7NvHpjKxs/FacJvyjplCBje\n mTuQHGOy+5CIT4YkaBwX144rQNV3nZXaNBQ91VQjZrMHc6/uYGH9yLAqr4XwTU7M3YG85Agb2Yu/AvxeDdU0bBoIpSGtD2hGA\n P1zLU3cvZlo/xm7tZ9VGZz0I1EUhuI11Ae7urME0sR5HQwfA2FbYsD6JpeOzJe8EVSEBWptixnoqXpT4R2Snc6+WKtCEsmD9u\n h94L8GWyKOhhCoCNSkEhvI3wVD+5iroBlmE8I/KHsYW2fYgsgEeIXwz8OWeV+MkQ4iv4hGXmIWSLUtVKWRHpucGbN3ETo3siP\n I9WFCRYfIv7eAbBMXZmSjjSqx6q5qE4J7mjR2pvjsqLX1FChnKLO6WzKXdoIo2FtHXvoetzDtgRo+5/8T78GjO6diiuwFj47S\n KSs9ZjjNncbHzMxMuK4XI7ctahnaObIUicIfa/gPy3zLu/AfGgXKbrfZIGwiJcaKVSfdrmDj8XUXFwFuqnXPaFvC5a2l8LPmV\n VQhaxVIp3coGKy7S2CA2nt+VLM1ESsQGHO4qVrRvjJcDLkBrWVeKzZIKwWb1XWgVXyiFQE/D/ao/YHD8cjNZbevlq7efzoQwG\n bkN98P+1ho3Z9/BU4axU3OVv6hCoIynoYyYOZTKqLuY9qEpin/FIjB2S0iHO1j9WCyehP03+kkAuyk0Z1uhlNNM8sBaKv7htu\n GvbZWB3L/GvuD5h6oySHrEO8mAZEHhsh8qui9jA2CsheCAcAsonGWAjUdJthqHhA/HEw7hGCmXY1p/pZUEOH8cp7oLddhQCxn\n qS91pqwzMs2+fVIYuylE/KqgvG0NSLAoVfyjTG3o2NWghaELnY56N4z+rD8d7jXhtx6psTQLkP/Z5rU1hsE7rxpnvzwjWbyFS\n rhKYKVh2Pfznk8qwEvMGyAmyKv+R7EkHBOn/G85sux6DeNmdUWiSrGQq3g4oX6SDFuKOUZmVZhCy93UAKNxwW0W3SL5WOkc+V\n XJ+vw3cJExBArYyIx2QLsRz/X84BxO38ns0nP8fBvzHC6QmfVYSIJmR7Mp+chrpAq3DbvmPxd+TZXFOAhSRgPxVkYRQNOkCr6\n /i4Tebz5WxKz422SZhMLR77H+s5ABdYFCXx9oAoy+syuzVBvfBDmMvO7rJKvnRNgIRwnvDBm4SJi4Ba9lBF7T++EschSHGSxo\n t0w2Qk1FRCVjKjnQBQ3q+O5rfGPbcqo4yjbgOtUhL2ZEu8FQV+18b+eDugN3gb4PsEIOxlh10ARMmnraSD5dWZyNWuA41IEvZ\n kS5w5XN2P5b3bjkZ4fDlFPRvFZ2pl8N5KKSTzEh25XglHZAu8BN7MCgucvU4igTL+89E4ybDpSXgcUuZQQekC39zccoH22DYB\n Uvcch8eeYRJzBXlwCbT8xLwZeWZH8YMy4gfyOtgdLfXfzNesKvDQOYQTDAvhX1VZWYwZlQHdSzJiGRlxSRkr97tDw6oKCOeH/\n 4RzocvtEHiMP5FDDxWMzQbfAcTjMPY3+Dy4rdteMJA/gh+HeUiBet3WSrQ0dO6HJuIO1W4lOsTtJw9lMJz0KVBJvbKYDtJ5ro\n MQgrhfK3bMaftFCjlZR2oqF8yjD3y00XTD7kEyMKXSXnGIeOX8rJeG5rhhroshebFrcva3t+z7znbjUc0u1fxhvcKl8v3FI5D\n yXUkn+YJeT+6+6Ps+OavTJ3VerIaN/Q8RoUoALyzsQlz6LNVuLzLfwiYB8rDHVQQmHVaDt5gGy3jMTz7gUNB8xfqsqIglBFLe\n XRLtp+8FBrehOneGbY5Jioc8Ui8VqQMwW8upQySRckWooQ1PHDBcW6OfrVVmt4+VGAhFzUBjYvdV6+ffQohb2QA77JAaFeBOS\n vZ5YvKX3cSyVPbux99qVzRK0CKl0L6Urfijd9/L4c0mg7F4DE+dgvMLe22+qMIGhzGFfYjcUHpJghrbsVFEfzreCgk9g5hMTw\n VKYSQ0EsKO97dtg5GdT3FkJaKh3KewL7N9wCzpxRcE6TNAo9XQ0BVdb/gsa9j+ryllb4kUbFClKD8X4lw31lva3qq8ukuujVq\n MY84QvTnXFl+60bPXGd/wuEtructAtoL0R0dWTV62Os6zowl1d7MrVohqsBkSzTU9/v/xuWVit7vUfl1l8YdjDnP4uRsk+OJp\n 8dqGk3TVFd4p+FA6BxsrJ5a2Xigl1jzc3FvZ89HPs/5KuzBVv/VrBCd9PBA6mOuK38Esc7W4+vm5+xdCPFFKOxFnD2/AWGOSE\n +MYMazl2hg/2gKHo9ug1LbPC6PAOzxgD0e5ZletzLoiDh7wXH4Re3dGTurEj1vEX9dFaLTwE+tXI7Ntdtrav46wibxUzeLO/Q\n 3dizKPDgWRRozheiFhWX9RzFJvBMr2dP1+Inix07EU2hl18NC/XdjXeZxUUiUiaHMEmzf576MGVcKjCai6Q0N+1eZWQavb93W\n mVr/2/EuS0MUYmJyR9/SU5jMfgLPtC3E2L4AXV09nukwkfLj0PXsx9puKwzTtjCe/GlHz7o/FgUex4SmUUg5np95ZkVy5mt7j\n hK57DGu5Id5Dn6o2ZOt6M/buMRAjg+PimKQlyN4HHqfcNmIw+VbXiK5++0PzXp1fh1//7VcWWtJ/3+2rdRgE9SSwwAAAABJRU\n 5ErkJggg==`\n);\naxisIconMap.set(\n 'negY', `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGYAAABmCAYAAAFO2NT0AAABYWlDQ1BrQ0dDb2xvcl\n NwYWNlRGlzcGxheVAzAAAokWNgYFJJLCjIYWFgYMjNKykKcndSiIiMUmB/yMAOhLwMYgwKicnFBY4BAT5AJQwwGhV8u8bACKI\n v64LMOiU1tUm1XsDXYqbw1YuvRJsw1aMArpTU4mQg/QeIU5MLikoYGBhTgGzl8pICELsDyBYpAjoKyJ4DYqdD2BtA7CQI+whY\n TUiQM5B9A8hWSM5IBJrB+API1klCEk9HYkPtBQFul8zigpzESoUAYwKuJQOUpFaUgGjn/ILKosz0jBIFR2AopSp45iXr6SgYG\n RiaMzCAwhyi+nMgOCwZxc4gxJrvMzDY7v////9uhJjXfgaGjUCdXDsRYhoWDAyC3AwMJ3YWJBYlgoWYgZgpLY2B4dNyBgbeSA\n YG4QtAPdHFacZGYHlGHicGBtZ7//9/VmNgYJ/MwPB3wv//vxf9//93MVDzHQaGA3kAFSFl7jXH0fsAAAA4ZVhJZk1NACoAAAA\n IAAGHaQAEAAAAAQAAABoAAAAAAAKgAgAEAAAAAQAAAGagAwAEAAAAAQAAAGYAAAAAoo8/3AAAFixJREFUeAHtXQ2YVcV5nplz\n 7y7Ln7J7NyFYq7U8u/yJQWuraVoVGvwrWlGpUh8jIIXdjfiIWK1p2lWTaqomsYZliUESIcHwE42lRiUK0iiJKbUqyC6o+CgNk\n L27gBBgd++Z6TuHncM5c+ace+7du7sX3PM8u3Pmm+9nvvnOzHzzewnJ46E6TdXCFqHDZHx7XaWL675UN6TbhRAllLKZ1OY7vY\n Sc0ZcJEUwRMpUoCRgnl+gEMp1xMYlyOknlwpF0LMLqGeevKiamkDOy3mGiErMROMjIiY9IEccJXZ3iICuc7hEpJRU3UyhxKCU\n 7HEmq/InFrjQhS5hi2lxbWeUaVyYoO0h7ybh6FIFi7iOSSIpQERwL6TPb61JT/bAcYz5JZimEAOlQc13lEMXbJVIEuj4S0ahT\n FIHi7iV0jWuSoAhk6E2ncaQoYkcaY/MdSV4uCiE05PxbDhFqazIUyZDgENmUv2RIM4LkV+HWeyNGCNAtPVWkIXiOrZLJxASZH\n jCuIHSTxcW9ithlRum722tTY31ECkmZQMVlqL5uBXMlKYAe1gvBftyQtnW4N04pfaW5NjXJC9PfjYKqF6ZfF0Rc6EOm5HfMJn\n /rgzHrAk7sB30wRHRtZLpPUFVDy38QQf5aEeb0cYGI0cQpGZp5VtF7BbqCvOWcqwDFWIXoYr6MLuYWGaclybOaZ5+60/mECil\n EMke39EM0qDXyXXR0fuDA5D/PM9/z3q1XapMmxUAq4lYKCUSRvakSCx36BHGLfLvQArr4bXQEMdbVpQjy+UIJcms6GOLru8gR\n 1FRTuYES+k9SiESAZgu6I1AT4nzZ7uetGHu/QNSyo6ikl6u0bKFXgOzGZa+saAKCVIJPoALGCFW90VFDBemIlz8vSj/4MP2ME\n Mc1hG0XoNgf1XH7LJ5VG3iyy+CY3hSVw2RlasjWafRQGE6oENhmB4hGhhGa4CPGpJIbLqEZPc0oxGR8RuhDhIsXvQxsRp4AAz\n 0je1FXhnvxAkJ0AbFabkaGcEKe8zI2dgkSwSuAMlpLM2KblzDbu1ZndqPOjJA0bpvmE0DY9bkKcJh5vGB87p+T3b0rBF+PW2x\n obt6hnKdlYj6Pt3iVP+Ew92rhRcpHiKSBMzLMpuKn8v2P/yg1wC0uJ1HQpTLs7oOS2ad4vL8zfZSNW5gerQBUiKfUe3dDFNEe\n xYN1UvKMihQ4nK74MahWrSKFDCmHI9b1+GyigIUOe0cIo9T1ygupAbfYjYqfr57IuQRKBJqh7j/eJsZXXIIJzHQU9kHF/KYjB\n I1hQyFZe7XAMOQeR0hzTapOCfEiKFguIWfsIhefkv+S725xDUmkBqnEfAVh+IoOjNcrPttrK/9SvrtCNs+hhxFfoRCkIDTUbu\n us4GEht+hyDHefUOmhnZZEwKhsOUZlf6eQZWiJ5GQhOju9MPWOjMxH1Z6i4jL0CpBxY04vXCnKWlvSUrOcH12AZGAUojhXN7Q\n +LASP5SebmCs+kUIUkgyrG1rmogNdKGcMu+Abk6Ul12y99ZQ2L57pPbYQE7EJNqohfRtsVJe9dae7GBFLrMrUv8Ix7DDxyhWW\n tzJnN+wf1kEy7yHT5bkKjcKHL5PBdNH4LXWpnDwyyTMnZUY3tF1pC3ttVGYKnYZv7b6musr6OHxjKYPmII3moCKKIaPsTmLz/\n 4nCCU2j9AzORCPcgwEROALzXKoeGdEilcFE0F4I+IyJkhL2S7i2XzOldReGqn8T6t0sMx/KMXlsmdKMyoxuaL3AFnyTicBiia\n kik3G9UhNOoWCYjWRhHoKclmiuS33DKyugDIamr6BSX+JFku+UWHdTbr+hw3sj7h03+ORRegCf3qkK5lMGirwBRc5XiSosxEB\n G8epOiH7/FeIZxXXxakcH59Q1t0JVL0rXFLMiMuPMFhPxeek+SCmM8DMnvUs7OMci4GAWi0VUHmVIuZjsjct3GOEq/FHHMvBZ\n /k1HANm6IKw4IBiX+Cq+zNWohta3nDrjHeir7BajVVTeZGhy6N0640U8Ud9PQmUo/ZVuDU6JM57S4cUQF4wZ3R7HMkMsdlkgk\n 5TcF4AVCUBQHpihoha73lFm85zyA+hlD+p5FRbtEd9Ll5NTPEEvNTmkzXMrVrt1BpMNQ3WmaLsnCkq/osP7Ki6Y9aeci3t0+W\n qI63NnJJKpmQb4CJrqK3QmvRlHU7xYZk+XifmXEkyPOF5BQBmJHKIQoYI9TAV/XmfYo3FGz8Q86FKTDGURleZ+ZgogQ4kktyZ\n 5YfIdFe8u2Vnh7249rdBxm5KrHVkGRWCBlboiUr7RMt6MVTWkN8H5ucAL875jcWKtJUhB1t+ERaaBn7P27ZWh3lHCbajboSPe\n rMooRvBMb0KDsEzFo0IstexgnD1rEfYaF5kDXlzZR2DZ9ELwuhJD8fO8aaHvlD6Occu80PSuhNjKeBmNWtRyJ+fkES+s8O/0B\n xgez8iFb17K6AJGNbScxwX5OeCVelrMeDusNQ0Ldr6Vwpi0JydaQSyjimbM91rHZjLifjCdgjoRvvWLUky+kJctZj2wbe6wjY\n q+u2G3lRnd2PolbvNnkDt38SD3TFEsTJBZTTWpH+ROe5wib2WqFrX+C+HHVy2Os+zeG5rfZWh+b86HS87KVDe2XiZsLit7jz7\n 57B/JSZk407SF1ZDy6bUVyXqKld0YTyxlzlmUPu0IF7ti8IPLQ1+E/7aUcbo3FJ9ag+Ea3YzO9TrDPFiADJmciF226wMJGiCr\n MlFTtYoXevJNWMP7qndlXKXFCeUwQ1BxbRQu1lpvx1Lov0fiRCVWNaYnEVv8IgLnbQwNbo9IzykJg8E70KRfFUYEhb4BhZytb\n yacUMuM/f6BkZ3tHTtMRBIGd/sqwklgdBqGHxcul2lhqXX4/Iwz/ZB8w/a6ip+Y+BmHACgdGqoIPFdnTq0HFJEZlJ8qpmH/Cq\n 9vmzKMGbOnxy86aFxmMSozalFru4kR3PP3ICjy2zbR5QPr+nz/00R7lB81Ni4BZeDqPxTiiuzFuGW2iXlPwaDQIxgkvmbiX72\n wZbMOD9QZ45AZvpScgdeJeyuOObw1GEYGFoJLSsqGb5k92LWSzzKwyjumDFKakN9wnz1MEOOn3dlx1Nf3+ZTB5zUumGPxFM10\n xuqBg7SFhNDbdG7o3xLVS1pGKLirDMb6axTQG6InN86MeHF64x1747dATrBhaqcS7jyuMmjXpyqgCpmggbMKKq0vQqxwB7YB4\n 2sapvLiKDNq0b4zFcAXCvGSL97HkbBdqJiTmCOz5igjhB1YicK+TGNj0Mf6yLmxJXoeBKdO/ruUEdMDCEQ8rMOKIQ4PYbmeD7\n V75Hid0TCwm+BjDVT00VBlijrnlHTo+Zvw5O5KNv6pPcGJCCGO6MjFFMfcTmArzOH2srOZtV8MDGSU0Z0BWBEBsKcmmD9ql7O\n OUlEWyKcgrQFYEQGwgzCQP+xbLmcWKw24KtA8UUR5D2TFNuSP8UyG2TRxWMfGDogKHVZMcfQ1gfxlGGtjfzhi6O+DGaUjg7Di\n gUCZ0XpuMO5pYT+/ggadt+PbcHWaooib1nUGs6Nvnpj9jKFIN88ZcfiYMhTnQbUHJxjP1UBFEcUGutDGyVEGCz2PBnNKvxqEF\n QFE0H/Qc4H8OzM5jjLlFRX1OgLGN4ExdwCnTwD8S7pYweh8CXOU2TSNmt0XRrMuiuqMezTOqHHVe/vc1MuuMvIF6yJf1zOC+b\n hrdFhfxpGfwMgXn9hmladjDQBiWOAxbvrB/O/jCrkvQ0zZGhegxqdSf6by5SojAbBOYPJCztjwBD1dEfRFiA4xiVWCGbps5Pe\n jVdOOt8ToTP2PcRIQKM78sh+112Jy24lJmL7lxGcZSWBRGmgtJDyMoUzryQf93XNm/izQnQQsIwkxh7YVTfOYABN0rl0z9IGk\n ngCgg1wT0kW4u8y9co3KSISwz02mYV8MtkFyg08nUwvzoO94CT5Y0sRN/7wUTuAzUwlo3ULTOOMv2Iz+jcItZCgSdLz8pMMUG\n VQ2wLg2I/MQahmZOHalGNzZkj4o380PxneC3ogF2d+Z0+ND5W4nQfgqUAwOo6LUOqe5ttxxXUw4kcpIgvMWi+TBTDowG+JnJp\n e26QO4dGuDH549xhPWOGyOeAhb84ITKx7yASXs9LdnV+zygAKvWZVRFFjcOSgiSk3hobNCl8DXCJZ4lWVsd1JbpaPPGGkz8UV\n U7BsAK1XwqBBXSZTGOTEYWxkprHphayM+BWdeN0p4wdKweRyb5i6Myy8nZSTTi9eLxO530/tiWSluLnQ8WHfQgNLPvjlzSIue\n FBXPWRnFbOzSQ8Mzh4/sKKhScrmRiPObaitd51HJixPmrYyXOfbUPIamNO/hAk4rrR6cqJiu9id7eefyXhBlvALHNLT9hU3sq\n bDYVdjmfpY3retdLqg+Z1HrZ9tqy41L4waaWKCCKxNLap5I168UVvOets91JsgfwJsfgV5yCDYTDUT7WYa5voG4h2EgnMt2wT\n NHYO3D2LeASQ6EFtmDC9t2VQ6s3LVhBj2ap/heJSsqw0iHg7e0ToVXcQW+0kvwlYZ6LoUqJQxUYUD6GpqedUnBnt5SV1EUy1J\n 9ZhhphExLay2++HnwBU4rVEEXio80GKZ1l5ES65vyprxC8Y3Lp9cMI28ke//DtrvR5CxAMzQkbgaLBw+eNBUryyhd8FZN6v96\n Ol89ahi5SfWoII/BENf2tCK9zR+zQluExWq2zyn/ZU/ILrhhHId6W9uDcNPuRBNVcP7geQTDpY/R/3yM60B3obk5iP7hiOD8C\n O5+wmZlXP1s0TLHEcBYD33VcBTc6aA5HbTuFptCFiaMtD5RNmD61hmD9xSKb8EKTt6E1kHJi1C+APOetAWF/gtsyHoJF/99WC\n hldT7w3E61LYLbBQRuOSLVenqucRiokzL25aa55StypdXxu22Yqoa2yymxV0Ox4K4IXZoxjqkdKjZik85yfPXvG1F6ESjv5LV\n JZhpm6K/ONrsSmS1KH8RY/95InIjEvA0zevH+c7md2ZBXR07pPkzA47Kc4tqUZyonXM1ZjbHQHWia86pRaF7nNdWmcl4Oytkw\n OBpQ3tnR8ZuQkbBJNweGZiODHmcx5ttXhyIVeYKcMSacfg2zbKlcsoomDq28NbmpdtircelyMsyohS0LMPv6cFzmXXi/Re24C\n ++/zZGuaNEpTSY5tf8ZBvpibpmk63A+67L6GOezYhlm/FNiUPuh1i1ots7MISM7mbAweLQP5UBzwqFizUV+dFfEzjhW6ZKUfG\n FrTeqNKJqshpHeFq6FfQtGMa5cBZnTT7A94issI4piaiOYvx6AMFaCPugR/J0dlztj9DYcrP1uGH6kYaoXtU6Dp/STMGIdjrb\n 0x9QWT+jwT0sctWcC1tlwm4B7U2ak6iivpVhhnWlCCjVMdWP6amEL96ccTMQuTHZugs3EXXQ9PlXhyizSF5FIMsE75cdpWiYI\n 5BpnTRY311XM1ROM6+GjFrZOjmsUWHY3DtZM6TfKsaKVx77g7MyC1/qCXtimuFxHhVP1LT0tUGOkO5zp6NyNPqVER9bjWAf5C\n BN7t8iDoXpafxwNWowz2qqcGGPXNdVUrHHj6kWFmfbOtbGMIi+NtxIz+o2iSi4Y4jDYd7GYF2tlE2W+omrxJ+74yNeUVTW03g\n rPItaWAQyY5hfHac1ggRQTBD8tIw8wf5QtT9LrpXZHo8LzGQYbXB5QCVEhzp88Rri9OwqnP+14CaDJv+d4LPwNxrl2bOO+cyS\n Gaxi4xjO7psjDKZECLyKN9fN43lokp09R4rGP+Pk4Gme47RxRcA2DCUXMpmZ/4EUsy47VjxEoAWbFKjd0JVPq67EFUjKQLwgu\n DzAzALB28boB3A/KUgLY/ygX0T7IggZXjgxY8Zl94xzDPHvG/qGy88lKROmHWD1JZ8XrRzCWAMYm/21M0ICM2Kc7hmnvyJRpa\n eaoCJ5QNSP2Q00lAKcp1kdtU5z6lQwET5SaGOkwzO0c0GH98fglgML+JA62JfhQxzCJRIf5mJzGBR1TuQbqj+ZQAlhDj1V+2M\n PS5hhm0JFELMPgGoThOeSjH1UrAThO8cpPHpOXtL+eV/EJmql9Gp9A1BnnMHpmIKEfEKsE4GDFmlVJsMx7jmEkVxT6c3G4Y2n\n 5ojh4/Tj+EsB+gdGAVPqhxtjeLXM++75rGPxE1Gojmg6kZDrBip0O7o9HlwC2d82IxjiWil01jh1cwzTVlK9Fc/abrMRYDhDE\n np0Vrx/BLQHsDjofMyvnu4CwF2yw41ZJvUx2DSMjMIzxmLxM8z7wx6+jFnWPpnvT+t/9JSCSJQMwr3K/H2qOwTl4bPucoc5Yx\n 2cYLNS8iP1fT5rJ/FBcJv91/KJTj59f8Us98WI80/G4nGbJnnO668aa1J0KL7CCCc+B4nendmLMcoZCCg1xJRouebmht348Lz\n QfRZqAmwoWwihj4mQvabGxW+dWvKtwfTVGAtGcicTAARdgfv+oQgoNBSnBj2euQs05KxTnU5ggL/TAjpnlcY2CHz+40WsUWWQ\n Bw0igPE5glSRGwUidMh754DZrXKy+BGdF4m96i2R4gida1gib8bXQ4rQ4muB0wKxtNeVP67iBpsyLIG9o5Twjq1e8SU5MazPC\n anAPQZZ7DrxSTp53nB2dhyYn9gVJcI1vwYbzH5pKINIwkgBnJUsyLel3MACtMjEwwXB+8fu4gedHprSTEcYZHYch+iPQLd5kM\n DbYY1fMBNSULWHlkdUwihB3gT8Jx2CGimcNnWvq6P3M5huz4p64CCNglO/AKHFG9I6W+Gh3JFKpc3HZx6EotWMbRjKRv+hjZz\n h+TDe3Q0roDJdQmy+PysiJlIYB4+exZwz3vEVfG6PrBKPU4PemGnW4KZ6TYRQD/EDwd/C7urereOwQK6BM4Bcre/D4Xuy85Ig\n IZ3Ugasdd+CgvzpEU3Q7ZjFpycbZa4uWbl2EkA3mZ0SG7VW4OnOxlGPcdA9lmbOD8tsVJc1ya3saDVzoMvwExF2O6/HSkZDdJ\n Jv88n3sC8jaMKqSuszNrYKBLFSzX8NhpM7GOCutHfbkHGutNgzAovAaOznXQ4ZRc9XDxcaoaE4qXbqlLbXNhOb502zBKnpwxG\n N2QfhTLAncoWLdCKjtH8SpOEfyaEv6/hfxlIWcAiBE5RmDnYXJxEvI5olt57SJGDXs9UZKcsvXWU9q6y69ghvFmpLqhpRo7ql\n ehCYh9kMdLH/+d/h4K4Co1eQE+PQxDytmKpHRO8PtTZfhYBiH91Pj88sGk+zFKn9VUl/ppPtRhND1iGK+wY1dL8QYUEnz9k+N\n BzcBqr7gXk47fq49xnjIfrXvcMN5MyStM2gX5R3T68vxIjBlXL3XfvqOgXsBi4n3bait+1Rs56VXD6Ao5R9M7O/8eRroZbb1c\n ei2KB+5tGmtOK5KMNuqTi72VwT41jElJeRfN3m1tf4J+YyL6iokIvwC8uHN1JpYhMOc2pbfQP6zHkZJXeKm9sXlWZcTlrCFse\n ghcdIaJq6fcb72KvJsYOmaM1XYwnShjCetwx5FE6eCB9sBW286UlmcOtL9nTxg+MuO9Ozsu/77G+3+04346/NDWWAAAAABJRU\n 5ErkJggg==`\n);\naxisIconMap.set(\n 'negZ', `data:image/png;base64,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`\n);\n","import { Texture, noop } from '@galacean/effects';\nimport type { Engine, math } from '@galacean/effects';\n\ntype Vector3 = math.Vector3;\n\n/**\n * 下载图片\n * @param imageUrl - 图片url\n * @returns 图片对象\n */\nexport async function createImage (imageUrl: string): Promise<HTMLImageElement> {\n const image = new Image();\n\n image.src = imageUrl;\n\n return new Promise<HTMLImageElement>((resolve, reject) => {\n image.onload = () => {\n resolve(image);\n };\n image.onerror = reject;\n });\n}\n\n/**\n * 创建 Texture 对象\n * @param engine - engine 对象\n * @param image - 图片对象\n * @returns 纹理\n */\nexport function createTexture (engine: Engine, image: HTMLImageElement, hookDestroy?: boolean): Texture {\n\n const texture = Texture.create(engine, { image });\n\n if (hookDestroy) {\n texture.dispose = noop;\n }\n\n return texture;\n}\n\n/**\n * 移动到距离目标点指定距离的位置\n * @param targetPos - 目标点\n * @param currentPos - 当前点\n * @returns 指定点\n */\nexport function moveToPointWidthFixDistance (targetPos: Vector3, currentPos: Vector3): Vector3 {\n const vecCameraItem = currentPos.clone().subtract(targetPos);\n\n const normalVecCameraItem = vecCameraItem.clone().normalize();\n const scalerVecCameraItem = normalVecCameraItem.clone().multiply(20);\n\n const vecScalerItem = vecCameraItem.clone().subtract(scalerVecCameraItem);\n const vecItemScaler = vecScalerItem.clone().multiply(-1);\n\n return currentPos.clone().add(vecItemScaler);\n}\n","import { math } from '@galacean/effects';\n\ntype Vector2 = math.Vector2;\ntype Vector3 = math.Vector3;\n\nconst { Matrix4, Vector2 } = math;\n\nexport function distanceOfPointAndLine (point: Vector2, line: [Vector2, Vector2]): { distance: number, isInLine: boolean } {\n //三角形三个边长\n const AC = new Vector2();\n const BC = new Vector2();\n const AB = new Vector2();\n\n AC.subtractVectors(point, line[0]);\n BC.subtractVectors(point, line[1]);\n AB.subtractVectors(line[1], line[0]);\n const lengthAC = AC.length();\n const lengthBC = BC.length();\n const lengthAB = AB.length();\n\n //利用海伦公式计算三角形面积\n //周长的一半\n const P = (lengthAC + lengthBC + lengthAB) / 2;\n const allArea = Math.abs(Math.sqrt(P * (P - lengthAC) * (P - lengthBC) * (P - lengthAB)));\n //普通公式计算三角形面积反推点到线的垂直距离\n const distance = (2 * allArea) / lengthAB;\n const l1 = Math.sqrt(Math.pow(lengthAC, 2) - Math.pow(distance, 2));\n const l2 = Math.sqrt(Math.pow(lengthBC, 2) - Math.pow(distance, 2));\n let isInLine = false;\n\n if (l1 <= lengthAB && l2 <= lengthAB) {\n isInLine = true;\n }\n\n return {\n distance,\n isInLine,\n };\n}\n\nexport function projectionOfPointAndLine (point: Vector2, line: [Vector3, Vector3]): Vector3 {\n const AC = new Vector2();\n const BC = new Vector2();\n const AB = new Vector2();\n const line0 = line[0].toVector2();\n const line1 = line[1].toVector2();\n\n AC.subtractVectors(point, line0);\n BC.subtractVectors(point, line1);\n AB.subtractVectors(line1, line0);\n const lengthAC = AC.length();\n const lengthBC = BC.length();\n const lengthAB = AB.length();\n\n //利用海伦公式计算三角形面积\n //周长的一半\n const P = (lengthAC + lengthBC + lengthAB) / 2;\n const allArea = Math.abs(Math.sqrt(P * (P - lengthAC) * (P - lengthBC) * (P - lengthAB)));\n //普通公式计算三角形面积反推点到线的垂直距离\n const distance = (2 * allArea) / lengthAB;\n const l1 = Math.sqrt(Math.pow(lengthAC, 2) - Math.pow(distance, 2));\n const l2 = Math.sqrt(Math.pow(lengthBC, 2) - Math.pow(distance, 2));\n\n const worldAB = line[1].clone().subtract(line[0]);\n\n const worldAP = worldAB.clone().multiply(l1 / (l1 + l2));\n\n const worldP = line[0].clone().add(worldAP);\n\n return worldP;\n}\n\nexport function computeOrthographicOffCenter (\n left: number,\n right: number,\n bottom: number,\n top: number,\n near: number,\n far: number\n) {\n let a = 1.0 / (right - left);\n let b = 1.0 / (top - bottom);\n let c = 1.0 / (far - near);\n\n const tx = -(right + left) * a;\n const ty = -(top + bottom) * b;\n const tz = -(far + near) * c;\n\n a *= 2.0;\n b *= 2.0;\n c *= -2.0;\n\n return new Matrix4(\n a,\n 0.0,\n 0.0,\n 0.0,\n //\n 0.0,\n b,\n 0.0,\n 0.0,\n //\n 0.0,\n 0.0,\n c,\n 0.0,\n //\n tx,\n ty,\n tz,\n 1.0,\n );\n}\n","function _extends() {\n _extends = Object.assign || function assign(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\nexport { _extends as _ };\n","/**\n * 基础几何数据[抽象类,不可以直接用来初始化]\n */\nexport abstract class GeometryData {\n points: number[] = [];\n uvs: number[] = [];\n normals: number[] = [];\n indices: number[] = [];\n\n /**\n * 构件 XY 平面圆(圆心为(0, 0, z))\n * @param radius - 圆半径\n * @param z - z 值\n * @param segments - 圆精度\n * @param thetaStart - 起始弧度\n * @param thetaLength - 终止弧度\n * @param startIndex - 索引起始值\n * @param points - 点数据\n * @param indices - 索引数据\n */\n createXYPlaneCircle (\n radius: number,\n z: number,\n segments: number,\n thetaStart: number,\n thetaLength: number,\n startIndex: number,\n points: number[],\n indices: number[],\n ) {\n for (let i = 0; i < segments; i++) {\n const theta = thetaStart + i * thetaLength / segments;\n const x = radius * Math.cos(theta);\n const y = radius * Math.sin(theta);\n\n points.push(x, y, z);\n indices.push(startIndex + i, startIndex + (i + 1) % segments);\n }\n }\n\n /**\n * 构件 XZ 平面圆(圆心为(0, y, 0))\n * @param radius - 圆半径\n * @param y - y 值\n * @param segments - 圆精度\n * @param thetaStart - 起始弧度\n * @param thetaLength - 终止弧度\n * @param startIndex - 索引起始值\n * @param points - 点数据\n * @param indices - 索引数据\n */\n createXZPlaneCircle (\n radius: number,\n y: number,\n segments: number,\n thetaStart: number,\n thetaLength: number,\n startIndex: number,\n points: number[],\n indices: number[],\n ) {\n for (let i = 0; i < segments; i++) {\n const theta = thetaStart + i * thetaLength / segments;\n const x = radius * Math.cos(theta);\n const z = radius * Math.sin(theta);\n\n points.push(x, y, z);\n indices.push(startIndex + i, startIndex + (i + 1) % segments);\n }\n }\n\n /**\n * 构件 YZ 平面圆(圆心为(x, 0, 0))\n * @param radius - 圆半径\n * @param x - x 值\n * @param segments - 圆精度\n * @param thetaStart - 起始弧度\n * @param thetaLength - 终止弧度\n * @param startIndex - 索引起始值\n * @param points - 点数据\n * @param indices - 索引数据\n */\n createYZPlaneCircle (\n radius: number,\n x: number,\n segments: number,\n thetaStart: number,\n thetaLength: number,\n startIndex: number,\n points: number[],\n indices: number[],\n ) {\n for (let i = 0; i < segments; i++) {\n const theta = thetaStart + i * thetaLength / segments;\n const z = radius * Math.cos(theta);\n const y = radius * Math.sin(theta);\n\n points.push(x, y, z);\n indices.push(startIndex + i, startIndex + (i + 1) % segments);\n }\n }\n}\n","import { math } from '@galacean/effects';\nimport { GeometryData } from './geometry';\n\nconst { Vector3 } = math;\n\n/**\n *\n */\nexport class SphereGeometryData extends GeometryData {\n /**\n *\n * @param radius\n * @param widthSegments\n * @param heightSegments\n * @param phiStart\n * @param phiLength\n * @param thetaStart\n * @param thetaLength\n */\n constructor (\n radius = 1,\n widthSegments = 8,\n heightSegments = 6,\n phiStart = 0,\n phiLength = Math.PI * 2,\n thetaStart = 0,\n thetaLength = Math.PI,\n ) {\n super();\n\n // 限制至少需要分为六块以保持形状\n widthSegments = Math.max(3, Math.floor(widthSegments));\n heightSegments = Math.max(2, Math.floor(heightSegments));\n\n const thetaEnd = Math.min(thetaStart + thetaLength, Math.PI);\n const grid = [];\n let index = 0;\n\n for (let iy = 0; iy <= heightSegments; iy++) {\n const verticesRow = [];\n const v = iy / heightSegments;\n\n let uOffset = 0;\n\n if (iy == 0 && thetaStart == 0) {\n uOffset = 0.5 / widthSegments;\n } else if (iy == heightSegments && thetaEnd == Math.PI) {\n uOffset = - 0.5 / widthSegments;\n }\n\n for (let ix = 0; ix <= widthSegments; ix++) {\n const u = ix / widthSegments;\n\n // point\n const x = - radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);\n const y = radius * Math.cos(thetaStart + v * thetaLength);\n const z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);\n\n this.points.push(x, y, z);\n\n // normal\n const normal = new Vector3(x, y, z).normalize();\n\n this.normals.push(...normal.toArray());\n\n // uv\n this.uvs.push(u + uOffset, 1 - v);\n\n verticesRow.push(index++);\n }\n\n grid.push(verticesRow);\n }\n\n // indices\n for (let iy = 0; iy < heightSegments; iy++) {\n for (let ix = 0; ix < widthSegments; ix++) {\n const a = grid[iy][ix + 1];\n const b = grid[iy][ix];\n const c = grid[iy + 1][ix];\n const d = grid[iy + 1][ix + 1];\n\n if (iy !== 0 || thetaStart > 0) { this.indices.push(a, b, d); }\n if (iy !== heightSegments - 1 || thetaEnd < Math.PI) { this.indices.push(b, c, d); }\n }\n }\n }\n}\n","import type { spec } from '@galacean/effects';\nimport { GeometryData } from './geometry';\n\n// 面造型未单独抽离, 整个包围盒只接受一个材质\nexport class BoxGeometryData extends GeometryData {\n /**\n *\n * @param width\n * @param height\n * @param depth\n */\n constructor (width = 1, height = 1, depth = 1) {\n super();\n\n let numberOfVertices = 0;\n\n buildPlane(2, 1, 0, - 1, - 1, depth, height, width, this.points, this.uvs, this.normals, this.indices); // px\n buildPlane(2, 1, 0, 1, - 1, depth, height, - width, this.points, this.uvs, this.normals, this.indices); // nx\n buildPlane(0, 2, 1, 1, 1, width, depth, height, this.points, this.uvs, this.normals, this.indices); // py\n buildPlane(0, 2, 1, 1, - 1, width, depth, - height, this.points, this.uvs, this.normals, this.indices); // ny\n buildPlane(0, 1, 2, 1, - 1, width, height, depth, this.points, this.uvs, this.normals, this.indices); // pz\n buildPlane(0, 1, 2, - 1, - 1, width, height, - depth, this.points, this.uvs, this.normals, this.indices); // nz\n\n function buildPlane (u: number, v: number, w: number, uDir: number,\n vDir: number, width: number, height: number, depth: number,\n points: number[], uvs: number[], normals: number[], indices: number[]) {\n\n const widthHalf = width / 2;\n const heightHalf = height / 2;\n const depthHalf = depth / 2;\n const point: spec.vec3 = [0, 0, 0];\n let vertexCounter = 0;\n\n for (let iy = 0; iy < 2; iy++) {\n const y = iy * height - heightHalf;\n\n for (let ix = 0; ix < 2; ix++) {\n const x = ix * width - widthHalf;\n\n point[u] = x * uDir;\n point[v] = y * vDir;\n point[w] = depthHalf;\n\n points.push(...point);\n\n point[u] = 0;\n point[v] = 0;\n point[w] = depth > 0 ? 1 : - 1;\n\n normals.push(...point);\n\n uvs.push(ix);\n uvs.push(1 - iy);\n\n vertexCounter += 1;\n }\n }\n\n for (let iy = 0; iy < 1; iy++) {\n for (let ix = 0; ix < 1; ix++) {\n const a = numberOfVertices + ix + 2 * iy;\n const b = numberOfVertices + ix + 2 * (iy + 1);\n const c = numberOfVertices + (ix + 1) + 2 * (iy + 1);\n const d = numberOfVertices + (ix + 1) + 2 * iy;\n\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n\n numberOfVertices += vertexCounter;\n }\n }\n}\n","import { math } from '@galacean/effects';\nimport { GeometryData } from './geometry';\n\nconst { Vector3 } = math;\n\n/**\n *\n */\nexport class CylinderGeometryData extends GeometryData {\n /**\n *\n * @param radiusTop\n * @param radiusBottom\n * @param height\n * @param radialSegments\n * @param heightSegments\n * @param openEnded\n * @param thetaStart\n * @param thetaLength\n */\n constructor (\n radiusTop = 1,\n radiusBottom = 1,\n height = 1,\n radialSegments = 8,\n heightSegments = 1,\n openEnded = false,\n thetaStart = 0,\n thetaLength = Math.PI * 2,\n ) {\n super();\n radialSegments = Math.floor(radialSegments);\n heightSegments = Math.floor(heightSegments);\n\n let index = 0;\n const indexArray: number[][] = [];\n const halfHeight = height / 2;\n\n generateTorso(this.points, this.uvs, this.normals, this.indices);\n\n if (openEnded === false) {\n if (radiusTop > 0) { generateCap(true, this.points, this.uvs, this.normals, this.indices); }\n if (radiusBottom > 0) { generateCap(false, this.points, this.uvs, this.normals, this.indices); }\n }\n\n function generateTorso (points: number[], uvs: number[], normals: number[], indices: number[]) {\n // this will be used to calculate the normal\n const slope = (radiusBottom - radiusTop) / height;\n\n for (let y = 0; y <= heightSegments; y++) {\n const indexRow = [];\n const v = y / heightSegments;\n\n const radius = v * (radiusBottom - radiusTop) + radiusTop;\n\n for (let x = 0; x <= radialSegments; x++) {\n const u = x / radialSegments;\n const theta = u * thetaLength + thetaStart;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n const px = radius * sinTheta;\n const py = - v * height + halfHeight;\n const pz = radius * cosTheta;\n\n points.push(px, py, pz);\n\n const normal = new Vector3(sinTheta, slope, cosTheta).normalize();\n\n normals.push(...normal.toArray());\n\n uvs.push(u, 1 - v);\n\n indexRow.push(index++);\n }\n indexArray.push(indexRow);\n }\n\n for (let x = 0; x < radialSegments; x++) {\n for (let y = 0; y < heightSegments; y++) {\n const a = indexArray[y][x];\n const b = indexArray[y + 1][x];\n const c = indexArray[y + 1][x + 1];\n const d = indexArray[y][x + 1];\n\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n }\n\n function generateCap (top: boolean, points: number[], uvs: number[], normals: number[], indices: number[]) {\n const centerIndexStart = index;\n\n const radius = (top === true) ? radiusTop : radiusBottom;\n const sign = (top === true) ? 1 : - 1;\n\n for (let x = 1; x <= radialSegments; x++) {\n points.push(0, halfHeight * sign, 0);\n normals.push(0, sign, 0);\n uvs.push(0.5, 0.5);\n\n index++;\n }\n\n const centerIndexEnd = index;\n\n for (let x = 0; x <= radialSegments; x++) {\n\n const u = x / radialSegments;\n const theta = u * thetaLength + thetaStart;\n\n const cosTheta = Math.cos(theta);\n const sinTheta = Math.sin(theta);\n\n const px = radius * sinTheta;\n const py = halfHeight * sign;\n const pz = radius * cosTheta;\n\n points.push(px, py, pz);\n\n normals.push(0, sign, 0);\n\n const uvU = (cosTheta * 0.5) + 0.5;\n const uvV = (sinTheta * 0.5 * sign) + 0.5;\n\n uvs.push(uvU, uvV);\n\n index++;\n }\n\n for (let x = 0; x < radialSegments; x++) {\n const c = centerIndexStart + x;\n const i = centerIndexEnd + x;\n\n if (top === true) {\n indices.push(i, i + 1, c);\n } else {\n indices.push(i + 1, i, c);\n }\n }\n }\n }\n}\n","import { CylinderGeometryData } from './cylinder';\n\n/**\n *\n */\nexport class ConeGeometryData extends CylinderGeometryData {\n /**\n *\n * @param radius\n * @param height\n * @param radialSegments\n * @param heightSegments\n * @param openEnded\n * @param thetaStart\n * @param thetaLength\n */\n constructor (\n radius = 1,\n height = 1,\n radialSegments = 8,\n heightSegments = 1,\n openEnded = false,\n thetaStart = 0,\n thetaLength = Math.PI * 2,\n ) {\n super(0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength);\n }\n}\n","import { math } from '@galacean/effects';\nimport { GeometryData } from './geometry';\n\nconst { Vector3 } = math;\n\n/**\n *\n */\nexport class TorusGeometryData extends GeometryData {\n /**\n *\n * @param radius\n * @param tube\n * @param radialSegments\n * @param tubularSegments\n * @param arc\n */\n constructor (\n radius = 1,\n tube = 0.4,\n radialSegments = 64,\n tubularSegments = 64,\n arc = Math.PI * 2,\n ) {\n super();\n\n radialSegments = Math.floor(radialSegments);\n tubularSegments = Math.floor(tubularSegments);\n\n for (let j = 0; j <= radialSegments; j++) {\n for (let i = 0; i <= tubularSegments; i++) {\n\n const u = i / tubularSegments * arc;\n const v = j / radialSegments * Math.PI * 2;\n\n const px = (radius + tube * Math.cos(v)) * Math.cos(u);\n const py = (radius + tube * Math.cos(v)) * Math.sin(u);\n const pz = tube * Math.sin(v);\n\n this.points.push(px, py, pz);\n\n const cx = radius * Math.cos(u);\n const cy = radius * Math.sin(u);\n const p = new Vector3(px, py, pz);\n const c = new Vector3(cx, cy, 0);\n const normal = p.subtract(c).normalize();\n\n this.normals.push(...normal.toArray());\n\n this.uvs.push(i / tubularSegments);\n this.uvs.push(j / radialSegments);\n }\n }\n\n for (let j = 1; j <= radialSegments; j++) {\n for (let i = 1; i <= tubularSegments; i++) {\n const a = (tubularSegments + 1) * j + i - 1;\n const b = (tubularSegments + 1) * (j - 1) + i - 1;\n const c = (tubularSegments + 1) * (j - 1) + i;\n const d = (tubularSegments + 1) * j + i;\n\n this.indices.push(a, b, d);\n this.indices.push(b, c, d);\n }\n }\n }\n}\n","import { GeometryData } from './geometry';\n\n/**\n *\n */\nexport class PlaneGeometryData extends GeometryData {\n /**\n *\n * @param width\n * @param height\n * @param widthSegments\n * @param heightSegments\n */\n constructor (\n width = 1,\n height = 1,\n widthSegments = 1,\n heightSegments = 1,\n ) {\n super();\n\n const widthHalf = width / 2;\n const heightHalf = height / 2;\n\n const gridX = Math.floor(widthSegments);\n const gridY = Math.floor(heightSegments);\n\n const gridX1 = gridX + 1;\n const gridY1 = gridY + 1;\n\n const segmentWidth = width / gridX;\n const segmentHeight = height / gridY;\n\n for (let iy = 0; iy < gridY1; iy++) {\n const y = iy * segmentHeight - heightHalf;\n\n for (let ix = 0; ix < gridX1; ix++) {\n const x = ix * segmentWidth - widthHalf;\n\n this.points.push(x, - y, 0);\n this.normals.push(0, 0, 1);\n this.uvs.push(ix / gridX);\n this.uvs.push(1 - (iy / gridY));\n }\n }\n for (let iy = 0; iy < gridY; iy++) {\n for (let ix = 0; ix < gridX; ix++) {\n const a = ix + gridX1 * iy;\n const b = ix + gridX1 * (iy + 1);\n const c = (ix + 1) + gridX1 * (iy + 1);\n const d = (ix + 1) + gridX1 * iy;\n\n this.indices.push(a, b, d);\n this.indices.push(b, c, d);\n }\n }\n }\n}\n","import type { spec } from '@galacean/effects';\nimport { math } from '@galacean/effects';\nimport { GeometryData } from './geometry';\n\nconst { Euler, Vector3, Matrix4 } = math;\n\n/**\n *\n */\nexport class FrustumGeometryData extends GeometryData {\n /**\n *\n * @param position\n * @param rotation\n * @param fov\n * @param aspect\n * @param near\n * @param far\n */\n constructor (\n position: spec.vec3,\n rotation: spec.vec3,\n fov: number,\n aspect: number,\n near: number,\n far: number,\n ) {\n super();\n\n const fovY = fov / 180 * Math.PI;\n const ratio = aspect;\n const halfY = far * Math.tan(fovY / 2);\n const halfX = halfY * ratio;\n const point1 = new Vector3(halfX, halfY, far);\n const point2 = new Vector3(-halfX, halfY, far);\n const point3 = new Vector3(-halfX, -halfY, far);\n const point4 = new Vector3(halfX, -halfY, far);\n const matrix = Euler.fromArray(rotation).toMatrix4(new Matrix4());\n const result1 = matrix.transformPoint(point1).add(position);\n const result2 = matrix.transformPoint(point2).add(position);\n const result3 = matrix.transformPoint(point3).add(position);\n const result4 = matrix.transformPoint(point4).add(position);\n\n this.points.push(\n ...position,\n ...result1.toArray(), ...result2.toArray(),\n ...result3.toArray(), ...result4.toArray()\n );\n this.indices.push(0, 1, 0, 2, 0, 3, 0, 4, 1, 2, 2, 3, 3, 4, 4, 1);\n }\n}\n","import { GeometryData } from './geometry';\n\n/**\n * 方向光造型数据\n * lines\n */\nexport class DirectionLightData extends GeometryData {\n /**\n * 构造函数\n * @param radius - 圆半径\n * @param length - 光线长度\n * @param segments - 圆精度\n * @param linesNumber - 光线数量\n * @param thetaStart - 起始弧度\n * @param thetaLength - 终止弧度\n */\n constructor (\n radius = 1,\n length = 2,\n segments = 64,\n linesNumber = 8,\n thetaStart = 0,\n thetaLength = Math.PI * 2,\n ) {\n super();\n\n this.createXYPlaneCircle(radius, 0, segments, thetaStart, thetaLength, 0, this.points, this.indices);\n const start = segments % linesNumber / 2;\n const step = segments / linesNumber;\n\n for (let i = 0; i < linesNumber; i++) {\n const index = start + i * step;\n const x = this.points[3 * index];\n const y = this.points[3 * index + 1];\n const z = -length;\n\n this.points.push(x, y, z);\n this.indices.push(index, segments + i);\n }\n }\n}\n","import { GeometryData } from './geometry';\n\n/**\n * 点光源造型数据\n * lines\n */\nexport class PointLightData extends GeometryData {\n /**\n * 构造函数\n * @param range - 光照范围\n * @param segments - 圆精度\n * @param thetaStart - 起始弧度\n * @param thetaLength - 终止弧度\n */\n constructor (\n range = 10,\n segments = 64,\n thetaStart = 0,\n thetaLength = Math.PI * 2,\n ) {\n super();\n this.createXYPlaneCircle(range, 0, segments, thetaStart, thetaLength, 0, this.points, this.indices);\n this.createXZPlaneCircle(range, 0, segments, thetaStart, thetaLength, segments, this.points, this.indices);\n this.createYZPlaneCircle(range, 0, segments, thetaStart, thetaLength, 2 * segments, this.points, this.indices);\n }\n}\n","import { GeometryData } from './geometry';\n\n/**\n * 聚光灯造型数据\n * lines\n */\nexport class SpotLightData extends GeometryData {\n /**\n * 构造函数\n * @param range - 光线范围\n * @param spotAngle - 光线范围[角度]\n * @param segments - 圆精度\n * @param thetaStart - 起始弧度\n * @param thetaLength - 终止弧度\n */\n constructor (\n range = 10,\n spotAngle = 30,\n segments = 64,\n thetaStart = 0,\n thetaLength = Math.PI * 2,\n ) {\n super();\n\n const angle = spotAngle / 2 / 180 * Math.PI;\n const radius = range * Math.tan(angle);\n\n this.createXYPlaneCircle(radius, -range, segments, thetaStart, thetaLength, 0, this.points, this.indices);\n this.points.push(0, 0, 0);\n const step = segments / 4;\n const start = segments % 4 / 2;\n\n for (let i = 0; i < 4; i++) {\n this.indices.push(segments, start + i * step);\n }\n }\n}\n","import { GeometryData } from './geometry';\n\n/**\n * 地板线边框造型数据\n * lines\n */\nexport class FloorLineEdgeGeometryData extends GeometryData {\n /**\n *\n * @param sideLength\n * @param parts\n */\n constructor (sideLength = 12, parts = 6) {\n super();\n\n let index = 0;\n\n const z = 0;\n const end = sideLength / 2;\n const start = -sideLength / 2;\n\n for (let i = 0; i <= parts; i++) {\n const v = start + i * sideLength / parts;\n\n this.points.push(v, start, z, v, end, z, start, v, z, end, v, z);\n this.indices.push(index, index + 1, index + 2, index + 3);\n index += 4;\n }\n }\n}\n","import type { Engine, Geometry, spec } from '@galacean/effects';\nimport { glContext, Material, Mesh, Texture, Transform, math } from '@galacean/effects';\nimport type { MeshOption } from './geometry';\nimport { createGeometry, GeometryType } from './geometry';\nimport { GizmoSubType } from './define';\nimport type { GizmoItemBounding } from './gizmo-vfx-item';\nimport { BoundingType } from './gizmo-vfx-item';\nimport { color, renderMode } from './constants';\n\ntype vec3 = spec.vec3;\ntype Vector3 = math.Vector3;\ntype TriangleLike = math.TriangleLike;\nconst { Vector2, Vector3, Matrix4 } = math;\n\n/**\n * 根据 gizmoSubType 类型创建几何体 Mesh\n * @param subType - gizmoSubType 类型\n * @param boundingMap - 包围盒 Map\n * @param iconTexture - 图标纹理\n * @param options - 几何体参数\n * @returns 基础几何体 Mesh | 组合几何体 Map<Mesh, Transform>\n */\nexport function createMeshFromSubType (\n engine: Engine,\n subType: GizmoSubType,\n boundingMap: Map<string, GizmoItemBounding>,\n iconTexture?: Map<string, Texture>,\n options?: MeshOption\n): Mesh | Map<Mesh, Transform> {\n let result: Mesh | Map<Mesh, Transform>;\n\n if (!options) {\n options = { size: 0, renderMode: WebGLRenderingContext['TRIANGLES'] };\n }\n\n switch (subType) {\n case GizmoSubType.sprite:\n result = createSpriteMesh(engine, options);\n\n break;\n case GizmoSubType.camera:\n result = createSpriteMesh(engine, options, iconTexture ? iconTexture.get('camera') : undefined, boundingMap);\n\n break;\n case GizmoSubType.light:\n result = createSpriteMesh(engine, options, iconTexture ? iconTexture.get('light') : undefined, boundingMap);\n\n break;\n case GizmoSubType.translation:\n result = createTranslationMesh(engine, options, boundingMap);\n\n break;\n case GizmoSubType.scale:\n result = createScaleMesh(engine, options, boundingMap);\n\n break;\n case GizmoSubType.viewHelper:\n result = createViewHelperMesh(engine, options, boundingMap, iconTexture as Map<string, Texture>);\n\n break;\n case GizmoSubType.rotation:\n result = createRotationMesh(engine, options, boundingMap);\n\n break;\n default:\n result = createBasicMesh(engine, subType, options);\n\n break;\n }\n\n return result;\n}\n\n/**\n * 创建旋转组件 Mesh 数组\n * @internal\n * @param options\n * @param boundingMap - 包围盒 Map\n * @returns Mesh 数组和对应的 Transform 组成的 Map\n */\nfunction createRotationMesh (\n engine: Engine,\n options: MeshOption,\n boundingMap: Map<string, GizmoItemBounding>,\n): Map<Mesh, Transform> {\n const result: Map<Mesh, Transform> = new Map();\n const scale = options.size.scale || 1;\n const size = {\n radius: 0.8 * scale,\n tube: 0.02 * scale,\n radiusSegments: 10 * scale,\n widthSegments: 20,\n heightSegments: 20,\n };\n const boundSize = { ...size, tube: size.tube * 2 };\n const name = 'rotation';\n const xCircle = createBasicMesh(engine, GizmoSubType.torus, {\n size, color: color.xAxisColor as vec3, renderMode, name,\n }, 'hideBack');\n const yCircle = createBasicMesh(engine, GizmoSubType.torus, {\n size, color: color.yAxisColor as vec3, renderMode, name,\n }, 'hideBack');\n const zCircle = createBasicMesh(engine, GizmoSubType.torus, {\n size, color: color.zAxisColor as vec3, renderMode, name,\n }, 'hideBack');\n const center = createBasicMesh(engine, GizmoSubType.sphere, {\n size, color: [0.3, 0.3, 0.3], alpha: 0.1, renderMode, name,\n }, 'blend');\n const xCircleBounding = createBasicMesh(engine, GizmoSubType.torus, {\n size: boundSize,\n color: color.xAxisColor as vec3,\n renderMode,\n });\n const yCircleBounding = createBasicMesh(engine, GizmoSubType.torus, {\n size: boundSize,\n color: color.yAxisColor as vec3,\n renderMode,\n });\n const zCircleBounding = createBasicMesh(engine, GizmoSubType.torus, {\n size: boundSize,\n color: color.zAxisColor as vec3,\n renderMode,\n });\n\n const xCircleTransform = new Transform({\n valid: true,\n });\n const yCircleTransform = new Transform({\n valid: true,\n });\n const zCircleTransform = new Transform({\n valid: true,\n });\n const centerTransform = new Transform({\n valid: true,\n });\n\n xCircleTransform.setRotation(0, 90, 0);\n yCircleTransform.setRotation(-90, 0, 0);\n zCircleTransform.setRotation(0, 0, 0);\n result.set(center, centerTransform);\n result.set(xCircle, xCircleTransform);\n result.set(yCircle, yCircleTransform);\n result.set(zCircle, zCircleTransform);\n\n boundingMap.set('xAxis', {\n type: BoundingType.triangle,\n triangles: xCircleBounding.firstGeometry() ? getTriangle(xCircleBounding.firstGeometry(), xCircleTransform) : [],\n backfaceCulling: true,\n });\n boundingMap.set('yAxis', {\n type: BoundingType.triangle,\n triangles: yCircleBounding.firstGeometry() ? getTriangle(yCircleBounding.firstGeometry(), yCircleTransform) : [],\n backfaceCulling: true,\n });\n boundingMap.set('zAxis', {\n type: BoundingType.triangle,\n triangles: zCircleBounding.firstGeometry() ? getTriangle(zCircleBounding.firstGeometry(), zCircleTransform) : [],\n backfaceCulling: true,\n });\n\n return result;\n}\n\n/**\n * 获取几何体的三角面数组\n * @internal\n * @param geometry - 几何体\n * @param transform - 变换式\n * @returns 三角面数组\n */\nfunction getTriangle (geometry: Geometry, transform: Transform): TriangleLike[] {\n const result: TriangleLike[] = [];\n const indices = geometry.getIndexData();\n const points = geometry.getAttributeData('a_Position');\n const mat4 = transform.getWorldMatrix();\n\n if (points && indices && indices.length > 0) {\n for (let i = 0; i < indices.length; i += 3) {\n const i0 = indices[i] * 3;\n const i1 = indices[i + 1] * 3;\n const i2 = indices[i + 2] * 3;\n const p0 = new Vector3(points[i0], points[i0 + 1], points[i0 + 2]);\n const p1 = new Vector3(points[i1], points[i1 + 1], points[i1 + 2]);\n const p2 = new Vector3(points[i2], points[i2 + 1], points[i2 + 2]);\n\n result.push({\n p0: mat4.projectPoint(p0),\n p1: mat4.projectPoint(p1),\n p2: mat4.projectPoint(p2),\n });\n\n }\n }\n\n return result;\n}\n\n/**\n * 创建位移组件 Mesh 数组\n * @internal\n * @param options\n * @param boundingMap - 包围盒 Map\n * @returns Mesh 数组和对应的 Transform 组成的 Map\n */\nfunction createTranslationMesh (engine: Engine, options: MeshOption, boundingMap: Map<string, GizmoItemBounding>): Map<Mesh, Transform> {\n const result: Map<Mesh, Transform> = new Map();\n const scale = options.size.scale || 1;\n const axisSize = {\n width: 0.8 * scale,\n height: 0.02 * scale,\n depth: 0.02 * scale,\n };\n const name = 'translation';\n const axisMesh = createAxisMesh(engine, axisSize, false, name);\n\n for (const [mesh, transform] of axisMesh) {\n result.set(mesh, transform);\n }\n\n const arrowSize = {\n radius: 0.05 * scale,\n height: 0.2 * scale,\n };\n const xArrow = createBasicMesh(engine, GizmoSubType.cone, {\n size: arrowSize,\n color: color.xAxisColor as vec3,\n renderMode,\n depthTest: true,\n name,\n }, 'blend');\n const yArrow = createBasicMesh(engine, GizmoSubType.cone, {\n size: arrowSize,\n color: color.yAxisColor as vec3,\n renderMode,\n depthTest: true,\n name,\n }, 'blend');\n const zArrow = createBasicMesh(engine, GizmoSubType.cone, {\n size: arrowSize,\n color: color.zAxisColor as vec3,\n renderMode,\n name,\n depthTest: true,\n }, 'blend');\n const xArrowTransform = new Transform({\n valid: true,\n });\n const yArrowTransform = new Transform({\n valid: true,\n });\n const zArrowTransform = new Transform({\n valid: true,\n });\n\n xArrowTransform.setRotation(0, 0, 90);\n yArrowTransform.setRotation(0, 0, 0);\n zArrowTransform.setRotation(-90, 0, 0);\n xArrowTransform.translate(axisSize.width, 0, 0);\n yArrowTransform.translate(0, axisSize.width, 0);\n zArrowTransform.translate(0, 0, axisSize.width);\n\n const planeSize = {\n width: 0.2 * scale,\n height: 0.2 * scale,\n };\n const xyPlane = createBasicMesh(engine, GizmoSubType.plane, {\n size: planeSize, color: color.zAxisColor as vec3, renderMode, depthTest: true, name,\n });\n const yzPlane = createBasicMesh(engine, GizmoSubType.plane, {\n size: planeSize, color: color.xAxisColor as vec3, renderMode, depthTest: true, name,\n });\n const zxPlane = createBasicMesh(engine, GizmoSubType.plane, {\n size: planeSize, color: color.yAxisColor as vec3, renderMode, depthTest: true, name,\n });\n const xyPlaneTransform = new Transform({\n valid: true,\n });\n const yzPlaneTransform = new Transform({\n valid: true,\n });\n const zxPlaneTransform = new Transform({\n valid: true,\n });\n const delta = axisSize.width / 8;\n\n xyPlaneTransform.translate(planeSize.width / 2 + delta, planeSize.height / 2 + delta, 0);\n yzPlaneTransform.setRotation(0, 90, 0);\n yzPlaneTransform.translate(0, planeSize.height / 2 + delta, planeSize.width / 2 + delta);\n zxPlaneTransform.setRotation(-90, 0, 0);\n zxPlaneTransform.translate(planeSize.width / 2 + delta, 0, planeSize.height / 2 + delta);\n\n result.set(xArrow, xArrowTransform);\n result.set(yArrow, yArrowTransform);\n result.set(zArrow, zArrowTransform);\n result.set(xyPlane, xyPlaneTransform);\n result.set(yzPlane, yzPlaneTransform);\n result.set(zxPlane, zxPlaneTransform);\n\n createAxisBounding({ width: arrowSize.radius * 2.4, length: axisSize.width + arrowSize.height / 2 }, boundingMap);\n boundingMap.set('xyPlane', {\n type: BoundingType.triangle,\n triangles: xyPlane.firstGeometry() ? getTriangle(xyPlane.firstGeometry(), xyPlaneTransform) : [],\n backfaceCulling: false,\n });\n\n // FIXME: getTriangle 函数调用 getWorldMatrix 后 worldMatrix被修改\n boundingMap.set('yzPlane', {\n type: BoundingType.triangle,\n triangles: yzPlane.firstGeometry() ? getTriangle(yzPlane.firstGeometry(), yzPlaneTransform) : [],\n backfaceCulling: false,\n });\n boundingMap.set('zxPlane', {\n type: BoundingType.triangle,\n triangles: zxPlane.firstGeometry() ? getTriangle(zxPlane.firstGeometry(), zxPlaneTransform) : [],\n backfaceCulling: false,\n });\n\n return result;\n}\n\n/**\n * 创建缩放组件 Mesh 数组\n * @internal\n * @param options\n * @param boundingMap - 包围盒 Map\n * @returns Mesh 数组和对应的 Transform 组成的 Map\n */\nfunction createScaleMesh (engine: Engine, options: MeshOption, boundingMap: Map<string, GizmoItemBounding>): Map<Mesh, Transform> {\n const result: Map<Mesh, Transform> = new Map();\n const scale = options.size.scale || 1;\n const axisSize = {\n width: 0.8 * scale,\n height: 0.02 * scale,\n depth: 0.02 * scale,\n };\n const name = 'scale';\n const axisMesh = createAxisMesh(engine, axisSize, false, name);\n\n for (const [mesh, transform] of axisMesh) {\n result.set(mesh, transform);\n }\n const boxSize = {\n width: 0.1 * scale,\n height: 0.1 * scale,\n depth: 0.1 * scale,\n };\n const centerBoxSize = {\n width: 0.2 * scale,\n height: 0.2 * scale,\n depth: 0.2 * scale,\n };\n const xCube = createBasicMesh(engine, GizmoSubType.box, {\n size: boxSize, color: color.xAxisColor as vec3, renderMode, depthTest: true, name,\n }, 'blend');\n const yCube = createBasicMesh(engine, GizmoSubType.box, {\n size: boxSize, color: color.yAxisColor as vec3, renderMode, depthTest: true, name,\n }, 'blend');\n const zCube = createBasicMesh(engine, GizmoSubType.box, {\n size: boxSize, color: color.zAxisColor as vec3, renderMode, depthTest: true, name,\n }, 'blend');\n const centerCube = createBasicMesh(engine, GizmoSubType.box, {\n size: centerBoxSize,\n color: [0.8, 0.8, 0.8],\n renderMode,\n depthTest: true,\n name,\n }, 'blend');\n const xCubeTransform = new Transform({\n valid: true,\n });\n const yCubeTransform = new Transform({\n valid: true,\n });\n const zCubeTransform = new Transform({\n valid: true,\n });\n const centerCubeTransform = new Transform({\n valid: true,\n });\n\n xCubeTransform.translate(axisSize.width, 0, 0);\n yCubeTransform.translate(0, axisSize.width, 0);\n zCubeTransform.translate(0, 0, axisSize.width);\n result.set(centerCube, centerCubeTransform);\n result.set(xCube, xCubeTransform);\n result.set(yCube, yCubeTransform);\n result.set(zCube, zCubeTransform);\n\n createAxisBounding({ width: boxSize.width * 1.2, length: axisSize.width + boxSize.width / 2 }, boundingMap);\n boundingMap.set('center', {\n type: BoundingType.sphere,\n center: new Vector3(),\n radius: Math.pow(Math.pow(centerBoxSize.width, 2) + Math.pow(centerBoxSize.height, 2) + Math.pow(centerBoxSize.depth, 2), 0.5) / 2,\n });\n\n return result;\n}\n\n/**\n * 创建视图辅助组件 Mesh 数组\n * @internal\n * @param options\n * @param boundingMap - 包围盒 Map\n * @returns Mesh 数组和对应的 Transform 组成的 Map\n */\nfunction createViewHelperMesh (engine: Engine, options: MeshOption, boundingMap: Map<string, GizmoItemBounding>, texture: Map<string, Texture>): Map<Mesh, Transform> {\n const result: Map<Mesh, Transform> = new Map();\n const scale = options.size.scale || 1;\n const axisSize = {\n width: 0.8 * scale,\n height: 0.02 * scale,\n depth: 0.02 * scale,\n };\n const axisMesh = createAxisMesh(engine, axisSize, true);\n\n for (const [mesh, transform] of axisMesh) {\n result.set(mesh, transform);\n }\n const planeSize = {\n width: 0.14 * scale,\n height: 0.14 * scale,\n };\n const length = (axisSize.width + planeSize.width) / 2;\n const depthTest = true;\n const posXSphere = createSpriteMesh(engine, { size: planeSize, renderMode, depthTest }, texture.get('posX'));\n const posYSphere = createSpriteMesh(engine, { size: planeSize, renderMode, depthTest }, texture.get('posY'));\n const posZSphere = createSpriteMesh(engine, { size: planeSize, renderMode, depthTest }, texture.get('posZ'));\n const posXSphereTransform = new Transform({\n valid: true,\n });\n const posYSphereTransform = new Transform({\n valid: true,\n });\n const posZSphereTransform = new Transform({\n valid: true,\n });\n\n posXSphereTransform.translate(length, 0, 0);\n posYSphereTransform.translate(0, length, 0);\n posZSphereTransform.translate(0, 0, length);\n const negXSphere = createSpriteMesh(engine, { size: planeSize, renderMode, depthTest }, texture.get('negX'));\n const negYSphere = createSpriteMesh(engine, { size: planeSize, renderMode, depthTest }, texture.get('negY'));\n const negZSphere = createSpriteMesh(engine, { size: planeSize, renderMode, depthTest }, texture.get('negZ'));\n const negXSphereTransform = new Transform({\n valid: true,\n });\n const negYSphereTransform = new Transform({\n valid: true,\n });\n const negZSphereTransform = new Transform({\n valid: true,\n });\n\n negXSphereTransform.translate(-length, 0, 0);\n negYSphereTransform.translate(0, -length, 0);\n negZSphereTransform.translate(0, 0, -length);\n\n result.set(posXSphere, posXSphereTransform);\n result.set(posYSphere, posYSphereTransform);\n result.set(posZSphere, posZSphereTransform);\n result.set(negXSphere, negXSphereTransform);\n result.set(negYSphere, negYSphereTransform);\n result.set(negZSphere, negZSphereTransform);\n\n const radius = (planeSize.height / 2) * 1.2;\n\n boundingMap.set('posX', {\n type: BoundingType.sphere,\n center: posXSphereTransform.position,\n radius: radius,\n });\n boundingMap.set('posY', {\n type: BoundingType.sphere,\n center: posYSphereTransform.position,\n radius: radius,\n });\n boundingMap.set('posZ', {\n type: BoundingType.sphere,\n center: posZSphereTransform.position,\n radius: radius,\n });\n boundingMap.set('negX', {\n type: BoundingType.sphere,\n center: negXSphereTransform.position,\n radius: radius,\n });\n boundingMap.set('negY', {\n type: BoundingType.sphere,\n center: negYSphereTransform.position,\n radius: radius,\n });\n boundingMap.set('negZ', {\n type: BoundingType.sphere,\n center: negZSphereTransform.position,\n radius: radius,\n });\n\n return result;\n}\n\n/**\n * 创建坐标轴 Mesh 数组\n * @internal\n * @param axisSize - 坐标轴尺寸\n * @param isCentered - 是否居中,默认 false\n * @returns Mesh 数组和对应的 Transform 组成的 Map\n */\nfunction createAxisMesh (engine: Engine, axisSize: { width: number, height: number, depth: number }, isCentered = false, name?: string): Map<Mesh, Transform> {\n const result: Map<Mesh, Transform> = new Map();\n const xAxis = createBasicMesh(engine, GizmoSubType.box, {\n size: axisSize, color: color.xAxisColor as vec3, renderMode, depthTest: true, name,\n });\n const yAxis = createBasicMesh(engine, GizmoSubType.box, {\n size: axisSize, color: color.yAxisColor as vec3, renderMode, depthTest: true, name,\n });\n const zAxis = createBasicMesh(engine, GizmoSubType.box, {\n size: axisSize, color: color.zAxisColor as vec3, renderMode, depthTest: true, name,\n });\n\n const xAxisTransform = new Transform({\n valid: true,\n });\n const yAxisTransform = new Transform({\n valid: true,\n });\n const zAxisTransform = new Transform({\n valid: true,\n });\n\n yAxisTransform.setRotation(0, 0, 90);\n zAxisTransform.setRotation(0, -90, 0);\n if (!isCentered) {\n xAxisTransform.translate(axisSize.width / 2, 0, 0);\n yAxisTransform.translate(0, axisSize.width / 2, 0);\n zAxisTransform.translate(0, 0, axisSize.width / 2);\n }\n result.set(xAxis, xAxisTransform);\n result.set(yAxis, yAxisTransform);\n result.set(zAxis, zAxisTransform);\n\n return result;\n}\n\n/**\n * 创建基础几何体 Mesh\n * @internal\n * @param subType - gizmoSubType 类型\n * @param options - 几何体参数\n * @returns 几何体 Mesh\n */\nfunction createBasicMesh (engine: Engine, subType: GizmoSubType, options: MeshOption, materialType = 'default'): Mesh {\n const {\n size, color, alpha, renderMode, depthTest, name,\n } = options;\n let geometryType: GeometryType;\n\n switch (subType) {\n case GizmoSubType.sphere:\n geometryType = GeometryType.Sphere;\n\n break;\n case GizmoSubType.cylinder:\n geometryType = GeometryType.Cylinder;\n\n break;\n case GizmoSubType.cone:\n geometryType = GeometryType.Cone;\n\n break;\n case GizmoSubType.torus:\n geometryType = GeometryType.Torus;\n\n break;\n case GizmoSubType.sprite:\n geometryType = GeometryType.Sprite;\n\n break;\n case GizmoSubType.plane:\n geometryType = GeometryType.Plane;\n\n break;\n case GizmoSubType.frustum:\n geometryType = GeometryType.Frustum;\n\n break;\n case GizmoSubType.directionLight:\n geometryType = GeometryType.DirectionLight;\n\n break;\n case GizmoSubType.spotLight:\n geometryType = GeometryType.SpotLight;\n\n break;\n case GizmoSubType.pointLight:\n geometryType = GeometryType.PointLight;\n\n break;\n case GizmoSubType.floorGrid:\n geometryType = GeometryType.FloorGrid;\n\n break;\n default:\n geometryType = GeometryType.Box;\n\n break;\n }\n const geometry = createGeometry(engine, geometryType, size, renderMode);\n let material;\n\n switch (materialType) {\n case 'blend':\n material = createBlendMaterial(engine, color, depthTest, alpha);\n\n break;\n case 'hideBack':\n material = createHideBackMaterial(engine, color, depthTest);\n\n break;\n default:\n material = createMaterial(engine, color, depthTest);\n\n break;\n }\n\n return Mesh.create(\n engine,\n {\n name: name ? name : geometryType.toString(),\n geometry,\n material,\n priority: 3000,\n });\n}\n\n/**\n * @internal\n * @param options\n * @param texture\n * @param boundingMap\n * @returns\n */\nfunction createSpriteMesh (engine: Engine, options: MeshOption, texture?: Texture, boundingMap?: Map<string, GizmoItemBounding>): Mesh {\n const geometry = createGeometry(engine, GeometryType.Sprite, options.size, renderMode);\n let spriteColor;\n\n if (texture) {\n spriteColor = texture;\n } else {\n spriteColor = options.color;\n }\n\n const material = createSpriteMaterial(engine, spriteColor, options.depthTest);\n\n if (boundingMap) {\n boundingMap.set('sprite', {\n type: BoundingType.sphere,\n radius: Math.pow(Math.pow(options.size.width, 2) + Math.pow(options.size.height, 2), 0.5) / 2,\n });\n }\n\n return Mesh.create(\n engine,\n {\n name: options.name || 'sprite',\n geometry,\n material,\n priority: 3000,\n });\n}\n\n/**\n * 创建材质\n * @internal\n * @param color - 颜色\n * @param depthTest\n * @returns 纯色材质,无光照,无透明\n */\nfunction createMaterial (engine: Engine, color?: vec3, depthTest?: boolean): Material {\n const myColor = color ? Vector3.fromArray(color) : new Vector3(255, 255, 255);\n const myDepthTest = depthTest ? depthTest : false;\n\n const material = Material.create(\n engine,\n {\n uniformValues: {\n u_color: new Float32Array(myColor.toArray()),\n u_model: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n },\n shader: {\n fragment: `\n precision mediump float;\n\n uniform vec3 u_color;\n\n void main(){\n gl_FragColor = vec4(u_color,1.0);\n }`,\n vertex: `\n precision highp float;\n\n attribute vec3 a_Position;\n\n uniform mat4 u_model;\n uniform mat4 effects_MatrixV;\n uniform mat4 _MatrixP;\n\n void main(){\n gl_Position = _MatrixP * effects_MatrixV * u_model * vec4(a_Position,1.0);\n }`,\n shared: true,\n },\n });\n\n material.setVector3('u_color', myColor);\n material.setMatrix('u_model', Matrix4.IDENTITY);\n material.depthTest = myDepthTest;\n material.stencilTest = false;\n material.blending = false;\n material.depthMask = true;\n\n return material;\n}\n\n/**\n *\n * @internal\n * @param color\n * @param depthTest\n * @returns\n */\nfunction createHideBackMaterial (engine: Engine, color?: vec3, depthTest?: boolean): Material {\n const myColor = color ? Vector3.fromArray(color) : new Vector3(255, 255, 255);\n const myDepthTest = depthTest ? depthTest : false;\n\n const material = Material.create(\n engine,\n {\n uniformValues: {\n u_color: new Float32Array(myColor.toArray()),\n u_model: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n u_cameraPos: new Float32Array([0, 0, 0]),\n u_center: new Float32Array([0, 0, 0]),\n },\n shader: {\n fragment: `\n precision mediump float;\n\n uniform vec3 u_color;\n\n varying float flag;\n\n void main(){\n if(flag > 0.0) {\n discard;\n }\n\n gl_FragColor = vec4(u_color,1.0);\n }`,\n vertex: `\n precision highp float;\n\n attribute vec3 a_Position;\n\n uniform mat4 u_model;\n uniform mat4 effects_MatrixV;\n uniform mat4 _MatrixP;\n\n uniform vec3 u_cameraPos;\n uniform vec3 u_center;\n\n varying float flag;\n void main(){\n float distance = length(u_cameraPos - u_center);\n vec3 worldPosition = (u_model * vec4(a_Position,1.0)).xyz;\n flag = length(u_cameraPos - worldPosition) - distance;\n gl_Position = _MatrixP * effects_MatrixV * u_model * vec4(a_Position,1.0);\n }`,\n shared: true,\n },\n });\n\n material.setVector3('u_color', myColor);\n material.setMatrix('u_model', Matrix4.IDENTITY);\n material.setVector3('u_cameraPos', Vector3.ZERO);\n material.setVector3('u_center', Vector3.ZERO);\n\n material.depthTest = myDepthTest;\n material.stencilTest = false;\n material.blending = false;\n material.depthMask = true;\n\n return material;\n}\n\n/**\n *\n * @internal\n * @param color\n * @param depthTest\n * @param alpha\n * @returns\n */\nfunction createBlendMaterial (engine: Engine, color?: vec3, depthTest?: boolean, alpha?: number): Material {\n const myColor = color ? Vector3.fromArray(color) : new Vector3(255, 255, 255);\n const myDepthTest = depthTest ? depthTest : false;\n const myAlpha = alpha ? alpha : 1;\n\n const material = Material.create(\n engine,\n {\n uniformValues: {\n u_color: new Float32Array(myColor.toArray()),\n u_alpha: new Float32Array([myAlpha, 0]),\n u_model: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n },\n shader: {\n shared: true,\n fragment: `\n precision mediump float;\n\n uniform vec3 u_color;\n uniform vec2 u_alpha;\n\n void main(){\n gl_FragColor = vec4(u_color,u_alpha);\n }`,\n vertex: `\n precision highp float;\n\n attribute vec3 a_Position;\n\n uniform mat4 u_model;\n uniform mat4 effects_MatrixV;\n uniform mat4 _MatrixP;\n void main(){\n gl_Position = _MatrixP * effects_MatrixV * u_model * vec4(a_Position,1.0);\n }`,\n },\n });\n\n material.setVector3('u_color', myColor);\n material.setVector2('u_alpha', new Vector2(myAlpha, 0));\n material.setMatrix('u_model', Matrix4.IDENTITY);\n material.depthTest = myDepthTest;\n material.stencilTest = false;\n material.blending = true;\n material.blendEquation = [glContext.FUNC_ADD, glContext.FUNC_ADD];\n material.blendFunction = [glContext.SRC_ALPHA, glContext.ONE_MINUS_SRC_ALPHA, glContext.SRC_ALPHA, glContext.ONE_MINUS_SRC_ALPHA];\n material.depthMask = true;\n\n return material;\n}\n\nfunction createSpriteMaterial (engine: Engine, data?: vec3 | Texture, depthTest?: boolean): Material {\n const myDepthTest = depthTest ? depthTest : false;\n const uniformValues = {\n u_model: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n u_alpha: new Float32Array([1, 0]),\n };\n\n const material = Material.create(\n engine,\n {\n uniformValues,\n shader: {\n shared: true,\n fragment: `\n precision highp float;\n\n uniform vec2 u_alpha;\n uniform vec3 u_color;\n uniform sampler2D u_iconTex;\n\n varying vec2 v_uv;\n\n void main(){\n vec4 color = texture2D(u_iconTex, vec2(v_uv.x, 1.0 - v_uv.y));\n if(color.a < 0.001)\n {\n discard;\n }\n gl_FragColor = vec4(color.xyz, color.w * u_alpha.x);\n }`,\n vertex: `\n precision highp float;\n\n attribute vec3 a_Position;\n attribute vec2 a_UV1;\n\n uniform mat4 u_model;\n uniform mat4 effects_MatrixV;\n uniform mat4 _MatrixP;\n uniform mat4 effects_MatrixInvV;\n varying vec2 v_uv;\n\n void main(){\n v_uv = a_UV1;\n vec4 pos = u_model * vec4(0., 0., 0., 1.0);\n // vec4 pos = u_model * vec4(a_Position,1.0);\n\n pos.xyz += effects_MatrixInvV[0].xyz * a_Position.x + effects_MatrixInvV[1].xyz * a_Position.y;\n gl_Position = _MatrixP * effects_MatrixV * pos;\n }`,\n },\n });\n\n material.setMatrix('u_model', Matrix4.IDENTITY);\n material.setVector2('u_alpha', new Vector2(1, 0));\n\n if (data instanceof Texture) {\n material.setTexture('u_iconTex', data);\n // uniformValues.u_iconTex = data;\n } else {\n let color: Vector3;\n\n if (data === undefined) {\n color = new Vector3(255, 255, 255);\n } else {\n color = Vector3.fromArray(data);\n }\n material.setVector3('u_color', color);\n // uniformValues.u_color = new Float32Array(color);\n }\n\n material.depthTest = myDepthTest;\n material.stencilTest = false;\n material.blending = true;\n material.blendEquation = [glContext.FUNC_ADD, glContext.FUNC_ADD];\n material.blendFunction = [glContext.SRC_ALPHA, glContext.ONE_MINUS_SRC_ALPHA, glContext.SRC_ALPHA, glContext.ONE_MINUS_SRC_ALPHA];\n\n return material;\n}\n\n/**\n * 创建坐标轴包围盒\n * @internal\n * @param size 包围盒尺寸\n * @param boundingMap 包围盒 Map\n */\nfunction createAxisBounding (size: { width: number, length: number }, boundingMap: Map<string, GizmoItemBounding>) {\n boundingMap.set('xAxis', {\n type: BoundingType.line,\n points: [new Vector3(0, 0, 0), new Vector3(size.length, 0, 0)],\n width: size.width,\n });\n boundingMap.set('yAxis', {\n type: BoundingType.line,\n points: [new Vector3(0, 0, 0), new Vector3(0, size.length, 0)],\n width: size.width,\n });\n boundingMap.set('zAxis', {\n type: BoundingType.line,\n points: [new Vector3(0, 0, 0), new Vector3(0, 0, size.length)],\n width: size.width,\n });\n}\n","function _instanceof(left, right) {\n if (right != null && typeof Symbol !== \"undefined\" && right[Symbol.hasInstance]) {\n return !!right[Symbol.hasInstance](left);\n } else return left instanceof right;\n}\nexport { _instanceof as _ };\n","import type { Camera } from '@galacean/effects';\nimport { math } from '@galacean/effects';\nimport { distanceOfPointAndLine, projectionOfPointAndLine } from './math-utils';\n\ntype Vector2 = math.Vector2;\ntype Vector3 = math.Vector3;\ntype Matrix4 = math.Matrix4;\n\nconst { Matrix4, Vector2, Vector3 } = math;\n\n/**\n * 线条包围盒射线检测算法\n * @param out - 射线与包围盒交点位置\n * @param pointInCanvas - 归一化的画布交互点坐标\n * @param points - 线条包围盒两端点位置\n * @param radius - 线条包围盒辐射半径\n * @param camera - 相机对象\n * @returns 射线与包围盒交点位置 | undefined\n */\nexport function intersectRayLine (\n out: Vector3,\n pointInCanvas: Vector2,\n points: [p0: Vector3, p1: Vector3],\n radius: number,\n worldMat4: Matrix4,\n camera: Camera,\n): Vector3 | undefined {\n // 构造一个辐射半径边缘的点 radiusPoint\n const up = new Vector3(\n worldMat4.elements[1],\n worldMat4.elements[5],\n worldMat4.elements[9],\n ).normalize();\n\n const radiusPoint = up.clone().multiply(radius);\n\n radiusPoint.add(points[0]);\n\n // 计算 start、end、radius 在屏幕空间上的投影\n const mvpMat4 = camera.getModelViewProjection(new Matrix4(), worldMat4);\n\n const screenStart = mvpMat4.projectPoint(points[0], new Vector3());\n const screenEnd = mvpMat4.projectPoint(points[1], new Vector3());\n const screenRadiusPoint = mvpMat4.projectPoint(radiusPoint, new Vector3());\n\n const screenRadiusVector = screenRadiusPoint.clone().subtract(screenStart);\n\n const screenRadius = screenRadiusVector.length();\n\n // 计算屏幕交互点与线条的距离\n const { distance, isInLine } = distanceOfPointAndLine(pointInCanvas, [screenStart.toVector2(), screenEnd.toVector2()]);\n\n if (distance <= screenRadius && isInLine) { // 距离小于阈值且交互点在线条上的投影位于线段内\n // 计算交互点在线条上的投影并转换为世界坐标\n const screenPosition = projectionOfPointAndLine(pointInCanvas, [screenStart, screenEnd]);\n const inverseViewProjection = camera.getInverseViewProjectionMatrix();\n\n inverseViewProjection.projectPoint(screenPosition, out);\n\n return out;\n }\n}\n","import type { Engine, spec } from '@galacean/effects';\nimport { Geometry, Material, Mesh, glContext, math } from '@galacean/effects';\n\ntype vec3 = spec.vec3;\ntype Vector3 = math.Vector3;\ntype Matrix4 = math.Matrix4;\n\nconst { Euler, Vector3, Matrix4 } = math;\n\nconst rectSize = 0.04;\nconst DEG2RAD = Math.PI / 180;\n\ninterface GeometryData {\n points: Vector3[],\n indices: number[],\n}\n\ninterface ArcPathOptions {\n plane?: string,\n translate?: vec3,\n rotate?: vec3,\n}\n\nfunction arcPath (radius: number, arc: number, options: ArcPathOptions = {}): GeometryData {\n const { plane, translate = [0, 0, 0], rotate = [0, 0, 0] } = options;\n const rotMat4 = Euler.fromArray(rotate).negate().toMatrix4(new Matrix4());\n const points: Vector3[] = [];\n const indices = [];\n\n addPoint(radius, 0);\n let i = 1;\n\n for (; i <= arc; i++) {\n const angle = i * DEG2RAD;\n\n indices.push(i - 1, i);\n addPoint(Math.cos(angle) * radius, Math.sin(angle) * radius);\n }\n\n return {\n points,\n indices,\n };\n\n function addPoint (cos: number, sin: number) {\n const point = new Vector3();\n\n if (plane === 'xz') {\n point.set(cos, 0, sin);\n } else if (plane === 'yz') {\n point.set(0, cos, sin);\n } else {\n point.set(cos, sin, 0);\n }\n rotMat4.transformNormal(point);\n points.push(point.add(translate));\n }\n}\n\nfunction line (p0: vec3, p1: vec3): GeometryData {\n return {\n points: [\n Vector3.fromArray(p0),\n Vector3.fromArray(p1),\n ],\n indices: [0, 1],\n };\n}\n\nfunction box (width: number, height: number, depth: number, center?: number[]): GeometryData {\n const w = width / 2;\n const h = height / 2;\n const d = depth / 2;\n const myCenter = center ?? [0, 0, 0];\n const points: Vector3[] = [\n [-w, h, -d], [-w, -h, -d], [-w, h, d], [-w, -h, d],\n [w, h, -d], [w, -h, -d], [w, h, d], [w, -h, d],\n ].map(item => {\n return new Vector3(item[0] + myCenter[0], item[1] + myCenter[1], item[2] + myCenter[2]);\n });\n\n return {\n points,\n indices: [\n 0, 1, 1, 3, 3, 2, 2, 0,\n 4, 5, 5, 7, 7, 6, 6, 4,\n 0, 4, 2, 6, 3, 7, 1, 5,\n ],\n };\n}\n\nfunction rect (width: number, height: number, pos?: vec3): GeometryData {\n const w = width / 2;\n const h = height / 2;\n const points: Vector3[] = [\n new Vector3(-w, h, 0),\n new Vector3(w, h, 0),\n new Vector3(w, -h, 0),\n new Vector3(-w, -h, 0),\n ];\n\n if (pos) {\n points.forEach(vec => {\n vec.add(pos);\n });\n }\n\n return {\n points,\n indices: [\n 0, 1, 1, 2, 2, 3, 3, 0,\n ],\n };\n}\n\nfunction combineGeometries (geometries: GeometryData[]) {\n const points: number[] = [];\n const indices: number[] = [];\n\n for (let i = 0, indicesBase = 0; i < geometries.length; i++) {\n const geometry = geometries[i];\n\n if (geometry) {\n geometry.points.forEach(point => {\n points.push(point.x, point.y, point.z);\n });\n geometry.indices.forEach(index => indices.push(index + indicesBase));\n indicesBase += geometry.points.length;\n }\n }\n\n return {\n points: new Float32Array(points),\n indices: new Uint16Array(indices),\n };\n}\n\nconst Shapes: Record<string, (arg: any) => GeometryData[]> = {\n Texture (arg: any) {\n const ret = [];\n\n if (arg.detail) {\n const anchors = arg.detail.anchors;\n const block = arg.detail.block;\n const width = arg.width;\n const height = arg.height;\n\n for (let i = 0; i < anchors.length; i += 2) {\n ret.push(rect(block[0] * width, block[1] * height, [\n width * (anchors[i] - 0.5),\n height * (anchors[i + 1] - 0.5),\n 0,\n ]));\n }\n } else {\n ret.unshift(Shapes.Rectangle(arg)[0]);\n }\n\n return ret;\n },\n Circle (arg: any) {\n const { radius, arc } = arg;\n\n return [\n arcPath(radius, arc),\n arc !== 360 && line([0, 0, 0], [radius, 0, 0]),\n arc !== 360 && line([0, 0, 0], [Math.cos(arc * DEG2RAD) * radius, Math.sin(arc * DEG2RAD) * radius, 0]),\n ] as GeometryData[];\n },\n Box: function (arg: any) {\n const {\n width, height, depth, center,\n } = arg;\n const data = box(width, height, depth, center);\n\n return [data];\n },\n Sphere: function (arg) {\n const { radius, arc } = arg;\n const ret = [\n line([0, 0, -radius], [0, 0, radius]),\n arcPath(radius, arc > 180 ? 360 : 180, { plane: 'xz', rotate: [0, 90, 0] }),\n arcPath(radius, arc, { plane: 'xy' }),\n arcPath(radius, 180, { plane: 'xz', rotate: [0, 90, arc] }),\n ];\n\n if (arc > 90) {\n ret.push(arcPath(radius, arc > 270 ? 360 : 180, { plane: 'yz', rotate: [-90, 0, 0] }));\n }\n\n return ret;\n },\n Hemisphere (arg) {\n const { radius, arc } = arg;\n const ret = [\n line([0, 0, radius], [0, 0, 0]), //z\n line([arc > 180 ? -radius : 0, 0, 0], [radius, 0, 0]), //x\n arg > 90 && line([0, arc > 270 ? -radius : 0, 0], [0, radius, 0]), //y\n arcPath(radius, (arc > 180 ? 360 : 180) / 2, { plane: 'xz' }),\n arcPath(radius, arc, { plane: 'xy' }),\n arcPath(radius, 90, { plane: 'xz', rotate: [0, 0, arc] }),\n line([0, 0, 0], [Math.cos(arc * DEG2RAD) * radius, Math.sin(arc * DEG2RAD) * radius, 0]),\n ] as GeometryData[];\n\n if (arc > 90) {\n ret.push(arcPath(radius, arc > 270 ? 180 : 90, { plane: 'yz' }));\n }\n\n return ret;\n },\n Cone (arg) {\n const { radius, arc } = arg;\n const outerRadius = radius * Math.tan(arg.angle * DEG2RAD) + radius;\n\n return [\n arcPath(outerRadius, arc, { translate: [0, 0, radius] }),\n line([radius, 0, 0], [outerRadius, 0, radius]),\n arc > 90 && line([0, radius, 0], [0, outerRadius, radius]),\n arc > 180 && line([-radius, 0, 0], [-outerRadius, 0, radius]),\n arc > 270 && line([0, -radius, 0], [0, -outerRadius, radius]),\n line([Math.cos(arc * DEG2RAD) * radius, Math.sin(arc * DEG2RAD) * radius, 0],\n [Math.cos(arc * DEG2RAD) * outerRadius, Math.sin(arc * DEG2RAD) * outerRadius, radius]),\n ].concat(Shapes.Circle(arg)) as GeometryData[];\n },\n Edge (arg) {\n const hw = arg.width / 2;\n\n return [\n line([-hw, 0, 0], [hw, 0, 0]),\n ];\n },\n Rectangle (arg) {\n return [\n rect(arg.width, arg.height),\n ];\n },\n RectangleEdge (arg) {\n return [\n rect(arg.width, arg.height),\n ];\n },\n Donut (arg) {\n const { arc, radius, donutRadius } = arg;\n\n return [\n arcPath(donutRadius, 360, { translate: [radius, 0, 0], rotate: [90, 0, 0] }),\n arcPath(radius - donutRadius, arc),\n arcPath(radius + donutRadius, arc),\n arcPath(radius, arc, { translate: [0, 0, donutRadius] }),\n arcPath(radius, arc, { translate: [0, 0, -donutRadius] }),\n arc % 360 === 0 ? arcPath(donutRadius, 360, {\n translate: [-radius, 0, 0],\n rotate: [90, 0, 0],\n }) : arcPath(donutRadius, 360, {\n translate: [Math.cos(arc * DEG2RAD) * radius, Math.sin(arc * DEG2RAD) * radius, 0],\n rotate: [90, 0, arc],\n }),\n ];\n },\n path (arg) {\n const positions = arg.keys;\n const ret = [];\n\n for (let i = 0; i < positions.length - 1; i++) {\n ret.push(rect(rectSize, rectSize, positions[i]));\n ret.push(line(positions[i], positions[i + 1]));\n }\n ret.push(rect(rectSize, rectSize, positions[positions.length - 1]));\n\n return ret;\n },\n};\n\nShapes['0'] = Shapes.None;\nShapes['1'] = Shapes.Sphere;\nShapes['2'] = Shapes.Cone;\nShapes['3'] = Shapes.Hemisphere;\nShapes['4'] = Shapes.Circle;\nShapes['5'] = Shapes.Donut;\nShapes['6'] = Shapes.Rectangle;\nShapes['7'] = Shapes.RectangleEdge;\nShapes['8'] = Shapes.Edge;\nShapes['9'] = Shapes.Texture;\n\nexport function createMeshFromShape (engine: Engine, args: { shape: string, type?: number }, options: { color?: vec3, depthTest?: boolean }): Mesh {\n const ret = Shapes[args.type || args.shape](args);\n const geo = combineGeometries(ret);\n\n return createMesh(engine, geo.points, geo.indices, options.color || [1, 0, 0], options.depthTest, args.shape);\n}\n\nfunction createMesh (engine: Engine, points: Float32Array, indices: Uint16Array, color: vec3, depthTest = false, name?: string): Mesh {\n const material = Material.create(\n engine,\n {\n uniformValues: {\n u_color: new Float32Array(color),\n u_model: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n },\n shader: {\n shared: true,\n fragment: `\n precision mediump float;\n\n uniform vec3 u_color;\n\n void main(){\n gl_FragColor = vec4(u_color,1.0);\n }`,\n vertex: `precision highp float;\n\n attribute vec3 a_Position;\n\n uniform mat4 u_model;\n uniform mat4 effects_MatrixVP;\n void main(){\n gl_Position = effects_MatrixVP * u_model * vec4(a_Position,1.0);\n }`,\n },\n });\n\n material.setVector3('u_color', Vector3.fromArray(color));\n material.setMatrix('u_model', Matrix4.IDENTITY);\n material.depthTest = depthTest;\n material.stencilTest = false;\n material.blending = false;\n material.depthMask = true;\n const geometry = Geometry.create(\n engine,\n {\n attributes: {\n a_Position: {\n size: 3,\n data: points,\n },\n },\n indices: {\n data: indices,\n },\n mode: glContext.LINES,\n drawCount: indices.length,\n });\n\n return Mesh.create(\n engine,\n {\n name,\n geometry,\n material,\n priority: 3000,\n });\n}\n","import type { Composition, Scene, SceneLoadOptions, Texture, VFXItem } from '@galacean/effects';\nimport { Plugin } from '@galacean/effects';\nimport { axisIconMap } from './constants';\nimport { createImage, createTexture } from './util';\nimport { GizmoComponent } from './gizmo-component';\n\nconst iconImages: Map<string, HTMLImageElement> = new Map();\n\nexport const iconTextures: Map<string, Texture> = new Map();\n\nexport class EditorGizmoPlugin extends Plugin {\n override order = 1001;\n\n override async onAssetsLoadStart (scene: Scene, options?: SceneLoadOptions | undefined): Promise<void> {\n iconTextures.clear();\n\n if (iconImages.size !== axisIconMap.size) {\n for (const [name, data] of axisIconMap) {\n iconImages.set(name, await createImage(data));\n }\n }\n }\n\n override onCompositionCreated (composition: Composition, scene: Scene) {\n const engine = composition.renderer.engine;\n\n iconImages.forEach((image, name) => {\n iconTextures.set(name, createTexture(engine, image));\n });\n iconImages.clear();\n\n const items = composition.items;\n const targetMap: { [key: string]: VFXItem[] } = {};\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const gizmoComponent = item.getComponent(GizmoComponent);\n\n if (gizmoComponent) {\n if (!targetMap[gizmoComponent.target]) {\n targetMap[gizmoComponent.target] = [];\n }\n targetMap[gizmoComponent.target].push(item);\n }\n }\n composition.loaderData.gizmoTarget = targetMap;\n composition.loaderData.gizmoItems = [];\n }\n}\n","import * as EFFECTS from '@galacean/effects';\nimport { logger, registerPlugin } from '@galacean/effects';\nimport { EditorGizmoPlugin } from './gizmo-loader';\nimport { GizmoSubType } from './define';\nimport { GeometryType, createGeometry } from './geometry';\n\nregisterPlugin('editor-gizmo', EditorGizmoPlugin);\n\nexport { DirectionLightData } from './geometry/direction-light';\nexport {\n GizmoSubType,\n GeometryType,\n createGeometry,\n};\nexport * from './gizmo-component';\n\n/**\n * 插件版本号\n */\nexport const version = __VERSION__;\n\nlogger.info(`Plugin editor gizmo version: ${version}.`);\n\nif (version !== EFFECTS.version) {\n console.error(\n '注意:请统一 Editor Gizmo 插件与 Player 版本,不统一的版本混用会有不可预知的后果!',\n '\\nAttention: Please ensure the Editor Gizmo plugin is synchronized with the Player version. Mixing and matching incompatible versions may result in unpredictable consequences!'\n );\n}\n"],"names":["GizmoSubType","BoundingType","GeometryType","WireframeGeometryType","CoordinateSpace","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_async_to_generator","fn","self","args","arguments","apply","err","undefined","_set_prototype_of","o","p","Object","setPrototypeOf","__proto__","_inherits","subClass","superClass","TypeError","prototype","create","constructor","writable","configurable","_is_native_reflect_construct","result","Boolean","valueOf","call","Reflect","construct","_","_construct","Parent","Class","a","push","instance","Function","bind","_get_prototype_of","getPrototypeOf","_wrap_native_super","_cache","Map","toString","indexOf","has","get","set","Wrapper","enumerable","_array_like_to_array","arr","len","length","i","arr2","Array","_create_for_of_iterator_helper_loose","allowArrayLike","it","Symbol","iterator","next","isArray","_unsupported_iterable_to_array","minLen","n","slice","name","from","test","__decorate","decorators","target","desc","d","c","r","getOwnPropertyDescriptor","decorate","defineProperty","__generator","thisArg","body","f","y","t","label","sent","trys","ops","g","Iterator","verb","v","step","op","pop","e","SuppressedError","color","xAxisColor","yAxisColor","zAxisColor","renderMode","glContext","TRIANGLES","axisIconMap","createImage","imageUrl","image","Image","src","onload","onerror","moveToPointWidthFixDistance","targetPos","currentPos","vecCameraItem","clone","subtract","scalerVecCameraItem","normalVecCameraItem","normalize","multiply","vecItemScaler","vecScalerItem","add","math","Vector3","Ray","Matrix4","Vector2","computeOrthographicOffCenter","left","right","bottom","top","near","far","b","tx","ty","tz","_extends","assign","source","hasOwnProperty","GeometryData","points","uvs","normals","indices","createXYPlaneCircle","radius","z","segments","thetaStart","thetaLength","startIndex","theta","x","Math","cos","sin","createXZPlaneCircle","createYZPlaneCircle","SphereGeometryData","widthSegments","heightSegments","phiStart","phiLength","PI","max","floor","thetaEnd","min","grid","index","iy","verticesRow","uOffset","ix","_this_normals","u","_this","normal","toArray","BoxGeometryData","width","height","depth","buildPlane","w","uDir","vDir","widthHalf","heightHalf","depthHalf","point","vertexCounter","numberOfVertices","CylinderGeometryData","radiusTop","radiusBottom","radialSegments","openEnded","generateCap","centerIndexStart","sign","halfHeight","centerIndexEnd","cosTheta","sinTheta","px","py","pz","uvU","uvV","indexArray","generateTorso","slope","indexRow","ConeGeometryData","TorusGeometryData","tube","tubularSegments","arc","j","cx","cy","PlaneGeometryData","gridX","gridY","gridX1","gridY1","segmentWidth","segmentHeight","ix1","Euler","FrustumGeometryData","position","rotation","fov","aspect","_this_points","halfY","tan","fovY","halfX","point1","point2","point3","point4","matrix","fromArray","toMatrix4","result1","transformPoint","result2","result3","result4","DirectionLightData","linesNumber","start","PointLightData","range","SpotLightData","spotAngle","FloorLineEdgeGeometryData","sideLength","parts","end","createGeometry","engine","type","size","geometryData","segments4","Geometry","attributes","a_Position","data","Float32Array","a_Normal","a_UV1","Uint16Array","mode","drawCount","createMeshFromSubType","subType","boundingMap","iconTexture","options","scale","boundSize","xCircle","yCircle","zCircle","center","xCircleBounding","yCircleBounding","zCircleBounding","xCircleTransform","yCircleTransform","zCircleTransform","centerTransform","WebGLRenderingContext","sprite","createSpriteMesh","camera","light","translation","createTranslationMesh","_step","axisSize","axisMesh","createAxisMesh","_iterator","mesh","transform","arrowSize","xArrow","createBasicMesh","cone","depthTest","yArrow","zArrow","xArrowTransform","Transform","valid","yArrowTransform","zArrowTransform","setRotation","translate","planeSize","xyPlane","plane","yzPlane","zxPlane","xyPlaneTransform","yzPlaneTransform","zxPlaneTransform","delta","createAxisBounding","triangle","triangles","firstGeometry","getTriangle","backfaceCulling","createScaleMesh","boxSize","centerBoxSize","xCube","box","yCube","zCube","centerCube","xCubeTransform","yCubeTransform","zCubeTransform","centerCubeTransform","sphere","pow","viewHelper","createViewHelperMesh","texture","posXSphere","posYSphere","posZSphere","posXSphereTransform","posYSphereTransform","posZSphereTransform","negXSphere","negYSphere","negZSphere","negXSphereTransform","negYSphereTransform","negZSphereTransform","radiusSegments","torus","alpha","geometry","getIndexData","getAttributeData","mat4","getWorldMatrix","i0","i1","i2","p0","p1","p2","projectPoint","isCentered","xAxis","yAxis","zAxis","xAxisTransform","yAxisTransform","zAxisTransform","materialType","myColor","myAlpha","material","geometryType","Sphere","cylinder","Cylinder","Cone","Torus","Sprite","Plane","frustum","Frustum","directionLight","DirectionLight","spotLight","SpotLight","pointLight","PointLight","floorGrid","FloorGrid","Box","Material","uniformValues","u_color","u_alpha","u_model","shader","shared","fragment","vertex","setVector3","setVector2","setMatrix","IDENTITY","stencilTest","blending","blendEquation","FUNC_ADD","blendFunction","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","depthMask","u_cameraPos","u_center","ZERO","Mesh","priority","_instanceof","hasInstance","Texture","setTexture","line","DEG2RAD","arcPath","_options_translate","rotate","rotMat4","_options_rotate","negate","addPoint","angle","transformNormal","rect","pos","h","forEach","vec","Shapes","ret","detail","anchors","block","unshift","Rectangle","Circle","myCenter","map","item","Hemisphere","outerRadius","concat","Edge","hw","RectangleEdge","Donut","donutRadius","path","positions","keys","createMeshFromShape","geo","combineGeometries","geometries","indicesBase","shape","LINES","None","Vector4","destroyWireframeMesh","dispose","DestroyOptions","keep","updateWireframeMesh","originGeometry","originMaterial","wireframe","cloneUniforms","wireframeGeometry","enabledMacros","macro","enableMacro","abs","getDrawCount","indexData","getTriangleIndexData","oid","faceCount","Uint32Array","idx","base","getTriangleIndexDataByCount","setIndexData","setDrawCount","getQuadIndexData","SharedGeometry","sourceIndex","drawStart","getAttributeNames","vertexBuffer","getVertexBuffer","setVerticesBuffer","editorRenderPassName","frontRenderPassName","behindRenderPassName","Quaternion","constants","GizmoComponent","RendererComponent1","coordinateSpace","mat","fromIdentity","wireframeMeshes","meshes","getHitTestParams","worldMat4","boundingKeys","targetItem","worldPos","worldQuat","worldSca","gizmoSubType","assignWorldTRS","targetTransform","quat","newPos","composition","setPosition","HitTestType","custom","clipMasks","frameClipMasks","collect","ray","pointInCanvas","hitPositions","gizmoComponent","getComponent","hitBounding","bounding","worldCenter","copyFrom","boxHalfSize","boxMax","boxMin","intersectBox","viewMat4","getViewMatrix","screenWidth","renderer","getWidth","screenHeight","getHeight","proMat4","cameraModelMat4","getInverseViewMatrix","localTransform","cloneFromMatrix","padding","localMat4","modelMat4","mvpMat4","vpMat4","screenCenter","up","elements","screenPoint","screenCenter2","toVector2","screenPoint2","screenRadius","distance","intersectSphere","tmpPositions","tmpPosition","worldTriangle","intersectTriangle","lastDistance","origin","distanceSquared","intersectRayLine","out","radiusPoint","getModelViewProjection","screenStart","screenEnd","screenRadiusVector","screenRadiusPoint","distanceOfPointAndLine","AC","BC","AB","subtractVectors","sqrt","P","lengthAC","lengthBC","lengthAB","isInLine","l2","line0","line1","l1","worldAP","screenPosition","worldAB","inverseViewProjection","getInverseViewProjectionMatrix","behavior","spec","InteractBehavior","NOTIFY","_proto","onStart","_this_item_composition","_this_item_composition_items","items","id","PluginSystem","_step1","_iterator1","getPlugins","plugin","gizmoPlugin","particleEmitter","createParticleContent","modelWireframe","needCreateModelContent","createModelContent","createBasicContent","iconTextures","createCombinationContent","boundingBox","createBoundingBoxContent","loaderData","gizmoItems","onEnable","renderFrame","getFrontRenderPass","addMesh","getBehindRenderPass","getEditorRenderPass","onDisable","removeMesh","onUpdate","dt","updateRenderData","onDestroy","gizmoMesh","isDestroyed","contents","wireframeMesh","splice","render","_this_targetItem_getComponent","pMesh","RendererComponent","content","subMeshes","worldMatrix","effectMaterial","particle","ParticleSystemRenderer","particleMesh","quad","worldScale","parentTransform","distanceToCneter","localMat","worldTransform","proMat5","cameraPos","getDefaultRenderMode","getDefaultSize","psubMesh","modelComponent","assertExist","materialOptions","originMesh","shaderData","props","macros","glslVersion","gpuCapability","level","GLSLVersion","GLSL3","GLSL1","setVector4","ParticleSystem","definition","gizmoItem","fromData","duration","_data_options_color","pipeline","rp","renderPasses","find","renderPass","DrawGizmoBehindPass","addRenderPass","DrawGizmoEditorPass","DrawGizmoFrontPass","serialize","effectsClass","RenderPass","RenderPassPriorityPostprocess","execute","clear","depthAction","TextureLoadAction","renderMeshes","RenderPassPriorityPrepare","iconImages","EditorGizmoPlugin","Plugin","order","onAssetsLoadStart","scene","_state","onCompositionCreated","targetMap","gizmoTarget","registerPlugin","version","logger","EFFECTS","console"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.min.js","sources":["../src/3d/define.ts","../src/3d/gizmo-vfx-item.ts","../src/3d/geometry/index.ts","../src/3d/wireframe.ts","../src/3d/gizmo-component.ts","../../../node_modules/.pnpm/@galacean+effects-math@1.2.1/node_modules/@galacean/effects-math/es/extension/utils/is-range-in.js","../src/2d/cursor.ts","../src/2d/gizmo-type.ts","../src/2d/gizmos/resize-selection-gizmo/transform-types.ts","../src/2d/gizmos/resize-selection-gizmo/resize-selection-gizmo.ts","../src/2d/frame/types.ts","../src/2d/gizmos/image-interaction.ts","../src/2d/gizmos/item-create-gizmo.ts","../src/2d/gizmos/hand-gizmo.ts","../src/2d/gizmos/icon-gizmo.ts","../src/2d/viewport/gizmo-viewport.ts","../src/2d/gesture-handler.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_async_to_generator.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_set_prototype_of.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_inherits.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_is_native_reflect_construct.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_construct.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_get_prototype_of.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_wrap_native_super.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_is_native_function.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_array_like_to_array.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_create_for_of_iterator_helper_loose.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_unsupported_iterable_to_array.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_instanceof.js","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs","../src/3d/constants.ts","../src/3d/util.ts","../src/3d/math-utils.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_extends.js","../src/3d/geometry/geometry.ts","../src/3d/geometry/sphere.ts","../src/3d/geometry/box.ts","../src/3d/geometry/cylinder.ts","../src/3d/geometry/cone.ts","../src/3d/geometry/torus.ts","../src/3d/geometry/plane.ts","../src/3d/geometry/frustum.ts","../src/3d/geometry/direction-light.ts","../src/3d/geometry/point-light.ts","../src/3d/geometry/spot-light.ts","../src/3d/geometry/floor-line-edge.ts","../src/3d/mesh.ts","../src/3d/raycast.ts","../src/3d/shape.ts","../src/3d/gizmo-loader.ts","../src/2d/math/core.ts","../../../node_modules/.pnpm/@galacean+effects-math@1.2.1/node_modules/@galacean/effects-math/es/core/vector2.js","../../../node_modules/.pnpm/@galacean+effects-math@1.2.1/node_modules/@galacean/effects-math/es/core/utils.js","../../../node_modules/.pnpm/@galacean+effects-math@1.2.1/node_modules/@galacean/effects-math/es/extension/box2.js","../../../node_modules/.pnpm/@galacean+effects-math@1.2.1/node_modules/@galacean/effects-math/es/extension/circle.js","../../../node_modules/.pnpm/@galacean+effects-math@1.2.1/node_modules/@galacean/effects-math/es/extension/line2.js","../../../node_modules/.pnpm/@galacean+effects-math@1.2.1/node_modules/@galacean/effects-math/es/core/vector3.js","../../../node_modules/.pnpm/@galacean+effects-math@1.2.1/node_modules/@galacean/effects-math/es/extension/line3.js","../../../node_modules/.pnpm/@galacean+effects-math@1.2.1/node_modules/@galacean/effects-math/es/extension/plane.js","../../../node_modules/.pnpm/@galacean+effects-math@1.2.1/node_modules/@galacean/effects-math/es/extension/utils/round-number.js","../src/2d/math/geometry.ts","../src/2d/math/ray-caster.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_create_class.js","../src/2d/text/text-caret-mapper.ts","../src/2d/text/text-edit-session.ts","../src/2d/gizmo-tool.ts","../src/2d/gizmo-tools/hand-gizmo-tool.ts","../src/2d/gizmo-tools/move-gizmo-tool.ts","../src/2d/gizmo.ts","../src/2d/items/vfx-item-factory.ts","../src/2d/items/default-vfx-items.ts","../src/2d/viewport/coordinates.ts","../src/2d/items/item-predicates.ts","../src/2d/items/item-geometry.ts","../src/2d/items/item-hierarchy.ts","../src/2d/items/media-controls.ts","../src/2d/viewport/viewport-utils.ts","../src/2d/configs/config-definition.ts","../src/2d/configs/loading-config.ts","../src/2d/configs/builtin-configs.ts","../src/2d/viewport/viewport-operations.ts","../src/2d/viewport/viewport-range.ts","../src/2d/viewport/viewport-navigation-controller.ts","../src/2d/frame/frame-resize.ts","../src/2d/drawing.ts","../src/2d/gizmos/resize-selection-gizmo/anchored-resize.ts","../src/2d/gizmos/corner-rotation-gizmo.ts","../src/2d/gizmos/leave-effects-edit-gizmo.ts","../src/2d/gizmos/box-selection-gizmo.ts","../src/2d/gizmos/change-selection-gizmo.ts","../src/2d/gizmos/click-drag-multiplex-gizmo.ts","../src/2d/frame/layout-calculations.ts","../src/2d/frame/frame-assisted-layout.ts","../src/2d/gizmos/move-selection-gizmo.ts","../src/2d/selection/create-selection-interaction-gizmo.ts","../src/2d/modes/effects-edit-mode.ts","../src/2d/gizmos/leave-text-edit-gizmo.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_assert_this_initialized.js","../src/2d/gizmos/text-gizmo.ts","../src/2d/gizmos/select-text-gizmo.ts","../src/2d/modes/text-edit-mode.ts","../src/2d/gizmos/enter-edit-mode-gizmo.ts","../src/2d/modes/default-selection-mode.ts","../src/2d/gizmos/image-cut-gizmo.ts","../src/2d/gizmo-tools/image-cut-gizmo-tool.ts","../src/2d/gizmos/image-expand-gizmo.ts","../src/2d/gizmo-tools/image-expand-gizmo-tool.ts","../src/2d/gizmos/sprite-text-edit-gizmo.ts","../src/2d/gizmo-tools/sprite-text-edit-gizmo-tool.ts","../src/2d/gizmos/mask-gizmo.ts","../src/2d/gizmo-tools/mask-gizmo-tool.ts","../src/2d/drag-threshold.ts","../src/2d/gizmo-tools/item-create-gizmo-tool.ts","../src/2d/configs/config-manager.ts","../src/2d/gizmo-manager.ts","../src/2d/gizmos/loading-manager.ts","../src/2d/frame/frame-auto-layout.ts","../src/2d/frame/frame-manager.ts","../src/2d/selection/selection.ts","../src/2d/selection/snap-manager.ts","../src/2d/cursor-icons.ts","../src/2d/gizmos/loading-gizmo.ts","../src/2d/gizmos/viewport-overlay-gizmo.ts","../src/index.ts","../src/2d/math/utils.ts"],"sourcesContent":["import type { GeometryDrawMode, spec } from '@galacean/effects';\n\nexport interface GizmoVFXItemOptions {\n target: string,\n subType: GizmoSubType,\n renderMode?: GeometryDrawMode,\n type: 'editor-gizmo',\n color: spec.vec3,\n size?: number,\n depthTest?: boolean,\n}\n\nexport const GizmoVFXItemType = 'gizmo' as spec.ItemType;\n\n/**\n * Gizmo 类型\n */\nexport enum GizmoSubType {\n particleEmitter = 1,\n modelWireframe = 2,\n box,\n sphere,\n cylinder,\n cone,\n torus,\n sprite,\n plane,\n rotation,\n translation,\n scale,\n viewHelper,\n camera,\n frustum,\n light,\n directionLight,\n pointLight,\n spotLight,\n boundingBox,\n floorGrid,\n}\n","import { math } from '@galacean/effects';\n\nexport type Ray = math.Ray;\nexport type TriangleLike = math.TriangleLike;\ntype Vector3 = math.Vector3;\n\nconst { Vector3, Ray } = math;\n\n/**\n * 包围盒类型\n */\nexport enum BoundingType {\n box,\n sphere,\n triangle,\n line\n}\n\n/**\n * 线条包围盒类型\n */\nexport interface GizmoItemBoundingLine {\n type: BoundingType.line,\n // 线条包围盒两端点\n points: [Vector3, Vector3],\n // 射线与线条距离阈值\n width: number,\n}\n\n/**\n * 立方体包围盒类型\n */\nexport interface GizmoItemBoundingBox {\n type: BoundingType.box,\n //包围形状相对于元素位置的偏移,默认[0,0,0]\n center?: Vector3,\n //包围盒的xyz长度,当type为box时生效\n size: Vector3,\n}\n\n/**\n * 球体包围盒类型\n */\nexport interface GizmoItemBoundingSphere {\n type: BoundingType.sphere,\n //包围形状相对于元素位置的偏移,默认[0,0,0]\n center?: Vector3,\n //包围球的半径,当type为sphere时生效\n radius: number,\n}\n\n/**\n * 三角数组包围盒类型\n */\nexport interface GizmoItemBoundingTriangle {\n type: BoundingType.triangle,\n triangles: TriangleLike[],\n backfaceCulling?: boolean,\n}\n\nexport type GizmoItemBounding =\n | GizmoItemBoundingBox\n | GizmoItemBoundingSphere\n | GizmoItemBoundingTriangle\n | GizmoItemBoundingLine\n ;\n","import type { Engine, GeometryDrawMode, spec } from '@galacean/effects';\nimport { Geometry } from '@galacean/effects';\nimport { SphereGeometryData } from './sphere';\nimport { BoxGeometryData } from './box';\nimport type { GeometryData } from './geometry';\nimport { CylinderGeometryData } from './cylinder';\nimport { ConeGeometryData } from './cone';\nimport { TorusGeometryData } from './torus';\nimport { PlaneGeometryData } from './plane';\nimport { FrustumGeometryData } from './frustum';\nimport { DirectionLightData } from './direction-light';\nimport { PointLightData } from './point-light';\nimport { SpotLightData } from './spot-light';\nimport { FloorLineEdgeGeometryData } from './floor-line-edge';\n\n/**\n * 几何体类型\n */\nexport enum GeometryType {\n Box,\n Sphere,\n Cylinder,\n Cone,\n Torus,\n Frustum,\n Sprite,\n Plane,\n DirectionLight,\n SpotLight,\n PointLight,\n FloorGrid,\n}\n\n/**\n * 几何体参数\n */\nexport interface MeshOption {\n size: any,\n color?: spec.vec3,\n renderMode: GeometryDrawMode,\n depthTest?: boolean,\n name?: string,\n alpha?: number,\n}\n\n/**\n * 合并多个几何体数据\n * @param geometries - 几何体数据数组\n * @returns 合并后的几何体数据\n */\n// export function combineGeometries (geometries: GeometryData[]): GeometryData {\n// const points: number[] = [];\n// const indices: number[] = [];\n// const uvs: number[] = [];\n// const normals: number[] = [];\n\n// for (let i = 0, indicesBase = 0; i < geometries.length; i++) {\n// const geometryData = geometries[i];\n// if (geometryData) {\n// points.push(...geometryData.points);\n// uvs.push(...geometryData.uvs);\n// normals.push(...geometryData.normals);\n// geometryData.indices.forEach(index => indices.push(index + indicesBase));\n// indicesBase += geometryData.points.length;\n// }\n// }\n\n// return {\n// points,\n// indices,\n// uvs,\n// normals,\n// };\n// }\n\n/**\n * 创建几何体对象\n * @param type - 几何体类型\n * @param size - 几何体尺寸\n * @param renderMode - 绘制模式:`gl.TRIANGLES`、`gl.LINES`\n * @returns\n */\nexport function createGeometry (engine: Engine, type: GeometryType, size: Record<string, any>, renderMode?: GeometryDrawMode): Geometry {\n let geometryData: GeometryData;\n\n switch (type) {\n case GeometryType.Sphere:\n geometryData = new SphereGeometryData(size.radius, size.widthSegments, size.heightSegments);\n\n break;\n case GeometryType.Cylinder:\n geometryData = new CylinderGeometryData(size.radius, size.radius, size.height);\n\n break;\n case GeometryType.Cone:\n geometryData = new ConeGeometryData(size.radius, size.height);\n\n break;\n case GeometryType.Torus:\n geometryData = new TorusGeometryData(size.radius, size.tube, size.radialSegments, size.tubularSegments, size.arc);\n\n break;\n case GeometryType.Sprite:\n case GeometryType.Plane:\n geometryData = new PlaneGeometryData(size.width, size.height);\n\n break;\n case GeometryType.Frustum:\n geometryData = new FrustumGeometryData(size.position, size.rotation, size.fov, size.aspect, size.near, size.far);\n\n break;\n case GeometryType.DirectionLight:\n geometryData = new DirectionLightData(size.radius, size.length, size.segments4, size.linesNumber, size.thetaStart, size.thetaLength);\n\n break;\n case GeometryType.PointLight:\n geometryData = new PointLightData(size.range, size.segments, size.thetaStart, size.thetaLength);\n\n break;\n case GeometryType.SpotLight:\n geometryData = new SpotLightData(size.range, size.spotAngle, size.segments, size.thetaStart, size.thetaLength);\n\n break;\n case GeometryType.FloorGrid:\n geometryData = new FloorLineEdgeGeometryData(size.sideLength, size.parts);\n\n break;\n default:\n geometryData = new BoxGeometryData(size.width, size.height, size.depth);\n\n break;\n }\n const result = Geometry.create(\n engine,\n {\n attributes: {\n a_Position: {\n size: 3,\n data: new Float32Array(geometryData.points),\n },\n a_Normal: {\n size: 3,\n data: new Float32Array(geometryData.normals),\n },\n a_UV1: {\n size: 2,\n data: new Float32Array(geometryData.uvs),\n },\n },\n indices: {\n data: new Uint16Array(geometryData.indices),\n },\n mode: renderMode,\n drawCount: geometryData.indices.length,\n });\n\n return result;\n}\n","import type { ShaderMacros, GeometryDrawMode, Engine, spec } from '@galacean/effects';\nimport { GLSLVersion, glContext, Geometry, DestroyOptions, Material, Mesh, math } from '@galacean/effects';\n\nconst { Vector4 } = math;\n\nexport function createParticleWireframe (engine: Engine, mesh: Mesh, color: spec.vec3): Mesh {\n const geometry = new SharedGeometry(\n engine,\n {\n geometry: mesh.firstGeometry(),\n mode: glContext.LINES,\n index: {\n data: new Uint16Array(0),\n },\n name: 'testtest',\n });\n\n const { vertex, fragment, macros, name } = mesh.material.props.shader;\n const materialOptions = { ...mesh.material.props };\n const newMacros = [...(macros || [] as ShaderMacros), ['PREVIEW_BORDER', 1]] as ShaderMacros;\n\n materialOptions.shader = {\n vertex,\n fragment,\n macros: newMacros,\n shared: true,\n name: name + '_wireframe',\n glslVersion: engine.displayServer.renderingDevice.gpuCapability.level === 2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,\n };\n const material = Material.create(engine, materialOptions);\n\n material.depthTest = mesh.material.depthTest;\n material.setVector4('uPreviewColor', new Vector4(color[0], color[1], color[2], 1));\n\n return updateWireframeMesh(mesh.geometry, mesh.material, Mesh.create(\n engine,\n {\n geometry,\n material,\n priority: 3000,\n name: materialOptions.shader.name,\n }), WireframeGeometryType.quad);\n}\n\nexport enum WireframeGeometryType {\n triangle,\n quad,\n}\n\nexport function destroyWireframeMesh (mesh: Mesh) {\n mesh.geometry?.dispose();\n mesh.dispose({ geometries: DestroyOptions.keep });\n}\n\nexport function updateWireframeMesh (originGeometry: Geometry, originMaterial: Material, wireframe: Mesh, type: WireframeGeometryType) {\n wireframe.material.cloneUniforms(originMaterial);\n\n const geometry = originGeometry;\n const wireframeGeometry = wireframe.firstGeometry();\n\n for (const macro of Object.keys(originMaterial.enabledMacros)) {\n wireframe.material.enableMacro(macro, originMaterial.enabledMacros[macro]);\n }\n\n if (type === WireframeGeometryType.triangle) {\n // 线框模式不绘制模型的时候,drawCount 为负数\n const drawCount = Math.abs(geometry.getDrawCount());\n\n if (drawCount !== 0) {\n if (drawCount !== wireframeGeometry.getDrawCount() / 2) {\n const indexData = geometry.getIndexData() as Uint16Array | undefined;\n const data = indexData ? getTriangleIndexData(indexData) : getTriangleIndexDataByCount(drawCount);\n\n wireframeGeometry.setIndexData(data);\n wireframeGeometry.setDrawCount(data.length);\n }\n }\n } else if (type === WireframeGeometryType.quad) {\n if (geometry.getDrawCount() / 6 !== wireframeGeometry.getDrawCount() / 8) {\n const data = getQuadIndexData(geometry.getDrawCount() / 6, geometry.getIndexData() as Uint16Array);\n\n wireframeGeometry.setIndexData(data);\n wireframeGeometry.setDrawCount(data.length);\n }\n }\n\n return wireframe;\n}\n\nfunction getQuadIndexData (faceCount: number, oid: Uint16Array): Uint16Array {\n const indexData = new Uint16Array(faceCount * 8);\n\n for (let i = 0; i < faceCount; i++) {\n const idx = i * 8;\n const base = i * 4;\n\n indexData[idx] = base;\n indexData[idx + 1] = 1 + base;\n indexData[idx + 2] = 1 + base;\n indexData[idx + 3] = 3 + base;\n indexData[idx + 4] = 3 + base;\n indexData[idx + 5] = 2 + base;\n indexData[idx + 6] = 2 + base;\n indexData[idx + 7] = base;\n }\n\n return indexData;\n}\n\nexport function createModeWireframe (engine: Engine, mesh: Mesh, color: spec.vec3): Mesh {\n const geometry = new SharedGeometry(\n engine,\n {\n geometry: mesh.firstGeometry(),\n mode: glContext.LINES,\n index: {\n data: new Uint32Array(0),\n },\n });\n const { vertex, fragment } = mesh.material.shader.shaderData;\n const materialOptions = { ...mesh.material.props };\n\n const newMacros = [['PREVIEW_BORDER', 1]] as ShaderMacros;\n\n materialOptions.shader = {\n vertex,\n fragment,\n macros: newMacros,\n shared: true,\n name: (mesh.name ?? 'unamedmesh') + '_wireframe',\n glslVersion: engine.displayServer.renderingDevice.gpuCapability.level === 2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,\n };\n\n const material = Material.create(engine, materialOptions);\n\n material.depthTest = true;\n material.setVector4('uPreviewColor', new Vector4(color[0], color[1], color[2], 1));\n\n return updateWireframeMesh(mesh.geometry, mesh.material, Mesh.create(\n engine,\n {\n geometry,\n material,\n priority: 3000,\n name: materialOptions.shader.name,\n }), WireframeGeometryType.triangle);\n}\n\nfunction getTriangleIndexDataByCount (drawCount: number): Uint32Array {\n const faceCount = drawCount / 3;\n const indexData = new Uint32Array(faceCount * 6);\n\n for (let i = 0; i < faceCount; i++) {\n const idx = i * 6;\n const p0 = i * 3;\n const p1 = p0 + 1;\n const p2 = p0 + 2;\n\n indexData[idx] = p0;\n indexData[idx + 1] = p1;\n indexData[idx + 2] = p1;\n indexData[idx + 3] = p2;\n indexData[idx + 4] = p2;\n indexData[idx + 5] = p0;\n }\n\n return indexData;\n}\n\nfunction getTriangleIndexData (oid: Uint16Array): Uint32Array {\n const faceCount = oid.length / 3;\n const indexData = new Uint32Array(faceCount * 6);\n\n for (let i = 0; i < faceCount; i++) {\n const idx = i * 6;\n const base = i * 3;\n const p0 = oid[base];\n const p1 = oid[base + 1];\n const p2 = oid[base + 2];\n\n indexData[idx] = p0;\n indexData[idx + 1] = p1;\n indexData[idx + 2] = p1;\n indexData[idx + 3] = p2;\n indexData[idx + 4] = p2;\n indexData[idx + 5] = p0;\n }\n\n return indexData;\n}\n\nexport interface SharedGeometryOptions {\n name?: string,\n drawStart?: number,\n drawCount?: number,\n mode?: GeometryDrawMode,\n index?: { data: Uint16Array | Uint32Array },\n geometry: Geometry,\n}\n\nexport class SharedGeometry extends Geometry {\n constructor (engine: Engine, options: SharedGeometryOptions) {\n const source = options.geometry;\n const sourceIndex = options.index?.data ?? source.getIndexData();\n const indexData = sourceIndex?.slice() as Uint16Array | Uint32Array | undefined;\n\n super(engine, {\n name: options.name,\n attributes: {},\n indices: indexData ? { data: indexData } : undefined,\n drawStart: options.drawStart ?? 0,\n drawCount: options.drawCount ?? 0,\n mode: options.mode ?? 0,\n });\n const layout = source.getVertexLayout();\n\n if (layout) {\n this.setVertexBuffers(source.getVertexBuffers(), layout);\n }\n }\n}\n","import type { GeometryDrawMode, HitTestCustomParams, RenderingData, Renderer, Texture, VFXItem } from '@galacean/effects';\nimport {\n RenderPass, RenderPassEvent, RendererFeature, Mesh, HitTestType,\n TextureLoadAction, ParticleSystemRenderer, RendererComponent, Transform, assertExist,\n effectsClass, glContext, math, spec, PluginSystem,\n ParticleSystem,\n} from '@galacean/effects';\nimport type { GizmoVFXItemOptions } from './define';\nimport { GizmoSubType } from './define';\nimport type { EditorGizmoPlugin } from './gizmo-loader';\nimport { iconTextures } from './gizmo-loader';\nimport type { GizmoItemBoundingSphere, GizmoItemBounding, Ray, TriangleLike } from './gizmo-vfx-item';\nimport { BoundingType } from './gizmo-vfx-item';\nimport { computeOrthographicOffCenter } from './math-utils';\nimport { createMeshFromSubType } from './mesh';\nimport { intersectRayLine } from './raycast';\nimport { createMeshFromShape } from './shape';\nimport { moveToPointWidthFixDistance } from './util';\nimport { WireframeGeometryType, createModeWireframe, destroyWireframeMesh, updateWireframeMesh } from './wireframe';\nimport { GeometryType } from './geometry';\n\n// TODO: Move to spec\ninterface GizmoComponentData extends spec.ComponentData {\n options: GizmoVFXItemOptions,\n transform?: Record<string, unknown>,\n coordinateSpace?: CoordinateSpace,\n}\n\nconst editorRenderPassName = 'editor-gizmo';\nconst frontRenderPassName = 'front-gizmo';\nconst behindRenderPassName = 'behind-gizmo';\n\ntype Vector2 = math.Vector2;\ntype Vector3 = math.Vector3;\ntype Matrix4 = math.Matrix4;\n\nconst { Vector2, Vector3, Matrix4, Quaternion } = math;\nconst constants = glContext;\n\n@effectsClass('GizmoComponent')\nexport class GizmoComponent extends RendererComponent {\n gizmoPlugin: EditorGizmoPlugin;\n targetItem: VFXItem;\n needCreateModelContent: boolean;\n target: string;\n subType: GizmoSubType;\n size: any;\n contents?: Map<Mesh, Transform>;\n boundingMap: Map<string, GizmoItemBounding> = new Map();\n hitBounding?: { key: string, position: Vector3 };\n wireframeMesh: Mesh;\n coordinateSpace: CoordinateSpace = CoordinateSpace.Local;\n\n color: spec.vec3;\n renderMode!: GeometryDrawMode;\n depthTest?: boolean;\n mat = Matrix4.fromIdentity();\n wireframeMeshes: Mesh[] = [];\n meshes: Mesh[] = [];\n mesh: Mesh | null = null;\n\n override onStart (): void {\n this.item.getHitTestParams = this.getHitTestParams;\n for (const item of this.item.composition?.items ?? []) {\n if (item.id === this.target) {\n this.targetItem = item;\n }\n }\n const targetItem = this.targetItem;\n\n if (!targetItem) {\n\n return;\n }\n const composition = this.item.composition;\n\n for (const plugin of PluginSystem.getPlugins() ?? []) {\n if (plugin.name === 'editor-gizmo') {\n this.gizmoPlugin = plugin as EditorGizmoPlugin;\n }\n }\n const gizmoPlugin = this.gizmoPlugin;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison\n if (targetItem.type === '7' || !gizmoPlugin) {\n return;\n }\n const gizmoSubType = this.subType;\n\n switch (gizmoSubType) {\n case GizmoSubType.particleEmitter:\n this.createParticleContent(targetItem);\n\n break;\n case GizmoSubType.modelWireframe:\n this.needCreateModelContent = true;\n this.createModelContent(targetItem);\n\n break;\n case GizmoSubType.box:\n case GizmoSubType.sphere:\n case GizmoSubType.cylinder:\n case GizmoSubType.cone:\n case GizmoSubType.torus:\n case GizmoSubType.sprite:\n case GizmoSubType.frustum:\n case GizmoSubType.directionLight:\n case GizmoSubType.pointLight:\n case GizmoSubType.spotLight:\n case GizmoSubType.floorGrid:\n this.createBasicContent(targetItem, gizmoSubType);\n\n break;\n case GizmoSubType.camera:\n case GizmoSubType.light:\n this.createBasicContent(targetItem, gizmoSubType, iconTextures);\n\n break;\n case GizmoSubType.rotation:\n case GizmoSubType.scale:\n case GizmoSubType.translation:\n this.createCombinationContent(targetItem, gizmoSubType);\n\n break;\n case GizmoSubType.viewHelper:\n this.createCombinationContent(targetItem, gizmoSubType, iconTextures);\n\n break;\n case GizmoSubType.boundingBox:\n this.createBoundingBoxContent(targetItem);\n\n break;\n default:\n break;\n }\n composition?.loaderData.gizmoItems.push(this.item);\n }\n\n override onEnable (): void {\n super.onEnable();\n if (!this.item.composition) {\n return;\n }\n\n const sceneRendering = this.item.composition.sceneRendering;\n const renderer = this.engine.renderer;\n\n if (!renderer.rendererFeatures.some(feature => feature instanceof GizmoRendererFeature)) {\n renderer.addRendererFeature(new GizmoRendererFeature());\n }\n\n for (const mesh of this.meshes) {\n if (mesh.name === GeometryType.FloorGrid.toString() || mesh.name === 'Box') {\n sceneRendering.addRenderer(mesh, frontRenderPassName);\n } else if (mesh.name === 'translation' || mesh.name === 'scale' || mesh.name === 'rotation') {\n sceneRendering.addRenderer(mesh, behindRenderPassName);\n } else {\n sceneRendering.addRenderer(mesh, editorRenderPassName);\n }\n }\n }\n\n override onDisable (): void {\n super.onDisable();\n if (!this.item.composition) {\n return;\n }\n\n const sceneRendering = this.item.composition.sceneRendering;\n\n for (const mesh of this.meshes) {\n if (mesh.name === GeometryType.FloorGrid.toString() || mesh.name === 'Box') {\n sceneRendering.removeRenderer(mesh, frontRenderPassName);\n } else if (mesh.name === 'translation' || mesh.name === 'scale' || mesh.name === 'rotation') {\n sceneRendering.removeRenderer(mesh, behindRenderPassName);\n } else {\n sceneRendering.removeRenderer(mesh, editorRenderPassName);\n }\n }\n }\n\n override onUpdate (dt: number): void {\n this.updateRenderData();\n }\n\n override onDestroy (): void {\n const gizmoMesh = this.mesh;\n const composition = this.item.composition;\n\n if (!composition) {\n return;\n }\n\n if (gizmoMesh && !gizmoMesh.isDestroyed) {\n gizmoMesh.dispose();\n\n if (gizmoMesh.name === GeometryType.FloorGrid.toString() || gizmoMesh.name === 'Box') {\n composition.sceneRendering.removeRenderer(gizmoMesh, frontRenderPassName);\n } else {\n composition.sceneRendering.removeRenderer(gizmoMesh, editorRenderPassName);\n }\n }\n if (this.contents) {\n for (const [mesh] of this.contents) {\n if (!mesh.isDestroyed) {\n mesh.dispose();\n if (mesh.name === 'translation' || mesh.name === 'scale' || mesh.name === 'rotation') {\n composition.sceneRendering.removeRenderer(mesh, behindRenderPassName);\n } else {\n composition.sceneRendering.removeRenderer(mesh, editorRenderPassName);\n }\n }\n }\n }\n\n if (this && this.wireframeMeshes.length > 0) {\n this.wireframeMeshes.forEach(mesh => {\n if (!mesh.isDestroyed) {\n destroyWireframeMesh(mesh);\n composition.sceneRendering.removeRenderer(mesh, editorRenderPassName);\n }\n });\n } else {\n const wireframeMesh = this.wireframeMesh;\n\n if (wireframeMesh && !wireframeMesh.isDestroyed) {\n destroyWireframeMesh(wireframeMesh);\n composition.sceneRendering.removeRenderer(wireframeMesh, editorRenderPassName);\n }\n }\n\n const arr: VFXItem[] = composition.loaderData.gizmoItems;\n const index = arr.indexOf(this.item);\n\n if (index > -1) {\n arr.splice(index, 1);\n }\n }\n\n override render (renderer: Renderer): void {\n // The material of the 3D plugin is updated during the render phase. In order to obtain the correct value, it is kept consistent here.\n if (this.subType === GizmoSubType.modelWireframe) { // 模型线框\n if (this.wireframeMesh && this.targetItem) {\n //@ts-expect-error TODO 和 3D 类型解耦\n const pMesh = this.targetItem.getComponent(RendererComponent)?.content;\n const meshes = pMesh.subMeshes;\n const wireframeMeshes = this.wireframeMeshes;\n\n if (meshes?.length > 0) {\n wireframeMeshes[0].worldMatrix.copyFrom(pMesh.matrix);\n updateWireframeMesh(meshes[0].geometry.geometry, meshes[0].material.effectMaterial, wireframeMeshes[0], WireframeGeometryType.triangle);\n }\n }\n }\n }\n\n updateRenderData () {\n const item = this.item;\n const gizmoSubType = this.subType;\n\n if (gizmoSubType === GizmoSubType.particleEmitter) { // 粒子发射器\n if (this.targetItem && this.mesh) {\n this.mat = this.targetItem.transform.getWorldMatrix();\n this.mesh.material.setMatrix('u_model', this.mat);\n }\n if (this.wireframeMesh && this.targetItem) {\n const particle = this.targetItem.getComponent(ParticleSystemRenderer);\n\n if (particle) {\n updateWireframeMesh(particle.particleMesh.mesh.geometry, particle.particleMesh.mesh.material, this.wireframeMesh, WireframeGeometryType.quad);\n this.wireframeMesh.worldMatrix = particle.particleMesh.mesh.worldMatrix;\n }\n }\n } else { // 几何体模型\n if (this.targetItem) {\n if (this.contents) { // 组合几何体\n // const targetTransform = this.targetItem.transform.clone();\n\n const worldPos = new Vector3();\n const worldQuat = new Quaternion();\n const worldScale = new Vector3(1, 1, 1);\n\n // Scale Gizmo 没有世界空间\n if (this.coordinateSpace == CoordinateSpace.Local || gizmoSubType === GizmoSubType.scale) {\n this.targetItem.transform.assignWorldTRS(worldPos, worldQuat);\n } else {\n this.targetItem.transform.assignWorldTRS(worldPos);\n }\n\n const targetTransform = new Transform({\n position: worldPos,\n quat: worldQuat,\n scale: worldScale,\n valid: true,\n });\n\n // 移动\\旋转\\缩放gizmo去除近大远小\n if (gizmoSubType === GizmoSubType.rotation || gizmoSubType === GizmoSubType.scale || gizmoSubType === GizmoSubType.translation) {\n const camera = item.composition!.camera;\n const cameraPos = camera.position || new Vector3();\n const itemPos = targetTransform.position;\n const newPos = moveToPointWidthFixDistance(cameraPos, itemPos);\n\n targetTransform.setPosition(newPos.x, newPos.y, newPos.z);\n }\n\n this.mat = targetTransform.getWorldMatrix();\n const center = targetTransform.position;\n\n for (const [mesh, transform] of this.contents) {\n let worldMat4: Matrix4;\n\n transform.parentTransform = targetTransform;\n const position = new Vector3();\n\n transform.assignWorldTRS(position);\n // 物体和中心点在屏幕空间上投影的距离\n let distanceToCneter = 100;\n let theta = 1;\n\n if (gizmoSubType === GizmoSubType.viewHelper) {\n // 正交投影只需要计算物体在XY平面上的投影与中心点的距离\n if (mesh.name === 'sprite') {\n distanceToCneter = position.toVector2().distance(center.toVector2());\n theta = (this.boundingMap.get('posX') as GizmoItemBoundingSphere).radius;\n }\n // 将物体挂到相机的transform上\n const fov = 30; // 指定fov角度\n const screenWidth = item.composition!.renderer.getWidth();\n const screenHeight = item.composition!.renderer.getHeight();\n const distance = 16; // 指定物体与相机的距离\n const width = 2 * Math.tan(fov * Math.PI / 360) * distance;\n const aspect = screenWidth / screenHeight;\n const height = width / aspect;\n const cameraModelMat4 = item.composition!.camera.getInverseViewMatrix();\n const padding = this.size.padding || 1; // 指定viewHelper与屏幕右上角的边距\n let localMat: Matrix4;\n\n localMat = transform.getWorldMatrix();\n const worldTransform: Transform = new Transform({\n valid: true,\n });\n\n worldTransform.cloneFromMatrix(localMat);\n worldTransform.setPosition((position.x + width / 2) - padding, (position.y + height / 2) - padding, position.z);\n localMat = worldTransform.getWorldMatrix();\n worldMat4 = cameraModelMat4.clone().multiply(localMat);\n // 正交投影到屏幕上\n const proMat5 = computeOrthographicOffCenter(-width / 2, width / 2, -height / 2, height / 2, -distance, distance);\n\n mesh.material.setMatrix('_MatrixP', proMat5);\n } else {\n if (gizmoSubType === GizmoSubType.rotation) {\n const cameraPos = item.composition!.camera.position || [0, 0, 0];\n\n mesh.material.setVector3('u_cameraPos', cameraPos);\n mesh.material.setVector3('u_center', center);\n }\n worldMat4 = transform.getWorldMatrix();\n // TODO 计算物体和中心点在屏幕空间上投影的距离 distanceToCneter\n }\n mesh.material.setMatrix('u_model', worldMat4);\n\n // 使用distanceToCneter处理坐标轴旋转到中心点附近时的遮挡问题\n if (distanceToCneter < theta) {\n if (distanceToCneter < theta * 0.5) {\n mesh.material.setVector2('u_alpha', new Vector2(0, 0));\n } else {\n mesh.material.setVector2('u_alpha', new Vector2((2 / theta) * distanceToCneter - 1, 0));\n }\n }\n }\n }\n if (this.mesh) { // 基础几何体\n const worldPos = new Vector3();\n const worldQuat = new Quaternion();\n const worldSca = new Vector3(1, 1, 1);\n\n this.targetItem.transform.assignWorldTRS(worldPos, worldQuat);\n\n const targetTransform = new Transform({\n position: worldPos,\n quat: worldQuat,\n scale: worldSca,\n valid: true,\n });\n\n if (gizmoSubType === GizmoSubType.light || gizmoSubType === GizmoSubType.camera) {\n const camera = item.composition!.camera;\n const cameraPos = camera.position || new Vector3(0, 0, 0);\n const itemPos = targetTransform.position;\n const newPos = moveToPointWidthFixDistance(cameraPos, itemPos);\n\n targetTransform.setPosition(newPos.x, newPos.y, newPos.z);\n }\n\n this.mat = targetTransform.getWorldMatrix();\n\n this.mesh.material.setMatrix('u_model', targetTransform.getWorldMatrix());\n }\n }\n }\n }\n\n /**\n * 获取默认绘制模式\n * @returns 绘制模式常量\n */\n getDefaultRenderMode (): GeometryDrawMode {\n let result: GeometryDrawMode;\n const gizmoSubType = this.subType;\n\n switch (gizmoSubType) {\n case GizmoSubType.particleEmitter:\n case GizmoSubType.modelWireframe:\n case GizmoSubType.frustum:\n case GizmoSubType.directionLight:\n case GizmoSubType.spotLight:\n case GizmoSubType.pointLight:\n case GizmoSubType.floorGrid:\n result = constants.LINES;\n\n break;\n default:\n result = constants.TRIANGLES;\n\n break;\n }\n\n return result;\n }\n\n /**\n * 获取默认尺寸\n * @returns 几何体尺寸\n */\n getDefaultSize () {\n let result = {};\n const gizmoSubType = this.subType;\n\n switch (gizmoSubType) {\n case GizmoSubType.box:\n result = { width: 1, height: 1, depth: 1 };\n\n break;\n case GizmoSubType.sphere:\n result = { radius: 1 };\n\n break;\n case GizmoSubType.cylinder:\n result = { radius: 1, height: 1 };\n\n break;\n case GizmoSubType.cone:\n result = { radius: 1, height: 1 };\n\n break;\n default:\n result = {};\n\n break;\n }\n\n return result;\n }\n\n createModelContent (item: VFXItem) {\n const modelComponent = item.getComponent(RendererComponent);\n //@ts-expect-error TODO 和 3D 类型解耦\n const psubMesh = modelComponent.content.subMeshes[0];\n const engine = item.composition?.renderer.engine;\n\n assertExist(engine);\n\n if (psubMesh) {\n this.targetItem = item;\n this.wireframeMeshes = [];\n\n const originMesh = Mesh.create(\n engine,\n {\n geometry: psubMesh.geometry.geometry,\n material: psubMesh.material.effectMaterial,\n priority: 3000,\n });\n const mesh = this.wireframeMesh = createModeWireframe(engine, originMesh, this.color);\n\n this.wireframeMeshes.push(mesh);\n this.meshes.push(mesh);\n }\n }\n\n createParticleContent (item: VFXItem) {\n const particleSystem = item.getComponent(ParticleSystem);\n\n if (!particleSystem) {\n return;\n }\n\n const shape = particleSystem.definition.shape;\n const engine = this.item.composition?.renderer.engine;\n\n assertExist(engine);\n\n this.targetItem = item;\n if (shape && shape.type) {\n const mesh = this.mesh = createMeshFromShape(engine, shape, { color: this.color });\n\n this.meshes.push(mesh);\n }\n }\n\n /**\n * 创建 BoundingBox 几何体模型\n * @param item - VFXItem\n */\n createBoundingBoxContent (item: VFXItem) {\n const gizmoItem = this.item;\n const shape = {\n shape: 'Box',\n width: this.size.width,\n height: this.size.height,\n depth: this.size.depth,\n center: this.size.center,\n };\n const engine = gizmoItem.composition?.renderer.engine;\n\n assertExist(engine);\n\n this.targetItem = item;\n if (shape) {\n const mesh = this.mesh = createMeshFromShape(engine, shape, { color: this.color, depthTest: this.depthTest });\n\n this.meshes.push(mesh);\n }\n }\n\n /**\n * 创建基础几何体模型\n * @param item - VFXItem\n * @param subType - GizmoSubType 类型\n */\n createBasicContent (item: VFXItem, subType: GizmoSubType, iconTextures?: Map<string, Texture>) {\n const gizmoItem = this.item;\n const options = {\n size: this.size,\n color: this.color,\n renderMode: this.renderMode,\n depthTest: this.depthTest,\n };\n const engine = gizmoItem.composition?.renderer.engine;\n\n assertExist(engine);\n\n const mesh = this.mesh = createMeshFromSubType(engine, subType, this.boundingMap, iconTextures, options) as Mesh;\n\n this.targetItem = item;\n this.meshes.push(mesh);\n }\n\n /**\n * 创建组合几何体模型\n * @param item - VFXItem\n * @param subType - GizmoSubType 类型\n * @param iconTextures - XYZ 图标纹理(viewHelper 专用)\n */\n createCombinationContent (item: VFXItem, subType: GizmoSubType, iconTextures?: Map<string, Texture>) {\n const gizmoItem = this.item;\n const options = {\n size: this.size,\n renderMode: this.renderMode,\n };\n\n const engine = gizmoItem.composition?.renderer.engine;\n\n assertExist(engine);\n\n this.contents = createMeshFromSubType(engine, subType, this.boundingMap, iconTextures, options) as Map<Mesh, Transform>;\n for (const mesh of this.contents.keys()) {\n this.meshes.push(mesh);\n }\n this.targetItem = item;\n }\n\n override fromData (data: GizmoComponentData): void {\n super.fromData(data);\n if (data.coordinateSpace !== undefined) {\n this.coordinateSpace = data.coordinateSpace;\n }\n const item = this.item;\n\n item.duration = 999;\n const {\n target, subType, renderMode, size, depthTest,\n color = [255, 255, 255],\n } = data.options;\n\n this.target = target;\n this.subType = subType;\n this.renderMode = renderMode || this.getDefaultRenderMode();\n this.size = size || this.getDefaultSize();\n this.depthTest = depthTest;\n\n const [r, g, b] = color;\n\n this.color = [r / 255, g / 255, b / 255];\n if (data) {\n item.transform = new Transform(data.transform);\n }\n }\n\n /**\n * 射线检测算法\n * @returns 包含射线检测算法回调方法的参数\n */\n private getHitTestParams = (): void | HitTestCustomParams => {\n const item = this.item;\n const boundingMap = this.boundingMap;\n\n if (boundingMap.size > 0) {\n const boundingKeys = boundingMap.keys();\n let worldMat4: Matrix4;\n\n worldMat4 = this.transform.getWorldMatrix();\n const targetItem = this.targetItem;\n\n if (targetItem) {\n //const targetTransform = this.targetItem.transform.clone();\n const worldPos = new Vector3();\n const worldQuat = new Quaternion();\n const worldSca = new Vector3(1, 1, 1);\n const gizmoSubType = this.subType;\n\n // Scale Gizmo 没有世界空间\n if (this.coordinateSpace == CoordinateSpace.Local || gizmoSubType === GizmoSubType.scale) {\n this.targetItem.transform.assignWorldTRS(worldPos, worldQuat);\n } else {\n this.targetItem.transform.assignWorldTRS(worldPos);\n }\n\n const targetTransform = new Transform({\n position: worldPos,\n quat: worldQuat,\n scale: worldSca,\n valid: true,\n });\n\n // 移动\\旋转\\缩放gizmo去除近大远小\n if (\n gizmoSubType === GizmoSubType.rotation ||\n gizmoSubType === GizmoSubType.scale ||\n gizmoSubType === GizmoSubType.translation ||\n gizmoSubType === GizmoSubType.camera ||\n gizmoSubType === GizmoSubType.light\n ) {\n const camera = item.composition!.camera;\n const cameraPos = camera.position || [0, 0, 0];\n const itemPos = targetTransform.position;\n const newPos = moveToPointWidthFixDistance(cameraPos, itemPos);\n\n targetTransform.setPosition(newPos.x, newPos.y, newPos.z);\n worldMat4 = targetTransform.getWorldMatrix();\n } else {\n worldMat4 = targetTransform.getWorldMatrix();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = item;\n\n return {\n type: HitTestType.custom,\n clipMasks:this.frameClipMasks,\n /**\n * 自定义射线检测算法\n * @param ray 射线参数\n * @param pointInCanvas 屏幕坐标\n * @returns\n */\n collect (ray: Ray, pointInCanvas: Vector2): Vector3[] | void {\n const hitPositions = [];\n const gizmoComponent = self.getComponent(GizmoComponent);\n\n gizmoComponent.hitBounding = undefined;\n for (const key of boundingKeys) {\n const bounding = boundingMap.get(key);\n const center = new Vector3();\n const worldCenter = new Vector3();\n\n if (bounding?.type === BoundingType.box || bounding?.type === BoundingType.sphere) {\n if (bounding?.center) {\n center.copyFrom(bounding?.center);\n }\n worldMat4.projectPoint(center, worldCenter);\n }\n let position: Vector3 | undefined;\n\n switch (bounding?.type) {\n case BoundingType.box: // 立方体包围盒\n {\n const boxHalfSize = bounding.size.clone().multiply(0.5);\n const boxMax = center.clone().add(boxHalfSize);\n const boxMin = center.clone().subtract(boxHalfSize);\n\n position = ray.intersectBox({ min: boxMin, max: boxMax }, new Vector3());\n }\n\n break;\n case BoundingType.sphere: // 球体包围盒\n\n // viewHelper 使用了正交投影,使用屏幕投影点计算\n if (gizmoComponent.subType === GizmoSubType.viewHelper) {\n // 计算正交投影矩阵\n const viewMat4 = self.composition!.camera.getViewMatrix();\n const fov = 30; // 指定fov角度\n const screenWidth = self.composition!.renderer.getWidth();\n const screenHeight = self.composition!.renderer.getHeight();\n const distance = 16; // 指定物体与相机的距离\n const width = 2 * Math.tan(fov * Math.PI / 360) * distance;\n const aspect = screenWidth / screenHeight;\n const height = width / aspect;\n const proMat4 = computeOrthographicOffCenter(-width / 2, width / 2, -height / 2, height / 2, -distance, distance);\n\n // 将包围盒挂到相机的 transform 上\n const cameraModelMat4 = self.composition!.camera.getInverseViewMatrix();\n const localTransform = new Transform({\n valid: true,\n });\n\n localTransform.cloneFromMatrix(worldMat4);\n const pos = localTransform.position;\n const padding = gizmoComponent.size.padding || 1; // 指定viewHelper与屏幕右上角的边距\n\n localTransform.setPosition((pos.x + width / 2) - padding, (pos.y + height / 2) - padding, pos.z);\n const localMat4 = localTransform.getWorldMatrix();\n const modelMat4 = cameraModelMat4.clone().multiply(localMat4);\n\n modelMat4.projectPoint(center, worldCenter);\n\n // 包围球中心点正交投影到屏幕上\n const vpMat4 = proMat4.clone().multiply(viewMat4);\n const mvpMat4 = vpMat4.clone().multiply(modelMat4);\n const screenCenter = mvpMat4.projectPoint(center, new Vector3());\n // const screenCenterX = screenCenter.x;\n // const screenCenterY = screenCenter.y;\n\n // 包围球上的点正交投影到屏幕上\n const radius = bounding.radius;\n const up = new Vector3(\n localMat4.elements[1],\n localMat4.elements[5],\n localMat4.elements[9],\n ).normalize();\n\n const point = up.clone().multiply(radius);\n\n point.add(center);\n\n const screenPoint = mvpMat4.projectPoint(point, new Vector3());\n // const screenPointX = screenPoint.x;\n // const screenPointY = screenPoint.y;\n\n // 计算正交投影到屏幕上的包围球的半径\n const screenCenter2 = screenCenter.toVector2();\n const screenPoint2 = screenPoint.toVector2();\n const screenRadius = screenCenter2.distance(screenPoint2);\n\n if (pointInCanvas.distance(screenCenter2) < screenRadius * 1.2) {\n position = worldCenter;\n }\n } else {\n position = ray.intersectSphere({ center: worldCenter, radius: bounding.radius }, new Vector3());\n }\n\n break;\n case BoundingType.triangle: {// 三角数组包围盒\n const { triangles, backfaceCulling } = bounding;\n const tmpPositions: Vector3[] = [];\n let tmpPosition;\n\n for (let j = 0; j < triangles.length; j++) {\n const triangle = triangles[j];\n const worldTriangle: TriangleLike = {\n p0: worldMat4.projectPoint(triangle.p0 as Vector3, new Vector3()),\n p1: worldMat4.projectPoint(triangle.p1 as Vector3, new Vector3()),\n p2: worldMat4.projectPoint(triangle.p2 as Vector3, new Vector3()),\n };\n\n tmpPosition = ray.intersectTriangle(worldTriangle, new Vector3(), backfaceCulling);\n if (tmpPosition) {\n tmpPositions.push(tmpPosition);\n }\n }\n // 仅保存距离相机最近的点\n if (tmpPositions.length > 0) {\n let lastDistance: number;\n\n tmpPositions.forEach(item => {\n const distance = ray.origin.distanceSquared(item);\n\n if (!lastDistance || distance < lastDistance) {\n lastDistance = distance;\n position = item;\n }\n });\n }\n\n break;\n }\n case BoundingType.line: {// 线条包围盒,将线条转换到屏幕空间,计算线条与屏幕交互点的距离,小于阈值判定为点中\n const { points, width } = bounding;\n\n position = intersectRayLine(new Vector3(), pointInCanvas, points, width / 2, worldMat4, self.composition!.camera);\n\n break;\n }\n default:\n break;\n }\n if (position) {\n hitPositions.push(position);\n // 缓存距离相机最近的 BoundingKey\n if (gizmoComponent.hitBounding) {\n const distance = ray.origin.distanceSquared(position);\n const lastDistance = ray.origin.distanceSquared(gizmoComponent.hitBounding.position);\n\n if (distance < lastDistance) {\n gizmoComponent.hitBounding.key = key;\n gizmoComponent.hitBounding.position = position;\n }\n } else {\n gizmoComponent.hitBounding = {\n key,\n position,\n };\n }\n }\n }\n if (hitPositions.length === 0) {\n gizmoComponent.hitBounding = undefined;\n }\n\n return hitPositions;\n },\n behavior: spec.InteractBehavior.NOTIFY,\n };\n }\n };\n\n}\n\nexport enum CoordinateSpace {\n Local,\n World\n}\n\nclass GizmoRendererFeature extends RendererFeature {\n private passes: RenderPass[] = [];\n\n override create (renderer: Renderer): void {\n this.passes = [\n new DrawGizmoFrontPass(renderer),\n new DrawGizmoEditorPass(renderer),\n new DrawGizmoBehindPass(renderer),\n ];\n }\n\n override addRenderPasses (renderer: Renderer, data: RenderingData): void {\n for (const pass of this.passes) {\n if (data.renderList.groups.has(pass.name)) {\n renderer.enqueuePass(pass);\n }\n }\n }\n\n override dispose (): void {\n for (const pass of this.passes) {\n pass.dispose();\n }\n this.passes.length = 0;\n }\n}\n\nclass DrawGizmoBehindPass extends RenderPass {\n constructor (renderer: Renderer) {\n super(renderer);\n this.renderPassEvent = RenderPassEvent.AfterRendering;\n this.name = behindRenderPassName;\n }\n\n override execute (renderer: Renderer, data: RenderingData): void {\n renderer.clear({ depthAction: TextureLoadAction.clear });\n renderer.renderMeshes(data.renderList.groups.get(this.name) ?? []);\n }\n}\n\nclass DrawGizmoFrontPass extends RenderPass {\n constructor (renderer: Renderer) {\n super(renderer);\n this.renderPassEvent = RenderPassEvent.BeforeRendering;\n this.name = frontRenderPassName;\n }\n\n override execute (renderer: Renderer, data: RenderingData): void {\n renderer.renderMeshes(data.renderList.groups.get(this.name) ?? []);\n }\n}\n\nclass DrawGizmoEditorPass extends RenderPass {\n constructor (renderer: Renderer) {\n super(renderer);\n this.renderPassEvent = RenderPassEvent.AfterRenderingObjects;\n this.name = editorRenderPassName;\n }\n\n override execute (renderer: Renderer, data: RenderingData): void {\n renderer.renderMeshes(data.renderList.groups.get(this.name) ?? []);\n }\n}\n","export var IntervalType;\n(function (IntervalType) {\n IntervalType[IntervalType[\"OPEN\"] = 0] = \"OPEN\";\n IntervalType[IntervalType[\"CLOSE\"] = 1] = \"CLOSE\";\n IntervalType[IntervalType[\"LEFT_CLOSE\"] = 2] = \"LEFT_CLOSE\";\n IntervalType[IntervalType[\"RIGHT_CLOSE\"] = 3] = \"RIGHT_CLOSE\";\n})(IntervalType || (IntervalType = {}));\nexport function isRangeIn(num, min, max, intervalType = IntervalType.OPEN) {\n switch (intervalType) {\n case IntervalType.OPEN:\n return num > min && num < max;\n case IntervalType.CLOSE:\n return num >= min && num <= max;\n case IntervalType.LEFT_CLOSE:\n return num >= min && num < max;\n case IntervalType.RIGHT_CLOSE:\n return num > min && num <= max;\n }\n}\n","/** Gizmo 提交给宿主的光标样式。 */\nexport type GestureCursorResult = {\n /** 光标类型。 */\n type: GestureCursorType,\n /** 光标旋转角度。 */\n angle: number,\n /** 圆形光标半径。 */\n radius?: number,\n};\n\n/** 内置光标类型。 */\nexport enum GestureCursorType {\n /** 默认光标。 */\n NORMAL = 'normal',\n /** 旋转光标。 */\n ROTATION = 'rotation',\n /** 缩放光标。 */\n SCALE = 'scale',\n /** 文本旋转光标。 */\n TEXT_ROTATION = 'text-rotation',\n /** 圆形画笔光标。 */\n CIRCLE = 'circle',\n /** 可抓取手形光标。 */\n HAND = 'hand',\n /** 抓取中的手形光标。 */\n ACTIVE_HAND = 'active-hand',\n /** 指针光标。 */\n POINTER = 'pointer',\n /** 文本编辑光标。 */\n TEXT = 'text',\n /** 文本创建光标。 */\n TEXT_CREATE = 'text-create',\n /** 画板创建光标。 */\n FRAME_CREATE = 'frame-create',\n /** 框选十字光标。 */\n BOX_SELECT = 'box-select',\n}\n","/** 内置 Gizmo 的稳定类型标识。 */\nexport enum GizmoType {\n /** 空类型。 */\n NULL = 'null',\n /** 视口平移工具。 */\n HAND = 'hand',\n /** 选区切换工具。 */\n CHANGE_SELECTION = 'change-selection',\n /** 选区移动工具。 */\n MOVE_SELECTION = 'move-selection',\n /** 框选工具。 */\n BOX_SELECTION = 'box-selection',\n /** 点击与拖拽仲裁工具。 */\n CLICK_DRAG_MULTIPLEX = 'click-drag-multiplex',\n /** 角点旋转工具。 */\n CORNER_ROTATION = 'corner-rotation',\n /** 选区缩放工具。 */\n RESIZE_SELECTION = 'resize-selection',\n /** 视口覆盖层。 */\n VIEWPORT_OVERLAY = 'viewport-overlay',\n /** 图片裁切工具。 */\n IMAGE_CUT = 'image-cut',\n /** 文本编辑工具。 */\n TEXT = 'text',\n /** 蒙版编辑工具。 */\n MASK = 'mask',\n /** 加载状态工具。 */\n LOADING = 'loading',\n /** 图片扩边工具。 */\n IMAGE_EXPAND = 'image-expand',\n /** 精准文字编辑工具。 */\n SPRITE_TEXT_EDIT = 'sprite-text-edit',\n /** 媒体图标工具。 */\n ICON = 'icon',\n /** 元素创建工具。 */\n ITEM_CREATE = 'item-create',\n}\n","import type { Vector2, Vector3 } from '../../math';\n\n/** 选区变换的语义类型;由移动、缩放与角旋转行为共同用于命令事务。 */\nexport enum TransformType {\n /** 无变换。 */\n NULL = 'null',\n /** 位移。 */\n TRANSLATION = 'translation',\n /** 旋转。 */\n ROTATION = 'rotation',\n /** 双轴缩放。 */\n SCALE = 'scale',\n /** 文本宽度缩放。 */\n WIDTH_SCALE = 'width-scale',\n}\n\n/** 选区缩放会话数据。 */\nexport type ScaleParam = {\n /** 变换中心。 */\n center: Vector3,\n /** 当前手柄位置。 */\n corner: Vector3,\n /** 指针相对位移。 */\n shift: Vector3,\n /** 上一帧缩放量。 */\n lastScalar: Vector3,\n /** 距中心最远的角点。 */\n farthestCorner: Vector2,\n};\n","import type { VFXItem } from '@galacean/effects';\nimport { MouseButton, MouseButtonMask, spec, TextComponent, Texture, type InputEventKey, type InputEventMouseButton, type InputEventMouseMotion } from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport type { Plane } from '@galacean/effects-math/es/extension/index';\nimport { Box2, Circle, Line2, roundNumber } from '@galacean/effects-math/es/extension/index';\nimport type { Matrix3 } from '../../math';\nimport { Euler, EulerOrder, Vector2, Vector3, Matrix4, isEqual, RAD2DEG, Quaternion, getBoxCorners, getBoxTransform, getBoxTransformFromBox, getTransformedBoxCorners, getVector2Angle, transformBoxPoint, transformedBoxContainsPoint } from '../../math';\nimport { Gizmo } from '../../gizmo';\nimport { GizmoViewportUtils } from '../../viewport/viewport-utils';\nimport type { GizmoOwner } from '../../gizmo-owner';\nimport { GizmoType } from '../../gizmo-type';\nimport { GestureCursorType, type GestureCursorResult } from '../../cursor';\nimport {\n calculateAnchoredResize,\n type AnchoredResizeGeometry,\n type AnchoredResizeResult,\n} from './anchored-resize';\nimport type { ResizeSelectionBehavior, ResizeSelectionConfig } from '../../configs/types';\nimport { resizeSelectionConfig } from '../../configs/builtin-configs';\nimport type { ConfigChange } from '../../configs/config-definition';\nimport {\n createInteractionPlane,\n viewPositionToWorld,\n} from '../../viewport';\nimport { resizeFrameItem } from '../../frame/frame-resize';\nimport {\n decomposeItemTransform,\n getItemViewAnchor,\n getItemViewBox,\n getItemViewTransform,\n getItemWorldSize,\n isEffectsPlayerItem,\n isFramePlayerItem,\n isGeneratorPlayerItem,\n isGroupPlayerItem,\n isVideoGeneratorPlayerItem,\n} from '../../items';\nimport {\n INFO_TEXT_FONT_SIZE,\n INFO_TEXT_FONT_FAMILY,\n toColor,\n measureControlTextCellHeight,\n measureTextWidth,\n truncateText,\n drawCorners,\n drawWithBoxTransform,\n fillRotatedRect,\n getRotatedBoxCorners,\n} from '../../drawing';\nimport { TransformType } from './transform-types';\n\n/** 单选信息标签的元素图标类型。 */\nexport enum ResizeSelectionIconType {\n /** 图片。 */\n IMAGE = 'image',\n /** 组合。 */\n GROUP = 'group',\n /** 文本。 */\n TEXT = 'text',\n /** 视频。 */\n VIDEO = 'video',\n /** 动效。 */\n EFFECTS = 'effects',\n /** 画板。 */\n FRAME = 'frame',\n /** 不显示图标。 */\n NULL = 'null',\n}\n\n/** 文本缩放开始时冻结的排版属性。 */\ntype TextResizeSnapshot = {\n /** 文本组件。 */\n component: TextComponent,\n /** 文本缩放模式。 */\n mode: 'font' | 'width',\n /** 初始字号。 */\n fontSize: number,\n /** 初始字体宽度偏移。 */\n fontOffset: number,\n /** 初始行高。 */\n lineHeight: number,\n /** 初始排版宽度。 */\n width: number,\n /** 初始排版高度。 */\n height: number,\n};\n\n/** 按下时冻结、用于计算绝对缩放结果的会话。 */\ntype AnchoredResizeSession = {\n /** 被缩放元素。 */\n item: VFXItem,\n /** 手柄类型。 */\n handleKind: 'edge' | 'corner',\n /** 世界空间缩放几何。 */\n geometry: AnchoredResizeGeometry,\n /** 初始手柄视口位置。 */\n initialHandleView: Vector2,\n /** 固定点视口位置。 */\n fixedPointView: Vector2,\n /** 指针到真实手柄的初始偏移。 */\n pointerToHandleView: Vector2,\n /** 初始局部位置。 */\n initialPosition: Vector3,\n /** 初始局部缩放。 */\n initialScale: Vector3,\n /** 父级世界坐标到局部坐标的旋转矩阵。 */\n parentWorldToLocal: Matrix4,\n /** 画板初始世界尺寸。 */\n initialWorldSize?: Vector2,\n /** 画板初始局部尺寸。 */\n initialLocalSize?: Vector2,\n /** 文本排版快照。 */\n text?: TextResizeSnapshot,\n /** 画板已应用的累计位移。 */\n frameAppliedTranslation: Vector3,\n /** 本次元素采用整体缩放或排版尺寸调整。 */\n resizeBehavior?: ResizeSelectionBehavior,\n /** 上一帧由 Gizmo 写入的位置,用于识别自动布局产生的外部位移。 */\n lastAppliedPosition?: Vector3,\n /** 拖拽期间由外部布局累计写入的位置修正。 */\n externalTranslation?: Vector3,\n};\n\n/** 缩放角点的桌面端命中区域边长;视觉手柄仍由 scaleCircleSize 控制。 */\nexport const SCALE_CORNER_HIT_SIZE = 14;\n\n/** 单选信息标签中的类型图标尺寸。 */\nconst INFO_ICON_SIZE = 15;\n\n/** 信息文字的字形视觉位置高于字号框,单独下移以对齐图标。 */\nconst INFO_TEXT_BOTTOM = 1;\n\n/** 图标相对选框顶边的底部偏移。 */\nconst INFO_ICON_BOTTOM = 5.5;\n\n/** 将公开的缩放行为转换为几何计算使用的可变轴。 */\nfunction getResizeAxis (behavior: ResizeSelectionBehavior): 'both' | 'x' | 'y' {\n return behavior === 'resize-x' ? 'x' : behavior === 'resize-y' ? 'y' : 'both';\n}\n\n/** 缩放选区 Gizmo 的交互配置。 */\nexport type ResizeSelectionGizmoOptions = {\n /** 是否允许缩放;关闭时仍绘制选区线框。 */\n interactive?: boolean,\n};\n\n/** 绘制选区线框,并通过边与角点手柄缩放选中元素。 */\nexport class ResizeSelectionGizmo extends Gizmo {\n readonly type: GizmoType = GizmoType.RESIZE_SELECTION;\n\n /** 光标结果。 */\n cursorResult: GestureCursorResult = {\n type: GestureCursorType.NORMAL,\n angle: 0,\n };\n\n /** 当前光标视图坐标,用于绘制指针与变换原点,每 mousemove 更新。 */\n cursorPoint: Vector2 = new Vector2();\n\n /** ResizeSelection 手柄上一帧的 Control 本地坐标,用于缩放位移增量计算。 */\n lastPoint: Vector2 = new Vector2();\n\n /** 变换框线框数据。 */\n wireframe: ResizeSelectionWireframe;\n\n /** 交互类型。 */\n activeType: TransformType = TransformType.NULL;\n\n /** 上一帧鼠标射线碰撞位置。 */\n lastWorldPosition: Vector3 = new Vector3();\n\n /** 是否为锁定比例缩放。 */\n _isLockScale = true;\n\n /** 当前交互平面,initInteractionPlane 写入。 */\n interactionPlane: Plane;\n private configOff?: () => void;\n\n /** 边与角点共用一次绝对缩放快照。 */\n private resizeSession: AnchoredResizeSession | undefined;\n\n /** ResizeSelection 自身的缩放手柄是否持有输入;移动与角旋转由独立行为持有。 */\n private handlesActive = false;\n\n /** 是否忽略所有交互。 */\n private _ignoreInteraction = false;\n\n /** 当前单选元素的图标类型。 */\n private iconType: ResizeSelectionIconType;\n\n /** 类型图标纹理缓存(懒加载,URL 变化时刷新)。 */\n private iconTextures = new Map<ResizeSelectionIconType, Texture>();\n\n /** 类型图标纹理加载中的 Promise,避免重复发起加载。 */\n private iconTexturePromises = new Map<ResizeSelectionIconType, Promise<Texture>>();\n\n /** 缩放开关。 */\n private scaleEnabled = true;\n\n /** 是否允许当前 Gizmo 接收缩放输入。 */\n private readonly interactionEnabled: boolean;\n\n /**\n * 创建选区缩放 Gizmo 并监听配置变化。\n * @param owner Gizmo 宿主。\n * @param options 缩放交互配置。\n */\n constructor (owner: GizmoOwner, options: ResizeSelectionGizmoOptions = {}) {\n super(owner);\n this.interactionEnabled = options.interactive !== false;\n this.configOff = owner.getConfigManager().onChange(\n resizeSelectionConfig,\n change => {\n this.onConfigChange(change);\n },\n );\n\n this.wireframe = {\n edges: [],\n transform: undefined,\n anchor: new Vector2(),\n scaleCorners: [],\n widthScaleAreas: [],\n interactive: true,\n cornerEnable: true,\n box: new Box2(),\n totalBox: new Box2(),\n childrenTransforms: [],\n activeType: TransformType.NULL,\n interactiveDirection: new Vector2(),\n scaleCorner: new Vector2(),\n scaleEdgeCorners: [],\n };\n }\n\n /** 选中的元素列表(直读 selection)。 */\n get selectedItems (): VFXItem[] {\n return this._owner.getSelection().getSelectedPlayerItems();\n }\n\n /** 当前选区缩放配置。 */\n get config (): Readonly<ResizeSelectionConfig> {\n return this._owner.getConfigManager().get(resizeSelectionConfig);\n }\n\n /** 取是否锁定比例缩放。 */\n get isLockScale () {\n return this._isLockScale;\n }\n\n /**\n * 设置锁定比例缩放开关。\n * @param state 是否锁定比例。\n */\n set isLockScale (state: boolean) {\n if (state === this.isLockScale) {\n return;\n }\n\n this._isLockScale = state;\n }\n\n /** 取当前视口矩阵的水平缩放系数。 */\n get viewScale (): number {\n const viewportMatrix = this._owner.getEngine().sceneServer.compositions[0].camera.getViewportMatrix();\n const scale = new Vector3();\n\n viewportMatrix.decompose(new Vector3(), new Quaternion(), scale);\n\n return viewportMatrix.elements[0];\n }\n\n /** 取是否忽略所有交互。 */\n get ignoreInteraction () {\n return this._ignoreInteraction;\n }\n\n /**\n * 设置是否忽略交互,并同步角点可用状态。\n * @param state 是否忽略交互。\n */\n set ignoreInteraction (state: boolean) {\n if (state === this._ignoreInteraction) {\n return;\n }\n\n this._ignoreInteraction = state;\n this.wireframe.cornerEnable = state;\n }\n\n /**\n * 忽略键盘按下,修饰键状态由鼠标事件提供。\n * @param _keyCode 键盘按下事件。\n */\n override onKeyDown (_keyCode: InputEventKey): void {\n // 修饰键状态由鼠标事件提供。\n }\n\n /**\n * 忽略键盘抬起,修饰键状态由鼠标事件提供。\n * @param _keyCode 键盘抬起事件。\n */\n override onKeyUp (_keyCode: InputEventKey): void {\n // 修饰键状态由鼠标事件提供。\n }\n\n /**\n * 更新缩放手柄拖拽或悬停命中状态。\n * @param event 鼠标移动事件。\n */\n override onMouseMove (event: InputEventMouseMotion): void {\n if (!this.isApplicableSelection()) {\n if (!this.handlesActive) {\n this.clearHandleHover();\n }\n\n return;\n }\n if (this.handlesActive) {\n const handled = this.updateHandleDrag(event);\n\n this._owner.setCursor(this.cursorResult);\n if (handled) {\n event.accept();\n }\n\n return;\n }\n const hover = this._owner.getMousePosition();\n\n this.refreshTransformType(hover);\n this.refreshCursorResult(this.activeType, getVector2Angle(this.wireframe.interactiveDirection));\n this._owner.setCursor(this.cursorResult);\n if (event.buttonMask === MouseButtonMask.None\n && (this.activeType === TransformType.SCALE\n || this.activeType === TransformType.WIDTH_SCALE)) {\n event.accept();\n }\n }\n\n /**\n * 继续当前缩放手柄拖拽。\n * @param event 鼠标拖拽事件。\n */\n override onMouseDrag (event: InputEventMouseMotion): void {\n if (!this.isApplicableSelection() || !this.handlesActive) {\n return;\n }\n const handled = this.updateHandleDrag(event);\n\n this._owner.setCursor(this.cursorResult);\n if (handled) {\n event.accept();\n }\n }\n\n /** 鼠标离开交互层时清除非拖拽状态下的手柄命中与光标。 */\n override onMouseLeave (): void {\n if (!this.isApplicableSelection()) {\n if (!this.handlesActive) {\n this.clearHandleHover();\n }\n\n return;\n }\n if (this.handlesActive) {\n this._owner.setCursor(this.cursorResult);\n\n return;\n }\n this.clearHandleHover();\n }\n\n /**\n * 命中缩放手柄时开始变换会话。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n // 步骤 1:校验选区、按键与点击次数。\n if (!this.isApplicableSelection()) {\n return;\n }\n if (event.buttonIndex !== MouseButton.Left) {\n return;\n }\n this.cursorPoint = new Vector2(event.position.x, event.position.y);\n\n if (event.doubleClick) {\n return;\n }\n\n // 步骤 2:刷新线框并解析按下位置的手柄类型。\n this.refreshWireframeBySelectedItems();\n this.refreshTransformType(this.cursorPoint);\n this.refreshCursorResult(this.activeType, getVector2Angle(this.wireframe.interactiveDirection));\n this._owner.setCursor(this.cursorResult);\n\n if (this.activeType === TransformType.NULL || this.activeType === TransformType.TRANSLATION) {\n return;\n }\n\n // 步骤 3:准备当前选区的吸附目标。\n this._owner.getSnapManager().reset();\n if (\n this._owner.getSnapManager().enabled\n && (this.activeType === TransformType.SCALE || this.activeType === TransformType.WIDTH_SCALE)\n ) {\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n const composition = this._owner.getEngine().sceneServer.compositions[0];\n\n this._owner.getSnapManager().cacheSnapTargetsForSelection(\n composition?.items ?? [],\n this.selectedItems,\n containerSize,\n );\n }\n\n // 步骤 4:冻结缩放快照并通知宿主交互开始。\n this.lastPoint = new Vector2(event.position.x, event.position.y);\n this.handlesActive = true;\n this.beginTransformOperation();\n this._owner.emit('actionstart', {\n source: this,\n transformType: this.wireframe.activeType,\n });\n event.accept();\n }\n\n /**\n * 结束当前缩放手柄拖拽。\n * @param event 鼠标抬起事件。\n */\n override onMouseUp (event: InputEventMouseButton): void {\n if (this.handlesActive && this.finishHandleDrag(event)) {\n event.accept();\n }\n }\n\n /**\n * 刷新指针结果。\n * @param activeType 交互类型\n * @param angle 指针角度\n */\n refreshCursorResult (activeType: TransformType, angle = 0) {\n switch (activeType) {\n case TransformType.SCALE: {\n this.cursorResult = {\n type: GestureCursorType.SCALE,\n angle: (angle + Math.PI / 4) * RAD2DEG,\n };\n\n break;\n }\n case TransformType.WIDTH_SCALE: {\n this.cursorResult = {\n type: GestureCursorType.SCALE,\n angle: (angle + Math.PI / 4) * RAD2DEG,\n };\n\n break;\n }\n case TransformType.TRANSLATION:\n case TransformType.ROTATION:\n case TransformType.NULL: {\n this.cursorResult = {\n type: GestureCursorType.NORMAL,\n angle: 0,\n };\n\n break;\n }\n }\n }\n\n /** 在每帧更新时刷新选区线框及失效的光标状态。 */\n override onUpdate () {\n const lastActiveType = this.wireframe.activeType;\n\n this.refreshWireframeBySelectedItems();\n if (lastActiveType !== this.wireframe.activeType) {\n this.refreshCursorResult(this.wireframe.activeType);\n }\n }\n\n /**\n * 根据鼠标点位置判定当前交互类型(缩放/平移),\n * 并写入 activeType 与线框的交互方向、缩放角点;未命中则置 NULL。\n * @param point 视口坐标\n */\n refreshTransformType (point: Vector2) {\n // 步骤 1:重置当前命中状态。\n this.activeType = TransformType.NULL;\n this.wireframe.interactiveDirection = new Vector2();\n this.wireframe.scaleCorner = undefined;\n this.wireframe.scaleEdgeCorners = undefined;\n\n // 步骤 2:解析指针对应的变换类型。\n const type = this.computeTransformType(point);\n\n if (type === TransformType.NULL) {\n return;\n }\n\n this.activeType = type;\n this.wireframe.activeType = type;\n\n // 步骤 3:记录宽度手柄或缩放角点的交互方向。\n if (type === TransformType.WIDTH_SCALE) {\n const widthScaleArea = this.wireframe.widthScaleAreas.find(area => transformedBoxContainsPoint(area, point));\n\n if (widthScaleArea) {\n const center = transformBoxPoint(widthScaleArea, new Vector2(0.5, 0.5));\n\n this.wireframe.scaleCorner = center;\n this.wireframe.interactiveDirection.copyFrom(center).subtract(this.wireframe.box.getCenter());\n }\n } else if (type === TransformType.SCALE) {\n const scaleCorner = this.findScaleCorner(point);\n\n if (scaleCorner) {\n this.wireframe.scaleCorner = scaleCorner.center.clone();\n this.wireframe.interactiveDirection.copyFrom(scaleCorner.center).subtract(this.wireframe.box.getCenter());\n }\n if (!this.wireframe.scaleCorner) {\n const edge = this.findScaleEdge(point, this.isSingleTextSelection());\n\n if (edge) {\n const edgeCenter = edge.getCenter();\n\n this.wireframe.scaleCorner = edgeCenter;\n this.wireframe.scaleEdgeCorners = [edge.start.clone(), edge.end.clone()];\n this.wireframe.interactiveDirection.copyFrom(edgeCenter).subtract(this.wireframe.box.getCenter());\n }\n }\n }\n }\n\n /**\n * 根据选中元素刷新变换线框:计算包围盒、子元素盒与缩放角点;\n * 单选时根据元素类型决定图标类型;成组不生成缩放角点。\n */\n refreshWireframeBySelectedItems () {\n // 步骤 1:解析选区类型并重置线框数据。\n const { selectedItems, scaleEnabled } = this;\n const isSingleText = selectedItems.length === 1 && selectedItems[0].type === spec.ItemType.text;\n const transformEnabled = this.interactionEnabled && !this.hasLoadingSelection(selectedItems);\n\n this.iconType = selectedItems.length === 1\n ? this.getIconType(selectedItems[0])\n : ResizeSelectionIconType.NULL;\n\n const box = new Box2();\n let transform: Matrix3 | undefined;\n\n this.wireframe.edges = [];\n this.wireframe.transform = undefined;\n this.wireframe.scaleCorners = [];\n this.wireframe.widthScaleAreas = [];\n this.wireframe.childrenTransforms = [];\n\n this.wireframe.cornerEnable = scaleEnabled && transformEnabled;\n this.wireframe.interactive = transformEnabled;\n if (!transformEnabled) {\n this.activeType = TransformType.NULL;\n this.wireframe.activeType = TransformType.NULL;\n }\n\n // 步骤 2:计算单选或多选包围盒、锚点和子元素轮廓。\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n\n if (selectedItems.length > 1) {\n selectedItems.forEach(item => {\n if (item.isVisible) {\n const itemBox = getItemViewBox(item, containerSize);\n const itemTransform = getItemViewTransform(item, containerSize);\n\n if (!itemBox.isEmpty()) {\n box.union(itemBox);\n }\n if (itemTransform) {\n this.wireframe.childrenTransforms.push(itemTransform);\n }\n }\n });\n\n transform = getBoxTransformFromBox(box);\n this.wireframe.anchor = box.getCenter();\n this.wireframe.interactive = transformEnabled;\n } else if (selectedItems.length === 1) {\n const item = selectedItems[0];\n\n if (item.isVisible) {\n transform = getItemViewTransform(item, containerSize);\n box.copyFrom(getItemViewBox(item, containerSize));\n\n this.wireframe.anchor = isSingleText\n ? box.getCenter()\n : getItemViewAnchor(item, containerSize) ?? box.getCenter();\n }\n }\n\n const isBoxEmpty = box.isEmpty();\n const boxExpandScalar = isBoxEmpty || isSingleText ? 0 : 1;\n const totalBoxExpandScalar = isBoxEmpty ? 0 : 16;\n\n this.wireframe.activeType = !selectedItems.length ? TransformType.NULL : this.wireframe.activeType;\n\n this.wireframe.box.copyFrom(box).expandByScalar(boxExpandScalar);\n this.wireframe.totalBox.copyFrom(box).expandByScalar(totalBoxExpandScalar);\n this.wireframe.transform = transform;\n const points = transform ? getTransformedBoxCorners(transform) : undefined;\n\n // 步骤 3:根据最终包围盒创建四条边。\n points?.forEach((point, i) => {\n this.wireframe.edges.push(new Line2(point.clone(), points[(i + 1) % 4].clone()));\n });\n\n // 步骤 4:为单选文本创建宽度命中带,并为单选元素创建角点手柄。\n if (selectedItems.length === 1 && transformEnabled) {\n const { scaleCircleSize } = this.config;\n\n if (isSingleText) {\n const boxCorners = points;\n\n if (!boxCorners) {\n return;\n }\n // 左右命中带沿竖边展开,长度应取文本框高度,不能取宽度。\n const edgeLen = boxCorners[1].distance(boxCorners[2]);\n\n if (edgeLen > SCALE_CORNER_HIT_SIZE) {\n const { xAxis, yAxis } = this.boxLocalAxes();\n const halfLen = edgeLen / 2 - SCALE_CORNER_HIT_SIZE / 2;\n /**\n * 创建文本宽度边的命中区域。\n * @param mid 边中点。\n * @returns 旋转后的命中包围盒。\n */\n const buildEdgeHit = (mid: Vector2): Matrix3 | undefined => (\n getBoxTransform(getRotatedBoxCorners(mid, xAxis, yAxis, 4, halfLen))\n );\n const areas = [\n buildEdgeHit(new Line2(boxCorners[1], boxCorners[2]).at(0.5)),\n buildEdgeHit(new Line2(boxCorners[3], boxCorners[0]).at(0.5)),\n ];\n\n this.wireframe.widthScaleAreas = areas.filter((area): area is Matrix3 => !!area);\n }\n }\n\n points?.forEach(point => {\n this.wireframe.scaleCorners.push(new Circle(point, scaleCircleSize));\n });\n }\n }\n\n /**\n * 初始化当前变换的交互平面与缩放会话。\n * @param viewportPoint 指针视口坐标。\n */\n initInteractionPlane (viewportPoint: Vector2) {\n // 步骤 1:读取选中元素并按变换类型分流。\n const { selectedItems } = this;\n\n switch (this.wireframe.activeType) {\n case TransformType.SCALE: {\n // 步骤 2:为边或角点缩放冻结固定点与初始手柄。\n const selectedItem = selectedItems[0];\n\n if (!selectedItem) {\n this.resizeSession = undefined;\n\n break;\n }\n const { scaleCorner, scaleEdgeCorners } = this.wireframe;\n const itemTransform = decomposeItemTransform(selectedItem);\n const anchor = new Vector3().copyFrom(selectedItem.transform.anchor).applyMatrix(itemTransform.matrix);\n\n this.interactionPlane = createInteractionPlane(itemTransform.position, itemTransform.rotation);\n if (scaleEdgeCorners?.length === 2) {\n const initialHandleView = new Line2(scaleEdgeCorners[0], scaleEdgeCorners[1]).getCenter();\n const fixedPointView = this.oppositeScaleEdgeCenter(scaleEdgeCorners);\n\n this.resizeSession = fixedPointView\n ? this.createAnchoredResizeSession(\n selectedItem,\n itemTransform.matrix,\n anchor,\n viewportPoint,\n initialHandleView,\n fixedPointView,\n 'edge',\n )\n : undefined;\n } else if (scaleCorner) {\n const fixedPointView = this.oppositeScaleCorner(scaleCorner);\n\n this.resizeSession = fixedPointView\n ? this.createAnchoredResizeSession(\n selectedItem,\n itemTransform.matrix,\n anchor,\n viewportPoint,\n scaleCorner,\n fixedPointView,\n 'corner',\n )\n : undefined;\n } else {\n this.resizeSession = undefined;\n }\n\n break;\n }\n case TransformType.TRANSLATION: {\n // 步骤 3:为平移创建世界 XY 平面。\n this.interactionPlane = createInteractionPlane(new Vector3(), new Euler(0, 0, 0, EulerOrder.XYZ));\n\n break;\n }\n case TransformType.WIDTH_SCALE: {\n // 步骤 4:为文本宽度缩放冻结左右边几何。\n const selectedItem = selectedItems[0];\n const itemTransform = decomposeItemTransform(selectedItem);\n const anchor = new Vector3().copyFrom(selectedItem.transform.anchor).applyMatrix(itemTransform.matrix);\n const edge = this.draggedWidthEdge(this.wireframe.box.getCenter(), this.wireframe.interactiveDirection);\n\n this.interactionPlane = createInteractionPlane(itemTransform.position, itemTransform.rotation);\n const fixedPointView = edge\n ? this.oppositeScaleEdgeCenter([edge.start, edge.end])\n : undefined;\n\n this.resizeSession = edge && fixedPointView\n ? this.createAnchoredResizeSession(\n selectedItem,\n itemTransform.matrix,\n anchor,\n viewportPoint,\n edge.getCenter(),\n fixedPointView,\n 'edge',\n 'width',\n )\n : undefined;\n\n break;\n }\n }\n }\n\n /**\n * 绘制选区线框、缩放手柄与单选信息标签。\n * @param control 绘制控制器。\n */\n override draw (control: Control) {\n // 步骤 1:校验线框与当前选区变换状态。\n if (this.wireframe.box.isEmpty()) {\n return;\n }\n\n if (this._owner.getSelectionTransformKind() === 'move') {\n return;\n }\n\n // 步骤 2:读取绘制配置并绘制主线框与子元素轮廓。\n const {\n wireframeAlpha,\n wireframeColor,\n wireframeWidth,\n cornerFillColor,\n cornerLineWidth,\n cornerLineColor,\n cornerLineAlpha,\n infoShowEnabled,\n sizeTextColor,\n nameTextColor,\n } = this.config;\n\n const wireColor = toColor(wireframeColor, wireframeAlpha);\n\n this.wireframe.edges.forEach(edge => {\n control.drawLine(edge.start.x, edge.start.y, edge.end.x, edge.end.y, wireColor, wireframeWidth);\n });\n\n this.wireframe.childrenTransforms.forEach(childTransform => {\n drawCorners(control, getTransformedBoxCorners(childTransform), wireColor, wireframeWidth);\n });\n\n // 步骤 3:沿选框局部轴绘制方形缩放手柄。\n if (this.wireframe.cornerEnable) {\n const fillColor = toColor(cornerFillColor, 1);\n const strokeColor = toColor(cornerLineColor, cornerLineAlpha);\n const { xAxis, yAxis } = this.boxLocalAxes();\n\n this.wireframe.scaleCorners.forEach(corner => {\n const half = corner.radius;\n\n fillRotatedRect(control, corner.center, xAxis, yAxis, half * 2, half * 2, fillColor);\n drawCorners(control, getRotatedBoxCorners(corner.center, xAxis, yAxis, half, half), strokeColor, cornerLineWidth);\n });\n }\n\n // 步骤 4:为非文本单选元素绘制信息标签。\n const isSingleTextSelection = this.selectedItems.length === 1\n && this.selectedItems[0].type === spec.ItemType.text;\n\n if (this.selectedItems.length === 1 && infoShowEnabled && !isSingleTextSelection) {\n this.renderItemInfo(control, sizeTextColor, nameTextColor);\n }\n }\n\n /** 释放配置监听器。 */\n override dispose (): void {\n this.configOff?.();\n this.configOff = undefined;\n super.dispose();\n }\n\n /** @returns 当前是否存在可操作的选中元素。 */\n private isApplicableSelection (): boolean {\n const selectedItems = this.selectedItems;\n\n return selectedItems.length >= 1 && !this.hasLoadingSelection(selectedItems);\n }\n\n /** @returns 当前选区是否包含处于 loading 状态的元素。 */\n private hasLoadingSelection (items = this.selectedItems): boolean {\n const loadingManager = this._owner.getLoadingManager();\n\n return items.some(item => loadingManager.get(item.getInstanceId()) !== undefined);\n }\n\n /** 清除缩放手柄悬停状态并恢复默认光标。 */\n private clearHandleHover (): void {\n this.activeType = TransformType.NULL;\n this.wireframe.activeType = TransformType.NULL;\n this.wireframe.interactiveDirection = new Vector2();\n this.wireframe.scaleCorner = undefined;\n this.wireframe.scaleEdgeCorners = undefined;\n this.refreshCursorResult(TransformType.NULL);\n this._owner.setCursor(this.cursorResult);\n }\n\n /**\n * 根据指针位移更新缩放手柄交互。\n * @param event 鼠标拖拽事件。\n * @returns 是否处理了拖拽。\n */\n private updateHandleDrag (event: InputEventMouseMotion): boolean {\n if (!this.handlesActive) {\n return false;\n }\n\n const currentPoint = new Vector2(event.position.x, event.position.y);\n const shift = new Vector2().subtractVectors(currentPoint, this.lastPoint);\n\n if (!this.wireframe.interactive || shift.length() <= 0) {\n return true;\n }\n\n this._owner.setSelectionTransformKind('resize');\n const { activeType, interactiveDirection } = this.wireframe;\n\n let cursorRotation = 0;\n\n switch (activeType) {\n case TransformType.SCALE:\n cursorRotation = this.handleScale(shift, interactiveDirection, event);\n\n break;\n case TransformType.WIDTH_SCALE:\n cursorRotation = this.handleWidthScale(shift, interactiveDirection, event);\n\n break;\n }\n\n this.refreshCursorResult(activeType, cursorRotation);\n this.lastPoint.copyFrom(currentPoint);\n this._owner.emit('actionupdate', {\n source: this,\n transformType: this.wireframe.activeType,\n });\n\n return true;\n }\n\n /** 初始化一次变换算法需要的视口交互平面;事件由持有输入会话的 Gizmo 发出。 */\n private beginTransformOperation (): void {\n const viewportPoint = this.cursorPoint.clone();\n\n this.initInteractionPlane(viewportPoint);\n this.lastWorldPosition = viewPositionToWorld(viewportPoint, GizmoViewportUtils.getCameraInfo(this._owner.getEngine()), this.interactionPlane, GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!)) ?? new Vector3();\n }\n\n /** 清理一次变换算法运行态,不改写当前线框命中类型。 */\n private resetTransformOperation (): void {\n if (this._owner.getSelectionTransformKind() === 'resize') {\n this._owner.setSelectionTransformKind('idle');\n }\n this.handlesActive = false;\n this._owner.getSnapManager().reset();\n this.resizeSession = undefined;\n this.lastPoint = new Vector2();\n this.cursorPoint = new Vector2();\n }\n\n /**\n * 提交缩放手柄拖拽并清理会话。\n * @param event 鼠标抬起事件。\n * @returns 是否完成了提交。\n */\n private finishHandleDrag (event: InputEventMouseButton): boolean {\n const currentPoint = new Vector2(event.position.x, event.position.y);\n const shift = new Vector2().subtractVectors(currentPoint, this.lastPoint);\n\n this.cursorPoint.add(shift);\n if (this.wireframe.activeType === TransformType.SCALE && isEffectsPlayerItem(this.selectedItems[0])) {\n this._owner.emit('framerefreshchildren', {\n source: this,\n frameId: this.selectedItems[0].getInstanceId(),\n });\n }\n this.refreshAfterPointerUp(event);\n const transformType = this.wireframe.activeType;\n\n this.resetTransformOperation();\n this._owner.emit('actioncommit', { source: this, transformType });\n\n return true;\n }\n\n /**\n * 按最终指针位置刷新线框命中与光标。\n * @param _event 鼠标抬起事件。\n */\n private refreshAfterPointerUp (_event: InputEventMouseButton): void {\n this.refreshTransformType(this.cursorPoint);\n const { activeType, interactiveDirection } = this.wireframe;\n\n this.refreshCursorResult(activeType, getVector2Angle(interactiveDirection));\n this._owner.setCursor(this.cursorResult);\n }\n\n /**\n * 获取元素的信息标签图标类型。\n * @param item 播放器元素。\n * @returns 图标类型。\n */\n private getIconType (item: VFXItem): ResizeSelectionIconType {\n if (isFramePlayerItem(item)) {\n return ResizeSelectionIconType.FRAME;\n }\n if (isEffectsPlayerItem(item)) {\n return ResizeSelectionIconType.EFFECTS;\n }\n if (isGroupPlayerItem(item)) {\n return ResizeSelectionIconType.GROUP;\n }\n if (isGeneratorPlayerItem(item)) {\n return isVideoGeneratorPlayerItem(item)\n ? ResizeSelectionIconType.VIDEO\n : ResizeSelectionIconType.IMAGE;\n }\n\n switch (item.type) {\n case spec.ItemType.video:\n return ResizeSelectionIconType.VIDEO;\n case spec.ItemType.text:\n return ResizeSelectionIconType.TEXT;\n default:\n return ResizeSelectionIconType.IMAGE;\n }\n }\n\n /**\n * 获取元素的信息标签名称。\n * @param item 播放器元素。\n * @returns 显示名称。\n */\n private getItemInfoName (item: VFXItem): string {\n if (item.name !== '生成器') {\n return item.name;\n }\n\n return isVideoGeneratorPlayerItem(item) ? '视频生成器' : '图片生成器';\n }\n\n /** @returns 当前选框在视口中的局部单位轴。 */\n private boxLocalAxes (): { xAxis: Vector2, yAxis: Vector2 } {\n const points = this.wireframe.transform ? getTransformedBoxCorners(this.wireframe.transform) : undefined;\n\n if (!points?.length) {\n return { xAxis: new Vector2(1, 0), yAxis: new Vector2(0, 1) };\n }\n const xVec = new Vector2().subtractVectors(points[1], points[0]);\n const yVec = new Vector2().subtractVectors(points[3], points[0]);\n const xAxis = xVec.length() > 0 ? xVec.normalize() : new Vector2(1, 0);\n const yAxis = yVec.length() > 0 ? yVec.normalize() : new Vector2(0, 1);\n\n return { xAxis, yAxis };\n }\n\n /**\n * 查找文本宽度交互正在拖动的边。\n * @param center 选框中心。\n * @param interactiveDirection 交互方向。\n * @returns 当前被拖动的边。\n */\n private draggedWidthEdge (center: Vector2, interactiveDirection: Vector2): Line2 | undefined {\n const points = this.wireframe.transform ? getTransformedBoxCorners(this.wireframe.transform) : undefined;\n\n if (!points?.length) {\n return undefined;\n }\n const edgeA = new Line2(points[1], points[2]);\n const edgeB = new Line2(points[3], points[0]);\n const dotA = new Vector2().subtractVectors(edgeA.getCenter(), center).dot(interactiveDirection);\n const dotB = new Vector2().subtractVectors(edgeB.getCenter(), center).dot(interactiveDirection);\n\n return dotA >= dotB ? edgeA : edgeB;\n }\n\n /** 是否为单个文字元素选区。 */\n private isSingleTextSelection (): boolean {\n return this.selectedItems.length === 1 && this.selectedItems[0].type === spec.ItemType.text;\n }\n\n /**\n * 命中线框边缩放区域。角点由调用方优先判定,边命中采用到线段的屏幕距离,\n * 因而旋转元素也沿真实边工作,而不是沿轴对齐 AABB 工作。\n * @param point 视口指针\n * @param textVerticalOnly 单文本时只开放上/下边;左/右边保留给文字宽度手柄\n */\n private findScaleEdge (point: Vector2, textVerticalOnly = false): Line2 | undefined {\n if (!this.scaleEnabled || this.selectedItems.length !== 1) {\n return undefined;\n }\n\n for (let i = 0; i < this.wireframe.edges.length; i++) {\n // 四角顺序下,1/3 是左、右竖边(文字宽度),0/2 是上、下横边(文字字号)。\n if (textVerticalOnly && i % 2 === 1) {\n continue;\n }\n const edge = this.wireframe.edges[i];\n const closest = edge.closestPointToPoint(point, true);\n\n if (closest.distance(point) <= this.config.scaleCircleSize) {\n return edge;\n }\n }\n\n return undefined;\n }\n\n /**\n * 查找指针命中的缩放角点。\n * @param point 指针视口坐标。\n * @returns 命中的缩放角点。\n */\n private findScaleCorner (point: Vector2): Circle | undefined {\n if (!this.wireframe.scaleCorners.length) {\n return undefined;\n }\n\n const { xAxis, yAxis } = this.boxLocalAxes();\n const halfSize = SCALE_CORNER_HIT_SIZE / 2;\n\n return this.wireframe.scaleCorners.find(corner => {\n const offset = new Vector2().subtractVectors(point, corner.center);\n\n return Math.abs(offset.dot(xAxis)) <= halfSize\n && Math.abs(offset.dot(yAxis)) <= halfSize;\n });\n }\n\n /**\n * 获取被拖边对边的中点。\n * @param scaleEdgeCorners 被拖边的两个端点。\n * @returns 对边中点。\n */\n private oppositeScaleEdgeCenter (scaleEdgeCorners: Vector2[]): Vector2 | undefined {\n const { edges } = this.wireframe;\n\n if (scaleEdgeCorners.length !== 2 || edges.length !== 4) {\n return undefined;\n }\n const draggedEdge = new Line2(scaleEdgeCorners[0], scaleEdgeCorners[1]);\n const reversedDraggedEdge = new Line2(scaleEdgeCorners[1], scaleEdgeCorners[0]);\n const draggedIndex = edges.findIndex(edge => (\n edge.equals(draggedEdge) || edge.equals(reversedDraggedEdge)\n ));\n\n if (draggedIndex < 0) {\n return undefined;\n }\n\n return edges[(draggedIndex + 2) % edges.length].getCenter();\n }\n\n /**\n * 获取被拖角点的对角点。\n * @param scaleCorner 被拖角点。\n * @returns 对角点。\n */\n private oppositeScaleCorner (scaleCorner: Vector2): Vector2 | undefined {\n const points = this.wireframe.transform ? getTransformedBoxCorners(this.wireframe.transform) : undefined;\n\n if (!points?.length) {\n return undefined;\n }\n const draggedIndex = points.findIndex(point => point.equals(scaleCorner));\n\n return draggedIndex < 0 ? undefined : points[(draggedIndex + 2) % points.length].clone();\n }\n\n /**\n * 创建按下时冻结的绝对缩放会话。\n * @param item 被缩放元素。\n * @param itemMatrix 元素世界矩阵。\n * @param transformOrigin 变换原点。\n * @param viewportPoint 指针视口坐标。\n * @param initialHandleView 初始手柄视口位置。\n * @param fixedPointView 固定点视口位置。\n * @param handleKind 手柄类型。\n * @param textResizeMode 文本缩放模式。\n * @returns 缩放会话;坐标转换失败时返回 undefined。\n */\n private createAnchoredResizeSession (\n item: VFXItem,\n itemMatrix: Matrix4,\n transformOrigin: Vector3,\n viewportPoint: Vector2,\n initialHandleView: Vector2,\n fixedPointView: Vector2,\n handleKind: AnchoredResizeSession['handleKind'],\n textResizeMode: TextResizeSnapshot['mode'] = 'font',\n ): AnchoredResizeSession | undefined {\n // 步骤 1:将手柄与固定点投影到交互平面。\n const cameraInfo = GizmoViewportUtils.getCameraInfo(this._owner.getEngine());\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n const initialHandle = viewPositionToWorld(initialHandleView, cameraInfo, this.interactionPlane, containerSize);\n const fixedPoint = viewPositionToWorld(fixedPointView, cameraInfo, this.interactionPlane, containerSize);\n\n if (!initialHandle || !fixedPoint) {\n return undefined;\n }\n\n // 步骤 2:冻结父级矩阵与元素类型相关属性。\n const parentWorldToLocal = new Matrix4().copyFrom(item.transform.getParentMatrix() ?? new Matrix4());\n\n parentWorldToLocal.setPosition(new Vector3()).invert();\n const textComponent = item.type === spec.ItemType.text ? item.getComponent(TextComponent) : undefined;\n const frame = isFramePlayerItem(item);\n const resizeOrigin = textComponent || frame\n ? initialHandle.clone().add(fixedPoint).multiply(0.5)\n : transformOrigin.clone();\n const text = textComponent\n ? {\n component: textComponent,\n mode: textResizeMode,\n fontSize: textComponent.textStyle.fontSize,\n fontOffset: textComponent.textStyle.fontOffset,\n lineHeight: textComponent.textLayout.lineHeight,\n width: textComponent.textLayout.width,\n height: textComponent.textLayout.height,\n }\n : undefined;\n\n // 步骤 3:组装后续帧只读的绝对缩放快照。\n return {\n item,\n handleKind,\n geometry: {\n initialHandle,\n fixedPoint,\n resizeOrigin,\n worldToLocalRotation: new Matrix4().extractRotation(itemMatrix).invert(),\n },\n initialHandleView,\n fixedPointView,\n pointerToHandleView: viewportPoint.clone().subtract(initialHandleView),\n initialPosition: new Vector3().copyFrom(item.transform.position),\n initialScale: new Vector3().copyFrom(item.transform.scale),\n parentWorldToLocal,\n initialWorldSize: frame ? getItemWorldSize(item) : undefined,\n initialLocalSize: frame ? new Vector2().copyFrom(item.transform.size) : undefined,\n text,\n frameAppliedTranslation: new Vector3(),\n resizeBehavior: this.config.resolveResizeBehavior?.(item.getInstanceId()) ?? 'scale',\n externalTranslation: new Vector3(),\n };\n }\n\n /**\n * 按 ResizeSelectionIconType 取对应配置的图标 URL。\n * @param type 图标类型\n * @returns 图标 URL;NULL 类型返回空字符串\n */\n private getIconUrl (type: ResizeSelectionIconType): string {\n const urlMap: Record<ResizeSelectionIconType, string> = {\n 'null': '',\n 'image': this.config.imageLogoUrl,\n 'group': this.config.groupLogoUrl,\n 'text': this.config.textLogoUrl,\n 'video': this.config.videoLogoUrl,\n 'frame': this.config.frameLogoUrl,\n 'effects': this.config.effectsLogoUrl,\n };\n\n return urlMap[type];\n }\n\n /**\n * 配置变更时刷新类型图标纹理:URL 变化的图标销毁旧纹理并清空缓存,\n * 下次 draw 时会按新 URL 懒加载。\n * @param previous 变更前配置\n * @param current 变更后配置\n */\n private refreshIconSprites (\n previous: Readonly<ResizeSelectionConfig>,\n current: Readonly<ResizeSelectionConfig>,\n ): void {\n const logoKeys: { type: ResizeSelectionIconType, key: keyof ResizeSelectionConfig }[] = [\n { type: ResizeSelectionIconType.IMAGE, key: 'imageLogoUrl' },\n { type: ResizeSelectionIconType.GROUP, key: 'groupLogoUrl' },\n { type: ResizeSelectionIconType.TEXT, key: 'textLogoUrl' },\n { type: ResizeSelectionIconType.VIDEO, key: 'videoLogoUrl' },\n { type: ResizeSelectionIconType.FRAME, key: 'frameLogoUrl' },\n { type: ResizeSelectionIconType.EFFECTS, key: 'effectsLogoUrl' },\n ];\n\n for (const { type, key } of logoKeys) {\n if (previous[key] !== current[key]) {\n const texture = this.iconTextures.get(type);\n\n if (texture && !texture.isDestroyed) {\n texture.offloadData();\n }\n this.iconTextures.delete(type);\n this.iconTexturePromises.delete(type);\n }\n }\n }\n\n /**\n * 根据配置变化刷新图标纹理缓存。\n * @param change 选区缩放配置变更。\n */\n private onConfigChange (change: ConfigChange<ResizeSelectionConfig>): void {\n this.refreshIconSprites(change.previous, change.current);\n }\n\n /**\n * 获取类型图标纹理(懒加载)。\n * 命中且未销毁则直接返回;否则发起一次异步加载并返回 undefined(本帧跳过图标,\n * 加载完成后由持续渲染循环自动重绘)。\n * @param type 图标类型\n * @param engine effects 引擎实例(取自 control)\n * @returns 命中的纹理;未命中或加载中时返回 undefined\n */\n private getIconTexture (type: ResizeSelectionIconType, engine: Control['engine']): Texture | undefined {\n if (type === ResizeSelectionIconType.NULL) {\n return undefined;\n }\n const cached = this.iconTextures.get(type);\n\n if (cached && !cached.isDestroyed) {\n return cached;\n }\n if (!this.iconTexturePromises.has(type)) {\n const url = this.getIconUrl(type);\n\n if (!url) {\n return undefined;\n }\n const promise = Texture.fromImage(url, engine).then(texture => {\n this.iconTextures.set(type, texture);\n\n return texture;\n });\n\n this.iconTexturePromises.set(type, promise);\n }\n\n return undefined;\n }\n\n /**\n * 绘制单选元素的名称、尺寸与类型图标。\n * @param control 绘制控制器。\n * @param sizeTextColor 尺寸文本颜色。\n * @param nameTextColor 名称文本颜色。\n */\n private renderItemInfo (control: Control, sizeTextColor: number, nameTextColor: number): void {\n // 步骤 1:计算元素名称、像素尺寸与图标纹理。\n const item = this.selectedItems[0];\n const name = this.getItemInfoName(item);\n const corners = this.wireframe.transform ? getTransformedBoxCorners(this.wireframe.transform) : getBoxCorners(this.wireframe.box);\n const boxWidth = Math.round(corners[0].distance(corners[1]) / this.viewScale * this.config.contentRatio / this.config.pixelRatio);\n const boxHeight = Math.round(corners[1].distance(corners[2]) / this.viewScale * this.config.contentRatio / this.config.pixelRatio);\n const size = [boxWidth, boxHeight];\n\n const iconTexture = this.getIconTexture(this.iconType, control.engine);\n\n // 步骤 2:查找屏幕最上方的选框边并计算旋转角。\n const topCorner = corners[0].clone();\n const anotherCorner = new Vector2();\n\n corners.forEach(corner => {\n if (corner.y < topCorner.y) {\n topCorner.copyFrom(corner);\n }\n });\n\n let init = false;\n\n corners.forEach(corner => {\n if (corner.equals(topCorner)) {\n return;\n }\n if (!init) {\n anotherCorner.copyFrom(corner);\n init = true;\n } else if (corner.y - topCorner.y <= anotherCorner.y - topCorner.y) {\n anotherCorner.copyFrom(corner);\n }\n });\n\n const leftCorner = topCorner.x < anotherCorner.x ? topCorner : anotherCorner;\n const rightCorner = topCorner.x > anotherCorner.x ? topCorner : anotherCorner;\n const rotation = new Vector2().subtractVectors(rightCorner, leftCorner).angle();\n\n const viewBoxWidth = leftCorner.distance(rightCorner);\n\n // 步骤 3:根据顶边可用宽度裁剪名称与尺寸文本。\n let sizeStr = size.map(s => roundNumber(s, 0)).join(' * ');\n const sizeTextWidth = measureTextWidth(sizeStr);\n\n if (viewBoxWidth < sizeTextWidth * 2) {\n sizeStr = '';\n }\n\n let nameStr = ` ${name}`;\n const nameTextWidth = measureTextWidth(nameStr);\n\n if ((20 + nameTextWidth + sizeTextWidth) > viewBoxWidth) {\n if (viewBoxWidth < sizeTextWidth * 2) {\n sizeStr = '';\n nameStr = truncateText(nameStr, viewBoxWidth - 20);\n } else {\n const availableNameWidth = viewBoxWidth - 20 - sizeTextWidth - 5;\n\n nameStr = truncateText(nameStr, availableNameWidth);\n }\n }\n\n // 步骤 4:建立标签局部坐标轴与文本基线。\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const ex = new Vector2(cos, sin);\n const ey = new Vector2(-sin, cos);\n\n const textCellTop = -INFO_TEXT_BOTTOM - measureControlTextCellHeight(\n INFO_TEXT_FONT_SIZE,\n INFO_TEXT_FONT_FAMILY,\n undefined,\n undefined,\n control.engine.displayServer.pixelRatio,\n );\n\n // 步骤 5:依次绘制图标、尺寸和名称。\n if (iconTexture && !iconTexture.isDestroyed) {\n const anchor = leftCorner.clone().subtract(ey.clone().multiply(INFO_ICON_BOTTOM + INFO_ICON_SIZE));\n\n drawWithBoxTransform(\n control,\n anchor,\n ex,\n ey,\n () => {\n control.drawTexture(0, 0, INFO_ICON_SIZE, INFO_ICON_SIZE, iconTexture);\n },\n );\n }\n\n if (sizeStr) {\n const anchor = rightCorner.clone();\n const textWidth = measureTextWidth(sizeStr);\n\n drawWithBoxTransform(\n control,\n anchor,\n ex,\n ey,\n () => {\n control.drawText(-textWidth, textCellTop, sizeStr, INFO_TEXT_FONT_SIZE, toColor(sizeTextColor, 1), INFO_TEXT_FONT_FAMILY);\n },\n );\n }\n\n if (nameStr) {\n const anchor = leftCorner.clone().add(ex.clone().multiply(20));\n\n drawWithBoxTransform(\n control,\n anchor,\n ex,\n ey,\n () => {\n control.drawText(0, textCellTop, nameStr, INFO_TEXT_FONT_SIZE, toColor(nameTextColor, 1), INFO_TEXT_FONT_FAMILY);\n },\n );\n }\n }\n\n /**\n * 纯判定:鼠标点命中的交互类型(缩放/平移),未命中返回 NULL。\n * 只读,不写 activeType/wireframe。供 refreshTransformType 复用。\n * @param point 视口坐标\n */\n private computeTransformType (point: Vector2): TransformType {\n if (!this.wireframe.interactive || !this.wireframe.totalBox.containsPoint(point)) {\n return TransformType.NULL;\n }\n\n // 角点优先于边,避免角点附近被边缩放抢占。\n if (this.scaleEnabled) {\n if (this.findScaleCorner(point)) {\n return TransformType.SCALE;\n }\n }\n\n // 单文本左右边线宽度回流命中带(多边形命中,适配旋转边线带)。\n for (const widthScaleArea of this.wireframe.widthScaleAreas) {\n if (transformedBoxContainsPoint(widthScaleArea, point)) {\n return TransformType.WIDTH_SCALE;\n }\n }\n\n if (this.scaleEnabled) {\n if (this.findScaleEdge(point, this.isSingleTextSelection())) {\n return TransformType.SCALE;\n }\n }\n\n // 其次判断平移交互\n if (this.wireframe.transform && transformedBoxContainsPoint(this.wireframe.transform, point)) {\n return TransformType.TRANSLATION;\n }\n\n return TransformType.NULL;\n }\n\n /**\n * 处理角点或边缩放交互。\n * @param shift 本次鼠标位移增量。\n * @param interactiveDirection 交互方向向量。\n * @param event 鼠标拖拽事件。\n * @returns 光标旋转角度。\n */\n private handleScale (shift: Vector2, interactiveDirection: Vector2, event: InputEventMouseMotion): number {\n const pointerView = this.cursorPoint.add(shift).clone();\n\n return this.handleAnchoredResize(pointerView, interactiveDirection, event);\n }\n\n /**\n * 根据按下快照计算并应用绝对缩放。\n * @param pointerView 当前指针视口位置。\n * @param interactiveDirection 初始交互方向。\n * @param event 鼠标拖拽事件。\n * @returns 光标旋转角度。\n */\n private handleAnchoredResize (\n pointerView: Vector2,\n interactiveDirection: Vector2,\n event: InputEventMouseMotion,\n ): number {\n // 步骤 1:校验会话并将指针还原到真实手柄位置。\n const session = this.resizeSession;\n\n if (!session) {\n return getVector2Angle(interactiveDirection);\n }\n\n const handleView = pointerView.clone().subtract(session.pointerToHandleView);\n const snappedHandleView = this.snapHandlePoint(handleView);\n let targetHandleView = snappedHandleView;\n\n // 步骤 2:边手柄投影到单轴,并计算当前光标方向。\n if (session.handleKind === 'edge') {\n const resizeAxis = new Vector2().subtractVectors(session.initialHandleView, session.fixedPointView);\n const initialViewLength = resizeAxis.length();\n\n if (isEqual(initialViewLength, 0)) {\n return getVector2Angle(interactiveDirection);\n }\n resizeAxis.divide(initialViewLength);\n const projectedViewLength = new Vector2()\n .subtractVectors(snappedHandleView, session.fixedPointView)\n .dot(resizeAxis);\n\n targetHandleView = session.fixedPointView.clone().add(resizeAxis.multiply(projectedViewLength));\n }\n const currentHandleDirection = new Vector2().subtractVectors(targetHandleView, session.fixedPointView);\n const cursorDirection = isEqual(currentHandleDirection.length(), 0)\n ? interactiveDirection\n : currentHandleDirection;\n\n // 步骤 3:将目标手柄投影到世界交互平面。\n const handleWorld = viewPositionToWorld(\n targetHandleView,\n GizmoViewportUtils.getCameraInfo(this._owner.getEngine()),\n this.interactionPlane,\n GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!),\n );\n\n if (!handleWorld) {\n return getVector2Angle(cursorDirection);\n }\n\n // 步骤 4:解析比例约束,计算并应用缩放结果。\n const resizeBehavior = session.resizeBehavior ?? 'scale';\n const resizeAxis = getResizeAxis(resizeBehavior);\n const isFreeScaleByDefault = isFramePlayerItem(session.item) || resizeBehavior === 'resize';\n const isShiftFreeScale = isFreeScaleByDefault ? !event.shiftPressed : event.shiftPressed;\n const lockAspectRatio = session.text\n ? session.text.mode === 'font'\n : resizeAxis === 'both' && this.isLockScale && !isShiftFreeScale;\n const resize = calculateAnchoredResize(session.geometry, handleWorld, {\n handleKind: session.handleKind,\n lockAspectRatio,\n lockedAxis: resizeAxis === 'x' ? 'y' : resizeAxis === 'y' ? 'x' : undefined,\n });\n\n this.applyAnchoredResize(session, resize);\n this.lastWorldPosition.copyFrom(handleWorld);\n\n return getVector2Angle(cursorDirection);\n }\n\n /**\n * 将绝对缩放结果应用到会话快照。\n * @param session 缩放会话。\n * @param resize 绝对缩放结果。\n */\n private applyAnchoredResize (session: AnchoredResizeSession, resize: AnchoredResizeResult): void {\n // 步骤 1:读取按下时冻结的元素属性。\n const { item, initialScale, initialWorldSize, initialLocalSize, text } = session;\n\n if (text) {\n // 步骤 2:文本宽度模式更新排版宽度并补齐剩余缩放。\n if (text.mode === 'width') {\n const scalar = resize.totalScalar.x;\n const width = text.width * Math.abs(scalar);\n\n text.component.setTextWidth(width);\n const lineCount = text.component.getLineCount(text.component.text);\n\n text.component.setTextHeight(Math.ceil(text.lineHeight * lineCount));\n // 排版属性只表达正宽度,transform 补齐越过固定边后的绝对比例。\n const initialBaseWidth = text.width + text.fontOffset;\n const currentBaseWidth = width + text.fontOffset;\n const propertyScalar = isEqual(initialBaseWidth, 0)\n ? Math.abs(scalar)\n : currentBaseWidth / initialBaseWidth;\n const residualScalar = isEqual(propertyScalar, 0) ? 0 : Math.abs(scalar) / propertyScalar;\n\n item.transform.setScale(\n initialScale.x * residualScalar,\n initialScale.y,\n initialScale.z,\n );\n this.setResizePosition(session, resize.totalTranslation);\n\n const composition = this._owner.getEngine().sceneServer.compositions[0];\n\n composition?.gotoAndStop(composition.time);\n\n return;\n }\n\n // 步骤 3:文本字号模式同步字号、行高、排版尺寸与剩余缩放。\n const magnitude = Math.max(Math.abs(resize.totalScalar.x), Math.abs(resize.totalScalar.y));\n const propertyScalar = Math.max(magnitude, 1 / text.fontSize);\n // fontOffset 是渲染宽度中的固定留白,排版宽度补齐它,避免用单轴 scale 拉伸字形。\n const width = Math.max(0, (text.width + text.fontOffset) * propertyScalar - text.fontOffset);\n const height = text.height * propertyScalar;\n\n text.component.setFontSize(text.fontSize * propertyScalar);\n text.component.setLineHeight(text.lineHeight * propertyScalar);\n text.component.setTextWidth(width);\n text.component.setTextHeight(height);\n // 字号的最小值由统一的 transform 比例补偿。换行数与高度取整都不能改变字形比例。\n const residualScalar = magnitude / propertyScalar;\n\n item.transform.setScale(\n initialScale.x * residualScalar,\n initialScale.y * residualScalar,\n initialScale.z,\n );\n this.setResizePosition(session, resize.totalTranslation);\n\n const composition = this._owner.getEngine().sceneServer.compositions[0];\n\n composition?.gotoAndStop(composition.time);\n\n return;\n }\n\n // 步骤 4:画板按绝对尺寸与增量位移更新。\n if (isFramePlayerItem(item) && initialWorldSize && initialLocalSize) {\n const translationDelta = resize.totalTranslation.clone().subtract(session.frameAppliedTranslation);\n\n resizeFrameItem(\n item,\n new Vector2(\n initialWorldSize.x * resize.totalScalar.x,\n initialWorldSize.y * resize.totalScalar.y,\n ),\n translationDelta,\n { localSize: initialLocalSize, worldSize: initialWorldSize },\n );\n session.frameAppliedTranslation.copyFrom(resize.totalTranslation);\n\n return;\n }\n\n // 步骤 5:普通元素直接应用绝对缩放与位移。\n item.transform.setScale(\n initialScale.x * resize.totalScalar.x,\n initialScale.y * resize.totalScalar.y,\n initialScale.z * resize.totalScalar.z,\n );\n this.setResizePosition(session, resize.totalTranslation);\n }\n\n /**\n * 将世界总位移转换到父级局部坐标并写入位置。\n * @param session 缩放会话。\n * @param totalWorldTranslation 世界空间累计位移。\n */\n private setResizePosition (session: AnchoredResizeSession, totalWorldTranslation: Vector3): void {\n const localTranslation = totalWorldTranslation.clone().applyMatrix(session.parentWorldToLocal);\n const resizeBehavior = session.resizeBehavior ?? 'scale';\n const resizeAxis = getResizeAxis(resizeBehavior);\n const externalTranslation = session.externalTranslation ??= new Vector3();\n\n if (resizeAxis !== 'both' && session.lastAppliedPosition) {\n externalTranslation.add(\n new Vector3().subtractVectors(session.item.transform.position, session.lastAppliedPosition),\n );\n }\n const position = session.initialPosition.clone().add(localTranslation).add(externalTranslation);\n\n session.item.transform.setPosition(...position.toArray());\n session.lastAppliedPosition = position;\n }\n\n /**\n * 处理文本左右边的宽度缩放。\n * @param shift 本次鼠标位移增量。\n * @param interactiveDirection 交互方向向量。\n * @param event 鼠标拖拽事件。\n * @returns 光标旋转角度。\n */\n private handleWidthScale (shift: Vector2, interactiveDirection: Vector2, event: InputEventMouseMotion): number {\n const pointerView = this.cursorPoint.add(shift).clone();\n\n return this.handleAnchoredResize(pointerView, interactiveDirection, event);\n }\n\n /**\n * 将手柄位置吸附到最近目标。\n * @param point 原始手柄位置。\n * @returns 吸附后的手柄位置。\n */\n private snapHandlePoint (point: Vector2): Vector2 {\n const snapManager = this._owner.getSnapManager();\n\n snapManager.clearSnappingVisualizations();\n if (!snapManager.enabled) {\n return point;\n }\n\n snapManager.preparePoint(new Vector2(), point);\n\n return point.clone().subtract(new Vector2(\n snapManager.result.x ?? 0,\n snapManager.result.y ?? 0,\n ));\n }\n\n}\n\n/** 选区线框的视口几何与交互状态。 */\nexport type ResizeSelectionWireframe = {\n /** 线框四条边 */\n edges: Line2[],\n /** 主线框归一化 Box2 到视图的变换 */\n transform?: Matrix3,\n /** 缩放角点碰撞圆 */\n scaleCorners: Circle[],\n /** 单文本左右两侧的宽度调整手柄 */\n widthScaleAreas: Matrix3[],\n /** 线框是否可交互 */\n interactive: boolean,\n /** 角点是否可点 */\n cornerEnable: boolean,\n /** 当前元素包围盒 */\n box: Box2,\n /** 变换锚点 */\n anchor: Vector2,\n /** 命中外扩包围盒(含角点区域) */\n totalBox: Box2,\n /** 多选时子元素的视图变换 */\n childrenTransforms: Matrix3[],\n /** 当前交互类型 */\n activeType: TransformType,\n /** 交互方向向量 */\n interactiveDirection: Vector2,\n /** 命中的缩放角点 */\n scaleCorner?: Vector2,\n /** 命中的缩放边的两端角点 */\n scaleEdgeCorners?: Vector2[],\n};\n","import type { Box2 } from '@galacean/effects-math/es/extension/index';\n\n/** 画板布局模式。 */\nexport enum FrameLayoutMode {\n /** 自动布局:元素按行列规则自动排布。 */\n AUTO = 'auto',\n /** 自由布局:元素位置不受布局约束。 */\n FREE = 'free'\n}\n\n/** 画板数据及其当前视图包围盒。 */\nexport type FrameInfo = {\n /** 画板元素 ID。 */\n id: string,\n /** 当前视图包围盒。 */\n box: Box2,\n /** 布局模式。 */\n layoutMode: FrameLayoutMode,\n /** 子元素 ID。 */\n children: string[],\n /** 子元素自动布局信息。 */\n layoutInfos: Record<string, LayoutInfo>,\n};\n\n/** 元素在自动布局中的位置信息。 */\nexport type LayoutInfo = {\n /**\n * 所在行号(可为小数)。\n * 整数部分为主行号(0, 1, 2...),小数部分为分行后的子行号(如 1.5 表示第 1 行的第 5 个子行),\n * 仅支持两层(即小数部分为 0-9)。\n */\n row: number,\n /** 所在列号(必须为整数)。 */\n column: number,\n /** 元素在布局中的位置(相对于画板左上角,可选)。 */\n position?: [number, number],\n};\n\n/** 画板自动布局约束。 */\nexport type AutoLayoutConfig = {\n /** 单行最大宽度。 */\n maxRowWidth?: number,\n /** 最大行数。 */\n maxRowCount?: number,\n};\n","import type { Box2 } from '@galacean/effects-math/es/extension/index';\nimport type { Vector2 } from '../math';\n\n/** 图片裁切和扩边的交互类型。 */\nexport enum ImageInteractionType {\n /** 无交互。 */\n NONE = 'none',\n /** 角点双轴缩放。 */\n SCALE = 'scale',\n /** 边中点单轴缩放。 */\n DIRECTION_SCALE = 'direction-scale',\n /** 移动交互框。 */\n MOVE = 'move',\n}\n\n/** 无图片交互参数。 */\nexport type ImageNoneParam = {\n /** 交互类型。 */\n type: ImageInteractionType.NONE,\n};\n\n/** 图片单轴缩放参数。 */\nexport type ImageDirectionScaleParam = {\n /** 交互类型。 */\n type: ImageInteractionType.DIRECTION_SCALE,\n /** 交互开始时的归一化 Box2。 */\n box: Box2,\n /** 被拖拽边的索引。 */\n index: number,\n /** 交互开始时的归一化鼠标位置。 */\n startMouse: Vector2,\n /** 锁定的宽高比。 */\n lockedAspect?: number,\n};\n\n/** 图片交互框移动参数。 */\nexport type ImageMoveParam = {\n /** 交互类型。 */\n type: ImageInteractionType.MOVE,\n /** 交互开始时的归一化 Box2。 */\n box: Box2,\n /** 交互开始时的归一化鼠标位置。 */\n startMouse: Vector2,\n};\n","import { MouseButton, type InputEventMouseButton, type InputEventMouseMotion, FrameComponent, generateGUID, spec } from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport { Gizmo } from '../gizmo';\nimport { GizmoViewportUtils } from '../viewport/viewport-utils';\nimport { GestureCursorType, type GestureCursorResult } from '../cursor';\nimport { Box2 } from '@galacean/effects-math/es/extension/index';\nimport { Vector2 } from '../math';\nimport type { ItemCreateConfig } from '../configs/types';\nimport { itemCreateConfig, selectionPreviewConfig } from '../configs/builtin-configs';\nimport { getItemViewBox, isFramePlayerItem } from '../items';\nimport { viewPositionToPixel, viewSizeToPixel } from '../viewport';\nimport { toColor, drawBox } from '../drawing';\nimport { DRAG_THRESHOLD_PX } from '../drag-threshold';\nimport type { GizmoItemCreateInfo } from '../gizmo-action';\nimport { TEXT_EDIT_BOX_LINE_COLOR, TEXT_EDIT_BOX_LINE_WIDTH } from './text-gizmo';\n\n/** 元素创建类型。 */\nexport enum ItemCreateType {\n /** 不创建元素。 */\n NONE = 'none',\n /** 创建文本元素。 */\n TEXT = 'text',\n /** 创建视频生成器。 */\n VIDEO_GENERATOR = 'video-generator',\n /** 创建图片生成器。 */\n IMAGE_GENERATOR = 'image-generator',\n /** 创建画板。 */\n FRAME = 'frame',\n}\n\n/** 画板创建交互生成的几何与子元素数据。 */\nexport type FrameCreateData = {\n /** 画板像素位置(中心点) */\n position: [number, number],\n /** 画板像素尺寸 [width, height] */\n size: [number, number],\n /** 框选命中的子元素 ID 列表 */\n children: string[],\n};\n\n/** 固定宽度文字创建数据;垂直尺寸仍由文字默认样式决定。 */\nexport type TextCreateData = {\n /** 文字像素位置(中心点) */\n position: [number, number],\n /** 水平拖拽得到的固定像素宽度 */\n width: number,\n};\n\nconst DEFAULT_FRAME_SIZE = 1024;\nconst DEFAULT_TEXT_HEIGHT = 60;\nconst TEXT_FIXED_WIDTH_DELAY_MS = 150;\n// 固定宽度文本使用六倍拖拽阈值,避免轻微抖动生成窄列文本。\nconst TEXT_FIXED_WIDTH_DRAG_DISTANCE_PX = DRAG_THRESHOLD_PX * 6;\n\n/** 通过点击或拖拽创建文本、生成器和画板元素。 */\nexport class ItemCreateGizmo extends Gizmo {\n readonly type = 'item-create';\n\n _createType = ItemCreateType.NONE;\n /** 光标结果(GestureCursorResult) */\n cursorResult: GestureCursorResult = {\n type: GestureCursorType.NORMAL,\n angle: 0,\n };\n\n private dragStartPoint: Vector2 | null = null;\n private dragStartViewPoint: Vector2 | null = null;\n private pressStartedAt = 0;\n private mouseGrabbed = false;\n private frameBox: Box2 | null = null;\n private frameChildren: string[] = [];\n private interactiveChildrenBoxes = new Map<string, Box2>();\n private isFixedWidthText = false;\n private textDragDirection = 1;\n private textBox: Box2 | null = null;\n private createItemId: string | null = null;\n private dragCreationStarted = false;\n\n /** 当前元素创建配置。 */\n get config (): Readonly<ItemCreateConfig> {\n return this._owner.getConfigManager().get(itemCreateConfig);\n }\n\n /** 当前创建类型 */\n get createType () {\n return this._createType;\n }\n\n /**\n * 设置创建类型,变化时刷新光标。\n * @param type 元素创建类型\n */\n set createType (type: ItemCreateType) {\n if (type === this._createType) {\n return;\n }\n\n this._createType = type;\n this.refreshCursorResult();\n }\n\n /**\n * 更新已开始的元素创建交互。\n * @param event 鼠标移动事件。\n */\n override onMouseMove (event: InputEventMouseMotion): void {\n if (this.mouseGrabbed) {\n const handled = this.updateGrab(event);\n\n this._owner.setCursor(this.cursorResult);\n if (handled) {\n event.accept();\n }\n\n return;\n }\n this._owner.setCursor(this.cursorResult);\n }\n\n /**\n * 继续画板或固定宽度文本的拖拽创建。\n * @param event 鼠标拖拽事件。\n */\n override onMouseDrag (event: InputEventMouseMotion): void {\n if (!this.mouseGrabbed) {\n return;\n }\n const handled = this.updateGrab(event);\n\n this._owner.setCursor(this.cursorResult);\n if (handled) {\n event.accept();\n }\n }\n\n /**\n * 初始化元素创建交互与预生成 ID。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n if (event.buttonIndex !== MouseButton.Left) {\n return;\n }\n this._owner.setCursor(this.cursorResult);\n this.mouseGrabbed = true;\n this.dragStartViewPoint = new Vector2(event.position.x, event.position.y);\n this.dragStartPoint = new Vector2(event.position.x, event.position.y);\n this.pressStartedAt = Date.now();\n this.frameBox = null;\n this.frameChildren = [];\n this.isFixedWidthText = false;\n this.textDragDirection = 1;\n this.textBox = null;\n this.createItemId = generateGUID();\n this.dragCreationStarted = false;\n\n if (this._createType === ItemCreateType.FRAME) {\n this.refreshInteractiveChildrenBoxes();\n }\n\n event.accept();\n }\n\n /**\n * 提交或取消当前元素创建交互。\n * @param event 鼠标抬起事件。\n */\n override onMouseUp (event: InputEventMouseButton): void {\n // 步骤 1:校验会话并处理取消事件。\n if (!this.mouseGrabbed) {\n return;\n }\n\n if (event.isCanceled()) {\n const createInfo = this.getCurrentDragCreateInfo();\n\n if (this.dragCreationStarted && createInfo) {\n this._owner.emit('actioncommit', { source: this, createInfo, canceled: true });\n }\n this.resetInteractionState();\n this._owner.setCursor(this.cursorResult);\n event.accept();\n\n return;\n }\n\n // 松开时采用最终水平距离,快速拖动也保留宽度;预览仍使用时间阈值。\n if (this._createType === ItemCreateType.TEXT) {\n this.updateTextDrag(event, true);\n }\n\n // 步骤 2:优先提交已开始的拖拽创建。\n const dragCreateInfo = this.getCurrentDragCreateInfo();\n\n if (this.dragCreationStarted && dragCreateInfo) {\n this._owner.emit('actioncommit', { source: this, createInfo: dragCreateInfo });\n this.resetInteractionState();\n this._owner.setCursor(this.cursorResult);\n event.accept();\n\n return;\n }\n\n // 步骤 3:按创建类型提交点击创建或画板拖拽结果。\n const createItemId = this.createItemId!;\n\n switch (this._createType) {\n case ItemCreateType.FRAME: {\n if (this.frameBox) {\n this._owner.emit('actioncommit', {\n source: this,\n createInfo: this.getFrameDragCreateInfo(),\n });\n\n break;\n }\n const pixelPosition = this.viewPositionToPixel(this.dragStartViewPoint!);\n const frameData: FrameCreateData = {\n position: [pixelPosition.x, pixelPosition.y],\n size: [DEFAULT_FRAME_SIZE, DEFAULT_FRAME_SIZE],\n children: [],\n };\n\n this._owner.emit('actioncommit', {\n source: this,\n createInfo: {\n info: frameData,\n type: ItemCreateType.FRAME,\n id: createItemId,\n position: frameData.position,\n },\n });\n\n break;\n }\n case ItemCreateType.TEXT: {\n const pixelPosition = this.viewPositionToPixel(this.dragStartViewPoint!);\n\n this._owner.emit('actioncommit', {\n source: this,\n createInfo: {\n type: ItemCreateType.TEXT,\n id: createItemId,\n position: [pixelPosition.x, pixelPosition.y],\n },\n });\n\n break;\n }\n case ItemCreateType.IMAGE_GENERATOR:\n case ItemCreateType.VIDEO_GENERATOR: {\n const pixelPosition = viewPositionToPixel(new Vector2(event.position.x, event.position.y), GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!), GizmoViewportUtils.getViewScale(this._owner.getEngine()), GizmoViewportUtils.getViewportTranslation(this._owner.getEngine()));\n const position: [number, number] = [pixelPosition.x, pixelPosition.y];\n\n this._owner.emit('actioncommit', { source: this, createInfo: { type: this._createType, id: createItemId, position } });\n\n break;\n }\n case ItemCreateType.NONE:\n break;\n }\n\n // 步骤 4:清理会话并恢复光标。\n this.resetInteractionState();\n this._owner.setCursor(this.cursorResult);\n event.accept();\n }\n\n /** 按当前创建类型刷新鼠标光标样式。 */\n refreshCursorResult () {\n switch (this._createType) {\n case ItemCreateType.TEXT: {\n this.cursorResult = {\n type: GestureCursorType.TEXT_CREATE,\n angle: 0,\n };\n\n break;\n }\n case ItemCreateType.FRAME: {\n this.cursorResult = {\n type: GestureCursorType.FRAME_CREATE,\n angle: 0,\n };\n\n break;\n }\n case ItemCreateType.NONE:\n case ItemCreateType.IMAGE_GENERATOR:\n case ItemCreateType.VIDEO_GENERATOR: {\n this.cursorResult = {\n type: GestureCursorType.NORMAL,\n angle: 0,\n };\n\n break;\n }\n }\n }\n\n /** 刷新可被框选加入画板的子元素包围盒映射:过滤动效元素、画板元素及其子元素。 */\n refreshInteractiveChildrenBoxes () {\n // 步骤 1:获取当前合成并清空旧的候选包围盒。\n this.interactiveChildrenBoxes.clear();\n const playerComposition = this._owner.getEngine().sceneServer.compositions[0];\n\n if (!playerComposition?.items.length) {\n return;\n }\n\n // 步骤 2:收集不可被画板收纳的动效、画板及其子元素。\n const effectsItemIds: string[] = [];\n const frameItemIds: string[] = [];\n\n playerComposition.items.forEach(item => {\n if (item.name === 'ModelPluginItem') {\n return;\n }\n if (item.name === '动效' && item.getComponent(FrameComponent) !== undefined) {\n effectsItemIds.push(item.getInstanceId());\n }\n if (isFramePlayerItem(item)) {\n frameItemIds.push(item.getInstanceId());\n item.children?.forEach(child => {\n frameItemIds.push(child.getInstanceId());\n });\n }\n });\n\n const filterItemIds = [...effectsItemIds, ...frameItemIds];\n\n // 步骤 3:缓存其余可交互元素的视口包围盒。\n playerComposition.items.forEach(item => {\n const itemId = item.getInstanceId();\n\n if (filterItemIds.includes(itemId)) {\n return;\n }\n\n const box = getItemViewBox(\n item,\n GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!),\n );\n\n this.interactiveChildrenBoxes.set(itemId, box);\n });\n }\n\n /**\n * 绘制画板或文本的创建区域,以及画板待收纳元素轮廓。\n * @param control 绘制控制器。\n */\n override draw (control: Control): void {\n const isTextPreview = this._createType === ItemCreateType.TEXT;\n const previewBox = this._createType === ItemCreateType.FRAME\n ? this.frameBox\n : isTextPreview ? this.getTextPreviewBox() : null;\n\n if (!this.mouseGrabbed || !previewBox || previewBox.isEmpty()) {\n return;\n }\n\n const {\n frameBorderAlpha,\n frameBorderColor,\n frameBorderWidth,\n } = this.config;\n\n drawBox(\n control,\n previewBox,\n isTextPreview\n ? toColor(TEXT_EDIT_BOX_LINE_COLOR, 1)\n : toColor(frameBorderColor, frameBorderAlpha),\n isTextPreview ? TEXT_EDIT_BOX_LINE_WIDTH : frameBorderWidth,\n );\n\n if (this._createType === ItemCreateType.FRAME) {\n const hoverConfig = this._owner.getConfigManager().get(selectionPreviewConfig);\n const hoverColor = toColor(hoverConfig.preSelectedColor, 1);\n\n this.frameChildren.forEach(id => {\n const box = this.interactiveChildrenBoxes.get(id);\n\n if (!box) {\n return;\n }\n drawBox(control, box, hoverColor, hoverConfig.preSelectedWidth);\n });\n }\n }\n\n /** 释放元素创建交互状态。 */\n override dispose (): void {\n this.resetInteractionState();\n super.dispose();\n }\n\n /**\n * 按当前创建类型更新拖拽预览。\n * @param event 鼠标拖拽事件。\n * @returns 是否处理了拖拽。\n */\n private updateGrab (event: InputEventMouseMotion): boolean {\n if (!this.mouseGrabbed) {\n return false;\n }\n\n switch (this._createType) {\n case ItemCreateType.FRAME:\n this.updateFrameDrag(event);\n\n break;\n case ItemCreateType.TEXT:\n this.updateTextDrag(event);\n\n break;\n }\n\n return true;\n }\n\n /**\n * 更新画板拖拽区域及其待收纳子元素。\n * @param event 鼠标拖拽事件。\n */\n private updateFrameDrag (event: InputEventMouseMotion): void {\n if (!this.dragStartPoint || !this.dragStartViewPoint) {\n return;\n }\n\n const endPoint = this.getCurrentViewPoint(event);\n const deltaX = endPoint.x - this.dragStartViewPoint.x;\n const deltaY = endPoint.y - this.dragStartViewPoint.y;\n const resolvedEndPoint = new Vector2(\n this.dragStartViewPoint.x + Math.sign(deltaX || 1) * Math.max(Math.abs(deltaX), 1),\n this.dragStartViewPoint.y + Math.sign(deltaY || 1) * Math.max(Math.abs(deltaY), 1),\n );\n\n this.frameBox = this.createBox(this.dragStartViewPoint, resolvedEndPoint);\n this.frameChildren = [];\n\n this.interactiveChildrenBoxes.forEach((box, id) => {\n if (this.frameBox?.containsBox(box) && id !== 'ModelPluginItem') {\n this.frameChildren.push(id);\n }\n });\n }\n\n /**\n * 超过水平距离阈值后更新固定宽度文本;预览另外等待时间阈值。\n * @param event 鼠标拖拽事件。\n * @param committing 是否正在松开提交,此时不等待预览时间阈值。\n */\n private updateTextDrag (event: InputEventMouseMotion | InputEventMouseButton, committing = false): void {\n if (!this.dragStartPoint || !this.dragStartViewPoint) {\n return;\n }\n\n const endPoint = this.getCurrentViewPoint(event);\n const horizontalDistance = Math.abs(endPoint.x - this.dragStartViewPoint.x);\n\n if (!this.isFixedWidthText) {\n if (\n (!committing && Date.now() - this.pressStartedAt < TEXT_FIXED_WIDTH_DELAY_MS)\n || horizontalDistance <= TEXT_FIXED_WIDTH_DRAG_DISTANCE_PX\n ) {\n return;\n }\n this.isFixedWidthText = true;\n }\n\n const deltaX = endPoint.x - this.dragStartViewPoint.x;\n\n if (deltaX !== 0) {\n this.textDragDirection = Math.sign(deltaX);\n }\n const resolvedEndX = this.dragStartViewPoint.x\n + this.textDragDirection * Math.max(horizontalDistance, 1);\n const textHeight = DEFAULT_TEXT_HEIGHT * GizmoViewportUtils.getViewScale(this._owner.getEngine());\n\n this.textBox = this.createBox(\n new Vector2(this.dragStartViewPoint.x, this.dragStartViewPoint.y - textHeight / 2),\n new Vector2(resolvedEndX, this.dragStartViewPoint.y + textHeight / 2),\n );\n this.emitDragCreate(this.getTextDragCreateInfo());\n }\n\n /**\n * 发送拖拽创建的开始或更新事件。\n * @param createInfo 当前元素创建信息。\n */\n private emitDragCreate (createInfo: GizmoItemCreateInfo): void {\n const phase = this.dragCreationStarted ? 'actionupdate' : 'actionstart';\n\n this.dragCreationStarted = true;\n this._owner.emit(phase, { source: this, createInfo });\n }\n\n /** @returns 当前画板拖拽预览对应的创建信息。 */\n private getFrameDragCreateInfo (): GizmoItemCreateInfo {\n const frameBox = this.frameBox!;\n const pixelPosition = this.viewPositionToPixel(frameBox.getCenter());\n const pixelSize = viewSizeToPixel(\n frameBox.getSize(),\n GizmoViewportUtils.getViewScale(this._owner.getEngine()),\n );\n const frameData: FrameCreateData = {\n position: [pixelPosition.x, pixelPosition.y],\n size: [pixelSize.x, pixelSize.y],\n children: [...this.frameChildren],\n };\n\n return {\n type: ItemCreateType.FRAME,\n id: this.createItemId!,\n position: frameData.position,\n info: frameData,\n };\n }\n\n /** @returns 当前文本拖拽预览对应的创建信息。 */\n private getTextDragCreateInfo (): GizmoItemCreateInfo {\n const textBox = this.textBox!;\n const pixelPosition = this.viewPositionToPixel(textBox.getCenter());\n const pixelWidth = viewSizeToPixel(\n textBox.getSize(),\n GizmoViewportUtils.getViewScale(this._owner.getEngine()),\n ).x;\n const textData: TextCreateData = {\n position: [pixelPosition.x, pixelPosition.y],\n width: pixelWidth,\n };\n\n return {\n type: ItemCreateType.TEXT,\n id: this.createItemId!,\n position: textData.position,\n info: textData,\n };\n }\n\n /** @returns 当前有效的拖拽创建信息。 */\n private getCurrentDragCreateInfo (): GizmoItemCreateInfo | undefined {\n if (this._createType === ItemCreateType.TEXT && this.textBox) {\n return this.getTextDragCreateInfo();\n }\n\n return undefined;\n }\n\n /**\n * @returns 拖拽创建中文本的实际视图包围盒;元素尚未就绪时退回手势预览盒。\n */\n private getTextPreviewBox (): Box2 | null {\n if (this.dragCreationStarted) {\n const selectedItems = this._owner.getSelection().getSelectedPlayerItems();\n const selectedItem = selectedItems.length === 1 ? selectedItems[0] : undefined;\n\n if (selectedItem?.type === spec.ItemType.text) {\n const actualBox = getItemViewBox(\n selectedItem,\n GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!),\n );\n\n if (!actualBox.isEmpty()) {\n return actualBox;\n }\n }\n }\n\n return this.textBox;\n }\n\n /**\n * 计算当前指针对应的视口位置。\n * @param event 鼠标拖拽事件。\n * @returns 当前视口位置。\n */\n private getCurrentViewPoint (event: InputEventMouseMotion | InputEventMouseButton): Vector2 {\n const shift = new Vector2(\n event.position.x - this.dragStartPoint!.x,\n event.position.y - this.dragStartPoint!.y,\n );\n\n return this.dragStartViewPoint!.clone().add(shift);\n }\n\n /**\n * 根据两个端点创建轴对齐包围盒。\n * @param start 起点。\n * @param end 终点。\n * @returns 轴对齐包围盒。\n */\n private createBox (start: Vector2, end: Vector2): Box2 {\n return new Box2(\n new Vector2(Math.min(start.x, end.x), Math.min(start.y, end.y)),\n new Vector2(Math.max(start.x, end.x), Math.max(start.y, end.y)),\n );\n }\n\n /**\n * 将视口位置转换为像素坐标。\n * @param point 视口位置。\n * @returns 像素坐标。\n */\n private viewPositionToPixel (point: Vector2): Vector2 {\n const engine = this._owner.getEngine();\n\n return viewPositionToPixel(\n point,\n GizmoViewportUtils.getContainerSize(engine.canvas.parentElement!),\n GizmoViewportUtils.getViewScale(engine),\n GizmoViewportUtils.getViewportTranslation(engine),\n );\n }\n\n /** 重置一次创建交互的全部临时状态。 */\n private resetInteractionState (): void {\n this.mouseGrabbed = false;\n this.dragStartPoint = null;\n this.dragStartViewPoint = null;\n this.pressStartedAt = 0;\n this.frameBox = null;\n this.frameChildren = [];\n this.interactiveChildrenBoxes.clear();\n this.isFixedWidthText = false;\n this.textDragDirection = 1;\n this.textBox = null;\n this.createItemId = null;\n this.dragCreationStarted = false;\n }\n}\n","import { Gizmo } from '../gizmo';\nimport { GestureCursorType, type GestureCursorResult } from '../cursor';\nimport {\n MouseButton,\n type InputEventKey,\n type InputEventMouseButton,\n type InputEventMouseMotion,\n} from '@galacean/effects';\nimport { Vector2 } from '../math';\n\n/** 视口平移交互状态。 */\nenum DragType {\n /** 未进行平移。 */\n NONE = 'none',\n /** 正在拖拽平移。 */\n PAN = 'pan',\n}\n\n/** 通过中键或抓手模式拖拽平移视口。 */\nexport class HandGizmo extends Gizmo {\n readonly type = 'hand';\n\n /** 空格按下时下一次左键拖拽应平移视口。 */\n private panKeyPressed = false;\n\n /** 当前拖拽会话态(NONE 未建立 / PAN 平移拖拽中)。 */\n private dragType: DragType = DragType.NONE;\n\n /** 上一帧鼠标位置(拖拽平移增量计算用)。 */\n private lastPoint = new Vector2();\n\n /** 当前抓手交互对应的光标。 */\n get cursorResult (): GestureCursorResult {\n const armed = this._owner.isHandToolMode() || this.isPanning();\n const type = this.dragType === DragType.PAN\n ? GestureCursorType.ACTIVE_HAND\n : (armed ? GestureCursorType.HAND : GestureCursorType.NORMAL);\n\n return { type, angle: 0 };\n }\n\n /** @returns 是否正在平移或等待空格拖拽。 */\n isPanning (): boolean {\n return this.dragType === DragType.PAN || this.panKeyPressed;\n }\n\n /**\n * 处理空格键按下并进入待平移状态。\n * @param event 键盘按下事件。\n */\n override onKeyDown (event: InputEventKey): void {\n const code = event.physicalKeycode.toLocaleLowerCase();\n\n if (code === 'space') {\n if (this.panKeyPressed) {\n event.accept();\n } else if (!this._owner.isMouseButtonPressed()) {\n this.panKeyPressed = true;\n event.accept();\n }\n\n return;\n }\n }\n\n /**\n * 处理空格键抬起并退出待平移状态。\n * @param event 键盘抬起事件。\n */\n override onKeyUp (event: InputEventKey): void {\n if (\n event.physicalKeycode.toLocaleLowerCase() === 'space'\n && this.panKeyPressed\n ) {\n this.panKeyPressed = false;\n event.accept();\n }\n }\n\n /**\n * 根据触发键开始视口平移。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n const button = event.buttonIndex;\n // 使用触发键判断,避免并发按键掩码影响中键平移。\n const shouldPan = button === MouseButton.Middle\n || ((this._owner.isHandToolMode() || this.panKeyPressed) && button === MouseButton.Left);\n\n if (!shouldPan) {\n if (this._owner.isHandToolMode() || this.isPanning()) {\n this._owner.setCursor(this.cursorResult);\n event.accept();\n }\n\n return;\n }\n this.beginPan(event);\n this._owner.setCursor(this.cursorResult);\n event.accept();\n }\n\n /**\n * 更新悬停阶段的视口平移。\n * @param event 鼠标移动事件。\n */\n override onMouseMove (event: InputEventMouseMotion): void {\n this.handlePointerMove(event);\n }\n\n /**\n * 更新拖拽阶段的视口平移。\n * @param event 鼠标拖拽事件。\n */\n override onMouseDrag (event: InputEventMouseMotion): void {\n this.handlePointerMove(event);\n }\n\n /**\n * 结束视口平移。\n * @param event 鼠标抬起事件。\n */\n override onMouseUp (event: InputEventMouseButton): void {\n const handled = this.endPan();\n\n if (handled || this._owner.isHandToolMode() || this.isPanning()) {\n this._owner.setCursor(this.cursorResult);\n event.accept();\n }\n }\n\n /** 释放视口平移状态。 */\n override dispose (): void {\n this.endPan();\n super.dispose();\n }\n\n /**\n * 处理指针移动并更新光标。\n * @param event 鼠标移动事件。\n */\n private handlePointerMove (event: InputEventMouseMotion): void {\n const handled = this.pan(event);\n\n if (handled || this._owner.isHandToolMode() || this.isPanning()) {\n this._owner.setCursor(this.cursorResult);\n event.accept();\n }\n }\n\n /**\n * 进入视口平移会话。\n * @param event 鼠标按下事件。\n */\n private beginPan (event: InputEventMouseButton): void {\n this.dragType = DragType.PAN;\n this.lastPoint = new Vector2(event.position.x, event.position.y);\n }\n\n /**\n * 将鼠标位移应用到视口。\n * @param event 鼠标移动事件。\n * @returns 视口是否发生变化。\n */\n private pan (event: InputEventMouseMotion): boolean {\n if (this.dragType !== DragType.PAN) {\n return false;\n }\n const currentPoint = new Vector2(event.position.x, event.position.y);\n const shift = new Vector2().subtractVectors(currentPoint, this.lastPoint);\n const { shiftPressed } = event;\n\n shift.x = shiftPressed && shift.y !== 0\n ? Math.sqrt(shift.x ** 2 + shift.y ** 2) * shift.y / Math.abs(shift.y)\n : shift.x;\n shift.y = shiftPressed ? 0 : shift.y;\n const changed = this._owner.getViewportNavigation().panByViewDelta(\n shift,\n new Vector2(event.position.x, event.position.y),\n 'hand-pan',\n );\n\n this.lastPoint.copyFrom(currentPoint);\n\n return changed;\n }\n\n /** @returns 结束前是否存在平移会话。 */\n private endPan (): boolean {\n const handled = this.dragType === DragType.PAN;\n\n this.dragType = DragType.NONE;\n\n return handled;\n }\n}\n","import { MouseButton, MouseButtonMask, type InputEventMouseButton, type InputEventMouseMotion, spec, Texture } from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport { Gizmo } from '../gizmo';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport { GizmoViewportUtils } from '../viewport/viewport-utils';\nimport { GizmoType } from '../gizmo-type';\nimport { GestureCursorType, type GestureCursorResult } from '../cursor';\nimport { Box2 } from '@galacean/effects-math/es/extension/index';\nimport { Vector2 } from '../math';\nimport { VideoComponent } from '@galacean/effects-plugin-multimedia';\nimport type { IconConfig } from '../configs/types';\nimport { iconConfig } from '../configs/builtin-configs';\nimport type { ConfigChange } from '../configs/config-definition';\nimport { getPlayerItemById, getItemViewBox, isGeneratorPlayerItem, isVideoGeneratorPlayerItem } from '../items';\n\n/** 辅助渲染 Icon 类型。 */\nexport enum IconType {\n /** 视频播放 Icon */\n VIDEO_PLAY = 'video-play',\n /** 视频生成器 Icon */\n VIDEO_GENERATOR = 'video-generator',\n /** 图片生成器 Icon */\n IMAGE_GENERATOR = 'image-generator',\n}\n\n/** 元素辅助 Icon 结果。 */\nexport type IconResult = {\n /** 选中元素 Id */\n id: string,\n /** Icon 类型 */\n type: IconType,\n /** 包围盒信息 */\n box: Box2,\n};\n\n/** 元素辅助 Icon 交互参数。 */\nexport type IconInteractionParam = {\n /** 鼠标悬停的视频元素 ID */\n hoverVideoId?: string,\n};\n\n/** 渲染元素辅助 Icon(视频播放按钮、生成器图标等)。 */\nexport class IconGizmo extends Gizmo {\n type = GizmoType.ICON;\n\n results: IconResult[] = [];\n\n interactionParam: IconInteractionParam = {};\n\n /** 光标结果(GestureCursorResult) */\n cursorResult: GestureCursorResult = {\n type: GestureCursorType.NORMAL,\n angle: 0,\n };\n private configOff?: () => void;\n\n /** 图标纹理缓存,按 IconType 懒加载。 */\n private iconTextures = new Map<IconType, Texture>();\n /** 图标纹理加载中的 Promise,避免重复发起加载。 */\n private iconTexturePromises = new Map<IconType, Promise<Texture>>();\n\n /**\n * 创建元素辅助图标 Gizmo。\n * @param owner Gizmo 宿主。\n */\n constructor (owner: GizmoOwner) {\n super(owner);\n this.configOff = owner.getConfigManager().onChange(\n iconConfig,\n change => {\n this.onConfigChange(change);\n },\n );\n }\n\n /** 当前图标配置。 */\n get config (): Readonly<IconConfig> {\n return this._owner.getConfigManager().get(iconConfig);\n }\n\n /**\n * 更新视频播放图标的悬停状态与光标。\n * @param event 鼠标移动事件。\n */\n override onMouseMove (event: InputEventMouseMotion): void {\n const hover = this._owner.getMousePosition();\n\n this.interactionParam.hoverVideoId = this.computeHoverVideoId(hover);\n const videoPlayResult = this.results.find(result => result.type === IconType.VIDEO_PLAY);\n const hit = !!videoPlayResult?.box.containsPoint(hover);\n\n this.cursorResult = hit\n ? { type: GestureCursorType.POINTER, angle: 0 }\n : { type: GestureCursorType.NORMAL, angle: 0 };\n this._owner.setCursor(this.cursorResult);\n if (event.buttonMask === MouseButtonMask.None && hit) {\n event.accept();\n }\n }\n\n /** 清除离开交互层后的图标悬停状态。 */\n override onMouseLeave (): void {\n this.interactionParam.hoverVideoId = undefined;\n this.cursorResult = { type: GestureCursorType.NORMAL, angle: 0 };\n this._owner.setCursor(this.cursorResult);\n }\n\n /**\n * 点击视频播放图标时发送播放事件。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n if (event.buttonIndex !== MouseButton.Left) {\n return;\n }\n this.refreshVideoIconId(new Vector2(event.position.x, event.position.y));\n const videoPlayResult = this.results.find(result => result.type === IconType.VIDEO_PLAY);\n\n if (!videoPlayResult?.box.containsPoint(new Vector2(event.position.x, event.position.y))) {\n return;\n }\n if (videoPlayResult) {\n const playerItem = getPlayerItemById(this._owner.getEngine().sceneServer.compositions[0], videoPlayResult.id);\n let time = 0;\n\n if (playerItem?.type === spec.ItemType.video) {\n const videoComponent = playerItem.getComponent(VideoComponent);\n\n time = videoComponent?.getCurrentTime() ?? 0;\n }\n this._owner.emit('videoplay', {\n source: this,\n id: videoPlayResult.id,\n time,\n });\n this.refreshCursorResult();\n this._owner.setCursor(this.cursorResult);\n }\n\n event.accept();\n }\n\n /** 根据当前指针与图标结果刷新光标。 */\n refreshCursorResult (): void {\n const hover = this._owner.getMousePosition();\n const videoPlayResult = this.results.find(result => result.type === IconType.VIDEO_PLAY);\n const isPreSelected = !!hover && !!videoPlayResult?.box.containsPoint(hover);\n\n this.cursorResult = isPreSelected\n ? { type: GestureCursorType.POINTER, angle: 0 }\n : { type: GestureCursorType.NORMAL, angle: 0 };\n }\n\n /**\n * 更新悬停视频 ID 与图标结果。\n * @param mouse 鼠标位置。\n */\n refreshVideoIconId (mouse: Vector2) {\n this.interactionParam.hoverVideoId = this.computeHoverVideoId(mouse);\n this.refreshResults();\n }\n\n /** 刷新所有待绘制的元素辅助图标。 */\n override onUpdate (): void {\n this.refreshResults();\n }\n\n /**\n * 绘制视频播放与生成器图标。\n * @param control 绘制控制器。\n */\n override draw (control: Control): void {\n if (!this.results.length) {\n return;\n }\n\n this.results.forEach(result => {\n const texture = this.getIconTexture(result.type, control.engine);\n\n if (!texture || texture.isDestroyed) {\n return;\n }\n const center = result.box.getCenter();\n const size = result.box.getSize();\n\n control.drawTexture(center.x - size.x / 2, center.y - size.y / 2, size.x, size.y, texture);\n });\n }\n\n /** 释放配置监听器。 */\n override dispose (): void {\n this.configOff?.();\n this.configOff = undefined;\n super.dispose();\n }\n\n /**\n * 在图标 URL 变化时清除对应纹理缓存。\n * @param change 图标配置变更。\n */\n private onConfigChange (change: ConfigChange<IconConfig>): void {\n const checks: { type: IconType, key: keyof IconConfig }[] = [\n { type: IconType.VIDEO_PLAY, key: 'videoPlayUrl' },\n { type: IconType.IMAGE_GENERATOR, key: 'imageGeneratorUrl' },\n { type: IconType.VIDEO_GENERATOR, key: 'videoGeneratorUrl' },\n ];\n\n for (const { type, key } of checks) {\n if (change.previous[key] !== change.current[key]) {\n const texture = this.iconTextures.get(type);\n\n if (texture && !texture.isDestroyed) {\n texture.offloadData();\n }\n this.iconTextures.delete(type);\n this.iconTexturePromises.delete(type);\n }\n }\n }\n\n /** 刷新视频播放与生成器图标的绘制结果。 */\n private refreshResults (): void {\n // 步骤 1:获取当前合成并重置绘制结果。\n const playerComposition = this._owner.getEngine().sceneServer.compositions[0];\n\n if (!playerComposition) {\n return;\n }\n\n this.results = [];\n\n const { videoPlayWidth, videoPlayHeight, videoPlayShift, generatorWidth, generatorHeight } = this.config;\n\n // 步骤 2:为当前悬停视频生成播放图标。\n const hoverVideoId = this.interactionParam.hoverVideoId;\n\n if (hoverVideoId) {\n const playerItem = getPlayerItemById(this._owner.getEngine().sceneServer.compositions[0], hoverVideoId);\n\n if (playerItem) {\n const itemViewBox = getItemViewBox(\n playerItem,\n GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!),\n );\n const size = itemViewBox.getSize();\n\n if (!(size.x < 50 || size.y < 100)) {\n const { max } = itemViewBox;\n\n const position = new Vector2(max.x - videoPlayShift[0], max.y - videoPlayShift[1]);\n const boxSize = new Vector2(videoPlayWidth, videoPlayHeight);\n\n this.results.push({\n id: hoverVideoId,\n type: IconType.VIDEO_PLAY,\n box: new Box2().setFromCenterAndSize(position, boxSize),\n });\n }\n }\n }\n\n // 步骤 3:为生成器对象生成类型图标。\n const generatorItems = playerComposition.items.filter(item => isGeneratorPlayerItem(item));\n\n generatorItems.forEach(item => {\n const itemViewBox = getItemViewBox(\n item,\n GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!),\n );\n const position = itemViewBox.getCenter();\n const size = new Vector2(generatorWidth, generatorHeight).multiply(GizmoViewportUtils.getViewScale(this._owner.getEngine()));\n\n this.results.push({\n id: item.getInstanceId(),\n type: isVideoGeneratorPlayerItem(item) ? IconType.VIDEO_GENERATOR : IconType.IMAGE_GENERATOR,\n box: new Box2().setFromCenterAndSize(position, size),\n });\n });\n }\n\n /**\n * 按 IconType 取得图标 URL。\n * @param type 图标类型\n * @returns 对应图标 URL,无匹配时返回空字符串\n */\n private getIconUrl (type: IconType): string {\n const { videoPlayUrl, imageGeneratorUrl, videoGeneratorUrl } = this.config;\n\n switch (type) {\n case IconType.VIDEO_PLAY: return videoPlayUrl;\n case IconType.IMAGE_GENERATOR: return imageGeneratorUrl;\n case IconType.VIDEO_GENERATOR: return videoGeneratorUrl;\n default: return '';\n }\n }\n\n /**\n * 获取图标纹理(懒加载)。命中且未销毁则直接返回;否则发起一次异步加载并返回\n * undefined(本帧跳过该图标,加载完成后由持续渲染循环自动重绘)。\n * @param type 图标类型\n * @param engine effects 引擎实例(取自 control)\n * @returns 命中且未销毁的缓存纹理;未命中且发起异步加载时返回 undefined\n */\n private getIconTexture (type: IconType, engine: Control['engine']): Texture | undefined {\n const cached = this.iconTextures.get(type);\n\n if (cached && !cached.isDestroyed) {\n return cached;\n }\n if (!this.iconTexturePromises.has(type)) {\n const url = this.getIconUrl(type);\n\n if (!url) {\n return undefined;\n }\n const promise = Texture.fromImage(url, engine).then(texture => {\n this.iconTextures.set(type, texture);\n\n return texture;\n });\n\n this.iconTexturePromises.set(type, promise);\n }\n\n return undefined;\n }\n\n /**\n * 查找鼠标命中的最上层视频对象。\n * @param mouse 鼠标位置。\n * @returns 命中视频对象的 ID。\n */\n private computeHoverVideoId (mouse: Vector2): string | undefined {\n const playerComposition = this._owner.getEngine().sceneServer.compositions[0];\n\n if (!playerComposition) {\n return undefined;\n }\n const videoItems = playerComposition.items.filter(item => item.type === spec.ItemType.video).reverse();\n\n for (const item of videoItems) {\n const itemViewBox = getItemViewBox(\n item,\n GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!),\n );\n\n if (itemViewBox.containsPoint(mouse)) {\n return item.getInstanceId();\n }\n }\n\n return undefined;\n }\n}\n","import {\n InputEventMouseMotion,\n MouseButtonMask,\n type InputEventKey,\n type InputEventMouse,\n type InputEventMouseButton,\n type InputEventWithModifiers,\n type Engine,\n} from '@galacean/effects';\nimport { Control, FocusMode, MouseFilter } from '@galacean/effects-plugin-gui';\nimport { isDragThresholdReached } from '../drag-threshold';\nimport { Vector2 } from '../math';\n\n/** 拖拽距离阈值状态。 */\nenum DragThresholdState {\n /** 未开始按键会话。 */\n Idle,\n /** 已按下但尚未越过阈值。 */\n Pending,\n /** 已越过拖拽阈值。 */\n Crossed,\n}\n\n/** 维护画布输入状态并将绘制和交互事件转发给 Gizmo 层。 */\nexport class GizmoViewport extends Control {\n /** 鼠标进入回调。 */\n onMouseEnterCallback: ((location: Vector2) => void) | null = null;\n /** 鼠标悬停移动回调。 */\n onMouseMoveCallback: ((event: InputEventMouseMotion) => void) | null = null;\n /** 鼠标拖拽回调。 */\n onMouseDragCallback: ((event: InputEventMouseMotion) => void) | null = null;\n /** 鼠标离开回调。 */\n onMouseLeaveCallback: (() => void) | null = null;\n /** 鼠标滚轮回调。 */\n onMouseWheelCallback: ((event: InputEventMouseButton) => void) | null = null;\n /** 鼠标按下回调。 */\n onMouseDownCallback: ((event: InputEventMouseButton) => void) | null = null;\n /** 鼠标抬起回调。 */\n onMouseUpCallback: ((event: InputEventMouseButton) => void) | null = null;\n /** 键盘按下回调。 */\n onKeyDownCallback: ((event: InputEventKey) => void) | null = null;\n /** 键盘抬起回调。 */\n onKeyUpCallback: ((event: InputEventKey) => void) | null = null;\n /** 每帧更新回调。 */\n onUpdateCallback: (() => void) | null = null;\n /** 绘制回调。 */\n drawCallBack: (() => void) | null = null;\n\n private readonly mousePosition = new Vector2();\n private readonly globalMousePosition = new Vector2();\n private readonly dragStart = new Vector2();\n private mouseInside = false;\n private mouseButtonMask = MouseButtonMask.None;\n private dragThresholdState = DragThresholdState.Idle;\n private shiftPressed = false;\n private altPressed = false;\n private metaPressed = false;\n private ctrlPressed = false;\n\n /**\n * @param engine Effects 引擎实例\n */\n constructor (engine: Engine) {\n super(engine);\n this.mouseFilter = MouseFilter.Pass;\n this.focusMode = FocusMode.Click;\n this.mouseForcePassScrollEvents = false;\n this.setAnchorsAndOffsetsPreset('fullRect');\n }\n\n /**\n * 在每帧更新时触发 Gizmo 更新回调。\n * @param _deltaTime 帧间隔\n */\n override update (_deltaTime: number): void {\n this.onUpdateCallback?.();\n }\n\n /** 触发 Gizmo 绘制回调。 */\n override draw (): void {\n this.drawCallBack?.();\n }\n\n /**\n * 记录鼠标进入位置并转发事件。\n * @param location 鼠标本地坐标\n */\n override onMouseEnter (location: Vector2): void {\n this.mouseInside = true;\n this.mousePosition.copyFrom(location);\n this.onMouseEnterCallback?.(location);\n }\n\n /**\n * 更新输入状态,并按按键状态分发移动或拖拽事件。\n * @param event 鼠标移动事件\n */\n override onMouseMove (event: InputEventMouseMotion): void {\n this.recordMouseInput(event);\n const hasPressedButtons = event.buttonMask !== MouseButtonMask.None;\n\n if (\n hasPressedButtons\n && this.dragThresholdState === DragThresholdState.Pending\n && isDragThresholdReached(\n this.dragStart.x,\n this.dragStart.y,\n event.position.x,\n event.position.y,\n )\n ) {\n this.dragThresholdState = DragThresholdState.Crossed;\n }\n\n if (hasPressedButtons) {\n this.onMouseDragCallback?.(event);\n } else {\n this.onMouseMoveCallback?.(event);\n }\n }\n\n /** 记录鼠标离开并转发事件。 */\n override onMouseLeave (): void {\n this.mouseInside = false;\n this.onMouseLeaveCallback?.();\n }\n\n /**\n * 更新输入状态并转发滚轮事件。\n * @param event 鼠标滚轮事件\n */\n override onMouseWheel (event: InputEventMouseButton): void {\n this.recordMouseInput(event);\n this.onMouseWheelCallback?.(event);\n }\n\n /**\n * 开始按键会话并记录拖拽起点。\n * @param event 鼠标按下事件\n */\n override onMouseDown (event: InputEventMouseButton): void {\n this.recordMouseInput(event);\n this.dragStart.copyFrom(event.position);\n this.dragThresholdState = DragThresholdState.Pending;\n this.onMouseDownCallback?.(event);\n }\n\n /**\n * 结束按键会话并重置拖拽阈值。\n * @param event 鼠标抬起事件\n */\n override onMouseUp (event: InputEventMouseButton): void {\n this.recordMouseInput(event);\n this.dragThresholdState = DragThresholdState.Idle;\n this.onMouseUpCallback?.(event);\n }\n\n /**\n * 更新修饰键状态并转发键盘按下事件。\n * @param event 键盘按下事件\n */\n override onKeyDown (event: InputEventKey): void {\n this.recordModifiers(event);\n this.onKeyDownCallback?.(event);\n }\n\n /**\n * 更新修饰键状态并转发键盘抬起事件。\n * @param event 键盘抬起事件\n */\n override onKeyUp (event: InputEventKey): void {\n this.recordModifiers(event);\n this.onKeyUpCallback?.(event);\n }\n\n /** @returns 当前鼠标本地坐标。 */\n getMousePosition (): Vector2 {\n return this.mousePosition;\n }\n\n /** @returns 鼠标是否位于控件内。 */\n isMouseInside (): boolean {\n return this.mouseInside;\n }\n\n /** @returns 当前是否有鼠标按钮按下。 */\n isMouseButtonPressed (): boolean {\n return this.mouseButtonMask !== MouseButtonMask.None;\n }\n\n /** @returns 当前按键会话是否已越过拖拽阈值。 */\n hasCrossedDragThreshold (): boolean {\n return this.dragThresholdState === DragThresholdState.Crossed;\n }\n\n /** @returns 使用当前输入快照创建的鼠标移动事件。 */\n createMouseEventAtCurrentPosition (): InputEventMouseMotion {\n const event = new InputEventMouseMotion();\n\n event.position.copyFrom(this.mousePosition);\n event.globalPosition.copyFrom(this.globalMousePosition);\n event.buttonMask = this.mouseButtonMask;\n event.pressed = this.isMouseButtonPressed();\n event.shiftPressed = this.shiftPressed;\n event.altPressed = this.altPressed;\n event.metaPressed = this.metaPressed;\n event.ctrlPressed = this.ctrlPressed;\n\n return event;\n }\n\n /** 释放回调和输入状态。 */\n override onDestroy (): void {\n this.onMouseEnterCallback = null;\n this.onMouseMoveCallback = null;\n this.onMouseDragCallback = null;\n this.onMouseLeaveCallback = null;\n this.onMouseWheelCallback = null;\n this.onMouseDownCallback = null;\n this.onMouseUpCallback = null;\n this.onKeyDownCallback = null;\n this.onKeyUpCallback = null;\n this.onUpdateCallback = null;\n this.drawCallBack = null;\n this.mousePosition.setZero();\n this.globalMousePosition.setZero();\n this.mouseInside = false;\n this.mouseButtonMask = MouseButtonMask.None;\n this.dragThresholdState = DragThresholdState.Idle;\n this.dragStart.setZero();\n this.shiftPressed = false;\n this.altPressed = false;\n this.metaPressed = false;\n this.ctrlPressed = false;\n super.onDestroy();\n }\n\n /**\n * 记录鼠标位置与修饰键状态。\n * @param event 鼠标事件\n */\n private recordMouseInput (event: InputEventMouse): void {\n this.mousePosition.copyFrom(event.position);\n this.globalMousePosition.copyFrom(event.globalPosition);\n this.mouseButtonMask = event.buttonMask;\n this.recordModifiers(event);\n }\n\n /**\n * 记录修饰键状态。\n * @param event 带修饰键的输入事件\n */\n private recordModifiers (event: InputEventWithModifiers): void {\n this.shiftPressed = event.shiftPressed;\n this.altPressed = event.altPressed;\n this.metaPressed = event.metaPressed;\n this.ctrlPressed = event.ctrlPressed;\n }\n}\n","import { type Engine, type InputEvent, type InputEventKey, type InputEventMouse, type InputEventMouseButton, type InputEventMouseMotion } from '@galacean/effects';\nimport { Control, MouseFilter, type ControlEvent } from '@galacean/effects-plugin-gui';\nimport { cursorMap, loadCursorIcons } from './cursor-icons';\nimport type { Gizmo } from './gizmo';\nimport type { GizmoOwner, SelectionTransformKind } from './gizmo-owner';\nimport { GizmoManager, type GizmoErrorPhase } from './gizmo-manager';\nimport { GestureCursorType, type GestureCursorResult } from './cursor';\nimport type { HoveringResults } from './selection/selection';\nimport type { ConfigManager } from './configs/config-manager';\nimport { selectionPreviewConfig } from './configs/builtin-configs';\nimport { Vector2, getTransformedBoxCorners } from './math';\nimport { FrameManager } from './frame/frame-manager';\nimport { Selection } from './selection/selection';\nimport { SnapManager } from './selection/snap-manager';\nimport { LoadingManager } from './gizmos/loading-manager';\nimport { LoadingGizmo } from './gizmos/loading-gizmo';\nimport { HandGizmo } from './gizmos/hand-gizmo';\nimport { IconGizmo } from './gizmos/icon-gizmo';\nimport { drawCorners, toColor } from './drawing';\nimport {\n getItemViewTransform,\n getPlayerItemById,\n pauseEffectsItem,\n pauseVideoItem,\n playEffectsItem,\n playVideoItem,\n} from './items';\nimport { GizmoViewportUtils, ViewportNavigationController } from './viewport';\nimport { GizmoTool } from './gizmo-tool';\nimport { HandGizmoTool } from './gizmo-tools/hand-gizmo-tool';\nimport { DefaultSelectionMode, type EditMode } from './modes';\nimport { GizmoViewport } from './viewport/gizmo-viewport';\nimport type { GizmoOwnerEvents } from './gizmo-action';\n\n/** Runtime Control 输入事件的派发阶段。 */\nenum ControlInputPhase {\n /** 鼠标进入交互区域。 */\n MouseEnter,\n /** 鼠标悬停移动。 */\n MouseMove,\n /** 鼠标拖拽移动。 */\n MouseDrag,\n /** 鼠标离开交互区域。 */\n MouseLeave,\n /** 鼠标滚轮输入。 */\n MouseWheel,\n /** 鼠标按下。 */\n MouseDown,\n /** 鼠标抬起。 */\n MouseUp,\n /** 键盘按下。 */\n KeyDown,\n /** 键盘抬起。 */\n KeyUp,\n}\n\n/** Gizmo 错误上报接口。 */\nexport interface GizmoErrorMonitor {\n /**\n * 上报指定阶段的 Gizmo 错误。\n * @param error 原始错误。\n * @param phase 错误发生阶段。\n * @param ctx 错误上下文。\n */\n report(error: unknown, phase: GizmoErrorPhase, ctx: {\n /** 发生错误的 Gizmo 类型。 */\n gizmoType?: string,\n }): void,\n}\n\n/** 接收运行时输入,并协调 Gizmo、选区和视口导航。 */\nexport class GestureHandler extends Control implements GizmoOwner {\n /** 抓手与滚轮共享的视口导航控制器。 */\n private viewportNavigation: ViewportNavigationController;\n\n /** 当前对外可观察的 hover 命中结果。 */\n private hoveringResults: HoveringResults = {};\n\n /** Runtime Control 输入入口;持有输入状态并完成 Move/Drag 分流。 */\n private gizmoViewport: GizmoViewport | undefined;\n\n /** 所有 Gizmo 共享的画板模型。 */\n private frameManager: FrameManager;\n\n /** 交互上下文共享的吸附器;跨图重建保持同一实例。 */\n private snapManager: SnapManager;\n\n /** 加载状态管理器。 */\n private loadingManager = new LoadingManager();\n\n /** Gizmo 生命周期管理器。 */\n private gizmoManager: GizmoManager;\n\n /** 当前激活的工具。 */\n private activeGizmoTool = new GizmoTool(this);\n\n /** 当前编辑模式。 */\n private editMode: EditMode;\n\n /** 选中状态与命中查询器。 */\n private selection: Selection;\n\n /** 当前 hover 的元素;用于在目标切换、离开或销毁时结束媒体预览。 */\n private hoveredMediaItemId: string | undefined;\n\n /** 错误上报器(按需注入,未注入时不生效)。 */\n private errorMonitor: GizmoErrorMonitor | undefined;\n\n /** 是否屏蔽所有交互。 */\n private _ignoreInteraction = false;\n /** 当前指针序列捕获的 Gizmo。 */\n private capturedGizmo: Gizmo | undefined;\n\n /** 独立于指针捕获者的选区变换状态。 */\n private selectionTransformKind: SelectionTransformKind = 'idle';\n /** 等待指针序列结束后销毁的退场 Gizmo。 */\n private gizmosToDispose: Gizmo[] = [];\n\n /**\n * 悬停目标变化时同步视频与动效预览。\n * @param preSelectedId 新悬停元素 ID。\n */\n private onPreselectChange = ({ preSelectedId }: { preSelectedId: string | undefined }): void => {\n const previousId = this.hoveredMediaItemId;\n const previewEnabled = this.gizmoManager.configs\n .get(selectionPreviewConfig)\n .videoPreSelectedPlay;\n\n if (preSelectedId && previewEnabled) {\n playVideoItem(this.engine, preSelectedId);\n playEffectsItem(this.engine, preSelectedId);\n }\n if (previousId) {\n pauseVideoItem(this.engine, previousId);\n pauseEffectsItem(this.engine, previousId);\n }\n\n this.hoveredMediaItemId = preSelectedId;\n };\n\n /**\n * 创建手势处理器并装配基础交互状态。\n * @param engine Effects 引擎。\n */\n constructor (engine: Engine) {\n super(engine);\n this.mouseFilter = MouseFilter.Pass;\n this.mouseForcePassScrollEvents = false;\n this.setAnchorsAndOffsetsPreset('fullRect');\n this.frameManager = new FrameManager(engine);\n this.gizmoManager = new GizmoManager();\n this.viewportNavigation = new ViewportNavigationController(this);\n this.selection = new Selection(engine, this.hoveringResults);\n this.snapManager = new SnapManager(this);\n this.editMode = this.createDefaultEditMode();\n\n this.selection.on('preselectchange', this.onPreselectChange);\n this.createViewport();\n void loadCursorIcons();\n }\n\n /** 订阅原生控件或 Gizmo 业务事件。 */\n override on<E extends keyof (ControlEvent & GizmoOwnerEvents)> (\n eventName: E,\n listener: (...args: (ControlEvent & GizmoOwnerEvents)[E]) => void,\n ): () => void;\n override on (eventName: any, listener: any): () => void {\n super.on(eventName, listener);\n\n return () => {\n this.off(eventName, listener);\n };\n }\n\n /** 取消原生控件或 Gizmo 业务事件订阅。 */\n override off<E extends keyof (ControlEvent & GizmoOwnerEvents)> (\n eventName: E,\n listener: (...args: (ControlEvent & GizmoOwnerEvents)[E]) => void,\n ): void;\n override off (eventName: any, listener: any): void {\n super.off(eventName, listener);\n }\n\n /** 发出 Gizmo 业务事件。 */\n emit<E extends keyof GizmoOwnerEvents> (eventName: E, ...args: GizmoOwnerEvents[E]): void {\n // Control does not expose emit yet; use its existing event storage.\n const emitter = (this as any).eventEmitter;\n\n emitter.emit(eventName, ...args);\n }\n\n /** 是否屏蔽交互。 */\n get ignoreInteraction (): boolean {\n return this._ignoreInteraction;\n }\n\n /**\n * 设置是否屏蔽所有 Gizmo 与选区交互。\n * @param state 是否屏蔽交互。\n */\n set ignoreInteraction (state: boolean) {\n if (state === this._ignoreInteraction) {\n return;\n }\n this._ignoreInteraction = state;\n }\n\n /** @returns 当前选区与命中查询对象。 */\n getSelection (): Selection {\n return this.selection;\n }\n\n /** @returns 当前画板管理器。 */\n getFrameManager (): FrameManager {\n return this.frameManager;\n }\n\n /** @returns 共享吸附管理器。 */\n getSnapManager (): SnapManager {\n return this.snapManager;\n }\n\n /** @returns 加载状态管理器。 */\n getLoadingManager (): LoadingManager {\n return this.loadingManager;\n }\n\n /** @returns 共享视口导航控制器。 */\n getViewportNavigation (): ViewportNavigationController {\n return this.viewportNavigation;\n }\n\n /** @returns 当前选区变换状态。 */\n getSelectionTransformKind (): SelectionTransformKind {\n return this.selectionTransformKind;\n }\n\n /**\n * 设置选区变换状态。\n * @param kind 选区变换状态。\n */\n setSelectionTransformKind (kind: SelectionTransformKind): void {\n this.selectionTransformKind = kind;\n }\n\n /** @returns 当前激活的编辑模式。 */\n getActiveEditMode (): EditMode {\n return this.editMode;\n }\n\n /**\n * 切换编辑模式并重建 Gizmo 图。\n * @param mode 新编辑模式。\n */\n setActiveEditMode (mode: EditMode): void {\n if (mode === this.editMode) {\n return;\n }\n this.commitEditMode(mode);\n this.redispatchMouseAtCurrentPosition();\n }\n\n /** 恢复新的默认编辑模式。 */\n resetEditMode (): void {\n if (this.editMode instanceof DefaultSelectionMode) {\n return;\n }\n this.setActiveEditMode(this.createDefaultEditMode());\n }\n\n /** 初始化当前工具与编辑模式对应的 Gizmo 图。 */\n init (): void {\n try {\n this.rebuildGizmos();\n } catch (error) {\n this.errorMonitor?.report(error, 'gizmo-init', { gizmoType: 'unknown' });\n throw error;\n }\n }\n\n /** @returns 当前鼠标的 Control 本地坐标。 */\n getMousePosition (): Vector2 {\n return this.gizmoViewport?.getMousePosition() ?? new Vector2();\n }\n\n /**\n * 更新交互层的 CSS 光标。\n * @param result Gizmo 光标结果。\n */\n setCursor (result: GestureCursorResult): void {\n const control = this.gizmoViewport;\n\n if (!control) {\n return;\n }\n let cssCursor = 'default';\n\n if (result.type === GestureCursorType.CIRCLE) {\n const radius = result.radius || 10;\n const svgStr = encodeURIComponent(`<svg width=\"${radius * 2}\" height=\"${radius * 2}\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"${radius}\" cy=\"${radius}\" r=\"${radius}\" fill=\"rgba(255, 255, 255, 0.6)\" stroke=\"#6A34FF\" stroke-width=\"1\" /></svg>`);\n\n cssCursor = `url(\"data:image/svg+xml,${svgStr}\") ${radius} ${radius}, auto`;\n } else {\n const cursor = cursorMap[result.type];\n\n if (cursor?.type === 'svg') {\n const pointerShift = 16;\n const svg = encodeURIComponent(cursor.content.replace('rotate(0.00)', `rotate(${result.angle ?? 0})`));\n\n cssCursor = `url(\"data:image/svg+xml,${svg}\") ${pointerShift} ${pointerShift}, auto`;\n } else if (cursor?.type === 'preset') {\n cssCursor = cursor.content;\n }\n }\n control.defaultCursorShape = cssCursor;\n }\n\n /** @returns 当前 Gizmo 生命周期管理器。 */\n getGizmoManager (): GizmoManager {\n return this.gizmoManager;\n }\n\n /** @returns Effects 引擎。 */\n getEngine (): Engine {\n return this.engine;\n }\n\n /** @returns Gizmo 配置管理器。 */\n getConfigManager (): ConfigManager {\n return this.gizmoManager.configs;\n }\n\n /** @returns 当前是否为抓手工具。 */\n isHandToolMode (): boolean {\n return this.activeGizmoTool instanceof HandGizmoTool;\n }\n\n /** @returns 当前是否有鼠标按键按下。 */\n isMouseButtonPressed (): boolean {\n return this.gizmoViewport?.isMouseButtonPressed() ?? false;\n }\n\n /** 重建公共 Gizmo 与当前工具或编辑模式的 Gizmo 图。 */\n rebuildGizmos (): void {\n const specificGizmos = this.activeGizmoTool.createGizmos();\n\n this.gizmosToDispose.push(...this.gizmoManager.activeGizmos);\n this.gizmoManager.activeGizmos = [\n ...this.createCommonBeforeToolSwitch(),\n ...specificGizmos,\n ];\n }\n\n /**\n * 切换活动工具并协调编辑模式。\n * @param gizmoTool 新活动工具。\n */\n setActiveTool (gizmoTool: GizmoTool): void {\n this.activeGizmoTool = gizmoTool;\n this.commitEditMode(this.resolveEditModeForTool(gizmoTool));\n this.disposeQueuedGizmos();\n }\n\n /**\n * 注入错误上报器(由宿主调用,未注入时不影响现有行为)。\n * @param reporter 错误上报器实例\n */\n setErrorMonitor (reporter?: GizmoErrorMonitor): void {\n this.errorMonitor = reporter;\n }\n\n /** 释放资源:解绑订阅、清交互状态,并销毁当前 Gizmo 图。 */\n override onDestroy (): void {\n this.editMode.onExit?.();\n this.clearCapturedGizmo();\n this.selection.off('preselectchange', this.onPreselectChange);\n if (this.hoveredMediaItemId) {\n pauseVideoItem(this.engine, this.hoveredMediaItemId);\n pauseEffectsItem(this.engine, this.hoveredMediaItemId);\n this.hoveredMediaItemId = undefined;\n }\n this.clearCapturedGizmo();\n this.disposeQueuedGizmos();\n this.gizmoManager.dispose();\n this.viewportNavigation.dispose();\n\n this.selectionTransformKind = 'idle';\n this.setCursor({ type: GestureCursorType.NORMAL, angle: 0 });\n this.gizmoViewport = undefined;\n super.onDestroy();\n }\n\n /** 每帧更新入口:先刷新 Frame 投影,再同步当前 Gizmo 图。 */\n override update (deltaTime: number): void {\n this.frameManager.onUpdate();\n this.gizmoManager.onUpdate();\n super.update(deltaTime);\n }\n\n /** 创建填满交互根控件的输入与绘制子控件。 */\n private createViewport (): void {\n const gizmoViewport = this.addChild(new GizmoViewport(this.engine));\n\n gizmoViewport.onMouseEnterCallback = () => {\n this.dispatchInput(ControlInputPhase.MouseEnter, gizmoViewport.createMouseEventAtCurrentPosition());\n };\n gizmoViewport.onMouseMoveCallback = event => {\n this.dispatchInput(ControlInputPhase.MouseMove, event);\n };\n gizmoViewport.onMouseDragCallback = event => {\n this.dispatchInput(ControlInputPhase.MouseDrag, event);\n };\n gizmoViewport.onMouseLeaveCallback = () => {\n this.dispatchInput(ControlInputPhase.MouseLeave, gizmoViewport.createMouseEventAtCurrentPosition());\n };\n gizmoViewport.onMouseWheelCallback = event => {\n this.dispatchInput(ControlInputPhase.MouseWheel, event);\n };\n gizmoViewport.onMouseDownCallback = event => {\n this.dispatchInput(ControlInputPhase.MouseDown, event);\n };\n gizmoViewport.onMouseUpCallback = event => {\n this.dispatchInput(ControlInputPhase.MouseUp, event);\n };\n gizmoViewport.onKeyDownCallback = event => {\n this.dispatchInput(ControlInputPhase.KeyDown, event);\n };\n gizmoViewport.onKeyUpCallback = event => {\n this.dispatchInput(ControlInputPhase.KeyUp, event);\n };\n gizmoViewport.drawCallBack = () => {\n this.drawGizmos(gizmoViewport);\n };\n this.gizmoViewport = gizmoViewport;\n }\n\n /**\n * 按退出、重建、进入的顺序提交编辑模式。\n * @param nextMode 新编辑模式。\n */\n private commitEditMode (nextMode: EditMode): void {\n const previousMode = this.editMode;\n const modeChanged = previousMode !== nextMode;\n\n if (modeChanged) {\n previousMode.onExit?.();\n this.editMode = nextMode;\n }\n\n this.rebuildGizmos();\n\n if (modeChanged) {\n nextMode.onEnter?.();\n }\n }\n\n /**\n * 解析指定工具可继续使用的编辑模式。\n * @param tool 目标工具。\n * @returns 可用编辑模式。\n */\n private resolveEditModeForTool (tool: GizmoTool): EditMode {\n if (\n this.editMode.canRemainActiveForTool(tool)\n || this.editMode instanceof DefaultSelectionMode\n ) {\n return this.editMode;\n }\n\n return this.createDefaultEditMode();\n }\n\n /** @returns 新建的默认编辑模式。 */\n private createDefaultEditMode (): EditMode {\n return new DefaultSelectionMode(this);\n }\n\n /**\n * 按输入阶段派发 Runtime Control 事件。\n * @param phase 输入阶段。\n * @param input 已归一化的输入事件。\n */\n private dispatchInput (\n phase: ControlInputPhase,\n input: InputEvent,\n ): void {\n // 步骤 1:跳过已接受或被全局屏蔽的事件。\n if (!this.ignoreInteraction && !input.isAccepted()) {\n // 步骤 2:将滚轮、鼠标和键盘事件路由到对应处理器。\n switch (phase) {\n case ControlInputPhase.MouseWheel: {\n const viewportChanged = this.viewportNavigation.handleWheel(\n input as InputEventMouseButton,\n Boolean(this.capturedGizmo),\n );\n\n if (viewportChanged) {\n this.redispatchMouseAtCurrentPosition();\n }\n\n break;\n }\n case ControlInputPhase.MouseEnter:\n case ControlInputPhase.MouseMove:\n case ControlInputPhase.MouseDrag:\n case ControlInputPhase.MouseLeave:\n case ControlInputPhase.MouseDown:\n case ControlInputPhase.MouseUp:\n this.handleMouseInput(phase, input as InputEventMouse);\n\n break;\n case ControlInputPhase.KeyDown: {\n const event = input as InputEventKey;\n\n this.emit('keyDown', event);\n if (!event.isAccepted()) {\n this.handleKeyboardEvent(event, 'down');\n }\n\n break;\n }\n case ControlInputPhase.KeyUp: {\n const event = input as InputEventKey;\n\n this.emit('keyUp', event);\n if (!event.isAccepted()) {\n this.handleKeyboardEvent(event, 'up');\n }\n\n break;\n }\n }\n }\n // 步骤 3:在当前事件出口释放可安全销毁的退场 Gizmo。\n this.disposeQueuedGizmos();\n }\n\n /** @returns 所有工具共享的视口 Gizmo。 */\n private createCommonBeforeToolSwitch (): Gizmo[] {\n return [\n new HandGizmo(this),\n new IconGizmo(this),\n new LoadingGizmo(this, this.loadingManager),\n ];\n }\n\n /** @returns 抓手 Gizmo 当前是否正在平移或等待平移。 */\n private isPanning (): boolean {\n return this.gizmoManager.get('hand')?.isPanning() ?? false;\n }\n\n /**\n * 处理鼠标阶段并维护指针捕获。\n * @param phase 输入阶段。\n * @param event 鼠标事件。\n */\n private handleMouseInput (\n phase: ControlInputPhase,\n event: InputEventMouse,\n ): void {\n if (phase === ControlInputPhase.MouseDown) {\n this.clearCapturedGizmo();\n }\n\n const savedOwner = this.capturedGizmo;\n\n // 抬起事件派发前释放持久捕获,但保留本轮接收者。\n if (phase === ControlInputPhase.MouseUp) {\n this.clearCapturedGizmo();\n }\n\n let winner: Gizmo | undefined;\n\n if (this.canDispatchMouseEvent(phase, savedOwner)) {\n this.setCursor({ type: GestureCursorType.NORMAL, angle: 0 });\n winner = this.dispatchMouseEvent(savedOwner, phase, event);\n }\n\n if (phase === ControlInputPhase.MouseDown) {\n this.capturedGizmo = winner;\n }\n\n if (phase === ControlInputPhase.MouseUp) {\n this.redispatchMouseAtCurrentPosition();\n }\n }\n\n /**\n * 向本轮捕获者或活动候选派发鼠标事件。\n * @param localOwner 本轮捕获者。\n * @param phase 输入阶段。\n * @param event 鼠标事件。\n * @returns 接受事件的 Gizmo。\n */\n private dispatchMouseEvent (\n localOwner: Gizmo | undefined,\n phase: ControlInputPhase,\n event: InputEventMouse,\n ): Gizmo | undefined {\n this.selection.clearHover();\n\n if (localOwner) {\n this.invoke(localOwner, phase, event);\n\n return localOwner;\n }\n\n // 使用候选快照,图重建只影响下一轮派发。\n const candidates = [...this.gizmoManager.activeGizmos];\n\n for (const gizmo of candidates) {\n this.prepareForDispatch(gizmo, phase);\n }\n\n for (const gizmo of candidates) {\n if (this.invoke(gizmo, phase, event)) {\n return gizmo;\n }\n }\n\n return undefined;\n }\n\n /**\n * 判断当前鼠标轮次是否可以进入行为派发。\n * @param phase 输入阶段。\n * @param savedOwner 本轮开始时的捕获者。\n * @returns 是否允许派发。\n */\n private canDispatchMouseEvent (\n phase: ControlInputPhase,\n savedOwner: Gizmo | undefined,\n ): boolean {\n if (\n phase === ControlInputPhase.MouseDrag\n && !this.gizmoViewport?.hasCrossedDragThreshold()\n && (!savedOwner || savedOwner.requiresDragThreshold())\n ) {\n return false;\n }\n\n if (savedOwner) {\n return true;\n }\n\n switch (phase) {\n case ControlInputPhase.MouseDown:\n case ControlInputPhase.MouseMove:\n case ControlInputPhase.MouseLeave:\n return true;\n case ControlInputPhase.MouseEnter:\n case ControlInputPhase.MouseDrag:\n case ControlInputPhase.MouseUp:\n case ControlInputPhase.MouseWheel:\n case ControlInputPhase.KeyDown:\n case ControlInputPhase.KeyUp:\n return false;\n }\n }\n\n /** 释放持久指针捕获。 */\n private clearCapturedGizmo (): void {\n this.capturedGizmo = undefined;\n }\n\n /** 在最新鼠标位置重新派发移动或拖拽事件。 */\n private redispatchMouseAtCurrentPosition (): void {\n const localOwner = this.capturedGizmo;\n const viewport = this.gizmoViewport;\n\n if (!viewport || (!localOwner && !viewport.isMouseInside())) {\n return;\n }\n\n const event = viewport.createMouseEventAtCurrentPosition();\n\n this.setCursor({ type: GestureCursorType.NORMAL, angle: 0 });\n this.dispatchMouseEvent(\n localOwner,\n localOwner ? ControlInputPhase.MouseDrag : ControlInputPhase.MouseMove,\n event,\n );\n }\n\n /** 在捕获者不属于退场图时释放待销毁 Gizmo。 */\n private disposeQueuedGizmos (): void {\n if (\n this.capturedGizmo\n && this.gizmosToDispose.includes(this.capturedGizmo)\n ) {\n return;\n }\n\n const gizmosToDispose = this.gizmosToDispose;\n\n this.gizmosToDispose = [];\n for (const gizmo of gizmosToDispose) {\n gizmo.dispose();\n }\n }\n\n /**\n * 准备单个派发候选并隔离错误。\n * @param gizmo 候选 Gizmo。\n * @param phase 输入阶段。\n */\n private prepareForDispatch (gizmo: Gizmo, phase: ControlInputPhase): void {\n try {\n gizmo.prepareForDispatch?.();\n } catch (error) {\n this.handleGizmoError(error, this.errorPhaseFor(phase), gizmo.type);\n }\n }\n\n /**\n * 调用 Gizmo 对应的鼠标阶段并隔离错误。\n * @param gizmo 目标 Gizmo。\n * @param phase 输入阶段。\n * @param event 鼠标事件。\n * @returns Gizmo 是否接受事件。\n */\n private invoke (gizmo: Gizmo, phase: ControlInputPhase, event: InputEventMouse): boolean {\n try {\n switch (phase) {\n case ControlInputPhase.MouseEnter:\n break;\n case ControlInputPhase.MouseDown:\n gizmo.onMouseDown(event as InputEventMouseButton);\n\n break;\n case ControlInputPhase.MouseMove:\n gizmo.onMouseMove(event as InputEventMouseMotion);\n\n break;\n case ControlInputPhase.MouseDrag:\n gizmo.onMouseDrag(event as InputEventMouseMotion);\n\n break;\n case ControlInputPhase.MouseUp:\n gizmo.onMouseUp(event as InputEventMouseButton);\n\n break;\n case ControlInputPhase.MouseLeave:\n gizmo.onMouseLeave();\n\n break;\n case ControlInputPhase.MouseWheel:\n case ControlInputPhase.KeyDown:\n case ControlInputPhase.KeyUp:\n break;\n }\n } catch (error) {\n event.clearAccepted();\n this.handleGizmoError(error, this.errorPhaseFor(phase), gizmo.type);\n }\n\n return event.isAccepted();\n }\n\n /**\n * 按活动 Gizmo 快照派发键盘事件。\n * @param event 键盘事件。\n * @param phase 键盘输入阶段。\n */\n private handleKeyboardEvent (\n event: InputEventKey,\n phase: 'down' | 'up',\n ): void {\n for (const gizmo of [...this.gizmoManager.activeGizmos]) {\n try {\n if (phase === 'down') {\n gizmo.onKeyDown(event);\n } else {\n gizmo.onKeyUp(event);\n }\n } catch (error) {\n event.clearAccepted();\n this.handleGizmoError(error, 'gizmo-key', gizmo.type);\n }\n if (event.isAccepted()) {\n break;\n }\n }\n\n this.redispatchMouseAtCurrentPosition();\n }\n\n /**\n * 将输入阶段映射为错误上报阶段。\n * @param phase 输入阶段。\n * @returns 错误上报阶段。\n */\n private errorPhaseFor (phase: ControlInputPhase): GizmoErrorPhase {\n switch (phase) {\n case ControlInputPhase.MouseDown:\n return 'gizmo-actionstart';\n case ControlInputPhase.MouseEnter:\n case ControlInputPhase.MouseMove:\n case ControlInputPhase.MouseDrag:\n case ControlInputPhase.MouseLeave:\n case ControlInputPhase.MouseWheel:\n return 'gizmo-actionupdate';\n case ControlInputPhase.MouseUp:\n return 'gizmo-actioncommit';\n case ControlInputPhase.KeyDown:\n case ControlInputPhase.KeyUp:\n return 'gizmo-key';\n }\n }\n\n /**\n * 按悬停框、活动 Gizmo、吸附提示的顺序绘制交互层。\n * @param gizmoControl 绘制控制器。\n */\n private drawGizmos (gizmoControl: GizmoViewport): void {\n this.drawHoverOverlay(gizmoControl);\n\n for (const gizmo of this.gizmoManager.activeGizmos ?? []) {\n this.drawGizmo(gizmo, gizmoControl);\n }\n this.drawSnappingVisualizations(gizmoControl);\n }\n\n /**\n * 绘制当前悬停元素的底层轮廓。\n * @param gizmoControl 绘制控制器。\n */\n private drawHoverOverlay (gizmoControl: GizmoViewport): void {\n if (this.isPanning()) {\n return;\n }\n const itemId = this.selection.hoverOverlayItemId;\n\n if (!itemId) {\n return;\n }\n const item = getPlayerItemById(this.engine.sceneServer.compositions[0], itemId);\n const transform = item ? getItemViewTransform(item, GizmoViewportUtils.getContainerSize(this.engine.canvas.parentElement!)) : undefined;\n\n if (!transform) {\n return;\n }\n const config = this.getConfigManager().get(selectionPreviewConfig);\n\n drawCorners(gizmoControl, getTransformedBoxCorners(transform), toColor(config.preSelectedColor, 1), config.preSelectedWidth);\n }\n\n /**\n * 绘制单个 Gizmo 并隔离错误。\n * @param gizmo 目标 Gizmo。\n * @param gizmoControl 绘制控制器。\n */\n private drawGizmo (gizmo: Gizmo, gizmoControl: GizmoViewport): void {\n try {\n gizmo.draw(gizmoControl);\n } catch (error) {\n this.errorMonitor?.report(error, 'gizmo-draw', { gizmoType: gizmo.type });\n }\n }\n\n /**\n * 绘制当前吸附提示。\n * @param control 绘制控制器。\n */\n private drawSnappingVisualizations (control: GizmoViewport): void {\n const visualizations = this.snapManager.getSnappingVisualizations();\n\n if (visualizations.length === 0) {\n return;\n }\n\n const { lineWidth, lineColor } = this.snapManager.config;\n const color = toColor(lineColor, 1);\n\n for (const line of visualizations) {\n control.drawLine(\n line.start.x,\n line.start.y,\n line.end.x,\n line.end.y,\n color,\n lineWidth,\n );\n }\n }\n\n /**\n * 上报 Gizmo 错误并重置共享交互状态。\n * @param error 原始错误。\n * @param phase 错误发生阶段。\n * @param gizmoType 发生错误的 Gizmo 类型。\n */\n private handleGizmoError (\n error: unknown,\n phase: GizmoErrorPhase,\n gizmoType?: string,\n ): void {\n this.errorMonitor?.report(error, phase, { gizmoType });\n\n this.clearCapturedGizmo();\n this.selectionTransformKind = 'idle';\n this.snapManager.reset();\n }\n}\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\nexport { _async_to_generator as _ };\n","function _set_prototype_of(o, p) {\n _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {\n o.__proto__ = p;\n\n return o;\n };\n\n return _set_prototype_of(o, p);\n}\nexport { _set_prototype_of as _ };\n","import { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });\n\n if (superClass) _set_prototype_of(subClass, superClass);\n}\nexport { _inherits as _ };\n","function _is_native_reflect_construct() {\n // Since Reflect.construct can't be properly polyfilled, some\n // implementations (e.g. core-js@2) don't set the correct internal slots.\n // Those polyfills don't allow us to subclass built-ins, so we need to\n // use our fallback implementation.\n try {\n // If the internal slots aren't set, this throws an error similar to\n // TypeError: this is not a Boolean object.\n var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));\n } catch (_) {}\n return (_is_native_reflect_construct = function() {\n return !!result;\n })();\n}\n\nexport { _is_native_reflect_construct as _ };\n","import { _ as _is_native_reflect_construct } from \"./_is_native_reflect_construct.js\";\nimport { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\nfunction _construct(Parent, args, Class) {\n if (_is_native_reflect_construct()) _construct = Reflect.construct;\n else {\n _construct = function construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n\n if (Class) _set_prototype_of(instance, Class.prototype);\n\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}\nexport { _construct as _ };\n","function _get_prototype_of(o) {\n _get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n\n return _get_prototype_of(o);\n}\nexport { _get_prototype_of as _ };\n","import { _ as _construct } from \"./_construct.js\";\nimport { _ as _get_prototype_of } from \"./_get_prototype_of.js\";\nimport { _ as _is_native_function } from \"./_is_native_function.js\";\nimport { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _wrap_native_super(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n _wrap_native_super = function(Class) {\n if (Class === null || !_is_native_function(Class)) return Class;\n if (typeof Class !== \"function\") throw new TypeError(\"Super expression must either be null or a function\");\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, _get_prototype_of(this).constructor);\n }\n Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } });\n\n return _set_prototype_of(Wrapper, Class);\n };\n\n return _wrap_native_super(Class);\n}\nexport { _wrap_native_super as _ };\n","function _is_native_function(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\nexport { _is_native_function as _ };\n","function _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\nexport { _array_like_to_array as _ };\n","import { _ as _unsupported_iterable_to_array } from \"./_unsupported_iterable_to_array.js\";\n\nfunction _create_for_of_iterator_helper_loose(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n\n if (it) return (it = it.call(o)).next.bind(it);\n // Fallback for engines without symbol support\n if (Array.isArray(o) || (it = _unsupported_iterable_to_array(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n\n var i = 0;\n\n return function() {\n if (i >= o.length) return { done: true };\n\n return { done: false, value: o[i++] };\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _create_for_of_iterator_helper_loose as _ };\n","import { _ as _array_like_to_array } from \"./_array_like_to_array.js\";\n\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n\n var n = Object.prototype.toString.call(o).slice(8, -1);\n\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\nexport { _unsupported_iterable_to_array as _ };\n","function _instanceof(left, right) {\n if (right != null && typeof Symbol !== \"undefined\" && right[Symbol.hasInstance]) {\n return !!right[Symbol.hasInstance](left);\n } else return left instanceof right;\n}\nexport { _instanceof as _ };\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import { glContext } from '@galacean/effects';\n\n// 坐标轴默认颜色\nexport const color = {\n xAxisColor: [216 / 255, 178 / 255, 76 / 255],\n yAxisColor: [38 / 255, 149 / 255, 235 / 255],\n zAxisColor: [134 / 255, 74 / 255, 245 / 255],\n};\nexport const renderMode = glContext.TRIANGLES;\n// 坐标轴默认图标\nexport const axisIconMap: Map<string, string> = new Map();\n\naxisIconMap.set(\n 'light', `data:image/png;base64,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`\n);\naxisIconMap.set(\n 'camera', `data:image/png;base64,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`\n);\naxisIconMap.set(\n 'posX', `data:image/png;base64,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\n RK5CYII=`\n);\naxisIconMap.set(\n 'posY', `data:image/png;base64,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`\n);\naxisIconMap.set(\n 'posZ', `data:image/png;base64,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`\n);\naxisIconMap.set(\n 'negX', `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABmCAYAAAFKLQTJAAABYWlDQ1BrQ0dDb2xvcl\n NwYWNlRGlzcGxheVAzAAAokWNgYFJJLCjIYWFgYMjNKykKcndSiIiMUmB/yMAOhLwMYgwKicnFBY4BAT5AJQwwGhV8u8bACKI\n v64LMOiU1tUm1XsDXYqbw1YuvRJsw1aMArpTU4mQg/QeIU5MLikoYGBhTgGzl8pICELsDyBYpAjoKyJ4DYqdD2BtA7CQI+whY\n TUiQM5B9A8hWSM5IBJrB+API1klCEk9HYkPtBQFul8zigpzESoUAYwKuJQOUpFaUgGjn/ILKosz0jBIFR2AopSp45iXr6SgYG\n RiaMzCAwhyi+nMgOCwZxc4gxJrvMzDY7v////9uhJjXfgaGjUCdXDsRYhoWDAyC3AwMJ3YWJBYlgoWYgZgpLY2B4dNyBgbeSA\n YG4QtAPdHFacZGYHlGHicGBtZ7//9/VmNgYJ/MwPB3wv//vxf9//93MVDzHQaGA3kAFSFl7jXH0fsAAAA4ZVhJZk1NACoAAAA\n IAAGHaQAEAAAAAQAAABoAAAAAAAKgAgAEAAAAAQAAAGSgAwAEAAAAAQAAAGYAAAAAdrOvGwAAFQlJREFUeAHtXQuQXFWZPufc\n 7nEmT8Agj4INBOZBpXZlTdx1A7VA5LFMpicJbuQRXB5qMLggYkG5taJZQKVgRVxZeVgVoJSUGCVJ98xoDAmCEFclSm1VypkMJ\n LI8IhjekEnSfe/Z77895/a5957uPv2Y6Z5kbtXMef3n/8///+d9/nOasSo+rucZ7E8tZq5cr8cpf1dvXwAbeAbTPTIPwD+uAA\n uu3Ex+lVFQYDCTeoVcxkwZCvEKsU8pHyiWwcc2+k9u5jx5qk9Jjy7l51z2S5l9VgxlUn8sBainSSnupLAA96/qCTZ+0ZXKnGk\n DmIfJSzHgCRL5gE1mErufqXP6/KRkcqB0pjwVgvEz8bNW5RjnP2WMEgqJBMCl9yEVp5Qb1AgCoE8pMB/K/3cYP7O9N/OEHleR\n P0TFRIGwqSKRP8hQAA5XI+Gxdk/Ie1VGPwMBQ7FPcMZvpgTzJzc7iZkzeTHM0UwOZwlXyo2jigwXIwpMYVeyHLmjGchr91WXI\n cHlcXb4USTOxYqcZA+Vy4B6t4ZgArHmM5RiXm4Oam5Bk+EKmEeSr5hO4sTWgEI+gbGhdOoXIH2OCiu3gFCrGiox6j7fv7Qj62\n aHovF6WEeoxyt/UP9UBLmFGqPFcrbTcdh1bo6/T7Foul1MyrtRD0M4OOfPd6YyJ2s5wwAh5JztYJKv1IHL+wuy5py905nqm0l\n 5glKECBTtxcuTyUMUiJEoQ9UEnO9FRMoWVWm4AiGxI5O6VgHXjwBhLNRr9CvyG4rIWLnCSfK/HwvkkEowxoR0kidWYLM24nmd\n QOv7fCKEbMxrlyoxJiKr0cCuUGFdeYU4s08w7x88xm9VqXovEHCiEsl9oe+Sw0e8d97Q42z9OnKVx0hEJeou5jQDUsrz9Tj03\n l/v6sl8JRTXqEBZTgbTqV2YbJxQtIBc3NqVSt9UNB0JRYmEa1spFKNpnL3Qleo7wQQZIzKcSX0EA/62KDC68NvQrW9S8cj4eQ\n xWF6iwcssqfjDTezuT3g0qA/jchu7+xiBc1FPoDAkkSijgZHhgyUluLvdcAU9lLV867GjuyodVfp1QMEmphQAh5i77M7qQsxU\n RXac+ET2iklauECpXSi7Rdu5S4R39qR7yB5yMJrysAKp2PZZReT1X+n6BKY0/k8on8H9RALW4mN926/mxmpEX6xH18GMivV/h\n Gcr09AfiAvUnVUI9XbSt7oAI2sfqeiLXcRWIiMRf9IR6+gtEuDe/noh1XAERyG7MxoWACIbdpE69Xn4hnHMErcnqhVDhQfcSt\n PqOng2Pifbuh99RiWolXAhX58Mw/dd6Tl9coHxREMnlLYG/Kk+h21c9sU8EU/xHAnySLcCOSNCbBvFWHvkLBYbG/XTBr3xw9d\n 4YI+HbqHGxkU8Dj3gLHFCC4oL8waBFAfp0QhQWnK32JA8GI4oLf/InCB+ux+kEKD5GhCKjhCjO6uMsjcnE4iiskYgCqoRYtPQ\n KB7kliSjAwYHUQp5jmzAsBI0XNXJny7RZc08868F9Cq6Ya0WkWOZovHxmRXJ49+6VGE960eYWouLE8KNwL2HXKi0FX9PVnQ5q\n YBRXpeEYIVsEGPCuR0G/ZQtvBcf57sNaDms/+rwf+FsFVnlGgSpiBFOOvVB9WyUEaoIV4uqunvQ9NjjKMrKjr3eF53n3lUKGq\n rQdlejfuMxvupSCjaZhLtiNCeGXovF6GJ2g19mbcfS4qL8oI0N9vZdJz3swmkGFk0L2ZD0xosL1crHzdK30ZKxbIvxoXxKjRd\n AZ6DSNjBTrrgTjmzzGbtMRjJVfONzxXC8YmnQ6YOhuMHRNKE4PDGWWfphOB/Q48mOMfAmHAJdF48cjjGo7BYoI1giKJqqbi+q\n WKIRHfeiFPo5e6DGVoFxI5hLPrfwAQ+Wvn+ufTgRbTgqvGsD8+iblMsfMhDi3OZigYvNuTGpeVQwodzDTs9tPpX+mNoF6+CWs\n L2PVTCFonBuecVE5HM7niV0/W3KCqVDNyQTmC4z/c7S8tDkjDmTd+6MJ0MY3o3HNEkY3+6apLOhRZWwvGPPdrSbgZo4T2MJ6L\n VpAwZzQxDya3oxhaITH9h5wpndpMxa2VJn8kd3Ua6G7M5z6l0I1PmkYLz6D85fQVha65d/44whGyS3RYmCWq22uRVMbF44yQS\n XB6d/HfEYw1MekD1UdhY7g9sYV2UQ5PoZw7iwiSJ8R8qihnvzBJ9k89Nwbg3CDPJjrnWLa5RFcXNeZ2uAbVsRmvzi3wLanbDG\n U+b/QbjYY4sc4Kq4FItiSFF1zzk8PKeIxRigBi6lFWEz1KSDdxb7KTzDOWK3a9HyV+JNCiKznBkcmet5iaxIjIyojlrZPodGf\n psIxl7N7MQ6tjcVXETFq+LEeWYsupafOapty/IK1xsVcSUZUeWw3GmhJKjlby5l4RErvbZU/5gr2UezTXomJU0csLRrBeRYmT\n aaqHoK0YkTPMdiXupd58io9rt5+EkirmD5rds8a47zKRK9iRqJIyALBk/I70fjKwvwZJ9Ha3d69dswOHyorTwOha9aIXvbBgd\n 7T0EouQf3vxYrzOD2N/NTj4P8WEE23H3PMPXz+/dkoTLXhmhnBofAtOPSq4RSH/ynpJM47adG6HdUyQfmqYuTPGz819a0Dbw1\n D8sfUQjyal5bX2ObxTTajaeXCFTOCxf6fUEFml0NcU7rDl3QtylQ0i7BmZLCvdyXzvO/VVMAKMqMLHsFkdoptFitGYPnyHI7U\n TiqH1G/Mkq/DVHSz9NhgFN5JyKmeyxdgtvBJaHVONN0Uph2S9lTm96Y0Pa4sI5imwAq0cPiiZ1Z+bF5/CyO6PwtVcTYuNq+ng\n qFvohBzS8Fj6nVVR086tkmi5ynJiHnlWMguPP45T7DhQkwNPlr7+MuGIji4uAPWQkVNZIoygvkVBmxzr8YF34Cqg2l9fb+k8N\n qyHjfOuokSF+Lyzp70QyaqRkbABJ23zjBlkA5fTqY0prS6xXF5D7RjnFA6icTJ7d3rn4/SClaIKgFMfLcYE8IR5445E1QQGNX\n SEYYqk+6G7ZkKKSGNDA8sn+Hm3jZOv9Ejne3bGhXyjrkPncxXUcAzYoRw1oip/bF6fEgjXs5s1YimkhpvJqiQGEtuprMZvcC+\n HzMKOsvR4wNGyJILEoif08HaC1LZq2caT3+xA6bogVTAiLIWixRyP9MsyiJp4xakwyYTMbTnYBvLZySqJpUJoyoO/hv/jR42v\n RwtCTql4ITNZ0Sy7M+jQHQ6pC52RNMaEUaPeYWJLp22UXy+akl2dAxIMmPGGNw4RaDqQ6481lZ3ZPb9gIogyBzXVBYs5bBR11\n yf4DJm0IwO6mIqJd0suCVaXHR5/dG4ZgiXOg4UaDAh81MqsCfFA81QcNsy0Dlo0P3qmTBuWO8n6fnGw49B8skonWzO7TUyEgV\n sqjCXMRsvmJUsmniMeDLYgVcCRg36qwnHiMfF64qBgiuPnXCM4HAHNSn8YahwJhwjWKt8MMyGH3pl4jHCc3PijPCJxwjGvQVR\n RtAlq5vB4ST0AjG7qDBEA0OcnxWlLpIyjevB/DfRBDDyqWhc04QNNxLa/ymzne45x3bSTYfyzcBIqQvcgq4tNEMhbcqQlSxmw\n ID24Vtt+L0WdkhitueIC+5o2BAZDxhU+aOidERixlKKG+1+nU9EAaL3QKLp4x4uYk6i7sD4jCgziGjhsGhZE41rRNjvRQ37wv\n SOgSrPqEagGth1qEjlkirzdiAqpjEuBJo2Ue5Mpb+v4gNGOlJp4xEzBqC7FXBD3PxNpsBQWZUBbfgi5Sc3YIQCZKhCbvwzG7b\n E4eodAxt5w0iOPcgDoRtVIBtihKxt0J3FFi754hWuUNW7uCZ8qNJ01etaU1rn9HlTo/FoBvGv1NlIEnfysjAdiueqXwx2S1Z6\n ksXse4kCTq96cHoV2xwJaUQVpdjVBkon8yO6969g6+2i7j9ajAlYHDxgYoLKYGSEEsikiFzTl3+8QPaRaZIpvao4LpeRlRzGr\n 5mm/FTlcZRwpSmN4oxVSwEPD1zzATe3Kzbqq/RR900u5dWSi9ci8VZBVKPl0EDRAvpI8CQSmDBWNUWkJCMKCM9PHLC6B0tPuJ\n Adscd+p/JGXQxiMyXzLsSVpGUYH4rWCJUPVc3KGsKKEUIKi4cN6ArHdXe+Tcw4wtZmy5oRYobe6tjnvbvHRpIEX/Un+H14huN\n zleSviBGFeDidOsNl8pcqXC8XDXoTzDbOrQZfVYwoQsMDy450c/tg8SDnq7hqXKzuvtCRytR0bl8TI3qhdz1+eev+91//Cnqw\n izE/m6On6X5IHb0324jTyv/s6s74iyI9vVp/3RiptgCV5pOPr8KrC9tbR95PJrMHRpIt09xELptIEp5EMpc98J6TS7a0ZdumZ\n rNHsrn7/BftKiXSQPimUQgGdL5zYPG8rMcW4oAGf+x09PaxuWFdZMUZ3Wl+CvOaLUnBtszp3rANm0nYeG381xCF0MRHei9cBi\n Vcib/YDa9GioV2+fC3movZD7V3f3f/eJdlXBTySiY15T3JvggTu+uggFnjzWQt9KCcPWg7d03j7NvHpjKxs/FacJvyjplCBje\n mTuQHGOy+5CIT4YkaBwX144rQNV3nZXaNBQ91VQjZrMHc6/uYGH9yLAqr4XwTU7M3YG85Agb2Yu/AvxeDdU0bBoIpSGtD2hGA\n P1zLU3cvZlo/xm7tZ9VGZz0I1EUhuI11Ae7urME0sR5HQwfA2FbYsD6JpeOzJe8EVSEBWptixnoqXpT4R2Snc6+WKtCEsmD9u\n h94L8GWyKOhhCoCNSkEhvI3wVD+5iroBlmE8I/KHsYW2fYgsgEeIXwz8OWeV+MkQ4iv4hGXmIWSLUtVKWRHpucGbN3ETo3siP\n I9WFCRYfIv7eAbBMXZmSjjSqx6q5qE4J7mjR2pvjsqLX1FChnKLO6WzKXdoIo2FtHXvoetzDtgRo+5/8T78GjO6diiuwFj47S\n KSs9ZjjNncbHzMxMuK4XI7ctahnaObIUicIfa/gPy3zLu/AfGgXKbrfZIGwiJcaKVSfdrmDj8XUXFwFuqnXPaFvC5a2l8LPmV\n VQhaxVIp3coGKy7S2CA2nt+VLM1ESsQGHO4qVrRvjJcDLkBrWVeKzZIKwWb1XWgVXyiFQE/D/ao/YHD8cjNZbevlq7efzoQwG\n bkN98P+1ho3Z9/BU4axU3OVv6hCoIynoYyYOZTKqLuY9qEpin/FIjB2S0iHO1j9WCyehP03+kkAuyk0Z1uhlNNM8sBaKv7htu\n GvbZWB3L/GvuD5h6oySHrEO8mAZEHhsh8qui9jA2CsheCAcAsonGWAjUdJthqHhA/HEw7hGCmXY1p/pZUEOH8cp7oLddhQCxn\n qS91pqwzMs2+fVIYuylE/KqgvG0NSLAoVfyjTG3o2NWghaELnY56N4z+rD8d7jXhtx6psTQLkP/Z5rU1hsE7rxpnvzwjWbyFS\n rhKYKVh2Pfznk8qwEvMGyAmyKv+R7EkHBOn/G85sux6DeNmdUWiSrGQq3g4oX6SDFuKOUZmVZhCy93UAKNxwW0W3SL5WOkc+V\n XJ+vw3cJExBArYyIx2QLsRz/X84BxO38ns0nP8fBvzHC6QmfVYSIJmR7Mp+chrpAq3DbvmPxd+TZXFOAhSRgPxVkYRQNOkCr6\n /i4Tebz5WxKz422SZhMLR77H+s5ABdYFCXx9oAoy+syuzVBvfBDmMvO7rJKvnRNgIRwnvDBm4SJi4Ba9lBF7T++EschSHGSxo\n t0w2Qk1FRCVjKjnQBQ3q+O5rfGPbcqo4yjbgOtUhL2ZEu8FQV+18b+eDugN3gb4PsEIOxlh10ARMmnraSD5dWZyNWuA41IEvZ\n kS5w5XN2P5b3bjkZ4fDlFPRvFZ2pl8N5KKSTzEh25XglHZAu8BN7MCgucvU4igTL+89E4ybDpSXgcUuZQQekC39zccoH22DYB\n Uvcch8eeYRJzBXlwCbT8xLwZeWZH8YMy4gfyOtgdLfXfzNesKvDQOYQTDAvhX1VZWYwZlQHdSzJiGRlxSRkr97tDw6oKCOeH/\n 4RzocvtEHiMP5FDDxWMzQbfAcTjMPY3+Dy4rdteMJA/gh+HeUiBet3WSrQ0dO6HJuIO1W4lOsTtJw9lMJz0KVBJvbKYDtJ5ro\n MQgrhfK3bMaftFCjlZR2oqF8yjD3y00XTD7kEyMKXSXnGIeOX8rJeG5rhhroshebFrcva3t+z7znbjUc0u1fxhvcKl8v3FI5D\n yXUkn+YJeT+6+6Ps+OavTJ3VerIaN/Q8RoUoALyzsQlz6LNVuLzLfwiYB8rDHVQQmHVaDt5gGy3jMTz7gUNB8xfqsqIglBFLe\n XRLtp+8FBrehOneGbY5Jioc8Ui8VqQMwW8upQySRckWooQ1PHDBcW6OfrVVmt4+VGAhFzUBjYvdV6+ffQohb2QA77JAaFeBOS\n vZ5YvKX3cSyVPbux99qVzRK0CKl0L6Urfijd9/L4c0mg7F4DE+dgvMLe22+qMIGhzGFfYjcUHpJghrbsVFEfzreCgk9g5hMTw\n VKYSQ0EsKO97dtg5GdT3FkJaKh3KewL7N9wCzpxRcE6TNAo9XQ0BVdb/gsa9j+ryllb4kUbFClKD8X4lw31lva3qq8ukuujVq\n MY84QvTnXFl+60bPXGd/wuEtructAtoL0R0dWTV62Os6zowl1d7MrVohqsBkSzTU9/v/xuWVit7vUfl1l8YdjDnP4uRsk+OJp\n 8dqGk3TVFd4p+FA6BxsrJ5a2Xigl1jzc3FvZ89HPs/5KuzBVv/VrBCd9PBA6mOuK38Esc7W4+vm5+xdCPFFKOxFnD2/AWGOSE\n +MYMazl2hg/2gKHo9ug1LbPC6PAOzxgD0e5ZletzLoiDh7wXH4Re3dGTurEj1vEX9dFaLTwE+tXI7Ntdtrav46wibxUzeLO/Q\n 3dizKPDgWRRozheiFhWX9RzFJvBMr2dP1+Inix07EU2hl18NC/XdjXeZxUUiUiaHMEmzf576MGVcKjCai6Q0N+1eZWQavb93W\n mVr/2/EuS0MUYmJyR9/SU5jMfgLPtC3E2L4AXV09nukwkfLj0PXsx9puKwzTtjCe/GlHz7o/FgUex4SmUUg5np95ZkVy5mt7j\n hK57DGu5Id5Dn6o2ZOt6M/buMRAjg+PimKQlyN4HHqfcNmIw+VbXiK5++0PzXp1fh1//7VcWWtJ/3+2rdRgE9SSwwAAAABJRU\n 5ErkJggg==`\n);\naxisIconMap.set(\n 'negY', `data:image/png;base64,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\n 5ErkJggg==`\n);\naxisIconMap.set(\n 'negZ', `data:image/png;base64,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`\n);\n","import { Texture, noop } from '@galacean/effects';\nimport type { Engine, math } from '@galacean/effects';\n\ntype Vector3 = math.Vector3;\n\n/**\n * 下载图片\n * @param imageUrl - 图片url\n * @returns 图片对象\n */\nexport async function createImage (imageUrl: string): Promise<HTMLImageElement> {\n const image = new Image();\n\n image.src = imageUrl;\n\n return new Promise<HTMLImageElement>((resolve, reject) => {\n image.onload = () => {\n resolve(image);\n };\n image.onerror = reject;\n });\n}\n\n/**\n * 创建 Texture 对象\n * @param engine - engine 对象\n * @param image - 图片对象\n * @returns 纹理\n */\nexport function createTexture (engine: Engine, image: HTMLImageElement, hookDestroy?: boolean): Texture {\n\n const texture = Texture.create(engine, { image });\n\n if (hookDestroy) {\n texture.dispose = noop;\n }\n\n return texture;\n}\n\n/**\n * 移动到距离目标点指定距离的位置\n * @param targetPos - 目标点\n * @param currentPos - 当前点\n * @returns 指定点\n */\nexport function moveToPointWidthFixDistance (targetPos: Vector3, currentPos: Vector3): Vector3 {\n const vecCameraItem = currentPos.clone().subtract(targetPos);\n\n const normalVecCameraItem = vecCameraItem.clone().normalize();\n const scalerVecCameraItem = normalVecCameraItem.clone().multiply(20);\n\n const vecScalerItem = vecCameraItem.clone().subtract(scalerVecCameraItem);\n const vecItemScaler = vecScalerItem.clone().multiply(-1);\n\n return currentPos.clone().add(vecItemScaler);\n}\n","import { math } from '@galacean/effects';\n\ntype Vector2 = math.Vector2;\ntype Vector3 = math.Vector3;\n\nconst { Matrix4, Vector2 } = math;\n\nexport function distanceOfPointAndLine (point: Vector2, line: [Vector2, Vector2]): { distance: number, isInLine: boolean } {\n //三角形三个边长\n const AC = new Vector2();\n const BC = new Vector2();\n const AB = new Vector2();\n\n AC.subtractVectors(point, line[0]);\n BC.subtractVectors(point, line[1]);\n AB.subtractVectors(line[1], line[0]);\n const lengthAC = AC.length();\n const lengthBC = BC.length();\n const lengthAB = AB.length();\n\n //利用海伦公式计算三角形面积\n //周长的一半\n const P = (lengthAC + lengthBC + lengthAB) / 2;\n const allArea = Math.abs(Math.sqrt(P * (P - lengthAC) * (P - lengthBC) * (P - lengthAB)));\n //普通公式计算三角形面积反推点到线的垂直距离\n const distance = (2 * allArea) / lengthAB;\n const l1 = Math.sqrt(Math.pow(lengthAC, 2) - Math.pow(distance, 2));\n const l2 = Math.sqrt(Math.pow(lengthBC, 2) - Math.pow(distance, 2));\n let isInLine = false;\n\n if (l1 <= lengthAB && l2 <= lengthAB) {\n isInLine = true;\n }\n\n return {\n distance,\n isInLine,\n };\n}\n\nexport function projectionOfPointAndLine (point: Vector2, line: [Vector3, Vector3]): Vector3 {\n const AC = new Vector2();\n const BC = new Vector2();\n const AB = new Vector2();\n const line0 = line[0].toVector2();\n const line1 = line[1].toVector2();\n\n AC.subtractVectors(point, line0);\n BC.subtractVectors(point, line1);\n AB.subtractVectors(line1, line0);\n const lengthAC = AC.length();\n const lengthBC = BC.length();\n const lengthAB = AB.length();\n\n //利用海伦公式计算三角形面积\n //周长的一半\n const P = (lengthAC + lengthBC + lengthAB) / 2;\n const allArea = Math.abs(Math.sqrt(P * (P - lengthAC) * (P - lengthBC) * (P - lengthAB)));\n //普通公式计算三角形面积反推点到线的垂直距离\n const distance = (2 * allArea) / lengthAB;\n const l1 = Math.sqrt(Math.pow(lengthAC, 2) - Math.pow(distance, 2));\n const l2 = Math.sqrt(Math.pow(lengthBC, 2) - Math.pow(distance, 2));\n\n const worldAB = line[1].clone().subtract(line[0]);\n\n const worldAP = worldAB.clone().multiply(l1 / (l1 + l2));\n\n const worldP = line[0].clone().add(worldAP);\n\n return worldP;\n}\n\nexport function computeOrthographicOffCenter (\n left: number,\n right: number,\n bottom: number,\n top: number,\n near: number,\n far: number\n) {\n let a = 1.0 / (right - left);\n let b = 1.0 / (top - bottom);\n let c = 1.0 / (far - near);\n\n const tx = -(right + left) * a;\n const ty = -(top + bottom) * b;\n const tz = -(far + near) * c;\n\n a *= 2.0;\n b *= 2.0;\n c *= -2.0;\n\n return new Matrix4(\n a,\n 0.0,\n 0.0,\n 0.0,\n //\n 0.0,\n b,\n 0.0,\n 0.0,\n //\n 0.0,\n 0.0,\n c,\n 0.0,\n //\n tx,\n ty,\n tz,\n 1.0,\n );\n}\n","function _extends() {\n _extends = Object.assign || function assign(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\nexport { _extends as _ };\n","/**\n * 基础几何数据[抽象类,不可以直接用来初始化]\n */\nexport abstract class GeometryData {\n points: number[] = [];\n uvs: number[] = [];\n normals: number[] = [];\n indices: number[] = [];\n\n /**\n * 构件 XY 平面圆(圆心为(0, 0, z))\n * @param radius - 圆半径\n * @param z - z 值\n * @param segments - 圆精度\n * @param thetaStart - 起始弧度\n * @param thetaLength - 终止弧度\n * @param startIndex - 索引起始值\n * @param points - 点数据\n * @param indices - 索引数据\n */\n createXYPlaneCircle (\n radius: number,\n z: number,\n segments: number,\n thetaStart: number,\n thetaLength: number,\n startIndex: number,\n points: number[],\n indices: number[],\n ) {\n for (let i = 0; i < segments; i++) {\n const theta = thetaStart + i * thetaLength / segments;\n const x = radius * Math.cos(theta);\n const y = radius * Math.sin(theta);\n\n points.push(x, y, z);\n indices.push(startIndex + i, startIndex + (i + 1) % segments);\n }\n }\n\n /**\n * 构件 XZ 平面圆(圆心为(0, y, 0))\n * @param radius - 圆半径\n * @param y - y 值\n * @param segments - 圆精度\n * @param thetaStart - 起始弧度\n * @param thetaLength - 终止弧度\n * @param startIndex - 索引起始值\n * @param points - 点数据\n * @param indices - 索引数据\n */\n createXZPlaneCircle (\n radius: number,\n y: number,\n segments: number,\n thetaStart: number,\n thetaLength: number,\n startIndex: number,\n points: number[],\n indices: number[],\n ) {\n for (let i = 0; i < segments; i++) {\n const theta = thetaStart + i * thetaLength / segments;\n const x = radius * Math.cos(theta);\n const z = radius * Math.sin(theta);\n\n points.push(x, y, z);\n indices.push(startIndex + i, startIndex + (i + 1) % segments);\n }\n }\n\n /**\n * 构件 YZ 平面圆(圆心为(x, 0, 0))\n * @param radius - 圆半径\n * @param x - x 值\n * @param segments - 圆精度\n * @param thetaStart - 起始弧度\n * @param thetaLength - 终止弧度\n * @param startIndex - 索引起始值\n * @param points - 点数据\n * @param indices - 索引数据\n */\n createYZPlaneCircle (\n radius: number,\n x: number,\n segments: number,\n thetaStart: number,\n thetaLength: number,\n startIndex: number,\n points: number[],\n indices: number[],\n ) {\n for (let i = 0; i < segments; i++) {\n const theta = thetaStart + i * thetaLength / segments;\n const z = radius * Math.cos(theta);\n const y = radius * Math.sin(theta);\n\n points.push(x, y, z);\n indices.push(startIndex + i, startIndex + (i + 1) % segments);\n }\n }\n}\n","import { math } from '@galacean/effects';\nimport { GeometryData } from './geometry';\n\nconst { Vector3 } = math;\n\n/**\n *\n */\nexport class SphereGeometryData extends GeometryData {\n /**\n *\n * @param radius\n * @param widthSegments\n * @param heightSegments\n * @param phiStart\n * @param phiLength\n * @param thetaStart\n * @param thetaLength\n */\n constructor (\n radius = 1,\n widthSegments = 8,\n heightSegments = 6,\n phiStart = 0,\n phiLength = Math.PI * 2,\n thetaStart = 0,\n thetaLength = Math.PI,\n ) {\n super();\n\n // 限制至少需要分为六块以保持形状\n widthSegments = Math.max(3, Math.floor(widthSegments));\n heightSegments = Math.max(2, Math.floor(heightSegments));\n\n const thetaEnd = Math.min(thetaStart + thetaLength, Math.PI);\n const grid = [];\n let index = 0;\n\n for (let iy = 0; iy <= heightSegments; iy++) {\n const verticesRow = [];\n const v = iy / heightSegments;\n\n let uOffset = 0;\n\n if (iy == 0 && thetaStart == 0) {\n uOffset = 0.5 / widthSegments;\n } else if (iy == heightSegments && thetaEnd == Math.PI) {\n uOffset = - 0.5 / widthSegments;\n }\n\n for (let ix = 0; ix <= widthSegments; ix++) {\n const u = ix / widthSegments;\n\n // point\n const x = - radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);\n const y = radius * Math.cos(thetaStart + v * thetaLength);\n const z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);\n\n this.points.push(x, y, z);\n\n // normal\n const normal = new Vector3(x, y, z).normalize();\n\n this.normals.push(...normal.toArray());\n\n // uv\n this.uvs.push(u + uOffset, 1 - v);\n\n verticesRow.push(index++);\n }\n\n grid.push(verticesRow);\n }\n\n // indices\n for (let iy = 0; iy < heightSegments; iy++) {\n for (let ix = 0; ix < widthSegments; ix++) {\n const a = grid[iy][ix + 1];\n const b = grid[iy][ix];\n const c = grid[iy + 1][ix];\n const d = grid[iy + 1][ix + 1];\n\n if (iy !== 0 || thetaStart > 0) { this.indices.push(a, b, d); }\n if (iy !== heightSegments - 1 || thetaEnd < Math.PI) { this.indices.push(b, c, d); }\n }\n }\n }\n}\n","import type { spec } from '@galacean/effects';\nimport { GeometryData } from './geometry';\n\n// 面造型未单独抽离, 整个包围盒只接受一个材质\nexport class BoxGeometryData extends GeometryData {\n /**\n *\n * @param width\n * @param height\n * @param depth\n */\n constructor (width = 1, height = 1, depth = 1) {\n super();\n\n let numberOfVertices = 0;\n\n buildPlane(2, 1, 0, - 1, - 1, depth, height, width, this.points, this.uvs, this.normals, this.indices); // px\n buildPlane(2, 1, 0, 1, - 1, depth, height, - width, this.points, this.uvs, this.normals, this.indices); // nx\n buildPlane(0, 2, 1, 1, 1, width, depth, height, this.points, this.uvs, this.normals, this.indices); // py\n buildPlane(0, 2, 1, 1, - 1, width, depth, - height, this.points, this.uvs, this.normals, this.indices); // ny\n buildPlane(0, 1, 2, 1, - 1, width, height, depth, this.points, this.uvs, this.normals, this.indices); // pz\n buildPlane(0, 1, 2, - 1, - 1, width, height, - depth, this.points, this.uvs, this.normals, this.indices); // nz\n\n function buildPlane (u: number, v: number, w: number, uDir: number,\n vDir: number, width: number, height: number, depth: number,\n points: number[], uvs: number[], normals: number[], indices: number[]) {\n\n const widthHalf = width / 2;\n const heightHalf = height / 2;\n const depthHalf = depth / 2;\n const point: spec.vec3 = [0, 0, 0];\n let vertexCounter = 0;\n\n for (let iy = 0; iy < 2; iy++) {\n const y = iy * height - heightHalf;\n\n for (let ix = 0; ix < 2; ix++) {\n const x = ix * width - widthHalf;\n\n point[u] = x * uDir;\n point[v] = y * vDir;\n point[w] = depthHalf;\n\n points.push(...point);\n\n point[u] = 0;\n point[v] = 0;\n point[w] = depth > 0 ? 1 : - 1;\n\n normals.push(...point);\n\n uvs.push(ix);\n uvs.push(1 - iy);\n\n vertexCounter += 1;\n }\n }\n\n for (let iy = 0; iy < 1; iy++) {\n for (let ix = 0; ix < 1; ix++) {\n const a = numberOfVertices + ix + 2 * iy;\n const b = numberOfVertices + ix + 2 * (iy + 1);\n const c = numberOfVertices + (ix + 1) + 2 * (iy + 1);\n const d = numberOfVertices + (ix + 1) + 2 * iy;\n\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n\n numberOfVertices += vertexCounter;\n }\n }\n}\n","import { math } from '@galacean/effects';\nimport { GeometryData } from './geometry';\n\nconst { Vector3 } = math;\n\n/**\n *\n */\nexport class CylinderGeometryData extends GeometryData {\n /**\n *\n * @param radiusTop\n * @param radiusBottom\n * @param height\n * @param radialSegments\n * @param heightSegments\n * @param openEnded\n * @param thetaStart\n * @param thetaLength\n */\n constructor (\n radiusTop = 1,\n radiusBottom = 1,\n height = 1,\n radialSegments = 8,\n heightSegments = 1,\n openEnded = false,\n thetaStart = 0,\n thetaLength = Math.PI * 2,\n ) {\n super();\n radialSegments = Math.floor(radialSegments);\n heightSegments = Math.floor(heightSegments);\n\n let index = 0;\n const indexArray: number[][] = [];\n const halfHeight = height / 2;\n\n generateTorso(this.points, this.uvs, this.normals, this.indices);\n\n if (openEnded === false) {\n if (radiusTop > 0) { generateCap(true, this.points, this.uvs, this.normals, this.indices); }\n if (radiusBottom > 0) { generateCap(false, this.points, this.uvs, this.normals, this.indices); }\n }\n\n function generateTorso (points: number[], uvs: number[], normals: number[], indices: number[]) {\n // this will be used to calculate the normal\n const slope = (radiusBottom - radiusTop) / height;\n\n for (let y = 0; y <= heightSegments; y++) {\n const indexRow = [];\n const v = y / heightSegments;\n\n const radius = v * (radiusBottom - radiusTop) + radiusTop;\n\n for (let x = 0; x <= radialSegments; x++) {\n const u = x / radialSegments;\n const theta = u * thetaLength + thetaStart;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n const px = radius * sinTheta;\n const py = - v * height + halfHeight;\n const pz = radius * cosTheta;\n\n points.push(px, py, pz);\n\n const normal = new Vector3(sinTheta, slope, cosTheta).normalize();\n\n normals.push(...normal.toArray());\n\n uvs.push(u, 1 - v);\n\n indexRow.push(index++);\n }\n indexArray.push(indexRow);\n }\n\n for (let x = 0; x < radialSegments; x++) {\n for (let y = 0; y < heightSegments; y++) {\n const a = indexArray[y][x];\n const b = indexArray[y + 1][x];\n const c = indexArray[y + 1][x + 1];\n const d = indexArray[y][x + 1];\n\n indices.push(a, b, d);\n indices.push(b, c, d);\n }\n }\n }\n\n function generateCap (top: boolean, points: number[], uvs: number[], normals: number[], indices: number[]) {\n const centerIndexStart = index;\n\n const radius = (top === true) ? radiusTop : radiusBottom;\n const sign = (top === true) ? 1 : - 1;\n\n for (let x = 1; x <= radialSegments; x++) {\n points.push(0, halfHeight * sign, 0);\n normals.push(0, sign, 0);\n uvs.push(0.5, 0.5);\n\n index++;\n }\n\n const centerIndexEnd = index;\n\n for (let x = 0; x <= radialSegments; x++) {\n\n const u = x / radialSegments;\n const theta = u * thetaLength + thetaStart;\n\n const cosTheta = Math.cos(theta);\n const sinTheta = Math.sin(theta);\n\n const px = radius * sinTheta;\n const py = halfHeight * sign;\n const pz = radius * cosTheta;\n\n points.push(px, py, pz);\n\n normals.push(0, sign, 0);\n\n const uvU = (cosTheta * 0.5) + 0.5;\n const uvV = (sinTheta * 0.5 * sign) + 0.5;\n\n uvs.push(uvU, uvV);\n\n index++;\n }\n\n for (let x = 0; x < radialSegments; x++) {\n const c = centerIndexStart + x;\n const i = centerIndexEnd + x;\n\n if (top === true) {\n indices.push(i, i + 1, c);\n } else {\n indices.push(i + 1, i, c);\n }\n }\n }\n }\n}\n","import { CylinderGeometryData } from './cylinder';\n\n/**\n *\n */\nexport class ConeGeometryData extends CylinderGeometryData {\n /**\n *\n * @param radius\n * @param height\n * @param radialSegments\n * @param heightSegments\n * @param openEnded\n * @param thetaStart\n * @param thetaLength\n */\n constructor (\n radius = 1,\n height = 1,\n radialSegments = 8,\n heightSegments = 1,\n openEnded = false,\n thetaStart = 0,\n thetaLength = Math.PI * 2,\n ) {\n super(0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength);\n }\n}\n","import { math } from '@galacean/effects';\nimport { GeometryData } from './geometry';\n\nconst { Vector3 } = math;\n\n/**\n *\n */\nexport class TorusGeometryData extends GeometryData {\n /**\n *\n * @param radius\n * @param tube\n * @param radialSegments\n * @param tubularSegments\n * @param arc\n */\n constructor (\n radius = 1,\n tube = 0.4,\n radialSegments = 64,\n tubularSegments = 64,\n arc = Math.PI * 2,\n ) {\n super();\n\n radialSegments = Math.floor(radialSegments);\n tubularSegments = Math.floor(tubularSegments);\n\n for (let j = 0; j <= radialSegments; j++) {\n for (let i = 0; i <= tubularSegments; i++) {\n\n const u = i / tubularSegments * arc;\n const v = j / radialSegments * Math.PI * 2;\n\n const px = (radius + tube * Math.cos(v)) * Math.cos(u);\n const py = (radius + tube * Math.cos(v)) * Math.sin(u);\n const pz = tube * Math.sin(v);\n\n this.points.push(px, py, pz);\n\n const cx = radius * Math.cos(u);\n const cy = radius * Math.sin(u);\n const p = new Vector3(px, py, pz);\n const c = new Vector3(cx, cy, 0);\n const normal = p.subtract(c).normalize();\n\n this.normals.push(...normal.toArray());\n\n this.uvs.push(i / tubularSegments);\n this.uvs.push(j / radialSegments);\n }\n }\n\n for (let j = 1; j <= radialSegments; j++) {\n for (let i = 1; i <= tubularSegments; i++) {\n const a = (tubularSegments + 1) * j + i - 1;\n const b = (tubularSegments + 1) * (j - 1) + i - 1;\n const c = (tubularSegments + 1) * (j - 1) + i;\n const d = (tubularSegments + 1) * j + i;\n\n this.indices.push(a, b, d);\n this.indices.push(b, c, d);\n }\n }\n }\n}\n","import { GeometryData } from './geometry';\n\n/**\n *\n */\nexport class PlaneGeometryData extends GeometryData {\n /**\n *\n * @param width\n * @param height\n * @param widthSegments\n * @param heightSegments\n */\n constructor (\n width = 1,\n height = 1,\n widthSegments = 1,\n heightSegments = 1,\n ) {\n super();\n\n const widthHalf = width / 2;\n const heightHalf = height / 2;\n\n const gridX = Math.floor(widthSegments);\n const gridY = Math.floor(heightSegments);\n\n const gridX1 = gridX + 1;\n const gridY1 = gridY + 1;\n\n const segmentWidth = width / gridX;\n const segmentHeight = height / gridY;\n\n for (let iy = 0; iy < gridY1; iy++) {\n const y = iy * segmentHeight - heightHalf;\n\n for (let ix = 0; ix < gridX1; ix++) {\n const x = ix * segmentWidth - widthHalf;\n\n this.points.push(x, - y, 0);\n this.normals.push(0, 0, 1);\n this.uvs.push(ix / gridX);\n this.uvs.push(1 - (iy / gridY));\n }\n }\n for (let iy = 0; iy < gridY; iy++) {\n for (let ix = 0; ix < gridX; ix++) {\n const a = ix + gridX1 * iy;\n const b = ix + gridX1 * (iy + 1);\n const c = (ix + 1) + gridX1 * (iy + 1);\n const d = (ix + 1) + gridX1 * iy;\n\n this.indices.push(a, b, d);\n this.indices.push(b, c, d);\n }\n }\n }\n}\n","import type { spec } from '@galacean/effects';\nimport { math } from '@galacean/effects';\nimport { GeometryData } from './geometry';\n\nconst { Euler, Vector3, Matrix4 } = math;\n\n/**\n *\n */\nexport class FrustumGeometryData extends GeometryData {\n /**\n *\n * @param position\n * @param rotation\n * @param fov\n * @param aspect\n * @param near\n * @param far\n */\n constructor (\n position: spec.vec3,\n rotation: spec.vec3,\n fov: number,\n aspect: number,\n near: number,\n far: number,\n ) {\n super();\n\n const fovY = fov / 180 * Math.PI;\n const ratio = aspect;\n const halfY = far * Math.tan(fovY / 2);\n const halfX = halfY * ratio;\n const point1 = new Vector3(halfX, halfY, far);\n const point2 = new Vector3(-halfX, halfY, far);\n const point3 = new Vector3(-halfX, -halfY, far);\n const point4 = new Vector3(halfX, -halfY, far);\n const matrix = Euler.fromArray(rotation).toMatrix4(new Matrix4());\n const result1 = matrix.transformPoint(point1).add(position);\n const result2 = matrix.transformPoint(point2).add(position);\n const result3 = matrix.transformPoint(point3).add(position);\n const result4 = matrix.transformPoint(point4).add(position);\n\n this.points.push(\n ...position,\n ...result1.toArray(), ...result2.toArray(),\n ...result3.toArray(), ...result4.toArray()\n );\n this.indices.push(0, 1, 0, 2, 0, 3, 0, 4, 1, 2, 2, 3, 3, 4, 4, 1);\n }\n}\n","import { GeometryData } from './geometry';\n\n/**\n * 方向光造型数据\n * lines\n */\nexport class DirectionLightData extends GeometryData {\n /**\n * 构造函数\n * @param radius - 圆半径\n * @param length - 光线长度\n * @param segments - 圆精度\n * @param linesNumber - 光线数量\n * @param thetaStart - 起始弧度\n * @param thetaLength - 终止弧度\n */\n constructor (\n radius = 1,\n length = 2,\n segments = 64,\n linesNumber = 8,\n thetaStart = 0,\n thetaLength = Math.PI * 2,\n ) {\n super();\n\n this.createXYPlaneCircle(radius, 0, segments, thetaStart, thetaLength, 0, this.points, this.indices);\n const start = segments % linesNumber / 2;\n const step = segments / linesNumber;\n\n for (let i = 0; i < linesNumber; i++) {\n const index = start + i * step;\n const x = this.points[3 * index];\n const y = this.points[3 * index + 1];\n const z = -length;\n\n this.points.push(x, y, z);\n this.indices.push(index, segments + i);\n }\n }\n}\n","import { GeometryData } from './geometry';\n\n/**\n * 点光源造型数据\n * lines\n */\nexport class PointLightData extends GeometryData {\n /**\n * 构造函数\n * @param range - 光照范围\n * @param segments - 圆精度\n * @param thetaStart - 起始弧度\n * @param thetaLength - 终止弧度\n */\n constructor (\n range = 10,\n segments = 64,\n thetaStart = 0,\n thetaLength = Math.PI * 2,\n ) {\n super();\n this.createXYPlaneCircle(range, 0, segments, thetaStart, thetaLength, 0, this.points, this.indices);\n this.createXZPlaneCircle(range, 0, segments, thetaStart, thetaLength, segments, this.points, this.indices);\n this.createYZPlaneCircle(range, 0, segments, thetaStart, thetaLength, 2 * segments, this.points, this.indices);\n }\n}\n","import { GeometryData } from './geometry';\n\n/**\n * 聚光灯造型数据\n * lines\n */\nexport class SpotLightData extends GeometryData {\n /**\n * 构造函数\n * @param range - 光线范围\n * @param spotAngle - 光线范围[角度]\n * @param segments - 圆精度\n * @param thetaStart - 起始弧度\n * @param thetaLength - 终止弧度\n */\n constructor (\n range = 10,\n spotAngle = 30,\n segments = 64,\n thetaStart = 0,\n thetaLength = Math.PI * 2,\n ) {\n super();\n\n const angle = spotAngle / 2 / 180 * Math.PI;\n const radius = range * Math.tan(angle);\n\n this.createXYPlaneCircle(radius, -range, segments, thetaStart, thetaLength, 0, this.points, this.indices);\n this.points.push(0, 0, 0);\n const step = segments / 4;\n const start = segments % 4 / 2;\n\n for (let i = 0; i < 4; i++) {\n this.indices.push(segments, start + i * step);\n }\n }\n}\n","import { GeometryData } from './geometry';\n\n/**\n * 地板线边框造型数据\n * lines\n */\nexport class FloorLineEdgeGeometryData extends GeometryData {\n /**\n *\n * @param sideLength\n * @param parts\n */\n constructor (sideLength = 12, parts = 6) {\n super();\n\n let index = 0;\n\n const z = 0;\n const end = sideLength / 2;\n const start = -sideLength / 2;\n\n for (let i = 0; i <= parts; i++) {\n const v = start + i * sideLength / parts;\n\n this.points.push(v, start, z, v, end, z, start, v, z, end, v, z);\n this.indices.push(index, index + 1, index + 2, index + 3);\n index += 4;\n }\n }\n}\n","import type { Engine, Geometry, spec } from '@galacean/effects';\nimport { glContext, Material, Mesh, Texture, Transform, math } from '@galacean/effects';\nimport type { MeshOption } from './geometry';\nimport { createGeometry, GeometryType } from './geometry';\nimport { GizmoSubType } from './define';\nimport type { GizmoItemBounding } from './gizmo-vfx-item';\nimport { BoundingType } from './gizmo-vfx-item';\nimport { color, renderMode } from './constants';\n\ntype vec3 = spec.vec3;\ntype Vector3 = math.Vector3;\ntype TriangleLike = math.TriangleLike;\nconst { Vector2, Vector3, Matrix4 } = math;\n\n/**\n * 根据 gizmoSubType 类型创建几何体 Mesh\n * @param subType - gizmoSubType 类型\n * @param boundingMap - 包围盒 Map\n * @param iconTexture - 图标纹理\n * @param options - 几何体参数\n * @returns 基础几何体 Mesh | 组合几何体 Map<Mesh, Transform>\n */\nexport function createMeshFromSubType (\n engine: Engine,\n subType: GizmoSubType,\n boundingMap: Map<string, GizmoItemBounding>,\n iconTexture?: Map<string, Texture>,\n options?: MeshOption\n): Mesh | Map<Mesh, Transform> {\n let result: Mesh | Map<Mesh, Transform>;\n\n if (!options) {\n options = { size: 0, renderMode: WebGLRenderingContext['TRIANGLES'] };\n }\n\n switch (subType) {\n case GizmoSubType.sprite:\n result = createSpriteMesh(engine, options);\n\n break;\n case GizmoSubType.camera:\n result = createSpriteMesh(engine, options, iconTexture ? iconTexture.get('camera') : undefined, boundingMap);\n\n break;\n case GizmoSubType.light:\n result = createSpriteMesh(engine, options, iconTexture ? iconTexture.get('light') : undefined, boundingMap);\n\n break;\n case GizmoSubType.translation:\n result = createTranslationMesh(engine, options, boundingMap);\n\n break;\n case GizmoSubType.scale:\n result = createScaleMesh(engine, options, boundingMap);\n\n break;\n case GizmoSubType.viewHelper:\n result = createViewHelperMesh(engine, options, boundingMap, iconTexture as Map<string, Texture>);\n\n break;\n case GizmoSubType.rotation:\n result = createRotationMesh(engine, options, boundingMap);\n\n break;\n default:\n result = createBasicMesh(engine, subType, options);\n\n break;\n }\n\n return result;\n}\n\n/**\n * 创建旋转组件 Mesh 数组\n * @internal\n * @param options\n * @param boundingMap - 包围盒 Map\n * @returns Mesh 数组和对应的 Transform 组成的 Map\n */\nfunction createRotationMesh (\n engine: Engine,\n options: MeshOption,\n boundingMap: Map<string, GizmoItemBounding>,\n): Map<Mesh, Transform> {\n const result: Map<Mesh, Transform> = new Map();\n const scale = options.size.scale || 1;\n const size = {\n radius: 0.8 * scale,\n tube: 0.02 * scale,\n radiusSegments: 10 * scale,\n widthSegments: 20,\n heightSegments: 20,\n };\n const boundSize = { ...size, tube: size.tube * 2 };\n const name = 'rotation';\n const xCircle = createBasicMesh(engine, GizmoSubType.torus, {\n size, color: color.xAxisColor as vec3, renderMode, name,\n }, 'hideBack');\n const yCircle = createBasicMesh(engine, GizmoSubType.torus, {\n size, color: color.yAxisColor as vec3, renderMode, name,\n }, 'hideBack');\n const zCircle = createBasicMesh(engine, GizmoSubType.torus, {\n size, color: color.zAxisColor as vec3, renderMode, name,\n }, 'hideBack');\n const center = createBasicMesh(engine, GizmoSubType.sphere, {\n size, color: [0.3, 0.3, 0.3], alpha: 0.1, renderMode, name,\n }, 'blend');\n const xCircleBounding = createBasicMesh(engine, GizmoSubType.torus, {\n size: boundSize,\n color: color.xAxisColor as vec3,\n renderMode,\n });\n const yCircleBounding = createBasicMesh(engine, GizmoSubType.torus, {\n size: boundSize,\n color: color.yAxisColor as vec3,\n renderMode,\n });\n const zCircleBounding = createBasicMesh(engine, GizmoSubType.torus, {\n size: boundSize,\n color: color.zAxisColor as vec3,\n renderMode,\n });\n\n const xCircleTransform = new Transform({\n valid: true,\n });\n const yCircleTransform = new Transform({\n valid: true,\n });\n const zCircleTransform = new Transform({\n valid: true,\n });\n const centerTransform = new Transform({\n valid: true,\n });\n\n xCircleTransform.setRotation(0, 90, 0);\n yCircleTransform.setRotation(-90, 0, 0);\n zCircleTransform.setRotation(0, 0, 0);\n result.set(center, centerTransform);\n result.set(xCircle, xCircleTransform);\n result.set(yCircle, yCircleTransform);\n result.set(zCircle, zCircleTransform);\n\n boundingMap.set('xAxis', {\n type: BoundingType.triangle,\n triangles: xCircleBounding.firstGeometry() ? getTriangle(xCircleBounding.firstGeometry(), xCircleTransform) : [],\n backfaceCulling: true,\n });\n boundingMap.set('yAxis', {\n type: BoundingType.triangle,\n triangles: yCircleBounding.firstGeometry() ? getTriangle(yCircleBounding.firstGeometry(), yCircleTransform) : [],\n backfaceCulling: true,\n });\n boundingMap.set('zAxis', {\n type: BoundingType.triangle,\n triangles: zCircleBounding.firstGeometry() ? getTriangle(zCircleBounding.firstGeometry(), zCircleTransform) : [],\n backfaceCulling: true,\n });\n\n return result;\n}\n\n/**\n * 获取几何体的三角面数组\n * @internal\n * @param geometry - 几何体\n * @param transform - 变换式\n * @returns 三角面数组\n */\nfunction getTriangle (geometry: Geometry, transform: Transform): TriangleLike[] {\n const result: TriangleLike[] = [];\n const indices = geometry.getIndexData();\n const points = geometry.getAttributeData('a_Position');\n const mat4 = transform.getWorldMatrix();\n\n if (points && indices && indices.length > 0) {\n for (let i = 0; i < indices.length; i += 3) {\n const i0 = indices[i] * 3;\n const i1 = indices[i + 1] * 3;\n const i2 = indices[i + 2] * 3;\n const p0 = new Vector3(points[i0], points[i0 + 1], points[i0 + 2]);\n const p1 = new Vector3(points[i1], points[i1 + 1], points[i1 + 2]);\n const p2 = new Vector3(points[i2], points[i2 + 1], points[i2 + 2]);\n\n result.push({\n p0: mat4.projectPoint(p0),\n p1: mat4.projectPoint(p1),\n p2: mat4.projectPoint(p2),\n });\n\n }\n }\n\n return result;\n}\n\n/**\n * 创建位移组件 Mesh 数组\n * @internal\n * @param options\n * @param boundingMap - 包围盒 Map\n * @returns Mesh 数组和对应的 Transform 组成的 Map\n */\nfunction createTranslationMesh (engine: Engine, options: MeshOption, boundingMap: Map<string, GizmoItemBounding>): Map<Mesh, Transform> {\n const result: Map<Mesh, Transform> = new Map();\n const scale = options.size.scale || 1;\n const axisSize = {\n width: 0.8 * scale,\n height: 0.02 * scale,\n depth: 0.02 * scale,\n };\n const name = 'translation';\n const axisMesh = createAxisMesh(engine, axisSize, false, name);\n\n for (const [mesh, transform] of axisMesh) {\n result.set(mesh, transform);\n }\n\n const arrowSize = {\n radius: 0.05 * scale,\n height: 0.2 * scale,\n };\n const xArrow = createBasicMesh(engine, GizmoSubType.cone, {\n size: arrowSize,\n color: color.xAxisColor as vec3,\n renderMode,\n depthTest: true,\n name,\n }, 'blend');\n const yArrow = createBasicMesh(engine, GizmoSubType.cone, {\n size: arrowSize,\n color: color.yAxisColor as vec3,\n renderMode,\n depthTest: true,\n name,\n }, 'blend');\n const zArrow = createBasicMesh(engine, GizmoSubType.cone, {\n size: arrowSize,\n color: color.zAxisColor as vec3,\n renderMode,\n name,\n depthTest: true,\n }, 'blend');\n const xArrowTransform = new Transform({\n valid: true,\n });\n const yArrowTransform = new Transform({\n valid: true,\n });\n const zArrowTransform = new Transform({\n valid: true,\n });\n\n xArrowTransform.setRotation(0, 0, 90);\n yArrowTransform.setRotation(0, 0, 0);\n zArrowTransform.setRotation(-90, 0, 0);\n xArrowTransform.translate(axisSize.width, 0, 0);\n yArrowTransform.translate(0, axisSize.width, 0);\n zArrowTransform.translate(0, 0, axisSize.width);\n\n const planeSize = {\n width: 0.2 * scale,\n height: 0.2 * scale,\n };\n const xyPlane = createBasicMesh(engine, GizmoSubType.plane, {\n size: planeSize, color: color.zAxisColor as vec3, renderMode, depthTest: true, name,\n });\n const yzPlane = createBasicMesh(engine, GizmoSubType.plane, {\n size: planeSize, color: color.xAxisColor as vec3, renderMode, depthTest: true, name,\n });\n const zxPlane = createBasicMesh(engine, GizmoSubType.plane, {\n size: planeSize, color: color.yAxisColor as vec3, renderMode, depthTest: true, name,\n });\n const xyPlaneTransform = new Transform({\n valid: true,\n });\n const yzPlaneTransform = new Transform({\n valid: true,\n });\n const zxPlaneTransform = new Transform({\n valid: true,\n });\n const delta = axisSize.width / 8;\n\n xyPlaneTransform.translate(planeSize.width / 2 + delta, planeSize.height / 2 + delta, 0);\n yzPlaneTransform.setRotation(0, 90, 0);\n yzPlaneTransform.translate(0, planeSize.height / 2 + delta, planeSize.width / 2 + delta);\n zxPlaneTransform.setRotation(-90, 0, 0);\n zxPlaneTransform.translate(planeSize.width / 2 + delta, 0, planeSize.height / 2 + delta);\n\n result.set(xArrow, xArrowTransform);\n result.set(yArrow, yArrowTransform);\n result.set(zArrow, zArrowTransform);\n result.set(xyPlane, xyPlaneTransform);\n result.set(yzPlane, yzPlaneTransform);\n result.set(zxPlane, zxPlaneTransform);\n\n createAxisBounding({ width: arrowSize.radius * 2.4, length: axisSize.width + arrowSize.height / 2 }, boundingMap);\n boundingMap.set('xyPlane', {\n type: BoundingType.triangle,\n triangles: xyPlane.firstGeometry() ? getTriangle(xyPlane.firstGeometry(), xyPlaneTransform) : [],\n backfaceCulling: false,\n });\n\n // FIXME: getTriangle 函数调用 getWorldMatrix 后 worldMatrix被修改\n boundingMap.set('yzPlane', {\n type: BoundingType.triangle,\n triangles: yzPlane.firstGeometry() ? getTriangle(yzPlane.firstGeometry(), yzPlaneTransform) : [],\n backfaceCulling: false,\n });\n boundingMap.set('zxPlane', {\n type: BoundingType.triangle,\n triangles: zxPlane.firstGeometry() ? getTriangle(zxPlane.firstGeometry(), zxPlaneTransform) : [],\n backfaceCulling: false,\n });\n\n return result;\n}\n\n/**\n * 创建缩放组件 Mesh 数组\n * @internal\n * @param options\n * @param boundingMap - 包围盒 Map\n * @returns Mesh 数组和对应的 Transform 组成的 Map\n */\nfunction createScaleMesh (engine: Engine, options: MeshOption, boundingMap: Map<string, GizmoItemBounding>): Map<Mesh, Transform> {\n const result: Map<Mesh, Transform> = new Map();\n const scale = options.size.scale || 1;\n const axisSize = {\n width: 0.8 * scale,\n height: 0.02 * scale,\n depth: 0.02 * scale,\n };\n const name = 'scale';\n const axisMesh = createAxisMesh(engine, axisSize, false, name);\n\n for (const [mesh, transform] of axisMesh) {\n result.set(mesh, transform);\n }\n const boxSize = {\n width: 0.1 * scale,\n height: 0.1 * scale,\n depth: 0.1 * scale,\n };\n const centerBoxSize = {\n width: 0.2 * scale,\n height: 0.2 * scale,\n depth: 0.2 * scale,\n };\n const xCube = createBasicMesh(engine, GizmoSubType.box, {\n size: boxSize, color: color.xAxisColor as vec3, renderMode, depthTest: true, name,\n }, 'blend');\n const yCube = createBasicMesh(engine, GizmoSubType.box, {\n size: boxSize, color: color.yAxisColor as vec3, renderMode, depthTest: true, name,\n }, 'blend');\n const zCube = createBasicMesh(engine, GizmoSubType.box, {\n size: boxSize, color: color.zAxisColor as vec3, renderMode, depthTest: true, name,\n }, 'blend');\n const centerCube = createBasicMesh(engine, GizmoSubType.box, {\n size: centerBoxSize,\n color: [0.8, 0.8, 0.8],\n renderMode,\n depthTest: true,\n name,\n }, 'blend');\n const xCubeTransform = new Transform({\n valid: true,\n });\n const yCubeTransform = new Transform({\n valid: true,\n });\n const zCubeTransform = new Transform({\n valid: true,\n });\n const centerCubeTransform = new Transform({\n valid: true,\n });\n\n xCubeTransform.translate(axisSize.width, 0, 0);\n yCubeTransform.translate(0, axisSize.width, 0);\n zCubeTransform.translate(0, 0, axisSize.width);\n result.set(centerCube, centerCubeTransform);\n result.set(xCube, xCubeTransform);\n result.set(yCube, yCubeTransform);\n result.set(zCube, zCubeTransform);\n\n createAxisBounding({ width: boxSize.width * 1.2, length: axisSize.width + boxSize.width / 2 }, boundingMap);\n boundingMap.set('center', {\n type: BoundingType.sphere,\n center: new Vector3(),\n radius: Math.pow(Math.pow(centerBoxSize.width, 2) + Math.pow(centerBoxSize.height, 2) + Math.pow(centerBoxSize.depth, 2), 0.5) / 2,\n });\n\n return result;\n}\n\n/**\n * 创建视图辅助组件 Mesh 数组\n * @internal\n * @param options\n * @param boundingMap - 包围盒 Map\n * @returns Mesh 数组和对应的 Transform 组成的 Map\n */\nfunction createViewHelperMesh (engine: Engine, options: MeshOption, boundingMap: Map<string, GizmoItemBounding>, texture: Map<string, Texture>): Map<Mesh, Transform> {\n const result: Map<Mesh, Transform> = new Map();\n const scale = options.size.scale || 1;\n const axisSize = {\n width: 0.8 * scale,\n height: 0.02 * scale,\n depth: 0.02 * scale,\n };\n const axisMesh = createAxisMesh(engine, axisSize, true);\n\n for (const [mesh, transform] of axisMesh) {\n result.set(mesh, transform);\n }\n const planeSize = {\n width: 0.14 * scale,\n height: 0.14 * scale,\n };\n const length = (axisSize.width + planeSize.width) / 2;\n const depthTest = true;\n const posXSphere = createSpriteMesh(engine, { size: planeSize, renderMode, depthTest }, texture.get('posX'));\n const posYSphere = createSpriteMesh(engine, { size: planeSize, renderMode, depthTest }, texture.get('posY'));\n const posZSphere = createSpriteMesh(engine, { size: planeSize, renderMode, depthTest }, texture.get('posZ'));\n const posXSphereTransform = new Transform({\n valid: true,\n });\n const posYSphereTransform = new Transform({\n valid: true,\n });\n const posZSphereTransform = new Transform({\n valid: true,\n });\n\n posXSphereTransform.translate(length, 0, 0);\n posYSphereTransform.translate(0, length, 0);\n posZSphereTransform.translate(0, 0, length);\n const negXSphere = createSpriteMesh(engine, { size: planeSize, renderMode, depthTest }, texture.get('negX'));\n const negYSphere = createSpriteMesh(engine, { size: planeSize, renderMode, depthTest }, texture.get('negY'));\n const negZSphere = createSpriteMesh(engine, { size: planeSize, renderMode, depthTest }, texture.get('negZ'));\n const negXSphereTransform = new Transform({\n valid: true,\n });\n const negYSphereTransform = new Transform({\n valid: true,\n });\n const negZSphereTransform = new Transform({\n valid: true,\n });\n\n negXSphereTransform.translate(-length, 0, 0);\n negYSphereTransform.translate(0, -length, 0);\n negZSphereTransform.translate(0, 0, -length);\n\n result.set(posXSphere, posXSphereTransform);\n result.set(posYSphere, posYSphereTransform);\n result.set(posZSphere, posZSphereTransform);\n result.set(negXSphere, negXSphereTransform);\n result.set(negYSphere, negYSphereTransform);\n result.set(negZSphere, negZSphereTransform);\n\n const radius = (planeSize.height / 2) * 1.2;\n\n boundingMap.set('posX', {\n type: BoundingType.sphere,\n center: posXSphereTransform.position,\n radius: radius,\n });\n boundingMap.set('posY', {\n type: BoundingType.sphere,\n center: posYSphereTransform.position,\n radius: radius,\n });\n boundingMap.set('posZ', {\n type: BoundingType.sphere,\n center: posZSphereTransform.position,\n radius: radius,\n });\n boundingMap.set('negX', {\n type: BoundingType.sphere,\n center: negXSphereTransform.position,\n radius: radius,\n });\n boundingMap.set('negY', {\n type: BoundingType.sphere,\n center: negYSphereTransform.position,\n radius: radius,\n });\n boundingMap.set('negZ', {\n type: BoundingType.sphere,\n center: negZSphereTransform.position,\n radius: radius,\n });\n\n return result;\n}\n\n/**\n * 创建坐标轴 Mesh 数组\n * @internal\n * @param axisSize - 坐标轴尺寸\n * @param isCentered - 是否居中,默认 false\n * @returns Mesh 数组和对应的 Transform 组成的 Map\n */\nfunction createAxisMesh (engine: Engine, axisSize: { width: number, height: number, depth: number }, isCentered = false, name?: string): Map<Mesh, Transform> {\n const result: Map<Mesh, Transform> = new Map();\n const xAxis = createBasicMesh(engine, GizmoSubType.box, {\n size: axisSize, color: color.xAxisColor as vec3, renderMode, depthTest: true, name,\n });\n const yAxis = createBasicMesh(engine, GizmoSubType.box, {\n size: axisSize, color: color.yAxisColor as vec3, renderMode, depthTest: true, name,\n });\n const zAxis = createBasicMesh(engine, GizmoSubType.box, {\n size: axisSize, color: color.zAxisColor as vec3, renderMode, depthTest: true, name,\n });\n\n const xAxisTransform = new Transform({\n valid: true,\n });\n const yAxisTransform = new Transform({\n valid: true,\n });\n const zAxisTransform = new Transform({\n valid: true,\n });\n\n yAxisTransform.setRotation(0, 0, 90);\n zAxisTransform.setRotation(0, -90, 0);\n if (!isCentered) {\n xAxisTransform.translate(axisSize.width / 2, 0, 0);\n yAxisTransform.translate(0, axisSize.width / 2, 0);\n zAxisTransform.translate(0, 0, axisSize.width / 2);\n }\n result.set(xAxis, xAxisTransform);\n result.set(yAxis, yAxisTransform);\n result.set(zAxis, zAxisTransform);\n\n return result;\n}\n\n/**\n * 创建基础几何体 Mesh\n * @internal\n * @param subType - gizmoSubType 类型\n * @param options - 几何体参数\n * @returns 几何体 Mesh\n */\nfunction createBasicMesh (engine: Engine, subType: GizmoSubType, options: MeshOption, materialType = 'default'): Mesh {\n const {\n size, color, alpha, renderMode, depthTest, name,\n } = options;\n let geometryType: GeometryType;\n\n switch (subType) {\n case GizmoSubType.sphere:\n geometryType = GeometryType.Sphere;\n\n break;\n case GizmoSubType.cylinder:\n geometryType = GeometryType.Cylinder;\n\n break;\n case GizmoSubType.cone:\n geometryType = GeometryType.Cone;\n\n break;\n case GizmoSubType.torus:\n geometryType = GeometryType.Torus;\n\n break;\n case GizmoSubType.sprite:\n geometryType = GeometryType.Sprite;\n\n break;\n case GizmoSubType.plane:\n geometryType = GeometryType.Plane;\n\n break;\n case GizmoSubType.frustum:\n geometryType = GeometryType.Frustum;\n\n break;\n case GizmoSubType.directionLight:\n geometryType = GeometryType.DirectionLight;\n\n break;\n case GizmoSubType.spotLight:\n geometryType = GeometryType.SpotLight;\n\n break;\n case GizmoSubType.pointLight:\n geometryType = GeometryType.PointLight;\n\n break;\n case GizmoSubType.floorGrid:\n geometryType = GeometryType.FloorGrid;\n\n break;\n default:\n geometryType = GeometryType.Box;\n\n break;\n }\n const geometry = createGeometry(engine, geometryType, size, renderMode);\n let material;\n\n switch (materialType) {\n case 'blend':\n material = createBlendMaterial(engine, color, depthTest, alpha);\n\n break;\n case 'hideBack':\n material = createHideBackMaterial(engine, color, depthTest);\n\n break;\n default:\n material = createMaterial(engine, color, depthTest);\n\n break;\n }\n\n return Mesh.create(\n engine,\n {\n name: name ? name : geometryType.toString(),\n geometry,\n material,\n priority: 3000,\n });\n}\n\n/**\n * @internal\n * @param options\n * @param texture\n * @param boundingMap\n * @returns\n */\nfunction createSpriteMesh (engine: Engine, options: MeshOption, texture?: Texture, boundingMap?: Map<string, GizmoItemBounding>): Mesh {\n const geometry = createGeometry(engine, GeometryType.Sprite, options.size, renderMode);\n let spriteColor;\n\n if (texture) {\n spriteColor = texture;\n } else {\n spriteColor = options.color;\n }\n\n const material = createSpriteMaterial(engine, spriteColor, options.depthTest);\n\n if (boundingMap) {\n boundingMap.set('sprite', {\n type: BoundingType.sphere,\n radius: Math.pow(Math.pow(options.size.width, 2) + Math.pow(options.size.height, 2), 0.5) / 2,\n });\n }\n\n return Mesh.create(\n engine,\n {\n name: options.name || 'sprite',\n geometry,\n material,\n priority: 3000,\n });\n}\n\n/**\n * 创建材质\n * @internal\n * @param color - 颜色\n * @param depthTest\n * @returns 纯色材质,无光照,无透明\n */\nfunction createMaterial (engine: Engine, color?: vec3, depthTest?: boolean): Material {\n const myColor = color ? Vector3.fromArray(color) : new Vector3(255, 255, 255);\n const myDepthTest = depthTest ? depthTest : false;\n\n const material = Material.create(\n engine,\n {\n uniformValues: {\n u_color: new Float32Array(myColor.toArray()),\n u_model: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n },\n shader: {\n fragment: `\n precision mediump float;\n\n uniform vec3 u_color;\n\n void main(){\n gl_FragColor = vec4(u_color,1.0);\n }`,\n vertex: `\n precision highp float;\n\n attribute vec3 a_Position;\n\n uniform mat4 u_model;\n uniform mat4 effects_MatrixV;\n uniform mat4 _MatrixP;\n\n void main(){\n gl_Position = _MatrixP * effects_MatrixV * u_model * vec4(a_Position,1.0);\n }`,\n shared: true,\n },\n });\n\n material.setVector3('u_color', myColor);\n material.setMatrix('u_model', Matrix4.IDENTITY);\n material.depthTest = myDepthTest;\n material.stencilTest = false;\n material.blending = false;\n material.depthMask = true;\n\n return material;\n}\n\n/**\n *\n * @internal\n * @param color\n * @param depthTest\n * @returns\n */\nfunction createHideBackMaterial (engine: Engine, color?: vec3, depthTest?: boolean): Material {\n const myColor = color ? Vector3.fromArray(color) : new Vector3(255, 255, 255);\n const myDepthTest = depthTest ? depthTest : false;\n\n const material = Material.create(\n engine,\n {\n uniformValues: {\n u_color: new Float32Array(myColor.toArray()),\n u_model: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n u_cameraPos: new Float32Array([0, 0, 0]),\n u_center: new Float32Array([0, 0, 0]),\n },\n shader: {\n fragment: `\n precision mediump float;\n\n uniform vec3 u_color;\n\n varying float flag;\n\n void main(){\n if(flag > 0.0) {\n discard;\n }\n\n gl_FragColor = vec4(u_color,1.0);\n }`,\n vertex: `\n precision highp float;\n\n attribute vec3 a_Position;\n\n uniform mat4 u_model;\n uniform mat4 effects_MatrixV;\n uniform mat4 _MatrixP;\n\n uniform vec3 u_cameraPos;\n uniform vec3 u_center;\n\n varying float flag;\n void main(){\n float distance = length(u_cameraPos - u_center);\n vec3 worldPosition = (u_model * vec4(a_Position,1.0)).xyz;\n flag = length(u_cameraPos - worldPosition) - distance;\n gl_Position = _MatrixP * effects_MatrixV * u_model * vec4(a_Position,1.0);\n }`,\n shared: true,\n },\n });\n\n material.setVector3('u_color', myColor);\n material.setMatrix('u_model', Matrix4.IDENTITY);\n material.setVector3('u_cameraPos', Vector3.ZERO);\n material.setVector3('u_center', Vector3.ZERO);\n\n material.depthTest = myDepthTest;\n material.stencilTest = false;\n material.blending = false;\n material.depthMask = true;\n\n return material;\n}\n\n/**\n *\n * @internal\n * @param color\n * @param depthTest\n * @param alpha\n * @returns\n */\nfunction createBlendMaterial (engine: Engine, color?: vec3, depthTest?: boolean, alpha?: number): Material {\n const myColor = color ? Vector3.fromArray(color) : new Vector3(255, 255, 255);\n const myDepthTest = depthTest ? depthTest : false;\n const myAlpha = alpha ? alpha : 1;\n\n const material = Material.create(\n engine,\n {\n uniformValues: {\n u_color: new Float32Array(myColor.toArray()),\n u_alpha: new Float32Array([myAlpha, 0]),\n u_model: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n },\n shader: {\n shared: true,\n fragment: `\n precision mediump float;\n\n uniform vec3 u_color;\n uniform vec2 u_alpha;\n\n void main(){\n gl_FragColor = vec4(u_color,u_alpha);\n }`,\n vertex: `\n precision highp float;\n\n attribute vec3 a_Position;\n\n uniform mat4 u_model;\n uniform mat4 effects_MatrixV;\n uniform mat4 _MatrixP;\n void main(){\n gl_Position = _MatrixP * effects_MatrixV * u_model * vec4(a_Position,1.0);\n }`,\n },\n });\n\n material.setVector3('u_color', myColor);\n material.setVector2('u_alpha', new Vector2(myAlpha, 0));\n material.setMatrix('u_model', Matrix4.IDENTITY);\n material.depthTest = myDepthTest;\n material.stencilTest = false;\n material.blending = true;\n material.blendEquation = [glContext.FUNC_ADD, glContext.FUNC_ADD];\n material.blendFunction = [glContext.SRC_ALPHA, glContext.ONE_MINUS_SRC_ALPHA, glContext.SRC_ALPHA, glContext.ONE_MINUS_SRC_ALPHA];\n material.depthMask = true;\n\n return material;\n}\n\nfunction createSpriteMaterial (engine: Engine, data?: vec3 | Texture, depthTest?: boolean): Material {\n const myDepthTest = depthTest ? depthTest : false;\n const uniformValues = {\n u_model: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n u_alpha: new Float32Array([1, 0]),\n };\n\n const material = Material.create(\n engine,\n {\n uniformValues,\n shader: {\n shared: true,\n fragment: `\n precision highp float;\n\n uniform vec2 u_alpha;\n uniform vec3 u_color;\n uniform sampler2D u_iconTex;\n\n varying vec2 v_uv;\n\n void main(){\n vec4 color = texture2D(u_iconTex, vec2(v_uv.x, 1.0 - v_uv.y));\n if(color.a < 0.001)\n {\n discard;\n }\n gl_FragColor = vec4(color.xyz, color.w * u_alpha.x);\n }`,\n vertex: `\n precision highp float;\n\n attribute vec3 a_Position;\n attribute vec2 a_UV1;\n\n uniform mat4 u_model;\n uniform mat4 effects_MatrixV;\n uniform mat4 _MatrixP;\n uniform mat4 effects_MatrixInvV;\n varying vec2 v_uv;\n\n void main(){\n v_uv = a_UV1;\n vec4 pos = u_model * vec4(0., 0., 0., 1.0);\n // vec4 pos = u_model * vec4(a_Position,1.0);\n\n pos.xyz += effects_MatrixInvV[0].xyz * a_Position.x + effects_MatrixInvV[1].xyz * a_Position.y;\n gl_Position = _MatrixP * effects_MatrixV * pos;\n }`,\n },\n });\n\n material.setMatrix('u_model', Matrix4.IDENTITY);\n material.setVector2('u_alpha', new Vector2(1, 0));\n\n if (data instanceof Texture) {\n material.setTexture('u_iconTex', data);\n // uniformValues.u_iconTex = data;\n } else {\n let color: Vector3;\n\n if (data === undefined) {\n color = new Vector3(255, 255, 255);\n } else {\n color = Vector3.fromArray(data);\n }\n material.setVector3('u_color', color);\n // uniformValues.u_color = new Float32Array(color);\n }\n\n material.depthTest = myDepthTest;\n material.stencilTest = false;\n material.blending = true;\n material.blendEquation = [glContext.FUNC_ADD, glContext.FUNC_ADD];\n material.blendFunction = [glContext.SRC_ALPHA, glContext.ONE_MINUS_SRC_ALPHA, glContext.SRC_ALPHA, glContext.ONE_MINUS_SRC_ALPHA];\n\n return material;\n}\n\n/**\n * 创建坐标轴包围盒\n * @internal\n * @param size 包围盒尺寸\n * @param boundingMap 包围盒 Map\n */\nfunction createAxisBounding (size: { width: number, length: number }, boundingMap: Map<string, GizmoItemBounding>) {\n boundingMap.set('xAxis', {\n type: BoundingType.line,\n points: [new Vector3(0, 0, 0), new Vector3(size.length, 0, 0)],\n width: size.width,\n });\n boundingMap.set('yAxis', {\n type: BoundingType.line,\n points: [new Vector3(0, 0, 0), new Vector3(0, size.length, 0)],\n width: size.width,\n });\n boundingMap.set('zAxis', {\n type: BoundingType.line,\n points: [new Vector3(0, 0, 0), new Vector3(0, 0, size.length)],\n width: size.width,\n });\n}\n","import type { Camera } from '@galacean/effects';\nimport { math } from '@galacean/effects';\nimport { distanceOfPointAndLine, projectionOfPointAndLine } from './math-utils';\n\ntype Vector2 = math.Vector2;\ntype Vector3 = math.Vector3;\ntype Matrix4 = math.Matrix4;\n\nconst { Matrix4, Vector2, Vector3 } = math;\n\n/**\n * 线条包围盒射线检测算法\n * @param out - 射线与包围盒交点位置\n * @param pointInCanvas - 归一化的画布交互点坐标\n * @param points - 线条包围盒两端点位置\n * @param radius - 线条包围盒辐射半径\n * @param camera - 相机对象\n * @returns 射线与包围盒交点位置 | undefined\n */\nexport function intersectRayLine (\n out: Vector3,\n pointInCanvas: Vector2,\n points: [p0: Vector3, p1: Vector3],\n radius: number,\n worldMat4: Matrix4,\n camera: Camera,\n): Vector3 | undefined {\n // 构造一个辐射半径边缘的点 radiusPoint\n const up = new Vector3(\n worldMat4.elements[1],\n worldMat4.elements[5],\n worldMat4.elements[9],\n ).normalize();\n\n const radiusPoint = up.clone().multiply(radius);\n\n radiusPoint.add(points[0]);\n\n // 计算 start、end、radius 在屏幕空间上的投影\n const mvpMat4 = camera.getModelViewProjection(new Matrix4(), worldMat4);\n\n const screenStart = mvpMat4.projectPoint(points[0], new Vector3());\n const screenEnd = mvpMat4.projectPoint(points[1], new Vector3());\n const screenRadiusPoint = mvpMat4.projectPoint(radiusPoint, new Vector3());\n\n const screenRadiusVector = screenRadiusPoint.clone().subtract(screenStart);\n\n const screenRadius = screenRadiusVector.length();\n\n // 计算屏幕交互点与线条的距离\n const { distance, isInLine } = distanceOfPointAndLine(pointInCanvas, [screenStart.toVector2(), screenEnd.toVector2()]);\n\n if (distance <= screenRadius && isInLine) { // 距离小于阈值且交互点在线条上的投影位于线段内\n // 计算交互点在线条上的投影并转换为世界坐标\n const screenPosition = projectionOfPointAndLine(pointInCanvas, [screenStart, screenEnd]);\n const inverseViewProjection = camera.getInverseViewProjectionMatrix();\n\n inverseViewProjection.projectPoint(screenPosition, out);\n\n return out;\n }\n}\n","import type { Engine, spec } from '@galacean/effects';\nimport { Geometry, Material, Mesh, glContext, math } from '@galacean/effects';\n\ntype vec3 = spec.vec3;\ntype Vector3 = math.Vector3;\ntype Matrix4 = math.Matrix4;\n\nconst { Euler, Vector3, Matrix4 } = math;\n\nconst rectSize = 0.04;\nconst DEG2RAD = Math.PI / 180;\n\ninterface GeometryData {\n points: Vector3[],\n indices: number[],\n}\n\ninterface ArcPathOptions {\n plane?: string,\n translate?: vec3,\n rotate?: vec3,\n}\n\nfunction arcPath (radius: number, arc: number, options: ArcPathOptions = {}): GeometryData {\n const { plane, translate = [0, 0, 0], rotate = [0, 0, 0] } = options;\n const rotMat4 = Euler.fromArray(rotate).negate().toMatrix4(new Matrix4());\n const points: Vector3[] = [];\n const indices = [];\n\n addPoint(radius, 0);\n let i = 1;\n\n for (; i <= arc; i++) {\n const angle = i * DEG2RAD;\n\n indices.push(i - 1, i);\n addPoint(Math.cos(angle) * radius, Math.sin(angle) * radius);\n }\n\n return {\n points,\n indices,\n };\n\n function addPoint (cos: number, sin: number) {\n const point = new Vector3();\n\n if (plane === 'xz') {\n point.set(cos, 0, sin);\n } else if (plane === 'yz') {\n point.set(0, cos, sin);\n } else {\n point.set(cos, sin, 0);\n }\n rotMat4.transformNormal(point);\n points.push(point.add(translate));\n }\n}\n\nfunction line (p0: vec3, p1: vec3): GeometryData {\n return {\n points: [\n Vector3.fromArray(p0),\n Vector3.fromArray(p1),\n ],\n indices: [0, 1],\n };\n}\n\nfunction box (width: number, height: number, depth: number, center?: number[]): GeometryData {\n const w = width / 2;\n const h = height / 2;\n const d = depth / 2;\n const myCenter = center ?? [0, 0, 0];\n const points: Vector3[] = [\n [-w, h, -d], [-w, -h, -d], [-w, h, d], [-w, -h, d],\n [w, h, -d], [w, -h, -d], [w, h, d], [w, -h, d],\n ].map(item => {\n return new Vector3(item[0] + myCenter[0], item[1] + myCenter[1], item[2] + myCenter[2]);\n });\n\n return {\n points,\n indices: [\n 0, 1, 1, 3, 3, 2, 2, 0,\n 4, 5, 5, 7, 7, 6, 6, 4,\n 0, 4, 2, 6, 3, 7, 1, 5,\n ],\n };\n}\n\nfunction rect (width: number, height: number, pos?: vec3): GeometryData {\n const w = width / 2;\n const h = height / 2;\n const points: Vector3[] = [\n new Vector3(-w, h, 0),\n new Vector3(w, h, 0),\n new Vector3(w, -h, 0),\n new Vector3(-w, -h, 0),\n ];\n\n if (pos) {\n points.forEach(vec => {\n vec.add(pos);\n });\n }\n\n return {\n points,\n indices: [\n 0, 1, 1, 2, 2, 3, 3, 0,\n ],\n };\n}\n\nfunction combineGeometries (geometries: GeometryData[]) {\n const points: number[] = [];\n const indices: number[] = [];\n\n for (let i = 0, indicesBase = 0; i < geometries.length; i++) {\n const geometry = geometries[i];\n\n if (geometry) {\n geometry.points.forEach(point => {\n points.push(point.x, point.y, point.z);\n });\n geometry.indices.forEach(index => indices.push(index + indicesBase));\n indicesBase += geometry.points.length;\n }\n }\n\n return {\n points: new Float32Array(points),\n indices: new Uint16Array(indices),\n };\n}\n\nconst Shapes: Record<string, (arg: any) => GeometryData[]> = {\n Texture (arg: any) {\n const ret = [];\n\n if (arg.detail) {\n const anchors = arg.detail.anchors;\n const block = arg.detail.block;\n const width = arg.width;\n const height = arg.height;\n\n for (let i = 0; i < anchors.length; i += 2) {\n ret.push(rect(block[0] * width, block[1] * height, [\n width * (anchors[i] - 0.5),\n height * (anchors[i + 1] - 0.5),\n 0,\n ]));\n }\n } else {\n ret.unshift(Shapes.Rectangle(arg)[0]);\n }\n\n return ret;\n },\n Circle (arg: any) {\n const { radius, arc } = arg;\n\n return [\n arcPath(radius, arc),\n arc !== 360 && line([0, 0, 0], [radius, 0, 0]),\n arc !== 360 && line([0, 0, 0], [Math.cos(arc * DEG2RAD) * radius, Math.sin(arc * DEG2RAD) * radius, 0]),\n ] as GeometryData[];\n },\n Box: function (arg: any) {\n const {\n width, height, depth, center,\n } = arg;\n const data = box(width, height, depth, center);\n\n return [data];\n },\n Sphere: function (arg) {\n const { radius, arc } = arg;\n const ret = [\n line([0, 0, -radius], [0, 0, radius]),\n arcPath(radius, arc > 180 ? 360 : 180, { plane: 'xz', rotate: [0, 90, 0] }),\n arcPath(radius, arc, { plane: 'xy' }),\n arcPath(radius, 180, { plane: 'xz', rotate: [0, 90, arc] }),\n ];\n\n if (arc > 90) {\n ret.push(arcPath(radius, arc > 270 ? 360 : 180, { plane: 'yz', rotate: [-90, 0, 0] }));\n }\n\n return ret;\n },\n Hemisphere (arg) {\n const { radius, arc } = arg;\n const ret = [\n line([0, 0, radius], [0, 0, 0]), //z\n line([arc > 180 ? -radius : 0, 0, 0], [radius, 0, 0]), //x\n arg > 90 && line([0, arc > 270 ? -radius : 0, 0], [0, radius, 0]), //y\n arcPath(radius, (arc > 180 ? 360 : 180) / 2, { plane: 'xz' }),\n arcPath(radius, arc, { plane: 'xy' }),\n arcPath(radius, 90, { plane: 'xz', rotate: [0, 0, arc] }),\n line([0, 0, 0], [Math.cos(arc * DEG2RAD) * radius, Math.sin(arc * DEG2RAD) * radius, 0]),\n ] as GeometryData[];\n\n if (arc > 90) {\n ret.push(arcPath(radius, arc > 270 ? 180 : 90, { plane: 'yz' }));\n }\n\n return ret;\n },\n Cone (arg) {\n const { radius, arc } = arg;\n const outerRadius = radius * Math.tan(arg.angle * DEG2RAD) + radius;\n\n return [\n arcPath(outerRadius, arc, { translate: [0, 0, radius] }),\n line([radius, 0, 0], [outerRadius, 0, radius]),\n arc > 90 && line([0, radius, 0], [0, outerRadius, radius]),\n arc > 180 && line([-radius, 0, 0], [-outerRadius, 0, radius]),\n arc > 270 && line([0, -radius, 0], [0, -outerRadius, radius]),\n line([Math.cos(arc * DEG2RAD) * radius, Math.sin(arc * DEG2RAD) * radius, 0],\n [Math.cos(arc * DEG2RAD) * outerRadius, Math.sin(arc * DEG2RAD) * outerRadius, radius]),\n ].concat(Shapes.Circle(arg)) as GeometryData[];\n },\n Edge (arg) {\n const hw = arg.width / 2;\n\n return [\n line([-hw, 0, 0], [hw, 0, 0]),\n ];\n },\n Rectangle (arg) {\n return [\n rect(arg.width, arg.height),\n ];\n },\n RectangleEdge (arg) {\n return [\n rect(arg.width, arg.height),\n ];\n },\n Donut (arg) {\n const { arc, radius, donutRadius } = arg;\n\n return [\n arcPath(donutRadius, 360, { translate: [radius, 0, 0], rotate: [90, 0, 0] }),\n arcPath(radius - donutRadius, arc),\n arcPath(radius + donutRadius, arc),\n arcPath(radius, arc, { translate: [0, 0, donutRadius] }),\n arcPath(radius, arc, { translate: [0, 0, -donutRadius] }),\n arc % 360 === 0 ? arcPath(donutRadius, 360, {\n translate: [-radius, 0, 0],\n rotate: [90, 0, 0],\n }) : arcPath(donutRadius, 360, {\n translate: [Math.cos(arc * DEG2RAD) * radius, Math.sin(arc * DEG2RAD) * radius, 0],\n rotate: [90, 0, arc],\n }),\n ];\n },\n path (arg) {\n const positions = arg.keys;\n const ret = [];\n\n for (let i = 0; i < positions.length - 1; i++) {\n ret.push(rect(rectSize, rectSize, positions[i]));\n ret.push(line(positions[i], positions[i + 1]));\n }\n ret.push(rect(rectSize, rectSize, positions[positions.length - 1]));\n\n return ret;\n },\n};\n\nShapes['0'] = Shapes.None;\nShapes['1'] = Shapes.Sphere;\nShapes['2'] = Shapes.Cone;\nShapes['3'] = Shapes.Hemisphere;\nShapes['4'] = Shapes.Circle;\nShapes['5'] = Shapes.Donut;\nShapes['6'] = Shapes.Rectangle;\nShapes['7'] = Shapes.RectangleEdge;\nShapes['8'] = Shapes.Edge;\nShapes['9'] = Shapes.Texture;\n\nexport function createMeshFromShape (engine: Engine, args: { shape: string, type?: number }, options: { color?: vec3, depthTest?: boolean }): Mesh {\n const ret = Shapes[args.type || args.shape](args);\n const geo = combineGeometries(ret);\n\n return createMesh(engine, geo.points, geo.indices, options.color || [1, 0, 0], options.depthTest, args.shape);\n}\n\nfunction createMesh (engine: Engine, points: Float32Array, indices: Uint16Array, color: vec3, depthTest = false, name?: string): Mesh {\n const material = Material.create(\n engine,\n {\n uniformValues: {\n u_color: new Float32Array(color),\n u_model: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n },\n shader: {\n shared: true,\n fragment: `\n precision mediump float;\n\n uniform vec3 u_color;\n\n void main(){\n gl_FragColor = vec4(u_color,1.0);\n }`,\n vertex: `precision highp float;\n\n attribute vec3 a_Position;\n\n uniform mat4 u_model;\n uniform mat4 effects_MatrixVP;\n void main(){\n gl_Position = effects_MatrixVP * u_model * vec4(a_Position,1.0);\n }`,\n },\n });\n\n material.setVector3('u_color', Vector3.fromArray(color));\n material.setMatrix('u_model', Matrix4.IDENTITY);\n material.depthTest = depthTest;\n material.stencilTest = false;\n material.blending = false;\n material.depthMask = true;\n const geometry = Geometry.create(\n engine,\n {\n attributes: {\n a_Position: {\n size: 3,\n data: points,\n },\n },\n indices: {\n data: indices,\n },\n mode: glContext.LINES,\n drawCount: indices.length,\n });\n\n return Mesh.create(\n engine,\n {\n name,\n geometry,\n material,\n priority: 3000,\n });\n}\n","import type { Composition, Scene, SceneLoadOptions, Texture, VFXItem } from '@galacean/effects';\nimport { Plugin } from '@galacean/effects';\nimport { axisIconMap } from './constants';\nimport { createImage, createTexture } from './util';\nimport { GizmoComponent } from './gizmo-component';\n\nconst iconImages: Map<string, HTMLImageElement> = new Map();\n\nexport const iconTextures: Map<string, Texture> = new Map();\n\nexport class EditorGizmoPlugin extends Plugin {\n override order = 1001;\n\n override async onAssetsLoadStart (scene: Scene, options?: SceneLoadOptions | undefined): Promise<void> {\n iconTextures.clear();\n\n if (iconImages.size !== axisIconMap.size) {\n for (const [name, data] of axisIconMap) {\n iconImages.set(name, await createImage(data));\n }\n }\n }\n\n override onCompositionCreated (composition: Composition, scene: Scene) {\n const engine = composition.renderer.engine;\n\n iconImages.forEach((image, name) => {\n iconTextures.set(name, createTexture(engine, image));\n });\n iconImages.clear();\n\n const items = composition.items;\n const targetMap: { [key: string]: VFXItem[] } = {};\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const gizmoComponent = item.getComponent(GizmoComponent);\n\n if (gizmoComponent) {\n if (!targetMap[gizmoComponent.target]) {\n targetMap[gizmoComponent.target] = [];\n }\n targetMap[gizmoComponent.target].push(item);\n }\n }\n composition.loaderData.gizmoTarget = targetMap;\n composition.loaderData.gizmoItems = [];\n }\n}\n","import { math } from '@galacean/effects';\n\n/** Effects runtime 使用的 core math 构造器与工具。 */\nexport const Color = math.Color;\nexport const Euler = math.Euler;\nexport const EulerOrder = math.EulerOrder;\nexport const Matrix3 = math.Matrix3;\nexport const Matrix4 = math.Matrix4;\nexport const Quaternion = math.Quaternion;\nexport const Ray = math.Ray;\nexport const Vector2 = math.Vector2;\nexport const Vector3 = math.Vector3;\nexport const DEG2RAD = math.DEG2RAD;\nexport const RAD2DEG = math.RAD2DEG;\nexport const clamp = math.clamp;\nexport const isEqual = math.isEqual;\nexport const isZero = math.isZero;\n\n/** Effects runtime 使用的 core math 实例类型。 */\nexport type Color = math.Color;\nexport type Euler = math.Euler;\nexport type EulerOrder = math.EulerOrder;\nexport type Matrix3 = math.Matrix3;\nexport type Matrix4 = math.Matrix4;\nexport type Quaternion = math.Quaternion;\nexport type Ray = math.Ray;\nexport type Vector2 = math.Vector2;\nexport type Vector3 = math.Vector3;\n","import { NumberEpsilon } from './utils';\n/**\n * 二维向量\n */\nexport class Vector2 {\n x;\n y;\n /**\n * 二维向量的常量\n */\n static ONE = new Vector2(1.0, 1.0);\n static ZERO = new Vector2(0.0, 0.0);\n /**\n * 构造函数,默认为零向量\n * @param [x=0] - x 分量\n * @param [y=0] - y 分量\n */\n constructor(x = 0, y = 0) {\n this.x = x;\n this.y = y;\n }\n /**\n * 设置向量\n * @param x - x 轴分量\n * @param y - y 轴分量\n * @returns\n */\n set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n /**\n * 设置零向量\n * @returns 向量\n */\n setZero() {\n this.x = 0;\n this.y = 0;\n return this;\n }\n /**\n * 通过标量数值创建向量\n * @param num - 数值\n * @returns 向量\n */\n setFromNumber(num) {\n this.x = num;\n this.y = num;\n return this;\n }\n /**\n * 通过数组创建向量\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 向量\n */\n setFromArray(array, offset = 0) {\n this.x = array[offset] ?? 0;\n this.y = array[offset + 1] ?? 0;\n return this;\n }\n /**\n * 拷贝向量\n * @param src - 要拷贝的对象\n * @returns 向量\n */\n copyFrom(src) {\n this.x = src.x;\n this.y = src.y;\n return this;\n }\n /**\n * 克隆向量\n * @returns 克隆结果\n */\n clone() {\n return new Vector2(this.x, this.y);\n }\n /**\n * 根据下标设置元素值\n * @param index - 下标值\n * @param value - 数字\n * @returns 向量\n */\n setElement(index, value) {\n switch (index) {\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n default: console.error('index is out of range: ' + index);\n }\n return this;\n }\n /**\n * 根据下标获取值\n * @param index - 下标\n * @returns 值\n */\n getElement(index) {\n switch (index) {\n case 0: return this.x;\n case 1: return this.y;\n default: console.error('index is out of range: ' + index);\n }\n return 0;\n }\n /**\n * 向量相加\n * @param right - 向量 | 数字\n * @returns 向量\n */\n add(right) {\n if (typeof right === 'number') {\n this.x += right;\n this.y += right;\n }\n else if (right instanceof Array) {\n this.x += right[0];\n this.y += right[1];\n }\n else {\n this.x += right.x;\n this.y += right.y;\n }\n return this;\n }\n /**\n * 向量相加\n * @param left - 向量\n * @param right - 向量\n * @returns 相加结果\n */\n addVectors(left, right) {\n this.x = left.x + right.x;\n this.y = left.y + right.y;\n return this;\n }\n /**\n * 向量相减\n * @param right - 向量 | 数字\n * @returns 相减结果\n */\n subtract(right) {\n if (typeof right === 'number') {\n this.x -= right;\n this.y -= right;\n }\n else if (right instanceof Array) {\n this.x -= right[0];\n this.y -= right[1];\n }\n else {\n this.x -= right.x;\n this.y -= right.y;\n }\n return this;\n }\n /**\n * 向量相减\n * @param left - 向量\n * @param right - 向量\n * @returns 相减结果\n */\n subtractVectors(left, right) {\n this.x = left.x - right.x;\n this.y = left.y - right.y;\n return this;\n }\n /**\n * 向量相乘\n * @param right - 向量 | 数字\n * @returns 相乘结果\n */\n multiply(right) {\n if (typeof right === 'number') {\n this.x *= right;\n this.y *= right;\n }\n else if (right instanceof Array) {\n this.x *= right[0];\n this.y *= right[1];\n }\n else {\n this.x *= right.x;\n this.y *= right.y;\n }\n return this;\n }\n /**\n * 向量相乘\n * @param left - 向量\n * @param right - 向量\n * @returns 相乘结果\n */\n multiplyVectors(left, right) {\n this.x = left.x * right.x;\n this.y = left.y * right.y;\n return this;\n }\n /**\n * 向量相除\n * @param right - 向量 | 数字\n * @returns 相除结果\n */\n divide(right) {\n if (typeof right === 'number') {\n this.x /= right;\n this.y /= right;\n }\n else if (right instanceof Array) {\n this.x /= right[0];\n this.y /= right[1];\n }\n else {\n this.x /= right.x;\n this.y /= right.y;\n }\n return this;\n }\n /**\n * 向量缩放\n * @param v - 数字\n * @returns 缩放结果\n */\n scale(v) {\n this.x *= v;\n this.y *= v;\n return this;\n }\n /**\n * 分量求和\n * @returns 求和结果\n */\n sum() {\n return this.x + this.y;\n }\n /**\n * 向量求最小值\n * @param v - 向量\n * @returns 最小值\n */\n min(v) {\n if (typeof v === 'number') {\n this.x = Math.min(this.x, v);\n this.y = Math.min(this.y, v);\n }\n else {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n }\n return this;\n }\n /**\n * 向量求最大值\n * @param v - 向量\n * @returns 最大值\n */\n max(v) {\n if (typeof v === 'number') {\n this.x = Math.max(this.x, v);\n this.y = Math.max(this.y, v);\n }\n else {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n }\n return this;\n }\n /**\n * 向量阈值约束\n * @param min - 极小值\n * @param max - 极大值\n * @returns 向量\n */\n clamp(min, max) {\n return this.max(min).min(max);\n }\n /**\n * 向量向下取整\n * @returns 取整结果\n */\n floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n return this;\n }\n /**\n * 向量向上取整\n * @returns 取整结果\n */\n ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n return this;\n }\n /**\n * 向量取四舍五入\n * @returns 四舍五入结果\n */\n round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n return this;\n }\n /**\n * 向量取绝对值\n * @returns 向量\n */\n abs() {\n this.x = Math.abs(this.x);\n this.y = Math.abs(this.y);\n return this;\n }\n /**\n * 向量取反\n * @returns 取反结果\n */\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n /**\n * 向量长度\n * @returns 求值结果\n */\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n /**\n * 向量长度平方\n * @returns 求值结果\n */\n lengthSquared() {\n return this.x * this.x + this.y * this.y;\n }\n /**\n * 向量归一化\n * @returns 归一化结果\n */\n normalize() {\n return this.divide(this.length() || 1);\n }\n /**\n * 设置向量长度\n * @param length - 长度\n * @returns 向量\n */\n setLength(length) {\n return this.normalize().multiply(length);\n }\n /**\n * 向量线性插值\n * @param other - 向量\n * @param alpha - 插值比\n * @returns 计算结果\n */\n lerp(other, alpha) {\n this.x += (other.x - this.x) * alpha;\n this.y += (other.y - this.y) * alpha;\n return this;\n }\n /**\n * 向量线性插值\n * @param v1 - 向量\n * @param v2 - 向量\n * @param alpha - 插值比\n * @returns 计算结果\n */\n lerpVectors(v1, v2, alpha) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n return this;\n }\n /**\n * 向量点乘\n * @param v - 向量\n * @returns 点乘结果\n */\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n /**\n * 向量叉乘\n * @param v - 向量\n * @returns 叉乘结果\n */\n cross(v) {\n return this.x * v.y - this.y * v.x;\n }\n /**\n * 点距离\n * @param v - 点\n * @returns 距离\n */\n distance(v) {\n const dx = this.x - v.x;\n const dy = this.y - v.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n /**\n * 点距离平方\n * @param v - 点\n * @returns 距离平方\n */\n distanceSquared(v) {\n const dx = this.x - v.x;\n const dy = this.y - v.y;\n return dx * dx + dy * dy;\n }\n /**\n * 向量判等\n * @param v - 向量\n * @returns 判等结果\n */\n equals(v) {\n return this.x === v.x && this.y === v.y;\n }\n /**\n * 是否零向量\n * @returns 是否零向量\n */\n isZero() {\n const eps = NumberEpsilon;\n const { x, y } = this;\n return Math.abs(x) <= eps && Math.abs(y) <= eps;\n }\n /**\n * 向量转数组\n * @returns 数组\n */\n toArray() {\n return [this.x, this.y];\n }\n fill(array, offset = 0) {\n array[offset] = this.x;\n array[offset + 1] = this.y;\n }\n /**\n * 计算向量相对于正 x 轴的角度(弧度)\n * @returns 弧度值\n */\n angle() {\n const angle = Math.atan2(-this.y, -this.x) + Math.PI;\n return angle;\n }\n /**\n * 绕指定中心点旋转向量\n * @param center - 旋转中心\n * @param angle - 旋转角度(弧度)\n * @returns 旋转结果\n */\n rotateAround(center, angle) {\n const c = Math.cos(angle), s = Math.sin(angle);\n const x = this.x - center.x;\n const y = this.y - center.y;\n this.x = x * c - y * s + center.x;\n this.y = x * s + y * c + center.y;\n return this;\n }\n /**\n * 随机生成向量\n * @returns 向量\n */\n random() {\n this.x = Math.random();\n this.y = Math.random();\n return this;\n }\n /**\n * 通过标量创建向量\n * @param num - 数值\n * @returns 向量\n */\n static fromNumber(num) {\n return new Vector2().setFromNumber(num);\n }\n /**\n * 通过数组创建向量\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 向量\n */\n static fromArray(array, offset = 0) {\n return new Vector2().setFromArray(array, offset);\n }\n}\n","export const PI2 = Math.PI * 2;\nexport const DEG2RAD = Math.PI / 180;\nexport const RAD2DEG = 180 / Math.PI;\nexport const NumberEpsilon = 1e-6;\nexport function isZero(v) {\n return isNaN(v) || Math.abs(v) < NumberEpsilon;\n}\nexport function isEqual(a, b) {\n return Math.abs(a - b) < NumberEpsilon || (a === Infinity && b === Infinity) || (a === -Infinity && b === -Infinity);\n}\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nexport const damp = (x, y, lambda, dt) => lerp(x, y, 1 - Math.exp(-lambda * dt));\n// https://en.wikipedia.org/wiki/Linear_interpolation\nexport const lerp = (x, y, t) => (1 - t) * x + t * y;\nexport const degToRad = (degrees) => degrees * DEG2RAD;\nexport const radToDeg = (radians) => radians * RAD2DEG;\nexport function clamp(value, min, max) {\n const fixedMin = isNaN(min) ? -Infinity : min;\n const fixedMax = isNaN(max) ? Infinity : max;\n const lower = Math.min(fixedMin, fixedMax);\n const upper = Math.max(fixedMin, fixedMax);\n return Math.min(Math.max(value, lower), upper);\n}\n","import { Vector2 } from '../core/vector2';\n/**\n * 二维轴对齐包围盒(AABB)。\n *\n * 包围盒仅由 `min` 和 `max` 表示,\n * 不保存旋转后的角点或其它 OBB 状态。\n */\nexport class Box2 {\n min;\n max;\n /**\n * 构造函数,传入值为空时表示空包围盒。\n * @param min - 最小点\n * @param max - 最大点\n */\n constructor(min = new Vector2(+Infinity, +Infinity), max = new Vector2(-Infinity, -Infinity)) {\n this.min = min.clone();\n this.max = max.clone();\n }\n /**\n * 通过最大、最小点设置二维包围盒。\n * @param min - 最小点\n * @param max - 最大点\n * @returns 当前包围盒\n */\n set(min, max) {\n this.min.copyFrom(min);\n this.max.copyFrom(max);\n return this;\n }\n /**\n * 通过二维空间点集合设置包围盒。\n * @param points - 二维空间点集合\n * @returns 当前包围盒\n */\n setFromPoints(points) {\n this.makeEmpty();\n for (let i = 0, il = points.length; i < il; i++) {\n this.expandByPoint(points[i]);\n }\n return this;\n }\n /**\n * 通过中心与大小设置二维包围盒。\n * @param center - 中心点\n * @param size - 包围盒大小\n * @returns 当前包围盒\n */\n setFromCenterAndSize(center, size) {\n const halfSize = size.clone().multiply(0.5);\n this.min.copyFrom(center).subtract(halfSize);\n this.max.copyFrom(center).add(halfSize);\n return this;\n }\n /**\n * 克隆二维包围盒。\n * @returns 克隆结果\n */\n clone() {\n return new Box2().copyFrom(this);\n }\n /**\n * 复制二维包围盒。\n * @param box - 复制对象\n * @returns 当前包围盒\n */\n copyFrom(box) {\n this.min.copyFrom(box.min);\n this.max.copyFrom(box.max);\n return this;\n }\n /**\n * 将二维包围盒置空。\n * @returns 当前包围盒\n */\n makeEmpty() {\n this.min.x = this.min.y = +Infinity;\n this.max.x = this.max.y = -Infinity;\n return this;\n }\n /**\n * 判断二维包围盒是否为空。\n *\n * 零宽或零高的退化盒仍包含点,不视为空盒。\n * @returns 是否为空包围盒\n */\n isEmpty() {\n return this.max.x < this.min.x || this.max.y < this.min.y;\n }\n /**\n * 获取二维包围盒中心点。\n * @param target - 结果存放对象\n * @returns 二维包围盒中心点\n */\n getCenter(target = new Vector2()) {\n return this.isEmpty() ? target.set(0, 0) : target.addVectors(this.min, this.max).multiply(0.5);\n }\n /**\n * 获取二维包围盒大小。\n * @param target - 结果存放对象\n * @returns 二维包围盒大小\n */\n getSize(target = new Vector2()) {\n return this.isEmpty() ? target.set(0, 0) : target.subtractVectors(this.max, this.min);\n }\n /**\n * 扩展包围盒以包含指定点。\n * @param point - 二维空间点\n * @returns 当前包围盒\n */\n expandByPoint(point) {\n this.min.min(point);\n this.max.max(point);\n return this;\n }\n /**\n * 沿两个坐标轴扩展包围盒。\n * @param vector - 两个坐标轴上的扩展量\n * @returns 当前包围盒\n */\n expandByVector(vector) {\n this.min.subtract(vector);\n this.max.add(vector);\n return this;\n }\n /**\n * 沿两个坐标轴等量扩展包围盒。\n * @param scalar - 扩展量\n * @returns 当前包围盒\n */\n expandByScalar(scalar) {\n this.min.add(-scalar);\n this.max.add(scalar);\n return this;\n }\n /**\n * 判断包围盒是否包含指定点。\n * @param point - 二维空间点\n * @returns 是否包含指定点\n */\n containsPoint(point) {\n return point.x >= this.min.x && point.x <= this.max.x\n && point.y >= this.min.y && point.y <= this.max.y;\n }\n /**\n * 判断当前包围盒是否完整包含另一个包围盒。\n * @param box - 其它包围盒\n * @returns 是否完整包含\n */\n containsBox(box) {\n return this.min.x <= box.min.x\n && box.max.x <= this.max.x\n && this.min.y <= box.min.y\n && box.max.y <= this.max.y;\n }\n /**\n * 获取点在二维包围盒内的比例位置。\n * @param point - 二维空间点\n * @param target - 结果存放对象\n * @returns 点在包围盒内的比例位置\n */\n getParameter(point, target = new Vector2()) {\n return target.set((point.x - this.min.x) / (this.max.x - this.min.x), (point.y - this.min.y) / (this.max.y - this.min.y));\n }\n /**\n * 判断当前包围盒是否与另一个包围盒相交。\n * @param box - 其它包围盒\n * @returns 是否相交\n */\n intersectsBox(box) {\n return box.max.x >= this.min.x\n && box.min.x <= this.max.x\n && box.max.y >= this.min.y\n && box.min.y <= this.max.y;\n }\n /**\n * 将指定点约束在包围盒内。\n * @param point - 二维空间点\n * @param target - 结果存放对象\n * @returns 约束后的点\n */\n clampPoint(point, target = new Vector2()) {\n return target.copyFrom(point).clamp(this.min, this.max);\n }\n /**\n * 获取指定点到包围盒的距离。\n * @param point - 二维空间点\n * @returns 距离\n */\n distanceToPoint(point) {\n const clampedPoint = point.clone().clamp(this.min, this.max);\n return clampedPoint.subtract(point).length();\n }\n /**\n * 计算当前包围盒与另一个包围盒的交集。\n * @param box - 其它包围盒\n * @returns 当前包围盒\n */\n intersect(box) {\n this.min.max(box.min);\n this.max.min(box.max);\n if (this.isEmpty()) {\n this.makeEmpty();\n }\n return this;\n }\n /**\n * 计算当前包围盒与另一个包围盒的并集。\n * @param box - 其它包围盒\n * @returns 当前包围盒\n */\n union(box) {\n this.min.min(box.min);\n this.max.max(box.max);\n return this;\n }\n /**\n * 平移二维包围盒。\n * @param offset - 位移向量\n * @returns 当前包围盒\n */\n translate(offset) {\n this.min.add(offset);\n this.max.add(offset);\n return this;\n }\n /**\n * 判断二维包围盒是否相等。\n * @param box - 其它包围盒\n * @returns 是否相等\n */\n equals(box) {\n return box.min.equals(this.min) && box.max.equals(this.max);\n }\n}\n","import { Vector2 } from '../core/vector2';\n/**\n * 二维圆\n */\nexport class Circle {\n static tempVec0 = new Vector2();\n static tempVec1 = new Vector2();\n center;\n radius;\n /**\n * 构造函数,默认值为圆心为原点,半径为0\n * @param [center=new Vector2()] - 圆心\n * @param [radius=0] - 半径\n */\n constructor(center = Vector2.ZERO, radius = 0) {\n this.center = center.clone();\n this.radius = radius;\n }\n /**\n * 通过中心点与大小设置圆\n * @param center - 圆心\n * @param radius - 半径\n * @returns\n */\n set(center, radius) {\n this.center = center.clone();\n this.radius = radius;\n return this;\n }\n /**\n * 克隆圆\n * @returns 克隆结果\n */\n clone() {\n return new Circle().copyFrom(this);\n }\n /**\n * 复制圆\n * @param circle - 复制对象\n * @returns 复制结果\n */\n copyFrom(circle) {\n this.center.copyFrom(circle.center);\n this.radius = circle.radius;\n return this;\n }\n /**\n * 圆置空\n * @returns 置空结果\n */\n makeEmpty() {\n this.center.set(0, 0);\n this.radius = -1;\n return this;\n }\n /**\n * 圆判空\n * @returns 判空结果\n */\n isEmpty() {\n return this.radius < 0;\n }\n /**\n * 获取圆心\n * @param [target=new Vector2()] - 目标结果对象\n * @returns 圆心\n */\n getCenter(target = new Vector2()) {\n target.copyFrom(this.center);\n return target;\n }\n /**\n * 获取半径\n * @returns 半径\n */\n getRadius() {\n return this.radius;\n }\n /**\n * 通过二维空间点扩展圆\n * @param point - 二维空间点\n * @returns 扩展结果\n */\n expandByPoint(point) {\n if (this.isEmpty()) {\n return this.set(point, 0);\n }\n const offset = Circle.tempVec0.subtractVectors(point, this.center);\n const distance = offset.length();\n if (distance > this.radius) {\n const radius = (this.radius + distance) * 0.5;\n this.center.add(offset.multiply((radius - this.radius) / distance));\n this.radius = radius;\n }\n return this;\n }\n /**\n * 通过大小扩展圆\n * @param scalar - 扩展大小\n * @returns 扩展结果\n */\n expandByScalar(scalar) {\n this.radius += scalar;\n return this;\n }\n /**\n * 判断圆是否包含二维空间点\n * @param point - 二维空间点\n * @returns 包含判断结果\n */\n containsPoint(point) {\n return !this.isEmpty() && this.center.distanceSquared(point) <= this.radius * this.radius;\n }\n /**\n * 判断圆是否包含二维包围盒\n * @param box - 二维包围盒\n * @returns 包含判断结果\n */\n containsBox(box) {\n if (this.isEmpty() || box.isEmpty()) {\n return false;\n }\n const deltaX = Math.max(Math.abs(box.min.x - this.center.x), Math.abs(box.max.x - this.center.x));\n const deltaY = Math.max(Math.abs(box.min.y - this.center.y), Math.abs(box.max.y - this.center.y));\n return deltaX * deltaX + deltaY * deltaY <= this.radius * this.radius;\n }\n /**\n * 判断圆与二维包围盒的相交关系\n * @param box - 二维包围盒\n * @returns 相交判断结果\n */\n intersectsBox(box) {\n return !this.isEmpty() && !box.isEmpty() && box.distanceToPoint(this.center) <= this.radius;\n }\n /**\n * 求点与圆的最短距离\n * @param point - 二维空间点\n * @returns 距离\n */\n distanceToPoint(point) {\n return this.isEmpty() ? Infinity : this.center.distance(point) - this.radius;\n }\n /**\n * 获取两个圆交集的保守包围圆。部分重叠时,真实交集为透镜形,\n * 因此结果取两个输入中较小的圆,并不精确表示交集。\n * @param circle - 二维圆\n * @returns 求交结果\n */\n intersect(circle) {\n if (this.isEmpty() || circle.isEmpty()) {\n return this.makeEmpty();\n }\n const distance = this.center.distance(circle.center);\n if (distance > this.radius + circle.radius) {\n return this.makeEmpty();\n }\n if (this.radius >= distance + circle.radius) {\n return this.copyFrom(circle);\n }\n if (circle.radius >= distance + this.radius) {\n return this;\n }\n return this.radius <= circle.radius ? this : this.copyFrom(circle);\n }\n /**\n * 圆求并集\n * @param circle - 二维圆\n * @returns 求并结果\n */\n union(circle) {\n if (circle.isEmpty()) {\n return this;\n }\n if (this.isEmpty()) {\n return this.copyFrom(circle);\n }\n if (this.center.equals(circle.center)) {\n this.radius = Math.max(this.radius, circle.radius);\n }\n else {\n const point = Circle.tempVec0;\n const offset = Circle.tempVec1.subtractVectors(circle.center, this.center).setLength(circle.radius);\n this.expandByPoint(point.copyFrom(circle.center).add(offset));\n this.expandByPoint(point.copyFrom(circle.center).subtract(offset));\n }\n return this;\n }\n /**\n * 圆的位移\n * @param offset - 二维向量\n * @returns 位移结果\n */\n translate(offset) {\n this.center.add(offset);\n return this;\n }\n /**\n * 圆判等\n * @param circle - 二维圆\n * @returns 判等结果\n */\n equals(circle) {\n return this.center.equals(circle.center) && this.radius === circle.radius;\n }\n}\n","import { clamp } from '../core/utils';\nimport { Vector2 } from '../core/vector2';\nfunction orientation(a, b, c) {\n return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\n}\nfunction onSegment(a, b, point) {\n return point.x >= Math.min(a.x, b.x) && point.x <= Math.max(a.x, b.x)\n && point.y >= Math.min(a.y, b.y) && point.y <= Math.max(a.y, b.y);\n}\n/**\n * 二维线段\n */\nexport class Line2 {\n static tempVec0 = new Vector2();\n static tempVec1 = new Vector2();\n start;\n end;\n /**\n * 构造函数\n * @param [start=Vector2.ZERO] - 线段起点,默认值为(0, 0)\n * @param [end=Vector2.ZERO] - 线段终点,默认值为(0, 0)\n */\n constructor(start = Vector2.ZERO, end = Vector2.ZERO) {\n this.start = start.clone();\n this.end = end.clone();\n }\n /**\n * 设置二维线段\n * @param start - 线段起点\n * @param end - 线段终点\n * @returns 二维线段\n */\n set(start, end) {\n this.start.copyFrom(start);\n this.end.copyFrom(end);\n return this;\n }\n /**\n * 复制二维线段\n * @param line - 复制对象\n * @returns 复制结果\n */\n copyFrom(line) {\n this.start.copyFrom(line.start);\n this.end.copyFrom(line.end);\n return this;\n }\n /**\n * 二维线段求方向\n * @returns 二维线段方向\n */\n direction() {\n return new Vector2().subtractVectors(this.end, this.start).normalize();\n }\n /**\n * 二维线段求中点\n * @param [target=new Vector2()] - 目标保存对象\n * @returns 二维线段中点\n */\n getCenter(target = new Vector2()) {\n return target.addVectors(this.start, this.end).multiply(0.5);\n }\n /**\n * 二维线段向量值\n * @param [target=new Vector2()] - 目标保存对象\n * @returns 二维线段向量值\n */\n delta(target = new Vector2()) {\n return target.subtractVectors(this.end, this.start);\n }\n /**\n * 二维线段欧式距离平方\n * @returns 计算结果\n */\n distanceSq() {\n return this.start.distanceSquared(this.end);\n }\n /**\n * 二维线段欧式距离\n * @returns 计算结果\n */\n distance() {\n return this.start.distance(this.end);\n }\n /**\n * 求二维线段比例点\n * @param t - 比例值\n * @param [target=new Vector2()] - 目标保存对象\n * @returns 比例点结果\n */\n at(t, target = new Vector2()) {\n return this.delta(target).multiply(t).add(this.start);\n }\n /**\n * 求点与线段的最短距离\n * @param point - 二维空间点\n * @param clampToLine - 是否限制于线段内\n * @returns 距离结果\n */\n closestPointToPointParameter(point, clampToLine) {\n const startP = Line2.tempVec0;\n const startEnd = Line2.tempVec1;\n startP.subtractVectors(point, this.start);\n startEnd.subtractVectors(this.end, this.start);\n const se2se = startEnd.dot(startEnd);\n if (se2se === 0) {\n return 0;\n }\n const se2sp = startEnd.dot(startP);\n let t = se2sp / se2se;\n if (clampToLine) {\n t = clamp(t, 0, 1);\n }\n return t;\n }\n /**\n * 求点与线段的最近交点\n * @param point - 二维空间点\n * @param clampToLine - 是否限制于线段内\n * @param [target=new Vector2()] - 目标保存对象\n * @returns 最近交点\n */\n closestPointToPoint(point, clampToLine, target = new Vector2()) {\n const t = this.closestPointToPointParameter(point, clampToLine);\n return this.delta(target).multiply(t).add(this.start);\n }\n /**\n * 二维线段判等\n * @param line - 二维线段\n * @returns 判等结果\n */\n equals(line) {\n return line.start.equals(this.start) && line.end.equals(this.end);\n }\n /**\n * 克隆二维线段\n * @returns 克隆结果\n */\n clone() {\n return new Line2().copyFrom(this);\n }\n /**\n * 二维线段求长度\n * @returns 长度\n */\n length() {\n return new Vector2().subtractVectors(this.end, this.start).length();\n }\n /**\n * 二维线段判断相交\n * @param other - 二维线段\n * @returns 相交判断结果\n */\n crossWithLine(other) {\n const o1 = orientation(this.start, this.end, other.start);\n const o2 = orientation(this.start, this.end, other.end);\n const o3 = orientation(other.start, other.end, this.start);\n const o4 = orientation(other.start, other.end, this.end);\n if ((o1 > 0 && o2 < 0 || o1 < 0 && o2 > 0)\n && (o3 > 0 && o4 < 0 || o3 < 0 && o4 > 0)) {\n return true;\n }\n return o1 === 0 && onSegment(this.start, this.end, other.start)\n || o2 === 0 && onSegment(this.start, this.end, other.end)\n || o3 === 0 && onSegment(other.start, other.end, this.start)\n || o4 === 0 && onSegment(other.start, other.end, this.end);\n }\n}\n","import { NumberEpsilon } from './utils';\nimport { Vector2 } from './vector2';\n/**\n * 三维向量\n */\nexport class Vector3 {\n x;\n y;\n z;\n /**\n * 三维向量的常量\n */\n static X = new Vector3(1.0, 0.0, 0.0);\n static Y = new Vector3(0.0, 1.0, 0.0);\n static Z = new Vector3(0.0, 0.0, 1.0);\n static ONE = new Vector3(1.0, 1.0, 1.0);\n static ZERO = new Vector3(0.0, 0.0, 0.0);\n /**\n * 构造函数,默认值为零向量\n * @param [x=0]\n * @param [y=0]\n * @param [z=0]\n */\n constructor(x = 0, y = 0, z = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n /**\n * 设置向量\n * @param x - x 轴分量\n * @param y - y 轴分量\n * @param z - z 轴分量\n * @returns 向量\n */\n set(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n /**\n * 设置零向量\n * @returns 向量\n */\n setZero() {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n return this;\n }\n /**\n * 通过标量数值设置向量\n * @param num - 数值\n * @returns 向量\n */\n setFromNumber(num) {\n this.x = num;\n this.y = num;\n this.z = num;\n return this;\n }\n /**\n * 通过数组设置向量\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 向量\n */\n setFromArray(array, offset = 0) {\n this.x = array[offset] ?? 0;\n this.y = array[offset + 1] ?? 0;\n this.z = array[offset + 2] ?? 0;\n return this;\n }\n /**\n * 拷贝向量\n * @param v - 要拷贝的对象\n * @returns 向量\n */\n copyFrom(v) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n return this;\n }\n /**\n * 克隆向量\n * @returns 向量\n */\n clone() {\n return new Vector3(this.x, this.y, this.z);\n }\n /**\n * 根据下标设置向量分量\n * @param index - 下标值\n * @param value - 数字\n * @returns 向量\n */\n setElement(index, value) {\n switch (index) {\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n case 2:\n this.z = value;\n break;\n default: console.error('index is out of range: ' + index);\n }\n return this;\n }\n /**\n * 根据下标获取向量分量\n * @param index - 下标\n * @returns\n */\n getElement(index) {\n switch (index) {\n case 0: return this.x;\n case 1: return this.y;\n case 2: return this.z;\n default: console.error('index is out of range: ' + index);\n }\n return 0;\n }\n /**\n * 向量相加\n * @param right - 向量 | 数字\n * @returns 相加结果\n */\n add(right) {\n if (typeof right === 'number') {\n this.x += right;\n this.y += right;\n this.z += right;\n }\n else if (right instanceof Array) {\n this.x += right[0];\n this.y += right[1];\n this.z += right[2];\n }\n else {\n this.x += right.x;\n this.y += right.y;\n this.z += right.z;\n }\n return this;\n }\n /**\n * 向量相加\n * @param left - 向量\n * @param right - 向量\n * @returns 相加结果\n */\n addVectors(left, right) {\n this.x = left.x + right.x;\n this.y = left.y + right.y;\n this.z = left.z + right.z;\n return this;\n }\n /**\n * 向量乘比例后相加\n * @param right - 向量\n * @param s - 比例\n * @returns 相加结果\n */\n addScaledVector(right, s) {\n this.x += right.x * s;\n this.y += right.y * s;\n this.z += right.z * s;\n return this;\n }\n /**\n * 向量相减\n * @param right - 向量 | 数字\n * @returns 相减\n */\n subtract(right) {\n if (typeof right === 'number') {\n this.x -= right;\n this.y -= right;\n this.z -= right;\n }\n else if (right instanceof Array) {\n this.x -= right[0];\n this.y -= right[1];\n this.z -= right[2];\n }\n else {\n this.x -= right.x;\n this.y -= right.y;\n this.z -= right.z;\n }\n return this;\n }\n /**\n * 向量相减\n * @param left - 向量\n * @param right - 向量\n * @returns 相减结果\n */\n subtractVectors(left, right) {\n this.x = left.x - right.x;\n this.y = left.y - right.y;\n this.z = left.z - right.z;\n return this;\n }\n /**\n * 向量相乘\n * @param right - 向量 | 数字\n * @returns 相乘结果\n */\n multiply(right) {\n if (typeof right === 'number') {\n this.x *= right;\n this.y *= right;\n this.z *= right;\n }\n else if (right instanceof Array) {\n this.x *= right[0];\n this.y *= right[1];\n this.z *= right[2];\n }\n else {\n this.x *= right.x;\n this.y *= right.y;\n this.z *= right.z;\n }\n return this;\n }\n /**\n * 向量相乘\n * @param left - 向量\n * @param right - 向量\n * @returns 相乘结果\n */\n multiplyVectors(left, right) {\n this.x = left.x * right.x;\n this.y = left.y * right.y;\n this.z = left.z * right.z;\n return this;\n }\n /**\n * 向量相除\n * @param right - 向量 | 数字\n * @returns 相除结果\n */\n divide(right) {\n if (typeof right === 'number') {\n this.x /= right;\n this.y /= right;\n this.z /= right;\n }\n else if (right instanceof Array) {\n this.x /= right[0];\n this.y /= right[1];\n this.z /= right[2];\n }\n else {\n this.x /= right.x;\n this.y /= right.y;\n this.z /= right.z;\n }\n return this;\n }\n /**\n * 向量缩放\n * @param v - 数字\n * @returns 缩放结果\n */\n scale(v) {\n this.x *= v;\n this.y *= v;\n this.z *= v;\n return this;\n }\n /**\n * 分量求和\n * @returns 求和结果\n */\n sum() {\n return this.x + this.y + this.z;\n }\n /**\n * 向量求最小值\n * @param v - 向量或数值\n * @returns 求值结果\n */\n min(v) {\n if (typeof v === 'number') {\n this.x = Math.min(this.x, v);\n this.y = Math.min(this.y, v);\n this.z = Math.min(this.z, v);\n }\n else {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n this.z = Math.min(this.z, v.z);\n }\n return this;\n }\n /**\n * 向量求最大值\n * @param v - 向量或数值\n * @returns 求值结果\n */\n max(v) {\n if (typeof v === 'number') {\n this.x = Math.max(this.x, v);\n this.y = Math.max(this.y, v);\n this.z = Math.max(this.z, v);\n }\n else {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n this.z = Math.max(this.z, v.z);\n }\n return this;\n }\n /**\n * 向量阈值约束\n * @param min - 向量\n * @param max - 向量\n * @returns 求值结果\n */\n clamp(min, max) {\n return this.max(min).min(max);\n }\n /**\n * 向量向下取整\n * @returns 取整结果\n */\n floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n this.z = Math.floor(this.z);\n return this;\n }\n /**\n * 向量向上取整\n * @returns 取整结果\n */\n ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n this.z = Math.ceil(this.z);\n return this;\n }\n /**\n * 向量四舍五入\n * @returns 计算结果\n */\n round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n this.z = Math.round(this.z);\n return this;\n }\n /**\n * 向量取绝对值\n * @returns 向量\n */\n abs() {\n this.x = Math.abs(this.x);\n this.y = Math.abs(this.y);\n this.z = Math.abs(this.z);\n return this;\n }\n /**\n * 向量取反\n * @returns 向量\n */\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n /**\n * 向量长度\n * @returns 长度\n */\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n }\n /**\n * 向量长度平方\n * @returns 长度平方\n */\n lengthSquared() {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n }\n /**\n * 向量归一化\n * @returns 向量\n */\n normalize() {\n return this.divide(this.length() || 1);\n }\n /**\n * 设置向量长度\n * @param length - 长度\n * @returns 向量\n */\n setLength(length) {\n return this.normalize().multiply(length);\n }\n /**\n * 向量间求线性插值\n * @param other - 向量\n * @param alpha - 插值比例\n * @returns 插值结果\n */\n lerp(other, alpha) {\n this.x += (other.x - this.x) * alpha;\n this.y += (other.y - this.y) * alpha;\n this.z += (other.z - this.z) * alpha;\n return this;\n }\n /**\n * 向量间求线性插值\n * @param v1 - 第一个向量\n * @param v2 - 第二个向量\n * @param alpha - 插值比例\n * @returns 求值结果\n */\n lerpVectors(v1, v2, alpha) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n this.z = v1.z + (v2.z - v1.z) * alpha;\n return this;\n }\n /**\n * 向量求点积,点积为零表示两向量垂直\n * @param v - 向量\n * @returns 点积结果\n */\n dot(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n }\n /**\n * 向量求叉积\n * @param right - 向量\n * @returns 叉积结果\n */\n cross(right) {\n return this.crossVectors(this, right);\n }\n /**\n * 向量(a 与 b)求叉积\n * @param left - 向量\n * @param right - 向量\n * @returns 叉积结果\n */\n crossVectors(left, right) {\n const { x: ax, y: ay, z: az } = left;\n const { x: bx, y: by, z: bz } = right;\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n return this;\n }\n /**\n * 向量反射\n * @param normal - 法线\n * @returns 反射结果\n */\n reflect(normal) {\n // reflect incident vector off plane orthogonal to normal\n // normal is assumed to have unit length\n return this.subtract(normal.clone().multiply(2 * this.dot(normal)));\n }\n /**\n * 计算向量距离\n * @param v - 向量\n * @returns 距离\n */\n distance(v) {\n return Math.sqrt(this.distanceSquared(v));\n }\n /**\n * 计算向量距离平方\n * @param v - 向量\n * @returns 距离平方\n */\n distanceSquared(v) {\n const dx = this.x - v.x;\n const dy = this.y - v.y;\n const dz = this.z - v.z;\n return dx * dx + dy * dy + dz * dz;\n }\n /**\n * 向量判等\n * @param v - 向量\n * @returns 判等结果\n */\n equals(v) {\n return v.x === this.x && v.y === this.y && v.z === this.z;\n }\n /**\n * 是否零向量\n * @returns 是否零向量\n */\n isZero() {\n const eps = NumberEpsilon;\n const { x, y, z } = this;\n return Math.abs(x) <= eps && Math.abs(y) <= eps && Math.abs(z) <= eps;\n }\n /**\n * 向量转数组\n * @param array - 目标保存对象\n * @returns 数组\n */\n toArray() {\n return [this.x, this.y, this.z];\n }\n toVector2() {\n return new Vector2(this.x, this.y);\n }\n fill(array, offset = 0) {\n array[offset] = this.x;\n array[offset + 1] = this.y;\n array[offset + 2] = this.z;\n }\n /**\n * 获取随机向量\n * @returns\n */\n random() {\n this.x = Math.random();\n this.y = Math.random();\n this.z = Math.random();\n return this;\n }\n /**\n * 用欧拉角旋转向量\n * @param euler - 欧拉角\n * @param [out] - 输出结果,如果没有就覆盖当前向量值\n * @returns 旋转结果\n */\n applyEuler(euler, out) {\n return euler.rotateVector3(this, out);\n }\n /**\n * 用四元数旋转向量\n * @param q - 四元数\n * @param [out] - 输出结果,如果没有就覆盖当前向量值\n * @returns 旋转结果\n */\n applyQuaternion(q, out) {\n return q.rotateVector3(this, out);\n }\n /**\n * 用矩阵变换点\n * @param m - 变换矩阵\n * @param [out] - 输出结果,如果没有就覆盖当前向量值\n * @returns 结果点\n */\n applyMatrix(m, out) {\n return m.transformPoint(this, out);\n }\n /**\n * 用法向量矩阵变换法向量\n * @param m - 法向量矩阵\n * @param [out] - 输出结果,如果没有就覆盖当前向量值\n * @returns 向量\n */\n applyNormalMatrix(m, out) {\n return m.transformNormal(this, out);\n }\n /**\n * 用投影矩阵变换点\n * @param m - 投影矩阵\n * @param [out] - 输出结果,如果没有就覆盖当前向量值\n * @returns 结果点\n */\n applyProjectionMatrix(m, out) {\n return m.projectPoint(this, out);\n }\n /**\n * 从四维矩阵提取平移分量\n * @param m - 四维矩阵\n * @returns 向量\n */\n setFromMatrixPosition(m) {\n const e = m.elements;\n this.x = e[12];\n this.y = e[13];\n this.z = e[14];\n return this;\n }\n /**\n * 从四维矩阵提取指定列的三维分量\n * @param m - 四维矩阵\n * @param index - 列下标\n * @returns 向量\n */\n setFromMatrixColumn(m, index) {\n return this.setFromArray(m.elements, index * 4);\n }\n /**\n * 通过标量数值创建向量\n * @param num - 数值\n * @returns 向量\n */\n static fromNumber(num) {\n return new Vector3().setFromNumber(num);\n }\n /**\n * 通过数组创建向量\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 向量\n */\n static fromArray(array, offset = 0) {\n return new Vector3().setFromArray(array, offset);\n }\n}\n","import { Vector3 } from '../core/vector3';\n/**\n * 三维线段\n */\nexport class Line3 {\n static tempVec0 = new Vector3();\n static tempVec1 = new Vector3();\n start;\n end;\n /**\n * 构造函数\n * @param [start=new Vector3()] - 线段起点,默认值为(0, 0, 0)\n * @param [end=new Vector3()] - 线段终点,默认值为(0, 0, 0)\n */\n constructor(start = Vector3.ZERO, end = Vector3.ZERO) {\n this.start = start.clone();\n this.end = end.clone();\n }\n /**\n * 方向向量(终点减起点)\n * @param [target] - 结果保存对象\n * @returns 方向向量\n */\n delta(target) {\n const result = target ?? new Vector3();\n return result.subtractVectors(this.end, this.start);\n }\n /**\n * 计算点到线段的最近点参数\n * @param point - 空间点\n * @param clampToLine - 是否将参数限制在 [0, 1] 范围内\n * @returns 参数 t,0 表示起点,1 表示终点\n */\n closestPointToPointParameter(point, clampToLine) {\n const startP = Line3.tempVec0.subtractVectors(point, this.start);\n const startEnd = Line3.tempVec1.subtractVectors(this.end, this.start);\n const startEnd2 = startEnd.dot(startEnd);\n const dotProduct = startEnd.dot(startP);\n let t = startEnd2 !== 0 ? dotProduct / startEnd2 : 0;\n if (clampToLine) {\n t = Math.max(0, Math.min(1, t));\n }\n return t;\n }\n /**\n * 计算点到线段的最近点\n * @param point - 空间点\n * @param clampToLine - 是否将结果限制在线段上\n * @param [target] - 结果保存对象\n * @returns 最近点\n */\n closestPointToPoint(point, clampToLine, target) {\n const t = this.closestPointToPointParameter(point, clampToLine);\n return this.delta(target).multiply(t).add(this.start);\n }\n}\n","import { Vector3 } from '../core/vector3';\n/**\n *\n */\nexport class Plane {\n distance;\n normal;\n constructor(distance = 0, normal = Vector3.Z) {\n this.distance = distance;\n this.normal = normal.clone();\n this.set(distance, normal);\n }\n set(distance, normal) {\n this.normal.copyFrom(normal);\n const length = this.normal.length();\n if (length === 0) {\n this.normal.set(0, 0, 1);\n this.distance = distance;\n return this;\n }\n this.distance = distance / length;\n this.normal.normalize();\n return this;\n }\n copyFrom(target) {\n this.distance = target.distance;\n this.normal.copyFrom(target.normal);\n return this;\n }\n static setFromNormalAndCoplanarPoint(point, normal) {\n const distance = -point.dot(normal);\n const plane = new Plane(distance, normal);\n return plane;\n }\n setFromNormalAndCoplanarPoint(point, normal) {\n this.normal.copyFrom(normal);\n this.distance = -point.dot(this.normal);\n return this;\n }\n clone() {\n const plane = new Plane(this.distance, this.normal.clone());\n return plane;\n }\n distanceToPoint(point) {\n return this.normal.dot(point) + this.distance;\n }\n}\n","export function roundNumber(number, precision, method = Math.round) {\n // 已经是整数,则无需处理\n if (Number.isInteger(number)) {\n return number;\n }\n const decimal = Math.pow(10, precision);\n return method(number * decimal) / decimal;\n}\n","import { Box2 } from '@galacean/effects-math/es/extension/index';\nimport { Matrix3, Vector2, Vector3 } from './core';\n\n/**\n * 二维几何工具函数:极角、向量夹角与包围盒归一化/还原。\n */\n\nconst UNIT_BOX = new Box2(new Vector2(), new Vector2(1, 1));\nconst MATRIX_EPSILON = 1e-8;\n\n/**\n * 读取轴对齐包围盒的四个角点。\n * @param box 轴对齐包围盒\n * @returns 按顺时针排列的四个新角点\n */\nexport function getBoxCorners (box: Box2): Vector2[] {\n return [\n box.min.clone(),\n new Vector2(box.max.x, box.min.y),\n box.max.clone(),\n new Vector2(box.min.x, box.max.y),\n ];\n}\n\n/** 从 Box2 的视图角点建立归一化 Box2 到视图坐标的二维仿射变换。 */\nexport function getBoxTransform (points: Vector2[]): Matrix3 | undefined {\n if (points.length !== 4) {\n return undefined;\n }\n\n const [leftTop, rightTop, , leftBottom] = points;\n const transform = new Matrix3().setFromRowMajorData(\n rightTop.x - leftTop.x,\n leftBottom.x - leftTop.x,\n leftTop.x,\n rightTop.y - leftTop.y,\n leftBottom.y - leftTop.y,\n leftTop.y,\n 0,\n 0,\n 1,\n );\n\n return Math.abs(transform.determinant()) <= MATRIX_EPSILON ? undefined : transform;\n}\n\n/** 从一个视图 Box2 建立无旋转变换。 */\nexport function getBoxTransformFromBox (box: Box2): Matrix3 | undefined {\n if (box.isEmpty()) {\n return undefined;\n }\n const size = box.getSize();\n\n return new Matrix3().setFromRowMajorData(\n size.x, 0, box.min.x,\n 0, size.y, box.min.y,\n 0, 0, 1,\n );\n}\n\n/** 使用二维变换映射一个 Box2 局部点。 */\nexport function transformBoxPoint (transform: Matrix3, point: Vector2): Vector2 {\n const result = transform.transformPoint(new Vector3(point.x, point.y, 1));\n\n return new Vector2(result.x, result.y);\n}\n\n/** 将视图点逆变换到 Box2 局部坐标。 */\nexport function inverseTransformBoxPoint (transform: Matrix3, point: Vector2): Vector2 {\n return transformBoxPoint(transform.clone().invert(), point);\n}\n\n/** 临时计算 Box2 变换后的四个点。 */\nexport function getTransformedBoxCorners (transform: Matrix3, box: Box2 = UNIT_BOX): Vector2[] {\n return getBoxCorners(box).map(point => transformBoxPoint(transform, point));\n}\n\n/** 计算 Box2 变换后的轴对齐范围。 */\nexport function getTransformedBox (transform: Matrix3, box: Box2 = UNIT_BOX): Box2 {\n return setBoxFromPoints(new Box2(), getTransformedBoxCorners(transform, box));\n}\n\n/**\n * 判断一个变换后的 Box2 是否与轴对齐 Box2 相交。\n *\n * 使用分离轴判定而不是仅比较轴对齐包围盒,避免旋转元素在实际四边形未接触选区时被误选。\n * 边界接触也视为相交。\n * @param transform Box2 到视图坐标的变换\n * @param target 视图坐标下的轴对齐 Box2\n * @param box 待变换的 Box2\n * @returns 两个区域是否相交\n */\nexport function transformedBoxIntersectsBox (\n transform: Matrix3,\n target: Box2,\n box: Box2 = UNIT_BOX,\n): boolean {\n if (box.isEmpty() || target.isEmpty()) {\n return false;\n }\n\n const transformedCorners = getTransformedBoxCorners(transform, box);\n const targetCorners = getBoxCorners(target);\n const axes = [transformedCorners, targetCorners].reduce<Vector2[]>(\n (result, corners) => result.concat(corners.map((point, index) => {\n const next = corners[(index + 1) % corners.length];\n\n return new Vector2(-(next.y - point.y), next.x - point.x);\n })),\n [],\n );\n\n return axes.every(axis => {\n const transformedProjection = transformedCorners.map(point => point.dot(axis));\n const targetProjection = targetCorners.map(point => point.dot(axis));\n\n return Math.max(...transformedProjection) >= Math.min(...targetProjection)\n && Math.max(...targetProjection) >= Math.min(...transformedProjection);\n });\n}\n\n/** 通过逆变换判断视图点是否位于 Box2 内。 */\nexport function transformedBoxContainsPoint (transform: Matrix3, point: Vector2, box: Box2 = UNIT_BOX): boolean {\n return box.containsPoint(inverseTransformBoxPoint(transform, point));\n}\n\n/**\n * 绕指定中心旋转 Box2 四角。\n * @param points 原始四角\n * @param angle 旋转弧度\n * @param center 旋转中心\n * @returns 旋转后的四角\n */\nfunction rotateBoxCorners (points: Vector2[], angle: number, center: Vector2): Vector2[] {\n return points.map(point => point.clone().rotateAround(center, angle));\n}\n\n/**\n * 使用点集更新 Box2 的轴对齐范围。\n * @param box 目标包围盒\n * @param points 点集\n * @returns 目标包围盒\n */\nexport function setBoxFromPoints (box: Box2, points: Vector2[]): Box2 {\n if (points.length === 0) {\n return box.makeEmpty();\n }\n\n const min = points[0].clone();\n const max = points[0].clone();\n\n points.forEach(point => {\n min.min(point);\n max.max(point);\n });\n\n return box.set(min, max);\n}\n\n/**\n * 以指定锚点缩放 Box2。\n * @param box 目标包围盒\n * @param scalar 缩放比例\n * @param anchor 缩放中心,默认使用包围盒中心\n * @returns 目标包围盒\n */\nexport function scaleBox (box: Box2, scalar: number | Vector2, anchor: Vector2 = box.getCenter()): Box2 {\n if (box.isEmpty()) {\n return box;\n }\n const resultScalar = typeof scalar === 'number'\n ? new Vector2(scalar, scalar)\n : new Vector2(scalar.x, scalar.y);\n\n return setBoxFromPoints(box, [box.min, box.max].map(point => (\n point.clone().subtract(anchor).multiply(resultScalar).add(anchor)\n )));\n}\n\n/**\n * 计算 Box2 绕指定中心旋转后的轴对齐范围。\n * @param box 目标包围盒\n * @param angle 旋转角度(弧度)\n * @param center 旋转中心,默认使用包围盒中心\n * @returns 目标包围盒\n */\nexport function rotateBox (box: Box2, angle: number, center: Vector2 = box.getCenter()): Box2 {\n if (box.isEmpty()) {\n return box;\n }\n\n return setBoxFromPoints(box, rotateBoxCorners(getBoxCorners(box), angle, center));\n}\n\n/**\n * 计算二维向量相对原点的极角(弧度)。\n * @param vector 二维向量\n * @returns 弧度值\n */\nexport function getVector2Angle (vector: Vector2) {\n const angle = Math.atan2(-vector.y, -vector.x) + Math.PI;\n\n return angle;\n}\n\n/**\n * 计算由两个二维向量所成夹角(带方向,弧度)\n * @param vector1 起始向量\n * @param vector2 目标向量\n * @returns 带符号夹角弧度值\n */\nexport function getAngleByVectors (vector1: Vector2, vector2: Vector2) {\n const cosValue = Math.min(\n Math.max(\n vector1.dot(vector2) / vector1.length() / vector2.length(),\n -1,\n ),\n 1,\n );\n let angle = Math.acos(cosValue);\n\n angle = vector1.x * vector2.y - vector1.y * vector2.x > 0 ? angle : -angle;\n\n return angle;\n}\n\n/**\n * 将归一化包围盒按原包围盒范围还原为实际包围盒\n * @param origin 原始范围包围盒\n * @param normalize 归一化包围盒\n * @returns 还原后的实际包围盒\n */\nexport function getBoxByNormalizeBox (origin: Box2, normalize: Box2) {\n const result = new Box2();\n const { min: originMin, max: originMax } = origin;\n const { min: normalizeMin, max: normalizeMax } = normalize;\n const min = originMin.clone().add(new Vector2().subtractVectors(originMax, originMin).multiply(normalizeMin));\n const max = originMin.clone().add(new Vector2().subtractVectors(originMax, originMin).multiply(normalizeMax));\n\n result.set(min, max);\n\n return result;\n}\n\n/**\n * 将当前包围盒在原始范围内的位置归一化为 0~1 包围盒\n * @param origin 原始范围包围盒\n * @param current 当前包围盒\n * @returns 归一化包围盒\n */\nexport function getNormalizeBoxByBoxes (origin: Box2, current: Box2) {\n const result = new Box2();\n const { min: originMin, max: originMax } = origin;\n const { min: currentMin, max: currentMax } = current;\n const min = new Vector2().subtractVectors(currentMin, originMin).divide(new Vector2().subtractVectors(originMax, originMin));\n const max = new Vector2().subtractVectors(currentMax, originMin).divide(new Vector2().subtractVectors(originMax, originMin));\n\n result.set(min, max);\n\n return result;\n}\n","import { type Plane } from '@galacean/effects-math/es/extension/index';\nimport { type Matrix4, Ray, type Vector2, Vector3 } from './core';\n\n/**\n * 射线碰撞相机参数\n */\nexport type RayCasterCamera = {\n /**\n * 位置\n */\n position: Vector3,\n /**\n * 视图投影逆矩阵\n */\n inverseViewProjectMatrix: Matrix4,\n};\n\n/**\n * 射线碰撞结果\n */\nexport type RayCastResult = {\n /**\n * 相交点\n */\n point: Vector3,\n /**\n * 相交距离\n */\n distance: number,\n /**\n * 相交构件ID\n */\n id?: string,\n};\n\n/**\n * 射线投射器,由屏幕坐标与相机参数构建射线并进行平面求交。\n */\nexport class RayCaster {\n ray: Ray;\n\n /**\n * 构造射线投射器。\n * @param ray 初始射线,默认为新建射线\n */\n constructor (\n ray: Ray = new Ray(),\n ) {\n this.ray = ray.clone();\n }\n\n /**\n * 由屏幕坐标与相机参数构建投射射线。\n * @param coords 屏幕坐标(归一化)\n * @param camera 相机参数\n * @returns 当前实例(链式调用)\n */\n setFromCamera (coords: Vector2, camera: RayCasterCamera) {\n const origin = camera.position;\n const direction = new Vector3(coords.x, coords.y, 0.5).applyProjectionMatrix(camera.inverseViewProjectMatrix).subtract(origin).normalize();\n\n this.ray.set(origin, direction);\n\n return this;\n }\n\n /**\n * 将当前射线与平面求交。\n * @param plane 目标平面\n * @returns 相交结果,不相交时返回 undefined\n */\n rayCastPlane (plane: Plane): RayCastResult | undefined {\n const distance = this.ray.distanceToPlane(plane);\n\n if (distance === null) {\n return undefined;\n }\n\n return {\n distance,\n point: new Vector3().copyFrom(this.ray.at(distance)),\n };\n }\n}\n","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n\n if (\"value\" in descriptor) descriptor.writable = true;\n\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _create_class(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n\n return Constructor;\n}\nexport { _create_class as _ };\n","/** 视图坐标点。 */\nexport type ViewPoint = {\n /** X 坐标。 */\n x: number,\n /** Y 坐标。 */\n y: number,\n};\n\n/** 文本插入点计算所需的 DOM 布局样式。 */\nexport type TextCaretLayout = {\n /** 文本框左坐标。 */\n left: number,\n /** 文本框上坐标。 */\n top: number,\n /** 文本框宽度。 */\n width: number,\n /** 文本框高度。 */\n height: number,\n /** 文本框旋转弧度。 */\n rotation: number,\n /** 文本内容。 */\n text: string,\n /** 字体。 */\n fontFamily: string,\n /** 字号。 */\n fontSize: number,\n /** 字重。 */\n fontWeight: string | number,\n /** 字间距。 */\n letterSpacing: number,\n /** 行高。 */\n lineHeight: number,\n /** 文本对齐方式。 */\n textAlign: 'left' | 'center' | 'right',\n /** 是否保持单词完整换行。 */\n keepWordIntact: boolean,\n};\n\n/** 单个文本插入点的局部位置。 */\ntype CaretPosition = {\n /** 文本偏移。 */\n index: number,\n /** 局部 X 坐标。 */\n x: number,\n /** 局部 Y 坐标。 */\n y: number,\n /** 插入点高度。 */\n height: number,\n};\n\n/** 已测量的文本框和插入点位置。 */\ntype ResolvedLayout = Pick<TextCaretLayout, 'left' | 'top' | 'width' | 'height' | 'rotation'> & {\n /** 全部文本插入点。 */\n caretPositions: CaretPosition[],\n};\n\n/** 使用浏览器文本布局将视图坐标映射为文本插入点。 */\nexport class TextCaretMapper {\n private layout: ResolvedLayout | undefined;\n private layoutKey = '';\n private caretPositions: CaretPosition[] = [];\n\n /** 清除当前布局。 */\n reset (): void {\n this.layout = undefined;\n }\n\n /**\n * 同步文本框样式并按需重新测量插入点。\n * @param style 文本框布局样式\n */\n sync (style: TextCaretLayout): void {\n const key = JSON.stringify([\n style.text,\n style.width,\n style.fontFamily,\n style.fontSize,\n style.fontWeight,\n style.letterSpacing,\n style.lineHeight,\n style.textAlign,\n style.keepWordIntact,\n ]);\n\n if (key !== this.layoutKey) {\n this.layoutKey = key;\n this.caretPositions = this.measureCaretPositions(style);\n }\n this.layout = {\n left: style.left,\n top: style.top,\n width: style.width,\n height: style.height,\n rotation: style.rotation,\n caretPositions: this.caretPositions,\n };\n }\n\n /**\n * 查找最接近视图坐标的文本插入点。\n * @param point 视图坐标\n * @returns 文本偏移;布局尚未同步时返回 undefined\n */\n resolve (point: ViewPoint): number | undefined {\n const layout = this.layout;\n\n if (!layout || layout.caretPositions.length === 0) {\n return undefined;\n }\n\n const dx = point.x - layout.left;\n const dy = point.y - layout.top;\n const cos = Math.cos(layout.rotation);\n const sin = Math.sin(layout.rotation);\n const localX = dx * cos + dy * sin;\n const localY = -dx * sin + dy * cos;\n\n let closestLineDistance = Number.POSITIVE_INFINITY;\n\n for (const caret of layout.caretPositions) {\n closestLineDistance = Math.min(\n closestLineDistance,\n Math.abs(localY - (caret.y + caret.height / 2)),\n );\n }\n\n let closest = layout.caretPositions[0];\n let closestDistance = Number.POSITIVE_INFINITY;\n\n for (const caret of layout.caretPositions) {\n const lineDistance = Math.abs(localY - (caret.y + caret.height / 2));\n\n if (lineDistance > closestLineDistance + 1) {\n continue;\n }\n const distance = Math.abs(localX - caret.x);\n\n if (distance < closestDistance) {\n closest = caret;\n closestDistance = distance;\n }\n }\n\n return closest.index;\n }\n\n /**\n * 使用离屏 DOM 测量全部文本插入点。\n * @param style 文本框布局样式\n * @returns 插入点位置列表\n */\n private measureCaretPositions (style: TextCaretLayout): CaretPosition[] {\n // 1. 创建与画布文本样式一致的离屏镜像节点。\n const mirror = document.createElement('div');\n\n Object.assign(mirror.style, {\n position: 'fixed',\n left: '-10000px',\n top: '0',\n visibility: 'hidden',\n pointerEvents: 'none',\n boxSizing: 'border-box',\n width: `${style.width}px`,\n margin: '0',\n padding: '0',\n border: '0',\n whiteSpace: 'pre-wrap',\n overflowWrap: 'break-word',\n wordBreak: style.keepWordIntact ? 'normal' : 'break-all',\n fontFamily: style.fontFamily,\n fontSize: `${style.fontSize}px`,\n fontWeight: `${style.fontWeight}`,\n letterSpacing: `${style.letterSpacing}px`,\n lineHeight: `${style.lineHeight}px`,\n textAlign: style.textAlign,\n fontVariantLigatures: 'none',\n fontKerning: 'none',\n });\n const textNode = document.createTextNode(style.text || '\\u200b');\n\n mirror.appendChild(textNode);\n document.body.appendChild(mirror);\n\n // 2. 逐个文本偏移读取浏览器排版位置。\n const positions: CaretPosition[] = [];\n const range = document.createRange();\n const mirrorRect = mirror.getBoundingClientRect();\n\n for (let index = 0; index <= style.text.length; index++) {\n range.setStart(textNode, index);\n range.collapse(true);\n const rect = range.getBoundingClientRect();\n\n positions.push({\n index,\n x: rect.left - mirrorRect.left,\n y: rect.top - mirrorRect.top,\n height: rect.height,\n });\n }\n // 3. 移除临时节点并返回测量结果。\n mirror.remove();\n\n return positions;\n }\n}\n","import { EventEmitter, spec, TextComponent, type VFXItem } from '@galacean/effects';\nimport type { Box2 } from '@galacean/effects-math/es/extension/index';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport { type Matrix3, getTransformedBoxCorners } from '../math';\nimport { TextCaretMapper, type TextCaretLayout, type ViewPoint } from './text-caret-mapper';\n\n/** 文本编辑进入后选中全文或仅聚焦输入框。 */\nexport type TextEditActivation = 'select' | 'focus';\n\n/** 文本编辑投影结果。 */\nexport type TextResult = TextValidResult | TextEmptyResult;\n\n/** 有效文本编辑投影。 */\nexport type TextValidResult = {\n /** 结果类型。 */\n type: 'valid',\n /** 文本视图包围盒。 */\n box: Box2,\n /** 文本局部 Box2 到视图的变换。 */\n transform: Matrix3,\n};\n\n/** 空文本编辑投影。 */\nexport type TextEmptyResult = {\n /** 结果类型。 */\n type: 'empty',\n};\n\n/** 文本 Gizmo 的交互状态。 */\nexport type TextInteractionParam = {\n /** 当前交互类型。 */\n type: 'none' | 'edit',\n /** 文本框激活方式。 */\n textareaType?: TextEditActivation,\n};\n\n/** 文本输入事件参数。 */\nexport type TextInputPayload = {\n /** 文本元素 ID。 */\n itemId: string,\n /** 输入后的文本。 */\n text: string,\n /** 当前字体。 */\n fontFamily: string,\n};\n\n/** 文本编辑会话事件参数。 */\ntype TextEditSessionEvents = {\n /** 文本输入事件。 */\n textInput: [TextInputPayload],\n};\n\n/** 指针拖拽选择文本的状态。 */\ntype PointerSelection = {\n /** 选择起点。 */\n anchor: ViewPoint,\n /** 选择终点。 */\n focus: ViewPoint,\n /** 起点对应的文本偏移。 */\n anchorIndex?: number,\n /** 是否仍在拖拽。 */\n active: boolean,\n};\n\nconst TEXT_AREA_CLASS_NAME = 'text-gizmo-custom-style';\nconst POINTER_SELECTION_PREVIEW_CLASS_NAME = 'text-gizmo-pointer-selection-preview';\nconst TEXT_SELECTION_BACKGROUND_COLOR = 'rgba(59, 130, 246, 0.35)';\n\nconst textareaDefaultCssClass = `\n word-break: normal;\n position: absolute;\n z-index: 3;\n border: none;\n margin: 0;\n padding: 0;\n outline: none !important;\n overflow: hidden;\n resize: none;\n display: none;\n background: transparent;\n opacity: .8;\n cursor: text;\n -webkit-user-drag: none;\n color: transparent;\n caret-color: #000000;\n -webkit-text-fill-color: transparent;\n text-fill-color: transparent;\n /* canvas 按单字符 measureText+fillText 排版(无 kerning、无 ligature,含 ff/fi/fl 等 f 连字);\n DOM 默认会施加 kerning 与 f 连字 → 字序列比 canvas 窄 → 长行累积往左偏(尤其 f)。关闭二者以横向同源。 */\n font-variant-ligatures: none;\n font-kerning: none;\n`;\n\nconst pointerSelectionPreviewCssClass = `\n position: absolute;\n z-index: 2;\n box-sizing: border-box;\n border: none;\n margin: 0;\n padding: 0;\n overflow: hidden;\n display: none;\n pointer-events: none;\n opacity: .8;\n color: transparent;\n -webkit-text-fill-color: transparent;\n font-variant-ligatures: none;\n font-kerning: none;\n`;\n\n/**\n * 为元素添加一次性 CSS 类和样式规则。\n * @param element 目标元素\n * @param className CSS 类名\n * @param cssText CSS 规则内容\n * @returns 移除类名和样式规则的函数\n */\nfunction applyCSSClass (element: HTMLElement, className: string, cssText: string): () => void {\n const style = document.createElement('style');\n\n style.textContent = `\n .${className} {\n ${cssText.replace(/&/g, `.${className}`)}\n }\n `;\n document.head.appendChild(style);\n element.classList.add(className);\n\n return () => {\n element.classList.remove(className);\n style.remove();\n };\n}\n\n/**\n * 添加独立样式规则。\n * @param cssText 完整 CSS 规则\n * @returns 移除样式规则的函数\n */\nfunction applyCSSRule (cssText: string): () => void {\n const style = document.createElement('style');\n\n style.textContent = cssText;\n document.head.appendChild(style);\n\n return () => {\n style.remove();\n };\n}\n\n/** 管理行内文本编辑的 textarea、选区和画布投影。 */\nexport class TextEditSession extends EventEmitter<TextEditSessionEvents> {\n /** 文本编辑使用的 DOM 输入框。 */\n readonly textAreaElement: HTMLTextAreaElement;\n\n /** 当前文本交互状态。 */\n interactionParam: TextInteractionParam = { type: 'none' };\n\n private readonly owner: GizmoOwner;\n private _editingItem: VFXItem | undefined;\n private readonly attachedProjections = new Set<object>();\n private disposed = false;\n private selectionStart: number | null = null;\n private selectionEnd: number | null = null;\n private pointerSelection: PointerSelection | undefined;\n private readonly caretMapper = new TextCaretMapper();\n /** 画布接管拖选期间使用的无焦点选区预览。 */\n private readonly pointerSelectionPreviewElement: HTMLDivElement;\n private readonly removeTextAreaStyle: () => void;\n private readonly removeTextSelectionStyle: () => void;\n private readonly removePointerSelectionPreviewStyle: () => void;\n\n /**\n * 将 DOM 输入同步到文本组件并发出输入事件。\n * @param event DOM 输入事件。\n */\n private readonly handleInput = (event: Event): void => {\n const editingItem = this._editingItem;\n const textComponent = editingItem?.getComponent(TextComponent);\n const composition = this.owner.getEngine()?.sceneServer.compositions[0];\n\n if (!editingItem || !textComponent || !composition) {\n return;\n }\n\n const text = (event.target as HTMLTextAreaElement).value;\n const fontFamily = textComponent.textStyle?.fontFamily ?? '';\n\n textComponent.setText(text);\n const lineCount = textComponent.getLineCount(text);\n const textHeight = Math.ceil(textComponent.textLayout.lineHeight * lineCount);\n\n textComponent.setTextHeight(textHeight);\n composition.gotoAndStop(composition.time);\n\n this.emit('textInput', {\n itemId: editingItem.getInstanceId(),\n text,\n fontFamily,\n });\n };\n\n /**\n * 隔离输入框键盘事件。\n * @param event DOM 键盘事件。\n */\n private readonly handleKeyDown = (event: KeyboardEvent): void => {\n if (event.code.toLocaleLowerCase() === 'escape') {\n event.preventDefault();\n\n return;\n }\n event.stopPropagation();\n };\n\n /**\n * 在新的指针选择开始前折叠原 DOM 选区。\n * @param event DOM 鼠标事件。\n */\n private readonly handleMouseDown = (event: MouseEvent): void => {\n if (\n event.button === 0\n && this.textAreaElement.selectionStart !== this.textAreaElement.selectionEnd\n ) {\n this.textAreaElement.setSelectionRange(\n this.textAreaElement.selectionStart,\n this.textAreaElement.selectionStart,\n );\n }\n };\n\n /**\n * 阻止浏览器原生文本拖放。\n * @param event DOM 拖拽事件。\n */\n private readonly handleDragStart = (event: DragEvent): void => {\n event.preventDefault();\n };\n\n /**\n * @param owner Gizmo 宿主\n */\n constructor (owner: GizmoOwner) {\n super();\n this.owner = owner;\n this.textAreaElement = document.createElement('textarea');\n this.pointerSelectionPreviewElement = document.createElement('div');\n owner.getEngine()?.canvas.parentElement?.appendChild(this.textAreaElement);\n owner.getEngine()?.canvas.parentElement?.appendChild(this.pointerSelectionPreviewElement);\n this.removeTextAreaStyle = applyCSSClass(\n this.textAreaElement,\n TEXT_AREA_CLASS_NAME,\n textareaDefaultCssClass,\n );\n this.removeTextSelectionStyle = applyCSSRule(`\n .${TEXT_AREA_CLASS_NAME}::selection {\n background-color: ${TEXT_SELECTION_BACKGROUND_COLOR};\n color: transparent;\n -webkit-text-fill-color: transparent;\n }\n `);\n this.removePointerSelectionPreviewStyle = applyCSSClass(\n this.pointerSelectionPreviewElement,\n POINTER_SELECTION_PREVIEW_CLASS_NAME,\n pointerSelectionPreviewCssClass,\n );\n this.textAreaElement.addEventListener('keydown', this.handleKeyDown);\n this.textAreaElement.addEventListener('mousedown', this.handleMouseDown);\n this.textAreaElement.addEventListener('dragstart', this.handleDragStart);\n }\n\n /** 当前正在编辑的文本元素。 */\n get editingItem (): VFXItem | undefined {\n return this._editingItem;\n }\n\n /** 是否存在正在编辑的文本元素。 */\n get isEditing (): boolean {\n return this._editingItem !== undefined;\n }\n\n /**\n * 选中当前编辑文本的全部内容,并将焦点交给输入框。\n *\n * 输入框尚未完成首次画布投影时会先保存全文选区,待投影打开后恢复。\n * @returns 当前存在可编辑文本时返回 true\n */\n selectAllText (): boolean {\n if (this.disposed) {\n return false;\n }\n const textComponent = this._editingItem?.getComponent(TextComponent);\n\n if (!textComponent) {\n return false;\n }\n\n const textLength = this.textAreaElement.style.display === 'block'\n ? this.textAreaElement.value.length\n : (textComponent.text ?? '').length;\n\n this.selectionStart = 0;\n this.selectionEnd = textLength;\n\n if (this.textAreaElement.style.display === 'block') {\n this.textAreaElement.focus();\n this.textAreaElement.select();\n this.textAreaElement.scrollTop = 0;\n }\n\n return true;\n }\n\n /**\n * 使用当前单选文本元素开始编辑。\n * @param textareaType 文本框激活方式\n * @returns 是否成功开始编辑\n */\n beginFromCurrentSelection (textareaType: TextEditActivation): boolean {\n if (this.disposed) {\n return false;\n }\n const selectedItems = this.owner.getSelection().getSelectedPlayerItems();\n const selectedItem = selectedItems.length === 1 ? selectedItems[0] : undefined;\n\n if (selectedItem?.type !== spec.ItemType.text || !selectedItem.getComponent(TextComponent)) {\n return false;\n }\n\n this._editingItem = selectedItem;\n this.interactionParam = { type: 'edit', textareaType };\n\n return true;\n }\n\n /**\n * 将当前会话切换到另一个文本元素。\n * @param item 新的文本元素\n * @param textareaType 文本框激活方式\n * @returns 是否切换成功\n */\n retarget (item: VFXItem, textareaType: TextEditActivation = 'focus'): boolean {\n if (\n this.disposed\n || item.type !== spec.ItemType.text\n || !item.getComponent(TextComponent)\n ) {\n return false;\n }\n if (item === this._editingItem) {\n return true;\n }\n\n this.hideTextArea();\n this.selectionStart = null;\n this.selectionEnd = null;\n this.cancelPointerSelection();\n this.caretMapper.reset();\n this.textAreaElement.setSelectionRange(0, 0);\n this._editingItem = item;\n this.interactionParam = { type: 'edit', textareaType };\n\n return true;\n }\n\n /**\n * 开始使用画布指针拖拽选择文本。\n * @param point 选择起点\n */\n beginPointerSelection (point: ViewPoint): void {\n this.textAreaElement.style.pointerEvents = 'none';\n this.pointerSelection = {\n anchor: { ...point },\n focus: { ...point },\n active: true,\n };\n this.applyPointerSelection();\n }\n\n /**\n * 更新指针拖拽选择终点。\n * @param point 当前指针位置\n */\n updatePointerSelection (point: ViewPoint): void {\n if (!this.pointerSelection?.active) {\n return;\n }\n this.pointerSelection.focus = { ...point };\n this.applyPointerSelection();\n }\n\n /**\n * 完成指针拖拽选择。\n * @param point 最终指针位置\n */\n finishPointerSelection (point: ViewPoint): void {\n if (!this.pointerSelection) {\n return;\n }\n this.pointerSelection.focus = { ...point };\n this.pointerSelection.active = false;\n this.textAreaElement.style.pointerEvents = '';\n if (this.applyPointerSelection()) {\n this.pointerSelection = undefined;\n }\n }\n\n /** 取消指针拖拽选择。 */\n cancelPointerSelection (): void {\n this.textAreaElement.style.pointerEvents = '';\n this.pointerSelection = undefined;\n this.hidePointerSelectionPreview();\n }\n\n /**\n * 挂接一个画布文本投影。\n * @param projection 投影实例\n */\n attachProjection (projection: object): void {\n if (this.disposed) {\n return;\n }\n this.attachedProjections.add(projection);\n }\n\n /**\n * 脱离一个画布文本投影。\n * @param projection 投影实例\n */\n detachProjection (projection: object): void {\n if (!this.attachedProjections.delete(projection)) {\n return;\n }\n if (this.attachedProjections.size > 0) {\n return;\n }\n this.saveSelectionRange();\n this.hideTextArea();\n }\n\n /** 结束编辑并释放 DOM 资源和事件监听器。 */\n dispose (): void {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n this.attachedProjections.clear();\n this._editingItem = undefined;\n this.interactionParam = { type: 'none' };\n this.cancelPointerSelection();\n this.caretMapper.reset();\n this.hideTextArea();\n this.textAreaElement.removeEventListener('keydown', this.handleKeyDown);\n this.textAreaElement.removeEventListener('mousedown', this.handleMouseDown);\n this.textAreaElement.removeEventListener('dragstart', this.handleDragStart);\n this.textAreaElement.remove();\n this.pointerSelectionPreviewElement.remove();\n this.removeTextAreaStyle();\n this.removeTextSelectionStyle();\n this.removePointerSelectionPreviewStyle();\n }\n\n /**\n * 将 textarea 的位置和排版同步到画布文本投影。\n * @param result 当前文本投影结果\n * @param viewScale 视口缩放\n */\n syncTextArea (result: TextResult, viewScale: number): void {\n // 1. 校验投影和文本组件,并读取画布文本布局。\n const editingItem = this._editingItem;\n\n if (this.attachedProjections.size === 0 || !editingItem || result.type === 'empty') {\n return;\n }\n\n const textComponent = editingItem.getComponent(TextComponent);\n\n if (!textComponent) {\n this.hideTextArea();\n\n return;\n }\n\n const isOpening = this.textAreaElement.style.display !== 'block';\n const {\n textLayout: { lineHeight, letterSpace, textAlign, height: textHeight, keepWordIntact },\n textStyle: { fontSize, textWeight: fontWeight, fontFamily },\n text,\n } = textComponent;\n const [leftTop, rightTop, , leftBottom] = getTransformedBoxCorners(result.transform);\n const width = leftTop.distance(rightTop);\n const height = leftTop.distance(leftBottom);\n const viewRotation = Math.atan2(rightTop.y - leftTop.y, rightTop.x - leftTop.x);\n // 2. 使用投影高度与逻辑文本高度的比例统一 DOM 和画布字号。\n const fontScale = textHeight > 0 ? height / textHeight : viewScale;\n\n // 3. 首次打开时同步内容和不随帧变化的排版属性。\n if (isOpening) {\n this.textAreaElement.value = text ?? '';\n this.textAreaElement.setSelectionRange(0, 0);\n this.textAreaElement.style.display = 'block';\n this.textAreaElement.style.wordBreak = keepWordIntact ? 'normal' : 'break-all';\n this.textAreaElement.style.whiteSpace = 'pre-wrap';\n this.textAreaElement.style.overflowWrap = 'break-word';\n this.textAreaElement.style.fontWeight = fontWeight;\n this.textAreaElement.style.letterSpacing = `${letterSpace * fontScale}px`;\n this.textAreaElement.style.transformOrigin = '0 0';\n this.textAreaElement.style.paintOrder = 'stroke fill';\n this.textAreaElement.addEventListener('input', this.handleInput);\n }\n\n // 4. 同步位置、尺寸、旋转和插入点映射。\n this.textAreaElement.style.left = `${leftTop.x}px`;\n this.textAreaElement.style.top = `${leftTop.y}px`;\n this.textAreaElement.style.width = `${width}px`;\n this.textAreaElement.style.height = `${height}px`;\n this.textAreaElement.style.fontFamily = fontFamily;\n this.textAreaElement.style.textAlign = this.getTextAlign(textAlign);\n this.textAreaElement.style.fontSize = `${fontSize * fontScale}px`;\n this.textAreaElement.style.lineHeight = `${lineHeight * fontScale}px`;\n this.textAreaElement.style.transform = `rotateZ(${viewRotation}rad)`;\n Object.assign(this.pointerSelectionPreviewElement.style, {\n left: `${leftTop.x}px`,\n top: `${leftTop.y}px`,\n width: `${width}px`,\n height: `${height}px`,\n fontFamily,\n textAlign: this.getTextAlign(textAlign),\n fontSize: `${fontSize * fontScale}px`,\n fontWeight,\n letterSpacing: `${letterSpace * fontScale}px`,\n lineHeight: `${lineHeight * fontScale}px`,\n transform: `rotateZ(${viewRotation}rad)`,\n transformOrigin: '0 0',\n wordBreak: keepWordIntact ? 'normal' : 'break-all',\n whiteSpace: 'pre-wrap',\n overflowWrap: 'break-word',\n });\n this.syncPointerLayout({\n left: leftTop.x,\n top: leftTop.y,\n width,\n height,\n rotation: viewRotation,\n text: text ?? '',\n fontFamily,\n fontSize: fontSize * fontScale,\n fontWeight,\n letterSpacing: letterSpace * fontScale,\n lineHeight: lineHeight * fontScale,\n textAlign: this.getTextAlign(textAlign),\n keepWordIntact,\n });\n this.textAreaElement.scrollTop = 0;\n\n // 5. 首次打开后按激活方式恢复或全选 DOM 选区。\n // 指针拖选期间保持画布持有输入,抬起后再由 applyPointerSelection 聚焦输入框。\n if (isOpening && !this.pointerSelection?.active) {\n if (this.interactionParam.textareaType === 'select') {\n this.textAreaElement.focus();\n this.textAreaElement.select();\n } else {\n this.textAreaElement.focus();\n if (this.selectionStart !== null && this.selectionEnd !== null) {\n this.textAreaElement.setSelectionRange(this.selectionStart, this.selectionEnd);\n }\n }\n this.textAreaElement.scrollTop = 0;\n }\n }\n\n /** 保存当前 DOM 文本选区。 */\n private saveSelectionRange (): void {\n this.selectionStart = this.textAreaElement.selectionStart;\n this.selectionEnd = this.textAreaElement.selectionEnd;\n }\n\n /** 隐藏输入框并停止监听输入。 */\n private hideTextArea (): void {\n this.textAreaElement.removeEventListener('input', this.handleInput);\n this.textAreaElement.style.display = 'none';\n this.hidePointerSelectionPreview();\n }\n\n /**\n * 同步插入点布局并应用待处理的指针选区。\n * @param style 文本插入点布局\n */\n private syncPointerLayout (style: TextCaretLayout): void {\n if (!this.pointerSelection) {\n return;\n }\n\n this.caretMapper.sync(style);\n if (this.applyPointerSelection() && !this.pointerSelection.active) {\n this.pointerSelection = undefined;\n }\n }\n\n /** @returns 是否成功将指针选区应用到 DOM 输入框。 */\n private applyPointerSelection (): boolean {\n const selection = this.pointerSelection;\n\n if (!selection) {\n return false;\n }\n\n selection.anchorIndex ??= this.caretMapper.resolve(selection.anchor);\n const focusIndex = this.caretMapper.resolve(selection.focus);\n\n if (selection.anchorIndex === undefined || focusIndex === undefined) {\n return false;\n }\n const start = Math.min(selection.anchorIndex, focusIndex);\n const end = Math.max(selection.anchorIndex, focusIndex);\n\n if (!selection.active) {\n this.textAreaElement.focus();\n }\n this.textAreaElement.setSelectionRange(\n start,\n end,\n focusIndex < selection.anchorIndex ? 'backward' : 'forward',\n );\n this.textAreaElement.scrollTop = 0;\n if (selection.active) {\n this.renderPointerSelectionPreview(start, end);\n } else {\n this.hidePointerSelectionPreview();\n }\n\n return true;\n }\n\n /** 绘制画布指针拖选对应的文字高亮。 */\n private renderPointerSelectionPreview (start: number, end: number): void {\n if (start === end) {\n this.hidePointerSelectionPreview();\n\n return;\n }\n\n const text = this.textAreaElement.value;\n const highlight = document.createElement('span');\n\n highlight.style.backgroundColor = TEXT_SELECTION_BACKGROUND_COLOR;\n highlight.textContent = text.slice(start, end);\n this.pointerSelectionPreviewElement.replaceChildren(\n document.createTextNode(text.slice(0, start)),\n highlight,\n document.createTextNode(text.slice(end)),\n );\n this.pointerSelectionPreviewElement.style.display = 'block';\n }\n\n /** 隐藏画布指针拖选预览。 */\n private hidePointerSelectionPreview (): void {\n this.pointerSelectionPreviewElement.style.display = 'none';\n this.pointerSelectionPreviewElement.replaceChildren();\n }\n\n /**\n * 将 Effects 文本对齐转换为 CSS 对齐值。\n * @param textAlign Effects 文本对齐\n * @returns CSS 文本对齐值\n */\n private getTextAlign (textAlign: spec.TextAlignment): 'left' | 'center' | 'right' {\n switch (textAlign) {\n case spec.TextAlignment.middle: return 'center';\n case spec.TextAlignment.right: return 'right';\n default: return 'left';\n }\n }\n}\n","import type { Gizmo } from './gizmo';\nimport type { GizmoOwner } from './gizmo-owner';\n\n/** 创建有序 Gizmo 交互图的工具基类。 */\nexport class GizmoTool {\n /**\n * @param owner Gizmo 宿主\n */\n constructor (protected owner: GizmoOwner) {}\n\n /**\n * 创建工具使用的 Gizmo 图。\n * @returns 有序 Gizmo 列表\n */\n createGizmos (): Gizmo[] {\n return [];\n }\n}\n","import { GizmoTool } from '../gizmo-tool';\n\n/** 画布平移工具。 */\nexport class HandGizmoTool extends GizmoTool {}\n","import { GizmoTool } from '../gizmo-tool';\n\n/** 使用当前编辑模式处理选区交互的默认工具。 */\nexport class MoveGizmoTool extends GizmoTool {\n /** @returns 当前编辑模式的 Gizmo 图。 */\n override createGizmos () {\n return this.owner.getActiveEditMode().createGizmos();\n }\n}\n","import type {\n InputEventKey,\n InputEventMouseButton,\n InputEventMouseMotion,\n} from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport type { GizmoOwner } from './gizmo-owner';\n\n/** 定义 Gizmo 的绘制、鼠标和键盘交互生命周期。 */\nexport abstract class Gizmo {\n /** Gizmo 类型标识(子类必须实现)。 */\n abstract readonly type: string;\n\n /** Gizmo 共享状态的宿主契约。 */\n protected readonly _owner: GizmoOwner;\n\n /**\n * 创建 Gizmo。\n * @param owner 宿主契约\n */\n constructor (owner: GizmoOwner) {\n this._owner = owner;\n }\n\n /** 释放资源。子类可覆盖清理。 */\n dispose (): void {\n // 子类按需释放资源。\n }\n\n /** 在每帧更新时同步内部渲染状态。 */\n onUpdate (): void {\n // 子类按需同步渲染状态。\n }\n\n /** 在输入候选仲裁前更新命中状态。 */\n prepareForDispatch (): void {\n // 子类按需准备命中状态。\n }\n\n /** @returns 是否需要越过拖拽阈值后才接收拖拽事件。 */\n requiresDragThreshold (): boolean {\n return true;\n }\n\n /**\n * 绘制 Gizmo 视觉元素。\n * @param _control 绘制控制器\n */\n draw (_control: Control): void {\n // 子类按需绘制视觉元素。\n }\n\n /**\n * 处理鼠标按下并按需接管交互会话。\n * @param _event 鼠标按下事件\n */\n onMouseDown (_event: InputEventMouseButton): void {\n // 子类按需处理鼠标按下。\n }\n\n /**\n * 处理鼠标抬起并结束交互会话。\n * @param _event 鼠标抬起事件\n */\n onMouseUp (_event: InputEventMouseButton): void {\n // 子类按需处理鼠标抬起。\n }\n\n /**\n * 处理无按键状态的鼠标移动。\n * @param _event 鼠标移动事件\n */\n onMouseMove (_event: InputEventMouseMotion): void {\n // 子类按需处理鼠标移动。\n }\n\n /**\n * 处理越过距离阈值后的鼠标拖拽。\n * @param _event 鼠标拖拽事件\n */\n onMouseDrag (_event: InputEventMouseMotion): void {\n // 子类按需处理鼠标拖拽。\n }\n\n /** 处理鼠标离开并清理悬停状态。 */\n onMouseLeave (): void {\n // 子类按需清理悬停状态。\n }\n\n /**\n * 处理键盘按下。\n * @param _event 键盘按下事件\n */\n onKeyDown (_event: InputEventKey): void {\n // 子类按需处理键盘按下。\n }\n\n /**\n * 处理键盘抬起。\n * @param _event 键盘抬起事件\n */\n onKeyUp (_event: InputEventKey): void {\n // 子类按需处理键盘抬起。\n }\n}\n","/* eslint-disable @typescript-eslint/no-extraneous-class */\nimport { type Component, type Composition, type Constructor, VFXItem } from '@galacean/effects';\n\n/** 创建 VFXItem、挂载组件并加入合成的底层工厂。 */\nexport class VFXItemFactory {\n /**\n * 创建并挂载 VFXItem。\n * @param composition 目标合成\n * @param parent 父元素\n * @param name 元素名称\n * @param types 待挂载的组件类型\n * @returns 新建的 VFXItem\n */\n static createVFXItem (\n composition: Composition,\n parent = null,\n name = 'NewVFXItem',\n ...types: Constructor<Component>[]\n ): VFXItem {\n const vfxItem = new VFXItem(composition.engine);\n\n vfxItem.name = name;\n for (const type of types) {\n vfxItem.addComponent(type);\n }\n\n composition.addItem(vfxItem);\n // @ts-expect-error rootComposition.items 的类型未公开受支持的写入操作。\n composition.rootComposition.items.push(vfxItem);\n\n if (parent) {\n vfxItem.setParent(parent);\n }\n\n return vfxItem;\n }\n}\n","/* eslint-disable @typescript-eslint/no-extraneous-class */\nimport {\n AssetManager,\n type Composition,\n PrecompositionManager,\n SpriteComponent,\n spec,\n TextComponent,\n type VFXItem,\n CompositionComponent,\n} from '@galacean/effects';\nimport { VideoComponent } from '@galacean/effects-plugin-multimedia';\nimport { VFXItemFactory } from './vfx-item-factory';\n\n/** 创建内置类型 VFXItem 的便捷工厂。 */\nexport class DefaultVFXItems {\n /**\n * 创建空元素。\n * @param composition 目标合成\n * @param parent 父元素\n * @param name 元素名称\n * @returns 新建的空元素\n */\n static createEmpty (composition: Composition, parent = null, name = 'NewVFXItem'): VFXItem {\n const vfxItem = VFXItemFactory.createVFXItem(composition, parent, name);\n\n vfxItem.type = spec.ItemType.null;\n\n return vfxItem;\n }\n\n /**\n * 创建图片元素。\n * @param composition 目标合成\n * @param parent 父元素\n * @param name 元素名称\n * @returns 新建的图片元素\n */\n static createSprite (composition: Composition, parent = null, name = 'NewSprite'): VFXItem {\n const vfxItem = VFXItemFactory.createVFXItem(composition, parent, name, SpriteComponent);\n\n vfxItem.type = spec.ItemType.sprite;\n\n return vfxItem;\n }\n\n /**\n * 创建文本元素。\n * @param composition 目标合成\n * @param parent 父元素\n * @param name 元素名称\n * @returns 新建的文本元素\n */\n static createText (composition: Composition, parent = null, name = 'NewText'): VFXItem {\n const vfxItem = VFXItemFactory.createVFXItem(composition, parent, name, TextComponent);\n\n vfxItem.type = spec.ItemType.text;\n\n return vfxItem;\n }\n\n /**\n * 创建视频元素。\n * @param composition 目标合成\n * @param parent 父元素\n * @param name 元素名称\n * @returns 新建的视频元素\n */\n static createVideo (composition: Composition, parent = null, name = 'NewVideo'): VFXItem {\n const vfxItem = VFXItemFactory.createVFXItem(composition, parent, name, VideoComponent);\n\n vfxItem.type = spec.ItemType.video;\n\n return vfxItem;\n }\n\n /**\n * 加载并创建动效合成元素。\n * @param composition 目标合成\n * @param effects 动效地址或场景数据\n * @param parent 父元素\n * @param urlname 元素名称\n * @returns 新建的动效元素\n */\n static async createEffects (\n composition: Composition,\n effects: string | spec.JSONScene,\n parent = null,\n urlname = 'NewEffects',\n ): Promise<VFXItem> {\n const preComposition = await AssetManager.loadPrecomposition(effects, { autoplay: false });\n const vfxItem = PrecompositionManager.instantiate(preComposition, composition);\n\n vfxItem.name = urlname;\n vfxItem.type = spec.ItemType.composition;\n\n vfxItem.getComponent(CompositionComponent).endBehavior = vfxItem.endBehavior;\n\n if (parent) {\n vfxItem.setParent(parent);\n }\n\n return vfxItem;\n }\n}\n","import type { VFXItem } from '@galacean/effects';\nimport type { Euler } from '../math';\nimport { Matrix4, Vector2, Vector3, RayCaster } from '../math';\nimport { Plane } from '@galacean/effects-math/es/extension/index';\n\n/**\n * 获取元素所在合成的相机视图投影矩阵。\n * @param item 播放器元素\n * @returns 相机视图投影矩阵\n */\nfunction getViewProjectionMatrix (item: VFXItem) {\n const { composition } = item;\n\n if (!composition?.camera) {\n console.warn('The composition of the item does not have a camera, using identity matrix instead.');\n\n return new Matrix4();\n }\n\n const projectionMatrix = composition.camera.getProjectionMatrix();\n const viewMatrix = composition.camera.getViewMatrix();\n\n return new Matrix4().copyFrom(projectionMatrix.multiply(viewMatrix));\n}\n\n/**\n * 将世界坐标转换为视图坐标。\n * @param point 世界坐标\n * @param item 播放器元素\n * @param containerSize 视图容器大小\n * @returns 视图坐标\n */\nexport function projectPoint (point: Vector3, item: VFXItem, containerSize: Vector2): Vector2 {\n const projectMatrix = getViewProjectionMatrix(item);\n\n const viewPoint = new Vector2()\n .copyFrom(point.applyProjectionMatrix(projectMatrix).toVector2())\n .add(new Vector2(1, -1))\n .multiply(new Vector2(containerSize.x / 2, -containerSize.y / 2));\n\n return viewPoint;\n}\n\n/**\n * 视图坐标转 NDC 标准化坐标(范围 [-1, 1])。\n * @param point 视图坐标\n * @param containerSize 视图容器大小\n * @returns NDC 坐标\n */\nexport function viewPositionToNDC (point: Vector2, containerSize: Vector2): Vector2 {\n return new Vector2(\n point.x / containerSize.x * 2 - 1,\n 1 - point.y / containerSize.y * 2,\n );\n}\n\n/**\n * 视图大小转 NDC 视图大小。\n * @param viewSize 视图大小\n * @param containerSize 视图容器大小\n * @returns NDC 视图大小\n */\nexport function viewSizeToNDC (viewSize: Vector2, containerSize: Vector2): Vector2 {\n return new Vector2(\n (viewSize.x / containerSize.x) * 2,\n -(viewSize.y / containerSize.y) * 2\n );\n}\n\n/**\n * NDC 大小转视图大小。\n * @param ndcSize NDC 大小\n * @param containerSize 视图容器大小\n * @returns 视图大小\n */\nexport function ndcSizeToViewSize (ndcSize: Vector2, containerSize: Vector2): Vector2 {\n return new Vector2(\n ndcSize.x / 2 * containerSize.x,\n -ndcSize.y / 2 * containerSize.y\n );\n}\n\n/**\n * 视图坐标转世界坐标(经 NDC 构造射线并与交互平面求交)。\n * @param viewPoint 视图坐标\n * @param cameraInfo 相机信息\n * @param plane 交互平面\n * @param containerSize 视图容器大小\n * @returns 世界坐标\n */\nexport function viewPositionToWorld (\n viewPoint: Vector2,\n cameraInfo: { position: Vector3, matrix: Matrix4 },\n plane: Plane,\n containerSize: Vector2\n): Vector3 | undefined {\n const { position, matrix: inverseViewProjectMatrix } = cameraInfo;\n const coords = viewPositionToNDC(viewPoint, containerSize);\n const rayCaster = new RayCaster().setFromCamera(coords, { position, inverseViewProjectMatrix });\n\n const result = rayCaster.rayCastPlane(plane);\n\n return result?.point;\n}\n\n/**\n * 视图尺寸对应的世界尺寸(经射线碰撞换算)。\n * @param viewSize 视图尺寸\n * @param containerSize 容器尺寸\n * @param item 播放器元素\n * @param cameraInfo 相机位置与逆视投影矩阵\n * @param plane 交互平面\n * @returns 世界尺寸\n */\nexport function viewSizeToWorld (viewSize: Vector2, containerSize: Vector2, item: VFXItem, cameraInfo: { position: Vector3, matrix: Matrix4 }, plane: Plane): Vector3 {\n const position = new Vector3();\n\n const focusViewPoint = projectPoint(position.clone(), item, containerSize);\n const startPoint = viewPositionToWorld(focusViewPoint, cameraInfo, plane, containerSize);\n const nextPoint = viewPositionToWorld(focusViewPoint.clone().add(viewSize), cameraInfo, plane, containerSize);\n\n if (!startPoint || !nextPoint) {\n console.warn('size is out of bounds.');\n\n return new Vector3(0, 0, 0);\n }\n\n const worldSize = nextPoint.subtract(startPoint);\n\n return worldSize;\n}\n\n/**\n * 世界尺寸转视图尺寸。\n * @param worldSize 世界尺寸\n * @param containerSize 视图容器大小\n * @param item 播放器元素\n * @returns 视图尺寸\n */\nexport function worldSizeToViewSize (worldSize: Vector2, containerSize: Vector2, item: VFXItem): Vector2 {\n const result = new Vector2();\n const camera = item.composition!.camera;\n\n const { z } = item.transform.getWorldPosition();\n const { x: rx, y: ry } = camera.getInverseVPRatio(z);\n\n result.x = Math.abs(worldSize.x * containerSize.x / rx / 2);\n result.y = Math.abs(worldSize.y * containerSize.y / ry / -2);\n\n return result;\n}\n\n/**\n * 视图尺寸转像素尺寸。\n * @param viewSize 视图尺寸\n * @param viewportScale 视口缩放\n * @returns 像素尺寸\n */\nexport function viewSizeToPixel (viewSize: Vector2, viewportScale: number): Vector2 {\n return viewSize.clone().divide(viewportScale);\n}\n\n/**\n * 视图坐标转像素坐标。\n * @param viewPosition 视图坐标(像素,左上原点)\n * @param containerSize 视图容器大小\n * @param viewportScale 视口缩放\n * @param viewportTranslation NDC 单位的视口平移\n * @returns 像素坐标\n */\nexport function viewPositionToPixel (viewPosition: Vector2, containerSize: Vector2, viewportScale: number, viewportTranslation: Vector2): Vector2 {\n // 先将 NDC 平移转换为像素,确保后续运算量纲一致。\n const translationInPixel = ndcSizeToViewSize(viewportTranslation, containerSize);\n const center = new Vector2(containerSize.x / 2, containerSize.y / 2);\n\n return viewPosition.clone()\n .subtract(translationInPixel)\n .subtract(center)\n .multiply(new Vector2(1 / viewportScale, 1 / viewportScale))\n .add(center);\n}\n\n/**\n * 构造交互平面。\n * @param position 平面位置\n * @param rotation 平面旋转\n * @returns 交互平面\n */\nexport function createInteractionPlane (position: Vector3, rotation: Euler) {\n const normal = new Vector3(0, 0, 1).applyEuler(rotation);\n const plane = new Plane();\n\n plane.setFromNormalAndCoplanarPoint(position, normal);\n\n return plane;\n}\n","import { FrameComponent, spec, type VFXItem } from '@galacean/effects';\n\n/**\n * 判断播放器元素是否为画板元素。\n * @param item 播放器元素\n * @returns 是否为画板元素\n */\nexport function isFramePlayerItem (item: VFXItem) {\n return item.type === spec.ItemType.null && item.getComponent(FrameComponent) !== undefined && item.name === '画板';\n}\n\n/**\n * 判断播放器元素是否为动效元素。\n * @param item 播放器元素\n * @returns 是否为动效元素\n */\nexport function isEffectsPlayerItem (item: VFXItem) {\n return item.type === spec.ItemType.null && item.getComponent(FrameComponent) !== undefined && item.name === '动效';\n}\n\n/**\n * 判断播放器元素是否为生成器元素。\n * @param item 播放器元素\n * @returns 是否为生成器元素\n */\nexport function isGeneratorPlayerItem (item: VFXItem) {\n if (item.type !== spec.ItemType.sprite) {\n return false;\n }\n const content = item.definition?.content as Record<string, unknown> | undefined;\n\n return item.name.includes('生成器')\n || content?.generatorType === 'image'\n || content?.generatorType === 'video'\n || content?.isVideoGenerator === true;\n}\n\n/**\n * 判断播放器生成器元素是否为视频生成器。\n * @param item 播放器元素\n * @returns 是否为视频生成器\n */\nexport function isVideoGeneratorPlayerItem (item: VFXItem) {\n if (!isGeneratorPlayerItem(item)) {\n return false;\n }\n const content = item.definition?.content as Record<string, unknown> | undefined;\n\n return content?.generatorType === 'video'\n || content?.isVideoGenerator === true\n || item.name.includes('视频');\n}\n\n/**\n * 判断播放器元素是否为组元素。\n * @param item 播放器元素\n * @returns 是否为组元素\n */\nexport function isGroupPlayerItem (item: VFXItem) {\n return item.type === spec.ItemType.null && !item.getComponent(FrameComponent);\n}\n","import { FrameComponent, spec, type VFXItem } from '@galacean/effects';\nimport { Box2 } from '@galacean/effects-math/es/extension/index';\nimport type { Matrix3 } from '../math';\nimport { Euler, EulerOrder, Matrix4, Quaternion, Vector2, Vector3, getBoxTransform, getBoxTransformFromBox, getTransformedBox } from '../math';\nimport { projectPoint, worldSizeToViewSize } from '../viewport/coordinates';\nimport { isFramePlayerItem } from './item-predicates';\n\n/**\n * 获取元素用于编辑的视图 Box2。\n * @param item 播放器元素\n * @param containerSize 视图大小\n * @returns 视图坐标系中的轴对齐包围盒\n */\nexport function getItemViewBox (item: VFXItem, containerSize: Vector2): Box2 {\n const transform = getItemViewTransform(item, containerSize);\n\n return transform ? getTransformedBox(transform) : new Box2();\n}\n\n/**\n * 获取归一化 Box2 到元素视图坐标的变换。\n * @param item 播放器元素\n * @param containerSize 视图大小\n * @returns 有效变换;元素不可见或没有有效矩形时返回 undefined\n */\nexport function getItemViewTransform (item: VFXItem, containerSize: Vector2): Matrix3 | undefined {\n if (!item.isVisible || !supportsRect(item)) {\n return undefined;\n }\n\n const hasFrameComponent = !!item.getComponent(FrameComponent);\n let viewTransform: Matrix3 | undefined;\n\n if (item.type !== spec.ItemType.null || hasFrameComponent) {\n const { transform, composition } = item;\n\n transform.updateLocalMatrix();\n const { x, y } = transform.size.clone().divide(2);\n const compositionMatrix = new Matrix4()\n .copyFrom(composition?.transform.getWorldMatrix() ?? new Matrix4())\n .invert();\n const itemWorldMatrix = compositionMatrix.multiply(transform.getWorldMatrix());\n\n viewTransform = getBoxTransform([\n new Vector3(-x, y, 0),\n new Vector3(x, y, 0),\n new Vector3(x, -y, 0),\n new Vector3(-x, -y, 0),\n ].map(point => projectPoint(point.applyMatrix(itemWorldMatrix), item, containerSize)));\n }\n\n if (hasFrameComponent) {\n return viewTransform;\n }\n\n const box = viewTransform ? getTransformedBox(viewTransform) : new Box2();\n let hasChildBox = false;\n\n for (const child of item.children ?? []) {\n const childBox = getItemViewBox(child, containerSize);\n\n if (!childBox.isEmpty()) {\n box.union(childBox);\n hasChildBox = true;\n }\n }\n\n return hasChildBox ? getBoxTransformFromBox(box) : viewTransform;\n}\n\n/** @returns 元素类型是否提供矩形编辑几何。 */\nfunction supportsRect (item: VFXItem): boolean {\n return item.type === spec.ItemType.sprite\n || item.type === spec.ItemType.plugin\n || item.type === spec.ItemType.video\n || item.type === spec.ItemType.richtext\n || item.type === spec.ItemType.text\n || item.type === spec.ItemType.null\n || item.type === spec.ItemType.shape;\n}\n\n/**\n * 获取播放器元素在视图中的锚点坐标。\n * @param item 播放器元素\n * @param containerSize 视图容器大小\n * @returns 视图锚点坐标\n */\nexport function getItemViewAnchor (item: VFXItem, containerSize: Vector2): Vector2 {\n const anchor = item.transform.anchor ?? item.transform.position;\n\n const worldAnchor = new Vector3().copyFrom(anchor).applyMatrix(new Matrix4().copyFrom(item.transform.getWorldMatrix()));\n const viewAnchor = projectPoint(worldAnchor, item, containerSize).multiply(100).round().divide(100);\n\n return viewAnchor;\n}\n\n/**\n * 获取元素的变换矩阵和父级变换矩阵。\n * @param item 播放器元素\n * @returns 元素的变换矩阵和父级变换矩阵\n */\nexport function getItemTransform (item: VFXItem): { matrix: Matrix4, parentMatrix: Matrix4 } {\n const transform = {\n matrix: new Matrix4(),\n parentMatrix: new Matrix4(),\n };\n\n if (item.transform !== undefined) {\n item.transform.updateLocalMatrix();\n transform.matrix.copyFrom(item.transform.getWorldMatrix());\n transform.parentMatrix.copyFrom(item.transform.parentTransform?.getWorldMatrix() ?? new Matrix4());\n }\n\n return transform;\n}\n\n/** 元素的世界分解变换。 */\nexport type DecomposedItemTransform = {\n /** 元素的世界矩阵。 */\n matrix: Matrix4,\n /** 父元素的世界矩阵。 */\n parentMatrix: Matrix4,\n /** 元素的世界位置。 */\n position: Vector3,\n /** 元素的世界旋转。 */\n rotation: Euler,\n /** 元素的世界缩放。 */\n scale: Vector3,\n};\n\n/**\n * 获取元素的世界变换。\n * @param item 播放器元素\n * @returns 分解后的世界变换\n */\nexport function decomposeItemTransform (item: VFXItem): DecomposedItemTransform {\n const { matrix, parentMatrix } = getItemTransform(item);\n const position = new Vector3();\n const quaternion = new Quaternion();\n const scale = new Vector3();\n\n item.transform.assignWorldTRS(position, quaternion, scale);\n\n return {\n matrix,\n parentMatrix,\n position,\n rotation: new Euler(0, 0, 0, EulerOrder.XYZ).setFromQuaternion(quaternion),\n scale,\n };\n}\n\n/**\n * 获取播放器元素在视图中的尺寸。\n * @param item 播放器元素\n * @param containerSize 视图容器大小\n * @returns 视图尺寸\n */\nexport function getItemViewSize (item: VFXItem, containerSize: Vector2): Vector2 {\n if (isFramePlayerItem(item)) {\n return worldSizeToViewSize(getItemWorldSize(item), containerSize, item);\n } else {\n return getItemViewBox(item, containerSize).getSize();\n }\n}\n\n/**\n * 获取元素在所属合成坐标系中的实际世界尺寸。\n *\n * `transform.size` 是元素本地尺寸;这里叠加元素到合成根之间的缩放,\n * 但排除合成本身的世界变换,与 Frame 尺寸写回使用的坐标系保持一致。\n * @param item 播放器元素\n * @returns 元素在所属合成坐标系中的尺寸\n */\nexport function getItemWorldSize (item: VFXItem): Vector2 {\n const { transform, composition } = item;\n\n transform.updateLocalMatrix();\n\n const compositionWorldInverse = new Matrix4()\n .copyFrom(composition?.transform.getWorldMatrix() ?? new Matrix4())\n .invert();\n const itemToComposition = compositionWorldInverse.multiply(transform.getWorldMatrix());\n const worldScale = new Vector3();\n\n itemToComposition.decompose(new Vector3(), new Quaternion(), worldScale);\n\n return new Vector2(\n Math.abs(transform.size.x * worldScale.x),\n Math.abs(transform.size.y * worldScale.y),\n );\n}\n","import type { Composition, VFXItem } from '@galacean/effects';\nimport { isEffectsPlayerItem, isFramePlayerItem } from './item-predicates';\n\n/**\n * 判断播放器元素是否参与交互命中。\n *\n * 部分测试夹具或外部运行时节点可能未提供 isVisible;只有明确为 false 时视为隐藏。\n * @param item 待判断元素\n * @returns 是否可参与交互\n */\nexport function isPlayerItemVisible (item: VFXItem | undefined): boolean {\n return item?.isVisible !== false;\n}\n\n/**\n * 获取元素自身或祖先链中最近的动效容器。\n *\n * 默认编辑模式下,Effects 预合成的运行时子节点只负责渲染,点选、框选等交互\n * 会归并到该容器;EffectsEditMode 使用本方法识别当前放开的子树边界。\n * @param item 待解析的播放器元素\n * @returns 最近的动效容器;不在动效子树中时返回 undefined\n */\nexport function getEffectsPlayerItemOwner (item: VFXItem | undefined): VFXItem | undefined {\n let current = item;\n\n while (current) {\n if (isEffectsPlayerItem(current)) {\n return current;\n }\n current = current.parent;\n }\n\n return undefined;\n}\n\n/**\n * 获取元素祖先链中的所有画板。\n *\n * 不包含元素自身,结果按从近到远排列。\n * @param item 待检查的播放器元素\n * @returns 元素所在的画板祖先列表\n */\nexport function getFramePlayerItemAncestors (item: VFXItem): VFXItem[] {\n const frames: VFXItem[] = [];\n let parent = item.parent;\n\n while (parent) {\n if (isFramePlayerItem(parent)) {\n frames.push(parent);\n }\n parent = parent.parent;\n }\n\n return frames;\n}\n\n/**\n * 获取播放器元素的所有子元素。\n * @param item 播放器元素\n * @returns 子元素数组\n */\nexport function getItemChildren (item: VFXItem) {\n const children: VFXItem[] = [];\n\n const isFrameItem = isFramePlayerItem(item);\n const isEffectItem = isEffectsPlayerItem(item);\n\n if (isEffectItem) {\n return children;\n }\n /**\n * 递归展开子元素。\n * @param items 当前层子元素\n * @returns 当前层及其全部后代\n */\n function getAllChildren (items: VFXItem[]): VFXItem[] {\n const result: VFXItem[] = [];\n\n for (const child of items) {\n result.push(child);\n if (child.children && child.children.length > 0) {\n result.push(...getAllChildren(child.children));\n }\n }\n\n return result;\n }\n\n if (isFrameItem) {\n return getAllChildren(item.children);\n } else if (item.children && item.children.length > 0) {\n return getAllChildren(item.children);\n }\n\n return children;\n}\n\n/**\n * 在合成元素树内按实例 ID 查找元素。\n * @param composition 合成(无合成返回 undefined)\n * @param id 元素 instanceId\n * @returns 命中元素;未命中或无合成返回 undefined\n */\nexport function getPlayerItemById (composition: Composition | undefined, id: string): VFXItem | undefined {\n if (!composition) {\n return undefined;\n }\n /**\n * 在当前元素子树中递归查找实例。\n * @param items 当前层元素。\n * @param targetId 目标实例 ID。\n * @returns 命中的元素。\n */\n const dfs = (items: VFXItem[], targetId: string): VFXItem | undefined => {\n for (const item of items) {\n if (item.getInstanceId() === targetId) {\n return item;\n }\n const found = dfs(item.children, targetId);\n\n if (found) {\n return found;\n }\n }\n\n return undefined;\n };\n\n return dfs(composition.items, id);\n}\n","import { CompositionComponent, type Engine, spec } from '@galacean/effects';\nimport { VideoComponent } from '@galacean/effects-plugin-multimedia';\nimport { getPlayerItemById } from './item-hierarchy';\n\nconst pendingPauseRequests = new WeakMap<VideoComponent, symbol>();\n\n/**\n * 请求播放视频组件,并撤销尚未落地的暂停请求。\n * @param videoComponent 视频组件\n */\nexport function playVideoComponent (videoComponent: VideoComponent): void {\n pendingPauseRequests.delete(videoComponent);\n videoComponent.playVideo();\n}\n\n/**\n * 请求暂停视频组件。\n *\n * Multimedia 组件在 `HTMLVideoElement.play()` 尚未完成时直接暂停会产生 AbortError,\n * 因此等待组件内部的在途播放结束后再暂停;期间再次播放会取消本次暂停请求。\n * @param videoComponent 视频组件\n */\nexport function pauseVideoComponent (videoComponent: VideoComponent): void {\n const playPromise = (videoComponent as any).playPromise;\n\n if (!playPromise) {\n pendingPauseRequests.delete(videoComponent);\n videoComponent.pauseVideo();\n\n return;\n }\n\n const request = Symbol('pause-video');\n\n pendingPauseRequests.set(videoComponent, request);\n\n const pauseAfterPlay = (): void => {\n if (pendingPauseRequests.get(videoComponent) !== request) {\n return;\n }\n pendingPauseRequests.delete(videoComponent);\n videoComponent.pauseVideo();\n };\n\n void playPromise.then(pauseAfterPlay, pauseAfterPlay);\n}\n\n/**\n * 播放视频元素。\n * @param engine 引擎\n * @param id 视频元素 id\n */\nexport function playVideoItem (engine: Engine, id: string) {\n const playerItem = getPlayerItemById(engine.sceneServer.compositions[0], id);\n\n if (playerItem?.type !== spec.ItemType.video) {\n return;\n }\n const videoComponent = playerItem.getComponent(VideoComponent);\n\n if (videoComponent) {\n playVideoComponent(videoComponent);\n }\n}\n\n/**\n * 暂停视频元素。\n * @param engine 引擎\n * @param id 视频元素 id\n */\nexport function pauseVideoItem (engine: Engine, id: string) {\n const playerItem = getPlayerItemById(engine.sceneServer.compositions[0], id);\n\n if (playerItem?.type !== spec.ItemType.video) {\n return;\n }\n const videoComponent = playerItem.getComponent(VideoComponent);\n\n if (videoComponent) {\n pauseVideoComponent(videoComponent);\n }\n}\n\n/**\n * 播放动效元素。\n * @param engine 引擎\n * @param id 动效元素 id\n */\nexport function playEffectsItem (engine: Engine, id: string) {\n const controlItem = getPlayerItemById(engine.sceneServer.compositions[0], id);\n const compositionItem = controlItem?.children?.[0];\n\n if (compositionItem?.type !== spec.ItemType.composition) {\n return;\n }\n compositionItem.getComponent(CompositionComponent).play();\n}\n\n/**\n * 暂停动效元素。\n * @param engine 引擎\n * @param id 动效元素 id\n */\nexport function pauseEffectsItem (engine: Engine, id: string) {\n const controlItem = getPlayerItemById(engine.sceneServer.compositions[0], id);\n const compositionItem = controlItem?.children?.[0];\n\n if (compositionItem?.type !== spec.ItemType.composition) {\n return;\n }\n compositionItem.getComponent(CompositionComponent).pause();\n}\n","import { type Engine } from '@galacean/effects';\nimport { Matrix4, Vector2, Vector3 } from '../math';\n\n/** 读取 Gizmo 使用的当前视口和相机参数。 */\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class GizmoViewportUtils {\n /**\n * 获取视口缩放。\n * @param engine Effects 引擎\n * @returns 视口缩放;无相机时返回 1\n */\n static getViewScale (engine: Engine): number {\n const camera = engine.sceneServer.compositions[0]?.camera;\n\n return camera ? camera.getViewportMatrix().elements[0] : 1;\n }\n\n /**\n * 获取 NDC 坐标系中的视口平移。\n * @param engine Effects 引擎\n * @returns 视口平移;无相机时返回零向量\n */\n static getViewportTranslation (engine: Engine): Vector2 {\n const camera = engine.sceneServer.compositions[0]?.camera;\n\n if (!camera) {\n return new Vector2();\n }\n const e = camera.getViewportMatrix().elements;\n\n return new Vector2(e[12], e[13]);\n }\n\n /**\n * 获取相机位置和逆视投影矩阵。\n * @param engine Effects 引擎\n * @returns 相机信息;无相机时返回零位姿\n */\n static getCameraInfo (engine: Engine): { position: Vector3, matrix: Matrix4 } {\n const camera = engine.sceneServer.compositions[0]?.camera;\n\n if (!camera) {\n return { position: new Vector3(), matrix: new Matrix4() };\n }\n\n return {\n position: new Vector3().copyFrom(camera.position),\n matrix: new Matrix4().copyFrom(camera.getInverseViewProjectionMatrix()),\n };\n }\n\n /**\n * 获取 DOM 容器尺寸。\n * @param container DOM 容器\n * @returns 容器宽高\n */\n static getContainerSize (container: HTMLElement): Vector2 {\n return new Vector2(container.offsetWidth, container.offsetHeight);\n }\n}\n","/** 带稳定标识、默认值和校验器的配置定义。 */\nexport type ConfigDefinition<Id extends string, T extends object> = {\n /** 配置唯一标识。 */\n readonly id: Id,\n /** 配置默认值。 */\n readonly defaults: Readonly<T>,\n /** 校验并归一化外部配置。 */\n readonly validate?: (input: unknown) => Partial<T> | undefined,\n};\n\n/** 任意配置定义的通用类型。 */\nexport type AnyConfigDefinition = ConfigDefinition<string, Record<string, unknown>>;\n\n/** 提取配置定义对应的值类型。 */\nexport type ConfigValue<D> = D extends ConfigDefinition<string, infer T> ? T : never;\n\n/** 一次配置变更的前后值。 */\nexport type ConfigChange<T extends object> = {\n /** 本次接受的增量配置。 */\n partial: Readonly<Partial<T>>,\n /** 变更前的完整配置。 */\n previous: Readonly<T>,\n /** 变更后的完整配置。 */\n current: Readonly<T>,\n};\n\n/**\n * 深拷贝由数组和普通对象组成的配置值。\n * @param value 待拷贝的配置值\n * @returns 配置值副本\n */\nexport function cloneConfigValue<T> (value: T): T {\n if (Array.isArray(value)) {\n return value.map(item => cloneConfigValue(item)) as T;\n }\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, cloneConfigValue(item)]),\n ) as T;\n }\n\n return value;\n}\n\n/**\n * 递归冻结配置值。\n * @param value 待冻结的配置值\n * @returns 已冻结的原值\n */\nexport function freezeConfigValue<T> (value: T): T {\n if (value && typeof value === 'object') {\n for (const item of Object.values(value)) {\n freezeConfigValue(item);\n }\n Object.freeze(value);\n }\n\n return value;\n}\n\n/**\n * 创建不可变的配置定义。\n * @param definition 配置标识、默认值和可选校验器\n * @returns 默认值已复制并冻结的配置定义\n */\nexport function defineConfig<const Id extends string, T extends object> (\n definition: ConfigDefinition<Id, T>,\n): ConfigDefinition<Id, T> {\n return Object.freeze({\n ...definition,\n defaults: freezeConfigValue(cloneConfigValue(definition.defaults)),\n });\n}\n","import { defineConfig } from './config-definition';\nimport type { LoadingConfig } from './types';\n\nexport const DEFAULT_LOADING_FRAGMENT = `\n// Shadertoy Fragment Shader\n// Diagonal background gradient + wider colorful transparent shimmer\n\nprecision highp float;\n\nvarying vec2 vUV;\n\nuniform vec4 _Time;\n\n// ------------------------------------------------------------\n// Background\n// ------------------------------------------------------------\nvec3 background(vec2 uv) {\n vec3 topLeft = vec3(0.88, 0.85, 1.00);\n vec3 bottomRight = vec3(0.98, 0.98, 0.98);\n\n float d = (uv.x + (1.0 - uv.y)) * 0.5;\n d = smoothstep(0.0, 1.0, d);\n\n vec3 col = mix(topLeft, bottomRight, d);\n\n vec2 p1 = uv - vec2(1.13, 1.40);\n float r1 = length(p1 / vec2(0.85, 0.85));\n float g1 = 1.0 - smoothstep(0.0, 0.96, r1);\n col += vec3(172.0/255.0, 183.0/255.0, 1.0) * g1 * 0.28;\n\n vec2 p2 = uv - vec2(0.25, 0.23);\n float r2 = length(p2 / vec2(0.74, 0.64));\n float g2 = 1.0 - smoothstep(0.0, 1.0, r2);\n col += vec3(147.0/255.0, 108.0/255.0, 1.0) * g2 * 0.10;\n\n return col;\n}\n\n// ------------------------------------------------------------\n// Easing: slow at start, fast at end\n// ------------------------------------------------------------\nfloat easeInQuad(float x) {\n return x * x;\n}\n\n// ------------------------------------------------------------\n// Color palette helper\n// ------------------------------------------------------------\nvec3 palette(float t) {\n // 柔和的彩色条:蓝 -> 青 -> 紫 -> 粉 -> 蓝\n vec3 a = vec3(0.62, 0.82, 1.00);\n vec3 b = vec3(0.72, 0.95, 1.00);\n vec3 c = vec3(0.83, 0.76, 1.00);\n vec3 d = vec3(1.00, 0.82, 0.95);\n\n t = fract(t);\n\n if (t < 0.33) {\n float k = smoothstep(0.0, 0.33, t);\n return mix(a, b, k);\n } else if (t < 0.66) {\n float k = smoothstep(0.33, 0.66, t);\n return mix(b, c, k);\n } else {\n float k = smoothstep(0.66, 1.0, t);\n return mix(c, d, k);\n }\n}\n\n// ------------------------------------------------------------\n// Wider colorful transparent left-to-right shimmer\n// ------------------------------------------------------------\nvec4 shimmerBand(vec2 uv, float t) {\n float cycle = fract(t * 0.70);\n cycle = easeInQuad(cycle);\n\n float x = cycle * 1.55 - 0.25; // sweep from left to right\n\n float d = abs(uv.x - x);\n float band = 1.0 - smoothstep(0.0, 0.30, d);\n float core = 1.0 - smoothstep(0.0, 0.10, d);\n\n float x2 = x + (uv.y - 0.5) * 0.18;\n float d2 = abs(uv.x - x2);\n float band2 = 1.0 - smoothstep(0.0, 0.20, d2);\n\n float s = max(band * 0.85, band2 * 0.60);\n s = max(s, core * 0.95);\n s = clamp(s, 0.0, 1.0);\n\n // 颜色沿条带变化,模拟彩色渐变\n float hueT = uv.y * 0.25 + uv.x * 0.60 + t * 0.10;\n vec3 color1 = palette(hueT);\n\n // 中间更亮一点,边缘更淡\n vec3 color2 = mix(color1, vec3(1.0), core * 0.35);\n\n return vec4(color2, s);\n}\n\n// ------------------------------------------------------------\n// Main\n// ------------------------------------------------------------\nvoid main() {\n vec2 uv = vUV;\n\n vec3 col = background(uv);\n\n vec4 sh = shimmerBand(uv, _Time.y);\n\n // 可选:增加一点柔光感\n col += sh.rgb * sh.a * 0.06;\n\n gl_FragColor = vec4(col, 1.0);\n}`;\n\nexport const loadingConfig = defineConfig<'feedback.loading', LoadingConfig>({\n id: 'feedback.loading',\n defaults: { loadingFragment: DEFAULT_LOADING_FRAGMENT },\n});\n","import { defineConfig } from './config-definition';\nimport type {\n EffectsEditModeConfig,\n IconConfig,\n ItemCreateConfig,\n MaskConfig,\n ImageCutConfig,\n ImageExpandConfig,\n SelectionPreviewConfig,\n SnapConfig,\n SpriteTextEditConfig,\n ResizeSelectionConfig,\n ViewportNavigationConfig,\n ViewportOverlayConfig,\n} from './types';\n\nexport { DEFAULT_LOADING_FRAGMENT, loadingConfig } from './loading-config';\n\nexport const effectsEditModeConfig = defineConfig<'mode.effects-edit', EffectsEditModeConfig>({\n id: 'mode.effects-edit',\n defaults: { allowTransform: true },\n});\n\nexport const viewportNavigationConfig = defineConfig<'viewport.navigation', ViewportNavigationConfig>({\n id: 'viewport.navigation',\n defaults: {\n scrollWheelZoom: false,\n invertZoom: false,\n zoomStep: 0.1,\n },\n});\n\nexport const viewportOverlayConfig = defineConfig<'viewport.overlay', ViewportOverlayConfig>({\n id: 'viewport.overlay',\n defaults: {\n boxColor: 0xFF0000,\n boxWidth: 1,\n outerMaskEnabled: true,\n markColor: 0x000000,\n markAlpha: 0.17,\n safeAreaEnabled: true,\n safeAreaBoxColor: 0x00FF00,\n safeAreaBoxAlpha: 0.3,\n },\n});\n\nexport const selectionPreviewConfig = defineConfig<'selection.preview', SelectionPreviewConfig>({\n id: 'selection.preview',\n defaults: {\n videoPreSelectedPlay: true,\n preSelectedColor: 0x3b82f6,\n preSelectedWidth: 2,\n regionBoxColor: 0x3b82f6,\n regionBoxAlpha: 0.17,\n regionWireframeColor: 0x3b82f6,\n regionWireframeAlpha: 0.78,\n regionWireframeWidth: 1,\n },\n});\n\nexport const selectionSnapConfig = defineConfig<'selection.snap', SnapConfig>({\n id: 'selection.snap',\n defaults: {\n enabled: true,\n lineWidth: 0.8,\n lineColor: 0xF24822,\n distance: 5,\n },\n});\n\nexport const resizeSelectionConfig = defineConfig<'resize-selection', ResizeSelectionConfig>({\n id: 'resize-selection',\n defaults: {\n pixelRatio: 1,\n contentRatio: 1,\n wireframeColor: 0x3b82f6,\n wireframeAlpha: 1,\n wireframeWidth: 1.5,\n cornerFillColor: 0xFFFFFF,\n cornerLineColor: 0x3b82f6,\n cornerLineWidth: 1.5,\n cornerLineAlpha: 1,\n scaleCircleSize: 4,\n rotationCircleSize: 7,\n infoShowEnabled: true,\n sizeTextColor: 0x666666,\n nameTextColor: 0x666666,\n frameMoveLineColor: 0x3b82f6,\n frameMoveLineWidth: 2,\n imageLogoUrl: 'https://mdn.alipayobjects.com/huamei_ixsp8m/afts/img/A*F2wVS7x0MfIAAAAAQBAAAAgAev-aAQ/original',\n groupLogoUrl: 'https://mdn.alipayobjects.com/huamei_ppzin5/afts/img/Yo69Sr7boqYAAAAAH3AAAAgADjdkAQFr/original',\n textLogoUrl: 'https://mdn.alipayobjects.com/huamei_ppzin5/afts/img/Yo69Sr7boqYAAAAAH3AAAAgADjdkAQFr/original',\n videoLogoUrl: 'https://mdn.alipayobjects.com/huamei_ixsp8m/afts/img/A*w1fnS4mq0VgAAAAAQCAAAAgAev-aAQ/original',\n frameLogoUrl: 'https://mdn.alipayobjects.com/huamei_ixsp8m/afts/img/A*DRF_RpndkjUAAAAAQDAAAAgAev-aAQ/original',\n effectsLogoUrl: 'https://mdn.alipayobjects.com/huamei_ixsp8m/afts/img/A*RMewR4ruUnYAAAAAQGAAAAgAev-aAQ/original',\n },\n});\n\nexport const imageCutConfig = defineConfig<'tool.image-cut', ImageCutConfig>({\n id: 'tool.image-cut',\n defaults: {\n maskColor: 0xFFFFFF,\n maskAlpha: 0.5,\n cutBoxLineWidth: 2,\n cutBoxLineColor: 0x6A34FF,\n cutBoxLineAlpha: 1,\n itemBoxLineWidth: 1,\n itemBoxLineColor: 0x6A34FF,\n itemBoxLineAlpha: 1,\n cutBoxCornerRadius: 5,\n cutBoxCornerFillColor: 0xFFFFFF,\n cutBoxCornerLineWidth: 2,\n cutBoxCornerLineColor: 0x6A34FF,\n cutBoxCornerLineAlpha: 1,\n scaleInteractionDistance: 8,\n directionScaleInteractionDistance: 5,\n gridLineWidth: 1,\n gridLineColor: 0xFFFFFF,\n gridLineAlpha: 1,\n gridCount: 2,\n },\n});\n\nexport const imageExpandConfig = defineConfig<'tool.image-expand', ImageExpandConfig>({\n id: 'tool.image-expand',\n defaults: {\n maskColor: 0x6A34FF,\n maskAlpha: 0.2,\n expandBoxLineWidth: 2,\n expandBoxLineColor: 0x6A34FF,\n expandBoxLineAlpha: 1,\n expandBoxCornerRadius: 5,\n expandBoxCornerLineWidth: 2,\n expandBoxCornerLineColor: 0x6A34FF,\n expandBoxCornerLineAlpha: 1,\n expandBoxCornerFillColor: 0xFFFFFF,\n scaleInteractionDistance: 8,\n directionScaleInteractionDistance: 5,\n gridLineWidth: 1,\n gridLineColor: 0xFFFFFF,\n gridLineAlpha: 1,\n gridCount: 2,\n },\n});\n\nexport const maskConfig = defineConfig<'tool.mask', MaskConfig>({\n id: 'tool.mask',\n defaults: {\n maskImage: '',\n brushSize: 20,\n brushColor: 0x6A34FF,\n brushAlpha: 0.5,\n maskColor: 0x00FF00,\n maskBackgroundColor: 0xFFFFFF,\n maskAlpha: 1,\n boxLineWidth: 1,\n boxLineColor: 0x6A34FF,\n boxLineAlpha: 1,\n },\n});\n\nexport const spriteTextEditConfig = defineConfig<'tool.sprite-text-edit', SpriteTextEditConfig>({\n id: 'tool.sprite-text-edit',\n defaults: {\n textColor: 0xFFFFFF,\n preSelectedTextColor: 0xFFFFFF,\n boxLineWidth: 3,\n dashLineDash: 8,\n dashLineGap: 8,\n editBoxAlpha: 0.15,\n editBoxColor: 0x3B82F6,\n editBoxLineAlpha: 1,\n editBoxLineColor: 0x3B82F6,\n editBoxPreSelectedAlpha: 0.25,\n editBoxPreSelectedColor: 0x3B82F6,\n editBoxLinePreSelectedAlpha: 1,\n editBoxLinePreSelectedColor: 0x3B82F6,\n hasChangedEditBoxAlpha: 0.2,\n hasChangedEditBoxColor: 0x22C55E,\n hasChangedEditBoxLineAlpha: 1,\n hasChangedEditBoxLineColor: 0x22C55E,\n hasChangedEditBoxPreSelectedAlpha: 0.3,\n hasChangedEditBoxPreSelectedColor: 0x22C55E,\n hasChangedEditBoxLinePreSelectedAlpha: 1,\n hasChangedEditBoxLinePreSelectedColor: 0x22C55E,\n editBoxSelectedAlpha: 0.6,\n editBoxSelectedColor: 0xFFFF00,\n },\n});\n\nexport const iconConfig = defineConfig<'feedback.icon', IconConfig>({\n id: 'feedback.icon',\n defaults: {\n autoShow: true,\n videoPlayUrl: 'https://mdn.alipayobjects.com/huamei_ixsp8m/afts/img/A*ORMmSYYHIHUAAAAAJbAAAAgAev-aAQ/original',\n videoPlayShift: [20, 20],\n videoPlayWidth: 20,\n videoPlayHeight: 20,\n imageGeneratorUrl: 'https://mdn.alipayobjects.com/huamei_ixsp8m/afts/img/A*bYB-TIEWLBkAAAAAQGAAAAgAev-aAQ/original',\n videoGeneratorUrl: 'https://mdn.alipayobjects.com/huamei_ixsp8m/afts/img/A*6cTFT44CuKEAAAAAQCAAAAgAev-aAQ/original',\n generatorWidth: 200,\n generatorHeight: 200,\n },\n});\n\nexport const itemCreateConfig = defineConfig<'tool.item-create', ItemCreateConfig>({\n id: 'tool.item-create',\n defaults: {\n frameBorderColor: 0x2178FF,\n frameBorderWidth: 1,\n frameBorderAlpha: 0.8,\n frameFillColor: 0x2178FF,\n frameFillAlpha: 0.15,\n frameChildBoxAlpha: 0.35,\n frameChildBoxColor: 0x2178FF,\n },\n});\n","import type { Engine } from '@galacean/effects';\nimport { Matrix4, Quaternion, Vector2, Vector3 } from '../math';\n\n/**\n * 缩放视图。\n * @param engine 引擎\n * @param zoom 缩放值\n * @param center 缩放中心\n */\nexport function zoomView (engine: Engine, zoom: number, center: Vector2 = new Vector2()) {\n const composition = engine.sceneServer.compositions[0];\n\n if (!composition) {\n return;\n }\n\n const { camera } = composition;\n const scale = camera.getViewportMatrix().elements[0];\n const translation = new Vector2(camera.getViewportMatrix().elements[12], camera.getViewportMatrix().elements[13]);\n\n const result = scale + zoom;\n\n // 1. 反算缩放中心对应的世界坐标。\n const worldX = (center.x - translation.x) / scale;\n const worldY = (center.y - translation.y) / scale;\n\n // 2. 调整平移,使缩放中心在屏幕上的位置保持不变。\n const newNDCTranslation = new Vector2(\n center.x - worldX * result,\n center.y - worldY * result,\n );\n\n const viewportMatrix = new Matrix4().compose(\n new Vector3(newNDCTranslation.x, newNDCTranslation.y, 0),\n new Quaternion(),\n new Vector3(result, result, 1)\n );\n\n composition.camera.setViewportMatrix(viewportMatrix);\n}\n\n/**\n * 平移视图。\n * @param engine 引擎\n * @param translation 位移值\n */\nexport function panView (engine: Engine, translation: Vector2,) {\n const composition = engine.sceneServer.compositions[0];\n\n if (!composition) {\n return;\n }\n const { camera } = composition;\n const scale = camera.getViewportMatrix().elements[0];\n const resultTranslation = new Vector2(camera.getViewportMatrix().elements[12], camera.getViewportMatrix().elements[13]).add(translation);\n\n const viewportMatrix = new Matrix4().compose(\n new Vector3(resultTranslation.x, resultTranslation.y, 0),\n new Quaternion(),\n new Vector3(scale, scale, 1)\n );\n\n camera.setViewportMatrix(viewportMatrix);\n}\n","import { Vector2 } from '../math';\nimport { Box2 } from '@galacean/effects-math/es/extension/index';\n\n/**\n * 计算内容两端分别对齐视口两端时的平移区间。\n * @param bounds 相对视口中心、scale=1 时的内容边界\n * @param scale 当前缩放\n * @param size 视口像素尺寸\n */\nexport function getViewportTranslationRange (bounds: Box2, scale: number, size: Vector2): Box2 {\n const start = bounds.min.clone().multiply(-scale).subtract(size.clone().divide(2));\n const end = bounds.max.clone().multiply(-scale).add(size.clone().divide(2));\n\n // 内容大于视口时允许浏览两端;小于视口时允许在屏幕内移动。\n return new Box2(\n new Vector2(Math.min(start.x, end.x), Math.min(start.y, end.y)),\n new Vector2(Math.max(start.x, end.x), Math.max(start.y, end.y)),\n );\n}\n","import {\n EventEmitter,\n MouseButton,\n MouseButtonMask,\n type Engine,\n type InputEventMouseButton,\n} from '@galacean/effects';\nimport { clamp, Vector2 } from '../math';\nimport type { Box2 } from '@galacean/effects-math/es/extension/index';\nimport type { ViewportNavigationRange } from './types';\nimport { getViewportTranslationRange } from './viewport-range';\nimport type { ViewportNavigationConfig } from '../configs/types';\nimport { viewportNavigationConfig } from '../configs/builtin-configs';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport { ndcSizeToViewSize, viewPositionToNDC, viewSizeToNDC } from './coordinates';\nimport { panView, zoomView } from './viewport-operations';\nimport { GizmoViewportUtils } from './viewport-utils';\n\n/** 视口平移或缩放后的相机快照。 */\nexport type ViewportParam = {\n /** 视口缩放。 */\n scale: number,\n /** 视口平移。 */\n translation: Vector2,\n /** 本次变换中心。 */\n center: Vector2,\n};\n\n/** 视口导航操作来源。 */\nexport type ViewportNavigationSource =\n | 'hand-pan'\n | 'wheel-pan'\n | 'wheel-zoom'\n | 'pinch-zoom';\n\n/** 带操作来源的视口变更快照。 */\nexport type ViewportNavigationChange = ViewportParam & {\n /** 触发视口变更的操作。 */\n source: ViewportNavigationSource,\n};\n\n/** 视口导航控制器事件参数。 */\nexport type ViewportNavigationEvents = {\n /** 视口变更事件。 */\n change: [ViewportNavigationChange],\n};\n\n/** 滚轮操作模式。 */\ntype WheelMode = 'pan' | 'zoom';\n\n/** Effects 将 DOM 像素滚轮量除以 100 后写入 InputEventMouseButton.factor。 */\nconst EFFECTS_WHEEL_FACTOR_TO_VIEW_PIXELS = 100;\n\n/** 统一处理手形工具和滚轮触发的视口平移与缩放。 */\nexport class ViewportNavigationController extends EventEmitter<ViewportNavigationEvents> {\n private readonly owner: GizmoOwner;\n private minScale = 0.01;\n private maxScale = 20;\n private minTranslation = new Vector2(-Infinity, -Infinity);\n private maxTranslation = new Vector2(Infinity, Infinity);\n private translationBounds?: Box2;\n\n /**\n * @param owner Gizmo 宿主\n */\n constructor (owner: GizmoOwner) {\n super();\n this.owner = owner;\n }\n\n /** 当前视口导航配置。 */\n get config (): Readonly<ViewportNavigationConfig> {\n return this.owner.getConfigManager().get(viewportNavigationConfig);\n }\n\n /** 当前 Effects 引擎。 */\n private get engine (): Engine {\n return this.owner.getEngine();\n }\n\n /**\n * 设置允许的视口缩放范围。\n * @param minScale 最小缩放\n * @param maxScale 最大缩放\n */\n setScaleRange (minScale: number, maxScale: number): void {\n if (!Number.isFinite(minScale)\n || !Number.isFinite(maxScale)\n || minScale <= 0\n || maxScale <= 0\n || minScale > maxScale) {\n throw new RangeError('Viewport scale range must be finite, positive, and ordered.');\n }\n this.minScale = minScale;\n this.maxScale = maxScale;\n this.clampCurrentViewport();\n }\n\n /**\n * 设置视口缩放和平移范围。\n * @param range 视口边界;未提供的缩放边界保留当前值,未提供的平移边界表示不设限\n */\n setViewportRange (range: ViewportNavigationRange): void {\n const minScale = range.minScale ?? this.minScale;\n const maxScale = range.maxScale ?? this.maxScale;\n\n if (!Number.isFinite(minScale)\n || !Number.isFinite(maxScale)\n || minScale <= 0\n || maxScale <= 0\n || minScale > maxScale) {\n throw new RangeError('Viewport scale range must be finite, positive, and ordered.');\n }\n\n const minTranslation = range.minTranslation?.clone() ?? new Vector2(-Infinity, -Infinity);\n const maxTranslation = range.maxTranslation?.clone() ?? new Vector2(Infinity, Infinity);\n\n if (!this.isTranslationRangeValid(minTranslation, maxTranslation)) {\n throw new RangeError('Viewport translation range must be ordered and finite or infinite.');\n }\n\n const translationBounds = range.translationBounds?.clone();\n\n if (translationBounds && (translationBounds.isEmpty()\n || !translationBounds.min.toArray().every(Number.isFinite)\n || !translationBounds.max.toArray().every(Number.isFinite))) {\n throw new RangeError('Viewport content bounds must be finite and ordered.');\n }\n this.translationBounds = translationBounds;\n this.minScale = minScale;\n this.maxScale = maxScale;\n this.minTranslation = minTranslation;\n this.maxTranslation = maxTranslation;\n this.clampCurrentViewport();\n }\n\n /** 恢复默认视口范围。 */\n resetViewportRange (): void {\n this.translationBounds = undefined;\n this.minScale = 0.01;\n this.maxScale = 20;\n this.minTranslation = new Vector2(-Infinity, -Infinity);\n this.maxTranslation = new Vector2(Infinity, Infinity);\n this.clampCurrentViewport();\n }\n\n /** 当前视口范围快照。 */\n get viewportRange (): ViewportNavigationRange {\n const bounds = this.translationBounds && this.hasViewport()\n ? getViewportTranslationRange(this.translationBounds, GizmoViewportUtils.getViewScale(this.engine), this.containerSize())\n : undefined;\n\n return {\n minScale: this.minScale,\n maxScale: this.maxScale,\n minTranslation: bounds?.min ?? this.minTranslation.clone(),\n maxTranslation: bounds?.max ?? this.maxTranslation.clone(),\n ...(this.translationBounds ? { translationBounds: this.translationBounds.clone() } : {}),\n };\n }\n\n /**\n * 根据滚轮来源和修饰键执行平移或缩放。\n * @param event 滚轮事件\n * @param _pointerCaptured 指针是否已被捕获\n * @returns 视口是否发生变化\n */\n handleWheel (event: InputEventMouseButton, _pointerCaptured: boolean): boolean {\n if (!this.hasViewport()) {\n return false;\n }\n\n event.accept();\n if (event.buttonMask !== MouseButtonMask.None) {\n return false;\n }\n const delta = this.normalizeWheel(event);\n const mode = this.classifyWheel(event);\n const center = new Vector2(event.position.x, event.position.y);\n\n if (mode === 'zoom') {\n if (delta.y === 0) {\n return false;\n }\n const direction = this.config.invertZoom\n ? -delta.y\n : delta.y;\n const zoomStep = this.config.zoomStep;\n const zoomDelta = clamp(direction * 0.01, -zoomStep, zoomStep);\n\n return this.zoomByFactor(\n 1 + zoomDelta,\n center,\n event.ctrlPressed\n ? 'pinch-zoom'\n : 'wheel-zoom',\n );\n }\n\n if (delta.x === 0 && delta.y === 0) {\n return false;\n }\n\n return this.panByViewDelta(delta, center, 'wheel-pan');\n }\n\n /**\n * 按视图像素增量平移视口。\n * @param delta 视图像素位移\n * @param center 操作中心\n * @param source 操作来源\n * @returns 视口是否发生变化\n */\n panByViewDelta (\n delta: Vector2,\n center: Vector2,\n source: 'hand-pan' | 'wheel-pan',\n ): boolean {\n if (!this.hasViewport() || (delta.x === 0 && delta.y === 0)) {\n return false;\n }\n const containerSize = this.containerSize();\n\n if (containerSize.x <= 0 || containerSize.y <= 0) {\n return false;\n }\n panView(this.engine, viewSizeToNDC(delta, containerSize));\n this.clampCurrentTranslation(containerSize);\n this.emitChange(center, source);\n\n return true;\n }\n\n /**\n * 按倍率缩放视口。\n * @param factor 缩放倍率\n * @param center 缩放中心\n * @param source 操作来源\n * @returns 视口是否发生变化\n */\n zoomByFactor (\n factor: number,\n center: Vector2,\n source: 'wheel-zoom' | 'pinch-zoom',\n ): boolean {\n if (!this.hasViewport() || !Number.isFinite(factor) || factor <= 0) {\n return false;\n }\n const currentScale = GizmoViewportUtils.getViewScale(this.engine);\n const nextScale = clamp(currentScale * factor, this.minScale, this.maxScale);\n\n if (nextScale === currentScale) {\n return false;\n }\n const containerSize = this.containerSize();\n\n if (containerSize.x <= 0 || containerSize.y <= 0) {\n return false;\n }\n zoomView(\n this.engine,\n nextScale - currentScale,\n viewPositionToNDC(center, containerSize),\n );\n this.clampCurrentTranslation(containerSize);\n this.emitChange(center, source);\n\n return true;\n }\n\n /** 释放事件监听器。 */\n dispose (): void {\n for (const listener of this.getListeners('change').slice()) {\n this.off('change', listener);\n }\n }\n\n /**\n * 根据显式配置和修饰键确定导航模式。\n * @param event 滚轮事件\n * @returns 滚轮导航模式\n */\n private classifyWheel (event: InputEventMouseButton): WheelMode {\n // Wheel delta 的数值特征无法稳定区分鼠标和触控板,导航模式只由明确意图决定。\n return event.ctrlPressed\n || event.metaPressed\n || this.config.scrollWheelZoom\n ? 'zoom'\n : 'pan';\n }\n\n /**\n * 将方向型滚轮事件转换为视图位移。\n * @param event 滚轮事件\n * @returns 视图位移\n */\n private normalizeWheel (event: InputEventMouseButton): Vector2 {\n const delta = new Vector2();\n const viewDelta = event.factor * EFFECTS_WHEEL_FACTOR_TO_VIEW_PIXELS;\n\n switch (event.buttonIndex) {\n case MouseButton.WheelUp:\n delta.y = viewDelta;\n\n break;\n case MouseButton.WheelDown:\n delta.y = -viewDelta;\n\n break;\n case MouseButton.WheelLeft:\n delta.x = viewDelta;\n\n break;\n case MouseButton.WheelRight:\n delta.x = -viewDelta;\n\n break;\n }\n\n // Windows 下 Shift + 滚轮映射为水平平移。\n const isApplePlatform = typeof navigator !== 'undefined'\n && /Mac|iPhone|iPad|iPod/.test(navigator.platform);\n\n if (!isApplePlatform && event.shiftPressed && delta.x === 0) {\n delta.x = delta.y;\n delta.y = 0;\n }\n\n return delta;\n }\n\n /**\n * 发出当前视口快照。\n * @param center 操作中心\n * @param source 操作来源\n */\n private emitChange (\n center: Vector2,\n source: ViewportNavigationSource,\n ): void {\n const containerSize = this.containerSize();\n\n this.emit('change', {\n source,\n scale: GizmoViewportUtils.getViewScale(this.engine),\n translation: ndcSizeToViewSize(\n GizmoViewportUtils.getViewportTranslation(this.engine),\n containerSize,\n ),\n center: center.clone(),\n });\n }\n\n /** @returns 当前画布容器尺寸。 */\n private containerSize (): Vector2 {\n return GizmoViewportUtils.getContainerSize(this.engine.canvas.parentElement!);\n }\n\n /** 将当前相机平移收敛到范围内。 */\n private clampCurrentTranslation (containerSize: Vector2): void {\n const current = ndcSizeToViewSize(\n GizmoViewportUtils.getViewportTranslation(this.engine),\n containerSize,\n );\n const bounds = this.translationBounds\n ? getViewportTranslationRange(this.translationBounds, GizmoViewportUtils.getViewScale(this.engine), containerSize)\n : undefined;\n const min = bounds?.min ?? this.minTranslation;\n const max = bounds?.max ?? this.maxTranslation;\n const clamped = new Vector2(\n clamp(current.x, min.x, max.x),\n clamp(current.y, min.y, max.y),\n );\n const correction = clamped.subtract(current);\n\n if (correction.x !== 0 || correction.y !== 0) {\n panView(this.engine, viewSizeToNDC(correction, containerSize));\n }\n }\n\n /** 将当前相机缩放和平移收敛到范围内。 */\n private clampCurrentViewport (): void {\n if (!this.hasViewport()) {\n return;\n }\n const currentScale = GizmoViewportUtils.getViewScale(this.engine);\n const nextScale = clamp(currentScale, this.minScale, this.maxScale);\n\n if (nextScale !== currentScale) {\n zoomView(this.engine, nextScale - currentScale);\n }\n this.clampCurrentTranslation(this.containerSize());\n }\n\n private isTranslationRangeValid (minTranslation: Vector2, maxTranslation: Vector2): boolean {\n return !Number.isNaN(minTranslation.x)\n && !Number.isNaN(minTranslation.y)\n && !Number.isNaN(maxTranslation.x)\n && !Number.isNaN(maxTranslation.y)\n && minTranslation.x <= maxTranslation.x\n && minTranslation.y <= maxTranslation.y;\n }\n\n /** @returns 是否存在可操作的画布容器和相机。 */\n private hasViewport (): boolean {\n return Boolean(\n this.engine.canvas.parentElement\n && this.engine.sceneServer.compositions[0]?.camera,\n );\n }\n\n}\n","import type { VFXItem } from '@galacean/effects';\nimport { Matrix4, type Vector2, Vector3 } from '../math';\nimport { getItemWorldSize } from '../items/item-geometry';\nimport { isFramePlayerItem } from '../items/item-predicates';\n\n/**\n * 调整画板元素(Frame)的尺寸与位置,并同步其子合成 Item 的位移。\n * @param frameItem 画板元素(Frame 空节点控制器)\n * @param worldSize 目标世界尺寸(所属合成坐标系,不受 viewport zoom 影响)\n * @param translation 位移\n * @param initialSize pointer down 时冻结的本地 / 世界尺寸;传入后允许尺寸连续经过 0 并变为负值\n */\nexport function resizeFrameItem (\n frameItem: VFXItem,\n worldSize: Vector2,\n translation: Vector3,\n initialSize?: { localSize: Vector2, worldSize: Vector2 },\n) {\n if (!isFramePlayerItem(frameItem)) {\n console.warn(`Item ${frameItem.getInstanceId()} is not a frame item.`);\n\n return;\n }\n\n // 1. 根据本地尺寸与世界尺寸的比例写回画板尺寸。\n const currentWorldSize = initialSize?.worldSize ?? getItemWorldSize(frameItem);\n const currentLocalSize = initialSize?.localSize ?? frameItem.transform.size;\n const localWidth = currentWorldSize.x === 0\n ? worldSize.x\n : currentLocalSize.x * worldSize.x / currentWorldSize.x;\n const localHeight = currentWorldSize.y === 0\n ? worldSize.y\n : currentLocalSize.y * worldSize.y / currentWorldSize.y;\n\n frameItem.transform.setSize(localWidth, localHeight);\n\n // 2. 将交互位移应用到画板。\n if (translation && (translation.x !== 0 || translation.y !== 0)) {\n const currentPosition = frameItem.transform.position;\n\n frameItem.setPosition(\n currentPosition.x + translation.x,\n currentPosition.y + translation.y,\n currentPosition.z\n );\n }\n\n // 3. 反向补偿子合成元素,保持其世界位置不变。\n const subCompositionItem = frameItem?.children?.[0];\n\n if (subCompositionItem && translation) {\n subCompositionItem.children.forEach(item => {\n const parentMatrix = new Matrix4().copyFrom(item.transform.getParentMatrix() ?? new Matrix4());\n\n parentMatrix.setPosition(new Vector3());\n const result = translation.clone().applyMatrix(parentMatrix.invert()).negate();\n\n item.translate(...result.toArray());\n item.transform.updateLocalMatrix();\n });\n }\n}\n","import type { Control } from '@galacean/effects-plugin-gui';\nimport { type Box2 } from '@galacean/effects-math/es/extension/index';\nimport type { Vector2 } from './math';\nimport { Color, Matrix3, Vector3, getBoxCorners } from './math';\n\n/** 信息标签默认字号。 */\nexport const INFO_TEXT_FONT_SIZE = 14;\n/** 信息标签默认字体。 */\nexport const INFO_TEXT_FONT_FAMILY = 'sans-serif';\n\n/** effects Control 字符 atlas 的固定单边留白。 */\nexport const CONTROL_TEXT_GLYPH_PADDING = 4;\n/** 用于测量字体高度的代表字符。 */\nexport const METRICS_STRING = '|ÉqÅ';\n/** 用于测量字体基线的字符。 */\nexport const BASELINE_SYMBOL = 'M';\n\n/**\n * 颜色缓存:`hex_alpha` → effects Color。键到颜色映射不可变,全局缓存无需清理。\n */\nconst colorCache = new Map<string, Color>();\n\n/**\n * 将十六进制色值 + alpha 转为 effects Color(带全局缓存)。\n * @param hex 0xRRGGBB 颜色\n * @param alpha 透明度 0..1\n * @returns effects Color\n */\nexport function toColor (hex: number, alpha = 1): Color {\n const key = `${hex}_${alpha}`;\n const cached = colorCache.get(key);\n\n if (cached) {\n return cached;\n }\n const color = new Color(\n ((hex >> 16) & 0xff) / 255,\n ((hex >> 8) & 0xff) / 255,\n (hex & 0xff) / 255,\n alpha,\n );\n\n colorCache.set(key, color);\n\n return color;\n}\n\n/**\n * 离屏文本测量上下文,懒加载并复用。\n */\nlet _measureCtx: CanvasRenderingContext2D | null = null;\n\n/** 文本宽度和可见字形边界。 */\nexport type MeasuredTextMetrics = {\n /** 文本宽度。 */\n width: number,\n /** 基线到可见字形顶部的距离。 */\n actualBoundingBoxAscent: number,\n /** 基线到可见字形底部的距离。 */\n actualBoundingBoxDescent: number,\n};\n\n/**\n * 测量文本的宽度与可见字形边界。\n * @param text 文本内容\n * @param fontSize 字号\n * @param fontFamily 字体\n * @param fontWeight 字重\n * @param fontStyle 字体样式\n * @returns 文本测量结果\n */\nexport function measureTextMetrics (\n text: string,\n fontSize = INFO_TEXT_FONT_SIZE,\n fontFamily = INFO_TEXT_FONT_FAMILY,\n fontWeight?: string,\n fontStyle?: string,\n): MeasuredTextMetrics {\n _measureCtx ??= document.createElement('canvas').getContext('2d');\n if (!_measureCtx) {\n return { width: 0, actualBoundingBoxAscent: 0, actualBoundingBoxDescent: 0 };\n }\n _measureCtx.font = `${fontStyle ? `${fontStyle} ` : ''}${fontWeight ? `${fontWeight} ` : ''}${fontSize}px ${fontFamily}`;\n const metrics = _measureCtx.measureText(text);\n\n return {\n width: metrics.width,\n actualBoundingBoxAscent: metrics.actualBoundingBoxAscent ?? 0,\n actualBoundingBoxDescent: metrics.actualBoundingBoxDescent ?? 0,\n };\n}\n\n/**\n * 计算 effects Control.drawText 实际使用的 atlas cell 高度。\n * @param fontSize 字号\n * @param fontFamily 字体\n * @param fontWeight 字重\n * @param fontStyle 字体样式\n * @param resolution 渲染分辨率\n * @returns 字符图集单元格高度\n */\nexport function measureControlTextCellHeight (\n fontSize = INFO_TEXT_FONT_SIZE,\n fontFamily = INFO_TEXT_FONT_FAMILY,\n fontWeight?: string,\n fontStyle?: string,\n resolution = 1,\n): number {\n const safeResolution = Number.isFinite(resolution) && resolution > 0 ? resolution : 1;\n const scaledFontSize = fontSize * safeResolution;\n const metrics = measureTextMetrics(\n METRICS_STRING + BASELINE_SYMBOL,\n scaledFontSize,\n fontFamily,\n fontWeight,\n fontStyle,\n );\n const ascent = metrics.actualBoundingBoxAscent || scaledFontSize * 0.8;\n const descent = metrics.actualBoundingBoxDescent || scaledFontSize * 0.2;\n\n return Math.ceil(ascent + descent + CONTROL_TEXT_GLYPH_PADDING * 2 * safeResolution) / safeResolution;\n}\n\n/**\n * 测量文本宽度(逻辑像素),用于信息标签的溢出判断与右对齐定位。\n * @param text 文本内容\n * @param fontSize 字号\n * @param fontFamily 字体\n * @param fontWeight 字重\n * @returns 文本宽度\n */\nexport function measureTextWidth (\n text: string,\n fontSize = INFO_TEXT_FONT_SIZE,\n fontFamily = INFO_TEXT_FONT_FAMILY,\n fontWeight?: string,\n): number {\n return measureTextMetrics(text, fontSize, fontFamily, fontWeight).width;\n}\n\n/**\n * 单行文本截断:逐字符累加,超出可用宽度时把最后两个字符替换为省略号。\n * @param text 文本内容\n * @param maxWidth 可用宽度\n * @param fontSize 字号\n * @param fontFamily 字体\n * @returns 截断后的文本\n */\nexport function truncateText (text: string, maxWidth: number, fontSize = INFO_TEXT_FONT_SIZE, fontFamily = INFO_TEXT_FONT_FAMILY): string {\n if (measureTextWidth(text, fontSize, fontFamily) <= maxWidth) {\n return text;\n }\n let current = '';\n\n for (const char of text) {\n if (measureTextWidth(current + char, fontSize, fontFamily) > maxWidth) {\n return current.length > 2 ? current.slice(0, -2) + '...' : '...';\n }\n current += char;\n }\n\n return current;\n}\n\n/**\n * 多行逐字符折行:行宽超出 maxWidth 时换行;行数达到 maxLines 时末行用省略号收尾。\n * @param text 文本内容\n * @param maxWidth 单行可用宽度\n * @param maxLines 最大行数\n * @param fontSize 字号\n * @param fontFamily 字体\n * @returns 折行后的文本行数组\n */\nexport function wrapText (text: string, maxWidth: number, maxLines: number, fontSize = INFO_TEXT_FONT_SIZE, fontFamily = INFO_TEXT_FONT_FAMILY): string[] {\n const lines: string[] = [];\n let currentLine = '';\n const chars = text.split('');\n\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i];\n const testLine = currentLine + char;\n\n if (measureTextWidth(testLine, fontSize, fontFamily) > maxWidth) {\n lines.push(currentLine);\n\n if (lines.length >= maxLines) {\n const lastLine = lines[maxLines - 1];\n\n lines[maxLines - 1] = lastLine.length > 2 ? lastLine.slice(0, -2) + '...' : '...';\n\n break;\n }\n\n currentLine = char;\n } else {\n currentLine = testLine;\n }\n\n if (i === chars.length - 1 && currentLine) {\n lines.push(currentLine);\n }\n }\n\n return lines.slice(0, maxLines);\n}\n\n/**\n * 绘制由 4 个角点构成的(可能非正交的)包围盒边框。\n * @param control 绘制控制器\n * @param corners 4 个角点(视图坐标,Y 向下)\n * @param color 边框颜色\n * @param width 线宽\n */\nexport function drawCorners (control: Control, corners: Vector2[], color: Color, width: number): void {\n if (corners.length < 4) {\n return;\n }\n for (let i = 0; i < 4; i++) {\n const start = corners[i];\n const end = corners[(i + 1) % 4];\n\n control.drawLine(start.x, start.y, end.x, end.y, color, width);\n }\n}\n\n/**\n * 绘制虚线包围盒,并在相邻边之间保持连续虚线相位。\n * @param control 绘制控制器\n * @param corners 四个视图角点\n * @param color 虚线颜色\n * @param width 线宽\n * @param dashLength 实线段长度\n * @param gapLength 间隔长度\n */\nexport function drawDashedCorners (\n control: Control,\n corners: Vector2[],\n color: Color,\n width: number,\n dashLength: number,\n gapLength: number,\n): void {\n // 1. 校验角点和虚线参数。\n if (corners.length < 4 || dashLength <= 0 || gapLength < 0) {\n return;\n }\n\n const patternLength = dashLength + gapLength;\n let perimeterOffset = 0;\n\n // 2. 逐边计算虚线相位,并继承上一条边的周长偏移。\n for (let i = 0; i < 4; i++) {\n const start = corners[i];\n const end = corners[(i + 1) % 4];\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const edgeLength = Math.hypot(dx, dy);\n\n if (edgeLength <= Number.EPSILON) {\n continue;\n }\n\n let edgeOffset = 0;\n\n while (edgeOffset < edgeLength) {\n const patternOffset = perimeterOffset % patternLength;\n const drawingDash = gapLength === 0 || patternOffset < dashLength;\n const phaseRemaining = drawingDash\n ? dashLength - patternOffset\n : patternLength - patternOffset;\n const segmentLength = Math.min(phaseRemaining, edgeLength - edgeOffset);\n\n // 3. 仅绘制当前相位中的实线段。\n if (drawingDash && segmentLength > Number.EPSILON) {\n const startRatio = edgeOffset / edgeLength;\n const endRatio = (edgeOffset + segmentLength) / edgeLength;\n\n control.drawLine(\n start.x + dx * startRatio,\n start.y + dy * startRatio,\n start.x + dx * endRatio,\n start.y + dy * endRatio,\n color,\n width,\n );\n }\n\n edgeOffset += segmentLength;\n perimeterOffset += segmentLength;\n }\n }\n}\n\n/**\n * 绘制包围盒边框(沿 4 个角点连边)。\n * @param control 绘制控制器\n * @param box 包围盒(视图坐标,Y 向下)\n * @param color 边框颜色\n * @param width 线宽\n */\nexport function drawBox (control: Control, box: Box2, color: Color, width: number): void {\n if (box.isEmpty()) {\n return;\n }\n drawCorners(control, getBoxCorners(box), color, width);\n}\n\n/**\n * 填充轴对齐包围盒(实心矩形)。\n * @param control 绘制控制器\n * @param box 包围盒(视图坐标,Y 向下)\n * @param color 填充颜色\n */\nexport function fillBox (control: Control, box: Box2, color: Color): void {\n if (box.isEmpty()) {\n return;\n }\n const size = box.getSize();\n\n control.fillRect(box.min.x, box.min.y, size.x, size.y, color);\n}\n\n/**\n * 用两个三角形填充 Box2 四角区域。\n * @param control 绘制控件\n * @param corners Box2 四角快照\n * @param color 填充颜色\n */\nexport function fillBoxByCorners (control: Control, corners: Vector2[], color: Color): void {\n if (corners.length !== 4) {\n return;\n }\n const [a, b, c, d] = corners;\n\n control.fillTriangle(a.x, a.y, b.x, b.y, c.x, c.y, color);\n control.fillTriangle(a.x, a.y, c.x, c.y, d.x, d.y, color);\n}\n\n/**\n * 构造沿局部轴展开的旋转矩形角点。\n * @param center 矩形中心(视图坐标)\n * @param xAxis 局部 X 轴单位向量(视图坐标,宽方向)\n * @param yAxis 局部 Y 轴单位向量(视图坐标,高方向)\n * @param halfWidth 半宽(沿 xAxis,视图像素)\n * @param halfHeight 半高(沿 yAxis,视图像素)\n * @returns 4 个角点(视图坐标,环绕顺序)\n */\nexport function getRotatedBoxCorners (\n center: Vector2,\n xAxis: Vector2,\n yAxis: Vector2,\n halfWidth: number,\n halfHeight: number,\n): Vector2[] {\n const halfW = xAxis.clone().multiply(halfWidth);\n const halfH = yAxis.clone().multiply(halfHeight);\n\n return [\n center.clone().subtract(halfW).subtract(halfH),\n center.clone().add(halfW).subtract(halfH),\n center.clone().add(halfW).add(halfH),\n center.clone().subtract(halfW).add(halfH),\n ];\n}\n\n/**\n * 填充沿局部轴展开的旋转矩形。\n * @param control 绘制控制器\n * @param center 矩形中心(视图坐标)\n * @param xAxis 局部 X 轴单位向量(视图坐标,宽方向)\n * @param yAxis 局部 Y 轴单位向量(视图坐标,高方向)\n * @param width 宽(沿 xAxis,视图像素)\n * @param height 高(沿 yAxis,视图像素)\n * @param color 填充颜色\n */\nexport function fillRotatedRect (\n control: Control,\n center: Vector2,\n xAxis: Vector2,\n yAxis: Vector2,\n width: number,\n height: number,\n color: Color,\n): void {\n const ex = xAxis.clone();\n const ey = yAxis.clone();\n const anchor = center.clone();\n\n drawWithBoxTransform(control, anchor, ex, ey, () => {\n control.fillRect(-width / 2, -height / 2, width, height, color);\n });\n}\n\n/**\n * 在由锚点和两个基向量定义的局部坐标系内执行绘制。\n * @param control 绘制控制器\n * @param anchor Control 绘制空间锚点(局部原点)\n * @param ex 局部 X 轴基向量(单位向量)\n * @param ey 局部 Y 轴基向量(单位向量)\n * @param drawFn 在局部坐标系内执行的绘制\n */\nexport function drawWithBoxTransform (control: Control, anchor: Vector2, ex: Vector2, ey: Vector2, drawFn: () => void): void {\n const graphics = control.engine.renderingServer.graphics;\n // 列优先:第一列 = ex,第二列 = ey,第三列 = anchor(平移)\n const matrix = Matrix3.fromColumnVectors(\n new Vector3(ex.x, ex.y, 0),\n new Vector3(ey.x, ey.y, 0),\n new Vector3(anchor.x, anchor.y, 1),\n );\n\n graphics.pushTransform(matrix);\n drawFn();\n graphics.popTransform();\n}\n","import type { Matrix4 } from '../../math';\nimport { Vector3, isEqual } from '../../math';\n\n/** 一次锚定缩放在 pointer down 时冻结的几何。 */\nexport type AnchoredResizeGeometry = {\n /** 初始被拖手柄位置(世界坐标)。 */\n initialHandle: Vector3,\n /** 始终保持不动的对边中点或对角点(世界坐标)。 */\n fixedPoint: Vector3,\n /** 属性变化实际围绕的原点(transform scale 用 anchor,内容 size 用几何中心)。 */\n resizeOrigin: Vector3,\n /** 世界向量到元素局部缩放轴的旋转矩阵(无平移)。 */\n worldToLocalRotation: Matrix4,\n};\n\n/** 锚定缩放约束。 */\nexport type AnchoredResizeOptions = {\n /** 边只控制一个轴;角点同时控制两个轴。 */\n handleKind: 'edge' | 'corner',\n /** 是否锁定宽高比。 */\n lockAspectRatio: boolean,\n /** 强制保持不变的局部缩放轴。 */\n lockedAxis?: 'x' | 'y',\n};\n\n/** 锚定缩放的绝对变换结果。 */\nexport type AnchoredResizeResult = {\n /** 相对 pointer down 快照的总缩放,而非相对上一帧的增量。 */\n totalScalar: Vector3,\n /** 相对 pointer down 快照的总世界位移。 */\n totalTranslation: Vector3,\n};\n\n/**\n * 由初始快照计算当前边或角点缩放的绝对结果。\n *\n * 当前指针决定“固定点 → 手柄”的有符号比例;属性绕其真实 resizeOrigin 变化,\n * 再反算位移使 fixedPoint 回到原坐标。\n * @param geometry 交互开始时冻结的几何\n * @param pointer 当前指针世界坐标\n * @param options 手柄类型和比例约束\n * @returns 相对交互起点的绝对缩放和位移\n */\nexport function calculateAnchoredResize (\n geometry: AnchoredResizeGeometry,\n pointer: Vector3,\n options: AnchoredResizeOptions,\n): AnchoredResizeResult {\n // 1. 将初始手柄和当前指针转换到元素局部缩放轴。\n const { initialHandle, fixedPoint, resizeOrigin, worldToLocalRotation } = geometry;\n const { handleKind, lockAspectRatio, lockedAxis } = options;\n const initialVector = new Vector3().subtractVectors(initialHandle, fixedPoint).applyMatrix(worldToLocalRotation);\n const pointerVector = new Vector3().subtractVectors(pointer, fixedPoint).applyMatrix(worldToLocalRotation);\n let totalScalar: Vector3;\n\n // 2. 根据边或角点计算各轴总缩放量。\n if (handleKind === 'edge') {\n const axisIndex: 0 | 1 = Math.abs(initialVector.x) >= Math.abs(initialVector.y) ? 0 : 1;\n const initialLength = initialVector.toArray()[axisIndex];\n const pointerLength = pointerVector.toArray()[axisIndex];\n const primaryScalar = isEqual(initialLength, 0)\n ? 1\n : pointerLength / initialLength;\n\n totalScalar = lockAspectRatio\n ? axisIndex === 0\n ? new Vector3(primaryScalar, Math.abs(primaryScalar), Math.abs(primaryScalar))\n : new Vector3(Math.abs(primaryScalar), primaryScalar, Math.abs(primaryScalar))\n : axisIndex === 0\n ? new Vector3(primaryScalar, 1, 1)\n : new Vector3(1, primaryScalar, 1);\n } else {\n const scaleX = isEqual(initialVector.x, 0) ? 1 : pointerVector.x / initialVector.x;\n const scaleY = isEqual(initialVector.y, 0) ? 1 : pointerVector.y / initialVector.y;\n\n totalScalar = new Vector3(scaleX, scaleY, 1);\n if (lockAspectRatio) {\n if (Math.abs(scaleX) > Math.abs(scaleY)) {\n totalScalar.y = Math.abs(scaleX) * (scaleY < 0 ? -1 : 1);\n } else {\n totalScalar.x = Math.abs(scaleY) * (scaleX < 0 ? -1 : 1);\n }\n totalScalar.z = Math.max(Math.abs(totalScalar.x), Math.abs(totalScalar.y));\n }\n }\n\n if (lockedAxis === 'x') {\n totalScalar.x = 1;\n } else if (lockedAxis === 'y') {\n totalScalar.y = 1;\n }\n\n // 3. 反算固定点缩放后的偏移,得到位置补偿量。\n const fixedOffsetLocal = new Vector3()\n .subtractVectors(fixedPoint, resizeOrigin)\n .applyMatrix(worldToLocalRotation)\n .multiply(totalScalar);\n const scaledFixedPoint = resizeOrigin.clone().add(\n fixedOffsetLocal.applyMatrix(worldToLocalRotation.clone().invert()),\n );\n\n return {\n totalScalar,\n totalTranslation: fixedPoint.clone().subtract(scaledFixedPoint),\n };\n}\n","import {\n MouseButton,\n MouseButtonMask,\n type InputEventMouseButton,\n type InputEventMouseMotion,\n type VFXItem,\n} from '@galacean/effects';\nimport { GestureCursorType, type GestureCursorResult } from '../cursor';\nimport { Gizmo } from '../gizmo';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport { GizmoType } from '../gizmo-type';\nimport { decomposeItemTransform } from '../items';\nimport { DEG2RAD, RAD2DEG, Vector2, Vector3, getAngleByVectors, getTransformedBoxCorners, getVector2Angle } from '../math';\nimport { roundNumber } from '@galacean/effects-math/es/extension/index';\nimport type {\n ResizeSelectionGizmo } from './resize-selection-gizmo';\nimport {\n SCALE_CORNER_HIT_SIZE,\n TransformType,\n} from './resize-selection-gizmo';\n\n/** 角旋转命中结果。 */\ntype RotationHit = {\n /** 命中角点相对选框中心的方向。 */\n direction: Vector2,\n};\n\n/** Shift 旋转吸附的角度步长。 */\nconst SHIFT_ROTATION_STEP_DEGREES = 15;\n\n/** 通过选框角点命中区域旋转选中对象。 */\nexport class CornerRotationGizmo extends Gizmo {\n readonly type: GizmoType = GizmoType.CORNER_ROTATION;\n\n cursorResult: GestureCursorResult = {\n type: GestureCursorType.NORMAL,\n angle: 0,\n };\n\n /** 当前指针的视图坐标;拖拽期间按 Control 本地坐标增量推进。 */\n cursorPoint: Vector2 = new Vector2();\n\n /** 上一帧指针的 Control 本地坐标。 */\n lastPoint: Vector2 = new Vector2();\n\n /** 单次旋转会话累计的 z 轴角度,用于保持旋转光标朝向连续。 */\n rotationAngle = 0;\n\n private rotationActive = false;\n private anchor = new Vector2();\n private interactiveDirection = new Vector2();\n /** 未吸附的累计拖拽角,独立于已应用角度,避免逐帧取整丢失小幅移动。 */\n private rawRotationAngle = 0;\n /** pointer down 时选区节点的公共世界角度,用于吸附最终朝向而非单次拖拽增量。 */\n private initialSelectionAngle = 0;\n /** pointer down 时冻结的旋转对象,避免拖拽中途换目标。 */\n private rotationItems: VFXItem[] = [];\n\n /**\n * 创建共享选框几何的角旋转交互。\n * @param owner Gizmo 宿主。\n * @param resizeSelection 提供选框几何的缩放 Gizmo。\n */\n constructor (\n owner: GizmoOwner,\n private readonly resizeSelection: ResizeSelectionGizmo,\n ) {\n super(owner);\n }\n\n /** 当前选中的对象。 */\n get selectedItems (): VFXItem[] {\n return this._owner.getSelection().getSelectedPlayerItems();\n }\n\n /**\n * 更新角旋转悬停或正在进行的旋转。\n * @param event 鼠标移动事件。\n */\n override onMouseMove (event: InputEventMouseMotion): void {\n if (this.rotationActive) {\n const handled = this.updateRotationDrag(event);\n\n this._owner.setCursor(this.cursorResult);\n if (handled) {\n event.accept();\n }\n\n return;\n }\n\n if (!this.isApplicableSelection()) {\n this.clearHover();\n\n return;\n }\n\n const hit = this.refreshHover(this._owner.getMousePosition());\n\n if (event.buttonMask === MouseButtonMask.None && hit) {\n event.accept();\n }\n }\n\n /**\n * 继续当前角旋转交互。\n * @param event 鼠标拖拽事件。\n */\n override onMouseDrag (event: InputEventMouseMotion): void {\n if (!this.rotationActive) {\n return;\n }\n const handled = this.updateRotationDrag(event);\n\n this._owner.setCursor(this.cursorResult);\n if (handled) {\n event.accept();\n }\n }\n\n /**\n * 在角旋转命中区域按下主键时开始旋转。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n if (!this.isApplicableSelection() || event.buttonIndex !== MouseButton.Left || event.doubleClick) {\n return;\n }\n\n this.resizeSelection.refreshWireframeBySelectedItems();\n const point = new Vector2(event.position.x, event.position.y);\n const hit = this.refreshHover(point);\n\n if (!hit) {\n return;\n }\n\n this.cursorPoint.copyFrom(point);\n this.lastPoint.copyFrom(event.position);\n this.rotationAngle = 0;\n this.rawRotationAngle = 0;\n this.anchor.copyFrom(this.resizeSelection.wireframe.anchor);\n this.interactiveDirection.copyFrom(hit.direction);\n // Selection 保证父子节点不会同时入选,交互层直接冻结权威选区。\n this.rotationItems = [...this.selectedItems];\n this.initialSelectionAngle = this.resolveInitialSelectionAngle();\n this.rotationActive = true;\n this._owner.emit('actionstart', {\n source: this,\n transformType: TransformType.ROTATION,\n itemIds: this.rotationItems.map(item => item.getInstanceId()),\n });\n event.accept();\n }\n\n /**\n * 结束旋转并提交结果。\n * @param event 鼠标抬起事件。\n */\n override onMouseUp (event: InputEventMouseButton): void {\n if (!this.rotationActive) {\n return;\n }\n\n const currentPoint = new Vector2(event.position.x, event.position.y);\n\n this.cursorPoint.add(new Vector2().subtractVectors(currentPoint, this.lastPoint));\n this.resetOperation();\n this._owner.emit('actioncommit', {\n source: this,\n transformType: TransformType.ROTATION,\n });\n\n this.resizeSelection.refreshWireframeBySelectedItems();\n this.refreshHover(this._owner.getMousePosition());\n event.accept();\n }\n\n /** 清除离开视口后的旋转悬停状态。 */\n override onMouseLeave (): void {\n if (this.rotationActive) {\n this._owner.setCursor(this.cursorResult);\n\n return;\n }\n this.clearHover();\n }\n\n /** @returns 当前选区是否支持旋转。 */\n private isApplicableSelection (): boolean {\n const selectedItems = this.selectedItems;\n const loadingManager = this._owner.getLoadingManager();\n\n return selectedItems.length >= 1\n && selectedItems.every(item => loadingManager.get(item.getInstanceId()) === undefined);\n }\n\n /**\n * 根据指针增量更新累计旋转角度。\n * @param event 鼠标拖拽事件。\n * @returns 是否处理了旋转。\n */\n private updateRotationDrag (event: InputEventMouseMotion): boolean {\n if (!this.rotationActive) {\n return false;\n }\n\n const currentPoint = new Vector2(event.position.x, event.position.y);\n const shift = new Vector2().subtractVectors(currentPoint, this.lastPoint);\n\n // 键盘事件会在捕获期间重放当前位置的 Drag;即使指针位移为 0,也要重新应用当前约束。\n if (!this.resizeSelection.wireframe.interactive) {\n return true;\n }\n\n if (shift.length() > 0) {\n this._owner.setSelectionTransformKind('resize');\n const vecStart = new Vector2().subtractVectors(this.cursorPoint, this.anchor);\n\n this.cursorPoint.add(shift);\n const vecCurrent = new Vector2().subtractVectors(this.cursorPoint, this.anchor);\n const angle = getAngleByVectors(vecStart, vecCurrent) * RAD2DEG;\n\n if (Number.isFinite(angle)) {\n this.rawRotationAngle += angle;\n }\n this.lastPoint.copyFrom(currentPoint);\n }\n\n this.applyRotation(event);\n\n return true;\n }\n\n /**\n * 应用累计旋转角,并在 Shift 按下时吸附角度。\n * @param event 鼠标拖拽事件。\n */\n private applyRotation (event: InputEventMouseMotion): void {\n const targetAngle = roundNumber(\n event.shiftPressed\n ? Math.round(\n (this.initialSelectionAngle + this.rawRotationAngle)\n / SHIFT_ROTATION_STEP_DEGREES,\n ) * SHIFT_ROTATION_STEP_DEGREES - this.initialSelectionAngle\n : this.rawRotationAngle,\n 3,\n );\n const angle = roundNumber(targetAngle - this.rotationAngle, 3);\n\n this.setRotationCursor(\n getVector2Angle(this.interactiveDirection) + targetAngle * DEG2RAD,\n );\n if (angle === 0) {\n return;\n }\n\n this._owner.setSelectionTransformKind('resize');\n const rotation = new Vector3(0, 0, angle);\n\n this.rotationItems.forEach(item => {\n item.rotate(...rotation.toArray());\n });\n this.rotationAngle = targetAngle;\n this._owner.emit('actionupdate', {\n source: this,\n transformType: TransformType.ROTATION,\n });\n }\n\n /** 重置旋转交互状态。 */\n private resetOperation (): void {\n if (this._owner.getSelectionTransformKind() === 'resize') {\n this._owner.setSelectionTransformKind('idle');\n }\n this.rotationActive = false;\n this.rotationAngle = 0;\n this.lastPoint.set(0, 0);\n this.cursorPoint.set(0, 0);\n this.anchor.set(0, 0);\n this.interactiveDirection.set(0, 0);\n this.rawRotationAngle = 0;\n this.initialSelectionAngle = 0;\n this.rotationItems = [];\n }\n\n /**\n * 查找指针命中的角旋转区域。\n * @param point 指针视口坐标。\n * @returns 角旋转命中结果。\n */\n private findRotationHit (point: Vector2): RotationHit | undefined {\n // 步骤 1:校验选框是否可交互且指针位于总命中区域内。\n const { wireframe } = this.resizeSelection;\n\n if (\n !wireframe.interactive\n || !wireframe.totalBox.containsPoint(point)\n || !wireframe.scaleCorners.length\n ) {\n return undefined;\n }\n\n // 步骤 2:建立选框局部坐标轴和命中尺寸。\n const { xAxis, yAxis } = this.boxLocalAxes();\n const boxCenter = wireframe.box.getCenter();\n const rotationHalfSize = this.resizeSelection.config.rotationCircleSize;\n const scaleHalfSize = SCALE_CORNER_HIT_SIZE / 2;\n\n // 步骤 3:逐角点排除缩放区并检测外侧旋转区。\n for (const corner of wireframe.scaleCorners) {\n const cornerOffset = new Vector2().subtractVectors(point, corner.center);\n const insideScaleCorner = Math.abs(cornerOffset.dot(xAxis)) <= scaleHalfSize\n && Math.abs(cornerOffset.dot(yAxis)) <= scaleHalfSize;\n\n if (insideScaleCorner) {\n continue;\n }\n\n const direction = new Vector2().subtractVectors(corner.center, boxCenter);\n const xSign = direction.dot(xAxis) >= 0 ? 1 : -1;\n const ySign = direction.dot(yAxis) >= 0 ? 1 : -1;\n const hitCenter = corner.center.clone()\n .add(xAxis.clone().multiply(xSign * rotationHalfSize))\n .add(yAxis.clone().multiply(ySign * rotationHalfSize));\n const hitOffset = new Vector2().subtractVectors(point, hitCenter);\n\n if (\n Math.abs(hitOffset.dot(xAxis)) <= rotationHalfSize\n && Math.abs(hitOffset.dot(yAxis)) <= rotationHalfSize\n ) {\n return { direction };\n }\n }\n\n return undefined;\n }\n\n /** @returns 选框在视口中的局部坐标轴。 */\n private boxLocalAxes (): { xAxis: Vector2, yAxis: Vector2 } {\n const transform = this.resizeSelection.wireframe.transform;\n const points = transform ? getTransformedBoxCorners(transform) : undefined;\n\n if (!points?.length) {\n return { xAxis: new Vector2(1, 0), yAxis: new Vector2(0, 1) };\n }\n const xVector = new Vector2().subtractVectors(points[1], points[0]);\n const yVector = new Vector2().subtractVectors(points[3], points[0]);\n\n return {\n xAxis: xVector.length() > 0 ? xVector.normalize() : new Vector2(1, 0),\n yAxis: yVector.length() > 0 ? yVector.normalize() : new Vector2(0, 1),\n };\n }\n\n /**\n * 获取 Shift 吸附使用的初始绝对角度。\n * 角度来自节点变换,不从选框或子元素包围盒反推;\n * 多选节点没有公共角度时使用 0°。\n * @returns 当前选区在视图平面内的初始角度(度)。\n */\n private resolveInitialSelectionAngle (): number {\n if (this.rotationItems.length === 0) {\n return 0;\n }\n\n const angles = this.rotationItems.map(item => (\n roundNumber(decomposeItemTransform(item).rotation.z, 3)\n ));\n const sharedAngle = angles[0];\n\n return Number.isFinite(sharedAngle) && angles.every(angle => angle === sharedAngle)\n ? sharedAngle\n : 0;\n }\n\n /**\n * 刷新指定位置的旋转悬停状态。\n * @param point 指针视口坐标。\n * @returns 角旋转命中结果。\n */\n private refreshHover (point: Vector2): RotationHit | undefined {\n const hit = this.findRotationHit(point);\n\n if (!hit) {\n this.clearHover();\n\n return undefined;\n }\n\n this.interactiveDirection.copyFrom(hit.direction);\n this.setRotationCursor(getVector2Angle(hit.direction));\n\n return hit;\n }\n\n /**\n * 更新旋转光标。\n * @param angle 旋转方向的弧度值。\n */\n private setRotationCursor (angle: number): void {\n this.cursorResult = {\n type: GestureCursorType.ROTATION,\n angle: (angle + Math.PI / 4) * RAD2DEG,\n };\n this._owner.setCursor(this.cursorResult);\n }\n\n /** 清除旋转悬停状态。 */\n private clearHover (): void {\n this.interactiveDirection.set(0, 0);\n this.cursorResult = {\n type: GestureCursorType.NORMAL,\n angle: 0,\n };\n this._owner.setCursor(this.cursorResult);\n }\n}\n","import { MouseButton, type InputEventMouseButton } from '@galacean/effects';\nimport { Gizmo } from '../gizmo';\nimport { Vector2 } from '../math';\n\n/** 点击当前动效范围外的画布空白区域时退出动效编辑。 */\nexport class LeaveEffectsEditGizmo extends Gizmo {\n readonly type = 'leave-effects-edit';\n\n /**\n * 在动效范围外的空白区域按下主键时退出编辑模式。\n * @param event 鼠标按下事件\n */\n override onMouseDown (event: InputEventMouseButton): void {\n if (event.buttonIndex !== MouseButton.Left) {\n return;\n }\n\n const point = new Vector2(event.position.x, event.position.y);\n const selection = this._owner.getSelection();\n\n if (selection.hitTest(point).length > 0 || selection.isPointInEffectsEditScope(point)) {\n return;\n }\n\n this._owner.resetEditMode();\n event.accept();\n }\n}\n","import {\n MouseButton,\n spec,\n type InputEventMouseButton,\n type InputEventMouseMotion,\n type VFXItem,\n} from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport { GizmoViewportUtils } from '../viewport/viewport-utils';\nimport { Gizmo } from '../gizmo';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport { Box2 } from '@galacean/effects-math/es/extension/index';\nimport { Vector2, getTransformedBoxCorners, transformedBoxIntersectsBox } from '../math';\nimport { drawBox, fillBox, toColor } from '../drawing';\nimport { getFramePlayerItemAncestors, getItemViewTransform, isFramePlayerItem, isPlayerItemVisible } from '../items';\nimport type { SelectionPreviewConfig } from '../configs/types';\nimport { selectionPreviewConfig } from '../configs/builtin-configs';\n\n/** 框选区域的绘制状态。 */\ntype SelectionOverlay = {\n /** 当前绘制内容。 */\n type: 'none' | 'region',\n /** 框选区域。 */\n box: Box2,\n};\n\n/** 通过拖拽矩形更新选区并绘制框选区域。 */\nexport class BoxSelectionGizmo extends Gizmo {\n readonly type = 'box-selection';\n private readonly overlay: SelectionOverlay = { type: 'none', box: new Box2() };\n private readonly cursorPoint = new Vector2();\n private readonly startPoint = new Vector2();\n private isBoxSelecting = false;\n private mouseGrabbed = false;\n\n /**\n * 创建框选交互。\n * @param owner Gizmo 宿主。\n * @param deferToHitTarget 命中已有对象时是否将交互让给其他候选。\n */\n constructor (\n owner: GizmoOwner,\n private readonly deferToHitTarget = true,\n ) {\n super(owner);\n }\n\n /** 框选预览配置。 */\n get config (): Readonly<SelectionPreviewConfig> {\n return this._owner.getConfigManager().get(selectionPreviewConfig);\n }\n\n /** 当前选区。 */\n private get selection () {\n return this._owner.getSelection();\n }\n\n /**\n * 忽略尚未进入拖拽阶段的移动事件。\n * @param _event 鼠标移动事件。\n */\n override onMouseMove (_event: InputEventMouseMotion): void {\n // 框选仅在拖拽阶段更新。\n }\n\n /**\n * 更新已开始的框选交互。\n * @param event 鼠标拖拽事件。\n */\n override onMouseDrag (event: InputEventMouseMotion): void {\n if (!this.mouseGrabbed) {\n return;\n }\n if (this.isBoxSelecting) {\n this.updateGrab(event);\n } else {\n event.accept();\n }\n }\n\n /**\n * 在空白区域按下主键时开始框选。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n if (event.buttonIndex !== MouseButton.Left) {\n return;\n }\n\n const regionIds = this.selection.filterSelectedItems(\n this.selection.hitTest(new Vector2(event.position.x, event.position.y)),\n );\n\n if (this.deferToHitTarget && regionIds.length > 0) {\n return;\n }\n\n if (!event.shiftPressed) {\n this.selection.commitSelectedItems([]);\n }\n this.startPoint.copyFrom(event.position);\n this.cursorPoint.set(event.position.x, event.position.y);\n this.isBoxSelecting = true;\n\n this.mouseGrabbed = true;\n this._owner.emit('actionstart', {\n source: this,\n selectedIds: [...this.selection.getSelectedIds()],\n });\n event.accept();\n }\n\n /**\n * 结束框选并提交选择变更。\n * @param event 鼠标抬起事件。\n */\n override onMouseUp (event: InputEventMouseButton): void {\n if (!this.mouseGrabbed) {\n return;\n }\n const wasBoxSelecting = this.isBoxSelecting;\n\n this.mouseGrabbed = false;\n this.isBoxSelecting = false;\n this.overlay.type = 'none';\n\n this.emitMouseUpIfChanged(wasBoxSelecting);\n event.accept();\n }\n\n /**\n * 绘制当前框选区域。\n * @param control 绘制控制器。\n */\n override draw (control: Control): void {\n const config = this.config;\n\n if (this.isBoxSelecting && this.overlay.type === 'region' && !this.overlay.box.isEmpty()) {\n drawBox(control, this.overlay.box, toColor(config.regionWireframeColor, config.regionWireframeAlpha), config.regionWireframeWidth);\n fillBox(control, this.overlay.box, toColor(config.regionBoxColor, config.regionBoxAlpha));\n }\n }\n\n /**\n * 根据当前指针更新框选区域与候选选区。\n * @param event 鼠标拖拽事件。\n */\n private updateGrab (event: InputEventMouseMotion): void {\n if (!this.isBoxSelecting) {\n return;\n }\n\n // 步骤 1:计算并保存当前框选矩形。\n const endPoint = new Vector2().addVectors(\n this.cursorPoint,\n new Vector2().subtractVectors(new Vector2(event.position.x, event.position.y), this.startPoint),\n );\n const size = new Vector2().subtractVectors(this.cursorPoint, endPoint);\n const center = new Vector2().addVectors(this.cursorPoint, endPoint).multiply(0.5);\n\n size.x = Math.abs(size.x);\n size.y = Math.abs(size.y);\n const box = new Box2().setFromCenterAndSize(center, size);\n\n this.overlay.type = 'region';\n this.overlay.box = box;\n\n // 步骤 2:收集与框选矩形接触的可选对象\n const candidates: string[] = [];\n\n if (size.length() > 0) {\n const composition = this._owner.getEngine().sceneServer.compositions[0];\n const selectableItems = new Map<string, VFXItem>();\n\n // GE Composition.items 已是 sceneRoot 的全量后代,不再额外递归 children。\n if (composition) {\n for (const item of composition.items) {\n if (!isPlayerItemVisible(item)) {\n continue;\n }\n // 默认归并 Effects 子树;进入 EffectsEditMode 后只展开当前动效内部元素。\n const selectableItem = this.selection.resolveMarqueeSelectableItem(item);\n\n if (!selectableItem) {\n continue;\n }\n selectableItems.set(selectableItem.getInstanceId(), selectableItem);\n }\n }\n\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n const itemTransforms = new Map<string, ReturnType<typeof getItemViewTransform>>();\n const containedFrameIds = new Set<string>();\n\n // Frame 只在被框选区域完整包住时才入选。\n for (const item of selectableItems.values()) {\n if (this.selection.ignoreIds.includes(item.getInstanceId()) || this.selection.ignoreNames.includes(item.name) || item.type === spec.ItemType.composition) {\n continue;\n }\n const id = item.getInstanceId();\n const transform = getItemViewTransform(item, containerSize);\n\n itemTransforms.set(id, transform);\n if (transform && isFramePlayerItem(item) && getTransformedBoxCorners(transform).every(point => box.containsPoint(point))) {\n containedFrameIds.add(id);\n }\n }\n\n for (const item of selectableItems.values()) {\n const id = item.getInstanceId();\n const transform = itemTransforms.get(id);\n\n if (!transform) {\n continue;\n }\n\n const frameAncestors = getFramePlayerItemAncestors(item);\n\n // 整个 Frame 入选时只保留 Frame,不再同时选中其后代。\n if (frameAncestors.some(frame => containedFrameIds.has(frame.getInstanceId()))) {\n continue;\n }\n if (isFramePlayerItem(item)) {\n if (containedFrameIds.has(id)) {\n candidates.push(id);\n }\n continue;\n }\n if (!transformedBoxIntersectsBox(transform, box)) {\n continue;\n }\n\n // Frame 以外被裁剪的子元素不参与框选;框选区域进入 Frame 后即可选内部元素。\n const intersectsEveryFrame = frameAncestors.every(frame => {\n const frameTransform = itemTransforms.get(frame.getInstanceId());\n\n return !!frameTransform && transformedBoxIntersectsBox(frameTransform, box);\n });\n\n if (intersectsEveryFrame) {\n candidates.push(id);\n }\n }\n }\n\n // 步骤 3:结合修饰键提交最终选区。\n const regionIds = this.selection.filterSelectedItems(candidates);\n const nextSelectedIds = event.shiftPressed\n ? Array.from(new Set([...this.selection.interactionStartSelectedIds, ...regionIds]))\n : regionIds;\n\n this.selection.commitSelectedItems(nextSelectedIds);\n event.accept();\n }\n\n /**\n * 在选区发生变化时提交操作事件。\n * @param force 是否强制提交。\n */\n private emitMouseUpIfChanged (force = false): void {\n if (!force && this.sameIds(this.selection.getSelectedIds(), this.selection.interactionStartSelectedIds)) {\n return;\n }\n this._owner.emit('actioncommit', {\n source: this,\n selectedIds: [...this.selection.getSelectedIds()],\n oldSelectedIds: [...this.selection.interactionStartSelectedIds],\n });\n }\n\n /**\n * 判断两个 ID 列表是否按顺序相等。\n * @param left 左侧 ID 列表。\n * @param right 右侧 ID 列表。\n * @returns 是否相等。\n */\n private sameIds (left: string[], right: string[]): boolean {\n return left.length === right.length && left.every((id, index) => id === right[index]);\n }\n}\n","import { Gizmo } from '../gizmo';\nimport {\n MouseButton,\n type InputEventMouseButton,\n type InputEventMouseMotion,\n} from '@galacean/effects';\nimport { Vector2 } from '../math';\nimport type { SelectionHitSnapshot } from '../selection';\nimport {\n getItemChildren,\n getPlayerItemById,\n} from '../items';\n\n/** 单次按下选择交互的状态。 */\ntype SelectionPressSession = {\n /** 交互开始前的选中项 ID。 */\n initialSelectedIds: string[],\n /** 按下位置的命中快照。 */\n pressHit: SelectionHitSnapshot,\n /** 按下时最上层的命中项。 */\n pressTarget?: string,\n /** 等待抬起确认的选择目标。 */\n deferredTarget?: string,\n /** 当前选择提交方式。 */\n mode: 'immediate' | 'deferred' | 'none',\n /** 按下时是否启用追加选择。 */\n shiftKey: boolean,\n};\n\n/** 处理单击、双击和右键选择,并协调与拖拽候选的选择时机。 */\nexport class ChangeSelectionGizmo extends Gizmo {\n readonly type = 'change-selection';\n private session: SelectionPressSession | undefined;\n private hoverItemId: string | undefined;\n\n /**\n * 更新悬停目标。\n * @param event 鼠标移动事件。\n */\n override onMouseMove (event: InputEventMouseMotion): void {\n const selection = this._owner.getSelection();\n\n selection.commitHoverTarget(new Vector2(event.position.x, event.position.y));\n this.hoverItemId = selection.preSelectedId;\n event.accept();\n }\n\n /**\n * 忽略拖拽阶段的悬停更新。\n * @param _event 鼠标拖拽事件。\n */\n override onMouseDrag (_event: InputEventMouseMotion): void {\n // 拖拽阶段不更新选择悬停。\n }\n\n /**\n * 根据鼠标按键和命中结果开始选择交互。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n // 步骤 1:保留按下前的悬停目标并处理右键选择。\n this._owner.getSelection().setHoverOverlayTarget(this.hoverItemId);\n\n if (event.buttonIndex === MouseButton.Right) {\n const oldSelectedIds = [...this._owner.getSelection().getSelectedIds()];\n\n if (this.resolveContextSelection(event)) {\n const selectedIds = [...this._owner.getSelection().getSelectedIds()];\n\n this._owner.emit('actionstart', { source: this, selectedIds });\n this._owner.emit('actioncommit', {\n source: this,\n selectedIds,\n oldSelectedIds,\n });\n }\n\n return;\n }\n // 步骤 2:为主键点击记录命中快照与初始选区。\n if (event.buttonIndex !== MouseButton.Left) {\n return;\n }\n\n const selection = this._owner.getSelection();\n const point = new Vector2(event.position.x, event.position.y);\n const pressHit = selection.createHitSnapshot(point);\n const initialSelectedIds = [...selection.getSelectedIds()];\n\n selection.interactionStartSelectedIds = [...initialSelectedIds];\n\n const session: SelectionPressSession = {\n initialSelectedIds,\n pressHit,\n pressTarget: pressHit.topmostId,\n mode: 'none',\n shiftKey: event.shiftPressed,\n };\n\n // 步骤 3:解析立即提交或延迟到抬起的选择结果。\n const nextSelectedIds = this.resolvePressSelection(event, session);\n\n if (nextSelectedIds) {\n session.mode = 'immediate';\n selection.commitSelectedItems(nextSelectedIds);\n }\n\n // 步骤 4:保存会话并通知宿主交互开始。\n this.session = session;\n this._owner.emit('actionstart', {\n source: this,\n selectedIds: [...this._owner.getSelection().getSelectedIds()],\n });\n event.accept();\n }\n\n /**\n * 完成或取消当前选择交互。\n * @param event 鼠标抬起事件。\n */\n override onMouseUp (event: InputEventMouseButton): void {\n const session = this.session;\n const selection = this._owner.getSelection();\n\n if (event.isCanceled()) {\n this.resetSession();\n if (session) {\n event.accept();\n }\n\n return;\n }\n if (!session) {\n return;\n }\n event.accept();\n\n const releasePoint = new Vector2(event.position.x, event.position.y);\n\n if (session.mode === 'deferred' && session.deferredTarget) {\n const releaseHit = selection.createHitSnapshot(releasePoint);\n const targetStillExists = !!getPlayerItemById(\n this._owner.getEngine().sceneServer.compositions[0],\n session.deferredTarget,\n );\n\n if (targetStillExists && releaseHit.topmostId === session.deferredTarget) {\n selection.commitSelectedItems([session.deferredTarget]);\n }\n } else if (\n session.mode === 'none'\n && !session.shiftKey\n && session.pressHit.drillTargetId\n && session.pressHit.drillTargetId !== session.pressTarget\n ) {\n const releaseHit = selection.createHitSnapshot(releasePoint);\n const drillTargetId = session.pressHit.drillTargetId;\n const targetStillExists = !!getPlayerItemById(\n this._owner.getEngine().sceneServer.compositions[0],\n drillTargetId,\n );\n\n if (targetStillExists && releaseHit.drillTargetId === drillTargetId) {\n selection.commitSelectedItems([drillTargetId]);\n }\n } else if (\n !session.pressTarget\n && !session.shiftKey\n && selection.getFocusedGroupId()\n && !selection.isPointInFocusedGroup(releasePoint)\n ) {\n selection.setFocusedGroup(null);\n }\n\n this.resetSession();\n this._owner.emit('actioncommit', {\n source: this,\n selectedIds: [...this._owner.getSelection().getSelectedIds()],\n oldSelectedIds: session.initialSelectedIds,\n });\n }\n\n /** 释放选择交互状态。 */\n override dispose (): void {\n this.hoverItemId = undefined;\n this.resetSession();\n super.dispose();\n }\n\n /**\n * 解析按下阶段应提交的选区。\n * @param event 鼠标按下事件。\n * @param session 当前按下会话。\n * @returns 立即提交的选中项 ID;需要延迟或保持选区时返回 undefined。\n */\n private resolvePressSelection (\n event: InputEventMouseButton,\n session: SelectionPressSession,\n ): string[] | undefined {\n const selection = this._owner.getSelection();\n const selectedIds = session.initialSelectedIds;\n const target = session.pressTarget;\n\n // 步骤 1:双击按已选父组继续向内下钻一层。\n if (event.doubleClick && !event.shiftPressed && session.pressHit.drillTargetId) {\n return [session.pressHit.drillTargetId];\n }\n\n // 步骤 2:Shift 单击切换目标的选中状态。\n if (event.shiftPressed) {\n if (!target) {\n return undefined;\n }\n\n return selectedIds.includes(target)\n ? selectedIds.filter(id => id !== target)\n : [...selectedIds, target];\n }\n\n // 步骤 3:空白点击或已选范围内点击保持既有拖拽语义。\n if (!target) {\n return this._owner.getSelection().isPointInSelectedViewBox(session.pressHit.point) ? undefined : [];\n }\n\n if (session.pressHit.selectedScopeHitIds.includes(target)) {\n if (!selection.isItemSelected(target)) {\n session.mode = 'deferred';\n session.deferredTarget = target;\n }\n\n return undefined;\n }\n\n // 步骤 4:重叠未选目标延迟到抬起时确认。\n if (session.pressHit.selectedScopeHitIds.length > 0) {\n if (!selection.isItemSelected(target)) {\n session.mode = 'deferred';\n session.deferredTarget = target;\n }\n\n return undefined;\n }\n\n return [target];\n }\n\n /**\n * 根据右键命中结果更新上下文选区。\n * @param event 鼠标按下事件。\n * @returns 选区是否发生变化。\n */\n private resolveContextSelection (event: InputEventMouseButton): boolean {\n const selection = this._owner.getSelection();\n const hitId = selection.createHitSnapshot(\n new Vector2(event.position.x, event.position.y),\n ).topmostId;\n const selectedIds = [...selection.getSelectedIds()];\n const selectedScopeIds = new Set([\n ...selectedIds,\n ...selectedIds.flatMap(id => {\n const item = getPlayerItemById(this._owner.getEngine().sceneServer.compositions[0], id);\n\n return item ? getItemChildren(item).map(child => child.getInstanceId()) : [];\n }),\n ]);\n\n if (hitId && !selectedScopeIds.has(hitId)) {\n return selection.commitSelectedItems(\n event.shiftPressed ? [...selectedIds, hitId] : [hitId],\n );\n }\n\n return false;\n }\n\n /** 清除当前按下会话。 */\n private resetSession (): void {\n this.session = undefined;\n }\n\n}\n","import { Gizmo } from '../gizmo';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport {\n InputEventMouseButton,\n type InputEventMouse,\n type InputEventMouseMotion,\n} from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\n\n/**\n * 复制鼠标按键事件,生成可独立修改的快照。\n * @param source 源鼠标按键事件。\n * @returns 事件快照。\n */\nfunction copyMouseButton (source: InputEventMouseButton): InputEventMouseButton {\n const event = new InputEventMouseButton();\n\n event.device = source.device;\n event.pressed = source.pressed;\n event.canceled = source.isCanceled();\n event.commandOrControlAutoremap = source.commandOrControlAutoremap;\n event.shiftPressed = source.shiftPressed;\n event.altPressed = source.altPressed;\n event.metaPressed = source.metaPressed;\n event.ctrlPressed = source.ctrlPressed;\n event.buttonMask = source.buttonMask;\n event.position.copyFrom(source.position);\n event.globalPosition.copyFrom(source.globalPosition);\n event.factor = source.factor;\n event.buttonIndex = source.buttonIndex;\n event.doubleClick = source.doubleClick;\n\n return event;\n}\n\n/**\n * 根据拖拽事件创建用于取消点击候选的抬起事件。\n * @param source 当前鼠标拖拽事件。\n * @param down 原始鼠标按下事件。\n * @returns 已取消的鼠标抬起事件。\n */\nfunction canceledReleaseFromMotion (\n source: InputEventMouseMotion,\n down: InputEventMouseButton,\n): InputEventMouseButton {\n const event = copyMouseButton(down);\n\n event.pressed = false;\n event.canceled = true;\n event.buttonMask = source.buttonMask;\n event.position.copyFrom(source.position);\n event.shiftPressed = source.shiftPressed;\n event.altPressed = source.altPressed;\n event.metaPressed = source.metaPressed;\n event.ctrlPressed = source.ctrlPressed;\n\n return event;\n}\n\n/**\n * 判断当前平台的标准快捷键是否按下。\n * @param event 鼠标拖拽事件。\n * @returns 是否按下 Command 或 Ctrl。\n */\nfunction isStandardShortcutPressed (event: InputEventMouseMotion): boolean {\n const isApplePlatform = typeof navigator !== 'undefined'\n && /Mac|iPhone|iPad|iPod/.test(navigator.platform);\n\n return isApplePlatform ? event.metaPressed : event.ctrlPressed;\n}\n\n/** 点击与拖拽候选的仲裁配置。 */\nexport type ClickDragMultiplexOptions = {\n /** 点击阶段的候选列表。 */\n clickCandidates: Gizmo[],\n /** 拖拽阶段的候选列表。 */\n dragCandidates: Gizmo[],\n /** 标准快捷键按下时优先尝试的拖拽候选。 */\n auxiliaryBehavior?: Gizmo,\n};\n\n/** 在同一指针序列中延迟仲裁点击与拖拽候选。 */\nexport class ClickDragMultiplexGizmo extends Gizmo {\n readonly type = 'click-drag-multiplex';\n\n /** 点击阶段的候选列表。 */\n private readonly clickCandidateList: readonly Gizmo[];\n /** 拖拽阶段的候选列表。 */\n private readonly dragCandidateList: readonly Gizmo[];\n /** 标准快捷键对应的辅助拖拽候选。 */\n private readonly auxiliaryBehaviorGizmo: Gizmo | undefined;\n /** 供拖拽候选重放的按下事件快照。 */\n private downSnapshot: InputEventMouseButton | undefined;\n /** 当前拖拽候选胜者。 */\n private dragWinner: Gizmo | undefined;\n /** 当前点击候选胜者。 */\n private clickWinner: Gizmo | undefined;\n\n /**\n * 创建点击与拖拽仲裁器。\n * @param owner Gizmo 宿主。\n * @param options 候选配置。\n */\n constructor (owner: GizmoOwner, options: ClickDragMultiplexOptions) {\n super(owner);\n this.clickCandidateList = [...options.clickCandidates];\n this.dragCandidateList = [...options.dragCandidates];\n this.auxiliaryBehaviorGizmo = options.auxiliaryBehavior;\n }\n\n /** @returns 点击候选的只读列表。 */\n clickCandidates (): readonly Gizmo[] {\n return this.clickCandidateList;\n }\n\n /** @returns 拖拽候选的只读列表。 */\n dragCandidates (): readonly Gizmo[] {\n return this.dragCandidateList;\n }\n\n /** @returns 标准快捷键对应的辅助拖拽候选。 */\n auxiliaryBehavior (): Gizmo | undefined {\n return this.auxiliaryBehaviorGizmo;\n }\n\n /**\n * 将按下事件交给点击候选并保存事件快照。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n const winner = this.invokeMouseDown(this.clickCandidateList, event);\n\n if (winner) {\n this.clickWinner = winner;\n }\n this.downSnapshot = copyMouseButton(event);\n this.dragWinner = undefined;\n }\n\n /**\n * 将悬停移动事件广播给点击候选。\n * @param event 鼠标移动事件。\n */\n override onMouseMove (event: InputEventMouseMotion): void {\n for (const candidate of this.clickCandidateList) {\n this.invoke(candidate, event, 'move');\n }\n\n this.dragWinner = undefined;\n }\n\n /**\n * 解析拖拽胜者并将事件转发给它。\n * @param event 鼠标拖拽事件。\n */\n override onMouseDrag (event: InputEventMouseMotion): void {\n // 步骤 1:允许已建立会话的点击候选优先处理拖拽。\n for (const candidate of this.clickCandidateList) {\n if (this.invoke(candidate, event, 'drag')) {\n return;\n }\n }\n\n if (!this.downSnapshot) {\n return;\n }\n\n // 步骤 2:重放按下事件,按优先级解析拖拽胜者。\n if (!this.dragWinner) {\n this.downSnapshot.clearAccepted();\n if (isStandardShortcutPressed(event)) {\n this.dragWinner = this.resolveDragCandidate(this.auxiliaryBehaviorGizmo);\n }\n if (!this.dragWinner) {\n for (const candidate of this.dragCandidateList) {\n this.dragWinner = this.resolveDragCandidate(candidate);\n if (this.dragWinner) {\n break;\n }\n }\n }\n if (!this.dragWinner) {\n return;\n }\n\n // 步骤 3:拖拽胜出后取消所有点击会话。\n const canceledRelease = canceledReleaseFromMotion(event, this.downSnapshot);\n\n for (const candidate of this.clickCandidateList) {\n this.invoke(candidate, canceledRelease, 'up');\n }\n }\n\n this.invoke(this.dragWinner, event, 'drag');\n }\n\n /**\n * 将抬起事件交给当前胜者。\n * @param event 鼠标抬起事件。\n */\n override onMouseUp (event: InputEventMouseButton): void {\n if (this.clickWinner) {\n this.clickWinner = undefined;\n }\n if (this.dragWinner) {\n this.invoke(this.dragWinner, event, 'up');\n this.dragWinner = undefined;\n } else {\n for (const candidate of this.clickCandidateList) {\n if (this.invoke(candidate, event, 'up')) {\n break;\n }\n }\n }\n }\n\n /** 将每帧更新转发给点击和拖拽候选。 */\n override onUpdate (): void {\n for (const candidate of [...this.clickCandidateList, ...this.dragCandidateList]) {\n candidate.onUpdate();\n }\n }\n\n /**\n * 按候选优先级绘制所有子 Gizmo。\n * @param control 绘制控制器。\n */\n override draw (control: Control): void {\n const ordered: Gizmo[] = [...this.clickCandidateList, ...this.dragCandidateList];\n\n if (this.auxiliaryBehaviorGizmo) {\n ordered.push(this.auxiliaryBehaviorGizmo);\n }\n for (const candidate of ordered) {\n candidate.draw(control);\n }\n }\n\n /** 释放所有子 Gizmo 和交互快照。 */\n override dispose (): void {\n this.clearWinners();\n this.downSnapshot = undefined;\n for (const candidate of this.allChildren()) {\n candidate.dispose();\n }\n super.dispose();\n }\n\n /**\n * 顺序派发按下事件并返回首个接受者。\n * @param candidates 候选列表。\n * @param event 鼠标按下事件。\n * @returns 接受事件的候选。\n */\n private invokeMouseDown (candidates: readonly Gizmo[], event: InputEventMouseButton): Gizmo | undefined {\n for (const candidate of candidates) {\n if (this.invoke(candidate, event, 'down')) {\n return candidate;\n }\n }\n\n return undefined;\n }\n\n /**\n * 向候选重放按下事件以尝试建立拖拽会话。\n * @param candidate 待尝试的候选。\n * @returns 接受事件的拖拽候选。\n */\n private resolveDragCandidate (candidate: Gizmo | undefined): Gizmo | undefined {\n if (!candidate || !this.downSnapshot) {\n return undefined;\n }\n\n return this.invoke(candidate, this.downSnapshot, 'down') ? candidate : undefined;\n }\n\n /** @returns 所有受托管的子 Gizmo。 */\n private allChildren (): Gizmo[] {\n const children: Gizmo[] = [...this.clickCandidateList, ...this.dragCandidateList];\n\n if (this.auxiliaryBehaviorGizmo) {\n children.push(this.auxiliaryBehaviorGizmo);\n }\n\n return children;\n }\n\n /** 清除当前点击与拖拽胜者。 */\n private clearWinners (): void {\n this.dragWinner = undefined;\n if (this.clickWinner) {\n this.clickWinner = undefined;\n }\n }\n\n /**\n * 调用候选的指定鼠标阶段。\n * @param candidate 目标候选。\n * @param event 鼠标事件。\n * @param phase 事件阶段。\n * @returns 候选是否接受事件。\n */\n private invoke (\n candidate: Gizmo,\n event: InputEventMouse,\n phase: 'down' | 'move' | 'drag' | 'up',\n ): boolean {\n switch (phase) {\n case 'down':\n candidate.onMouseDown(event as InputEventMouseButton);\n\n break;\n case 'move':\n candidate.onMouseMove(event as InputEventMouseMotion);\n\n break;\n case 'drag':\n candidate.onMouseDrag(event as InputEventMouseMotion);\n\n break;\n case 'up':\n candidate.onMouseUp(event as InputEventMouseButton);\n\n break;\n }\n\n return event.isAccepted();\n }\n}\n","import type { Box2 } from '@galacean/effects-math/es/extension/index';\nimport { Line2 } from '@galacean/effects-math/es/extension/index';\nimport { Vector2 } from '../math';\nimport type { LayoutInfo } from './types';\n\n/** 自动布局兄弟元素的几何与位置信息。 */\nexport type SiblingInfo = {\n /** 元素 ID。 */\n id: string,\n /** 视图包围盒。 */\n box: Box2,\n /** 包围盒中心点。 */\n center: Vector2,\n /** 自动布局位置。 */\n layoutInfo?: LayoutInfo,\n};\n\n/** 自动布局插入指示器。 */\nexport type AutoLayoutIndicator = {\n /** 目标画板 ID。 */\n frameId: string,\n /** 在画板子元素列表中的插入索引。 */\n insertIndex: number,\n /** 相对参考元素的插入方向。 */\n insertDirection: 'before' | 'after',\n /** 参考兄弟元素 ID。 */\n targetSiblingId?: string,\n /** 插入指示线。 */\n line: Line2,\n /** 目标行号。 */\n targetRow?: number,\n /** 目标列号。 */\n targetColumn?: number,\n} | null;\n\n/** 自动布局中的行列位置。 */\nexport type LayoutPosition = {\n /** 行号。 */\n row: number,\n /** 列号。 */\n column: number,\n};\n\n/** 自动布局的插入位置及指示器依据。 */\nexport type InsertInfo = {\n /** 在画板子元素列表中的插入索引。 */\n index: number,\n /** 相对参考元素的插入方向。 */\n direction: 'before' | 'after',\n /** 参考兄弟元素 ID。 */\n siblingId?: string,\n /** 目标行号。 */\n row: number,\n /** 目标列号。 */\n column: number,\n /** 跨行移动信息。 */\n rowChange?: {\n /** 原行号。 */\n fromRow: number,\n /** 目标行号。 */\n toRow: number,\n /** 原行的视图边界。 */\n rowBounds?: {\n /** 最小 Y 坐标。 */\n minY: number,\n /** 最大 Y 坐标。 */\n maxY: number,\n /** 最小 X 坐标。 */\n minX: number,\n /** 最大 X 坐标。 */\n maxX: number,\n },\n /** 是否发生跨行移动。 */\n isRowChange: boolean,\n },\n /** 参考元素包围盒。 */\n box?: Box2,\n};\n\n/** 已解析行列位置的兄弟元素。 */\nexport type SiblingWithInfo = {\n /** 元素 ID。 */\n id: string,\n /** 视图包围盒。 */\n box: Box2,\n /** 行号。 */\n row: number,\n /** 列号。 */\n column: number,\n /** 包围盒中心 X 坐标。 */\n centerX: number,\n};\n\n/**\n * 按元素 `row` 字段分组的纯函数。\n * @param items 元素列表\n * @returns 按行号分组的 Map\n */\nfunction groupItemsByRow<T extends { row?: number }> (items: T[]): Map<number, T[]> {\n const groups = new Map<number, T[]>();\n\n for (const item of items) {\n const row = item.row ?? 0;\n const group = groups.get(row);\n\n if (group) {\n group.push(item);\n } else {\n groups.set(row, [item]);\n }\n }\n\n return groups;\n}\n\n/**\n * 计算自动布局插入指示线。\n * @param insertInfo 插入位置信息\n * @returns 主指示线\n */\nexport function calculateAutoLayoutIndicatorLine (\n insertInfo: InsertInfo,\n): Line2 {\n const LINE_EXTENSION = 10;\n const MOUSE_GAP = 5;\n const ROW_LINE_EXTENSION = 20;\n\n // 1. 跨行移动时生成原行边界的水平指示线。\n if (insertInfo.rowChange?.isRowChange && insertInfo.rowChange.rowBounds) {\n const bounds = insertInfo.rowChange.rowBounds;\n const isMovingUp = insertInfo.rowChange.toRow < insertInfo.rowChange.fromRow;\n\n const lineY = isMovingUp ? bounds.minY : bounds.maxY;\n\n return new Line2(\n new Vector2(bounds.minX - ROW_LINE_EXTENSION, lineY),\n new Vector2(bounds.maxX + ROW_LINE_EXTENSION, lineY)\n );\n }\n\n // 2. 同行移动时在参考元素前后生成垂直指示线。\n if (insertInfo.box) {\n const siblingBox = insertInfo.box;\n\n if (insertInfo.direction === 'before') {\n return new Line2(\n new Vector2(siblingBox.min.x - MOUSE_GAP, siblingBox.min.y - LINE_EXTENSION),\n new Vector2(siblingBox.min.x - MOUSE_GAP, siblingBox.max.y + LINE_EXTENSION)\n );\n } else {\n return new Line2(\n new Vector2(siblingBox.max.x + MOUSE_GAP, siblingBox.min.y - LINE_EXTENSION),\n new Vector2(siblingBox.max.x + MOUSE_GAP, siblingBox.max.y + LINE_EXTENSION)\n );\n }\n }\n\n return new Line2();\n}\n\n/**\n * 基于鼠标位置计算布局位置(row 和 column)。\n * @param mousePoint 鼠标位置\n * @param siblingInfos 所有兄弟元素的信息\n * @returns 布局位置信息 { row: number, column: number }\n */\nexport function calculateAutoLayoutPositionByMouse (\n mousePoint: Vector2,\n siblingInfos: SiblingInfo[],\n): LayoutPosition | null {\n if (siblingInfos.length === 0) {\n return { row: 0, column: 0 };\n }\n\n const mouseY = mousePoint.y;\n const mouseX = mousePoint.x;\n\n // 1. 按已有行号分组并计算各行的垂直边界。\n const rowGroups = groupItemsByRow(siblingInfos.map(s => ({\n ...s,\n row: s.layoutInfo?.row !== undefined ? Math.floor(s.layoutInfo.row) : 0,\n })));\n\n let maxRow = 0;\n let minRow = 0;\n\n for (const row of rowGroups.keys()) {\n maxRow = Math.max(maxRow, row);\n minRow = Math.min(minRow, row);\n }\n\n /** 行的视图边界。 */\n type RowInfo = {\n /** 行号。 */\n row: number,\n /** 中心 Y 坐标。 */\n centerY: number,\n /** 上边界。 */\n minY: number,\n /** 下边界。 */\n maxY: number,\n /** 行高。 */\n height: number,\n };\n\n const rowInfos: RowInfo[] = [];\n\n for (const [row, items] of rowGroups) {\n const minY = Math.min(...items.map(i => i.box.min.y));\n const maxY = Math.max(...items.map(i => i.box.max.y));\n const centerY = (minY + maxY) / 2;\n const height = maxY - minY;\n\n rowInfos.push({ row, centerY, minY, maxY, height });\n }\n\n rowInfos.sort((a, b) => a.centerY - b.centerY);\n\n // 2. 按鼠标纵坐标确定命中行、首尾新行或最近行。\n let targetRow = 0;\n\n let foundRow = false;\n\n for (const currentRow of rowInfos) {\n if (mouseY >= currentRow.minY && mouseY <= currentRow.maxY) {\n targetRow = currentRow.row;\n foundRow = true;\n\n break;\n }\n }\n\n if (!foundRow && rowInfos.length > 0) {\n const firstRow = rowInfos[0];\n\n if (firstRow && mouseY < firstRow.minY) {\n targetRow = minRow - 1;\n foundRow = true;\n }\n }\n\n if (!foundRow && rowInfos.length > 0) {\n const lastRow = rowInfos[rowInfos.length - 1];\n\n if (lastRow && mouseY > lastRow.maxY) {\n targetRow = maxRow + 1;\n foundRow = true;\n }\n }\n\n if (!foundRow) {\n let minDistance = Infinity;\n\n for (const rowInfo of rowInfos) {\n const distance = Math.abs(mouseY - rowInfo.centerY);\n\n if (distance < minDistance) {\n minDistance = distance;\n targetRow = rowInfo.row;\n }\n }\n }\n\n // 3. 按鼠标横坐标确定目标行内的插入列。\n const targetRowItems = rowGroups.get(targetRow) ?? [];\n\n if (targetRowItems.length === 0) {\n return { row: targetRow, column: 0 };\n }\n\n targetRowItems.sort((a, b) => a.center.x - b.center.x);\n\n for (let i = 0; i < targetRowItems.length; i++) {\n const item = targetRowItems[i];\n\n if (item && mouseX < item.center.x) {\n return { row: targetRow, column: i };\n }\n }\n\n return { row: targetRow, column: targetRowItems.length };\n}\n\n/**\n * 基于鼠标位置计算插入位置(用于显示指示器)。\n * @param mousePoint 鼠标位置\n * @param siblingsWithInfos 所有兄弟元素信息\n * @param allChildren 所有兄弟元素ID数组\n * @param originalRow 原始行号\n * @returns 插入位置信息和计算出的行列位置\n */\nexport function calculateInsertPositionFromLayout (\n mousePoint: Vector2,\n siblingsWithInfos: SiblingWithInfo[],\n allChildren: string[],\n originalRow: number,\n): InsertInfo {\n const mouseX = mousePoint.x;\n const mouseY = mousePoint.y;\n\n if (siblingsWithInfos.length === 0) {\n return { index: 0, direction: 'after', row: -1, column: 0 };\n }\n\n // 1. 按行分组并计算每行的视图边界。\n const rowGroups = groupItemsByRow(siblingsWithInfos);\n\n const rowBounds = new Map<number, { minY: number, maxY: number, minX: number, maxX: number }>();\n\n for (const [row, items] of rowGroups) {\n const minY = Math.min(...items.map(i => i.box.min.y));\n const maxY = Math.max(...items.map(i => i.box.max.y));\n const minX = Math.min(...items.map(i => i.box.min.x));\n const maxX = Math.max(...items.map(i => i.box.max.x));\n\n rowBounds.set(row, { minY, maxY, minX, maxX });\n }\n\n const sortedRows = Array.from(rowGroups.keys()).sort((a, b) => a - b);\n\n // 2. 按鼠标纵坐标确定目标行及是否跨行。\n let targetRow = -1;\n\n for (const row of sortedRows) {\n const bounds = rowBounds.get(row);\n\n if (bounds && mouseY >= bounds.minY && mouseY <= bounds.maxY) {\n targetRow = row;\n\n break;\n }\n }\n\n if (targetRow === -1 && sortedRows.length > 0) {\n const firstRowNum = sortedRows[0];\n\n if (firstRowNum === undefined) {\n targetRow = -1;\n } else {\n const firstRowBounds = rowBounds.get(firstRowNum);\n\n if (firstRowBounds && mouseY < firstRowBounds.minY) {\n targetRow = -1;\n } else {\n targetRow = sortedRows[sortedRows.length - 1] ?? -1;\n }\n }\n }\n\n const currentRowBounds = rowBounds.get(originalRow);\n const isRowChange = targetRow !== originalRow;\n\n // 3. 在目标行中查找参考元素和插入索引。\n const targetRowItems = rowGroups.get(targetRow) ?? [];\n\n if (targetRowItems.length === 0) {\n let referenceItemId: string | null = null;\n\n for (const [row, items] of rowGroups) {\n if (row > targetRow && items.length > 0) {\n const firstItem = items[0];\n\n if (firstItem) {\n referenceItemId = firstItem.id;\n\n break;\n }\n }\n }\n\n if (!referenceItemId) {\n const lastRow = sortedRows[sortedRows.length - 1];\n const lastRowItems = lastRow !== undefined ? rowGroups.get(lastRow) ?? [] : [];\n\n referenceItemId = lastRowItems[lastRowItems.length - 1]?.id ?? null;\n }\n\n if (referenceItemId) {\n const refIndex = allChildren.indexOf(referenceItemId);\n\n if (refIndex !== -1) {\n return {\n index: targetRow === -1 ? refIndex : refIndex + 1,\n direction: targetRow === -1 ? 'before' : 'after',\n siblingId: referenceItemId,\n row: targetRow,\n column: targetRow === -1 ? 0 : (rowGroups.get(targetRow)?.length ?? 0),\n rowChange: isRowChange && currentRowBounds ? {\n fromRow: originalRow,\n toRow: targetRow,\n rowBounds: currentRowBounds,\n isRowChange,\n } : undefined,\n box: siblingsWithInfos.find(info => info.id === referenceItemId)?.box,\n };\n }\n }\n\n return {\n index: 0,\n direction: 'after',\n row: targetRow,\n column: 0,\n rowChange: isRowChange && currentRowBounds ? {\n fromRow: originalRow,\n toRow: targetRow,\n rowBounds: currentRowBounds,\n isRowChange,\n } : undefined,\n };\n }\n\n targetRowItems.sort((a, b) => a.centerX - b.centerX);\n\n for (const info of targetRowItems) {\n if (mouseX < info.centerX) {\n const refIndex = allChildren.indexOf(info.id);\n\n if (refIndex !== -1) {\n return {\n index: refIndex,\n direction: 'before',\n siblingId: info.id,\n row: targetRow,\n column: info.column,\n rowChange: isRowChange && currentRowBounds ? {\n fromRow: originalRow,\n toRow: targetRow,\n rowBounds: currentRowBounds,\n isRowChange: true,\n } : undefined,\n box: info.box,\n };\n }\n }\n }\n\n // 4. 鼠标位于目标行末尾时插入到最后一个元素之后。\n const lastItem = targetRowItems[targetRowItems.length - 1];\n\n if (lastItem) {\n const refIndex = allChildren.indexOf(lastItem.id);\n\n if (refIndex !== -1) {\n return {\n index: refIndex + 1,\n direction: 'after',\n siblingId: lastItem.id,\n row: targetRow,\n column: lastItem.column + 1,\n rowChange: isRowChange && currentRowBounds ? {\n fromRow: originalRow,\n toRow: targetRow,\n rowBounds: currentRowBounds,\n isRowChange: true,\n } : undefined,\n box: lastItem.box,\n };\n }\n }\n\n return {\n index: 0,\n direction: 'after',\n row: -1,\n column: 0,\n rowChange: isRowChange && currentRowBounds ? {\n fromRow: originalRow,\n toRow: targetRow,\n rowBounds: currentRowBounds,\n isRowChange: true,\n } : undefined,\n };\n}\n","import { type Engine, type VFXItem } from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport { drawCorners, toColor } from '../drawing';\nimport {\n getItemChildren,\n getItemViewBox,\n getPlayerItemById,\n isEffectsPlayerItem,\n isFramePlayerItem,\n isGroupPlayerItem,\n} from '../items';\nimport {\n calculateAutoLayoutIndicatorLine,\n calculateAutoLayoutPositionByMouse,\n calculateInsertPositionFromLayout,\n type AutoLayoutIndicator,\n} from './layout-calculations';\nimport { FrameLayoutMode, type FrameInfo } from './types';\nimport type { Box2 } from '@galacean/effects-math/es/extension/index';\nimport { Line2 } from '@galacean/effects-math/es/extension/index';\nimport { Vector2, getBoxCorners } from '../math';\nimport { GizmoViewportUtils } from '../viewport';\n\n/** 选区拖拽产生的层级位置变更。 */\nexport type SelectionPlacementChange =\n | {\n /** 移入画板。 */\n type: 'moveIn',\n /** 待移入元素 ID。 */\n itemIds: string[],\n /** 目标画板 ID。 */\n targetFrameId: string,\n }\n | {\n /** 移出画板。 */\n type: 'moveOut',\n /** 待移出元素 ID。 */\n itemIds: string[],\n /** 原画板 ID。 */\n originalFrameId: string,\n }\n | {\n /** 子元素脱离组合。 */\n type: 'detachGroupChildren',\n /** 原组合 ID。 */\n groupId: string,\n /** 待脱离的子元素 ID。 */\n itemIds: string[],\n /** 原画板 ID。 */\n originalFrameId: string,\n };\n\n/** 自动布局重排的起止位置。 */\nexport type AutoLayoutChangeInfo = {\n /** 画板 ID。 */\n frameId: string,\n /** 被拖拽元素 ID。 */\n draggedItemId: string,\n /** 原行号。 */\n fromRow: number,\n /** 原列号。 */\n fromColumn: number,\n /** 目标行号。 */\n toRow: number,\n /** 目标列号。 */\n toColumn: number,\n};\n\n/** 辅助布局交互的提交结果。 */\nexport type AssistedLayoutFinishResult = {\n /** 层级位置变更。 */\n placementChanges: SelectionPlacementChange[],\n /** 自动布局重排信息。 */\n autoLayoutChange?: AutoLayoutChangeInfo,\n};\n\n/** 自动布局中的兄弟元素信息。 */\ntype AutoLayoutSibling = {\n /** 元素 ID。 */\n id: string,\n /** 视图包围盒。 */\n box: Box2,\n /** 包围盒中心。 */\n center: Vector2,\n /** 包围盒中心 X 坐标。 */\n centerX: number,\n /** 当前布局位置。 */\n layoutInfo: {\n /** 行号。 */\n row: number,\n /** 列号。 */\n column: number,\n },\n /** 行号。 */\n row: number,\n /** 列号。 */\n column: number,\n};\n\n/** 待提交的组合子元素脱离信息。 */\ntype PendingGroupDetach = {\n /** 组合 ID。 */\n groupId: string,\n /** 目标画板 ID。 */\n frameId: string,\n /** 位于目标画板外的子元素 ID。 */\n childrenOutOfFrame: string[],\n};\n\n/** 计算选区拖拽期间的画板归属、自动布局位置和视觉提示。 */\nexport class AssistedLayout {\n private readonly owner: GizmoOwner;\n private readonly engine: Engine;\n private selectedItems: VFXItem[] = [];\n private readonly selectedFrameIds = new Set<string>();\n private readonly currentFrameIds = new Map<string, string | undefined>();\n private readonly pendingGroupDetaches = new Map<string, PendingGroupDetach>();\n private targetFrameId: string | undefined;\n private autoLayoutIndicator: AutoLayoutIndicator = null;\n private autoLayoutDragOriginalPosition: { row: number, column: number } | null = null;\n private autoLayoutDragFrameId: string | null = null;\n private autoLayoutDragItemId: string | null = null;\n private pendingLayoutPosition: { row: number, column: number } | null = null;\n\n /**\n * @param owner Gizmo 宿主\n */\n constructor (owner: GizmoOwner) {\n this.owner = owner;\n this.engine = owner.getEngine();\n }\n\n /**\n * 开始辅助布局会话并记录元素原画板。\n * @param selectedItems 当前选中元素\n */\n begin (selectedItems: readonly VFXItem[]): void {\n this.cancel();\n this.selectedItems = [...selectedItems];\n for (const item of selectedItems) {\n const id = item.getInstanceId();\n\n if (isFramePlayerItem(item)) {\n this.selectedFrameIds.add(id);\n }\n const frameId = this.owner.getFrameManager().getParentFrame(id)?.id;\n\n this.currentFrameIds.set(id, frameId);\n }\n }\n\n /**\n * 根据当前指针计算元素移入或移出画板的变更。\n * @param pointer 当前指针视图坐标\n * @returns 本帧需要应用的层级位置变更\n */\n resolveReparent (pointer: Vector2): SelectionPlacementChange[] {\n const frameManager = this.owner.getFrameManager();\n\n frameManager.updateViewBoxes();\n const frameInfos = frameManager.getViewInfos();\n const containerSize = GizmoViewportUtils.getContainerSize(this.engine.canvas.parentElement!);\n const changes: SelectionPlacementChange[] = [];\n let lastTargetFrameId: string | undefined;\n\n for (const item of this.selectedItems) {\n const result = this.resolveItemReparent(item, pointer, frameInfos, containerSize);\n\n if (result.change) {\n changes.push(result.change);\n }\n if (result.targetFrameId !== undefined) {\n lastTargetFrameId = result.targetFrameId;\n }\n }\n this.targetFrameId = lastTargetFrameId;\n\n return changes;\n }\n\n /**\n * 更新自动布局目标位置和插入指示器。\n * @param pointer 当前指针视图坐标\n */\n updateAutoLayout (pointer: Vector2): void {\n // 1. 校验单选元素及指针所在的自动布局画板。\n const item = this.selectedItems.length === 1 ? this.selectedItems[0] : undefined;\n\n if (!item || isFramePlayerItem(item) || isEffectsPlayerItem(item)) {\n this.clearAutoLayoutVisualState();\n\n return;\n }\n\n const parentFrameInfo = this.owner.getFrameManager().findFrameAt(pointer);\n\n if (parentFrameInfo?.layoutMode !== FrameLayoutMode.AUTO) {\n this.clearAutoLayoutVisualState();\n\n return;\n }\n\n // 2. 首次进入画板时记录元素原始行列位置。\n const frameId = parentFrameInfo.id;\n const draggedItemId = item.getInstanceId();\n\n if (\n this.autoLayoutDragOriginalPosition === null\n || this.autoLayoutDragFrameId !== frameId\n || this.autoLayoutDragItemId !== draggedItemId\n ) {\n const originalLayoutInfo = parentFrameInfo.layoutInfos?.[draggedItemId];\n\n this.autoLayoutDragOriginalPosition = {\n row: originalLayoutInfo?.row ?? 0,\n column: originalLayoutInfo?.column ?? 0,\n };\n this.autoLayoutDragFrameId = frameId;\n this.autoLayoutDragItemId = draggedItemId;\n }\n\n // 3. 收集目标画板中其余可见兄弟元素的布局几何。\n const containerSize = GizmoViewportUtils.getContainerSize(this.engine.canvas.parentElement!);\n const composition = this.engine.sceneServer.compositions[0];\n const siblings = parentFrameInfo.children.reduce<AutoLayoutSibling[]>((result, childId) => {\n if (childId === draggedItemId) {\n return result;\n }\n const playerItem = getPlayerItemById(composition, childId);\n\n if (!playerItem) {\n return result;\n }\n const box = getItemViewBox(playerItem, containerSize);\n\n if (box.isEmpty()) {\n return result;\n }\n const layoutInfo = parentFrameInfo.layoutInfos?.[childId] ?? { row: 0, column: 0 };\n\n result.push({\n id: childId,\n box,\n center: box.getCenter(),\n centerX: box.getCenter().x,\n layoutInfo,\n row: layoutInfo.row,\n column: layoutInfo.column,\n });\n\n return result;\n }, []);\n\n // 4. 计算目标行列、插入索引和指示线。\n const layoutPosition = calculateAutoLayoutPositionByMouse(pointer, siblings);\n\n if (!layoutPosition) {\n this.autoLayoutIndicator = null;\n this.pendingLayoutPosition = null;\n\n return;\n }\n\n this.pendingLayoutPosition = { ...layoutPosition };\n const insertPosition = calculateInsertPositionFromLayout(\n pointer,\n siblings,\n parentFrameInfo.children,\n this.autoLayoutDragOriginalPosition.row,\n );\n const line = insertPosition.siblingId\n ? calculateAutoLayoutIndicatorLine(insertPosition)\n : this.createFallbackIndicatorLine(parentFrameInfo.box, layoutPosition);\n\n this.autoLayoutIndicator = {\n frameId,\n insertIndex: insertPosition.siblingId ? insertPosition.index : parentFrameInfo.children.length,\n insertDirection: insertPosition.siblingId ? insertPosition.direction : 'after',\n targetSiblingId: insertPosition.siblingId,\n line,\n targetRow: layoutPosition.row,\n targetColumn: layoutPosition.column,\n };\n }\n\n /** @returns 当前会话需要提交的层级和自动布局变更。 */\n finish (): AssistedLayoutFinishResult {\n const placementChanges: SelectionPlacementChange[] = [];\n\n for (const pending of this.pendingGroupDetaches.values()) {\n if (pending.childrenOutOfFrame.length > 0) {\n placementChanges.push({\n type: 'detachGroupChildren',\n groupId: pending.groupId,\n itemIds: [...pending.childrenOutOfFrame],\n originalFrameId: pending.frameId,\n });\n }\n }\n\n let autoLayoutChange: AutoLayoutChangeInfo | undefined;\n\n if (\n this.autoLayoutDragFrameId\n && this.autoLayoutDragItemId\n && this.autoLayoutDragOriginalPosition\n && this.pendingLayoutPosition\n ) {\n autoLayoutChange = {\n frameId: this.autoLayoutDragFrameId,\n draggedItemId: this.autoLayoutDragItemId,\n fromRow: this.autoLayoutDragOriginalPosition.row,\n fromColumn: this.autoLayoutDragOriginalPosition.column,\n toRow: this.pendingLayoutPosition.row,\n toColumn: this.pendingLayoutPosition.column,\n };\n }\n\n return { placementChanges, autoLayoutChange };\n }\n\n /**\n * 绘制目标画板和自动布局插入指示器。\n * @param control 绘制控制器\n */\n draw (control: Control): void {\n if (this.targetFrameId) {\n const targetFrameInfo = this.owner.getFrameManager().getViewInfo(this.targetFrameId);\n\n if (targetFrameInfo?.box && !targetFrameInfo.box.isEmpty()) {\n drawCorners(control, getBoxCorners(targetFrameInfo.box), toColor(0xFF0000, 1), 1);\n }\n }\n\n const indicator = this.autoLayoutIndicator;\n\n if (!indicator || indicator.line.distanceSq() === 0) {\n return;\n }\n const lineColor = toColor(0x3b82f6, 1);\n const { start, end } = indicator.line;\n\n control.drawLine(start.x, start.y, end.x, end.y, lineColor, 2);\n control.fillCircle(start.x, start.y, 3, lineColor);\n control.fillCircle(end.x, end.y, 3, lineColor);\n }\n\n /** 取消会话并清空全部辅助布局状态。 */\n cancel (): void {\n this.selectedItems = [];\n this.selectedFrameIds.clear();\n this.currentFrameIds.clear();\n this.pendingGroupDetaches.clear();\n this.targetFrameId = undefined;\n this.clearAutoLayoutState();\n }\n\n /**\n * 计算单个元素相对画板的层级位置变更。\n * @param item 被拖拽元素\n * @param pointer 当前指针视图坐标\n * @param frameInfos 当前画板视图信息\n * @param containerSize 画布容器尺寸\n * @returns 目标画板和可选的层级位置变更\n */\n private resolveItemReparent (\n item: VFXItem,\n pointer: Vector2,\n frameInfos: readonly FrameInfo[],\n containerSize: Vector2,\n ): { targetFrameId?: string, change?: SelectionPlacementChange } {\n // 1. 排除不能移入画板的元素,并解析原画板与目标画板。\n if (isFramePlayerItem(item) || isEffectsPlayerItem(item)) {\n return {};\n }\n\n const itemId = item.getInstanceId();\n const currentFrameId = this.currentFrameIds.get(itemId);\n const currentFrame = frameInfos.find(frame => frame.id === currentFrameId);\n // 被选中的 Frame 会和其他选中项一起移动,不能再作为这些元素的放置容器。\n const targetFrame = frameInfos.find(frame => (\n !this.selectedFrameIds.has(frame.id) && frame.box.containsPoint(pointer)\n ));\n\n // 2. 指针离开原画板时生成移出变更。\n if (!targetFrame && currentFrame) {\n const itemIds = [itemId];\n\n if (isGroupPlayerItem(item)) {\n itemIds.push(...getItemChildren(item).map(child => child.getInstanceId()));\n }\n this.pendingGroupDetaches.delete(itemId);\n this.currentFrameIds.set(itemId, undefined);\n\n return {\n change: {\n type: 'moveOut',\n itemIds,\n originalFrameId: currentFrame.id,\n },\n };\n }\n\n if (!targetFrame || currentFrame?.id === targetFrame.id) {\n return { targetFrameId: targetFrame?.id };\n }\n\n // 3. 移入新画板时检查组合子元素与目标画板的相交关系。\n const itemIds = [itemId];\n\n if (isGroupPlayerItem(item)) {\n const children = getItemChildren(item);\n\n itemIds.push(...children.map(child => child.getInstanceId()));\n if (children.length > 0) {\n const childrenInFrame: string[] = [];\n const childrenOutOfFrame: string[] = [];\n\n for (const child of children) {\n const childBox = getItemViewBox(child, containerSize);\n\n if (!childBox.isEmpty() && targetFrame.box.intersectsBox(childBox)) {\n childrenInFrame.push(child.getInstanceId());\n } else {\n childrenOutOfFrame.push(child.getInstanceId());\n }\n }\n if (childrenInFrame.length === 0) {\n this.pendingGroupDetaches.delete(itemId);\n\n return {};\n }\n if (childrenOutOfFrame.length > 0) {\n this.pendingGroupDetaches.set(itemId, {\n groupId: itemId,\n frameId: targetFrame.id,\n childrenOutOfFrame,\n });\n } else {\n this.pendingGroupDetaches.delete(itemId);\n }\n }\n }\n\n // 4. 记录新画板并生成移入变更。\n this.currentFrameIds.set(itemId, targetFrame.id);\n\n return {\n targetFrameId: targetFrame.id,\n change: {\n type: 'moveIn',\n itemIds,\n targetFrameId: targetFrame.id,\n },\n };\n }\n\n /** 清空自动布局指示器和待提交位置。 */\n private clearAutoLayoutVisualState (): void {\n this.autoLayoutIndicator = null;\n this.pendingLayoutPosition = null;\n }\n\n /** 清空自动布局会话状态。 */\n private clearAutoLayoutState (): void {\n this.clearAutoLayoutVisualState();\n this.autoLayoutDragOriginalPosition = null;\n this.autoLayoutDragFrameId = null;\n this.autoLayoutDragItemId = null;\n }\n\n /**\n * 为没有参考元素的位置创建画板边缘指示线。\n * @param frameBox 画板视图包围盒\n * @param layoutPosition 目标行列位置\n * @returns 插入指示线\n */\n private createFallbackIndicatorLine (\n frameBox: Box2,\n layoutPosition: { row: number, column: number },\n ): Line2 {\n if (frameBox.isEmpty()) {\n return new Line2();\n }\n const inset = 10;\n const minX = Math.min(frameBox.min.x + inset, frameBox.max.x);\n const maxX = Math.max(frameBox.max.x - inset, frameBox.min.x);\n const minY = Math.min(frameBox.min.y + inset, frameBox.max.y);\n const maxY = Math.max(frameBox.max.y - inset, frameBox.min.y);\n\n if (layoutPosition.row < 0) {\n return new Line2(new Vector2(minX, minY), new Vector2(maxX, minY));\n }\n if (layoutPosition.row > 0 && layoutPosition.column === 0) {\n return new Line2(new Vector2(minX, maxY), new Vector2(maxX, maxY));\n }\n const x = layoutPosition.column <= 0 ? minX : maxX;\n\n return new Line2(new Vector2(x, minY), new Vector2(x, maxY));\n }\n}\n","import {\n MouseButton,\n type InputEventMouseButton,\n type InputEventMouseMotion,\n type VFXItem,\n} from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport { Gizmo } from '../gizmo';\nimport type { Plane } from '@galacean/effects-math/es/extension/index';\nimport { Box2, roundNumber } from '@galacean/effects-math/es/extension/index';\nimport { Euler, EulerOrder, Matrix4, Vector2, Vector3 } from '../math';\nimport { GestureCursorType } from '../cursor';\nimport {\n GizmoViewportUtils,\n createInteractionPlane,\n viewPositionToWorld,\n} from '../viewport';\nimport { getItemViewBox } from '../items';\nimport { TransformType } from './resize-selection-gizmo';\nimport {\n AssistedLayout,\n type AutoLayoutChangeInfo,\n type SelectionPlacementChange,\n} from '../frame/frame-assisted-layout';\n\n/** 拖动选中对象,并处理吸附、重挂载和自动布局。 */\nexport class MoveSelectionGizmo extends Gizmo {\n readonly type = 'move-selection';\n\n private active = false;\n private selectedItems: VFXItem[] = [];\n private selectionBox = new Box2();\n private interactionPlane: Plane | undefined;\n private startPoint = new Vector2();\n private lastPoint = new Vector2();\n private cursorPoint = new Vector2();\n private lastWorldPosition = new Vector3();\n private assistedLayout: AssistedLayout | undefined;\n\n /**\n * 在选区内按下主键时开始移动交互。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n if (event.buttonIndex !== MouseButton.Left || event.doubleClick || event.shiftPressed) {\n return;\n }\n\n const viewportPoint = new Vector2(event.position.x, event.position.y);\n\n if (!this._owner.getSelection().isPointInSelectedViewBox(viewportPoint)) {\n return;\n }\n\n const selectedItems = this._owner.getSelection().getSelectedPlayerItems();\n\n if (selectedItems.length === 0) {\n return;\n }\n\n // Selection 保证父子节点不会同时入选,交互层直接冻结权威选区。\n this.selectedItems = [...selectedItems];\n this.cursorPoint.copyFrom(viewportPoint);\n this.active = true;\n this.startPoint = new Vector2(event.position.x, event.position.y);\n this.lastPoint.copyFrom(this.startPoint);\n this._owner.setSelectionTransformKind('move');\n this._owner.emit('actionstart', {\n source: this,\n transformType: TransformType.TRANSLATION,\n itemIds: this.selectedItems.map(item => item.getInstanceId()),\n });\n this.assistedLayout = new AssistedLayout(this._owner);\n this.assistedLayout.begin(this.selectedItems);\n event.accept();\n }\n\n /**\n * 忽略未进入拖拽阶段的移动事件。\n * @param _event 鼠标移动事件。\n */\n override onMouseMove (_event: InputEventMouseMotion): void {\n // 选区悬停由 ChangeSelectionGizmo 处理。\n }\n\n /**\n * 移动选中对象并更新布局辅助状态。\n * @param event 鼠标拖拽事件。\n */\n override onMouseDrag (event: InputEventMouseMotion): void {\n if (!this.active) {\n return;\n }\n\n const currentPoint = new Vector2(event.position.x, event.position.y);\n\n this._owner.setCursor({ type: GestureCursorType.NORMAL, angle: 0 });\n\n const shift = new Vector2().subtractVectors(currentPoint, this.lastPoint);\n\n if (this.applyTranslation(shift)) {\n this.lastPoint.copyFrom(currentPoint);\n const pointer = new Vector2(event.position.x, event.position.y);\n const placementChanges = this.assistedLayout?.resolveReparent(pointer) ?? [];\n\n for (const change of placementChanges) {\n this._owner.emit('placementchange', { source: this, ...change });\n }\n if (placementChanges.length > 0) {\n this.cacheSnapTargets();\n }\n this.assistedLayout?.updateAutoLayout(pointer);\n this._owner.emit('actionupdate', {\n source: this,\n transformType: TransformType.TRANSLATION,\n });\n }\n event.accept();\n }\n\n /**\n * 结束移动并提交布局与变换结果。\n * @param event 鼠标抬起事件。\n */\n override onMouseUp (event: InputEventMouseButton): void {\n if (!this.active) {\n return;\n }\n\n const finishResult = this.assistedLayout?.finish();\n\n for (const change of finishResult?.placementChanges ?? []) {\n this._owner.emit('placementchange', { source: this, ...change });\n }\n const actionEvent = {\n source: this,\n transformType: TransformType.TRANSLATION,\n autoLayoutChange: finishResult?.autoLayoutChange,\n };\n\n this._owner.emit('actioncommit', actionEvent);\n this.resetDragState();\n event.accept();\n }\n\n /**\n * 绘制移动过程中的布局辅助信息。\n * @param control 绘制控制器。\n */\n override draw (control: Control): void {\n this.assistedLayout?.draw(control);\n }\n\n /**\n * 将视口位移应用到选中对象。\n * @param shift 本次视口位移。\n * @returns 是否成功应用位移。\n */\n private applyTranslation (shift: Vector2): boolean {\n // 步骤 1:校验位移并准备交互平面。\n if (shift.length() <= 0 || (!this.interactionPlane && !this.prepareTranslationGeometry())) {\n return false;\n }\n\n // 步骤 2:计算当前选区并应用吸附修正。\n const move = shift.clone();\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n const currentSelectionBox = this.computeSelectionBox(containerSize);\n\n if (currentSelectionBox.isEmpty()) {\n return false;\n }\n this.selectionBox.copyFrom(currentSelectionBox);\n\n if (this._owner.getSnapManager().enabled) {\n const previousSnap = new Vector2(\n this._owner.getSnapManager().result.x ?? 0,\n this._owner.getSnapManager().result.y ?? 0,\n );\n\n this._owner.getSnapManager().prepareBox(move, this.selectionBox);\n const snap = new Vector2(\n this._owner.getSnapManager().result.x ?? 0,\n this._owner.getSnapManager().result.y ?? 0,\n );\n\n move.add(previousSnap).subtract(snap);\n }\n\n // 步骤 3:将修正后的视口位置转换为世界坐标。\n const worldPosition = viewPositionToWorld(\n this.cursorPoint.add(move).clone(),\n GizmoViewportUtils.getCameraInfo(this._owner.getEngine()),\n this.interactionPlane!,\n containerSize,\n );\n\n if (!worldPosition) {\n return false;\n }\n\n // 步骤 4:转换为各对象的局部位移并更新变换。\n const translation = worldPosition.clone().subtract(this.lastWorldPosition);\n\n translation.x = roundNumber(translation.x, 5);\n translation.y = roundNumber(translation.y, 5);\n translation.z = roundNumber(translation.z, 5);\n\n for (const item of this.selectedItems) {\n const parentMatrix = new Matrix4().copyFrom(item.transform.getParentMatrix() ?? new Matrix4());\n\n parentMatrix.setPosition(new Vector3());\n const localTranslation = translation.clone().applyMatrix(parentMatrix.invert());\n\n item.translate(...localTranslation.toArray());\n item.transform.updateLocalMatrix();\n }\n this.lastWorldPosition.copyFrom(worldPosition);\n\n return true;\n }\n\n /**\n * 初始化移动所需的选区、吸附目标与交互平面。\n * @returns 是否成功准备交互几何信息。\n */\n private prepareTranslationGeometry (): boolean {\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n const selectionBox = this.computeSelectionBox(containerSize);\n\n if (selectionBox.isEmpty()) {\n return false;\n }\n\n this.selectionBox.copyFrom(selectionBox);\n this.cacheSnapTargets(containerSize);\n this.interactionPlane = createInteractionPlane(new Vector3(), new Euler(0, 0, 0, EulerOrder.XYZ));\n this.lastWorldPosition = viewPositionToWorld(\n this.cursorPoint,\n GizmoViewportUtils.getCameraInfo(this._owner.getEngine()),\n this.interactionPlane,\n containerSize,\n ) ?? new Vector3();\n\n return true;\n }\n\n /**\n * 计算当前可见选中项的视口包围盒。\n * @param containerSize 视口容器尺寸。\n * @returns 选区包围盒。\n */\n private computeSelectionBox (containerSize: Vector2): Box2 {\n const selectionBox = new Box2();\n\n for (const item of this.selectedItems) {\n if (item.isVisible) {\n const box = getItemViewBox(item, containerSize);\n\n if (!box.isEmpty()) {\n selectionBox.union(box);\n }\n }\n }\n\n return selectionBox;\n }\n\n /** 按当前父级关系刷新本次移动可用的吸附目标。 */\n private cacheSnapTargets (containerSize?: Vector2): void {\n const snapManager = this._owner.getSnapManager();\n\n if (!snapManager.enabled) {\n return;\n }\n const engine = this._owner.getEngine();\n\n snapManager.cacheSnapTargetsForSelection(\n engine.sceneServer.compositions[0]?.items ?? [],\n this.selectedItems,\n containerSize ?? GizmoViewportUtils.getContainerSize(engine.canvas.parentElement!),\n );\n }\n\n /** 重置移动交互状态。 */\n private resetDragState (): void {\n if (this._owner.getSelectionTransformKind() === 'move') {\n this._owner.setSelectionTransformKind('idle');\n }\n this.active = false;\n this.selectedItems = [];\n this.selectionBox = new Box2();\n this.interactionPlane = undefined;\n this.startPoint = new Vector2();\n this.lastPoint = new Vector2();\n this.cursorPoint = new Vector2();\n this.lastWorldPosition = new Vector3();\n this.assistedLayout?.cancel();\n this.assistedLayout = undefined;\n this._owner.getSnapManager().reset();\n }\n}\n\nexport type { AutoLayoutChangeInfo, SelectionPlacementChange };\n","import type { GizmoOwner } from '../gizmo-owner';\nimport { BoxSelectionGizmo } from '../gizmos/box-selection-gizmo';\nimport { ChangeSelectionGizmo } from '../gizmos/change-selection-gizmo';\nimport { ClickDragMultiplexGizmo } from '../gizmos/click-drag-multiplex-gizmo';\nimport { MoveSelectionGizmo } from '../gizmos/move-selection-gizmo';\n\n/** 选择交互的可选行为。 */\nexport type SelectionInteractionOptions = {\n /** 是否允许拖拽已选元素进行移动。 */\n allowTransform?: boolean,\n};\n\n/**\n * 创建用于仲裁点击、拖拽和框选的复合 Gizmo。\n * @param owner Gizmo 宿主。\n * @param options 选择交互配置。\n * @returns 选区交互复合 Gizmo。\n */\nexport function createSelectionInteractionGizmo (\n owner: GizmoOwner,\n options: SelectionInteractionOptions = {},\n): ClickDragMultiplexGizmo {\n const dragCandidates = options.allowTransform === false\n ? [new BoxSelectionGizmo(owner)]\n : [new MoveSelectionGizmo(owner), new BoxSelectionGizmo(owner)];\n\n return new ClickDragMultiplexGizmo(owner, {\n clickCandidates: [new ChangeSelectionGizmo(owner)],\n dragCandidates,\n auxiliaryBehavior: new BoxSelectionGizmo(owner, false),\n });\n}\n","import type { Gizmo } from '../gizmo';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport type { GizmoTool } from '../gizmo-tool';\nimport { HandGizmoTool } from '../gizmo-tools/hand-gizmo-tool';\nimport { MoveGizmoTool } from '../gizmo-tools/move-gizmo-tool';\nimport { CornerRotationGizmo } from '../gizmos/corner-rotation-gizmo';\nimport { LeaveEffectsEditGizmo } from '../gizmos/leave-effects-edit-gizmo';\nimport { ResizeSelectionGizmo } from '../gizmos/resize-selection-gizmo';\nimport { getPlayerItemById } from '../items';\nimport { createSelectionInteractionGizmo } from '../selection/create-selection-interaction-gizmo';\nimport type { EditMode } from './edit-mode';\n\n/** 动效内部编辑模式配置。 */\nexport type EffectsEditModeOptions = {\n /** 是否允许子元素移动、缩放和旋转;默认允许。 */\n allowTransform?: boolean,\n};\n\n/** 在单个动效容器内提供子元素选择和变换交互。 */\nexport class EffectsEditMode implements EditMode {\n readonly id = 'effects-edit';\n private readonly allowTransform: boolean;\n\n /**\n * @param owner Gizmo 宿主\n * @param effectsItemId 正在编辑的动效容器实例 ID\n * @param options 编辑模式配置\n */\n constructor (\n private readonly owner: GizmoOwner,\n readonly effectsItemId: string,\n options: EffectsEditModeOptions = {},\n ) {\n this.allowTransform = options.allowTransform !== false;\n }\n\n /**\n * 判断目标工具是否可复用当前动效编辑会话。\n * @param tool 目标工具\n * @returns 是否保持当前模式\n */\n canRemainActiveForTool (tool: GizmoTool): boolean {\n return tool instanceof MoveGizmoTool || tool instanceof HandGizmoTool;\n }\n\n /** 放开当前动效容器的子树选择边界。 */\n onEnter (): void {\n this.owner.getSelection().enterEffectsEditScope(this.effectsItemId);\n }\n\n /** 关闭动效子树选择边界,并恢复选中动效容器。 */\n onExit (): void {\n const selection = this.owner.getSelection();\n\n selection.leaveEffectsEditScope();\n if (getPlayerItemById(this.owner.getEngine().sceneServer.compositions[0], this.effectsItemId)) {\n selection.commitSelectedItems([this.effectsItemId]);\n } else {\n selection.clearSelectedItems();\n }\n }\n\n /** @returns 动效内部编辑使用的 Gizmo 图。 */\n createGizmos (): Gizmo[] {\n const resizeSelection = new ResizeSelectionGizmo(this.owner, { interactive: this.allowTransform });\n const cornerRotation = this.allowTransform\n ? new CornerRotationGizmo(this.owner, resizeSelection)\n : undefined;\n\n return [\n ...(cornerRotation ? [cornerRotation] : []),\n resizeSelection,\n new LeaveEffectsEditGizmo(this.owner),\n createSelectionInteractionGizmo(this.owner, { allowTransform: this.allowTransform }),\n ];\n }\n}\n","import { Gizmo } from '../gizmo';\nimport { MouseButton, type InputEventMouseButton } from '@galacean/effects';\n\n/** 在画布主键按下时退出行内文本编辑。 */\nexport class LeaveTextEditGizmo extends Gizmo {\n readonly type = 'leave-text-edit';\n\n /**\n * 处理主键按下并退出编辑模式。\n * @param event 鼠标按下事件\n */\n override onMouseDown (event: InputEventMouseButton): void {\n if (event.buttonIndex !== MouseButton.Left) {\n return;\n }\n this._owner.resetEditMode();\n event.accept();\n }\n}\n","function _assert_this_initialized(self) {\n if (self === void 0) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n\n return self;\n}\nexport { _assert_this_initialized as _ };\n","import { spec, type InputEventMouseButton } from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport { Gizmo } from '../gizmo';\nimport { GizmoViewportUtils } from '../viewport/viewport-utils';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport { GizmoType } from '../gizmo-type';\nimport { getItemViewBox, getItemViewTransform } from '../items';\nimport { drawCorners, toColor } from '../drawing';\nimport type { TextEditSession, TextInteractionParam, TextResult } from '../text/text-edit-session';\nimport { getTransformedBoxCorners } from '../math';\n\nexport type {\n TextEmptyResult,\n TextInteractionParam,\n TextResult,\n TextValidResult,\n} from '../text/text-edit-session';\n\n/** 文本编辑态包围盒线色。 */\nexport const TEXT_EDIT_BOX_LINE_COLOR = 0x3b82f6;\n/** 文本编辑态包围盒线宽。 */\nexport const TEXT_EDIT_BOX_LINE_WIDTH = 2;\n\n/** 将文本编辑会话投影到画布并绘制编辑框。 */\nexport class TextGizmo extends Gizmo {\n readonly type = GizmoType.TEXT;\n\n result: TextResult = { type: 'empty' };\n private readonly session: TextEditSession;\n private readonly projectionToken = {};\n /**\n * 转发文本输入事件。\n * @param payload 文本输入结果。\n */\n private readonly forwardTextInput = (payload: {\n /** 文本元素 ID。 */\n itemId: string,\n /** 输入后的文本。 */\n text: string,\n /** 当前字体。 */\n fontFamily: string,\n }): void => {\n this._owner.emit('textinput', { source: this, ...payload });\n };\n\n /**\n * @param owner Gizmo 宿主\n * @param session 文本编辑会话\n */\n constructor (owner: GizmoOwner, session: TextEditSession) {\n super(owner);\n this.session = session;\n this.session.attachProjection(this.projectionToken);\n this.session.on('textInput', this.forwardTextInput);\n }\n\n /** 文本编辑使用的 DOM 输入框。 */\n get textAreaElement (): HTMLTextAreaElement {\n return this.session.textAreaElement;\n }\n\n /** 当前文本交互状态。 */\n get interactionParam (): TextInteractionParam {\n return this.session.interactionParam;\n }\n\n /** 是否正在编辑文本。 */\n get isEditing (): boolean {\n return this.session.isEditing;\n }\n\n /** 当前视口缩放。 */\n get viewScale (): number {\n const viewportMatrix = this._owner.getEngine().sceneServer.compositions[0].camera.getViewportMatrix();\n\n return viewportMatrix.elements[0];\n }\n\n /**\n * 保留文本编辑会话的鼠标按下入口。\n * @param _event 鼠标按下事件\n */\n override onMouseDown (_event: InputEventMouseButton): void {\n // 文本指针选择由 SelectTextGizmo 处理。\n }\n\n /**\n * 编辑中接收鼠标抬起事件。\n * @param event 鼠标抬起事件\n */\n override onMouseUp (event: InputEventMouseButton): void {\n if (this.isEditing) {\n event.accept();\n }\n }\n\n /** 更新文本元素的视图包围盒。 */\n override onUpdate (): void {\n const item = this.session.editingItem;\n\n if (item?.type !== spec.ItemType.text || !item.isVisible) {\n this.result = { type: 'empty' };\n this.textAreaElement.style.display = 'none';\n\n return;\n }\n\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n const box = getItemViewBox(item, containerSize);\n const transform = getItemViewTransform(item, containerSize);\n\n this.result = !transform || box.isEmpty()\n ? { type: 'empty' }\n : { type: 'valid', box, transform };\n }\n\n /**\n * 绘制文本编辑框并同步 DOM 输入框。\n * @param control 绘制控制器\n */\n override draw (control?: Control): void {\n this.drawEditBox(control);\n this.session.syncTextArea(this.result, this.viewScale);\n }\n\n /**\n * 选中当前编辑文本的全部内容,并将焦点交给输入框。\n * @returns 当前存在可编辑文本时返回 true\n */\n selectAllText (): boolean {\n return this.session.selectAllText();\n }\n\n /** 脱离文本编辑会话投影。 */\n override dispose (): void {\n this.session.off('textInput', this.forwardTextInput);\n this.session.detachProjection(this.projectionToken);\n super.dispose();\n }\n\n /**\n * 绘制文本编辑包围盒。\n * @param control 绘制控制器\n */\n private drawEditBox (control?: Control): void {\n if (!control || this.result.type !== 'valid') {\n return;\n }\n drawCorners(\n control,\n getTransformedBoxCorners(this.result.transform),\n toColor(TEXT_EDIT_BOX_LINE_COLOR, 1),\n TEXT_EDIT_BOX_LINE_WIDTH,\n );\n }\n}\n","import {\n MouseButton,\n MouseButtonMask,\n spec,\n TextComponent,\n type InputEventMouse,\n type InputEventMouseButton,\n type InputEventMouseMotion,\n type VFXItem,\n} from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport { GestureCursorType } from '../cursor';\nimport { drawDashedCorners, toColor } from '../drawing';\nimport { Gizmo } from '../gizmo';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport { getItemViewTransform, getPlayerItemById } from '../items';\nimport { Vector2, getTransformedBoxCorners } from '../math';\nimport type { TextEditSession } from '../text/text-edit-session';\nimport { GizmoViewportUtils } from '../viewport/viewport-utils';\nimport { TEXT_EDIT_BOX_LINE_COLOR } from './text-gizmo';\n\n/** 在文本编辑模式下悬停、选择并切换文本对象。 */\nexport class SelectTextGizmo extends Gizmo {\n\n readonly type = 'select-text';\n private static readonly HOVER_HIT_RADIUS = 4;\n private static readonly HOVER_LINE_WIDTH = 1;\n private static readonly HOVER_DASH_LENGTH = 4;\n private static readonly HOVER_GAP_LENGTH = 4;\n private _hoverTextId: string | undefined;\n private pointerSelecting = false;\n\n /**\n * 创建文本选择交互。\n * @param owner Gizmo 宿主。\n * @param session 文本编辑会话。\n */\n constructor (\n owner: GizmoOwner,\n private readonly session: TextEditSession,\n ) {\n super(owner);\n }\n\n /** 当前悬停文本的 ID。 */\n get hoverTextId (): string | undefined {\n return this._hoverTextId;\n }\n\n /**\n * 更新文本悬停或拖拽选区。\n * @param event 鼠标移动事件。\n */\n override onMouseMove (event: InputEventMouseMotion): void {\n if (this.pointerSelecting && (event.buttonMask & MouseButtonMask.Left) !== 0) {\n this.session.updatePointerSelection({\n x: event.position.x,\n y: event.position.y,\n });\n this.setTextCursor(event);\n event.accept();\n\n return;\n }\n\n const target = this.resolveTextTarget(\n new Vector2(event.position.x, event.position.y),\n true,\n );\n\n if (!target) {\n this.clearHover();\n\n return;\n }\n\n this._hoverTextId = target.getInstanceId();\n this.setTextCursor(event);\n event.accept();\n }\n\n /**\n * 切换到命中的文本并开始指针选区。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n if (event.buttonIndex !== MouseButton.Left) {\n return;\n }\n\n // 按下仅使用精确命中,避免悬停容差误选相邻文本。\n const target = this.resolveTextTarget(\n new Vector2(event.position.x, event.position.y),\n false,\n false,\n );\n\n if (!target || !this.session.retarget(target, 'focus')) {\n return;\n }\n\n this._hoverTextId = undefined;\n this.pointerSelecting = true;\n this.session.beginPointerSelection({\n x: event.position.x,\n y: event.position.y,\n });\n this._owner.getSelection().commitSelectedItems([target.getInstanceId()]);\n this.setTextCursor(event);\n event.accept();\n }\n\n /**\n * 更新文本指针选区。\n * @param event 鼠标拖拽事件。\n */\n override onMouseDrag (event: InputEventMouseMotion): void {\n if (!this.pointerSelecting) {\n return;\n }\n this.session.updatePointerSelection({\n x: event.position.x,\n y: event.position.y,\n });\n this.setTextCursor(event);\n event.accept();\n }\n\n /**\n * 完成文本指针选区。\n * @param event 鼠标抬起事件。\n */\n override onMouseUp (event: InputEventMouseButton): void {\n if (!this.pointerSelecting) {\n return;\n }\n this.session.finishPointerSelection({\n x: event.position.x,\n y: event.position.y,\n });\n this.pointerSelecting = false;\n this._hoverTextId = undefined;\n this.setTextCursor(event);\n event.accept();\n }\n\n /** 清除离开视口后的文本悬停状态。 */\n override onMouseLeave (): void {\n this.clearHover();\n this._owner.setCursor({ type: GestureCursorType.NORMAL, angle: 0 });\n }\n\n /** 在每帧更新时校验悬停文本是否仍可编辑。 */\n override onUpdate (): void {\n if (!this._hoverTextId) {\n return;\n }\n\n const item = getPlayerItemById(this._owner.getEngine().sceneServer.compositions[0], this._hoverTextId);\n\n if (!this.isTextCandidate(item, true)) {\n this.clearHover();\n }\n }\n\n /**\n * 绘制悬停文本的轮廓。\n * @param control 绘制控制器。\n */\n override draw (control: Control): void {\n if (!this._hoverTextId) {\n return;\n }\n\n const item = getPlayerItemById(this._owner.getEngine().sceneServer.compositions[0], this._hoverTextId);\n\n if (!this.isTextCandidate(item, true)) {\n return;\n }\n\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n const transform = getItemViewTransform(item, containerSize);\n\n if (!transform) {\n return;\n }\n\n drawDashedCorners(\n control,\n getTransformedBoxCorners(transform),\n toColor(TEXT_EDIT_BOX_LINE_COLOR, 1),\n SelectTextGizmo.HOVER_LINE_WIDTH,\n SelectTextGizmo.HOVER_DASH_LENGTH,\n SelectTextGizmo.HOVER_GAP_LENGTH,\n );\n }\n\n /** 释放文本选择交互状态。 */\n override dispose (): void {\n this.pointerSelecting = false;\n this.session.cancelPointerSelection();\n this.clearHover();\n super.dispose();\n }\n\n /**\n * 查找指定位置可编辑的文本对象。\n * @param point 视口坐标。\n * @param excludeEditingItem 是否排除当前编辑对象。\n * @param includeNearby 是否使用悬停命中容差。\n * @returns 命中的文本对象。\n */\n private resolveTextTarget (\n point: Vector2,\n excludeEditingItem: boolean,\n includeNearby = true,\n ): VFXItem | undefined {\n const radius = SelectTextGizmo.HOVER_HIT_RADIUS;\n const diagonal = radius / Math.SQRT2;\n const offsets = includeNearby\n ? [\n [0, 0],\n [radius, 0],\n [-radius, 0],\n [0, radius],\n [0, -radius],\n [diagonal, diagonal],\n [diagonal, -diagonal],\n [-diagonal, diagonal],\n [-diagonal, -diagonal],\n ]\n : [[0, 0]];\n const composition = this._owner.getEngine().sceneServer.compositions[0];\n\n for (const [x, y] of offsets) {\n const hitPoint = new Vector2(point.x + x, point.y + y);\n const target = this._owner.getSelection().hitTest(hitPoint)\n .map(id => getPlayerItemById(composition, id))\n .find(item => this.isTextCandidate(item, excludeEditingItem));\n\n if (target) {\n return target;\n }\n }\n\n return undefined;\n }\n\n /**\n * 判断对象是否可作为文本选择目标。\n * @param item 待检查对象。\n * @param excludeEditingItem 是否排除当前编辑对象。\n * @returns 是否为可选文本对象。\n */\n private isTextCandidate (\n item: VFXItem | undefined,\n excludeEditingItem: boolean,\n ): item is VFXItem {\n return !!item\n && item.isVisible\n && item.type === spec.ItemType.text\n && !!item.getComponent(TextComponent)\n && (!excludeEditingItem || item !== this.session.editingItem);\n }\n\n /** 清除文本悬停目标。 */\n private clearHover (): void {\n this._hoverTextId = undefined;\n }\n\n /**\n * 设置文本编辑光标。\n * @param _event 当前鼠标事件。\n */\n private setTextCursor (_event: InputEventMouse): void {\n this._owner.setCursor({ type: GestureCursorType.TEXT, angle: 0 });\n }\n}\n","import type { VFXItem } from '@galacean/effects';\nimport type { Gizmo } from '../gizmo';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport type { GizmoTool } from '../gizmo-tool';\nimport { HandGizmoTool } from '../gizmo-tools/hand-gizmo-tool';\nimport { MoveGizmoTool } from '../gizmo-tools/move-gizmo-tool';\nimport { LeaveTextEditGizmo } from '../gizmos/leave-text-edit-gizmo';\nimport { SelectTextGizmo } from '../gizmos/select-text-gizmo';\nimport { TextGizmo } from '../gizmos/text-gizmo';\nimport { TextEditSession } from '../text/text-edit-session';\nimport type { TextEditActivation } from '../text/text-edit-session';\nimport type { EditMode } from './edit-mode';\n\n/** 管理行内文本编辑会话和对应 Gizmo 图的编辑模式。 */\nexport class TextEditMode implements EditMode {\n readonly id = 'text-edit';\n private readonly session: TextEditSession;\n\n /**\n * @param owner Gizmo 宿主\n * @param target 入口已校验的待编辑文本元素\n * @param activation 文本框激活方式\n */\n constructor (\n private readonly owner: GizmoOwner,\n private readonly target: VFXItem,\n private readonly activation: TextEditActivation = 'focus',\n ) {\n this.session = new TextEditSession(owner);\n }\n\n /** 当前会话正在编辑的文本元素,随文本选择交互更新。 */\n get editingItem (): VFXItem | undefined {\n return this.session.editingItem;\n }\n\n /**\n * 判断目标工具是否可复用文本编辑会话。\n * @param tool 目标工具\n * @returns 是否保持当前模式\n */\n canRemainActiveForTool (tool: GizmoTool): boolean {\n return tool instanceof MoveGizmoTool || tool instanceof HandGizmoTool;\n }\n\n /** 使用入口确定的目标进入文本编辑,避免旧模式退出时改变选区。 */\n onEnter (): void {\n if (this.session.retarget(this.target, this.activation)) {\n this.owner.getSelection().commitSelectedItems([this.target.getInstanceId()]);\n }\n }\n\n /** 结束文本编辑会话。 */\n onExit (): void {\n this.session.dispose();\n }\n\n /** @returns 文本编辑交互的 Gizmo 图。 */\n createGizmos (): Gizmo[] {\n return [\n new TextGizmo(this.owner, this.session),\n new SelectTextGizmo(this.owner, this.session),\n new LeaveTextEditGizmo(this.owner),\n ];\n }\n}\n","import { MouseButton, spec, TextComponent, type InputEventMouseButton } from '@galacean/effects';\nimport { GestureCursorType } from '../cursor';\nimport { effectsEditModeConfig } from '../configs/builtin-configs';\nimport { Gizmo } from '../gizmo';\nimport { isEffectsPlayerItem } from '../items';\nimport { Vector2 } from '../math';\nimport { EffectsEditMode } from '../modes/effects-edit-mode';\nimport { TextEditMode } from '../modes/text-edit-mode';\n\n/** 识别可编辑元素的双击,并进入对应的编辑模式。 */\nexport class EnterEditModeGizmo extends Gizmo {\n readonly type = 'enter-edit-mode';\n\n /**\n * 双击当前选中的文本或动效元素时进入对应编辑模式。\n * @param event 鼠标按下事件\n */\n override onMouseDown (event: InputEventMouseButton): void {\n if (event.buttonIndex !== MouseButton.Left || !event.doubleClick) {\n return;\n }\n\n const selectedItems = this._owner.getSelection().getSelectedPlayerItems();\n const selectedItem = selectedItems.length === 1 ? selectedItems[0] : undefined;\n\n if (!selectedItem) {\n return;\n }\n\n const selection = this._owner.getSelection();\n const hitIds = selection.filterSelectedItems(\n selection.hitTest(new Vector2(event.position.x, event.position.y)),\n );\n\n if (!hitIds.includes(selectedItem.getInstanceId())) {\n return;\n }\n\n if (selectedItem.type === spec.ItemType.text && selectedItem.getComponent(TextComponent)) {\n this._owner.setActiveEditMode(new TextEditMode(this._owner, selectedItem, 'select'));\n this._owner.setCursor({\n type: GestureCursorType.TEXT,\n angle: 0,\n });\n } else if (isEffectsPlayerItem(selectedItem)) {\n this._owner.setActiveEditMode(new EffectsEditMode(\n this._owner,\n selectedItem.getInstanceId(),\n this._owner.getConfigManager().get(effectsEditModeConfig),\n ));\n } else {\n return;\n }\n\n event.accept();\n }\n}\n","import type { Gizmo } from '../gizmo';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport type { GizmoTool } from '../gizmo-tool';\nimport { HandGizmoTool } from '../gizmo-tools/hand-gizmo-tool';\nimport { MoveGizmoTool } from '../gizmo-tools/move-gizmo-tool';\nimport { CornerRotationGizmo } from '../gizmos/corner-rotation-gizmo';\nimport { EnterEditModeGizmo } from '../gizmos/enter-edit-mode-gizmo';\nimport { ResizeSelectionGizmo } from '../gizmos/resize-selection-gizmo';\nimport { createSelectionInteractionGizmo } from '../selection/create-selection-interaction-gizmo';\nimport type { EditMode } from './edit-mode';\n\n/** 提供默认选区切换、移动、缩放和旋转交互的编辑模式。 */\nexport class DefaultSelectionMode implements EditMode {\n readonly id = 'default-selection';\n\n /** @param owner Gizmo 宿主 */\n constructor (private readonly owner: GizmoOwner) {}\n\n /**\n * 判断目标工具是否可复用当前模式。\n * @param tool 目标工具\n * @returns 是否保持当前模式\n */\n canRemainActiveForTool (tool: GizmoTool): boolean {\n return tool instanceof MoveGizmoTool || tool instanceof HandGizmoTool;\n }\n\n /** @returns 默认选区交互的 Gizmo 图。 */\n createGizmos (): Gizmo[] {\n const resizeSelection = new ResizeSelectionGizmo(this.owner);\n const cornerRotation = new CornerRotationGizmo(this.owner, resizeSelection);\n\n return [\n cornerRotation,\n resizeSelection,\n new EnterEditModeGizmo(this.owner),\n createSelectionInteractionGizmo(this.owner),\n ];\n }\n}\n","import { Box2, Line2 } from '@galacean/effects-math/es/extension/index';\nimport { isEqual, RAD2DEG, Vector2, getBoxCorners, getTransformedBoxCorners, inverseTransformBoxPoint, scaleBox, setBoxFromPoints, transformedBoxContainsPoint, type Matrix3 } from '../math';\nimport type { ImageCutConfig } from '../configs/types';\nimport { imageCutConfig } from '../configs/builtin-configs';\nimport type { VFXItem } from '@galacean/effects';\nimport { MouseButton, MouseButtonMask, type InputEventKey, type InputEventMouseButton, type InputEventMouseMotion } from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport { Gizmo } from '../gizmo';\nimport { GizmoViewportUtils } from '../viewport/viewport-utils';\nimport { GizmoType } from '../gizmo-type';\nimport { GestureCursorType, type GestureCursorResult } from '../cursor';\nimport { ImageInteractionType, type ImageDirectionScaleParam, type ImageMoveParam, type ImageNoneParam } from './image-interaction';\nimport { getItemViewBox, getItemViewTransform } from '../items';\nimport { toColor, drawCorners, fillBoxByCorners } from '../drawing';\n\n/**\n * 图片裁切工具结果\n */\nexport type ImageCutResult = {\n /** 归一化裁切盒,不依赖渲染帧投影。 */\n normalizeCutBox: Box2,\n};\n\n/** 图片裁剪在当前视口中的几何。 */\ntype ImageCutGeometry = {\n /** 图片元素包围盒。 */\n itemBox: Box2,\n /** 图片归一化 Box2 到视图的变换。 */\n boxTransform: Matrix3,\n};\n\n/**\n * 图片裁切缩放交互参数\n */\nexport type ImageCutScaleParam = {\n /** 交互类型 */\n type: ImageInteractionType.SCALE,\n /** 归一化裁切框 */\n box: Box2,\n /** 锚点(对角点) */\n anchor: Vector2,\n /** 归一化起始鼠标位置 */\n startMouse: Vector2,\n /** 归一化起始角点 */\n startCorner: Vector2,\n /** 锁定的宽高比 */\n lockedAspect?: number,\n};\n\n/**\n * 图片裁切交互参数\n */\nexport type ImageCutInteractionParam = ImageNoneParam | ImageCutScaleParam | ImageDirectionScaleParam | ImageMoveParam;\n\n/**\n * 裁剪工具交互类型\n */\nexport type ImageCutInteractionType = ImageInteractionType;\n\n/** 在图片元素范围内移动或缩放归一化裁剪框。 */\nexport class ImageCutGizmo extends Gizmo {\n result: ImageCutResult = {\n normalizeCutBox: new Box2(new Vector2(), new Vector2(1, 1)),\n };\n\n interactionParam: ImageCutInteractionParam = { type: ImageInteractionType.NONE };\n\n readonly type = GizmoType.IMAGE_CUT;\n\n /** 光标结果。 */\n cursorResult: GestureCursorResult = {\n type: GestureCursorType.NORMAL,\n angle: 0,\n };\n\n /** 仅供当前渲染帧使用的几何快照;输入不读取它。 */\n private renderGeometry?: ImageCutGeometry;\n\n private _isLockScale = false;\n\n private mouseGrabbed = false;\n\n /** 当前图片裁剪配置。 */\n get config (): Readonly<ImageCutConfig> {\n return this._owner.getConfigManager().get(imageCutConfig);\n }\n\n /** 当前选中的元素(直读 selection.getSelectedPlayerItems:id→VFXItem 已解析)。 */\n get selectedItems (): VFXItem[] {\n return this._owner.getSelection().getSelectedPlayerItems();\n }\n\n /** 是否锁定宽高比缩放。 */\n get isLockScale () {\n return this._isLockScale;\n }\n\n /**\n * 设置是否锁定宽高比缩放。\n * @param state 是否锁定宽高比。\n */\n set isLockScale (state: boolean) {\n if (state === this.isLockScale) {\n return;\n }\n\n this._isLockScale = state;\n }\n\n /**\n * 更新裁剪框交互或悬停状态。\n * @param event 鼠标移动事件。\n */\n override onMouseMove (event: InputEventMouseMotion): void {\n if (!this.isApplicableSelection()) {\n return;\n }\n if (this.mouseGrabbed) {\n const handled = this.updateGrab(event);\n\n this._owner.setCursor(this.cursorResult);\n if (handled) {\n event.accept();\n }\n\n return;\n }\n const hover = this._owner.getMousePosition();\n const inputPosition = new Vector2(event.position.x, event.position.y);\n\n this.refreshInteractionType(hover, inputPosition);\n this._owner.setCursor(this.cursorResult);\n if (event.buttonMask === MouseButtonMask.None\n && (this.interactionParam.type === ImageInteractionType.SCALE\n || this.interactionParam.type === ImageInteractionType.DIRECTION_SCALE)) {\n event.accept();\n }\n }\n\n /**\n * 继续当前裁剪框拖拽。\n * @param event 鼠标拖拽事件。\n */\n override onMouseDrag (event: InputEventMouseMotion): void {\n if (!this.isApplicableSelection() || !this.mouseGrabbed) {\n return;\n }\n const handled = this.updateGrab(event);\n\n this._owner.setCursor(this.cursorResult);\n this._owner.emit('actionupdate', {\n source: this,\n });\n if (handled) {\n event.accept();\n }\n }\n\n /** 鼠标离开交互层:清交互类型(拖拽中不清)。 */\n override onMouseLeave (): void {\n if (!this.isApplicableSelection()) {\n return;\n }\n if (this.mouseGrabbed) {\n this._owner.setCursor(this.cursorResult);\n\n return;\n }\n this.interactionParam = { type: ImageInteractionType.NONE };\n this.refreshCursorResult(ImageInteractionType.NONE);\n this._owner.setCursor(this.cursorResult);\n }\n\n /**\n * 命中裁剪框交互区域时开始操作。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n if (!this.isApplicableSelection()) {\n return;\n }\n if (event.buttonIndex !== MouseButton.Left) {\n return;\n }\n const mouse = new Vector2(event.position.x, event.position.y);\n const inputPosition = new Vector2(event.position.x, event.position.y);\n\n this.refreshInteractionType(mouse, inputPosition);\n this._owner.setCursor(this.cursorResult);\n if (this.interactionParam.type === ImageInteractionType.NONE) {\n return;\n }\n\n this.mouseGrabbed = true;\n this._owner.emit('actionstart', { source: this });\n\n event.accept();\n }\n\n /**\n * 结束裁剪框操作并提交结果。\n * @param event 鼠标抬起事件。\n */\n override onMouseUp (event: InputEventMouseButton): void {\n if (!this.mouseGrabbed) {\n return;\n }\n this.mouseGrabbed = false;\n\n const mouse = new Vector2(event.position.x, event.position.y);\n const inputPosition = new Vector2(event.position.x, event.position.y);\n\n this.refreshInteractionType(mouse, inputPosition);\n this._owner.setCursor(this.cursorResult);\n\n this._owner.emit('actioncommit', { source: this });\n\n event.accept();\n }\n\n /**\n * 键盘松开:清除当前交互的锁定宽高比(下次拖拽重新算)。\n * @param _keyCode 键盘事件\n */\n override onKeyUp (_keyCode: InputEventKey): void {\n if ('lockedAspect' in this.interactionParam) {\n delete this.interactionParam.lockedAspect;\n }\n }\n\n /** 为本帧绘制创建裁剪投影。 */\n override onUpdate (): void {\n this.renderGeometry = this.getSelectionGeometry();\n }\n\n /**\n * 绘制裁剪蒙版、网格、边框与角点。\n * @param control 绘制控制器。\n */\n override draw (control: Control) {\n // 步骤 1:读取本帧投影与绘制配置。\n const geometry = this.renderGeometry;\n\n if (!geometry) {\n return;\n }\n\n const {\n maskColor,\n maskAlpha,\n cutBoxLineWidth,\n cutBoxLineColor,\n cutBoxLineAlpha,\n itemBoxLineWidth,\n itemBoxLineColor,\n itemBoxLineAlpha,\n cutBoxCornerRadius,\n cutBoxCornerFillColor,\n cutBoxCornerLineWidth,\n cutBoxCornerLineColor,\n cutBoxCornerLineAlpha,\n gridLineWidth,\n gridLineColor,\n gridLineAlpha,\n gridCount,\n } = this.config;\n\n const itemCorners = getTransformedBoxCorners(geometry.boxTransform);\n const cutCorners = getTransformedBoxCorners(geometry.boxTransform, this.result.normalizeCutBox);\n\n // 步骤 2:绘制裁剪区域外的蒙版。\n const maskFill = toColor(maskColor, maskAlpha);\n\n fillBoxByCorners(control, [itemCorners[0], itemCorners[1], cutCorners[1], cutCorners[0]], maskFill);\n fillBoxByCorners(control, [itemCorners[1], itemCorners[2], cutCorners[2], cutCorners[1]], maskFill);\n fillBoxByCorners(control, [itemCorners[2], itemCorners[3], cutCorners[3], cutCorners[2]], maskFill);\n fillBoxByCorners(control, [itemCorners[3], itemCorners[0], cutCorners[0], cutCorners[3]], maskFill);\n\n // 步骤 3:绘制裁剪辅助网格。\n const gridColor = toColor(gridLineColor, gridLineAlpha);\n\n for (let i = 1; i <= gridCount; i++) {\n const ratio = i / (gridCount + 1);\n const top = cutCorners[0].clone().add(cutCorners[1].clone().subtract(cutCorners[0]).multiply(ratio));\n const bottom = cutCorners[3].clone().add(cutCorners[2].clone().subtract(cutCorners[3]).multiply(ratio));\n const left = cutCorners[0].clone().add(cutCorners[3].clone().subtract(cutCorners[0]).multiply(ratio));\n const right = cutCorners[1].clone().add(cutCorners[2].clone().subtract(cutCorners[1]).multiply(ratio));\n\n control.drawLine(top.x, top.y, bottom.x, bottom.y, gridColor, gridLineWidth);\n control.drawLine(left.x, left.y, right.x, right.y, gridColor, gridLineWidth);\n }\n\n // 步骤 4:绘制元素、裁剪框和角点。\n drawCorners(control, itemCorners, toColor(itemBoxLineColor, itemBoxLineAlpha), itemBoxLineWidth);\n drawCorners(control, cutCorners, toColor(cutBoxLineColor, cutBoxLineAlpha), cutBoxLineWidth);\n const cornerFill = toColor(cutBoxCornerFillColor, 1);\n const cornerStroke = toColor(cutBoxCornerLineColor, cutBoxCornerLineAlpha);\n\n cutCorners.forEach(corner => {\n control.fillCircle(corner.x, corner.y, cutBoxCornerRadius, cornerFill);\n control.drawCircle(corner.x, corner.y, cutBoxCornerRadius, cornerStroke, cutBoxCornerLineWidth);\n });\n }\n\n /**\n * 刷新指针结果。\n * @param activeType 交互类型\n * @param angle 指针方向\n */\n refreshCursorResult (activeType: ImageCutInteractionType, angle = 0) {\n switch (activeType) {\n case ImageInteractionType.SCALE: {\n this.cursorResult = {\n type: GestureCursorType.SCALE,\n angle,\n };\n\n break;\n }\n case ImageInteractionType.DIRECTION_SCALE: {\n this.cursorResult = {\n type: GestureCursorType.SCALE,\n angle,\n };\n\n break;\n }\n case ImageInteractionType.MOVE:\n case ImageInteractionType.NONE: {\n this.cursorResult = {\n type: GestureCursorType.NORMAL,\n angle: 0,\n };\n\n break;\n }\n }\n }\n\n /**\n * 获取当前裁切信息(裁切框 + 元素包围盒)。\n * @returns 裁切信息对象,不可交互时返回 undefined\n */\n getCutInfo () {\n const geometry = this.getSelectionGeometry();\n\n if (!geometry) {\n return undefined;\n }\n\n return {\n cutBox: this.result.normalizeCutBox.clone(),\n itemBox: geometry.itemBox,\n };\n }\n\n /**\n * 获取归一化裁切包围盒(min/max 取值 [0, 1],相对元素包围盒)。\n */\n getCutBox () {\n if (!this.isApplicableSelection()) {\n return undefined;\n }\n\n return this.result.normalizeCutBox.clone();\n }\n\n /**\n * 设置归一化裁切包围盒(入参为归一化坐标,钳制到 [0, 1])。\n * @param normalizeBox 归一化裁切包围盒\n * @returns 设置成功时返回更新后的裁切框,不可交互时返回 undefined\n */\n setCutBox (normalizeBox: Box2) {\n if (!this.isApplicableSelection()) {\n return undefined;\n }\n\n this.result.normalizeCutBox.copyFrom(normalizeBox);\n\n return this.result.normalizeCutBox.clone();\n }\n\n /** @returns 是否仅选中了一个可裁剪元素。 */\n private isApplicableSelection (): boolean {\n return this._owner.getSelection().getSelectedPlayerItems().length === 1;\n }\n\n /**\n * drag:按交互类型处理裁切框移动/缩放/单向缩放。\n * 支持 shift 锁定宽高比,结果以归一化裁切盒写入 result。\n * @param event 鼠标事件(drag)\n */\n private updateGrab (event: InputEventMouseMotion): boolean {\n // 步骤 1:校验当前交互会话。\n if (!this.mouseGrabbed) {\n return false;\n }\n if (this.interactionParam.type === ImageInteractionType.NONE) {\n return true;\n }\n\n // 步骤 2:获取实时投影并计算指针位移。\n const geometry = this.getSelectionGeometry();\n\n if (!geometry) {\n return true;\n }\n\n const currentInputPosition = inverseTransformBoxPoint(geometry.boxTransform, new Vector2(event.position.x, event.position.y));\n const { startMouse, box } = this.interactionParam;\n const shift = new Vector2().subtractVectors(currentInputPosition, startMouse);\n const itemBoxMin = new Vector2();\n const itemBoxMax = new Vector2(1, 1);\n\n // 步骤 3:按移动、角点缩放或边缩放更新归一化裁剪框。\n switch (this.interactionParam.type) {\n case ImageInteractionType.MOVE: {\n const { min: originMin, max: originMax } = box;\n\n const xMinShift = itemBoxMin.x - originMin.x;\n const xMaxShift = itemBoxMax.x - originMax.x;\n const yMinShift = itemBoxMin.y - originMin.y;\n const yMaxShift = itemBoxMax.y - originMax.y;\n\n shift.x = Math.min(Math.max(shift.x, xMinShift), xMaxShift);\n shift.y = Math.min(Math.max(shift.y, yMinShift), yMaxShift);\n\n const resultBox = box.clone().translate(shift);\n\n this.result.normalizeCutBox = resultBox;\n\n break;\n }\n case ImageInteractionType.SCALE: {\n const { startCorner, anchor } = this.interactionParam;\n const resultCorner = new Vector2();\n\n resultCorner.x = Math.min(Math.max(startCorner.x + shift.x, itemBoxMin.x), itemBoxMax.x);\n resultCorner.y = Math.min(Math.max(startCorner.y + shift.y, itemBoxMin.y), itemBoxMax.y);\n\n if (event.shiftPressed || this.isLockScale) {\n const cornerSignFactor = (startCorner.x - anchor.x) * (startCorner.y - anchor.y) >= 0 ? 1 : -1;\n const { x: boxWidth, y: boxHeight } = this.result.normalizeCutBox.getSize();\n const { x: originWidth, y: originHeight } = box.getSize();\n\n this.interactionParam.lockedAspect ??= boxWidth / boxHeight;\n\n if (Math.abs(resultCorner.x - anchor.x) / originWidth > Math.abs(resultCorner.y - anchor.y) / originHeight) {\n const resultSignFactor = Math.abs(resultCorner.x - anchor.x) / (resultCorner.x - anchor.x);\n const resultHeight = Math.abs(resultCorner.x - anchor.x) / this.interactionParam.lockedAspect;\n\n if (isEqual(startCorner.y, anchor.y)) {\n resultCorner.y = startCorner.y;\n } else {\n resultCorner.y = resultSignFactor * cornerSignFactor * resultHeight + anchor.y;\n }\n resultCorner.y = Math.min(Math.max(resultCorner.y, itemBoxMin.y), itemBoxMax.y);\n const shiftY = resultCorner.y - anchor.y;\n\n if (isEqual(startCorner.y, anchor.y)) {\n resultCorner.x = startCorner.x;\n } else {\n resultCorner.x = cornerSignFactor * shiftY * this.interactionParam.lockedAspect + anchor.x;\n }\n } else {\n const resultWidth = Math.abs(resultCorner.y - anchor.y) * this.interactionParam.lockedAspect;\n const resultSignFactor = Math.abs(resultCorner.y - anchor.y) / (resultCorner.y - anchor.y);\n\n if (isEqual(startCorner.x, anchor.x)) {\n resultCorner.x = startCorner.x;\n } else {\n resultCorner.x = resultSignFactor * cornerSignFactor * resultWidth + anchor.x;\n }\n resultCorner.x = Math.min(Math.max(resultCorner.x, itemBoxMin.x), itemBoxMax.x);\n const shiftX = resultCorner.x - anchor.x;\n\n if (isEqual(startCorner.x, anchor.x)) {\n resultCorner.y = startCorner.y;\n } else {\n resultCorner.y = cornerSignFactor * shiftX / this.interactionParam.lockedAspect + anchor.y;\n }\n }\n }\n\n if (isEqual(startCorner.x, anchor.x) || isEqual(startCorner.y, anchor.y)) {\n const boxCorners = getBoxCorners(box);\n const farthestCorner = boxCorners[0].clone();\n let length = farthestCorner.distance(startCorner);\n\n boxCorners.forEach(corner => {\n if (corner.distance(startCorner) > length) {\n farthestCorner.copyFrom(corner);\n length = corner.distance(startCorner);\n }\n });\n\n this.result.normalizeCutBox = setBoxFromPoints(new Box2(), [farthestCorner, resultCorner]);\n } else {\n const xScalar = (resultCorner.x - anchor.x) / (startCorner.x - anchor.x);\n const yScalar = (resultCorner.y - anchor.y) / (startCorner.y - anchor.y);\n\n const scalar = new Vector2(xScalar, yScalar);\n\n this.result.normalizeCutBox = scaleBox(box.clone(), scalar, anchor);\n }\n\n break;\n }\n case ImageInteractionType.DIRECTION_SCALE: {\n const { index } = this.interactionParam;\n const { x: boxWidth, y: boxHeight } = this.result.normalizeCutBox.getSize();\n\n this.interactionParam.lockedAspect ??= boxWidth / boxHeight;\n const boxCorners = getBoxCorners(box);\n const startPoint = boxCorners[index].clone();\n const nextCorner = boxCorners[(index + 1) % 4].clone();\n\n // 四角固定顺序中偶数索引是水平边、奇数索引是竖直边。\n const shiftDirection = index % 2 === 0 ? 'y' : 'x';\n\n if (shiftDirection === 'x') {\n shift.x = Math.min(Math.max(startPoint.x + shift.x, itemBoxMin.x), itemBoxMax.x) - startPoint.x;\n if (event.shiftPressed || this.isLockScale) {\n shift.y = shift.x / this.interactionParam.lockedAspect;\n const resuleTargetCornerY = nextCorner.y + shift.y;\n const clampResultCornerY = Math.min(Math.max(resuleTargetCornerY, itemBoxMin.y), itemBoxMax.y);\n\n shift.y = clampResultCornerY - nextCorner.y;\n shift.x = shift.y * this.interactionParam.lockedAspect;\n } else {\n shift.y = 0;\n }\n } else {\n shift.y = Math.min(Math.max(startPoint.y + shift.y, itemBoxMin.y), itemBoxMax.y) - startPoint.y;\n if (event.shiftPressed || this.isLockScale) {\n shift.x = -shift.y * this.interactionParam.lockedAspect;\n const resuleTargetCornerX = nextCorner.x + shift.x;\n const clampResultCornerX = Math.min(Math.max(resuleTargetCornerX, itemBoxMin.x), itemBoxMax.x);\n\n shift.x = clampResultCornerX - nextCorner.x;\n shift.y = -shift.x / this.interactionParam.lockedAspect;\n } else {\n shift.x = 0;\n }\n }\n\n const resultCorners: Vector2[] = [];\n\n boxCorners.forEach((corner, i) => {\n const resultCorner = new Vector2();\n\n if (index === i) {\n if (shiftDirection === 'y') {\n resultCorner.copyFrom(corner.clone().add(new Vector2(0, shift.y)));\n } else {\n resultCorner.copyFrom(corner.clone().add(new Vector2(shift.x, 0)));\n }\n } else if (index === (i + 3) % 4) {\n resultCorner.copyFrom(corner.clone().add(shift));\n } else if (index === (i + 2) % 4) {\n if (shiftDirection === 'x') {\n resultCorner.copyFrom(corner.clone().add(new Vector2(0, shift.y)));\n } else {\n resultCorner.copyFrom(corner.clone().add(new Vector2(shift.x, 0)));\n }\n } else {\n resultCorner.copyFrom(corner.clone());\n }\n resultCorners.push(resultCorner);\n });\n this.result.normalizeCutBox = setBoxFromPoints(new Box2(), resultCorners);\n\n break;\n }\n default:\n break;\n }\n\n return true;\n }\n\n /** @returns 当前图片与裁剪框的视口投影。 */\n private getSelectionGeometry (): ImageCutGeometry | undefined {\n const selectedItems = this.selectedItems;\n\n if (selectedItems.length !== 1) {\n return undefined;\n }\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n const boxTransform = getItemViewTransform(selectedItems[0], containerSize);\n\n if (!boxTransform) {\n return undefined;\n }\n const itemBox = getItemViewBox(selectedItems[0], containerSize);\n\n return {\n itemBox,\n boxTransform,\n };\n }\n\n /**\n * 根据鼠标位置判定裁切框的交互类型(角点缩放/边线单向缩放/整体移动),\n * 同时刷新光标方向。\n * @param point 视图坐标鼠标位置\n * @param inputPosition Control 本地坐标鼠标位置\n */\n private refreshInteractionType (point: Vector2, inputPosition: Vector2) {\n // 步骤 1:重置交互状态并获取实时裁剪投影。\n this.interactionParam = {\n type: ImageInteractionType.NONE,\n };\n\n const geometry = this.getSelectionGeometry();\n\n if (!geometry) {\n return;\n }\n\n const itemCorners = getTransformedBoxCorners(geometry.boxTransform);\n const cutCorners = getTransformedBoxCorners(geometry.boxTransform, this.result.normalizeCutBox);\n let hasInteractionType = false;\n let angle = 0;\n\n // 步骤 2:优先检测角点缩放。\n cutCorners.forEach((corner, index) => {\n if (hasInteractionType) {\n return;\n }\n if (corner.distance(point) < this.config.scaleInteractionDistance) {\n hasInteractionType = true;\n this.interactionParam = {\n type: ImageInteractionType.SCALE,\n box: this.result.normalizeCutBox.clone(),\n startMouse: inverseTransformBoxPoint(geometry.boxTransform, inputPosition),\n startCorner: getBoxCorners(this.result.normalizeCutBox)[index],\n anchor: getBoxCorners(this.result.normalizeCutBox)[(index + 2) % 4],\n };\n\n const rotation = Math.atan2(itemCorners[1].y - itemCorners[0].y, itemCorners[1].x - itemCorners[0].x);\n\n angle = Math.PI / 2 * ((index + 3) % 4) + rotation;\n }\n });\n\n // 步骤 3:其次检测边缘单向缩放。\n cutCorners.forEach((corner, index) => {\n if (hasInteractionType) {\n return;\n }\n const edge = new Line2(corner.clone(), cutCorners[(index + 1) % 4]);\n const t = edge.distanceSq() === 0 ? 0 : edge.closestPointToPointParameter(point, true);\n const dis = { d: edge.at(t).distance(point), t };\n\n const state = dis.d >= 0 && dis.d <= 8 && dis.t >= 0 && dis.t <= 1;\n\n if (state) {\n hasInteractionType = true;\n this.interactionParam = {\n type: ImageInteractionType.DIRECTION_SCALE,\n index,\n box: this.result.normalizeCutBox.clone(),\n startMouse: inverseTransformBoxPoint(geometry.boxTransform, inputPosition),\n };\n const rotation = Math.atan2(itemCorners[1].y - itemCorners[0].y, itemCorners[1].x - itemCorners[0].x);\n\n angle = Math.PI / 2 * ((index + 3) % 4) + Math.PI / 4 + rotation;\n }\n });\n\n // 步骤 4:最后检测裁剪区域整体移动并刷新光标。\n if (transformedBoxContainsPoint(geometry.boxTransform, point, this.result.normalizeCutBox) && !hasInteractionType) {\n this.interactionParam = {\n type: ImageInteractionType.MOVE,\n box: this.result.normalizeCutBox.clone(),\n startMouse: inverseTransformBoxPoint(geometry.boxTransform, inputPosition),\n };\n\n hasInteractionType = true;\n }\n\n this.refreshCursorResult(this.interactionParam.type, angle * RAD2DEG);\n }\n}\n","import type { Gizmo } from '../gizmo';\nimport { GizmoTool } from '../gizmo-tool';\nimport { ImageCutGizmo } from '../gizmos/image-cut-gizmo';\n\n/** 图片裁切工具。 */\nexport class ImageCutGizmoTool extends GizmoTool {\n /** @returns 图片裁切 Gizmo 图。 */\n override createGizmos (): Gizmo[] {\n return [new ImageCutGizmo(this.owner)];\n }\n}\n","import { Box2, Line2 } from '@galacean/effects-math/es/extension/index';\nimport { RAD2DEG, Vector2, getBoxCorners, getTransformedBoxCorners, inverseTransformBoxPoint, setBoxFromPoints, transformedBoxContainsPoint, type Matrix3 } from '../math';\nimport type { ImageExpandConfig } from '../configs/types';\nimport { imageExpandConfig } from '../configs/builtin-configs';\nimport type { VFXItem } from '@galacean/effects';\nimport { MouseButton, MouseButtonMask, type InputEventKey, type InputEventMouseButton, type InputEventMouseMotion } from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport { Gizmo } from '../gizmo';\nimport { GizmoViewportUtils } from '../viewport/viewport-utils';\nimport { GizmoType } from '../gizmo-type';\nimport { GestureCursorType, type GestureCursorResult } from '../cursor';\nimport { ImageInteractionType, type ImageDirectionScaleParam, type ImageMoveParam, type ImageNoneParam } from './image-interaction';\nimport { getItemViewBox, getItemViewTransform } from '../items';\nimport { toColor, drawCorners, fillBoxByCorners } from '../drawing';\n\n/**\n * 图片扩边缩放交互参数\n */\nexport type ImageExpandScaleParam = {\n /** 交互类型 */\n type: ImageInteractionType.SCALE,\n /** 归一化扩边框 */\n box: Box2,\n /** 起始角点索引 */\n index: number,\n /** 归一化起始鼠标位置 */\n startMouse: Vector2,\n /** 锁定的宽高比 */\n lockedAspect?: number,\n};\n\n/**\n * 图片扩边交互参数\n */\nexport type ImageExpandInteractionParam = ImageNoneParam | ImageExpandScaleParam | ImageDirectionScaleParam | ImageMoveParam;\n\n/** 图片扩边交互类型。 */\nexport type ImageExpandInteractionType = ImageInteractionType;\n\n/**\n * 图片扩边工具结果\n */\nexport type ImageExpandResult = {\n /** 当前归一化扩边框。 */\n normalizeExpandBox: Box2,\n};\n\n/** 图片扩边在当前视口中的几何。 */\ntype ImageExpandGeometry = {\n /** 图片元素包围盒。 */\n itemBox: Box2,\n /** 图片归一化 Box2 到视图的变换。 */\n boxTransform: Matrix3,\n};\n\n/** 在图片范围外移动或缩放归一化扩边框。 */\nexport class ImageExpandGizmo extends Gizmo {\n result: ImageExpandResult = {\n normalizeExpandBox: new Box2(new Vector2(), new Vector2(1, 1)),\n };\n\n interactionParam: ImageExpandInteractionParam = { type: ImageInteractionType.NONE };\n\n readonly type = GizmoType.IMAGE_EXPAND;\n\n /** 光标结果。 */\n cursorResult: GestureCursorResult = {\n type: GestureCursorType.NORMAL,\n angle: 0,\n };\n\n private renderGeometry?: ImageExpandGeometry;\n\n private _isLockScale = false;\n\n private mouseGrabbed = false;\n\n /** 当前图片扩边配置。 */\n get config (): Readonly<ImageExpandConfig> {\n return this._owner.getConfigManager().get(imageExpandConfig);\n }\n\n /** 当前选中的元素(直读 selection.getSelectedPlayerItems:id→VFXItem 已解析)。 */\n get selectedItems (): VFXItem[] {\n return this._owner.getSelection().getSelectedPlayerItems();\n }\n\n /** 是否锁定宽高比缩放。 */\n get isLockScale () {\n return this._isLockScale;\n }\n\n /**\n * 设置是否锁定宽高比缩放。\n * @param state 是否锁定宽高比。\n */\n set isLockScale (state: boolean) {\n if (state === this.isLockScale) {\n return;\n }\n\n this._isLockScale = state;\n }\n\n /**\n * 更新扩边框交互或悬停状态。\n * @param event 鼠标移动事件。\n */\n override onMouseMove (event: InputEventMouseMotion): void {\n if (!this.isApplicableSelection()) {\n return;\n }\n if (this.mouseGrabbed) {\n const handled = this.updateGrab(event);\n\n this._owner.setCursor(this.cursorResult);\n if (handled) {\n event.accept();\n }\n\n return;\n }\n const hover = this._owner.getMousePosition();\n const inputPosition = new Vector2(event.position.x, event.position.y);\n\n this.refreshInteractionType(hover, inputPosition);\n this._owner.setCursor(this.cursorResult);\n if (event.buttonMask === MouseButtonMask.None\n && (this.interactionParam.type === ImageInteractionType.SCALE\n || this.interactionParam.type === ImageInteractionType.DIRECTION_SCALE)) {\n event.accept();\n }\n }\n\n /**\n * 继续当前扩边框拖拽。\n * @param event 鼠标拖拽事件。\n */\n override onMouseDrag (event: InputEventMouseMotion): void {\n if (!this.isApplicableSelection() || !this.mouseGrabbed) {\n return;\n }\n const handled = this.updateGrab(event);\n\n this._owner.setCursor(this.cursorResult);\n this._owner.emit('actionupdate', {\n source: this,\n });\n if (handled) {\n event.accept();\n }\n }\n\n /** 鼠标离开交互层:清交互类型(拖拽中不清)。 */\n override onMouseLeave (): void {\n if (!this.isApplicableSelection()) {\n return;\n }\n if (this.mouseGrabbed) {\n this._owner.setCursor(this.cursorResult);\n\n return;\n }\n this.interactionParam = { type: ImageInteractionType.NONE };\n this.refreshCursorResult(ImageInteractionType.NONE);\n this._owner.setCursor(this.cursorResult);\n }\n\n /**\n * 命中扩边框交互区域时开始操作。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n if (!this.isApplicableSelection()) {\n return;\n }\n if (event.buttonIndex !== MouseButton.Left) {\n return;\n }\n const mouse = new Vector2(event.position.x, event.position.y);\n const inputPosition = new Vector2(event.position.x, event.position.y);\n\n this.refreshInteractionType(mouse, inputPosition);\n this._owner.setCursor(this.cursorResult);\n if (this.interactionParam.type === ImageInteractionType.NONE) {\n return;\n }\n\n this.mouseGrabbed = true;\n this._owner.emit('actionstart', { source: this });\n\n event.accept();\n }\n\n /**\n * 结束扩边框操作并提交结果。\n * @param event 鼠标抬起事件。\n */\n override onMouseUp (event: InputEventMouseButton): void {\n if (!this.mouseGrabbed) {\n return;\n }\n this.mouseGrabbed = false;\n\n const mouse = new Vector2(event.position.x, event.position.y);\n const inputPosition = new Vector2(event.position.x, event.position.y);\n\n this.refreshInteractionType(mouse, inputPosition);\n this._owner.setCursor(this.cursorResult);\n\n this._owner.emit('actioncommit', { source: this });\n\n event.accept();\n }\n\n /**\n * 键盘松开:清除当前交互的锁定宽高比(下次拖拽重新算)。\n * @param _keyCode 键盘事件\n */\n override onKeyUp (_keyCode: InputEventKey): void {\n if ('lockedAspect' in this.interactionParam) {\n delete this.interactionParam.lockedAspect;\n }\n }\n\n /** 为本帧绘制创建扩边投影。 */\n override onUpdate (): void {\n this.renderGeometry = this.getSelectionGeometry();\n }\n\n /**\n * 绘制扩边蒙版、网格、边框与角点。\n * @param control 绘制控制器。\n */\n override draw (control: Control) {\n // 步骤 1:读取本帧投影与绘制配置。\n const geometry = this.renderGeometry;\n\n if (!geometry) {\n return;\n }\n\n const {\n maskColor,\n maskAlpha,\n expandBoxLineWidth,\n expandBoxLineColor,\n expandBoxLineAlpha,\n expandBoxCornerRadius,\n expandBoxCornerFillColor,\n expandBoxCornerLineWidth,\n expandBoxCornerLineColor,\n expandBoxCornerLineAlpha,\n gridLineWidth,\n gridLineColor,\n gridLineAlpha,\n gridCount,\n } = this.config;\n\n const expandCorners = getTransformedBoxCorners(geometry.boxTransform, this.result.normalizeExpandBox);\n\n // 步骤 2:绘制扩边蒙版。\n fillBoxByCorners(control, expandCorners, toColor(maskColor, maskAlpha));\n\n // 步骤 3:绘制扩边辅助网格。\n const gridColor = toColor(gridLineColor, gridLineAlpha);\n\n for (let i = 1; i <= gridCount; i++) {\n const ratio = i / (gridCount + 1);\n const top = expandCorners[0].clone().add(expandCorners[1].clone().subtract(expandCorners[0]).multiply(ratio));\n const bottom = expandCorners[3].clone().add(expandCorners[2].clone().subtract(expandCorners[3]).multiply(ratio));\n const left = expandCorners[0].clone().add(expandCorners[3].clone().subtract(expandCorners[0]).multiply(ratio));\n const right = expandCorners[1].clone().add(expandCorners[2].clone().subtract(expandCorners[1]).multiply(ratio));\n\n control.drawLine(top.x, top.y, bottom.x, bottom.y, gridColor, gridLineWidth);\n control.drawLine(left.x, left.y, right.x, right.y, gridColor, gridLineWidth);\n }\n\n // 步骤 4:绘制扩边框和角点。\n drawCorners(control, expandCorners, toColor(expandBoxLineColor, expandBoxLineAlpha), expandBoxLineWidth);\n const cornerFill = toColor(expandBoxCornerFillColor, 1);\n const cornerStroke = toColor(expandBoxCornerLineColor, expandBoxCornerLineAlpha);\n\n expandCorners.forEach(corner => {\n control.fillCircle(corner.x, corner.y, expandBoxCornerRadius, cornerFill);\n control.drawCircle(corner.x, corner.y, expandBoxCornerRadius, cornerStroke, expandBoxCornerLineWidth);\n });\n }\n\n /**\n * 刷新指针结果。\n * @param activeType 交互类型。\n * @param angle 指针方向角度。\n */\n refreshCursorResult (activeType: ImageExpandInteractionType, angle = 0) {\n switch (activeType) {\n case ImageInteractionType.SCALE: {\n this.cursorResult = {\n type: GestureCursorType.SCALE,\n angle,\n };\n\n break;\n }\n case ImageInteractionType.DIRECTION_SCALE: {\n this.cursorResult = {\n type: GestureCursorType.SCALE,\n angle,\n };\n\n break;\n }\n case ImageInteractionType.MOVE:\n case ImageInteractionType.NONE: {\n this.cursorResult = {\n type: GestureCursorType.NORMAL,\n angle: 0,\n };\n\n break;\n }\n }\n }\n\n /**\n * 获取当前扩边信息(扩边框 + 元素包围盒)。\n * @returns 扩边信息对象,不可交互时返回 undefined\n */\n getExpandInfo () {\n const geometry = this.getSelectionGeometry();\n\n if (!geometry) {\n return undefined;\n }\n\n return {\n expandBox: this.result.normalizeExpandBox.clone(),\n itemBox: geometry.itemBox,\n };\n }\n\n /**\n * 获取归一化扩边包围盒(相对元素包围盒,可超出 [0, 1])。\n */\n getExpandBox () {\n if (!this.isApplicableSelection()) {\n return undefined;\n }\n\n return this.result.normalizeExpandBox.clone();\n }\n\n /**\n * 设置归一化扩边包围盒(入参为归一化坐标,钳制为至少覆盖元素范围)。\n * @param normalizeBox 归一化扩边包围盒\n * @returns 更新后的扩边包围盒;未激活或无效状态返回 undefined\n */\n setExpandBox (normalizeBox: Box2) {\n if (!this.isApplicableSelection()) {\n return undefined;\n }\n\n this.result.normalizeExpandBox.copyFrom(normalizeBox);\n\n return this.result.normalizeExpandBox.clone();\n }\n\n /** @returns 是否仅选中了一个可扩边元素。 */\n private isApplicableSelection (): boolean {\n return this._owner.getSelection().getSelectedPlayerItems().length === 1;\n }\n\n /**\n * drag:按交互类型处理扩边框移动/缩放/单向缩放。\n * 支持 shift 锁定宽高比,结果以归一化扩边盒写入 result。\n * @param event 鼠标事件(drag)\n */\n private updateGrab (event: InputEventMouseMotion): boolean {\n // 步骤 1:校验当前交互会话。\n if (!this.mouseGrabbed) {\n return false;\n }\n if (this.interactionParam.type === ImageInteractionType.NONE) {\n return true;\n }\n\n // 步骤 2:获取实时投影并计算指针位移。\n const geometry = this.getSelectionGeometry();\n\n if (!geometry) {\n return true;\n }\n\n const currentInputPosition = inverseTransformBoxPoint(geometry.boxTransform, new Vector2(event.position.x, event.position.y));\n const { startMouse, box } = this.interactionParam;\n const shift = new Vector2().subtractVectors(currentInputPosition, startMouse);\n const itemBoxMin = new Vector2();\n const itemBoxMax = new Vector2(1, 1);\n\n // 步骤 3:按移动、角点缩放或边缩放更新归一化扩边框。\n switch (this.interactionParam.type) {\n case ImageInteractionType.MOVE: {\n const { min: originMin, max: originMax } = box;\n\n const xMinShift = itemBoxMax.x - originMax.x;\n const xMaxShift = itemBoxMin.x - originMin.x;\n const yMinShift = itemBoxMax.y - originMax.y;\n const yMaxShift = itemBoxMin.y - originMin.y;\n\n shift.x = Math.min(Math.max(shift.x, xMinShift), xMaxShift);\n shift.y = Math.min(Math.max(shift.y, yMinShift), yMaxShift);\n\n const resultBox = box.clone().translate(shift);\n\n this.result.normalizeExpandBox = resultBox;\n\n break;\n }\n case ImageInteractionType.SCALE: {\n const { index } = this.interactionParam;\n const { min, max } = box;\n const boxCorners = getBoxCorners(box);\n const startCorner = boxCorners[index];\n const anchor = boxCorners[(index + 2) % 4];\n const resultCorner = new Vector2(startCorner.x + shift.x, startCorner.y + shift.y);\n\n if (startCorner.x >= max.x) {\n resultCorner.x = Math.max(resultCorner.x, itemBoxMax.x);\n } else if (startCorner.x <= min.x) {\n resultCorner.x = Math.min(resultCorner.x, itemBoxMin.x);\n } else {\n console.warn('resultCorner has wrong, we have move it to the nearest corner');\n resultCorner.x = Math.abs(resultCorner.x - min.x) > Math.abs(resultCorner.x - max.x) ? max.x : min.x;\n }\n\n if (startCorner.y >= max.y) {\n resultCorner.y = Math.max(resultCorner.y, itemBoxMax.y);\n } else if (startCorner.y <= min.y) {\n resultCorner.y = Math.min(resultCorner.y, itemBoxMin.y);\n } else {\n console.warn('resultCorner has wrong, we have move it to the nearest corner');\n resultCorner.y = Math.abs(resultCorner.y - min.y) > Math.abs(resultCorner.y - max.y) ? max.y : min.y;\n }\n\n if (event.shiftPressed || this.isLockScale) {\n const expandBox = this.result.normalizeExpandBox;\n const { x: boxWidth, y: boxHeight } = expandBox.getSize();\n const { x: originWidth, y: originHeight } = box.getSize();\n\n this.interactionParam.lockedAspect ??= boxWidth / boxHeight;\n\n if (Math.abs(resultCorner.x - anchor.x) / originWidth > Math.abs(resultCorner.y - anchor.y) / originHeight) {\n const resultHeight = Math.abs(resultCorner.x - anchor.x) / this.interactionParam.lockedAspect;\n\n resultCorner.y = (startCorner.y - anchor.y) / Math.abs((startCorner.y - anchor.y)) * resultHeight + anchor.y;\n\n if (startCorner.y >= max.y) {\n resultCorner.y = Math.max(resultCorner.y, itemBoxMax.y);\n } else if (startCorner.y <= min.y) {\n resultCorner.y = Math.min(resultCorner.y, itemBoxMin.y);\n } else {\n console.warn('resultCorner has wrong, we have move it to the nearest corner');\n resultCorner.y = Math.abs(resultCorner.y - min.y) > Math.abs(resultCorner.y - max.y) ? max.y : min.y;\n }\n } else {\n const resultWidth = Math.abs(resultCorner.y - anchor.y) * this.interactionParam.lockedAspect;\n\n resultCorner.x = (startCorner.x - anchor.x) / Math.abs((startCorner.x - anchor.x)) * resultWidth + anchor.x;\n\n if (startCorner.x >= max.x) {\n resultCorner.x = Math.max(resultCorner.x, itemBoxMax.x);\n } else if (startCorner.x <= min.x) {\n resultCorner.x = Math.min(resultCorner.x, itemBoxMin.x);\n } else {\n console.warn('resultCorner has wrong, we have move it to the nearest corner');\n resultCorner.x = Math.abs(resultCorner.x - min.x) > Math.abs(resultCorner.x - max.x) ? max.x : min.x;\n }\n }\n }\n\n this.result.normalizeExpandBox = setBoxFromPoints(new Box2(), [resultCorner, anchor]);\n\n break;\n }\n case ImageInteractionType.DIRECTION_SCALE: {\n const { index } = this.interactionParam;\n const boxCorners = getBoxCorners(box);\n const startPoint = boxCorners[index].clone();\n const expandBox = this.result.normalizeExpandBox;\n const { x: boxWidth, y: boxHeight } = expandBox.getSize();\n\n this.interactionParam.lockedAspect ??= boxWidth / boxHeight;\n const nextCorner = boxCorners[(index + 1) % 4].clone();\n\n // 四条边固定为:0 上、1 右、2 下、3 左。\n const shiftDirection = index % 2 === 0 ? 'y' : 'x';\n\n if (shiftDirection === 'x') {\n if (index === 1) {\n shift.x = Math.max(boxCorners[index].x + shift.x, itemBoxMax.x) - startPoint.x;\n if (event.shiftPressed || this.isLockScale) {\n const expandBox = this.result.normalizeExpandBox;\n const { x: boxWidth, y: boxHeight } = expandBox.getSize();\n\n this.interactionParam.lockedAspect ??= boxWidth / boxHeight;\n\n shift.y = shift.x / this.interactionParam.lockedAspect;\n const resuleTargetCornerY = nextCorner.y + shift.y;\n const clampResultCornerY = Math.max(resuleTargetCornerY, itemBoxMax.y);\n\n shift.y = clampResultCornerY - nextCorner.y;\n shift.x = shift.y * this.interactionParam.lockedAspect;\n } else {\n shift.y = 0;\n }\n } else if (index === 3) {\n shift.x = Math.min(boxCorners[index].x + shift.x, itemBoxMin.x) - startPoint.x;\n if (event.shiftPressed || this.isLockScale) {\n const expandBox = this.result.normalizeExpandBox;\n const { x: boxWidth, y: boxHeight } = expandBox.getSize();\n\n this.interactionParam.lockedAspect ??= boxWidth / boxHeight;\n\n shift.y = shift.x / this.interactionParam.lockedAspect;\n const resuleTargetCornerY = nextCorner.y + shift.y;\n const clampResultCornerY = Math.min(resuleTargetCornerY, itemBoxMin.y);\n\n shift.y = clampResultCornerY - nextCorner.y;\n shift.x = shift.y * this.interactionParam.lockedAspect;\n } else {\n shift.y = 0;\n }\n }\n } else {\n if (index === 2) {\n shift.y = Math.max(boxCorners[index].y + shift.y, itemBoxMax.y) - startPoint.y;\n if (event.shiftPressed || this.isLockScale) {\n const expandBox = this.result.normalizeExpandBox;\n const { x: boxWidth, y: boxHeight } = expandBox.getSize();\n\n this.interactionParam.lockedAspect ??= boxWidth / boxHeight;\n\n shift.x = -shift.y * this.interactionParam.lockedAspect;\n const resuleTargetCornerX = nextCorner.x + shift.x;\n const clampResultCornerX = Math.min(resuleTargetCornerX, itemBoxMin.x);\n\n shift.x = clampResultCornerX - nextCorner.x;\n shift.y = -shift.x / this.interactionParam.lockedAspect;\n } else {\n shift.x = 0;\n }\n } else if (index === 0) {\n shift.y = Math.min(boxCorners[index].y + shift.y, itemBoxMin.y) - startPoint.y;\n if (event.shiftPressed || this.isLockScale) {\n const expandBox = this.result.normalizeExpandBox;\n const { x: boxWidth, y: boxHeight } = expandBox.getSize();\n\n this.interactionParam.lockedAspect ??= boxWidth / boxHeight;\n\n shift.x = -shift.y * this.interactionParam.lockedAspect;\n const resuleTargetCornerX = nextCorner.x + shift.x;\n const clampResultCornerX = Math.max(resuleTargetCornerX, itemBoxMax.x);\n\n shift.x = clampResultCornerX - nextCorner.x;\n shift.y = -shift.x / this.interactionParam.lockedAspect;\n } else {\n shift.x = 0;\n }\n }\n }\n\n const resultCorners: Vector2[] = [];\n\n boxCorners.forEach((corner, i) => {\n const resultCorner = new Vector2();\n\n if (index === i) {\n if (shiftDirection === 'y') {\n resultCorner.copyFrom(corner.clone().add(new Vector2(0, shift.y)));\n } else {\n resultCorner.copyFrom(corner.clone().add(new Vector2(shift.x, 0)));\n }\n } else if (index === (i + 3) % 4) {\n resultCorner.copyFrom(corner.clone().add(shift));\n } else if (index === (i + 2) % 4) {\n if (shiftDirection === 'x') {\n resultCorner.copyFrom(corner.clone().add(new Vector2(0, shift.y)));\n } else {\n resultCorner.copyFrom(corner.clone().add(new Vector2(shift.x, 0)));\n }\n } else {\n resultCorner.copyFrom(corner.clone());\n }\n resultCorners.push(resultCorner);\n });\n this.result.normalizeExpandBox = setBoxFromPoints(new Box2(), resultCorners);\n\n break;\n }\n default:\n break;\n }\n\n return true;\n }\n\n /** @returns 当前图片与扩边框的视口投影。 */\n private getSelectionGeometry (): ImageExpandGeometry | undefined {\n const selectedItems = this.selectedItems;\n\n if (selectedItems.length !== 1) {\n return undefined;\n }\n\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n const boxTransform = getItemViewTransform(selectedItems[0], containerSize);\n\n if (!boxTransform) {\n return undefined;\n }\n const itemBox = getItemViewBox(selectedItems[0], containerSize);\n\n return {\n itemBox,\n boxTransform,\n };\n }\n\n /**\n * 根据鼠标位置判定扩边框的交互类型(角点缩放/边线单向缩放/整体移动),\n * 同时刷新光标方向。\n * @param point 视图坐标鼠标位置\n * @param inputPosition Control 本地坐标鼠标位置\n */\n private refreshInteractionType (point: Vector2, inputPosition: Vector2) {\n // 步骤 1:重置交互状态并获取实时扩边投影。\n this.interactionParam.type = ImageInteractionType.NONE;\n\n const geometry = this.getSelectionGeometry();\n\n if (!geometry) {\n return;\n }\n\n const itemCorners = getTransformedBoxCorners(geometry.boxTransform);\n const expandCorners = getTransformedBoxCorners(geometry.boxTransform, this.result.normalizeExpandBox);\n let hasInteractionType = false;\n let angle = 0;\n\n // 步骤 2:优先检测角点缩放。\n expandCorners.forEach((corner, index) => {\n if (hasInteractionType) {\n return;\n }\n if (corner.distance(point) < 20) {\n hasInteractionType = true;\n this.interactionParam = {\n type: ImageInteractionType.SCALE,\n index,\n box: this.result.normalizeExpandBox.clone(),\n startMouse: inverseTransformBoxPoint(geometry.boxTransform, inputPosition),\n };\n\n const rotation = Math.atan2(itemCorners[1].y - itemCorners[0].y, itemCorners[1].x - itemCorners[0].x);\n\n angle = Math.PI / 2 * ((index + 3) % 4) + rotation;\n }\n });\n\n // 步骤 3:其次检测边缘单向缩放。\n expandCorners.forEach((corner, index) => {\n if (hasInteractionType) {\n return;\n }\n const edge = new Line2(corner.clone(), expandCorners[(index + 1) % 4]);\n const t = edge.distanceSq() === 0 ? 0 : edge.closestPointToPointParameter(point, true);\n const dis = { d: edge.at(t).distance(point), t };\n\n const state = dis.d >= 0 && dis.d <= 8 && dis.t >= 0 && dis.t <= 1;\n\n if (state) {\n hasInteractionType = true;\n this.interactionParam = {\n type: ImageInteractionType.DIRECTION_SCALE,\n index,\n box: this.result.normalizeExpandBox.clone(),\n startMouse: inverseTransformBoxPoint(geometry.boxTransform, inputPosition),\n };\n const rotation = Math.atan2(itemCorners[1].y - itemCorners[0].y, itemCorners[1].x - itemCorners[0].x);\n\n angle = Math.PI / 2 * ((index + 3) % 4) + Math.PI / 4 + rotation;\n }\n });\n\n // 步骤 4:最后检测扩边区域整体移动并刷新光标。\n if (transformedBoxContainsPoint(geometry.boxTransform, point, this.result.normalizeExpandBox) && !hasInteractionType) {\n this.interactionParam = {\n type: ImageInteractionType.MOVE,\n box: this.result.normalizeExpandBox.clone(),\n startMouse: inverseTransformBoxPoint(geometry.boxTransform, inputPosition),\n };\n\n hasInteractionType = true;\n }\n\n this.refreshCursorResult(this.interactionParam.type, angle * RAD2DEG);\n }\n}\n","import type { Gizmo } from '../gizmo';\nimport { GizmoTool } from '../gizmo-tool';\nimport { ImageExpandGizmo } from '../gizmos/image-expand-gizmo';\n\n/** 图片扩边工具。 */\nexport class ImageExpandGizmoTool extends GizmoTool {\n /** @returns 图片扩边 Gizmo 图。 */\n override createGizmos (): Gizmo[] {\n return [new ImageExpandGizmo(this.owner)];\n }\n}\n","import type {\n spec } from '@galacean/effects';\nimport {\n MouseButton,\n type InputEventMouseButton,\n type InputEventMouseMotion,\n} from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport { Gizmo } from '../gizmo';\nimport { GizmoViewportUtils } from '../viewport/viewport-utils';\nimport { GizmoType } from '../gizmo-type';\nimport { Box2 } from '@galacean/effects-math/es/extension/index';\nimport { Vector2, getNormalizeBoxByBoxes, getTransformedBoxCorners, setBoxFromPoints, transformedBoxContainsPoint } from '../math';\nimport type { SpriteTextEditConfig } from '../configs/types';\nimport { spriteTextEditConfig } from '../configs/builtin-configs';\nimport { getPlayerItemById, getItemViewBox, getItemViewTransform } from '../items';\nimport { toColor, drawCorners, drawWithBoxTransform, fillBoxByCorners, wrapText, measureTextWidth } from '../drawing';\n\n/**\n * 图层文字信息\n */\nexport type SpriteTextInfo = {\n /**\n * 元素ID\n */\n id: string,\n /**\n * 文本框索引\n */\n index: number,\n /**\n * 文本包围盒\n */\n box: Box2,\n /**\n * 文本内容\n */\n text: string,\n /**\n * 是否被修改过\n */\n hasChanged: boolean,\n /**\n * 是否处于编辑态\n */\n isEditing: boolean,\n};\n\n/**\n * 精准改字功能初始化信息\n */\nexport type SpriteTextInitParam = {\n /**\n * 元素ID\n */\n id: string,\n /** 原始包围盒。 */\n originBox?: Box2,\n /**\n * 改字信息\n */\n info: SpriteTextInitInfo[],\n};\n\n/** 单个精准改字文本框的初始化信息。 */\nexport type SpriteTextInitInfo = {\n /**\n * 是否被修改过\n */\n hasChanged: boolean,\n /**\n * 文字内容\n */\n text: string,\n /**\n * 包围盒信息\n */\n box: [spec.vec2, spec.vec2, spec.vec2, spec.vec2],\n};\n\n/** 精准改字交互参数 */\ntype SpriteTextEditInteractionParam = {\n /** 已选中索引 */\n selected: number,\n /** 预选中索引 */\n preSelected: number,\n};\n\n/** 精准改字结果列表 */\ntype SpriteTextEditResult = SpriteTextInfo[];\n\n/** 编辑文本字号 / 行高 / 字体 */\nconst EDIT_TEXT_FONT_SIZE = 14;\nconst EDIT_TEXT_LINE_HEIGHT = 16;\nconst EDIT_TEXT_FONT_FAMILY = 'sans-serif';\n\n/** 在图层文本框上提供悬停、选择、编辑和绘制能力。 */\nexport class SpriteTextEditGizmo extends Gizmo {\n readonly type: GizmoType = GizmoType.SPRITE_TEXT_EDIT;\n\n result: SpriteTextEditResult = [];\n interactionParam: SpriteTextEditInteractionParam = { preSelected: -1, selected: -1 };\n\n /** onMouseMove 命中缓存(坐标未变则跳过 computePreSelected,避免每帧全 result 命中扫描)。 */\n private cachedCoords: Vector2 | null = null;\n\n /** 当前精准改字配置。 */\n get config (): Readonly<SpriteTextEditConfig> {\n return this._owner.getConfigManager().get(spriteTextEditConfig);\n }\n\n /**\n * 更新指针悬停的文本框。\n * @param _event 鼠标移动事件。\n */\n override onMouseMove (_event: InputEventMouseMotion): void {\n const hover = this._owner.getMousePosition();\n\n if (this.cachedCoords?.x !== hover.x || this.cachedCoords?.y !== hover.y) {\n this.interactionParam.preSelected = this.computePreSelected(hover);\n this.cachedCoords = hover.clone();\n }\n }\n\n /** 鼠标离开交互层:清预选中 + 失效缓存。 */\n override onMouseLeave (): void {\n this.interactionParam.preSelected = -1;\n this.cachedCoords = null;\n }\n\n /**\n * 将命中的文本框设为编辑态并发送点击事件。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n if (event.buttonIndex !== MouseButton.Left || event.doubleClick) {\n return;\n }\n this.interactionParam.preSelected = this.computePreSelected(new Vector2(event.position.x, event.position.y));\n const targetInfo = this.result[this.interactionParam.preSelected];\n\n this.result.forEach(info => {\n info.isEditing = info.id === targetInfo?.id && info.index === targetInfo.index;\n });\n\n this.interactionParam.preSelected = -1;\n const emitInfo = targetInfo ? { id: targetInfo.id, index: targetInfo.index, text: targetInfo.text } : undefined;\n\n this._owner.emit('spritetextclick', { source: this, info: emitInfo });\n event.accept();\n }\n\n /**\n * 以初始化参数列表填充 result,将原始角点转换为相对元素包围盒的归一化盒。\n * @param initParams 初始化参数列表\n */\n initResult (initParams: SpriteTextInitParam[]) {\n initParams.forEach(param => {\n const originBox = param.originBox ?? this.getItemOriginBox(param.id);\n\n if (!originBox) {\n return;\n }\n\n param.info.forEach((initInfo, index) => {\n const { text, box, hasChanged } = initInfo;\n const corners = box.map(corner => new Vector2(...corner).add(originBox.min));\n const targetBox = setBoxFromPoints(new Box2(), corners);\n\n const normalizeBox = getNormalizeBoxByBoxes(originBox, targetBox);\n\n this.result.push({\n id: param.id,\n index,\n hasChanged,\n text: text,\n box: normalizeBox,\n isEditing: false,\n });\n });\n });\n }\n\n /** 清空当前所有改字结果数据。 */\n clearResultData () {\n this.result = [];\n }\n\n /**\n * 设置当前选中文字框;找不到时告警。\n * @param id 元素 ID\n * @param index 文本框索引\n */\n setSelected (id: string, index: number) {\n const selected = this.result.findIndex(info => info.id === id && info.index === index);\n\n if (selected < 0) {\n console.warn(`item ${id} does not have index ${index} text info.`);\n\n return;\n } else {\n this.interactionParam.selected = selected;\n }\n }\n\n /**\n * 设置指定文字框的文本内容;找不到时告警。\n * @param id 元素 ID\n * @param index 文本框索引\n * @param text 文本内容\n */\n setText (id: string, index: number, text: string) {\n const targetInfo = this.result.find(info => info.id === id && info.index === index);\n\n if (!targetInfo) {\n console.warn(`item ${id} does not have index ${index} text info.`);\n\n return;\n }\n\n targetInfo.text = text;\n }\n\n /**\n * 设置指定文字框的\"已改动\"状态;找不到时告警。\n * @param id 元素 ID\n * @param index 文本框索引\n * @param hasChanged 是否已改动\n */\n setChangedState (id: string, index: number, hasChanged: boolean) {\n const targetInfo = this.result.find(info => info.id === id && info.index === index);\n\n if (!targetInfo) {\n console.warn(`item ${id} does not have index ${index} text info.`);\n\n return;\n }\n\n targetInfo.hasChanged = hasChanged;\n }\n\n /**\n * 设置指定文字框的编辑态;找不到时告警。\n * @param id 元素 ID\n * @param index 文本框索引\n * @param isEditing 是否处于编辑态\n */\n setEditState (id: string, index: number, isEditing: boolean) {\n const targetInfo = this.result.find(info => info.id === id && info.index === index);\n\n if (!targetInfo) {\n console.warn(`item ${id} does not have index ${index} text info.`);\n\n return;\n }\n\n targetInfo.isEditing = isEditing;\n }\n\n /**\n * 绘制文本框状态与正在编辑的文本。\n * @param control 绘制控制器。\n */\n override draw (control: Control): void {\n // 步骤 1:读取配置并投影所有有效文本框。\n if (this.result.length === 0) {\n return;\n }\n\n const scale = GizmoViewportUtils.getViewScale(this._owner.getEngine());\n const {\n editBoxColor,\n editBoxAlpha,\n editBoxPreSelectedColor,\n editBoxPreSelectedAlpha,\n hasChangedEditBoxColor,\n hasChangedEditBoxAlpha,\n hasChangedEditBoxPreSelectedColor,\n hasChangedEditBoxPreSelectedAlpha,\n editBoxLineColor,\n editBoxLineAlpha,\n editBoxLinePreSelectedAlpha,\n editBoxLinePreSelectedColor,\n hasChangedEditBoxLineColor,\n hasChangedEditBoxLineAlpha,\n hasChangedEditBoxLinePreSelectedColor,\n hasChangedEditBoxLinePreSelectedAlpha,\n textColor,\n } = this.config;\n\n const currentPreSelected = this.interactionParam.preSelected;\n const entries = this.result\n .map((value, index) => {\n const playerItem = getPlayerItemById(this._owner.getEngine().sceneServer.compositions[0], value.id);\n\n if (!playerItem) {\n return undefined;\n }\n const transform = getItemViewTransform(playerItem, GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!));\n\n if (!transform) {\n return undefined;\n }\n const viewCorners = getTransformedBoxCorners(transform, value.box);\n const isPreSelected = index === currentPreSelected;\n\n return { value, viewCorners, isPreSelected };\n })\n .filter((entry): entry is NonNullable<typeof entry> => !!entry);\n\n // 步骤 2:创建单个文本框的绘制函数。\n /**\n * 绘制单个文本框。\n * @param viewCorners 文本框视口四角。\n * @param fill 填充色。\n * @param fillAlpha 填充透明度。\n * @param line 线框色。\n * @param lineAlpha 线框透明度。\n */\n const drawEntryBox = (viewCorners: Vector2[], fill: number, fillAlpha: number, line: number, lineAlpha: number) => {\n fillBoxByCorners(control, viewCorners, toColor(fill, fillAlpha));\n drawCorners(control, viewCorners, toColor(line, lineAlpha), 1);\n };\n\n // 步骤 3:按未修改、已修改的顺序绘制文本框。\n for (const changed of [false, true]) {\n entries\n .filter(entry => entry.value.hasChanged === changed)\n .forEach(({ viewCorners, isPreSelected }) => {\n if (changed) {\n drawEntryBox(\n viewCorners,\n isPreSelected ? hasChangedEditBoxPreSelectedColor : hasChangedEditBoxColor,\n isPreSelected ? hasChangedEditBoxPreSelectedAlpha : hasChangedEditBoxAlpha,\n isPreSelected ? hasChangedEditBoxLinePreSelectedColor : hasChangedEditBoxLineColor,\n isPreSelected ? hasChangedEditBoxLinePreSelectedAlpha : hasChangedEditBoxLineAlpha,\n );\n } else {\n drawEntryBox(\n viewCorners,\n isPreSelected ? editBoxPreSelectedColor : editBoxColor,\n isPreSelected ? editBoxPreSelectedAlpha : editBoxAlpha,\n isPreSelected ? editBoxLinePreSelectedColor : editBoxLineColor,\n isPreSelected ? editBoxLinePreSelectedAlpha : editBoxLineAlpha,\n );\n }\n });\n }\n\n // 步骤 4:在最上层绘制编辑态文本。\n const textFill = toColor(textColor, 1);\n const fontSize = EDIT_TEXT_FONT_SIZE * scale;\n const lineHeight = EDIT_TEXT_LINE_HEIGHT * scale;\n\n entries.forEach(({ value, viewCorners }) => {\n if (!value.isEditing) {\n return;\n }\n const [leftTop, rightTop, , leftBottom] = viewCorners;\n const width = leftTop.distance(rightTop);\n const height = leftTop.distance(leftBottom);\n const maxLines = Math.max(1, Math.floor(height / lineHeight));\n const lines = wrapText(value.text, width / scale, maxLines, EDIT_TEXT_FONT_SIZE, EDIT_TEXT_FONT_FAMILY);\n\n if (lines.length === 0) {\n return;\n }\n const blockHeight = lines.length * lineHeight;\n const xAxis = rightTop.clone().subtract(leftTop).normalize();\n const yAxis = leftBottom.clone().subtract(leftTop).normalize();\n\n drawWithBoxTransform(control, leftTop, xAxis, yAxis, () => {\n const topY = (height - blockHeight) / 2;\n\n lines.forEach((line, li) => {\n const lineWidth = measureTextWidth(line, fontSize, EDIT_TEXT_FONT_FAMILY);\n\n control.drawText((width - lineWidth) / 2, topY + li * lineHeight, line, fontSize, textFill, EDIT_TEXT_FONT_FAMILY);\n });\n });\n });\n }\n\n /**\n * 获取指定元素的视口包围盒。\n * @param id 元素 ID。\n * @returns 元素包围盒。\n */\n private getItemOriginBox (id: string): Box2 | undefined {\n const playerItem = getPlayerItemById(this._owner.getEngine().sceneServer.compositions[0], id);\n\n if (!playerItem) {\n return undefined;\n }\n\n return getItemViewBox(\n playerItem,\n GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!),\n );\n }\n\n /**\n * 查找鼠标命中的文本框索引。\n * @param mouse 鼠标位置。\n * @returns 首个命中索引;未命中时返回 -1。\n */\n private computePreSelected (mouse: Vector2): number {\n for (let i = 0; i < this.result.length; i++) {\n const textInfo = this.result[i];\n const playerItem = getPlayerItemById(this._owner.getEngine().sceneServer.compositions[0], textInfo.id);\n\n if (!playerItem) {\n continue;\n }\n const transform = getItemViewTransform(playerItem, GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!));\n\n if (transform && transformedBoxContainsPoint(transform, mouse, textInfo.box)) {\n return i;\n }\n }\n\n return -1;\n }\n}\n","import type { Gizmo } from '../gizmo';\nimport { GizmoTool } from '../gizmo-tool';\nimport { SpriteTextEditGizmo } from '../gizmos/sprite-text-edit-gizmo';\n\n/** Sprite 精准文字编辑工具。 */\nexport class SpriteTextEditGizmoTool extends GizmoTool {\n /** @returns 精准文字编辑 Gizmo 图。 */\n override createGizmos (): Gizmo[] {\n return [new SpriteTextEditGizmo(this.owner)];\n }\n}\n","import { Box2 } from '@galacean/effects-math/es/extension/index';\nimport { Vector2, getTransformedBoxCorners, inverseTransformBoxPoint, transformedBoxContainsPoint, type Matrix3 } from '../math';\nimport type { MaskConfig } from '../configs/types';\nimport { maskConfig } from '../configs/builtin-configs';\nimport type { ConfigChange } from '../configs/config-definition';\nimport type {\n VFXItem } from '@galacean/effects';\nimport {\n MouseButton,\n Texture,\n TextureSourceType,\n type InputEventMouseButton,\n type InputEventMouseMotion,\n} from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport { Gizmo } from '../gizmo';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport { GizmoViewportUtils } from '../viewport/viewport-utils';\nimport { GizmoType } from '../gizmo-type';\nimport { GestureCursorType, type GestureCursorResult } from '../cursor';\nimport { getItemViewTransform } from '../items';\nimport { toColor, drawCorners, drawWithBoxTransform } from '../drawing';\n\n/**\n * 图片蒙版工具结果\n */\nexport type MaskResult = {\n /**\n * 蒙版线条列表\n */\n lines: {\n /** 笔刷大小 */\n brushSize: number,\n /** 笔刷路径点(归一化坐标) */\n points: Vector2[],\n /** 笔刷类型:涂抹或擦除 */\n type?: 'paint' | 'erase',\n /** 形状类型:'stroke' 折线(默认),'rect' 矩形框选(points=[起点, 终点]) */\n shape?: 'stroke' | 'rect',\n }[],\n};\n\n/** 通过笔刷或矩形涂抹、擦除图片蒙版并实时预览。 */\nexport class MaskGizmo extends Gizmo {\n /** gizmo 类型标识 */\n type = GizmoType.MASK;\n\n /** 当前笔刷模式:涂抹或擦除 */\n mode: 'paint' | 'erase' | 'box-paint' | 'box-erase' = 'paint';\n\n /** 光标结果。 */\n cursorResult: GestureCursorResult = {\n type: GestureCursorType.NORMAL,\n angle: 0,\n };\n\n result: MaskResult = {\n lines: [],\n };\n\n /** 配置变更退订函数。 */\n private configOff?: () => void;\n\n /** 当前已加载的黑白蒙版图片。 */\n private maskImage?: HTMLImageElement;\n\n /** 蒙版图片加载版本,用于丢弃过期异步结果。 */\n private maskImageLoadVersion = 0;\n\n /** 仅供 draw 使用,由 onUpdate 为当前帧生成。 */\n private renderTransform?: Matrix3;\n\n /** 离屏 canvas,用于绘制蒙版预览(笔刷涂抹/擦除,原生支持圆头与 destination-out)。 */\n private previewCanvas: HTMLCanvasElement | null = null;\n\n /** 蒙版预览纹理(由离屏 canvas 每帧上传)。 */\n private maskTexture: Texture | null = null;\n\n private mouseGrabbed = false;\n\n /**\n * 创建蒙版 Gizmo,并按当前配置加载基础蒙版图。\n * @param owner Gizmo 宿主。\n */\n constructor (owner: GizmoOwner) {\n super(owner);\n this.configOff = owner.getConfigManager().onChange(\n maskConfig,\n change => {\n this.onConfigChange(change);\n },\n );\n void this.refreshMaskImage(this.config.maskImage);\n }\n\n /** 当前选中的元素(直读 selection.getSelectedPlayerItems:id→VFXItem 已解析)。 */\n get selectedItems (): VFXItem[] {\n return this._owner.getSelection().getSelectedPlayerItems();\n }\n\n /** 当前蒙版配置。 */\n get config (): Readonly<MaskConfig> {\n return this._owner.getConfigManager().get(maskConfig);\n }\n\n /**\n * 更新蒙版绘制或指针光标。\n * @param event 鼠标移动事件。\n */\n override onMouseMove (event: InputEventMouseMotion): void {\n const transform = this.getSelectionTransform();\n\n if (this.mouseGrabbed) {\n const handled = this.updateGrab(event, transform);\n\n this.refreshCursorResult(transform);\n this._owner.setCursor(this.cursorResult);\n if (handled) {\n event.accept();\n }\n\n return;\n }\n this.refreshCursorResult(transform);\n this._owner.setCursor(this.cursorResult);\n }\n\n /**\n * 继续当前蒙版绘制交互。\n * @param event 鼠标拖拽事件。\n */\n override onMouseDrag (event: InputEventMouseMotion): void {\n if (!this.mouseGrabbed) {\n return;\n }\n const transform = this.getSelectionTransform();\n const handled = this.updateGrab(event, transform);\n\n this.refreshCursorResult(transform);\n this._owner.setCursor(this.cursorResult);\n if (handled) {\n event.accept();\n }\n }\n\n /**\n * 在选中元素内开始笔刷或矩形蒙版交互。\n * @param event 鼠标按下事件。\n */\n override onMouseDown (event: InputEventMouseButton): void {\n // 步骤 1:校验按键、点击次数和选中元素包围盒。\n if (event.buttonIndex !== MouseButton.Left) {\n return;\n }\n if (event.doubleClick) {\n return;\n }\n\n const transform = this.getSelectionTransform();\n\n if (!transform) {\n return;\n }\n const point = new Vector2(event.position.x, event.position.y);\n\n if (!transformedBoxContainsPoint(transform, point)) {\n return;\n }\n\n // 步骤 2:矩形模式在元素内创建归一化矩形路径。\n if (this.mode === 'box-paint' || this.mode === 'box-erase') {\n this._owner.setCursor(this.cursorResult);\n this.mouseGrabbed = true;\n this._owner.emit('actionstart', { source: this });\n const start = this.toNormalized(point, transform);\n\n this.result.lines.push({\n type: this.mode === 'box-paint' ? 'paint' : 'erase',\n shape: 'rect',\n brushSize: 0,\n points: [start, start.clone()],\n });\n event.accept();\n\n return;\n }\n\n // 步骤 3:笔刷模式创建空路径,后续由拖拽追加点。\n this._owner.setCursor(this.cursorResult);\n this.mouseGrabbed = true;\n this._owner.emit('actionstart', { source: this });\n\n this.result.lines.push({\n type: this.mode,\n brushSize: this.config.brushSize,\n points: [],\n });\n\n event.accept();\n }\n\n /**\n * 结束蒙版绘制并移除无效路径。\n * @param event 鼠标抬起事件。\n */\n override onMouseUp (event: InputEventMouseButton): void {\n if (!this.mouseGrabbed) {\n return;\n }\n this.mouseGrabbed = false;\n const lastLine = this.result.lines[this.result.lines.length - 1];\n\n if (lastLine?.shape === 'rect') {\n const [a, b] = lastLine.points;\n const transform = this.getSelectionTransform();\n const corners = transform ? getTransformedBoxCorners(transform) : undefined;\n const w = Math.abs((a?.x ?? 0) - (b?.x ?? 0)) * (corners?.[0].distance(corners[1]) ?? 0);\n const h = Math.abs((a?.y ?? 0) - (b?.y ?? 0)) * (corners?.[0].distance(corners[3]) ?? 0);\n\n if (w < 0.5 && h < 0.5) {\n this.result.lines.pop();\n }\n } else if (lastLine?.points.length === 0) {\n this.result.lines.pop();\n }\n\n this._owner.emit('actioncommit', { source: this });\n this._owner.setCursor(this.cursorResult);\n\n event.accept();\n }\n\n /** 释放预览纹理和离屏绘制资源。 */\n override dispose (): void {\n this.configOff?.();\n this.configOff = undefined;\n this.maskImageLoadVersion++;\n this.maskImage = undefined;\n this.clearRenderObjects();\n super.dispose();\n }\n\n /** 为本帧绘制创建元素包围盒快照。 */\n override onUpdate (): void {\n this.renderTransform = this.getSelectionTransform();\n this.refreshCursorResult(this.renderTransform);\n }\n\n /**\n * 绘制蒙版纹理、元素轮廓和矩形预览。\n * @param control 绘制控制器。\n */\n override draw (control: Control): void {\n // 步骤 1:获取本帧包围盒与预览尺寸。\n const transform = this.renderTransform;\n\n if (!transform) {\n return;\n }\n\n const { brushAlpha, boxLineWidth, boxLineColor, boxLineAlpha } = this.config;\n const corners = getTransformedBoxCorners(transform);\n const [leftTop, rightTop, , leftBottom] = corners;\n const width = Math.ceil(leftTop.distance(rightTop));\n const height = Math.ceil(leftTop.distance(leftBottom));\n const xAxis = rightTop.clone().subtract(leftTop).normalize();\n const yAxis = leftBottom.clone().subtract(leftTop).normalize();\n\n // 步骤 2:渲染离屏预览并创建或更新纹理。\n if (width > 0 && height > 0) {\n const canvas = this.renderPreviewToCanvas(width, height);\n\n if (canvas) {\n if (this.maskTexture && (this.maskTexture.width !== width || this.maskTexture.height !== height)) {\n this.clearRenderObjects();\n }\n if (!this.maskTexture || this.maskTexture.isDestroyed) {\n this.maskTexture = Texture.create(control.engine, {\n sourceType: TextureSourceType.image,\n image: canvas,\n flipY: true,\n });\n } else {\n this.maskTexture.updateSource({\n sourceType: TextureSourceType.image,\n image: canvas,\n flipY: true,\n });\n }\n this.maskTexture.width = width;\n this.maskTexture.height = height;\n drawWithBoxTransform(control, leftTop, xAxis, yAxis, () => {\n control.drawTexture(0, 0, width, height, this.maskTexture!, undefined, toColor(0xFFFFFF, brushAlpha));\n });\n }\n\n if (this.maskImage) {\n const imageCanvas = this.getMask();\n\n if (imageCanvas) {\n if (this.maskTexture && (this.maskTexture.width !== width || this.maskTexture.height !== height)) {\n this.clearRenderObjects();\n }\n if (!this.maskTexture || this.maskTexture.isDestroyed) {\n this.maskTexture = Texture.create(control.engine, {\n sourceType: TextureSourceType.image,\n image: imageCanvas,\n flipY: true,\n });\n } else {\n this.maskTexture.updateSource({\n sourceType: TextureSourceType.image,\n image: imageCanvas,\n flipY: true,\n });\n }\n this.maskTexture.width = width;\n this.maskTexture.height = height;\n drawWithBoxTransform(control, leftTop, xAxis, yAxis, () => {\n control.drawTexture(0, 0, width, height, this.maskTexture!, undefined, toColor(0xFFFFFF, brushAlpha));\n });\n }\n }\n }\n\n // 步骤 3:绘制元素轮廓与正在拖动的矩形。\n drawCorners(control, corners, toColor(boxLineColor, boxLineAlpha), boxLineWidth);\n\n if (this.mouseGrabbed) {\n const lastLine = this.result.lines[this.result.lines.length - 1];\n\n if (lastLine?.shape === 'rect' && lastLine.points.length >= 2) {\n const [a, b] = lastLine.points;\n\n if (a && b) {\n const selCorners = getTransformedBoxCorners(\n transform,\n new Box2(\n new Vector2(Math.min(a.x, b.x), Math.min(a.y, b.y)),\n new Vector2(Math.max(a.x, b.x), Math.max(a.y, b.y)),\n ),\n );\n\n drawCorners(control, selCorners, toColor(boxLineColor, boxLineAlpha), boxLineWidth);\n }\n }\n }\n }\n\n /**\n * 设置模式。\n * @param mode 模式类型:'paint' 笔刷涂抹、'erase' 笔刷擦除、'box-paint' 框选涂抹、'box-erase' 框选擦除\n */\n setMode (mode: 'paint' | 'erase' | 'box-paint' | 'box-erase') {\n this.mode = mode;\n }\n\n /** 关闭 gizmo:清空蒙版配置、笔刷和预览资源。 */\n close () {\n this._owner.getConfigManager().set(maskConfig, { maskImage: '' });\n this.result.lines = [];\n this.clearRenderObjects();\n }\n\n /** 清空当前所有笔刷线条。 */\n clearMask () {\n this.result.lines = [];\n this.maskImage = undefined;\n }\n\n /**\n * 加载蒙版图片。\n * @param url 图片地址\n * @returns Promise<HTMLImageElement>\n */\n public loadMaskImage (url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n resolve(img);\n };\n img.onerror = err => {\n reject(new Error('Failed to load mask image.'));\n };\n img.src = url;\n });\n }\n\n /**\n * 生成当前蒙版的 PNG Canvas。\n * @returns 蒙版图像;没有有效蒙版时返回 null。\n */\n getMask (): HTMLCanvasElement | null {\n // 步骤 1:创建与选中元素同尺寸的输出画布。\n const transform = this.getSelectionTransform();\n\n if (!transform) {\n return null;\n }\n\n const points = getTransformedBoxCorners(transform);\n const width = Math.ceil(points[0].distance(points[1]));\n const height = Math.ceil(points[0].distance(points[3]));\n\n const canvas = document.createElement('canvas');\n\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n return null;\n }\n\n const { maskColor, maskBackgroundColor } = this.config;\n const maskImage = this.maskImage;\n\n if (this.result.lines.length === 0 && !maskImage) {\n return null;\n }\n\n const maskHexColor = '#' + maskColor.toString(16).padStart(6, '0');\n const maskBackgroundHexColor = '#' + maskBackgroundColor.toString(16).padStart(6, '0');\n\n ctx.fillStyle = maskBackgroundHexColor;\n ctx.fillRect(0, 0, width, height);\n\n // 步骤 2:将基础黑白蒙版映射为主体色和背景色。\n if (maskImage) {\n try {\n ctx.drawImage(maskImage, 0, 0, width, height);\n\n const imageData = ctx.getImageData(0, 0, width, height);\n const data = imageData.data;\n\n const mcR = (maskColor >> 16) & 0xFF;\n const mcG = (maskColor >> 8) & 0xFF;\n const mcB = maskColor & 0xFF;\n\n const mbcR = (maskBackgroundColor >> 16) & 0xFF;\n const mbcG = (maskBackgroundColor >> 8) & 0xFF;\n const mbcB = maskBackgroundColor & 0xFF;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n const brightness = (r + g + b) / 3;\n\n if (brightness > 128) {\n data[i] = mcR;\n data[i + 1] = mcG;\n data[i + 2] = mcB;\n } else {\n data[i] = mbcR;\n data[i + 1] = mbcG;\n data[i + 2] = mbcB;\n }\n }\n\n ctx.putImageData(imageData, 0, 0);\n } catch (err) {\n console.warn('Failed to load mask image:', err);\n }\n }\n\n const scale = GizmoViewportUtils.getViewScale(this._owner.getEngine());\n\n // 步骤 3:按顺序应用矩形与笔刷路径。\n for (const line of this.result.lines) {\n if (!line || line.points.length === 0) {\n continue;\n }\n\n if (line.shape === 'rect') {\n const a = line.points[0];\n const b = line.points[1];\n\n if (!a || !b) {\n continue;\n }\n const x0 = Math.min(a.x, b.x) * width;\n const y0 = Math.min(a.y, b.y) * height;\n const x1 = Math.max(a.x, b.x) * width;\n const y1 = Math.max(a.y, b.y) * height;\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.fillStyle = line.type === 'paint' ? maskHexColor : maskBackgroundHexColor;\n ctx.fillRect(x0, y0, Math.max(1, x1 - x0), Math.max(1, y1 - y0));\n continue;\n }\n\n ctx.lineWidth = line.brushSize * scale;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.globalCompositeOperation = 'source-over';\n\n if (line.type === 'paint') {\n ctx.strokeStyle = maskHexColor;\n } else {\n ctx.strokeStyle = maskBackgroundHexColor;\n }\n\n ctx.beginPath();\n for (let j = 0; j < line.points.length; j++) {\n const point = line.points[j];\n\n if (!point) {\n continue;\n }\n\n const x = point.x * width;\n const y = point.y * height;\n\n if (j === 0) {\n ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, y);\n }\n }\n ctx.stroke();\n }\n\n // 步骤 4:导出最终 PNG。\n return canvas;\n }\n\n /**\n * 生成当前蒙版的 PNG Data URL。\n * @returns 蒙版图像;没有有效蒙版时返回 undefined。\n */\n getMaskDataUrl (): string | undefined {\n return this.getMask()?.toDataURL();\n }\n\n /**\n * 在蒙版图片 URL 变化时刷新运行时图片。\n * @param change 蒙版配置变更。\n */\n private onConfigChange (change: ConfigChange<MaskConfig>): void {\n if (change.previous.maskImage === change.current.maskImage) {\n return;\n }\n void this.refreshMaskImage(change.current.maskImage);\n }\n\n /**\n * 加载当前配置指定的蒙版图片,并忽略已过期的异步结果。\n * @param url 蒙版图片 URL;空字符串表示清空。\n */\n private async refreshMaskImage (url: string): Promise<void> {\n const loadVersion = ++this.maskImageLoadVersion;\n\n this.maskImage = undefined;\n this.clearRenderObjects();\n if (!url) {\n return;\n }\n\n try {\n const image = await this.loadMaskImage(url);\n\n if (loadVersion !== this.maskImageLoadVersion || this.config.maskImage !== url) {\n return;\n }\n this.maskImage = image;\n } catch (error) {\n if (loadVersion === this.maskImageLoadVersion) {\n console.warn('[MaskGizmo] Failed to load mask image.', error);\n }\n }\n }\n\n /**\n * 更新当前笔刷路径或矩形终点。\n * @param event 鼠标拖拽事件。\n * @param transform 当前元素投影。\n * @returns 是否处理了拖拽。\n */\n private updateGrab (event: InputEventMouseMotion, transform: Matrix3 | undefined): boolean {\n if (!this.mouseGrabbed) {\n return false;\n }\n if (!transform) {\n return true;\n }\n\n const lastLine = this.result.lines[this.result.lines.length - 1];\n\n if (lastLine?.shape === 'rect') {\n lastLine.points[1] = this.toNormalized(new Vector2(event.position.x, event.position.y), transform);\n\n return true;\n }\n\n const point = inverseTransformBoxPoint(transform, new Vector2(event.position.x, event.position.y));\n\n lastLine?.points.push(point);\n\n return true;\n }\n\n /**\n * 将视口坐标转换为包围盒内的归一化坐标。\n * @param p 视口坐标。\n * @param transform 元素 Box2 投影。\n * @returns 钳制到 [0, 1] 的归一化坐标。\n */\n private toNormalized (p: Vector2, transform: Matrix3): Vector2 {\n const point = inverseTransformBoxPoint(transform, p);\n\n return point.clamp(new Vector2(), new Vector2(1, 1));\n }\n\n /** 按当前元素与视口即时计算投影,不写入业务状态或渲染快照。 */\n private getSelectionTransform (): Matrix3 | undefined {\n const selectedItems = this.selectedItems;\n\n if (selectedItems.length !== 1) {\n return undefined;\n }\n\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n\n return getItemViewTransform(selectedItems[0], containerSize);\n }\n\n /** 释放预览纹理与离屏 canvas。 */\n private clearRenderObjects (): void {\n if (this.maskTexture && !this.maskTexture.isDestroyed) {\n this.maskTexture.dispose();\n }\n this.maskTexture = null;\n this.previewCanvas = null;\n }\n\n /**\n * 将蒙版预览绘制到离屏画布。\n * @param width 预览宽度。\n * @param height 预览高度。\n * @returns 离屏画布;创建失败时返回 null。\n */\n private renderPreviewToCanvas (width: number, height: number): HTMLCanvasElement | null {\n // 步骤 1:创建或调整离屏画布并清空内容。\n this.previewCanvas ??= document.createElement('canvas');\n const canvas = this.previewCanvas;\n\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width;\n canvas.height = height;\n }\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n return null;\n }\n\n const { brushColor } = this.config;\n const brushHex = '#' + brushColor.toString(16).padStart(6, '0');\n const scale = GizmoViewportUtils.getViewScale(this._owner.getEngine());\n\n ctx.clearRect(0, 0, width, height);\n\n // 步骤 2:使用基础图片裁剪主体颜色。\n if (this.maskImage) {\n ctx.save();\n ctx.fillStyle = brushHex;\n ctx.fillRect(0, 0, width, height);\n ctx.globalCompositeOperation = 'destination-in';\n ctx.drawImage(this.maskImage, 0, 0, width, height);\n ctx.restore();\n }\n\n // 步骤 3:按顺序叠加或擦除矩形与笔刷路径。\n for (const line of this.result.lines) {\n if (!line || line.points.length === 0) {\n continue;\n }\n\n if (line.shape === 'rect') {\n const a = line.points[0];\n const b = line.points[1];\n\n if (a && b) {\n const x0 = Math.min(a.x, b.x) * width;\n const y0 = Math.min(a.y, b.y) * height;\n const x1 = Math.max(a.x, b.x) * width;\n const y1 = Math.max(a.y, b.y) * height;\n\n if (x1 - x0 > 0.5 || y1 - y0 > 0.5) {\n ctx.save();\n ctx.fillStyle = brushHex;\n ctx.globalCompositeOperation = line.type === 'paint' ? 'source-over' : 'destination-out';\n ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n ctx.restore();\n }\n }\n continue;\n }\n\n ctx.save();\n ctx.lineWidth = line.brushSize * scale;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.strokeStyle = brushHex;\n ctx.globalCompositeOperation = line.type === 'paint' ? 'source-over' : 'destination-out';\n\n ctx.beginPath();\n for (let j = 0; j < line.points.length; j++) {\n const point = line.points[j];\n\n if (!point) {\n continue;\n }\n const x = point.x * width;\n const y = point.y * height;\n\n if (j === 0) {\n ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, y);\n }\n }\n ctx.stroke();\n ctx.restore();\n }\n\n // 步骤 4:返回供纹理上传的画布。\n return canvas;\n }\n\n /**\n * 根据指针位置和蒙版模式刷新光标。\n * @param transform 当前元素投影。\n */\n private refreshCursorResult (transform: Matrix3 | undefined) {\n const point = this._owner.getMousePosition();\n\n this.cursorResult = {\n type: GestureCursorType.NORMAL,\n angle: 0,\n };\n\n if (!point || !transform) {\n return;\n }\n\n if (!transformedBoxContainsPoint(transform, point)) {\n return;\n }\n\n if (this.mode === 'box-paint' || this.mode === 'box-erase') {\n this.cursorResult = { type: GestureCursorType.BOX_SELECT, angle: 0 };\n\n return;\n }\n\n this.cursorResult = {\n type: GestureCursorType.CIRCLE,\n angle: 0,\n radius: this.config.brushSize * GizmoViewportUtils.getViewScale(this._owner.getEngine()) / 2,\n };\n }\n}\n","import type { Gizmo } from '../gizmo';\nimport { GizmoTool } from '../gizmo-tool';\nimport { MaskGizmo } from '../gizmos/mask-gizmo';\n\n/** 蒙版编辑工具。 */\nexport class MaskGizmoTool extends GizmoTool {\n /** @returns 蒙版 Gizmo 图。 */\n override createGizmos (): Gizmo[] {\n return [new MaskGizmo(this.owner)];\n }\n}\n","/**\n * 鼠标拖拽轮次的起始距离(CSS px)。\n */\nexport const DRAG_THRESHOLD_PX = 5;\n\n/**\n * 判断指针相对按下点的累计位移是否达到拖拽阈值。\n * @param startClientX 按下点 X 坐标\n * @param startClientY 按下点 Y 坐标\n * @param currentClientX 当前 X 坐标\n * @param currentClientY 当前 Y 坐标\n * @returns 是否达到拖拽阈值\n */\nexport function isDragThresholdReached (\n startClientX: number,\n startClientY: number,\n currentClientX: number,\n currentClientY: number,\n): boolean {\n return Math.hypot(\n currentClientX - startClientX,\n currentClientY - startClientY,\n ) >= DRAG_THRESHOLD_PX;\n}\n","import type { Gizmo } from '../gizmo';\nimport { GizmoTool } from '../gizmo-tool';\nimport { ItemCreateGizmo, ItemCreateType } from '../gizmos/item-create-gizmo';\n\n/** 元素创建工具。 */\nexport class ItemCreateGizmoTool extends GizmoTool {\n /** 当前元素创建类型。 */\n createType: ItemCreateType = ItemCreateType.NONE;\n\n /** @returns 指定创建类型的 Gizmo 图。 */\n override createGizmos (): Gizmo[] {\n const gizmo = new ItemCreateGizmo(this.owner);\n\n gizmo.createType = this.createType;\n\n return [gizmo];\n }\n}\n","import { EventEmitter } from '@galacean/effects';\nimport { cloneConfigValue, freezeConfigValue, type AnyConfigDefinition, type ConfigChange, type ConfigValue } from './config-definition';\n\n/** 任意配置项的一次变更。 */\nexport type AnyConfigChange = {\n /** 配置唯一标识。 */\n id: string,\n /** 本次接受的增量配置。 */\n partial: Readonly<Record<string, unknown>>,\n /** 变更前的完整配置。 */\n previous: Readonly<Record<string, unknown>>,\n /** 变更后的完整配置。 */\n current: Readonly<Record<string, unknown>>,\n};\n\n/** 配置管理器事件参数。 */\nexport type ConfigManagerEvents = {\n /** 任意配置变更事件。 */\n configChange: [AnyConfigChange],\n};\n\n/**\n * 深度比较两个配置值。\n * @param left 左侧配置值\n * @param right 右侧配置值\n * @returns 两个配置值是否相等\n */\nfunction configEqual (left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) {\n return true;\n }\n if (Array.isArray(left) || Array.isArray(right)) {\n return Array.isArray(left)\n && Array.isArray(right)\n && left.length === right.length\n && left.every((value, index) => configEqual(value, right[index]));\n }\n if (!left || !right || typeof left !== 'object' || typeof right !== 'object') {\n return false;\n }\n\n const leftRecord = left as Record<string, unknown>;\n const leftKeys = Object.keys(leftRecord);\n const rightRecord = right as Record<string, unknown>;\n\n return leftKeys.length === Object.keys(rightRecord).length\n && leftKeys.every(key => configEqual(leftRecord[key], rightRecord[key]));\n}\n\n/**\n * 创建可安全存储的不可变配置副本。\n * @param value 原始配置值\n * @returns 冻结后的配置副本\n */\nfunction createStoredValue<T> (value: T): T {\n return freezeConfigValue(cloneConfigValue(value));\n}\n\n/** 管理配置定义、当前值和变更订阅。 */\nexport class ConfigManager extends EventEmitter<ConfigManagerEvents> {\n private readonly values = new Map<string, Record<string, unknown>>();\n private readonly definitions = new Map<string, AnyConfigDefinition>();\n\n /**\n * 获取配置当前值,首次读取时使用默认值初始化。\n * @param definition 配置定义\n * @returns 当前不可变配置\n */\n get<D extends AnyConfigDefinition> (\n definition: D,\n ): Readonly<ConfigValue<D>> {\n this.assertDefinition(definition);\n let value = this.values.get(definition.id);\n\n if (!value) {\n value = createStoredValue(definition.defaults);\n this.values.set(definition.id, value);\n }\n\n return value as ConfigValue<D>;\n }\n\n /**\n * 合并并保存增量配置。\n * @param definition 配置定义\n * @param partial 待合并的增量配置\n */\n set<D extends AnyConfigDefinition> (\n definition: D,\n partial: Partial<ConfigValue<D>>,\n ): void {\n this.assertDefinition(definition);\n const previous = this.get(definition);\n const validated = definition.validate?.(partial);\n\n if (definition.validate && !validated) {\n return;\n }\n const accepted = validated ?? partial;\n const current = createStoredValue({ ...previous, ...accepted }) as ConfigValue<D>;\n\n if (configEqual(previous, current)) {\n return;\n }\n\n this.values.set(definition.id, current);\n const change = {\n id: definition.id,\n partial: createStoredValue(accepted),\n previous,\n current,\n };\n\n this.emit('configChange', change);\n }\n\n /**\n * 将配置恢复为默认值。\n * @param definition 配置定义\n */\n reset (definition: AnyConfigDefinition): void {\n this.assertDefinition(definition);\n const previous = this.get(definition);\n const current = createStoredValue(definition.defaults);\n\n if (configEqual(previous, current)) {\n return;\n }\n this.values.set(definition.id, current);\n const change = {\n id: definition.id,\n partial: {},\n previous,\n current,\n };\n\n this.emit('configChange', change);\n }\n\n /**\n * 订阅指定配置的变更。\n * @param definition 配置定义\n * @param listener 配置变更回调\n * @returns 取消订阅函数\n */\n onChange<D extends AnyConfigDefinition> (\n definition: D,\n listener: (change: ConfigChange<ConfigValue<D>>) => void,\n ): () => void {\n this.assertDefinition(definition);\n /** @param change 任意配置的变更事件。 */\n const handler = (change: AnyConfigChange) => {\n if (change.id === definition.id) {\n listener({\n partial: change.partial,\n previous: change.previous,\n current: change.current,\n } as ConfigChange<ConfigValue<D>>);\n }\n };\n\n return this.on('configChange', handler);\n }\n\n /**\n * 注册配置定义并校验标识冲突。\n * @param definition 配置定义\n */\n private assertDefinition (definition: AnyConfigDefinition): void {\n const existing = this.definitions.get(definition.id);\n\n if (existing && existing !== definition) {\n throw new Error(`[ConfigManager] Duplicate config id \"${definition.id}\".`);\n }\n this.definitions.set(definition.id, definition);\n }\n}\n","import type { Gizmo } from './gizmo';\nimport type { HandGizmo } from './gizmos/hand-gizmo';\nimport type { IconGizmo } from './gizmos/icon-gizmo';\nimport type { ItemCreateGizmo } from './gizmos/item-create-gizmo';\nimport type { LoadingGizmo } from './gizmos/loading-gizmo';\nimport type { MaskGizmo } from './gizmos/mask-gizmo';\nimport type { ImageCutGizmo } from './gizmos/image-cut-gizmo';\nimport type { ImageExpandGizmo } from './gizmos/image-expand-gizmo';\nimport type { ViewportOverlayGizmo } from './gizmos/viewport-overlay-gizmo';\nimport type { SpriteTextEditGizmo } from './gizmos/sprite-text-edit-gizmo';\nimport type { TextGizmo } from './gizmos/text-gizmo';\nimport type { ResizeSelectionGizmo } from './gizmos/resize-selection-gizmo';\nimport type { ChangeSelectionGizmo } from './gizmos/change-selection-gizmo';\nimport type { MoveSelectionGizmo } from './gizmos/move-selection-gizmo';\nimport type { BoxSelectionGizmo } from './gizmos/box-selection-gizmo';\nimport type { ClickDragMultiplexGizmo } from './gizmos/click-drag-multiplex-gizmo';\nimport { ConfigManager } from './configs/config-manager';\nimport type { LeaveTextEditGizmo } from './gizmos/leave-text-edit-gizmo';\nimport type { EnterEditModeGizmo } from './gizmos/enter-edit-mode-gizmo';\nimport type { LeaveEffectsEditGizmo } from './gizmos/leave-effects-edit-gizmo';\nimport type { CornerRotationGizmo } from './gizmos/corner-rotation-gizmo';\n\n/** 当前交互图中可按类型查询的内置 Gizmo 映射。 */\nexport type GizmoTypeMap = {\n /** 选区切换 Gizmo。 */\n 'change-selection': ChangeSelectionGizmo,\n /** 选区移动 Gizmo。 */\n 'move-selection': MoveSelectionGizmo,\n /** 框选 Gizmo。 */\n 'box-selection': BoxSelectionGizmo,\n /** 点击与拖拽仲裁 Gizmo。 */\n 'click-drag-multiplex': ClickDragMultiplexGizmo,\n /** 角点旋转 Gizmo。 */\n 'corner-rotation': CornerRotationGizmo,\n /** 视口平移 Gizmo。 */\n hand: HandGizmo,\n /** 媒体图标 Gizmo。 */\n icon: IconGizmo,\n /** 元素创建 Gizmo。 */\n 'item-create': ItemCreateGizmo,\n /** 加载状态 Gizmo。 */\n loading: LoadingGizmo,\n /** 蒙版编辑 Gizmo。 */\n mask: MaskGizmo,\n /** 图片裁切 Gizmo。 */\n 'image-cut': ImageCutGizmo,\n /** 图片扩边 Gizmo。 */\n 'image-expand': ImageExpandGizmo,\n /** 视口覆盖层 Gizmo。 */\n 'viewport-overlay': ViewportOverlayGizmo,\n /** 精准文字编辑 Gizmo。 */\n 'sprite-text-edit': SpriteTextEditGizmo,\n /** 文本编辑 Gizmo。 */\n text: TextGizmo,\n /** 选区缩放 Gizmo。 */\n 'resize-selection': ResizeSelectionGizmo,\n /** 文本编辑退出 Gizmo。 */\n 'leave-text-edit': LeaveTextEditGizmo,\n /** 子编辑模式进入 Gizmo。 */\n 'enter-edit-mode': EnterEditModeGizmo,\n /** 动效编辑退出 Gizmo。 */\n 'leave-effects-edit': LeaveEffectsEditGizmo,\n};\n\n/** Gizmo 错误上报阶段。 */\nexport type GizmoErrorPhase =\n | 'gizmo-init'\n | 'gizmo-actionstart'\n | 'gizmo-actionupdate'\n | 'gizmo-actioncommit'\n | 'gizmo-key'\n | 'gizmo-draw';\n\n/**\n * Gizmo 错误处理函数。\n * @param error 原始错误\n * @param phase 错误阶段\n * @param gizmoType 相关 Gizmo 类型\n */\nexport type GizmoDispatchErrorHandler = (\n error: unknown,\n phase: GizmoErrorPhase,\n gizmoType?: string,\n) => void;\n\n/** 管理当前交互图中的 Gizmo 实例和配置。 */\nexport class GizmoManager {\n /** Gizmo 配置管理器。 */\n readonly configs = new ConfigManager();\n\n private _activeGizmos: Gizmo[] = [];\n\n /** 当前交互图的顶层 Gizmo。 */\n get activeGizmos (): Gizmo[] {\n return this._activeGizmos;\n }\n\n /**\n * 替换当前交互图的顶层 Gizmo。\n * @param gizmos 新的有序 Gizmo 列表\n */\n set activeGizmos (gizmos: Gizmo[]) {\n this._activeGizmos = [...gizmos];\n }\n\n /**\n * 按类型获取首个活动 Gizmo。\n * @param type Gizmo 类型\n * @returns 匹配的 Gizmo;不存在时返回 undefined\n */\n get<K extends keyof GizmoTypeMap> (type: K): GizmoTypeMap[K] | undefined;\n get (type: string): Gizmo | undefined;\n get (type: string): Gizmo | undefined {\n return this.findGizmosByType(type)[0];\n }\n\n /** 按宿主声明顺序执行当前图所有实例的每帧更新。 */\n onUpdate (): void {\n for (const gizmo of this._activeGizmos) {\n gizmo.onUpdate();\n }\n }\n\n /** 销毁当前交互图。 */\n dispose (): void {\n for (const gizmo of this._activeGizmos) {\n gizmo.dispose();\n }\n this._activeGizmos = [];\n }\n\n /**\n * 查找指定类型的全部活动 Gizmo。\n * @param type Gizmo 类型\n * @returns 匹配的 Gizmo 列表\n */\n private findGizmosByType (type: string): Gizmo[] {\n return this.getAllManagedGizmos()\n .filter(gizmo => gizmo.type === type);\n }\n\n /** 获取去重后的全部受管 Gizmo。 */\n private getAllManagedGizmos (): Gizmo[] {\n return Array.from(new Set([\n ...this._activeGizmos,\n ...this.getMultiplexCandidates(),\n ]));\n }\n\n /** 获取点击与拖拽仲裁器托管的全部候选。 */\n private getMultiplexCandidates (): Gizmo[] {\n const multiplex = this._activeGizmos.find(gizmo => gizmo.type === 'click-drag-multiplex') as ClickDragMultiplexGizmo;\n\n if (!multiplex) {\n return [];\n }\n const auxiliary = multiplex.auxiliaryBehavior();\n\n return Array.from(new Set([\n ...multiplex.clickCandidates(),\n ...multiplex.dragCandidates(),\n ...(auxiliary ? [auxiliary] : []),\n ]));\n }\n}\n","import { EventEmitter } from '@galacean/effects';\nimport { type Box2 } from '@galacean/effects-math/es/extension/index';\nimport { Vector2 } from '../math';\n\n/** 单个元素的加载提示配置。 */\nexport type LoadingItemOptions = {\n /** 加载提示文本。 */\n text?: string,\n /** 相对目标元素实时包围盒左上角的视图像素偏移;未设置时文案在 loading 区域内居中。 */\n position?: Vector2,\n /** 打开 loading 时是否移除目标元素的选中状态。 */\n clearSelected?: boolean,\n /** 自定义加载区域。 */\n loadingBox?: Box2,\n};\n\n/** 单个元素的当前加载状态。 */\nexport interface LoadingItemState {\n /** 加载提示配置。 */\n tip: LoadingItemOptions,\n /** 自定义加载区域。 */\n loadingBox?: Box2,\n}\n\n/** 加载状态集合的一次变更。 */\nexport type LoadingManagerChange = {\n /** 变更后的全部加载元素 ID。 */\n ids: string[],\n /** 新增加载元素 ID。 */\n addedIds: string[],\n /** 已删除加载元素 ID。 */\n removedIds: string[],\n /** 已更新加载元素 ID。 */\n updatedIds: string[],\n};\n\n/** 加载状态管理器事件参数。 */\ntype LoadingManagerEvents = {\n /** 加载集合变更事件。 */\n change: [LoadingManagerChange],\n /** 请求移除选中元素事件。 */\n removeselecteditems: [string[]],\n};\n\n/** 管理元素加载状态并向 LoadingGizmo 提供稳定数据。 */\nexport class LoadingManager extends EventEmitter<LoadingManagerEvents> {\n private readonly items = new Map<string, LoadingItemState>();\n\n /** 当前加载元素 ID。 */\n get ids (): string[] {\n return Array.from(this.items.keys());\n }\n\n /**\n * 获取元素加载状态。\n * @param id 元素 ID\n * @returns 加载状态;不存在时返回 undefined\n */\n get (id: string): LoadingItemState | undefined {\n return this.items.get(id);\n }\n\n /**\n * 添加元素加载状态。\n * @param id 元素 ID\n * @param options 加载提示配置\n */\n add (id: string, options?: LoadingItemOptions): void {\n if (this.items.has(id)) {\n return;\n }\n this.items.set(id, {\n tip: {\n text: options?.text ?? '',\n position: options?.position ? new Vector2(options.position.x, options.position.y) : undefined,\n },\n loadingBox: options?.loadingBox?.clone(),\n });\n this.emitChange({ addedIds: [id], removedIds: [], updatedIds: [] });\n if (options?.clearSelected) {\n this.emit('removeselecteditems', [id]);\n }\n }\n\n /**\n * 删除元素加载状态。\n * @param id 元素 ID\n */\n delete (id: string): void {\n if (!this.items.delete(id)) {\n return;\n }\n this.emitChange({ addedIds: [], removedIds: [id], updatedIds: [] });\n }\n\n /**\n * 更新元素加载提示。\n * @param id 元素 ID\n * @param options 增量加载提示配置\n */\n update (id: string, options: LoadingItemOptions): void {\n const item = this.items.get(id);\n\n if (!item) {\n console.warn(`Loading item ${id} not found.`);\n\n return;\n }\n if (options.text !== undefined) {\n item.tip.text = options.text;\n }\n if (options.position !== undefined) {\n item.tip.position = new Vector2(options.position.x, options.position.y);\n }\n this.emitChange({ addedIds: [], removedIds: [], updatedIds: [id] });\n }\n\n /**\n * 发出包含完整 ID 列表的加载状态变更。\n * @param change 增量变更\n */\n private emitChange (change: Omit<LoadingManagerChange, 'ids'>): void {\n this.emit('change', { ids: this.ids, ...change });\n }\n}\n","import type { AutoLayoutConfig } from './types';\nimport type { Box2 } from '@galacean/effects-math/es/extension/index';\n\n/** 参与画板自动布局的元素。 */\nexport type FrameLayoutItem = {\n /** 元素 ID。 */\n id: string,\n /** 元素包围盒。 */\n box: Box2,\n /** 已指定的行号。 */\n row?: number,\n /** 已指定的列号。 */\n column?: number,\n};\n\n/** 自动布局后的元素位置。 */\nexport type FrameLayoutResultItem = {\n /** 元素 ID。 */\n id: string,\n /** 相对画板左上角的中心位置。 */\n position: [number, number],\n /** 行号。 */\n row: number,\n /** 列号。 */\n column: number,\n};\n\n/** 画板自动布局选项。 */\nexport type FrameAutoLayoutOptions = {\n /** 画板内边距。 */\n padding?: number,\n /** 元素间距。 */\n gap?: number,\n /** 行宽和行数约束。 */\n config?: AutoLayoutConfig,\n};\n\n/** 画板自动布局结果。 */\nexport type FrameAutoLayoutResult = {\n /** 布局后的元素。 */\n items: FrameLayoutResultItem[],\n /** 布局所需的画板尺寸。 */\n size: [number, number],\n};\n\n/** 带内部坐标的布局结果。 */\ntype PositionedFrameLayoutItem = FrameLayoutResultItem & {\n /** 元素中心 X 坐标。 */\n x: number,\n /** 元素中心 Y 坐标。 */\n y: number,\n};\n\n/**\n * 按行号对元素分组。\n * @param items 待分组元素\n * @returns 行号到元素列表的映射\n */\nfunction groupItemsByRow<T extends { row?: number }> (items: T[]): Map<number, T[]> {\n const groups = new Map<number, T[]>();\n\n for (const item of items) {\n const row = item.row ?? 0;\n const group = groups.get(row);\n\n if (group) {\n group.push(item);\n } else {\n groups.set(row, [item]);\n }\n }\n\n return groups;\n}\n\n/**\n * 按货架规则排列未指定列位置的元素。\n * @param items 待布局元素\n * @param padding 画板内边距\n * @param gap 元素间距\n * @param config 行宽和行数约束\n * @returns 带内部坐标的布局结果\n */\nfunction calculateShelfLayout (\n items: FrameLayoutItem[],\n padding: number,\n gap: number,\n config?: AutoLayoutConfig,\n): { items: PositionedFrameLayoutItem[], size: [number, number] } {\n // 1. 按行号组织元素并初始化布局边界。\n const placedItems: PositionedFrameLayoutItem[] = [];\n const rowGroups = groupItemsByRow(items);\n const sortedRows = Array.from(rowGroups.keys()).sort((a, b) => a - b);\n let currentY = padding;\n let maxX = padding;\n\n // 2. 逐行排列元素,并在达到宽度约束时换行。\n for (const row of sortedRows) {\n const rowItems = rowGroups.get(row) ?? [];\n let currentX = padding;\n let currentShelfHeight = 0;\n let column = 0;\n let currentRowCount = 1;\n\n for (const item of rowItems) {\n const { x: width, y: height } = item.box.getSize();\n const wouldExceedMaxWidth = config?.maxRowWidth !== undefined\n && currentX + width + padding > config.maxRowWidth;\n let needNewShelf = wouldExceedMaxWidth && currentX > padding;\n\n if (needNewShelf && config?.maxRowCount !== undefined && currentRowCount >= config.maxRowCount) {\n needNewShelf = false;\n }\n if (needNewShelf) {\n currentY += currentShelfHeight + gap;\n currentX = padding;\n currentShelfHeight = height;\n column = 0;\n currentRowCount++;\n } else {\n currentShelfHeight = Math.max(currentShelfHeight, height);\n }\n placedItems.push({\n id: item.id,\n position: [currentX + width / 2, currentY + height / 2],\n x: currentX + width / 2,\n y: currentY + height / 2,\n row,\n column,\n });\n maxX = Math.max(maxX, currentX + width + padding);\n currentX += width + gap;\n column++;\n }\n if (rowItems.length > 0) {\n currentY += currentShelfHeight + gap;\n }\n }\n\n // 3. 根据已占用范围计算画板尺寸。\n return {\n items: placedItems,\n size: [Math.max(maxX, padding * 2), Math.max(currentY - gap + padding, padding * 2)],\n };\n}\n\n/**\n * 保留已指定列,并为其余元素分配空闲列。\n * @param items 待布局元素\n * @param padding 画板内边距\n * @param gap 元素间距\n * @returns 带内部坐标的布局结果\n */\nfunction calculateMixedLayout (\n items: FrameLayoutItem[],\n padding: number,\n gap: number,\n): { items: PositionedFrameLayoutItem[], size: [number, number] } {\n // 1. 按行号组织元素并初始化布局边界。\n const placedItems: PositionedFrameLayoutItem[] = [];\n const rowGroups = groupItemsByRow(items);\n const sortedRows = Array.from(rowGroups.keys()).sort((a, b) => a - b);\n let currentY = padding;\n let maxX = padding;\n\n // 2. 逐行保留显式列号,并将无列号元素填入空位。\n for (const row of sortedRows) {\n const rowItems = rowGroups.get(row) ?? [];\n const withColumn = rowItems.filter(item => item.column !== undefined);\n const withoutColumn = rowItems.filter(item => item.column === undefined);\n const rowHeight = Math.max(...rowItems.map(item => item.box.getSize().y), 0);\n const assignments = new Map<number, FrameLayoutItem>();\n\n for (const item of [...withColumn].sort((a, b) => (a.column ?? 0) - (b.column ?? 0))) {\n let column = item.column ?? 0;\n\n while (assignments.has(column)) {\n column++;\n }\n assignments.set(column, item);\n }\n let nextColumn = 0;\n\n for (const item of withoutColumn) {\n while (assignments.has(nextColumn)) {\n nextColumn++;\n }\n assignments.set(nextColumn++, item);\n }\n\n let currentX = padding;\n\n for (const column of Array.from(assignments.keys()).sort((a, b) => a - b)) {\n const item = assignments.get(column)!;\n const { x: width, y: height } = item.box.getSize();\n\n placedItems.push({\n id: item.id,\n position: [currentX + width / 2, currentY + height / 2],\n x: currentX + width / 2,\n y: currentY + height / 2,\n row,\n column,\n });\n maxX = Math.max(maxX, currentX + width + padding);\n currentX += width + gap;\n }\n currentY += rowHeight + gap;\n }\n\n // 3. 根据已占用范围计算画板尺寸。\n return {\n items: placedItems,\n size: [Math.max(maxX, padding * 2), Math.max(currentY - gap + padding, padding * 2)],\n };\n}\n\n/**\n * 计算画板内元素的自动布局和画板尺寸。\n * @param items 待布局元素\n * @param options 布局间距与行约束\n * @returns 自动布局结果\n */\nexport function computeFrameAutoLayout (\n items: FrameLayoutItem[],\n options: FrameAutoLayoutOptions = {},\n): FrameAutoLayoutResult {\n const padding = options.padding ?? 20;\n const gap = options.gap ?? 5;\n\n if (items.length === 0) {\n return { items: [], size: [padding * 2, padding * 2] };\n }\n\n const layout = items.some(item => item.row !== undefined)\n ? calculateMixedLayout(items, padding, gap)\n : calculateShelfLayout(items, padding, gap, options.config);\n\n return {\n items: layout.items.map(({ id, position, row, column }) => ({ id, position, row, column })),\n size: layout.size,\n };\n}\n","import type { Engine } from '@galacean/effects';\nimport { Box2 } from '@galacean/effects-math/es/extension/index';\nimport { type Vector2 } from '../math';\nimport { FrameLayoutMode, type AutoLayoutConfig, type FrameInfo, type LayoutInfo } from './types';\nimport { GizmoViewportUtils } from '../viewport/viewport-utils';\nimport { getItemViewBox } from '../items/item-geometry';\nimport { getPlayerItemById } from '../items/item-hierarchy';\nimport { isFramePlayerItem } from '../items/item-predicates';\nimport { computeFrameAutoLayout, type FrameAutoLayoutOptions, type FrameAutoLayoutResult, type FrameLayoutItem } from './frame-auto-layout';\n\n/** 画板运行时布局数据。 */\nexport type FrameRecord = {\n /** 画板元素实例 ID。 */\n id: string,\n /** 布局模式。 */\n layoutMode: FrameLayoutMode,\n /** 子元素实例 ID。 */\n children: string[],\n /** 自动布局约束。 */\n autoLayoutConfig?: AutoLayoutConfig,\n /** 子元素布局信息。 */\n layoutInfos: Record<string, LayoutInfo>,\n};\n\n/** 新建或更新画板数据的输入。 */\nexport type FrameRecordInput = {\n /** 画板元素实例 ID。 */\n id: string,\n /** 布局模式。 */\n layoutMode?: FrameLayoutMode,\n /** 子元素实例 ID。 */\n children?: readonly string[],\n /** 自动布局约束。 */\n autoLayoutConfig?: AutoLayoutConfig,\n /** 子元素布局信息。 */\n layoutInfos?: Readonly<Record<string, LayoutInfo>>,\n};\n\n/**\n * 复制单个布局信息。\n * @param info 原布局信息\n * @returns 布局信息副本\n */\nfunction cloneLayoutInfo (info: LayoutInfo): LayoutInfo {\n return {\n row: info.row,\n column: info.column,\n position: info.position ? [...info.position] : undefined,\n };\n}\n\n/**\n * 复制子元素布局信息表。\n * @param infos 原布局信息表\n * @returns 布局信息表副本\n */\nfunction cloneLayoutInfos (infos: Readonly<Record<string, LayoutInfo>> | undefined): Record<string, LayoutInfo> {\n const result: Record<string, LayoutInfo> = {};\n const source = infos ?? {};\n\n for (const id of Object.keys(source)) {\n result[id] = cloneLayoutInfo(source[id]);\n }\n\n return result;\n}\n\n/**\n * 将画板输入归一化为完整运行时数据。\n * @param record 画板输入\n * @returns 完整画板数据副本\n */\nfunction cloneRecord (record: FrameRecordInput): FrameRecord {\n return {\n id: record.id,\n layoutMode: record.layoutMode ?? FrameLayoutMode.FREE,\n children: [...record.children ?? []],\n autoLayoutConfig: record.autoLayoutConfig ? { ...record.autoLayoutConfig } : undefined,\n layoutInfos: cloneLayoutInfos(record.layoutInfos),\n };\n}\n\n/** 管理画板布局数据及其视图投影。 */\nexport class FrameManager {\n private readonly records = new Map<string, FrameRecord>();\n private readonly boxes = new Map<string, Box2>();\n private readonly engine: Engine;\n\n /**\n * @param engine 用于更新画板投影的 Effects 引擎\n */\n constructor (engine: Engine) {\n this.engine = engine;\n }\n\n /**\n * 新建或覆盖画板数据。\n * @param input 画板数据\n * @returns 保存后的画板记录\n */\n upsertFrame (input: FrameRecordInput): FrameRecord {\n const record = cloneRecord(input);\n\n this.records.set(record.id, record);\n\n return record;\n }\n\n /**\n * 获取画板记录,不存在时创建。\n * @param input 画板数据\n * @returns 已存在或新建的画板记录\n */\n ensureFrame (input: FrameRecordInput): FrameRecord {\n return this.records.get(input.id) ?? this.upsertFrame(input);\n }\n\n /**\n * 删除画板记录和投影。\n * @param id 画板 ID\n * @returns 是否删除了画板记录\n */\n deleteFrame (id: string): boolean {\n this.boxes.delete(id);\n\n return this.records.delete(id);\n }\n\n /** 清空全部画板数据和投影。 */\n clear (): void {\n this.records.clear();\n this.boxes.clear();\n }\n\n /**\n * 使用输入列表重建画板数据。\n * @param records 画板数据列表\n */\n hydrate (records: readonly FrameRecordInput[]): void {\n this.clear();\n for (const record of records) {\n this.upsertFrame(record);\n }\n }\n\n /** @returns 全部画板数据的深拷贝快照。 */\n snapshot (): FrameRecord[] {\n return Array.from(this.records.values(), cloneRecord);\n }\n\n /**\n * 获取指定画板数据。\n * @param id 画板 ID\n * @returns 画板数据;不存在时返回 undefined\n */\n getFrame (id: string): Readonly<FrameRecord> | undefined {\n return this.records.get(id);\n }\n\n /** @returns 全部画板数据。 */\n getFrames (): readonly Readonly<FrameRecord>[] {\n return Array.from(this.records.values());\n }\n\n /**\n * 设置画板布局模式。\n * @param id 画板 ID\n * @param layoutMode 布局模式\n */\n setLayoutMode (id: string, layoutMode: FrameLayoutMode): void {\n const record = this.records.get(id);\n\n if (record) {\n record.layoutMode = layoutMode;\n }\n }\n\n /**\n * 替换画板子元素列表。\n * @param id 画板 ID\n * @param children 子元素 ID\n */\n setChildren (id: string, children: readonly string[]): void {\n const record = this.records.get(id);\n\n if (record) {\n record.children = [...children];\n }\n }\n\n /**\n * 向画板添加子元素。\n * @param id 画板 ID\n * @param childId 子元素 ID\n * @returns 是否添加成功\n */\n addChild (id: string, childId: string): boolean {\n const record = this.records.get(id);\n\n if (!record || record.children.includes(childId)) {\n return false;\n }\n record.children.push(childId);\n\n return true;\n }\n\n /**\n * 从画板移除子元素及其布局信息。\n * @param id 画板 ID\n * @param childId 子元素 ID\n * @returns 是否移除成功\n */\n removeChild (id: string, childId: string): boolean {\n const record = this.records.get(id);\n\n if (!record) {\n return false;\n }\n const index = record.children.indexOf(childId);\n\n if (index < 0) {\n return false;\n }\n record.children.splice(index, 1);\n const layoutInfos = { ...record.layoutInfos };\n\n delete layoutInfos[childId];\n record.layoutInfos = layoutInfos;\n\n return true;\n }\n\n /**\n * 替换画板的全部子元素布局信息。\n * @param id 画板 ID\n * @param layoutInfos 子元素布局信息\n */\n setLayoutInfos (id: string, layoutInfos: Readonly<Record<string, LayoutInfo>> | undefined): void {\n const record = this.records.get(id);\n\n if (record) {\n record.layoutInfos = cloneLayoutInfos(layoutInfos);\n }\n }\n\n /**\n * 设置单个子元素的布局信息。\n * @param id 画板 ID\n * @param childId 子元素 ID\n * @param layoutInfo 布局信息\n */\n setChildLayoutInfo (id: string, childId: string, layoutInfo: LayoutInfo): void {\n const record = this.records.get(id);\n\n if (record) {\n record.layoutInfos[childId] = cloneLayoutInfo(layoutInfo);\n }\n }\n\n /**\n * 设置画板自动布局约束。\n * @param id 画板 ID\n * @param config 自动布局约束\n */\n setAutoLayoutConfig (id: string, config: AutoLayoutConfig | undefined): void {\n const record = this.records.get(id);\n\n if (record) {\n record.autoLayoutConfig = config ? { ...config } : undefined;\n }\n }\n\n /**\n * 使用画板当前布局信息计算自动布局。\n * @param frameId 画板 ID\n * @param items 待布局元素\n * @param options 内边距和元素间距\n * @returns 自动布局结果;画板不存在时返回 undefined\n */\n computeAutoLayout (\n frameId: string,\n items: readonly Pick<FrameLayoutItem, 'id' | 'box'>[],\n options: Omit<FrameAutoLayoutOptions, 'config'> = {},\n ): FrameAutoLayoutResult | undefined {\n const record = this.records.get(frameId);\n\n if (!record) {\n return undefined;\n }\n\n return computeFrameAutoLayout(items.map(item => ({\n ...item,\n row: record.layoutInfos[item.id]?.row,\n column: record.layoutInfos[item.id]?.column,\n })), {\n ...options,\n config: record.autoLayoutConfig,\n });\n }\n\n /**\n * 计算元素重排后的完整布局信息。\n * @param frameId 画板 ID\n * @param draggedItemId 被拖拽元素 ID\n * @param fromRow 原行号\n * @param fromColumn 原列号\n * @param toRow 目标行号\n * @param toColumn 目标列号\n * @returns 重排后的布局信息;元素不属于画板时返回 undefined\n */\n computeLayoutInfosAfterReorder (\n frameId: string,\n draggedItemId: string,\n fromRow: number,\n fromColumn: number,\n toRow: number,\n toColumn: number,\n ): Record<string, LayoutInfo> | undefined {\n // 1. 校验拖拽元素并复制当前布局信息。\n const record = this.records.get(frameId);\n\n if (!record?.children.includes(draggedItemId)) {\n return undefined;\n }\n\n const result = cloneLayoutInfos(record.layoutInfos);\n\n // 2. 根据同行或跨行移动调整受影响元素的列号。\n if (fromRow !== toRow || fromColumn !== toColumn) {\n if (fromRow === toRow) {\n for (const [id, info] of Object.entries(result)) {\n if (id === draggedItemId || info.row !== fromRow) {\n continue;\n }\n if (fromColumn < toColumn && info.column > fromColumn && info.column <= toColumn) {\n info.column--;\n } else if (fromColumn > toColumn && info.column >= toColumn && info.column < fromColumn) {\n info.column++;\n }\n }\n } else {\n for (const [id, info] of Object.entries(result)) {\n if (id !== draggedItemId && info.row === fromRow && info.column > fromColumn) {\n info.column--;\n }\n }\n const targetItems = Object.entries(result)\n .filter(([id, info]) => id !== draggedItemId && info.row === toRow && info.column >= toColumn)\n .sort((a, b) => b[1].column - a[1].column);\n\n for (const [, info] of targetItems) {\n info.column++;\n }\n }\n }\n\n // 3. 写入拖拽元素的目标位置。\n result[draggedItemId] = {\n ...result[draggedItemId],\n row: toRow,\n column: toColumn,\n };\n\n return result;\n }\n\n /** 在每帧更新时同步画板投影。 */\n onUpdate (): void {\n this.updateViewBoxes();\n }\n\n /** 更新全部画板的视图包围盒。 */\n updateViewBoxes (): void {\n const engine = this.engine;\n const containerSize = GizmoViewportUtils.getContainerSize(engine.canvas.parentElement!);\n\n for (const record of this.records.values()) {\n const item = getPlayerItemById(engine.sceneServer.compositions[0], record.id);\n\n this.boxes.set(\n record.id,\n item && isFramePlayerItem(item)\n ? getItemViewBox(item, containerSize)\n : new Box2(),\n );\n }\n for (const id of Array.from(this.boxes.keys())) {\n if (!this.records.has(id)) {\n this.boxes.delete(id);\n }\n }\n }\n\n /** @returns 带当前视图包围盒的全部画板信息。 */\n getViewInfos (): FrameInfo[] {\n return Array.from(this.records.values(), record => this.toViewInfo(record));\n }\n\n /**\n * 获取指定画板的视图信息。\n * @param id 画板 ID\n * @returns 画板视图信息;不存在时返回 undefined\n */\n getViewInfo (id: string): FrameInfo | undefined {\n const record = this.records.get(id);\n\n return record ? this.toViewInfo(record) : undefined;\n }\n\n /**\n * 查找元素所属的画板。\n * @param itemId 元素 ID\n * @returns 父画板记录;不存在时返回 undefined\n */\n getParentFrame (itemId: string): Readonly<FrameRecord> | undefined {\n return Array.from(this.records.values()).find(record => record.children.includes(itemId));\n }\n\n /**\n * 查找包含指定视图坐标的画板。\n * @param point 视图坐标\n * @returns 命中的画板视图信息\n */\n findFrameAt (point: Vector2): FrameInfo | undefined {\n return this.getViewInfos().find(info => info.box.containsPoint(point));\n }\n\n /**\n * 将画板记录转换为视图信息。\n * @param record 画板记录\n * @returns 画板视图信息\n */\n private toViewInfo (record: FrameRecord): FrameInfo {\n return {\n id: record.id,\n box: this.boxes.get(record.id) ?? new Box2(),\n layoutMode: record.layoutMode,\n children: [...record.children],\n layoutInfos: cloneLayoutInfos(record.layoutInfos),\n };\n }\n}\n","import { EventEmitter, type Engine, type Composition, type InputEventMouseButton, type Region, spec, type VFXItem, TextComponent, SpriteComponent, FrameComponent, addItem } from '@galacean/effects';\nimport { VideoComponent } from '@galacean/effects-plugin-multimedia';\nimport { RichTextComponent } from '@galacean/effects-plugin-rich-text';\nimport { Box2 } from '@galacean/effects-math/es/extension/index';\nimport { Ray, Vector2, setBoxFromPoints, transformedBoxContainsPoint } from '../math';\nimport { GizmoViewportUtils } from '../viewport/viewport-utils';\nimport {\n getPlayerItemById,\n getEffectsPlayerItemOwner,\n getItemViewBox,\n getItemViewTransform,\n getItemChildren,\n isGroupPlayerItem,\n isFramePlayerItem,\n isPlayerItemVisible,\n} from '../items';\nimport { viewPositionToNDC } from '../viewport';\n\n/** Hover state shared by input observation and the Tool UI renderer. */\nexport type HoveringResults = {\n /** Externally observable hover target. */\n itemId?: string,\n /** Target currently submitted to the Tool UI hover renderer. */\n overlayItemId?: string,\n};\n\n/** 点选或框选的原始命中结果。 */\ntype HitTestResult = {\n /** 命中检测射线。 */\n ray: Ray,\n /** 引擎返回的命中区域。 */\n regions: Region[],\n};\n\n/**\n * 画板元素左上角点击交互区域尺寸\n */\nconst FRAME_INTERACTION_WIDTH = 40;\nconst FRAME_INTERACTION_HEIGHT = 20;\n\n/** Selection 事件参数。 */\nexport type SelectionEvents = {\n /** 选中集变更。 */\n 'selectionchange': [{\n /** 变更前的选中元素 ID。 */\n oldSelectedIds: string[],\n /** 变更后的选中元素 ID。 */\n newSelectedIds: string[],\n }],\n /** 预选态变更。 */\n 'preselectchange': [{\n /** 当前预选元素 ID。 */\n preSelectedId: string | undefined,\n }],\n /** 组内交互或动效内部查看焦点变更。 */\n 'focuschange': [],\n};\n\n/** 一次选区行为派发使用的稳定命中快照。 */\nexport type SelectionHitSnapshot = {\n /** 命中检测坐标。 */\n point: Vector2,\n /** 按层级过滤后的可选元素 ID。 */\n selectableIds: string[],\n /** 最上层可选元素 ID。 */\n topmostId?: string,\n /** 当前选中范围内的命中元素 ID。 */\n selectedScopeHitIds: string[],\n /** 跳过已选父组后,可继续下钻一层的元素 ID。 */\n drillTargetId?: string,\n};\n\n/** 管理选中状态、预选状态和场景命中查询。 */\nexport class Selection extends EventEmitter<SelectionEvents> {\n /** 本次交互开始前的选中快照。 */\n interactionStartSelectedIds: string[] = [];\n /** 命中检测需要排除的元素 ID。 */\n ignoreIds: string[] = ['sceneRoot'];\n /** 命中检测需要排除的元素名称。 */\n ignoreNames: string[] = [];\n\n /** 当前选中元素 ID。 */\n private _selectedIds: string[] = [];\n /** 当前允许穿透选择的动效容器 ID。 */\n private _effectsEditItemId: string | undefined;\n /** 当前组内交互的焦点容器 ID。 */\n private _focusedGroupId: string | undefined;\n private readonly engine: Engine;\n private readonly hoveringResults: HoveringResults;\n\n /**\n * @param engine Effects 引擎\n * @param hoveringResults 共享的预选状态\n */\n constructor (engine: Engine, hoveringResults: HoveringResults = {}) {\n super();\n this.engine = engine;\n this.hoveringResults = hoveringResults;\n }\n\n /** 选中元素 ID 的副本。 */\n get selectedIds (): string[] {\n return [...this._selectedIds];\n }\n\n /**\n * 替换选中元素并发出变更事件。\n * @param ids 新的选中元素 ID\n */\n set selectedIds (ids: string[]) {\n const old = [...this._selectedIds];\n\n this._selectedIds = this.normalizeHierarchySelection(ids);\n this.updateFocusedGroupFromSelection(this._selectedIds);\n this.emit('selectionchange', { oldSelectedIds: old, newSelectedIds: [...this._selectedIds] });\n }\n\n /** 对外可观察的 hover 命中结果。 */\n get preSelectedId (): string | undefined {\n return this.hoveringResults.itemId;\n }\n\n /** 当前 Tool UI 要绘制的 hover 目标。 */\n get hoverOverlayItemId (): string | undefined {\n return this.hoveringResults.overlayItemId;\n }\n\n /** @returns 当前正在内部编辑的动效容器 ID。 */\n getEffectsEditItemId (): string | undefined {\n return this._effectsEditItemId;\n }\n\n /** @returns 当前组内交互的焦点容器 ID。 */\n getFocusedGroupId (): string | undefined {\n return this._focusedGroupId;\n }\n\n /**\n * 设置当前组内交互的焦点容器。\n * @param groupId Group 实例 ID;传空值表示回到场景根层级\n */\n setFocusedGroup (groupId?: string | null): void {\n if (!groupId) {\n const changed = this._focusedGroupId !== undefined;\n\n this._focusedGroupId = undefined;\n if (changed) {\n this.emit('focuschange');\n }\n\n return;\n }\n\n const group = getPlayerItemById(this.engine.sceneServer.compositions[0], groupId);\n\n if (!group || !this.isSelectableGroup(group)) {\n throw new Error(`Selection.setFocusedGroup: Group with id ${groupId} does not exist`);\n }\n if (this._focusedGroupId !== groupId) {\n this._focusedGroupId = groupId;\n this.emit('focuschange');\n }\n }\n\n /**\n * 放开指定动效容器的子树选择边界。\n * @param effectsItemId 动效容器 ID\n */\n enterEffectsEditScope (effectsItemId: string): void {\n const changed = this._effectsEditItemId !== effectsItemId;\n\n this._effectsEditItemId = effectsItemId;\n this.setFocusedGroup();\n if (changed) {\n this.emit('focuschange');\n }\n }\n\n /** 关闭动效子树选择边界。 */\n leaveEffectsEditScope (): void {\n const changed = this._effectsEditItemId !== undefined;\n\n this._effectsEditItemId = undefined;\n this.setFocusedGroup();\n if (changed) {\n this.emit('focuschange');\n }\n }\n\n /** @returns 选中元素 ID 的内部只读引用。 */\n getSelectedIds (): string[] {\n return this._selectedIds;\n }\n\n /** @returns 当前选中 ID 对应的有效 VFXItem。 */\n getSelectedPlayerItems (): VFXItem[] {\n return this._selectedIds\n .map(id => getPlayerItemById(this.engine.sceneServer.compositions[0], id))\n .filter((item): item is VFXItem => !!item);\n }\n\n /**\n * 判断元素是否已选中。\n * @param id 元素 ID\n * @returns 是否已选中\n */\n isItemSelected (id: string): boolean {\n return this._selectedIds.includes(id);\n }\n\n /**\n * 追加尚未选中的元素并发出变更事件。\n * @param ids 待追加元素 ID\n */\n addSelectedItems (ids: string[]): void {\n const next = this.normalizeHierarchySelection([...this._selectedIds, ...ids]);\n\n if (this.sameIds(this._selectedIds, next)) {\n return;\n }\n const old = [...this._selectedIds];\n\n this._selectedIds = next;\n this.updateFocusedGroupFromSelection(next);\n this.emit('selectionchange', { oldSelectedIds: old, newSelectedIds: [...this._selectedIds] });\n }\n\n /**\n * 移除选中元素并发出变更事件。\n * @param ids 待移除元素 ID\n */\n removeSelectedItems (ids: string[]): void {\n const old = [...this._selectedIds];\n\n this._selectedIds = this._selectedIds.filter(id => !ids.includes(id));\n if (this._selectedIds.length !== old.length) {\n this.updateFocusedGroupFromSelection(this._selectedIds);\n this.emit('selectionchange', { oldSelectedIds: old, newSelectedIds: [...this._selectedIds] });\n }\n }\n\n /** 清空选中元素并发出变更事件。 */\n clearSelectedItems (): void {\n if (this._selectedIds.length === 0) {\n return;\n }\n const old = [...this._selectedIds];\n\n this._selectedIds = [];\n this.emit('selectionchange', { oldSelectedIds: old, newSelectedIds: [] });\n }\n\n /**\n * 替换选中元素并发出变更事件。\n * @param ids 新的选中元素 ID\n */\n setSelectedItems (ids: string[]): void {\n this.commitSelectedItems(ids);\n }\n\n /**\n * 原子更新选中元素、焦点容器和变更事件。\n * @param ids 新的选中元素 ID\n * @returns 选中集是否发生变化\n */\n commitSelectedItems (ids: string[]): boolean {\n const next = this.normalizeHierarchySelection(ids);\n\n if (this.sameIds(this._selectedIds, next)) {\n return false;\n }\n const old = [...this._selectedIds];\n\n this._selectedIds = next;\n this.updateFocusedGroupFromSelection(next);\n this.emit('selectionchange', {\n oldSelectedIds: old,\n newSelectedIds: [...next],\n });\n\n return true;\n }\n\n /**\n * 将元素加入选中集合并同步焦点容器,不发出事件。\n * @param id 元素 ID\n * @returns 更新后的选中元素 ID\n */\n addSelectedItem (id: string): string[] {\n this._selectedIds = this.normalizeHierarchySelection([...this._selectedIds, id]);\n this.updateFocusedGroupFromSelection(this._selectedIds);\n\n return this._selectedIds;\n }\n\n /** 清空选中集,不发出事件。 */\n clear (): void {\n this._selectedIds = [];\n }\n\n /**\n * 直接替换选中集,不发出事件。\n * @param ids 新的选中元素 ID\n */\n setSelectedIds (ids: string[]): void {\n this._selectedIds = this.normalizeHierarchySelection(ids);\n this.updateFocusedGroupFromSelection(this._selectedIds);\n }\n\n /**\n * 处理双击点选,并允许穿透已选父元素。\n * @param event 鼠标事件\n * @returns 命中的元素 id;无命中返回 undefined\n */\n pickOnDoubleClick (event: InputEventMouseButton): string | undefined {\n this.interactionStartSelectedIds = [...this._selectedIds];\n\n const point = new Vector2(event.position.x, event.position.y);\n const hitIds = this.hitTest(point);\n const regionIds = this.filterItemsByHierarchy(\n hitIds,\n group => !this.isItemSelected(group.getInstanceId()),\n );\n\n if (regionIds.length === 0) {\n return undefined;\n }\n const hitId = regionIds[0];\n\n if (!event.shiftPressed) {\n this._selectedIds = [];\n } else {\n const parent = getPlayerItemById(this.engine.sceneServer.compositions[0], hitId)?.parent;\n\n if (parent) {\n this._selectedIds = this._selectedIds.filter(id => id !== parent.getInstanceId());\n }\n }\n\n this.addSelectedItem(hitId);\n\n return hitId;\n }\n\n /**\n * 处理单击点选,Shift 按键用于切换命中元素的选中状态。\n * @param event 鼠标事件\n * @returns 命中的元素 id;无命中返回 undefined\n */\n pickOnClick (event: InputEventMouseButton): string | undefined {\n this.interactionStartSelectedIds = [...this._selectedIds];\n\n const point = new Vector2(event.position.x, event.position.y);\n const hitIds = this.hitTest(point);\n const regionIds = this.filterSelectedItems(hitIds);\n\n if (regionIds.length === 0) {\n if (!event.shiftPressed) {\n this._selectedIds = [];\n }\n\n return undefined;\n }\n let hitId = regionIds[0];\n\n if (!event.shiftPressed && this.isItemSelected(hitId)) {\n hitId = this.filterItemsByHierarchy(\n hitIds,\n group => !this.isItemSelected(group.getInstanceId()),\n )[0] ?? hitId;\n }\n\n if (event.shiftPressed) {\n if (this.isItemSelected(hitId)) {\n this._selectedIds = this._selectedIds.filter(id => id !== hitId);\n } else {\n this.addSelectedItem(hitId);\n }\n } else {\n this._selectedIds = [];\n this.addSelectedItem(hitId);\n }\n\n return hitId;\n }\n\n /**\n * 获取指定视图坐标下的可交互元素 ID。\n * @param point 视图坐标\n * @returns 按命中优先级排列的元素 ID\n */\n hitTest (point: Vector2): string[] {\n const playerComposition = this.engine.sceneServer.compositions[0];\n\n if (!playerComposition?.items) {\n return [];\n }\n const { x, y } = viewPositionToNDC(point, GizmoViewportUtils.getContainerSize(this.engine.canvas.parentElement!));\n const result: HitTestResult = { ray: new Ray(), regions: [] };\n\n try {\n result.regions = playerComposition.hitTest(x, y, true);\n result.ray = playerComposition.getHitTestRay(x, y);\n } catch (e) {\n console.warn(e);\n }\n // Effects runtime 在隐藏节点切换后的首帧仍可能返回旧命中区域;以播放器节点的可见性为最终交互依据。\n result.regions = result.regions.filter(region => {\n const item = getPlayerItemById(this.engine.sceneServer.compositions[0], region.id);\n\n return isPlayerItemVisible(item);\n });\n this.refreshResultRegions(result);\n const selectedIds = this.reorderHitTestResult(result, playerComposition).filter(id => id !== 'extra-camera' && !this.ignoreIds.includes(id) && !this.isIgnoredNameById(id) && getPlayerItemById(this.engine.sceneServer.compositions[0], id)?.type !== spec.ItemType.composition);\n\n return this.preSelectedFrameOutBound(point, selectedIds);\n }\n\n /**\n * 解析当前指针在焦点容器内的预选目标。\n * @param point 指针视图坐标\n * @returns 预选元素 ID\n */\n resolveHoverTarget (point: Vector2): string | undefined {\n return this.filterSelectedItems(this.hitTest(point))[0];\n }\n\n /**\n * 解析并提交当前指针的预选目标。\n * @param point 指针视图坐标\n */\n commitHoverTarget (point: Vector2): void {\n const itemId = this.resolveHoverTarget(point);\n\n this.setHoverOverlayTarget(itemId);\n this.commitHover(itemId);\n }\n\n /**\n * 设置当前工具的预选绘制目标。\n * @param itemId 元素 ID\n */\n setHoverOverlayTarget (itemId?: string): void {\n this.hoveringResults.overlayItemId = itemId;\n }\n\n /** 清空预选命中和绘制目标。 */\n clearHover (): void {\n this.setHoverOverlayTarget(undefined);\n this.commitHover(undefined);\n }\n\n /**\n * 按当前焦点容器过滤交互命中。\n * @param selectedIds 原始命中元素 ID\n * @returns 可选元素 ID\n */\n filterSelectedItems (selectedIds: string[]): string[] {\n return this.filterItemsByHierarchy(selectedIds);\n }\n\n /**\n * 添加忽略交互的元素 ID。\n * @param ids 元素 ID\n */\n addIgnoreIds (ids: string[]): void {\n ids.forEach(id => addItem(this.ignoreIds, id));\n }\n /**\n * 删除忽略交互的元素 ID。\n * @param ids 元素 ID\n */\n deleteIgnoreIds (ids: string[]): void {\n ids.forEach(id => {\n const index = this.ignoreIds.indexOf(id);\n\n if (index >= 0) {\n this.ignoreIds.splice(index, 1);\n }\n });\n }\n /**\n * 添加忽略交互的元素名称。\n * @param names 元素名称\n */\n addIgnoreNames (names: string[]): void {\n names.forEach(name => addItem(this.ignoreNames, name));\n }\n /**\n * 删除忽略交互的元素名称。\n * @param names 元素名称\n */\n deleteIgnoreNames (names: string[]): void {\n names.forEach(name => {\n const index = this.ignoreNames.indexOf(name);\n\n if (index >= 0) {\n this.ignoreNames.splice(index, 1);\n }\n });\n }\n /**\n * 替换忽略交互的元素名称。\n * @param names 元素名称\n */\n setIgnoreNames (names: string[]): void {\n this.ignoreNames = [...names];\n }\n\n /**\n * 查找指针下最上层的未选元素。\n * @param point 指针视图坐标\n * @returns 未选元素 ID\n */\n findUnselectedItem (point: Vector2): string | undefined {\n const id = this.filterSelectedItems(this.hitTest(point))[0] ?? '';\n\n if (!id) {\n return undefined;\n }\n\n return this.getSelectedScopeIdSet().has(id) ? undefined : id;\n }\n\n /**\n * 创建一次行为派发使用的选区命中快照。\n * @param point 命中检测坐标\n * @returns 选区命中快照\n */\n createHitSnapshot (point: Vector2): SelectionHitSnapshot {\n const hitIds = this.hitTest(point);\n const selectableIds = this.filterSelectedItems(hitIds);\n const drillableIds = this.filterItemsByHierarchy(\n hitIds,\n group => !this.isItemSelected(group.getInstanceId()),\n );\n const selectedScopeIds = this.getSelectedScopeIdSet();\n\n return {\n point: point.clone(),\n selectableIds: [...selectableIds],\n topmostId: selectableIds[0],\n selectedScopeHitIds: selectableIds.filter(id => selectedScopeIds.has(id)),\n drillTargetId: drillableIds[0],\n };\n }\n\n /**\n * 判断坐标是否位于当前焦点容器的视图范围内。\n * @param point 视图坐标\n * @returns 是否位于当前焦点容器内\n */\n isPointInFocusedGroup (point: Vector2): boolean {\n if (!this._focusedGroupId) {\n return false;\n }\n const group = getPlayerItemById(this.engine.sceneServer.compositions[0], this._focusedGroupId);\n\n if (!group) {\n return false;\n }\n const containerSize = GizmoViewportUtils.getContainerSize(this.engine.canvas.parentElement!);\n const transform = getItemViewTransform(group, containerSize);\n\n return !!transform && transformedBoxContainsPoint(transform, point);\n }\n\n /**\n * 判断坐标是否落在当前选区的视图包围内。\n *\n * 单选保留元素变换后四边形的精确命中;多选使用与变换线框一致的\n * 整体轴对齐包围盒,使元素之间的选框空白区域也可用于拖动选区。\n * @param point 视图坐标\n * @returns 是否命中当前选区\n */\n isPointInSelectedViewBox (point: Vector2): boolean {\n const items = this.getSelectedPlayerItems();\n\n if (items.length === 0) {\n return false;\n }\n const containerSize = GizmoViewportUtils.getContainerSize(this.engine.canvas.parentElement!);\n\n if (items.length === 1) {\n const transform = getItemViewTransform(items[0], containerSize);\n\n return !!transform && transformedBoxContainsPoint(transform, point);\n }\n\n const selectionBox = new Box2();\n\n for (const item of items) {\n const itemBox = getItemViewBox(item, containerSize);\n\n if (!itemBox.isEmpty()) {\n selectionBox.union(itemBox);\n }\n }\n\n return !selectionBox.isEmpty() && selectionBox.containsPoint(point);\n }\n\n /**\n * 判断坐标是否位于当前动效编辑容器的视图范围内。\n * @param point 视图坐标\n * @returns 是否位于当前动效容器内\n */\n isPointInEffectsEditScope (point: Vector2): boolean {\n if (!this._effectsEditItemId) {\n return false;\n }\n const effectsItem = getPlayerItemById(this.engine.sceneServer.compositions[0], this._effectsEditItemId);\n\n if (!effectsItem) {\n return false;\n }\n const containerSize = GizmoViewportUtils.getContainerSize(this.engine.canvas.parentElement!);\n const transform = getItemViewTransform(effectsItem, containerSize);\n\n return !!transform && transformedBoxContainsPoint(transform, point);\n }\n\n /**\n * 将框选候选按当前动效编辑范围解析为可选元素。\n *\n * 默认模式把动效子树归并为容器;动效编辑模式只保留当前容器的内部元素。\n * @param item 原始播放器元素\n * @returns 当前模式下的框选候选;不可选时返回 undefined\n */\n resolveMarqueeSelectableItem (item: VFXItem): VFXItem | undefined {\n const effectsOwner = getEffectsPlayerItemOwner(item);\n\n if (!this._effectsEditItemId) {\n return effectsOwner ?? item;\n }\n if (\n effectsOwner?.getInstanceId() !== this._effectsEditItemId\n || item.getInstanceId() === this._effectsEditItemId\n || item.type === spec.ItemType.composition\n ) {\n return undefined;\n }\n\n return item;\n }\n\n /**\n * 提交预选结果并在变化时发出事件。\n * @param itemId 预选元素 ID\n */\n private commitHover (itemId: string | undefined): void {\n const previousId = this.hoveringResults.itemId;\n\n if (itemId === previousId) {\n return;\n }\n this.hoveringResults.itemId = itemId;\n this.emit('preselectchange', { preSelectedId: itemId });\n }\n\n /**\n * 按场景层级归并原始命中元素。\n * @param selectedIds 原始命中元素 ID\n * @param groupFilter 可选的父组过滤条件\n * @returns 归并后的元素 ID\n */\n private filterItemsByHierarchy (\n selectedIds: string[],\n groupFilter?: (group: VFXItem) => boolean,\n ): string[] {\n const resultSelectedIds: string[] = [];\n\n selectedIds.forEach(id => {\n const item = getPlayerItemById(this.engine.sceneServer.compositions[0], id);\n\n if (!item) {\n return;\n }\n const effectsOwner = getEffectsPlayerItemOwner(item);\n\n if (\n this._effectsEditItemId\n && effectsOwner?.getInstanceId() !== this._effectsEditItemId\n ) {\n return;\n }\n if (effectsOwner) {\n const effectsOwnerId = effectsOwner.getInstanceId();\n\n if (!this._effectsEditItemId) {\n if (!this.ignoreIds.includes(effectsOwnerId) && !this.isIgnoredNameById(effectsOwnerId)) {\n addItem(resultSelectedIds, effectsOwnerId);\n }\n\n return;\n }\n if (effectsOwnerId !== this._effectsEditItemId || id === effectsOwnerId) {\n return;\n }\n }\n\n const selectableItem = this.getOutermostSelectableItem(item, groupFilter);\n\n if (selectableItem) {\n addItem(resultSelectedIds, selectableItem.getInstanceId());\n }\n });\n\n return resultSelectedIds;\n }\n\n /**\n * 获取不高于当前焦点容器的最外层可选元素。\n * @param item 原始命中元素\n * @param groupFilter 可选的父组过滤条件\n * @returns 当前层级可选元素\n */\n private getOutermostSelectableItem (\n item: VFXItem,\n groupFilter?: (group: VFXItem) => boolean,\n ): VFXItem | undefined {\n const effectsOwner = getEffectsPlayerItemOwner(item);\n const focusedGroup = this._focusedGroupId\n ? getPlayerItemById(this.engine.sceneServer.compositions[0], this._focusedGroupId)\n : undefined;\n let match = this.isDirectlySelectable(item) ? item : undefined;\n let node: VFXItem | undefined = item;\n\n while (node) {\n if (effectsOwner && node === effectsOwner) {\n break;\n }\n\n if (focusedGroup?.getInstanceId() === node.getInstanceId()) {\n break;\n }\n\n if (\n this.isSelectableGroup(node)\n && !this.isRuntimeAncestor(node, focusedGroup)\n && (groupFilter?.(node) ?? true)\n ) {\n match = node;\n }\n node = node.parent;\n }\n\n return match;\n }\n\n /**\n * 判断元素名称是否在忽略列表中。\n * @param id 元素 ID\n * @returns 是否忽略该元素\n */\n private isIgnoredNameById (id: string): boolean {\n if (this.ignoreNames.length === 0) {\n return false;\n }\n const item = getPlayerItemById(this.engine.sceneServer.compositions[0], id);\n\n return !!item && this.ignoreNames.includes(item.name);\n }\n\n /** @returns 选中元素及其后代组成的命中范围。 */\n private getSelectedScopeIdSet (): Set<string> {\n const ids = new Set(this._selectedIds);\n const selectedItems = this._selectedIds\n .map(id => getPlayerItemById(this.engine.sceneServer.compositions[0], id))\n .filter((item): item is VFXItem => !!item);\n\n for (const item of selectedItems) {\n for (const child of getItemChildren(item)) {\n ids.add(child.getInstanceId());\n }\n }\n\n return ids;\n }\n\n /**\n * 将动效子元素命中区域归并到动效容器。\n * @param hitTestResult 原始命中结果\n */\n private refreshResultRegions (hitTestResult: HitTestResult): void {\n const playerComposition = this.engine.sceneServer.compositions[0];\n\n if (!playerComposition || this._effectsEditItemId) {\n return;\n }\n const effectsItems = playerComposition.items.filter(item => item.name === '动效' && item.getComponent(FrameComponent) !== undefined);\n const effectsItemMap = new Map<string, string>();\n\n effectsItems.forEach(item => {\n const compositionChild = item.children?.[0];\n\n if (compositionChild?.type === spec.ItemType.composition) {\n compositionChild.children.forEach(subChild => {\n effectsItemMap.set(subChild.getInstanceId(), item.getInstanceId());\n });\n }\n });\n hitTestResult.regions.forEach(region => {\n region.id = effectsItemMap.get(region.id) ?? region.id;\n });\n }\n\n /**\n * 按渲染顺序和深度整理命中结果。\n * @param hitTestResult 原始命中结果\n * @param playerComposition 播放合成\n * @returns 排序后的元素 ID\n */\n private reorderHitTestResult (hitTestResult: HitTestResult, playerComposition: Composition): string[] {\n // 1. 校验命中区域并按渲染顺序反转。\n if (hitTestResult.regions.length === 0 || !playerComposition) {\n return [];\n }\n const { ray } = hitTestResult;\n const regions = hitTestResult.regions.reverse();\n const results: [string, number][] = [];\n\n // 2. 解析区域对应元素及其射线距离。\n regions.forEach(region => {\n let item: VFXItem | undefined;\n /**\n * 在元素树中查找命中区域。\n * @param items 当前元素列表\n * @param id 目标元素 ID\n */\n const dfsItem = (items: VFXItem[], id: string) => {\n for (const i of items) {\n if (i.getInstanceId() === id) {\n item = i;\n }\n if (item) {\n return;\n }\n dfsItem(i.children, id);\n }\n };\n\n dfsItem(playerComposition.items, region.id);\n if (!item || !isPlayerItemVisible(item)) {\n return;\n }\n const targetItemId = item.getInstanceId();\n const distance = ray.origin.clone().distance(region.position.clone());\n const isNeedDepthTest = item.type === spec.ItemType.mesh\n || item.getComponent(SpriteComponent)?.renderer?.occlusion\n || item.getComponent(TextComponent)?.renderer?.occlusion\n || item.getComponent(VideoComponent)?.renderer?.occlusion\n || item.getComponent(RichTextComponent)?.renderer?.occlusion;\n\n // 3. 需要深度测试的元素按射线距离插入,其余保留渲染顺序。\n if (isNeedDepthTest && results.length > 0) {\n let tryAdd = true;\n\n results.forEach((result, i) => {\n if (!tryAdd) {\n return;\n }\n if (distance <= result[1]) {\n results.splice(i, 0, [targetItemId, distance]);\n tryAdd = false;\n\n return;\n }\n if (i === results.length - 1) {\n results.push([targetItemId, distance]);\n }\n });\n } else {\n results.push([targetItemId, distance]);\n }\n });\n\n // 4. 返回排序后的元素 ID。\n return results.map(result => result[0]);\n }\n\n /**\n * 将画板左上角扩展交互区的命中加入结果。\n * @param mouse 指针视图坐标\n * @param currentSelectedIds 当前命中元素 ID\n * @returns 补充画板后的命中元素 ID\n */\n private preSelectedFrameOutBound (mouse: Vector2, currentSelectedIds: string[]): string[] {\n const playerComposition = this.engine.sceneServer.compositions[0];\n\n if (!playerComposition) {\n return currentSelectedIds;\n }\n const framePlayerItems = playerComposition.items.filter(item => (\n isFramePlayerItem(item)\n && isPlayerItemVisible(item)\n ));\n const containerSize = GizmoViewportUtils.getContainerSize(this.engine.canvas.parentElement!);\n const frameBoxInfoes = framePlayerItems.map(item => ({\n id: item.getInstanceId(),\n box: getItemViewBox(item, containerSize),\n }));\n\n if (!frameBoxInfoes?.length) {\n return currentSelectedIds;\n }\n let hasSelectedFrame = false;\n\n frameBoxInfoes.forEach(frameBoxInfo => {\n if (hasSelectedFrame) {\n return;\n }\n const { min } = frameBoxInfo.box;\n const interactionBox = setBoxFromPoints(new Box2(), [min.clone(), min.clone().add(new Vector2(FRAME_INTERACTION_WIDTH, -FRAME_INTERACTION_HEIGHT))]);\n\n if (interactionBox.containsPoint(mouse)) {\n hasSelectedFrame = true;\n currentSelectedIds.splice(0, 0, frameBoxInfo.id);\n }\n });\n\n return currentSelectedIds;\n }\n\n /**\n * 根据当前非空选区更新共同的最近父组;清空选区时保留已有焦点。\n * @param selectedIds 当前选中元素 ID\n */\n private updateFocusedGroupFromSelection (selectedIds: readonly string[]): void {\n if (selectedIds.length === 0) {\n return;\n }\n\n const selectedItems = selectedIds\n .map(id => getPlayerItemById(this.engine.sceneServer.compositions[0], id))\n .filter((item): item is VFXItem => !!item);\n\n if (selectedItems.length !== selectedIds.length) {\n this._focusedGroupId = undefined;\n\n return;\n }\n\n const ancestorLists = selectedItems.map(item => this.getGroupAncestors(item));\n const commonGroup = ancestorLists[0]?.find(candidate => (\n ancestorLists.slice(1).every(ancestors => (\n ancestors.some(group => group.getInstanceId() === candidate.getInstanceId())\n ))\n ));\n\n this._focusedGroupId = commonGroup?.getInstanceId();\n }\n\n /**\n * 获取元素从近到远的可聚焦父组。\n * @param item 当前元素\n * @returns 父组列表\n */\n private getGroupAncestors (item: VFXItem): VFXItem[] {\n const groups: VFXItem[] = [];\n let parent = item.parent;\n\n while (parent) {\n if (this._effectsEditItemId && parent.getInstanceId() === this._effectsEditItemId) {\n break;\n }\n if (this.isSelectableGroup(parent)) {\n groups.push(parent);\n }\n parent = parent.parent;\n }\n\n return groups;\n }\n\n /**\n * 判断元素是否可作为组内交互焦点。\n * @param item 待检查元素\n * @returns 是否为可聚焦 Group\n */\n private isSelectableGroup (item: VFXItem): boolean {\n const id = item.getInstanceId();\n\n return isGroupPlayerItem(item)\n && !this.ignoreIds.includes(id)\n && !this.isIgnoredNameById(id);\n }\n\n /**\n * 判断原始命中元素能否直接进入选区。\n * @param item 待检查元素\n * @returns 是否可直接选择\n */\n private isDirectlySelectable (item: VFXItem): boolean {\n const id = item.getInstanceId();\n\n return item.type !== spec.ItemType.composition\n && !this.ignoreIds.includes(id)\n && !this.isIgnoredNameById(id);\n }\n\n /**\n * 判断 ancestor 是否为 item 的运行时祖先。\n * @param ancestor 候选祖先\n * @param item 当前元素\n * @returns 是否存在祖先关系\n */\n private isRuntimeAncestor (ancestor: VFXItem, item: VFXItem | undefined): boolean {\n let parent = item?.parent;\n\n while (parent) {\n if (parent.getInstanceId() === ancestor.getInstanceId()) {\n return true;\n }\n parent = parent.parent;\n }\n\n return false;\n }\n\n /**\n * 将选区归一化为不存在祖先关系的节点集合。\n *\n * 按输入顺序处理,后加入的交互目标胜出:深入子元素会移除已选祖先,\n * 选择外层容器会移除已选后代\n * @param ids 待提交的选中 ID\n * @returns 保持稳定顺序的层级互斥选区\n */\n private normalizeHierarchySelection (ids: readonly string[]): string[] {\n const uniqueIds = Array.from(new Set(ids));\n const itemById = new Map<string, VFXItem>();\n /**\n * 一次遍历建立运行时节点索引,避免框选大量元素时反复搜索整棵树。\n * @param items 当前层节点\n */\n const collectItems = (items: VFXItem[]): void => {\n for (const item of items) {\n const id = item.getInstanceId();\n\n if (itemById.has(id)) {\n continue;\n }\n itemById.set(id, item);\n collectItems(item.children);\n }\n };\n\n collectItems(this.engine.sceneServer.compositions[0]?.items ?? []);\n\n const acceptedIds: string[] = [];\n const acceptedIdSet = new Set<string>();\n const acceptedAncestorIds = new Set<string>();\n\n // 从后向前处理,使本次交互最后加入的目标覆盖已有祖先或后代。\n for (let index = uniqueIds.length - 1; index >= 0; index--) {\n const id = uniqueIds[index];\n const ancestorIds: string[] = [];\n let parent = itemById.get(id)?.parent;\n\n while (parent) {\n ancestorIds.push(parent.getInstanceId());\n parent = parent.parent;\n }\n\n const hasAcceptedAncestor = ancestorIds.some(ancestorId => acceptedIdSet.has(ancestorId));\n const isAncestorOfAccepted = acceptedAncestorIds.has(id);\n\n if (hasAcceptedAncestor || isAncestorOfAccepted) {\n continue;\n }\n\n acceptedIds.push(id);\n acceptedIdSet.add(id);\n ancestorIds.forEach(ancestorId => acceptedAncestorIds.add(ancestorId));\n }\n\n return acceptedIds.reverse();\n }\n\n /**\n * 比较两个有序 ID 列表。\n * @param left 左侧 ID 列表\n * @param right 右侧 ID 列表\n * @returns 是否完全相同\n */\n private sameIds (left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((id, index) => id === right[index]);\n }\n}\n","import { Line2, type Box2 } from '@galacean/effects-math/es/extension/index';\nimport { Vector2, getBoxCorners } from '../math';\nimport type { SnapConfig } from '../configs/types';\nimport { selectionSnapConfig } from '../configs/builtin-configs';\nimport type { VFXItem } from '@galacean/effects';\nimport { getItemViewBox, isEffectsPlayerItem, isFramePlayerItem } from '../items';\nimport type { GizmoOwner } from '../gizmo-owner';\n\nconst SNAP_EPSILON = 0.000001;\nconst SNAP_MARKER_HALF_SIZE = 2;\n\ntype SnapAxis = 'x' | 'y';\n\ntype SnapGapSegment = {\n axis: SnapAxis,\n start: number,\n end: number,\n cross: number,\n};\n\ntype AxisSnapCandidate = {\n distance: number,\n point?: Vector2,\n target?: Vector2,\n targetBox?: Box2,\n gaps?: SnapGapSegment[],\n};\n\ntype AxisSnapSelection = {\n distance: number,\n candidates: AxisSnapCandidate[],\n};\n\n/** 位移吸附结果。 */\nexport type TranslationSnapResult = {\n /** x 方向吸附距离 */\n x?: number,\n /** y 方向吸附距离 */\n y?: number,\n /** x 方向点吸附信息 */\n xPoints?: TranslationPointSnapTarget[],\n /** y 方向点吸附信息 */\n yPoints?: TranslationPointSnapTarget[],\n};\n\n/** 平移点吸附信息。 */\nexport type TranslationPointSnapTarget = {\n /** 包围盒点 */\n point: Vector2,\n /** 吸附点 */\n targets: Vector2[],\n};\n\n/** 管理选区吸附目标、修正量和对齐提示。 */\nexport class SnapManager {\n /** 当前吸附结果。距离为未吸附位置减目标位置,调用方应减去该值。 */\n result: TranslationSnapResult = {};\n\n private readonly owner: GizmoOwner;\n\n /** 吸附提示线集合。 */\n private results: Line2[] = [];\n\n /** 当前拖拽会话缓存的吸附目标。 */\n private targetBoxes: Box2[] = [];\n\n /** 本帧每轴选中的最近候选。 */\n private axisSelections: Partial<Record<SnapAxis, AxisSnapSelection>> = {};\n\n /** 本帧尚未施加吸附修正的选区包围盒。 */\n private sourceBox: Box2 | undefined;\n\n /**\n * @param owner Gizmo 宿主\n */\n constructor (owner: GizmoOwner) {\n this.owner = owner;\n }\n\n /** 是否启用吸附。 */\n get enabled (): boolean {\n return this.config.enabled;\n }\n\n /** 当前吸附配置。 */\n get config (): Readonly<SnapConfig> {\n return this.owner.getConfigManager().get(selectionSnapConfig);\n }\n\n /**\n * 缓存一次选区交互使用的吸附目标。\n * @param items 场景元素\n * @param selectedItems 当前选中元素\n * @param containerSize 画布容器尺寸\n */\n cacheSnapTargetsForSelection (\n items: readonly VFXItem[],\n selectedItems: readonly VFXItem[],\n containerSize: Vector2,\n ): void {\n if (selectedItems.length === 0) {\n this.clearCache();\n\n return;\n }\n\n const selectedIdSet = new Set(selectedItems.map(item => item.getInstanceId()));\n const selectedAncestorIdSet = this.getAncestorIdSet(selectedItems);\n const scopeItemId = this.getCommonSnapScopeId(selectedItems);\n\n this.cacheSnapTargetBoxes(\n items\n .filter(item => item.isVisible\n && !selectedAncestorIdSet.has(item.getInstanceId())\n && !this.isSelectedOrDescendant(item, selectedIdSet)\n && this.getNearestSnapScopeId(item) === scopeItemId,\n )\n .map(item => getItemViewBox(item, containerSize))\n .filter(box => !box.isEmpty()),\n );\n }\n\n /**\n * 缓存视图空间中的吸附目标包围盒。\n * @param boxes 吸附目标包围盒\n */\n cacheSnapTargetBoxes (boxes: readonly Box2[]): void {\n this.targetBoxes = boxes.filter(box => !box.isEmpty()).map(box => box.clone());\n }\n\n /** 清空当前拖拽会话的吸附目标缓存。 */\n clearCache (): void {\n this.targetBoxes = [];\n }\n\n /** @returns 当前缓存的吸附目标包围盒。 */\n getSnapTargetBoxes (): readonly Box2[] {\n return this.targetBoxes;\n }\n\n /** @returns 当前吸附目标的角点和中心点。 */\n getSnapTargetPoints (): Vector2[] {\n return this.targetBoxes.flatMap(box => [\n ...getBoxCorners(box),\n box.getCenter(),\n ]);\n }\n\n /**\n * 包围盒位移吸附。每轴分别选择最近的边、中心或等距间隔候选。\n * @param shift 本次原始偏移值\n * @param box 当前已施加上一帧吸附修正的包围盒\n * @param otherBoxes 吸附包围盒\n * @param xEnabled 是否进行 x 轴吸附\n * @param yEnabled 是否进行 y 轴吸附\n */\n prepareBox (\n shift: Vector2,\n box: Box2,\n otherBoxes: readonly Box2[] = this.targetBoxes,\n xEnabled = true,\n yEnabled = true,\n ): void {\n const previousResult = this.result;\n\n this.clearFrameState();\n\n if (box.isEmpty()) {\n return;\n }\n\n // 先恢复未吸附的指针轨迹,再叠加本帧位移,避免吸附后无法平滑脱离。\n const unsnappedShift = new Vector2(previousResult.x ?? 0, previousResult.y ?? 0).add(shift);\n const sourceBox = box.clone().translate(unsnappedShift);\n\n this.sourceBox = sourceBox;\n\n for (const targetBox of otherBoxes) {\n if (targetBox.isEmpty()) {\n continue;\n }\n this.considerBoxAlignment(sourceBox, targetBox, 'x', xEnabled);\n this.considerBoxAlignment(sourceBox, targetBox, 'y', yEnabled);\n }\n\n if (xEnabled) {\n this.considerGapSnaps(sourceBox, otherBoxes, 'x');\n }\n if (yEnabled) {\n this.considerGapSnaps(sourceBox, otherBoxes, 'y');\n }\n\n this.publishResult();\n }\n\n /**\n * 点位移吸附。x/y 两轴独立选择最近目标。\n * @param shift 本次原始偏移值\n * @param point 当前已施加上一帧吸附修正的点\n * @param otherPoints 吸附点集合\n * @param xEnabled 是否进行 x 轴吸附\n * @param yEnabled 是否进行 y 轴吸附\n */\n preparePoint (\n shift: Vector2,\n point: Vector2,\n otherPoints: readonly Vector2[] = this.getSnapTargetPoints(),\n xEnabled = true,\n yEnabled = true,\n ): void {\n const previousResult = this.result;\n\n this.clearFrameState();\n\n const unsnappedShift = new Vector2(previousResult.x ?? 0, previousResult.y ?? 0).add(shift);\n const sourcePoint = point.clone().add(unsnappedShift);\n\n for (const target of otherPoints) {\n if (xEnabled) {\n this.considerAxisCandidate('x', {\n distance: sourcePoint.x - target.x,\n point: sourcePoint,\n target,\n });\n }\n if (yEnabled) {\n this.considerAxisCandidate('y', {\n distance: sourcePoint.y - target.y,\n point: sourcePoint,\n target,\n });\n }\n }\n\n this.publishResult();\n }\n\n /** @returns 当前视图坐标系中的吸附提示线。 */\n getSnappingVisualizations (): readonly Line2[] {\n this.update();\n\n return this.results;\n }\n\n /** 清空吸附修正量和提示,保留目标缓存。 */\n clearSnappingVisualizations (): void {\n this.clearFrameState();\n }\n\n /** 清空全部吸附状态。 */\n reset (): void {\n this.clearCache();\n this.clearSnappingVisualizations();\n }\n\n private update (): void {\n const lines: Line2[] = [];\n const correction = new Vector2(this.result.x ?? 0, this.result.y ?? 0);\n const snappedBox = this.sourceBox?.clone().translate(correction.clone().multiply(-1));\n\n this.appendAlignmentLines(lines, 'x', correction, snappedBox);\n this.appendAlignmentLines(lines, 'y', correction, snappedBox);\n this.appendGapLines(lines, 'x');\n this.appendGapLines(lines, 'y');\n\n this.results = this.deduplicateLines(lines);\n }\n\n /** 判断元素自身或任一祖先是否属于当前选区。 */\n private isSelectedOrDescendant (item: VFXItem, selectedIds: ReadonlySet<string>): boolean {\n let current: VFXItem | undefined = item;\n\n while (current) {\n if (selectedIds.has(current.getInstanceId())) {\n return true;\n }\n current = current.parent;\n }\n\n return false;\n }\n\n /** 收集当前选区的全部祖先,避免容器成为自身内容的吸附目标。 */\n private getAncestorIdSet (items: readonly VFXItem[]): ReadonlySet<string> {\n const ids = new Set<string>();\n\n for (const item of items) {\n let current = item.parent;\n\n while (current) {\n ids.add(current.getInstanceId());\n current = current.parent;\n }\n }\n\n return ids;\n }\n\n /** 获取元素所在的最近吸附作用域;作用域元素自身属于外层。 */\n private getNearestSnapScopeId (item: VFXItem): string | undefined {\n let current = item.parent;\n\n while (current) {\n if (this.isSnapScopeItem(current)) {\n return current.getInstanceId();\n }\n current = current.parent;\n }\n\n return undefined;\n }\n\n /** 获取整个选区共同所在的最近吸附作用域。 */\n private getCommonSnapScopeId (items: readonly VFXItem[]): string | undefined {\n const scopeAncestorIds = items.map(item => {\n const ids: string[] = [];\n let current = item.parent;\n\n while (current) {\n if (this.isSnapScopeItem(current)) {\n ids.push(current.getInstanceId());\n }\n current = current.parent;\n }\n\n return ids;\n });\n const [first = [], ...rest] = scopeAncestorIds;\n\n return first.find(id => rest.every(ids => ids.includes(id)));\n }\n\n /** 画板和动效容器都会隔离内外吸附候选。 */\n private isSnapScopeItem (item: VFXItem): boolean {\n return isFramePlayerItem(item) || isEffectsPlayerItem(item);\n }\n\n /** 比较一个目标包围盒的 min / center / max 锚点。 */\n private considerBoxAlignment (\n sourceBox: Box2,\n targetBox: Box2,\n axis: SnapAxis,\n enabled: boolean,\n ): void {\n if (!enabled) {\n return;\n }\n\n const orthogonalAxis: SnapAxis = axis === 'x' ? 'y' : 'x';\n const sourceCenter = sourceBox.getCenter();\n const targetCenter = targetBox.getCenter();\n const sourceCoordinates = [sourceBox.min[axis], sourceCenter[axis], sourceBox.max[axis]];\n const targetCoordinates = [targetBox.min[axis], targetCenter[axis], targetBox.max[axis]];\n\n for (const sourceCoordinate of sourceCoordinates) {\n for (const targetCoordinate of targetCoordinates) {\n const point = new Vector2();\n\n point[axis] = sourceCoordinate;\n point[orthogonalAxis] = sourceCenter[orthogonalAxis];\n const target = new Vector2();\n\n target[axis] = targetCoordinate;\n target[orthogonalAxis] = targetCenter[orthogonalAxis];\n this.considerAxisCandidate(axis, {\n distance: sourceCoordinate - targetCoordinate,\n point,\n target,\n targetBox,\n });\n }\n }\n }\n\n /**\n * 添加等距候选:在现有 gap 中居中,或在 gap 两端复制相同间距。\n */\n private considerGapSnaps (sourceBox: Box2, boxes: readonly Box2[], axis: SnapAxis): void {\n const validBoxes = boxes.filter(box => !box.isEmpty());\n const orthogonalAxis: SnapAxis = axis === 'x' ? 'y' : 'x';\n const sourceSize = sourceBox.max[axis] - sourceBox.min[axis];\n\n for (let firstIndex = 0; firstIndex < validBoxes.length; firstIndex++) {\n for (let secondIndex = firstIndex + 1; secondIndex < validBoxes.length; secondIndex++) {\n let first = validBoxes[firstIndex];\n let second = validBoxes[secondIndex];\n\n if (first.min[axis] > second.min[axis]) {\n [first, second] = [second, first];\n }\n\n const gap = second.min[axis] - first.max[axis];\n\n if (gap <= SNAP_EPSILON || !this.rangesOverlap(first, second, orthogonalAxis)) {\n continue;\n }\n if (this.hasInterveningBox(first, second, validBoxes, axis, orthogonalAxis)) {\n continue;\n }\n\n const existingGap = this.createGapSegment(first, second, axis);\n\n // 居中:移动对象落在现有 gap 内,并使两侧间距相同。\n if (gap + SNAP_EPSILON >= sourceSize) {\n const desiredMin = first.max[axis] + (gap - sourceSize) / 2;\n const desiredBox = this.moveBoxAlongAxis(sourceBox, axis, desiredMin);\n\n if (this.rangesOverlap(desiredBox, first, orthogonalAxis) ||\n this.rangesOverlap(desiredBox, second, orthogonalAxis)) {\n this.considerAxisCandidate(axis, {\n distance: sourceBox.min[axis] - desiredMin,\n gaps: [\n this.createGapSegment(first, desiredBox, axis, existingGap.cross),\n this.createGapSegment(desiredBox, second, axis, existingGap.cross),\n ],\n });\n }\n }\n\n // 复制 gap 到现有对象对的前方。\n const beforeMax = first.min[axis] - gap;\n const beforeMin = beforeMax - sourceSize;\n const beforeBox = this.moveBoxAlongAxis(sourceBox, axis, beforeMin);\n\n if (this.rangesOverlap(beforeBox, first, orthogonalAxis)) {\n this.considerAxisCandidate(axis, {\n distance: sourceBox.min[axis] - beforeMin,\n gaps: [\n existingGap,\n this.createGapSegment(beforeBox, first, axis, existingGap.cross),\n ],\n });\n }\n\n // 复制 gap 到现有对象对的后方。\n const afterMin = second.max[axis] + gap;\n const afterBox = this.moveBoxAlongAxis(sourceBox, axis, afterMin);\n\n if (this.rangesOverlap(afterBox, second, orthogonalAxis)) {\n this.considerAxisCandidate(axis, {\n distance: sourceBox.min[axis] - afterMin,\n gaps: [\n existingGap,\n this.createGapSegment(second, afterBox, axis, existingGap.cross),\n ],\n });\n }\n }\n }\n }\n\n /** 只保留阈值内最近的候选;同一修正量的命中全部合并用于渲染。 */\n private considerAxisCandidate (axis: SnapAxis, candidate: AxisSnapCandidate): void {\n if (Math.abs(candidate.distance) > this.config.distance + SNAP_EPSILON) {\n return;\n }\n\n const current = this.axisSelections[axis];\n\n if (!current || Math.abs(candidate.distance) < Math.abs(current.distance) - SNAP_EPSILON) {\n this.axisSelections[axis] = {\n distance: candidate.distance,\n candidates: [candidate],\n };\n\n return;\n }\n\n if (Math.abs(candidate.distance - current.distance) <= SNAP_EPSILON) {\n current.candidates.push(candidate);\n }\n }\n\n /** 将内部轴命中发布到兼容的 TranslationSnapResult。 */\n private publishResult (): void {\n for (const axis of ['x', 'y'] as const) {\n const selection = this.axisSelections[axis];\n\n if (!selection) {\n continue;\n }\n this.result[axis] = selection.distance;\n\n const pointProperty = axis === 'x' ? 'xPoints' : 'yPoints';\n const pointMatches = selection.candidates.filter(\n (candidate): candidate is AxisSnapCandidate & { point: Vector2, target: Vector2 } =>\n candidate.point !== undefined && candidate.target !== undefined,\n );\n\n if (pointMatches.length === 0) {\n continue;\n }\n\n const pointGroups: TranslationPointSnapTarget[] = [];\n\n for (const match of pointMatches) {\n let group = pointGroups.find(item => this.pointsEqual(item.point, match.point));\n\n if (!group) {\n group = { point: match.point, targets: [] };\n pointGroups.push(group);\n }\n if (!group.targets.some(target => this.pointsEqual(target, match.target))) {\n group.targets.push(match.target);\n }\n }\n this.result[pointProperty] = pointGroups;\n }\n }\n\n /** 生成贯穿选区和全部命中目标完整范围的对齐线,并标记参与边段的端点。 */\n private appendAlignmentLines (\n lines: Line2[],\n axis: SnapAxis,\n correction: Vector2,\n snappedBox: Box2 | undefined,\n ): void {\n const selection = this.axisSelections[axis];\n\n if (!selection) {\n return;\n }\n\n const orthogonalAxis: SnapAxis = axis === 'x' ? 'y' : 'x';\n const matches = selection.candidates.filter(\n (candidate): candidate is AxisSnapCandidate & { point: Vector2, target: Vector2 } =>\n candidate.point !== undefined && candidate.target !== undefined,\n );\n const groups = new Map<string, typeof matches>();\n\n for (const match of matches) {\n const coordinate = match.target[axis];\n const key = coordinate.toFixed(6);\n const group = groups.get(key) ?? [];\n\n group.push(match);\n groups.set(key, group);\n }\n\n for (const matchesAtCoordinate of groups.values()) {\n const coordinate = matchesAtCoordinate[0].target[axis];\n let min = snappedBox?.min[orthogonalAxis] ?? Number.POSITIVE_INFINITY;\n let max = snappedBox?.max[orthogonalAxis] ?? Number.NEGATIVE_INFINITY;\n const markerPoints: Vector2[] = [];\n\n if (snappedBox) {\n markerPoints.push(\n this.createAxisPoint(axis, coordinate, snappedBox.min[orthogonalAxis]),\n this.createAxisPoint(axis, coordinate, snappedBox.max[orthogonalAxis]),\n );\n }\n\n for (const match of matchesAtCoordinate) {\n const snappedPoint = match.point.clone().subtract(correction);\n\n min = Math.min(min, snappedPoint[orthogonalAxis], match.target[orthogonalAxis]);\n max = Math.max(max, snappedPoint[orthogonalAxis], match.target[orthogonalAxis]);\n if (match.targetBox) {\n min = Math.min(min, match.targetBox.min[orthogonalAxis]);\n max = Math.max(max, match.targetBox.max[orthogonalAxis]);\n markerPoints.push(\n this.createAxisPoint(axis, coordinate, match.targetBox.min[orthogonalAxis]),\n this.createAxisPoint(axis, coordinate, match.targetBox.max[orthogonalAxis]),\n );\n } else {\n markerPoints.push(\n this.createAxisPoint(axis, coordinate, snappedPoint[orthogonalAxis]),\n this.createAxisPoint(axis, coordinate, match.target[orthogonalAxis]),\n );\n }\n }\n\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n continue;\n }\n const start = new Vector2();\n const end = new Vector2();\n\n start[axis] = coordinate;\n end[axis] = coordinate;\n start[orthogonalAxis] = min;\n end[orthogonalAxis] = max;\n lines.push(new Line2(start, end));\n\n for (const marker of this.deduplicatePoints(markerPoints)) {\n this.appendSnapMarker(lines, marker);\n }\n }\n }\n\n private appendSnapMarker (lines: Line2[], point: Vector2): void {\n lines.push(\n new Line2(\n new Vector2(point.x - SNAP_MARKER_HALF_SIZE, point.y - SNAP_MARKER_HALF_SIZE),\n new Vector2(point.x + SNAP_MARKER_HALF_SIZE, point.y + SNAP_MARKER_HALF_SIZE),\n ),\n new Line2(\n new Vector2(point.x - SNAP_MARKER_HALF_SIZE, point.y + SNAP_MARKER_HALF_SIZE),\n new Vector2(point.x + SNAP_MARKER_HALF_SIZE, point.y - SNAP_MARKER_HALF_SIZE),\n ),\n );\n }\n\n /** 创建位于指定吸附轴和正交轴坐标上的点。 */\n private createAxisPoint (axis: SnapAxis, coordinate: number, orthogonalCoordinate: number): Vector2 {\n return axis === 'x'\n ? new Vector2(coordinate, orthogonalCoordinate)\n : new Vector2(orthogonalCoordinate, coordinate);\n }\n\n /** 把等距 gap 绘制为间距线。 */\n private appendGapLines (lines: Line2[], axis: SnapAxis): void {\n const selection = this.axisSelections[axis];\n\n if (!selection) {\n return;\n }\n\n for (const candidate of selection.candidates) {\n for (const gap of candidate.gaps ?? []) {\n if (Math.abs(gap.end - gap.start) <= SNAP_EPSILON) {\n continue;\n }\n if (axis === 'x') {\n lines.push(new Line2(\n new Vector2(gap.start, gap.cross),\n new Vector2(gap.end, gap.cross),\n ));\n } else {\n lines.push(new Line2(\n new Vector2(gap.cross, gap.start),\n new Vector2(gap.cross, gap.end),\n ));\n }\n }\n }\n }\n\n /** 构造两个相邻包围盒之间的 gap 提示。 */\n private createGapSegment (\n first: Box2,\n second: Box2,\n axis: SnapAxis,\n crossCoordinate?: number,\n ): SnapGapSegment {\n const orthogonalAxis: SnapAxis = axis === 'x' ? 'y' : 'x';\n const overlapMin = Math.max(first.min[orthogonalAxis], second.min[orthogonalAxis]);\n const overlapMax = Math.min(first.max[orthogonalAxis], second.max[orthogonalAxis]);\n const cross = crossCoordinate ?? (overlapMin <= overlapMax\n ? (overlapMin + overlapMax) / 2\n : (first.getCenter()[orthogonalAxis] + second.getCenter()[orthogonalAxis]) / 2);\n\n return {\n axis,\n start: first.max[axis],\n end: second.min[axis],\n cross,\n };\n }\n\n /** 把包围盒沿单轴移动到指定 min 坐标。 */\n private moveBoxAlongAxis (box: Box2, axis: SnapAxis, min: number): Box2 {\n const translation = new Vector2();\n\n translation[axis] = min - box.min[axis];\n\n return box.clone().translate(translation);\n }\n\n /** 判断两个包围盒在指定轴上的投影是否相交或相切。 */\n private rangesOverlap (first: Box2, second: Box2, axis: SnapAxis): boolean {\n return Math.min(first.max[axis], second.max[axis]) + SNAP_EPSILON >=\n Math.max(first.min[axis], second.min[axis]);\n }\n\n private pointsEqual (first: Vector2, second: Vector2): boolean {\n return Math.abs(first.x - second.x) <= SNAP_EPSILON &&\n Math.abs(first.y - second.y) <= SNAP_EPSILON;\n }\n\n /** 合并共享同一屏幕坐标的吸附锚点。 */\n private deduplicatePoints (points: readonly Vector2[]): Vector2[] {\n const unique: Vector2[] = [];\n\n for (const point of points) {\n if (!unique.some(item => this.pointsEqual(item, point))) {\n unique.push(point);\n }\n }\n\n return unique;\n }\n\n /** 排除被第三个目标占据的非相邻 gap。 */\n private hasInterveningBox (\n first: Box2,\n second: Box2,\n boxes: readonly Box2[],\n axis: SnapAxis,\n orthogonalAxis: SnapAxis,\n ): boolean {\n return boxes.some(box => box !== first && box !== second &&\n box.min[axis] < second.min[axis] - SNAP_EPSILON &&\n box.max[axis] > first.max[axis] + SNAP_EPSILON &&\n this.rangesOverlap(box, first, orthogonalAxis) &&\n this.rangesOverlap(box, second, orthogonalAxis));\n }\n\n /** 去掉由多组等价命中生成的重复线段。 */\n private deduplicateLines (lines: readonly Line2[]): Line2[] {\n const unique = new Map<string, Line2>();\n\n for (const line of lines) {\n const forward = `${line.start.x.toFixed(4)},${line.start.y.toFixed(4)}:${line.end.x.toFixed(4)},${line.end.y.toFixed(4)}`;\n const reverse = `${line.end.x.toFixed(4)},${line.end.y.toFixed(4)}:${line.start.x.toFixed(4)},${line.start.y.toFixed(4)}`;\n\n if (!unique.has(forward) && !unique.has(reverse)) {\n unique.set(forward, line);\n }\n }\n\n return Array.from(unique.values());\n }\n\n /** 清空本帧求解与渲染状态。 */\n private clearFrameState (): void {\n this.results = [];\n this.result = {};\n this.axisSelections = {};\n this.sourceBox = undefined;\n }\n}\n","/**\n * 光标图标映射与按需加载:定义 GestureCursorType 到 cursor 描述符的映射,\n * svg 类型在加载后就地填充 content。\n */\nimport { Downloader } from '@galacean/effects';\nimport type { GestureCursorType } from './cursor';\n\nconst assetsPrefix = 'https://mdn.alipayobjects.com/rms/uri/file/as/0.0.6';\n\nexport const cursorMap: Record<GestureCursorType, { type: 'svg' | 'preset', content: string, url?: string }> = {\n normal: { type: 'preset', content: 'default' },\n rotation: { type: 'svg', content: 'default', url: `${assetsPrefix}/icons/cursor-rotate-32.svg` },\n circle: { type: 'svg', content: 'default', url: `${assetsPrefix}/icons/cursor-rotate-32.svg` },\n scale: { type: 'svg', content: 'default', url: `${assetsPrefix}/icons/cursor-scale-32.svg` },\n hand: { type: 'preset', content: 'grab' },\n pointer: { type: 'preset', content: 'pointer' },\n text: { type: 'preset', content: 'text' },\n 'text-create': { type: 'preset', content: 'text' },\n 'active-hand': { type: 'preset', content: 'grabbing' },\n 'frame-create': { type: 'preset', content: 'crosshair' },\n 'box-select': { type: 'preset', content: 'crosshair' },\n 'text-rotation': { type: 'svg', content: 'default', url: 'https://mdn.alipayobjects.com/huamei_ixsp8m/afts/img/A*R722QoloC44AAAAAKkAAAAgAev-aAQ/original' },\n};\n\n/** 加载并缓存所有 SVG 光标资源。 */\nexport async function loadCursorIcons () {\n const downloader = new Downloader();\n const cursorIconLoaders = (Object.keys(cursorMap) as GestureCursorType[])\n .filter(key => Boolean(cursorMap[key].url))\n .map(key => new Promise<string>((resolve, reject) => {\n downloader.downloadText(cursorMap[key].url!, resolve, (status, message) => {\n reject(new Error(`Failed to load cursor icon (${status}): ${message}`));\n });\n }).then(text => cursorMap[key] = { ...cursorMap[key], content: text }));\n\n await Promise.all(cursorIconLoaders).catch((e: unknown) => {\n console.error(e);\n });\n}\n","import type { VFXItem } from '@galacean/effects';\nimport { EffectComponent, Geometry, glContext, Material, spec } from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport { Box2, Plane } from '@galacean/effects-math/es/extension/index';\nimport type { Matrix4 } from '../math';\nimport { Vector2, Vector3, getBoxByNormalizeBox, getNormalizeBoxByBoxes, scaleBox } from '../math';\nimport { Gizmo } from '../gizmo';\nimport type { GizmoOwner } from '../gizmo-owner';\nimport { GizmoViewportUtils } from '../viewport/viewport-utils';\nimport {\n VFXItemFactory,\n getPlayerItemById,\n getItemViewBox,\n} from '../items';\nimport {\n viewPositionToWorld,\n viewSizeToWorld,\n} from '../viewport/coordinates';\nimport {\n BASELINE_SYMBOL,\n CONTROL_TEXT_GLYPH_PADDING,\n METRICS_STRING,\n toColor,\n measureTextMetrics,\n type MeasuredTextMetrics,\n} from '../drawing';\nimport type { LoadingConfig } from '../configs/types';\nimport type { ConfigChange } from '../configs/config-definition';\nimport { loadingConfig } from '../configs/loading-config';\nimport type { LoadingItemOptions, LoadingItemState, LoadingManager } from './loading-manager';\n\nconst LOADING_TIP_FONT_SIZE = 16;\nconst LOADING_TIP_FONT_FAMILY = 'sans-serif';\nconst LOADING_TIP_COLOR = 0x000000;\n\n/** 为目标元素叠加加载动画与提示文案。 */\nexport class LoadingGizmo extends Gizmo {\n readonly type = 'loading';\n private configOff?: () => void;\n private managerOff?: () => void;\n private readonly manager: LoadingManager;\n private readonly loadingBoxSize = new Vector2();\n private _idMap = new Map<string, {\n /** 归一化加载区域。 */\n loadingBox: Box2,\n /** 加载动画渲染对象。 */\n loadingVFXItem: VFXItem,\n /** 加载提示配置。 */\n tip: LoadingItemOptions,\n }>();\n\n /**\n * 创建加载覆盖层。\n * @param owner Gizmo 宿主。\n * @param manager 加载状态管理器。\n */\n constructor (owner: GizmoOwner, manager: LoadingManager) {\n super(owner);\n this.manager = manager;\n this.configOff = owner.getConfigManager().onChange(\n loadingConfig,\n change => {\n this.onConfigChange(change);\n },\n );\n this.managerOff = this.manager.on('change', () => {\n this.syncManager();\n });\n this.syncManager();\n }\n\n /** 当前 Gizmo 实例持有的可销毁渲染投影。 */\n get idMap () {\n return this._idMap;\n }\n\n /** 当前 loading 元素 id 列表(由稳定 manager 派生)。 */\n get loadingIds (): string[] {\n return this.manager.ids;\n }\n\n /** 当前加载覆盖层配置。 */\n private get config (): Readonly<LoadingConfig> {\n return this._owner.getConfigManager().get(loadingConfig);\n }\n\n /**\n * 订阅 loading 集合变化:add/delete 后回调当前全量 id 列表。\n * @param cb 收到当前全量 loading id 列表的回调\n * @returns 退订函数,调用后取消对应监听\n */\n onLoadingChange (cb: (ids: string[]) => void): () => void {\n return this.manager.on('change', change => {\n if (change.addedIds.length > 0 || change.removedIds.length > 0) {\n cb(change.ids);\n }\n });\n }\n\n /**\n * 为指定元素添加 loading 覆盖层;同一元素不可重复添加。\n * @param id 目标元素 ID\n * @param options loading 配置(文案、位置、自定义区域、是否清空选中)\n */\n add (id: string, options?: LoadingItemOptions) {\n this.manager.add(id, options);\n }\n\n /**\n * 移除指定元素的 loading 覆盖层并释放对应 VFXItem。\n * @param id 目标元素 ID\n */\n delete (id: string) {\n this.manager.delete(id);\n }\n\n /**\n * 更新指定 loading 元素的提示文案。\n * @param id 目标元素 ID\n * @param options 待合并更新的 LoadingTip 属性\n */\n updateItem (id: string, options: LoadingItemOptions) {\n this.manager.update(id, options);\n }\n\n /** 根据目标元素的实时包围盒刷新加载动画。 */\n override onUpdate (): void {\n if (this._idMap.size === 0) {\n return;\n }\n for (const [id, loadingItem] of this._idMap) {\n this.updateLoadingVFXItemTransform(id, loadingItem);\n }\n }\n\n /**\n * 绘制所有加载提示文案。\n * @param control 绘制控制器。\n */\n override draw (control: Control): void {\n if (this._idMap.size === 0) {\n return;\n }\n\n for (const [id, loadingItem] of this._idMap) {\n if (!loadingItem.tip?.text) {\n continue;\n }\n const item = getPlayerItemById(this._owner.getEngine().sceneServer.compositions[0], id);\n const itemBox = item\n ? getItemViewBox(item, GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!))\n : new Box2();\n const loadingBox = getBoxByNormalizeBox(itemBox, loadingItem.loadingBox);\n\n this.drawLoadingTip(control, loadingBox, itemBox, loadingItem.tip);\n }\n }\n\n /** 释放当前实例的渲染投影;稳定 LoadingManager 不随 Gizmo 重建清空。 */\n override dispose (): void {\n this.configOff?.();\n this.configOff = undefined;\n this.managerOff?.();\n this.managerOff = undefined;\n this._idMap.forEach(loadingItem => {\n this.disposeLoadingVFXItem(loadingItem.loadingVFXItem);\n });\n this._idMap.clear();\n super.dispose();\n }\n\n /**\n * 在片元着色器变化时重建加载动画对象。\n * @param change 加载配置变更。\n */\n private onConfigChange (change: ConfigChange<LoadingConfig>): void {\n if (change.previous.loadingFragment === change.current.loadingFragment) {\n return;\n }\n for (const [id, loadingItem] of this._idMap) {\n this.disposeLoadingVFXItem(loadingItem.loadingVFXItem);\n loadingItem.loadingVFXItem = this.createLoadingVFXItem();\n this.updateLoadingVFXItemTransform(id, loadingItem);\n }\n }\n\n /**\n * 绘制单条加载提示,并将文本限制在加载区域内。\n * @param control 绘制控制器。\n * @param loadingBox 加载区域。\n * @param itemBox 目标元素包围盒。\n * @param tip 加载提示配置。\n */\n private drawLoadingTip (control: Control, loadingBox: Box2, itemBox: Box2, tip: LoadingItemOptions): void {\n // 步骤 1:计算提示位置与可用宽度。\n const { x: width, y: height } = loadingBox.getSize(this.loadingBoxSize);\n\n if (!tip.text || !Number.isFinite(width) || width <= 0) {\n return;\n }\n\n const positionedLeft = tip.position\n ? itemBox.min.x + (Number.isFinite(tip.position.x) ? tip.position.x : 0)\n : loadingBox.min.x;\n const left = tip.position\n ? Math.min(Math.max(positionedLeft, loadingBox.min.x), loadingBox.max.x)\n : loadingBox.min.x;\n const availableWidth = tip.position ? loadingBox.max.x - left : width;\n\n if (availableWidth <= 0) {\n return;\n }\n\n /**\n * 测量加载提示的粗体字形。\n * @param text 提示文本。\n * @param fontSize 字号。\n * @returns 文本字形尺寸。\n */\n const measureTipText = (text: string, fontSize: number): MeasuredTextMetrics => {\n const metrics = measureTextMetrics(text, fontSize, LOADING_TIP_FONT_FAMILY, 'bold');\n\n return {\n width: metrics.width || Array.from(text).length * fontSize,\n actualBoundingBoxAscent: metrics.actualBoundingBoxAscent || fontSize * 0.8,\n actualBoundingBoxDescent: metrics.actualBoundingBoxDescent || fontSize * 0.2,\n };\n };\n\n // 步骤 2:测量文本并缩小字号以适应可用宽度。\n const measuredAtBaseSize = measureTipText(tip.text, LOADING_TIP_FONT_SIZE);\n let fontSize = measuredAtBaseSize.width > availableWidth\n ? LOADING_TIP_FONT_SIZE * availableWidth / measuredAtBaseSize.width\n : LOADING_TIP_FONT_SIZE;\n let textMetrics = measureTipText(tip.text, fontSize);\n\n if (textMetrics.width > availableWidth) {\n fontSize *= availableWidth / textMetrics.width;\n textMetrics = measureTipText(tip.text, fontSize);\n }\n\n // 步骤 3:按字形基线计算最终绘制位置。\n const textLeft = tip.position ? left : loadingBox.min.x + (width - textMetrics.width) / 2;\n const inkHeight = textMetrics.actualBoundingBoxAscent + textMetrics.actualBoundingBoxDescent;\n const top = tip.position\n ? itemBox.min.y + (Number.isFinite(tip.position.y) ? tip.position.y : 0)\n : loadingBox.min.y + (height - inkHeight) / 2;\n const probeMetrics = measureTipText(METRICS_STRING + BASELINE_SYMBOL, fontSize);\n const inkTopFromCellTop = CONTROL_TEXT_GLYPH_PADDING\n + probeMetrics.actualBoundingBoxAscent\n - textMetrics.actualBoundingBoxAscent;\n\n control.drawText(\n textLeft,\n top - inkTopFromCellTop,\n tip.text,\n fontSize,\n toColor(LOADING_TIP_COLOR, 1),\n LOADING_TIP_FONT_FAMILY,\n 'bold',\n );\n }\n\n /** 将可销毁的渲染投影同步到当前加载状态。 */\n private syncManager (): void {\n const activeIds = new Set(this.manager.ids);\n\n for (const [id, loadingItem] of this._idMap) {\n if (!activeIds.has(id)) {\n this.disposeLoadingVFXItem(loadingItem.loadingVFXItem);\n this._idMap.delete(id);\n }\n }\n for (const id of activeIds) {\n const state = this.manager.get(id);\n\n if (!state) {\n continue;\n }\n const existing = this._idMap.get(id);\n\n if (existing) {\n existing.tip = {\n ...state.tip,\n position: state.tip.position ? state.tip.position.clone() : undefined,\n };\n } else {\n this.createProjection(id, state);\n }\n }\n }\n\n /**\n * 为加载状态创建渲染投影。\n * @param id 目标元素 ID。\n * @param state 加载状态。\n */\n private createProjection (id: string, state: LoadingItemState): void {\n const item = getPlayerItemById(this._owner.getEngine().sceneServer.compositions[0], id);\n const itemViewBox = item\n ? getItemViewBox(item, GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!))\n : new Box2();\n const currentBox = state.loadingBox\n ? this.getViewBoxByPixelBox(state.loadingBox)\n : itemViewBox;\n\n this._idMap.set(id, {\n loadingBox: getNormalizeBoxByBoxes(itemViewBox, currentBox),\n loadingVFXItem: this.createLoadingVFXItem(),\n tip: {\n ...state.tip,\n position: state.tip.position ? state.tip.position.clone() : undefined,\n },\n });\n this.updateLoadingVFXItemTransform(id, this._idMap.get(id)!);\n }\n\n /** @returns 当前相机信息。 */\n private getCameraInfo (): { position: Vector3, matrix: Matrix4 } {\n return GizmoViewportUtils.getCameraInfo(this._owner.getEngine());\n }\n\n /** @returns 当前视口的缩放、平移与尺寸。 */\n private getViewportParams (): { scale: number, translation: Vector2, width: number, height: number } {\n const composition = this._owner.getEngine().sceneServer.compositions[0];\n const camera = composition?.camera;\n\n if (camera) {\n const viewportMatrix = camera.getViewportMatrix();\n const scale = viewportMatrix.elements[0];\n const translation = new Vector2(viewportMatrix.elements[12], viewportMatrix.elements[13]);\n const width = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!).x;\n const height = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!).y;\n\n return { scale, translation, width, height };\n }\n\n return { scale: 1, translation: new Vector2(), width: GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!).x, height: GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!).y };\n }\n\n /**\n * 将视图坐标下的包围盒按当前视口缩放与平移变换为实际渲染包围盒。\n * @param box 视图坐标下的包围盒\n * @returns 经视口缩放与平移后的实际渲染包围盒\n */\n private getViewBoxByPixelBox (box: Box2): Box2 {\n const { scale, translation, width, height } = this.getViewportParams();\n const center = new Vector2(width / 2, height / 2);\n const result = scaleBox(box.clone(), scale, center).translate(translation);\n\n return result;\n }\n\n /**\n * 创建承载加载动画的 VFXItem。\n * @returns 已绑定几何与材质的加载动画对象。\n */\n private createLoadingVFXItem () {\n // 步骤 1:创建加载动画对象与平面几何。\n const composition = this._owner.getEngine().sceneServer.compositions[0];\n const loadingVFXItem = VFXItemFactory.createVFXItem(composition, null, 'LoadingVFXItem', EffectComponent);\n\n this._owner.getSelection().addIgnoreIds([loadingVFXItem.getInstanceId()]);\n loadingVFXItem.type = spec.ItemType.effect;\n const effects = loadingVFXItem.getComponent(EffectComponent);\n const engine = this._owner.getEngine();\n const geometry = Geometry.create(engine, {\n attributes: {\n aPos: {\n size: 3,\n data: new Float32Array([\n -0.5, -0.5, 0,\n 0.5, -0.5, 0,\n 0.5, 0.5, 0,\n -0.5, 0.5, 0,\n ]),\n },\n aUV: {\n size: 2,\n data: new Float32Array([\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 1,\n ]),\n },\n },\n indices: { data: new Uint16Array([0, 1, 2, 0, 2, 3]) },\n mode: glContext.TRIANGLES,\n drawCount: 6,\n });\n // 步骤 2:使用当前配置创建动画材质。\n const material = Material.create(engine, {\n shader: {\n vertex: `\nprecision highp float;\nattribute vec3 aPos;\nattribute vec2 aUV;\nuniform mat4 effects_MatrixVP;\nuniform mat4 effects_ObjectToWorld;\nvarying vec2 vUV;\nvoid main() {\n vUV = aUV;\n gl_Position = effects_MatrixVP * effects_ObjectToWorld * vec4(aPos, 1.0);\n}`,\n fragment: this.config.loadingFragment,\n },\n });\n\n // 步骤 3:绑定运行时几何与材质。\n // @ts-expect-error Effects 类型未暴露可写 geometry。\n effects.geometry = geometry;\n effects.material = material;\n\n return loadingVFXItem;\n }\n\n /** 释放 loading 渲染对象,并同步恢复 Selection 的命中过滤。 */\n private disposeLoadingVFXItem (item: VFXItem): void {\n this._owner.getSelection().deleteIgnoreIds([item.getInstanceId()]);\n item.dispose();\n }\n\n /**\n * 按目标元素的实时包围盒更新加载动画变换。\n * @param id 目标元素 ID。\n * @param loadingItem 对应的加载渲染投影。\n */\n private updateLoadingVFXItemTransform (id: string, loadingItem: { loadingBox: Box2, loadingVFXItem: VFXItem }): void {\n const item = getPlayerItemById(this._owner.getEngine().sceneServer.compositions[0], id);\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n const itemViewBox = item ? getItemViewBox(item, containerSize) : new Box2();\n const currentBox = getBoxByNormalizeBox(itemViewBox, loadingItem.loadingBox);\n\n const viewPosition = new Vector2((currentBox.max.x + currentBox.min.x) / 2, (currentBox.max.y + currentBox.min.y) / 2);\n const cameraInfo = this.getCameraInfo();\n const interactionPlane = new Plane(0, new Vector3(0, 0, 1));\n const worldPosition = viewPositionToWorld(viewPosition, cameraInfo, interactionPlane, containerSize);\n const viewSize = new Vector2(currentBox.max.x - currentBox.min.x, currentBox.max.y - currentBox.min.y);\n const worldSize = viewSizeToWorld(viewSize, containerSize, loadingItem.loadingVFXItem, cameraInfo, interactionPlane);\n\n if (worldPosition) {\n loadingItem.loadingVFXItem.transform.setPosition(worldPosition.x, worldPosition.y, 0);\n }\n loadingItem.loadingVFXItem.transform.setScale(worldSize.x, worldSize.y, 1);\n }\n\n}\n","import { Texture, FrameComponent, spec } from '@galacean/effects';\nimport type { Control } from '@galacean/effects-plugin-gui';\nimport { Box2 } from '@galacean/effects-math/es/extension/index';\nimport type { Matrix3 } from '../math';\nimport { Vector2, Vector3, getBoxTransform, getBoxTransformFromBox, getTransformedBox, getTransformedBoxCorners } from '../math';\nimport { Gizmo } from '../gizmo';\nimport { GizmoType } from '../gizmo-type';\nimport { GizmoViewportUtils } from '../viewport/viewport-utils';\nimport type { ViewportOverlayConfig } from '../configs/types';\nimport { viewportOverlayConfig } from '../configs/builtin-configs';\nimport { drawCorners, drawWithBoxTransform, fillBoxByCorners, toColor } from '../drawing';\nimport { getItemViewBox, getItemViewTransform, isFramePlayerItem } from '../items';\nimport { projectPoint } from '../viewport';\n\n/** 视口画板与安全区配置。 */\nexport type ViewProperty = {\n /** 画板(设计稿)尺寸 [宽, 高],单位为设计稿像素 */\n size: [number, number],\n /** 出血安全区 [上, 下, 左, 右],单位为设计稿像素,相对画板边缘的边距 */\n safeArea: [number, number, number, number],\n /** 预览安全区列表 */\n previewSafeAreas: {\n /** 安全区包围盒 [左, 上, 宽, 高],单位为设计稿像素,相对画板左上角 */\n box: [number, number, number, number],\n /** 填充色 [r, g, b, a?],0..255 */\n color?: number[],\n /** 背景贴图地址 */\n url?: string,\n /** 是否可见 */\n visible?: boolean,\n }[],\n};\n\n/** 视口展示 gizmo:绘制画板边框、画框外遮罩、出血与预览安全区。 */\nexport class ViewportOverlayGizmo extends Gizmo {\n readonly type = GizmoType.VIEWPORT_OVERLAY;\n\n /** 遮挡层绘制结果(画板视口盒) */\n box = new Box2();\n\n /** 主视口归一化 Box2 到屏幕的变换。 */\n transform: Matrix3 | undefined;\n\n /** 视图属性(由外部设置) */\n viewProperty: ViewProperty | undefined;\n\n /** 外部提供的主视口包围盒计算函数。 */\n mainViewportBoxProvider: (() => Box2 | null) | undefined;\n\n /** previewSafeAreas 贴图缓存:url → Texture(避免每帧重建) */\n private safeAreaTextures = new Map<string, Texture>();\n /** previewSafeAreas 贴图加载 Promise:url → Promise<Texture>(防重入,加载完写入 safeAreaTextures) */\n private safeAreaTexturePromises = new Map<string, Promise<Texture>>();\n\n /** 当前视口覆盖层配置。 */\n get config (): Readonly<ViewportOverlayConfig> {\n return this._owner.getConfigManager().get(viewportOverlayConfig);\n }\n\n /** 刷新当前画板或主视口的屏幕包围盒。 */\n override onUpdate (): void {\n // 步骤 1:优先使用外部提供的主视口包围盒。\n if (this.mainViewportBoxProvider) {\n this.box = this.mainViewportBoxProvider() ?? new Box2();\n this.transform = getBoxTransformFromBox(this.box);\n\n return;\n }\n // 步骤 2:查找主合成蒙版元素。\n const composition = this._owner.getEngine().sceneServer.compositions[0];\n const maskFrame = composition?.items.find(item =>\n item.type === spec.ItemType.null\n && item.getComponent(FrameComponent) !== undefined\n && item.name === '主合成蒙版',\n );\n\n if (maskFrame) {\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n\n this.box = getItemViewBox(maskFrame, containerSize);\n this.transform = getItemViewTransform(maskFrame, containerSize);\n\n return;\n }\n // 步骤 3:回退到真实画板元素。\n const frameItem = composition?.items.find(item => isFramePlayerItem(item));\n\n if (frameItem) {\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n\n this.box = getItemViewBox(frameItem, containerSize);\n this.transform = getItemViewTransform(frameItem, containerSize);\n\n return;\n }\n // 步骤 4:按预览尺寸投影居中的主视口矩形。\n if (!this.viewProperty) {\n this.box = new Box2();\n this.transform = undefined;\n\n return;\n }\n const anyItem = composition?.items.find(item => item.composition?.camera);\n\n if (!composition?.camera || !anyItem) {\n this.box = new Box2();\n this.transform = undefined;\n\n return;\n }\n this.transform = this.projectPreviewBox(anyItem, this.viewProperty.size);\n this.box = this.transform ? getTransformedBox(this.transform) : new Box2();\n }\n\n /**\n * 绘制画板外遮罩、安全区与画板边框。\n * @param control 绘制控制器。\n */\n override draw (control: Control): void {\n const transform = this.transform;\n\n if (this.box.isEmpty() || !transform) {\n return;\n }\n const corners = getTransformedBoxCorners(transform);\n const {\n boxWidth,\n boxColor,\n outerMaskEnabled,\n markColor,\n markAlpha,\n safeAreaEnabled,\n safeAreaBoxColor,\n safeAreaBoxAlpha,\n } = this.config;\n\n // 步骤 1:绘制画板外遮罩。\n if (outerMaskEnabled) {\n const markFill = toColor(markColor, markAlpha);\n const size = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n const screen = [new Vector2(), new Vector2(size.x, 0), size.clone(), new Vector2(0, size.y)];\n\n fillBoxByCorners(control, [screen[0], screen[1], corners[1], corners[0]], markFill);\n fillBoxByCorners(control, [screen[1], screen[2], corners[2], corners[1]], markFill);\n fillBoxByCorners(control, [screen[2], screen[3], corners[3], corners[2]], markFill);\n fillBoxByCorners(control, [screen[3], screen[0], corners[0], corners[3]], markFill);\n }\n\n // 步骤 2:绘制出血安全区。\n if (safeAreaEnabled && this.viewProperty) {\n const { size, safeArea } = this.viewProperty;\n const [top, bottom, left, right] = safeArea;\n const safeFill = toColor(safeAreaBoxColor, safeAreaBoxAlpha);\n const topRatio = top / size[1];\n const bottomRatio = bottom / size[1];\n const leftRatio = left / size[0];\n const rightRatio = right / size[0];\n\n fillBoxByCorners(control, getTransformedBoxCorners(transform, new Box2(new Vector2(0, 0), new Vector2(1, topRatio))), safeFill);\n fillBoxByCorners(control, getTransformedBoxCorners(transform, new Box2(new Vector2(0, topRatio), new Vector2(leftRatio, 1))), safeFill);\n fillBoxByCorners(control, getTransformedBoxCorners(transform, new Box2(new Vector2(1 - rightRatio, topRatio), new Vector2(1, 1))), safeFill);\n fillBoxByCorners(control, getTransformedBoxCorners(transform, new Box2(new Vector2(leftRatio, 1 - bottomRatio), new Vector2(1 - rightRatio, 1))), safeFill);\n\n // 步骤 3:绘制预览安全区的颜色或贴图。\n for (const previewSafeArea of this.viewProperty.previewSafeAreas) {\n const { box: [px, py, pw, ph], color, url, visible } = previewSafeArea;\n\n if (visible === false) {\n continue;\n }\n const previewCorners = getTransformedBoxCorners(transform, new Box2(\n new Vector2(px / size[0], py / size[1]),\n new Vector2((px + pw) / size[0], (py + ph) / size[1]),\n ));\n\n if (url) {\n const texture = this.getSafeAreaTexture(url, control.engine);\n\n if (!texture) {\n continue;\n }\n const [leftTop, rightTop, , leftBottom] = previewCorners;\n const xAxis = rightTop.clone().subtract(leftTop);\n const yAxis = leftBottom.clone().subtract(leftTop);\n\n drawWithBoxTransform(control, leftTop, xAxis, yAxis, () => {\n control.drawTexture(0, 0, 1, 1, texture);\n });\n } else {\n const alpha = color?.[3] ?? 0.3;\n const cr = color?.[0] ?? 255;\n const cg = color?.[1] ?? 0;\n const cb = color?.[2] ?? 0;\n const resultColor = (cr << 16) | (cg << 8) | cb;\n\n fillBoxByCorners(control, previewCorners, toColor(resultColor, alpha));\n }\n }\n }\n\n // 步骤 4:绘制画板边框。\n drawCorners(control, corners, toColor(boxColor, 1), boxWidth);\n }\n\n /** 释放预览安全区贴图缓存,调用父类释放。 */\n override dispose (): void {\n this.safeAreaTextures.forEach(texture => {\n if (!texture.isDestroyed) {\n texture.dispose();\n }\n });\n this.safeAreaTextures.clear();\n this.safeAreaTexturePromises.clear();\n super.dispose();\n }\n\n /**\n * 将居中的预览矩形投影为屏幕包围盒。\n * @param item 提供合成相机的播放器元素。\n * @param size 预览尺寸。\n * @returns 主视口屏幕包围盒。\n */\n private projectPreviewBox (item: import('@galacean/effects').VFXItem, size: [number, number]): Matrix3 | undefined {\n const containerSize = GizmoViewportUtils.getContainerSize(this._owner.getEngine().canvas.parentElement!);\n const w = size[0] / 2;\n const h = size[1] / 2;\n const points = [\n new Vector3(-w, h, 0),\n new Vector3(w, h, 0),\n new Vector3(w, -h, 0),\n new Vector3(-w, -h, 0),\n ].map(p => projectPoint(p, item, containerSize));\n\n return getBoxTransform(points);\n }\n\n /**\n * 获取预览安全区贴图(懒加载)。命中且未销毁则直接返回;否则发起一次异步加载并返回\n * undefined(本帧跳过该贴图,加载完成后由持续渲染循环自动重绘)。与 IconGizmo 同模式。\n * @param url 贴图地址\n * @param engine effects 引擎实例(取自 control)\n * @returns 命中且未销毁的缓存纹理;未命中且发起异步加载时返回 undefined\n */\n private getSafeAreaTexture (url: string, engine: Control['engine']): Texture | undefined {\n const cached = this.safeAreaTextures.get(url);\n\n if (cached && !cached.isDestroyed) {\n return cached;\n }\n if (!this.safeAreaTexturePromises.has(url)) {\n const promise = Texture.fromImage(url, engine).then(texture => {\n this.safeAreaTextures.set(url, texture);\n\n return texture;\n });\n\n this.safeAreaTexturePromises.set(url, promise);\n }\n\n return undefined;\n }\n}\n","import * as EFFECTS from '@galacean/effects';\nimport { logger, registerPlugin } from '@galacean/effects';\nimport { EditorGizmoPlugin } from './3d/gizmo-loader';\n\nregisterPlugin('editor-gizmo', EditorGizmoPlugin);\n\nexport * from './2d';\nexport * from './3d';\n\n/**\n * 插件版本号\n */\nexport const version = __VERSION__;\n\nlogger.info(`Plugin editor gizmo version: ${version}.`);\n\nif (version !== EFFECTS.version) {\n console.error(\n '注意:请统一 Editor Gizmo 插件与 Player 版本,不统一的版本混用会有不可预知的后果!',\n '\\nAttention: Please ensure the Editor Gizmo plugin is synchronized with the Player version. Mixing and matching incompatible versions may result in unpredictable consequences!'\n );\n}\n","/**\n * 返回数组中绝对值最大元素的索引\n * @param numbers 数值数组\n * @returns 绝对值最大元素的索引\n */\nexport function getAbsMaxIndex (numbers: number[]) {\n let resultIndex = 0;\n let max: number;\n\n numbers.forEach((number, index) => {\n if (index === 0) {\n max = Math.abs(number);\n } else {\n const absNumber = Math.abs(number);\n\n if (max < absNumber) {\n max = absNumber;\n resultIndex = index;\n }\n }\n });\n\n return resultIndex;\n}\n"],"names":["GizmoSubType","BoundingType","GeometryType","WireframeGeometryType","CoordinateSpace","IntervalType","GestureCursorType","GizmoType","TransformType","ResizeSelectionIconType","FrameLayoutMode","ImageInteractionType","ItemCreateType","DragType","IconType","DragThresholdState","ControlInputPhase","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_async_to_generator","fn","self","args","arguments","apply","err","undefined","_set_prototype_of","o","p","Object","setPrototypeOf","__proto__","_inherits","subClass","superClass","TypeError","prototype","create","constructor","writable","configurable","_is_native_reflect_construct","result","Boolean","valueOf","call","Reflect","construct","_","_construct","Parent","Class","a","push","instance","Function","bind","_get_prototype_of","getPrototypeOf","_wrap_native_super","_cache","Map","toString","indexOf","has","get","set","Wrapper","enumerable","_array_like_to_array","arr","len","length","i","arr2","Array","_create_for_of_iterator_helper_loose","allowArrayLike","it","Symbol","iterator","next","isArray","_unsupported_iterable_to_array","minLen","n","slice","name","from","test","_instanceof","left","right","hasInstance","__generator","thisArg","body","f","y","t","label","sent","trys","ops","g","Iterator","verb","v","step","op","pop","e","SuppressedError","color","xAxisColor","yAxisColor","zAxisColor","renderMode","glContext","TRIANGLES","axisIconMap","createImage","imageUrl","image","Image","src","onload","onerror","moveToPointWidthFixDistance","targetPos","currentPos","vecCameraItem","clone","subtract","scalerVecCameraItem","normalVecCameraItem","normalize","multiply","vecItemScaler","vecScalerItem","add","math","Vector3","Ray","Matrix4","Vector2","computeOrthographicOffCenter","bottom","top","near","far","b","c","tx","ty","tz","_extends","assign","target","source","hasOwnProperty","GeometryData","points","uvs","normals","indices","createXYPlaneCircle","radius","z","segments","thetaStart","thetaLength","startIndex","theta","x","Math","cos","sin","createXZPlaneCircle","createYZPlaneCircle","SphereGeometryData","widthSegments","heightSegments","phiStart","phiLength","PI","max","floor","thetaEnd","min","grid","index","iy","verticesRow","uOffset","ix","_this_normals","u","_this","normal","toArray","d","BoxGeometryData","width","height","depth","buildPlane","w","uDir","vDir","widthHalf","heightHalf","depthHalf","point","vertexCounter","numberOfVertices","CylinderGeometryData","radiusTop","radiusBottom","radialSegments","openEnded","generateCap","centerIndexStart","sign","halfHeight","centerIndexEnd","cosTheta","sinTheta","px","py","pz","uvU","uvV","indexArray","generateTorso","slope","indexRow","ConeGeometryData","TorusGeometryData","tube","tubularSegments","arc","j","cx","cy","PlaneGeometryData","gridX","gridY","gridX1","gridY1","segmentWidth","segmentHeight","ix1","Euler","FrustumGeometryData","position","rotation","fov","aspect","_this_points","halfY","tan","fovY","halfX","point1","point2","point3","point4","matrix","fromArray","toMatrix4","result1","transformPoint","result2","result3","result4","DirectionLightData","linesNumber","start","PointLightData","range","SpotLightData","spotAngle","FloorLineEdgeGeometryData","sideLength","parts","end","createGeometry","engine","type","size","geometryData","segments4","Geometry","attributes","a_Position","data","Float32Array","a_Normal","a_UV1","Uint16Array","mode","drawCount","createMeshFromSubType","subType","boundingMap","iconTexture","options","scale","boundSize","xCircle","yCircle","zCircle","center","xCircleBounding","yCircleBounding","zCircleBounding","xCircleTransform","yCircleTransform","zCircleTransform","centerTransform","WebGLRenderingContext","sprite","createSpriteMesh","camera","light","translation","createTranslationMesh","_step","axisSize","axisMesh","createAxisMesh","_iterator","mesh","transform","arrowSize","xArrow","createBasicMesh","cone","depthTest","yArrow","zArrow","xArrowTransform","Transform","valid","yArrowTransform","zArrowTransform","setRotation","translate","planeSize","xyPlane","plane","yzPlane","zxPlane","xyPlaneTransform","yzPlaneTransform","zxPlaneTransform","delta","createAxisBounding","triangle","triangles","firstGeometry","getTriangle","backfaceCulling","createScaleMesh","boxSize","centerBoxSize","xCube","box","yCube","zCube","centerCube","xCubeTransform","yCubeTransform","zCubeTransform","centerCubeTransform","sphere","pow","viewHelper","createViewHelperMesh","texture","posXSphere","posYSphere","posZSphere","posXSphereTransform","posYSphereTransform","posZSphereTransform","negXSphere","negYSphere","negZSphere","negXSphereTransform","negYSphereTransform","negZSphereTransform","radiusSegments","torus","alpha","geometry","getIndexData","getAttributeData","mat4","getWorldMatrix","i0","i1","i2","p0","p1","p2","projectPoint","isCentered","xAxis","yAxis","zAxis","xAxisTransform","yAxisTransform","zAxisTransform","materialType","myColor","myAlpha","material","geometryType","Sphere","cylinder","Cylinder","Cone","Torus","Sprite","Plane","frustum","Frustum","directionLight","DirectionLight","spotLight","SpotLight","pointLight","PointLight","floorGrid","FloorGrid","Box","Material","uniformValues","u_color","u_alpha","u_model","shader","shared","fragment","vertex","setVector3","setVector2","setMatrix","IDENTITY","stencilTest","blending","blendEquation","FUNC_ADD","blendFunction","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","depthMask","u_cameraPos","u_center","ZERO","Mesh","priority","Texture","setTexture","line","DEG2RAD","arcPath","_options_translate","rotate","rotMat4","_options_rotate","negate","addPoint","angle","transformNormal","rect","pos","h","forEach","vec","Shapes","ret","detail","anchors","block","unshift","Rectangle","Circle","myCenter","map","item","Hemisphere","outerRadius","concat","Edge","hw","RectangleEdge","Donut","donutRadius","path","positions","keys","createMeshFromShape","geo","combineGeometries","geometries","indicesBase","shape","LINES","None","Vector4","destroyWireframeMesh","dispose","DestroyOptions","keep","updateWireframeMesh","originGeometry","originMaterial","wireframe","cloneUniforms","wireframeGeometry","enabledMacros","macro","enableMacro","abs","getDrawCount","indexData","getTriangleIndexData","oid","faceCount","Uint32Array","idx","base","getTriangleIndexDataByCount","setIndexData","setDrawCount","getQuadIndexData","SharedGeometry","sourceIndex","drawStart","layout","getVertexLayout","setVertexBuffers","getVertexBuffers","editorRenderPassName","frontRenderPassName","behindRenderPassName","Quaternion","constants","GizmoComponent","RendererComponent1","coordinateSpace","mat","fromIdentity","wireframeMeshes","meshes","getHitTestParams","worldMat4","boundingKeys","targetItem","worldPos","worldQuat","worldSca","gizmoSubType","assignWorldTRS","targetTransform","quat","newPos","composition","setPosition","HitTestType","custom","clipMasks","frameClipMasks","collect","ray","pointInCanvas","hitPositions","gizmoComponent","getComponent","hitBounding","bounding","worldCenter","copyFrom","boxHalfSize","boxMax","boxMin","intersectBox","viewMat4","getViewMatrix","screenWidth","renderer","getWidth","screenHeight","getHeight","proMat4","cameraModelMat4","getInverseViewMatrix","localTransform","cloneFromMatrix","padding","localMat4","modelMat4","mvpMat4","vpMat4","screenCenter","up","elements","screenPoint","screenCenter2","toVector2","screenPoint2","screenRadius","distance","intersectSphere","tmpPositions","tmpPosition","worldTriangle","intersectTriangle","lastDistance","origin","distanceSquared","intersectRayLine","out","radiusPoint","getModelViewProjection","screenStart","screenEnd","screenRadiusVector","screenRadiusPoint","distanceOfPointAndLine","AC","BC","AB","subtractVectors","sqrt","P","lengthAC","lengthBC","lengthAB","isInLine","l2","line0","line1","l1","worldAP","screenPosition","worldAB","inverseViewProjection","getInverseViewProjectionMatrix","behavior","spec","InteractBehavior","NOTIFY","_proto","onStart","_this_item_composition","_this_item_composition_items","items","id","PluginSystem","_step1","_iterator1","getPlugins","plugin","gizmoPlugin","particleEmitter","createParticleContent","modelWireframe","needCreateModelContent","createModelContent","createBasicContent","iconTextures","createCombinationContent","boundingBox","createBoundingBoxContent","loaderData","gizmoItems","onEnable","sceneRendering","rendererFeatures","some","feature","GizmoRendererFeature","addRendererFeature","addRenderer","onDisable","removeRenderer","onUpdate","dt","updateRenderData","onDestroy","gizmoMesh","isDestroyed","contents","wireframeMesh","splice","render","_this_targetItem_getComponent","pMesh","RendererComponent","content","subMeshes","worldMatrix","effectMaterial","particle","ParticleSystemRenderer","particleMesh","quad","worldScale","parentTransform","distanceToCneter","localMat","worldTransform","proMat5","cameraPos","getDefaultRenderMode","getDefaultSize","psubMesh","modelComponent","assertExist","materialOptions","originMesh","shaderData","props","macros","glslVersion","displayServer","renderingDevice","gpuCapability","level","GLSLVersion","GLSL3","GLSL1","setVector4","particleSystem","ParticleSystem","definition","gizmoItem","fromData","duration","_data_options_color","r","decorators","desc","getOwnPropertyDescriptor","decorate","defineProperty","effectsClass","RendererFeature","passes","DrawGizmoFrontPass","DrawGizmoEditorPass","DrawGizmoBehindPass","addRenderPasses","pass","renderList","groups","enqueuePass","RenderPass","renderPassEvent","RenderPassEvent","AfterRendering","execute","clear","depthAction","TextureLoadAction","renderMeshes","BeforeRendering","AfterRenderingObjects","iconImages","EditorGizmoPlugin","Plugin","order","onAssetsLoadStart","scene","_state","onCompositionCreated","targetMap","gizmoTarget","Color","EulerOrder","Matrix3","RAD2DEG","clamp","isEqual","isZero","setZero","setFromNumber","num","setFromArray","array","offset","setElement","console","getElement","addVectors","multiplyVectors","divide","sum","ceil","round","lengthSquared","setLength","lerp","other","lerpVectors","v1","v2","dot","cross","dx","dy","equals","fill","atan2","rotateAround","s","random","fromNumber","ONE","Box2","Infinity","setFromPoints","makeEmpty","il","expandByPoint","setFromCenterAndSize","halfSize","isEmpty","getCenter","getSize","expandByVector","vector","expandByScalar","scalar","containsPoint","containsBox","getParameter","intersectsBox","clampPoint","distanceToPoint","clampedPoint","intersect","union","circle","getRadius","tempVec0","deltaX","deltaY","tempVec1","orientation","onSegment","Line2","direction","distanceSq","at","closestPointToPointParameter","clampToLine","fixedMin","fixedMax","startP","startEnd","se2se","se2sp","isNaN","closestPointToPoint","crossWithLine","o1","o2","o3","o4","addScaledVector","crossVectors","ax","ay","bx","by","bz","az","reflect","dz","applyEuler","euler","rotateVector3","applyQuaternion","q","applyMatrix","m","applyNormalMatrix","applyProjectionMatrix","setFromMatrixPosition","setFromMatrixColumn","X","Y","Z","setFromNormalAndCoplanarPoint","roundNumber","number","precision","method","Number","isInteger","decimal","UNIT_BOX","getBoxCorners","getBoxTransform","leftTop","rightTop","leftBottom","setFromRowMajorData","determinant","getBoxTransformFromBox","transformBoxPoint","inverseTransformBoxPoint","invert","getTransformedBoxCorners","getTransformedBox","setBoxFromPoints","transformedBoxIntersectsBox","transformedCorners","targetCorners","axes","reduce","corners","every","axis","transformedProjection","targetProjection","transformedBoxContainsPoint","scaleBox","anchor","resultScalar","getVector2Angle","getAngleByVectors","vector1","vector2","acos","getBoxByNormalizeBox","originMax","normalizeMax","originMin","normalizeMin","getNormalizeBoxByBoxes","current","currentMax","currentMin","RayCaster","setFromCamera","coords","inverseViewProjectMatrix","rayCastPlane","distanceToPlane","_defineProperties","descriptor","_create_class","Constructor","protoProps","staticProps","TextCaretMapper","layoutKey","caretPositions","reset","sync","style","JSON","stringify","text","fontFamily","fontSize","fontWeight","letterSpacing","lineHeight","textAlign","keepWordIntact","measureCaretPositions","localX","localY","closestLineDistance","POSITIVE_INFINITY","caret","closest","closestDistance","lineDistance","mirror","document","createElement","visibility","pointerEvents","boxSizing","margin","border","whiteSpace","overflowWrap","wordBreak","fontVariantLigatures","fontKerning","textNode","createTextNode","appendChild","createRange","mirrorRect","getBoundingClientRect","setStart","collapse","remove","TEXT_AREA_CLASS_NAME","TEXT_SELECTION_BACKGROUND_COLOR","applyCSSClass","element","className","cssText","textContent","replace","head","classList","TextEditSession","EventEmitter","owner","interactionParam","attachedProjections","Set","disposed","selectionStart","selectionEnd","caretMapper","handleInput","event","_this_owner_getEngine","textComponent","editingItem","_editingItem","TextComponent","getEngine","sceneServer","compositions","textStyle","setText","lineCount","getLineCount","textHeight","textLayout","setTextHeight","gotoAndStop","time","emit","itemId","getInstanceId","handleKeyDown","code","toLocaleLowerCase","preventDefault","stopPropagation","handleMouseDown","button","textAreaElement","setSelectionRange","handleDragStart","pointerSelectionPreviewElement","canvas","parentElement","removeTextAreaStyle","removeTextSelectionStyle","removePointerSelectionPreviewStyle","addEventListener","selectAllText","_this__editingItem","textLength","display","focus","select","scrollTop","beginFromCurrentSelection","textareaType","selectedItems","getSelection","getSelectedPlayerItems","selectedItem","ItemType","retarget","hideTextArea","cancelPointerSelection","beginPointerSelection","pointerSelection","active","applyPointerSelection","updatePointerSelection","_this_pointerSelection","finishPointerSelection","hidePointerSelectionPreview","attachProjection","projection","detachProjection","delete","saveSelectionRange","removeEventListener","syncTextArea","viewScale","isOpening","letterSpace","textWeight","viewRotation","fontScale","transformOrigin","paintOrder","getTextAlign","syncPointerLayout","selection","anchorIndex","focusIndex","renderPointerSelectionPreview","highlight","backgroundColor","replaceChildren","TextAlignment","middle","isEditing","GizmoTool","createGizmos","HandGizmoTool","MoveGizmoTool","getActiveEditMode","Gizmo","_owner","prepareForDispatch","requiresDragThreshold","draw","_control","onMouseDown","_event","onMouseUp","onMouseMove","onMouseDrag","onMouseLeave","onKeyDown","onKeyUp","VFXItemFactory","createVFXItem","parent","_len","types","_key","vfxItem","VFXItem","addComponent","addItem","rootComposition","setParent","DefaultVFXItems","createEmpty","null","createSprite","SpriteComponent","createText","createVideo","VideoComponent","video","createEffects","effects","urlname","preComposition","AssetManager","loadPrecomposition","autoplay","PrecompositionManager","instantiate","CompositionComponent","endBehavior","containerSize","projectMatrix","getViewProjectionMatrix","warn","projectionMatrix","getProjectionMatrix","viewMatrix","viewPositionToNDC","viewSizeToNDC","viewSize","ndcSizeToViewSize","ndcSize","viewPositionToWorld","viewPoint","cameraInfo","rayCaster","viewSizeToWorld","focusViewPoint","startPoint","nextPoint","worldSizeToViewSize","worldSize","getWorldPosition","getInverseVPRatio","rx","ry","viewSizeToPixel","viewportScale","viewPositionToPixel","viewPosition","viewportTranslation","translationInPixel","createInteractionPlane","isFramePlayerItem","FrameComponent","isEffectsPlayerItem","isGeneratorPlayerItem","includes","generatorType","isVideoGenerator","isVideoGeneratorPlayerItem","isGroupPlayerItem","getItemViewBox","getItemViewTransform","isVisible","richtext","hasFrameComponent","viewTransform","updateLocalMatrix","itemWorldMatrix","compositionMatrix","hasChildBox","children","childBox","child","getItemViewAnchor","getItemTransform","parentMatrix","decomposeItemTransform","quaternion","XYZ","setFromQuaternion","getItemWorldSize","itemToComposition","compositionWorldInverse","decompose","isPlayerItemVisible","getEffectsPlayerItemOwner","getFramePlayerItemAncestors","frames","getItemChildren","isFrameItem","getAllChildren","getPlayerItemById","dfs","targetId","found","pendingPauseRequests","WeakMap","playVideoComponent","videoComponent","playVideo","pauseVideoComponent","playPromise","pauseVideo","request","pauseAfterPlay","playVideoItem","playerItem","pauseVideoItem","playEffectsItem","controlItem","compositionItem","play","pauseEffectsItem","pause","GizmoViewportUtils","getViewScale","getViewportMatrix","getViewportTranslation","getCameraInfo","getContainerSize","container","offsetWidth","offsetHeight","cloneConfigValue","fromEntries","entries","param","freezeConfigValue","values","freeze","defineConfig","defaults","DEFAULT_LOADING_FRAGMENT","loadingConfig","loadingFragment","effectsEditModeConfig","allowTransform","viewportNavigationConfig","scrollWheelZoom","invertZoom","zoomStep","viewportOverlayConfig","boxColor","boxWidth","outerMaskEnabled","markColor","markAlpha","safeAreaEnabled","safeAreaBoxColor","safeAreaBoxAlpha","selectionPreviewConfig","videoPreSelectedPlay","preSelectedColor","preSelectedWidth","regionBoxColor","regionBoxAlpha","regionWireframeColor","regionWireframeAlpha","regionWireframeWidth","selectionSnapConfig","enabled","lineWidth","lineColor","resizeSelectionConfig","pixelRatio","contentRatio","wireframeColor","wireframeAlpha","wireframeWidth","cornerFillColor","cornerLineColor","cornerLineWidth","cornerLineAlpha","scaleCircleSize","rotationCircleSize","infoShowEnabled","sizeTextColor","nameTextColor","frameMoveLineColor","frameMoveLineWidth","imageLogoUrl","groupLogoUrl","textLogoUrl","videoLogoUrl","frameLogoUrl","effectsLogoUrl","imageCutConfig","maskColor","maskAlpha","cutBoxLineWidth","cutBoxLineColor","cutBoxLineAlpha","itemBoxLineWidth","itemBoxLineColor","itemBoxLineAlpha","cutBoxCornerRadius","cutBoxCornerFillColor","cutBoxCornerLineWidth","cutBoxCornerLineColor","cutBoxCornerLineAlpha","scaleInteractionDistance","directionScaleInteractionDistance","gridLineWidth","gridLineColor","gridLineAlpha","gridCount","imageExpandConfig","expandBoxLineWidth","expandBoxLineColor","expandBoxLineAlpha","expandBoxCornerRadius","expandBoxCornerLineWidth","expandBoxCornerLineColor","expandBoxCornerLineAlpha","expandBoxCornerFillColor","maskConfig","maskImage","brushSize","brushColor","brushAlpha","maskBackgroundColor","boxLineWidth","boxLineColor","boxLineAlpha","spriteTextEditConfig","textColor","preSelectedTextColor","dashLineDash","dashLineGap","editBoxAlpha","editBoxColor","editBoxLineAlpha","editBoxLineColor","editBoxPreSelectedAlpha","editBoxPreSelectedColor","editBoxLinePreSelectedAlpha","editBoxLinePreSelectedColor","hasChangedEditBoxAlpha","hasChangedEditBoxColor","hasChangedEditBoxLineAlpha","hasChangedEditBoxLineColor","hasChangedEditBoxPreSelectedAlpha","hasChangedEditBoxPreSelectedColor","hasChangedEditBoxLinePreSelectedAlpha","hasChangedEditBoxLinePreSelectedColor","editBoxSelectedAlpha","editBoxSelectedColor","iconConfig","autoShow","videoPlayUrl","videoPlayShift","videoPlayWidth","videoPlayHeight","imageGeneratorUrl","videoGeneratorUrl","generatorWidth","generatorHeight","itemCreateConfig","frameBorderColor","frameBorderWidth","frameBorderAlpha","frameFillColor","frameFillAlpha","frameChildBoxAlpha","frameChildBoxColor","zoomView","zoom","worldX","worldY","newNDCTranslation","viewportMatrix","compose","setViewportMatrix","panView","resultTranslation","getViewportTranslationRange","bounds","ViewportNavigationController","minScale","maxScale","minTranslation","maxTranslation","setScaleRange","isFinite","RangeError","clampCurrentViewport","setViewportRange","isTranslationRangeValid","translationBounds","resetViewportRange","handleWheel","_pointerCaptured","hasViewport","accept","buttonMask","MouseButtonMask","normalizeWheel","classifyWheel","config","zoomDelta","zoomByFactor","ctrlPressed","panByViewDelta","clampCurrentTranslation","emitChange","factor","currentScale","nextScale","getListeners","listener","off","metaPressed","viewDelta","buttonIndex","MouseButton","WheelUp","WheelDown","WheelLeft","WheelRight","navigator","platform","shiftPressed","correction","clamped","_this_engine_sceneServer_compositions_","getConfigManager","viewportRange","resizeFrameItem","frameItem","initialSize","currentWorldSize","currentLocalSize","localSize","localWidth","localHeight","setSize","currentPosition","subCompositionItem","getParentMatrix","INFO_TEXT_FONT_FAMILY","METRICS_STRING","colorCache","toColor","hex","cached","_measureCtx","measureTextMetrics","fontStyle","INFO_TEXT_FONT_SIZE","getContext","actualBoundingBoxAscent","actualBoundingBoxDescent","font","metrics","measureText","measureControlTextCellHeight","resolution","safeResolution","scaledFontSize","ascent","CONTROL_TEXT_GLYPH_PADDING","measureTextWidth","truncateText","maxWidth","char","wrapText","maxLines","lines","currentLine","chars","split","testLine","lastLine","drawCorners","control","drawLine","drawDashedCorners","dashLength","gapLength","patternLength","perimeterOffset","edgeLength","hypot","EPSILON","edgeOffset","patternOffset","drawingDash","segmentLength","startRatio","endRatio","drawBox","fillBox","fillRect","fillBoxByCorners","fillTriangle","getRotatedBoxCorners","halfWidth","halfW","halfH","fillRotatedRect","ex","ey","drawWithBoxTransform","drawFn","graphics","renderingServer","fromColumnVectors","pushTransform","popTransform","getResizeAxis","ResizeSelectionGizmo","RESIZE_SELECTION","cursorResult","NORMAL","cursorPoint","lastPoint","activeType","NULL","lastWorldPosition","_isLockScale","handlesActive","_ignoreInteraction","iconTexturePromises","scaleEnabled","interactionEnabled","interactive","configOff","onChange","change","onConfigChange","edges","scaleCorners","widthScaleAreas","cornerEnable","totalBox","childrenTransforms","interactiveDirection","scaleCorner","scaleEdgeCorners","_keyCode","isApplicableSelection","clearHandleHover","handled","updateHandleDrag","setCursor","hover","getMousePosition","refreshTransformType","refreshCursorResult","SCALE","WIDTH_SCALE","Left","doubleClick","refreshWireframeBySelectedItems","TRANSLATION","getSnapManager","cacheSnapTargetsForSelection","beginTransformOperation","transformType","finishHandleDrag","ROTATION","lastActiveType","computeTransformType","widthScaleArea","find","area","findScaleCorner","edge","findScaleEdge","isSingleTextSelection","edgeCenter","_this1","isSingleText","transformEnabled","hasLoadingSelection","iconType","getIconType","itemBox","itemTransform","isBoxEmpty","edgeLen","boxCorners","_this_boxLocalAxes","boxLocalAxes","halfLen","SCALE_CORNER_HIT_SIZE","buildEdgeHit","mid","areas","filter","initInteractionPlane","viewportPoint","resizeSession","_this_wireframe","interactionPlane","initialHandleView","fixedPointView","oppositeScaleEdgeCenter","createAnchoredResizeSession","oppositeScaleCorner","draggedWidthEdge","getSelectionTransformKind","_this_config","wireColor","childTransform","fillColor","strokeColor","corner","half","renderItemInfo","loadingManager","getLoadingManager","currentPoint","shift","setSelectionTransformKind","cursorRotation","handleScale","handleWidthScale","resetTransformOperation","frameId","refreshAfterPointerUp","getItemInfoName","xVec","yVec","edgeA","edgeB","dotA","textVerticalOnly","draggedEdge","reversedDraggedEdge","draggedIndex","findIndex","itemMatrix","handleKind","textResizeMode","_this_config_resolveResizeBehavior","initialHandle","fixedPoint","parentWorldToLocal","frame","resizeOrigin","component","fontOffset","worldToLocalRotation","extractRotation","pointerToHandleView","initialPosition","initialScale","initialWorldSize","initialLocalSize","frameAppliedTranslation","resizeBehavior","resolveResizeBehavior","externalTranslation","getIconUrl","urlMap","refreshIconSprites","previous","offloadData","getIconTexture","url","promise","fromImage","boxHeight","topCorner","anotherCorner","init","leftCorner","rightCorner","viewBoxWidth","sizeStr","join","sizeTextWidth","nameStr","textCellTop","INFO_ICON_BOTTOM","drawTexture","textWidth","drawText","pointerView","handleAnchoredResize","session","handleView","snappedHandleView","snapHandlePoint","targetHandleView","resizeAxis","initialViewLength","projectedViewLength","currentHandleDirection","cursorDirection","handleWorld","isShiftFreeScale","isFreeScaleByDefault","lockAspectRatio","isLockScale","resize","calculateAnchoredResize","pointer","totalScalar","lockedAxis","initialVector","pointerVector","axisIndex","initialLength","pointerLength","primaryScalar","scaleX","scaleY","fixedOffsetLocal","scaledFixedPoint","totalTranslation","applyAnchoredResize","setTextWidth","initialBaseWidth","currentBaseWidth","propertyScalar","residualScalar","setScale","setResizePosition","magnitude","setFontSize","setLineHeight","translationDelta","totalWorldTranslation","localTranslation","lastAppliedPosition","snapManager","clearSnappingVisualizations","preparePoint","state","ignoreInteraction","CornerRotationGizmo","resizeSelection","CORNER_ROTATION","rotationAngle","rotationActive","rawRotationAngle","initialSelectionAngle","rotationItems","updateRotationDrag","clearHover","hit","refreshHover","resolveInitialSelectionAngle","itemIds","resetOperation","vecStart","applyRotation","targetAngle","setRotationCursor","findRotationHit","boxCenter","rotationHalfSize","cornerOffset","xSign","ySign","hitCenter","hitOffset","xVector","yVector","angles","sharedAngle","LeaveEffectsEditGizmo","hitTest","isPointInEffectsEditScope","resetEditMode","BoxSelectionGizmo","deferToHitTarget","overlay","isBoxSelecting","mouseGrabbed","updateGrab","regionIds","filterSelectedItems","commitSelectedItems","selectedIds","getSelectedIds","wasBoxSelecting","emitMouseUpIfChanged","endPoint","candidates","selectableItems","selectableItem","resolveMarqueeSelectableItem","itemTransforms","containedFrameIds","ignoreIds","ignoreNames","_step2","_iterator2","frameAncestors","frameTransform","nextSelectedIds","interactionStartSelectedIds","force","sameIds","oldSelectedIds","ChangeSelectionGizmo","commitHoverTarget","hoverItemId","preSelectedId","setHoverOverlayTarget","Right","resolveContextSelection","pressHit","createHitSnapshot","initialSelectedIds","pressTarget","topmostId","shiftKey","resolvePressSelection","isCanceled","resetSession","releasePoint","deferredTarget","releaseHit","drillTargetId","getFocusedGroupId","isPointInFocusedGroup","setFocusedGroup","isPointInSelectedViewBox","selectedScopeHitIds","isItemSelected","hitId","selectedScopeIds","flatMap","copyMouseButton","InputEventMouseButton","device","pressed","canceled","commandOrControlAutoremap","altPressed","globalPosition","ClickDragMultiplexGizmo","clickCandidateList","clickCandidates","dragCandidateList","dragCandidates","auxiliaryBehaviorGizmo","auxiliaryBehavior","winner","invokeMouseDown","clickWinner","downSnapshot","dragWinner","candidate","invoke","clearAccepted","isApplePlatform","resolveDragCandidate","canceledRelease","ordered","clearWinners","allChildren","phase","isAccepted","groupItemsByRow","row","group","calculateAutoLayoutIndicatorLine","insertInfo","rowChange","isRowChange","rowBounds","lineY","isMovingUp","toRow","fromRow","minY","maxY","minX","maxX","siblingBox","calculateAutoLayoutPositionByMouse","mousePoint","siblingInfos","column","rowGroups","mouseY","mouseX","layoutInfo","maxRow","minRow","rowInfos","centerY","sort","targetRow","foundRow","currentRow","firstRow","lastRow","_step3","minDistance","_iterator3","rowInfo","targetRowItems","calculateInsertPositionFromLayout","siblingsWithInfos","originalRow","sortedRows","firstRowNum","firstRowBounds","currentRowBounds","referenceItemId","firstItem","lastRowItems","refIndex","siblingId","centerX","lastItem","AssistedLayout","selectedFrameIds","currentFrameIds","pendingGroupDetaches","autoLayoutIndicator","autoLayoutDragOriginalPosition","autoLayoutDragFrameId","autoLayoutDragItemId","pendingLayoutPosition","begin","cancel","_this_owner_getFrameManager_getParentFrame","getFrameManager","getParentFrame","resolveReparent","frameManager","updateViewBoxes","lastTargetFrameId","frameInfos","getViewInfos","changes","resolveItemReparent","targetFrameId","updateAutoLayout","clearAutoLayoutVisualState","parentFrameInfo","findFrameAt","layoutMode","AUTO","draggedItemId","originalLayoutInfo","layoutInfos","siblings","childId","layoutPosition","insertPosition","createFallbackIndicatorLine","insertIndex","insertDirection","targetSiblingId","targetColumn","finish","autoLayoutChange","placementChanges","pending","childrenOutOfFrame","groupId","originalFrameId","fromColumn","toColumn","targetFrameInfo","getViewInfo","indicator","fillCircle","clearAutoLayoutState","currentFrameId","currentFrame","targetFrame","childrenInFrame","frameBox","MoveSelectionGizmo","selectionBox","assistedLayout","applyTranslation","_this_assistedLayout","_this_assistedLayout1","_this_assistedLayout_resolveReparent","cacheSnapTargets","finishResult","actionEvent","resetDragState","prepareTranslationGeometry","move","currentSelectionBox","computeSelectionBox","_this__owner_getSnapManager_result_x","_this__owner_getSnapManager_result_y","_this__owner_getSnapManager_result_x1","_this__owner_getSnapManager_result_y1","previousSnap","prepareBox","snap","worldPosition","createSelectionInteractionGizmo","EffectsEditMode","effectsItemId","canRemainActiveForTool","tool","onEnter","enterEffectsEditScope","onExit","leaveEffectsEditScope","clearSelectedItems","cornerRotation","LeaveTextEditGizmo","_assert_this_initialized","ReferenceError","TextGizmo","TEXT","projectionToken","forwardTextInput","payload","on","drawEditBox","SelectTextGizmo","pointerSelecting","setTextCursor","resolveTextTarget","_hoverTextId","isTextCandidate","HOVER_LINE_WIDTH","HOVER_DASH_LENGTH","HOVER_GAP_LENGTH","excludeEditingItem","includeNearby","HOVER_HIT_RADIUS","diagonal","SQRT2","offsets","hitPoint","hoverTextId","TextEditMode","activation","EnterEditModeGizmo","hitIds","setActiveEditMode","DefaultSelectionMode","ImageCutGizmo","normalizeCutBox","NONE","IMAGE_CUT","inputPosition","refreshInteractionType","DIRECTION_SCALE","mouse","lockedAspect","renderGeometry","getSelectionGeometry","itemCorners","boxTransform","cutCorners","maskFill","gridColor","ratio","cornerFill","cornerStroke","drawCircle","MOVE","getCutInfo","cutBox","getCutBox","setCutBox","normalizeBox","currentInputPosition","_this_interactionParam","startMouse","itemBoxMin","itemBoxMax","xMinShift","xMaxShift","yMinShift","yMaxShift","resultBox","_this_interactionParam1","startCorner","resultCorner","_this_interactionParam2","cornerSignFactor","_this_result_normalizeCutBox_getSize","originWidth","originHeight","resultSignFactor","resultHeight","shiftY","resultWidth","shiftX","farthestCorner","_this_interactionParam3","_this_result_normalizeCutBox_getSize1","nextCorner","shiftDirection","clampResultCornerY","clampResultCornerX","resultCorners","hasInteractionType","dis","ImageCutGizmoTool","ImageExpandGizmo","normalizeExpandBox","IMAGE_EXPAND","expandCorners","getExpandInfo","expandBox","getExpandBox","setExpandBox","index1","_this_interactionParam4","_this_interactionParam5","_this_interactionParam6","ImageExpandGizmoTool","EDIT_TEXT_FONT_FAMILY","SpriteTextEditGizmo","SPRITE_TEXT_EDIT","preSelected","selected","cachedCoords","_this_cachedCoords","_this_cachedCoords1","computePreSelected","targetInfo","emitInfo","initResult","initParams","originBox","getItemOriginBox","initInfo","hasChanged","clearResultData","setSelected","setChangedState","setEditState","currentPreSelected","viewCorners","isPreSelected","entry","drawEntryBox","fillAlpha","lineAlpha","_i","_iter","_loop","changed","textFill","EDIT_TEXT_FONT_SIZE","EDIT_TEXT_LINE_HEIGHT","blockHeight","topY","li","textInfo","SpriteTextEditGizmoTool","MaskGizmo","MASK","maskImageLoadVersion","previewCanvas","maskTexture","refreshMaskImage","getSelectionTransform","toNormalized","clearRenderObjects","renderTransform","renderPreviewToCanvas","sourceType","TextureSourceType","flipY","updateSource","imageCanvas","getMask","setMode","close","clearMask","loadMaskImage","img","crossOrigin","Error","ctx","maskHexColor","padStart","maskBackgroundHexColor","fillStyle","drawImage","imageData","getImageData","mcR","mcG","mcB","mbcR","mbcG","mbcB","brightness","putImageData","x0","y0","x1","y1","globalCompositeOperation","lineCap","lineJoin","strokeStyle","beginPath","moveTo","lineTo","stroke","getMaskDataUrl","_this_getMask","toDataURL","loadVersion","brushHex","clearRect","save","restore","BOX_SELECT","CIRCLE","MaskGizmoTool","isDragThresholdReached","startClientX","startClientY","currentClientX","currentClientY","ItemCreateGizmo","_createType","dragStartPoint","dragStartViewPoint","pressStartedAt","frameChildren","interactiveChildrenBoxes","isFixedWidthText","textDragDirection","textBox","createItemId","dragCreationStarted","Date","now","generateGUID","refreshInteractiveChildrenBoxes","createInfo","getCurrentDragCreateInfo","resetInteractionState","updateTextDrag","dragCreateInfo","getFrameDragCreateInfo","pixelPosition","frameData","TEXT_CREATE","FRAME_CREATE","playerComposition","effectsItemIds","frameItemIds","filterItemIds","isTextPreview","previewBox","getTextPreviewBox","hoverConfig","hoverColor","updateFrameDrag","getCurrentViewPoint","resolvedEndPoint","createBox","_this_frameBox","committing","horizontalDistance","DRAG_THRESHOLD_PX","resolvedEndX","DEFAULT_TEXT_HEIGHT","emitDragCreate","getTextDragCreateInfo","pixelSize","pixelWidth","textData","actualBox","createType","ItemCreateGizmoTool","gizmo","configEqual","is","leftKeys","leftRecord","rightRecord","ConfigManager","definitions","assertDefinition","partial","validated","validate","accepted","existing","GizmoManager","configs","_activeGizmos","findGizmosByType","getAllManagedGizmos","getMultiplexCandidates","multiplex","auxiliary","activeGizmos","gizmos","LoadingManager","tip","loadingBox","addedIds","removedIds","updatedIds","clearSelected","update","ids","computeFrameAutoLayout","gap","calculateMixedLayout","placedItems","currentY","rowItems","withColumn","withoutColumn","rowHeight","assignments","nextColumn","currentX","calculateShelfLayout","currentShelfHeight","currentRowCount","needNewShelf","wouldExceedMaxWidth","maxRowWidth","maxRowCount","cloneLayoutInfo","cloneLayoutInfos","infos","cloneRecord","record","FREE","autoLayoutConfig","FrameManager","records","boxes","upsertFrame","input","ensureFrame","_this_records_get","deleteFrame","hydrate","snapshot","getFrame","getFrames","setLayoutMode","setChildren","addChild","removeChild","setLayoutInfos","setChildLayoutInfo","setAutoLayoutConfig","computeAutoLayout","computeLayoutInfosAfterReorder","targetItems","toViewInfo","_this_boxes_get","Selection","hoveringResults","_selectedIds","getEffectsEditItemId","_effectsEditItemId","_focusedGroupId","isSelectableGroup","addSelectedItems","normalizeHierarchySelection","old","updateFocusedGroupFromSelection","newSelectedIds","removeSelectedItems","setSelectedItems","addSelectedItem","setSelectedIds","pickOnDoubleClick","filterItemsByHierarchy","pickOnClick","_this_filterItemsByHierarchy_","regions","getHitTestRay","region","refreshResultRegions","reorderHitTestResult","isIgnoredNameById","preSelectedFrameOutBound","resolveHoverTarget","commitHover","overlayItemId","addIgnoreIds","deleteIgnoreIds","addIgnoreNames","names","deleteIgnoreNames","setIgnoreNames","findUnselectedItem","_this_filterSelectedItems_","getSelectedScopeIdSet","selectableIds","drillableIds","effectsItem","effectsOwner","groupFilter","resultSelectedIds","effectsOwnerId","getOutermostSelectableItem","focusedGroup","match","isDirectlySelectable","node","isRuntimeAncestor","hitTestResult","effectsItems","effectsItemMap","compositionChild","subChild","reverse","results","dfsItem","targetItemId","isNeedDepthTest","occlusion","RichTextComponent","tryAdd","currentSelectedIds","framePlayerItems","frameBoxInfoes","hasSelectedFrame","frameBoxInfo","interactionBox","ancestorLists","getGroupAncestors","commonGroup","ancestors","ancestor","_this_engine_sceneServer_compositions__items","uniqueIds","itemById","collectItems","acceptedIds","acceptedIdSet","acceptedAncestorIds","ancestorIds","hasAcceptedAncestor","ancestorId","isAncestorOfAccepted","hoverOverlayItemId","SnapManager","targetBoxes","axisSelections","clearCache","selectedIdSet","selectedAncestorIdSet","getAncestorIdSet","scopeItemId","getCommonSnapScopeId","cacheSnapTargetBoxes","isSelectedOrDescendant","getNearestSnapScopeId","getSnapTargetBoxes","getSnapTargetPoints","otherBoxes","xEnabled","yEnabled","previousResult","clearFrameState","unsnappedShift","sourceBox","targetBox","considerBoxAlignment","considerGapSnaps","publishResult","otherPoints","sourcePoint","considerAxisCandidate","getSnappingVisualizations","_this_sourceBox","_this_result_x","_this_result_y","snappedBox","appendAlignmentLines","appendGapLines","deduplicateLines","isSnapScopeItem","scopeAncestorIds","first","rest","orthogonalAxis","sourceCenter","targetCenter","sourceCoordinates","targetCoordinates","sourceCoordinate","targetCoordinate","validBoxes","sourceSize","firstIndex","secondIndex","second","ref","rangesOverlap","hasInterveningBox","existingGap","createGapSegment","desiredMin","desiredBox","moveBoxAlongAxis","gaps","beforeMin","beforeMax","beforeBox","afterMin","afterBox","pointMatches","pointGroups","pointsEqual","targets","matches","coordinate","toFixed","matchesAtCoordinate","NEGATIVE_INFINITY","markerPoints","createAxisPoint","snappedPoint","deduplicatePoints","marker","appendSnapMarker","orthogonalCoordinate","crossCoordinate","overlapMin","overlapMax","unique","forward","assetsPrefix","cursorMap","hand","loadCursorIcons","downloader","Downloader","all","downloadText","status","message","catch","LOADING_TIP_FONT_FAMILY","LoadingGizmo","manager","loadingBoxSize","_idMap","managerOff","syncManager","onLoadingChange","cb","updateItem","loadingItem","updateLoadingVFXItemTransform","drawLoadingTip","disposeLoadingVFXItem","loadingVFXItem","createLoadingVFXItem","positionedLeft","availableWidth","measureTipText","measuredAtBaseSize","LOADING_TIP_FONT_SIZE","textMetrics","textLeft","inkHeight","inkTopFromCellTop","probeMetrics","activeIds","createProjection","itemViewBox","currentBox","getViewBoxByPixelBox","getViewportParams","_this_getViewportParams","EffectComponent","effect","aPos","aUV","idMap","loadingIds","HandGizmo","panKeyPressed","dragType","isPanning","physicalKeycode","isMouseButtonPressed","Middle","isHandToolMode","beginPan","handlePointerMove","endPan","pan","getViewportNavigation","armed","ACTIVE_HAND","HAND","IconGizmo","ICON","hoverVideoId","computeHoverVideoId","videoPlayResult","POINTER","refreshVideoIconId","getCurrentTime","refreshResults","generatorItems","videoItems","GizmoViewport","Control","onMouseEnterCallback","onMouseMoveCallback","onMouseDragCallback","onMouseLeaveCallback","onMouseWheelCallback","onMouseDownCallback","onMouseUpCallback","onKeyDownCallback","onKeyUpCallback","onUpdateCallback","drawCallBack","mousePosition","globalMousePosition","dragStart","mouseInside","mouseButtonMask","dragThresholdState","mouseFilter","MouseFilter","Pass","focusMode","FocusMode","Click","mouseForcePassScrollEvents","setAnchorsAndOffsetsPreset","_deltaTime","onMouseEnter","location","recordMouseInput","hasPressedButtons","onMouseWheel","recordModifiers","isMouseInside","hasCrossedDragThreshold","createMouseEventAtCurrentPosition","InputEventMouseMotion","GestureHandler","activeGizmoTool","selectionTransformKind","gizmosToDispose","onPreselectChange","previousId","hoveredMediaItemId","previewEnabled","gizmoManager","viewportNavigation","editMode","createDefaultEditMode","createViewport","eventName","emitter","eventEmitter","kind","commitEditMode","redispatchMouseAtCurrentPosition","rebuildGizmos","_this_errorMonitor","errorMonitor","report","gizmoType","_this_gizmoViewport","_this_gizmoViewport_getMousePosition","gizmoViewport","cssCursor","encodeURIComponent","cursor","defaultCursorShape","getGizmoManager","_this_gizmoViewport_isMouseButtonPressed","_this_gizmosToDispose","specificGizmos","createCommonBeforeToolSwitch","setActiveTool","gizmoTool","resolveEditModeForTool","disposeQueuedGizmos","setErrorMonitor","reporter","clearCapturedGizmo","deltaTime","dispatchInput","drawGizmos","nextMode","previousMode","modeChanged","capturedGizmo","handleMouseInput","handleKeyboardEvent","_this_gizmoManager_get","_this_gizmoManager_get_isPanning","savedOwner","canDispatchMouseEvent","dispatchMouseEvent","localOwner","viewport","handleGizmoError","errorPhaseFor","gizmoControl","drawHoverOverlay","_this_gizmoManager_activeGizmos","drawGizmo","drawSnappingVisualizations","visualizations","_this_snapManager_config","ViewportOverlayGizmo","VIEWPORT_OVERLAY","safeAreaTextures","safeAreaTexturePromises","mainViewportBoxProvider","_this_mainViewportBoxProvider","maskFrame","viewProperty","anyItem","projectPreviewBox","markFill","screen","_this_viewProperty","safeArea","safeFill","topRatio","bottomRatio","leftRatio","rightRatio","previewSafeAreas","previewSafeArea","_previewSafeArea_box","pw","ph","visible","previewCorners","getSafeAreaTexture","cr","cg","registerPlugin","version","logger","EFFECTS","numbers","resultIndex","absNumber"],"mappings":"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"}
|