@galacean/effects-plugin-editor-gizmo 2.10.4 → 2.11.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +37 -5
  2. package/dist/2d/configs/builtin-configs.d.ts +14 -0
  3. package/dist/2d/configs/config-definition.d.ts +40 -0
  4. package/dist/2d/configs/config-manager.d.ts +52 -0
  5. package/dist/2d/configs/index.d.ts +6 -0
  6. package/dist/2d/configs/loading-config.d.ts +3 -0
  7. package/dist/2d/configs/types.d.ts +321 -0
  8. package/dist/2d/cursor-icons.d.ts +8 -0
  9. package/dist/2d/cursor.d.ts +36 -0
  10. package/dist/2d/drag-threshold.d.ts +13 -0
  11. package/dist/2d/drawing.d.ts +148 -0
  12. package/dist/2d/frame/frame-assisted-layout.d.ts +115 -0
  13. package/dist/2d/frame/frame-auto-layout.d.ts +47 -0
  14. package/dist/2d/frame/frame-manager.d.ts +169 -0
  15. package/dist/2d/frame/frame-resize.d.ts +13 -0
  16. package/dist/2d/frame/index.d.ts +5 -0
  17. package/dist/2d/frame/layout-calculations.d.ts +109 -0
  18. package/dist/2d/frame/types.d.ts +41 -0
  19. package/dist/2d/gesture-handler.d.ts +253 -0
  20. package/dist/2d/gizmo-action.d.ts +159 -0
  21. package/dist/2d/gizmo-manager.d.ts +105 -0
  22. package/dist/2d/gizmo-owner.d.ts +65 -0
  23. package/dist/2d/gizmo-tool.d.ts +15 -0
  24. package/dist/2d/gizmo-tools/hand-gizmo-tool.d.ts +4 -0
  25. package/dist/2d/gizmo-tools/image-cut-gizmo-tool.d.ts +7 -0
  26. package/dist/2d/gizmo-tools/image-expand-gizmo-tool.d.ts +7 -0
  27. package/dist/2d/gizmo-tools/index.d.ts +7 -0
  28. package/dist/2d/gizmo-tools/item-create-gizmo-tool.d.ts +10 -0
  29. package/dist/2d/gizmo-tools/mask-gizmo-tool.d.ts +7 -0
  30. package/dist/2d/gizmo-tools/move-gizmo-tool.d.ts +6 -0
  31. package/dist/2d/gizmo-tools/sprite-text-edit-gizmo-tool.d.ts +7 -0
  32. package/dist/2d/gizmo-type.d.ts +37 -0
  33. package/dist/2d/gizmo.d.ts +60 -0
  34. package/dist/2d/gizmos/box-selection-gizmo.d.ts +67 -0
  35. package/dist/2d/gizmos/change-selection-gizmo.d.ts +45 -0
  36. package/dist/2d/gizmos/click-drag-multiplex-gizmo.d.ts +95 -0
  37. package/dist/2d/gizmos/corner-rotation-gizmo.d.ts +101 -0
  38. package/dist/2d/gizmos/enter-edit-mode-gizmo.d.ts +11 -0
  39. package/dist/2d/gizmos/hand-gizmo.d.ts +67 -0
  40. package/dist/2d/gizmos/icon-gizmo.d.ts +107 -0
  41. package/dist/2d/gizmos/image-cut-gizmo.d.ts +140 -0
  42. package/dist/2d/gizmos/image-expand-gizmo.d.ts +135 -0
  43. package/dist/2d/gizmos/image-interaction.d.ts +40 -0
  44. package/dist/2d/gizmos/item-create-gizmo.d.ts +146 -0
  45. package/dist/2d/gizmos/leave-effects-edit-gizmo.d.ts +11 -0
  46. package/dist/2d/gizmos/leave-text-edit-gizmo.d.ts +11 -0
  47. package/dist/2d/gizmos/loading-gizmo.d.ts +110 -0
  48. package/dist/2d/gizmos/loading-manager.d.ts +74 -0
  49. package/dist/2d/gizmos/mask-gizmo.d.ts +153 -0
  50. package/dist/2d/gizmos/move-selection-gizmo.d.ts +64 -0
  51. package/dist/2d/gizmos/resize-selection-gizmo/anchored-resize.d.ts +40 -0
  52. package/dist/2d/gizmos/resize-selection-gizmo/index.d.ts +2 -0
  53. package/dist/2d/gizmos/resize-selection-gizmo/resize-selection-gizmo.d.ts +364 -0
  54. package/dist/2d/gizmos/resize-selection-gizmo/transform-types.d.ts +27 -0
  55. package/dist/2d/gizmos/select-text-gizmo.d.ts +77 -0
  56. package/dist/2d/gizmos/sprite-text-edit-gizmo.d.ts +149 -0
  57. package/dist/2d/gizmos/text-gizmo.d.ts +65 -0
  58. package/dist/2d/gizmos/viewport-overlay-gizmo.d.ts +66 -0
  59. package/dist/2d/index.d.ts +44 -0
  60. package/dist/2d/items/default-vfx-items.d.ts +45 -0
  61. package/dist/2d/items/index.d.ts +6 -0
  62. package/dist/2d/items/item-geometry.d.ts +69 -0
  63. package/dist/2d/items/item-hierarchy.d.ts +39 -0
  64. package/dist/2d/items/item-predicates.d.ts +31 -0
  65. package/dist/2d/items/media-controls.d.ts +39 -0
  66. package/dist/2d/items/vfx-item-factory.d.ts +13 -0
  67. package/dist/2d/math/core.d.ts +26 -0
  68. package/dist/2d/math/geometry.d.ts +83 -0
  69. package/dist/2d/math/index.d.ts +4 -0
  70. package/dist/2d/math/ray-caster.d.ts +56 -0
  71. package/dist/2d/math/utils.d.ts +6 -0
  72. package/dist/2d/modes/default-selection-mode.d.ts +19 -0
  73. package/dist/2d/modes/edit-mode.d.ts +18 -0
  74. package/dist/2d/modes/effects-edit-mode.d.ts +34 -0
  75. package/dist/2d/modes/index.d.ts +4 -0
  76. package/dist/2d/modes/text-edit-mode.d.ts +34 -0
  77. package/dist/2d/selection/create-selection-interaction-gizmo.d.ts +14 -0
  78. package/dist/2d/selection/index.d.ts +3 -0
  79. package/dist/2d/selection/selection.d.ts +338 -0
  80. package/dist/2d/selection/snap-manager.d.ts +130 -0
  81. package/dist/2d/text/index.d.ts +2 -0
  82. package/dist/2d/text/text-caret-mapper.d.ts +61 -0
  83. package/dist/2d/text/text-edit-session.d.ts +169 -0
  84. package/dist/2d/viewport/coordinates.d.ts +89 -0
  85. package/dist/2d/viewport/gizmo-viewport.d.ts +108 -0
  86. package/dist/2d/viewport/index.d.ts +6 -0
  87. package/dist/2d/viewport/types.d.ts +11 -0
  88. package/dist/2d/viewport/viewport-navigation-controller.d.ts +110 -0
  89. package/dist/2d/viewport/viewport-operations.d.ts +15 -0
  90. package/dist/2d/viewport/viewport-range.d.ts +9 -0
  91. package/dist/2d/viewport/viewport-utils.d.ts +32 -0
  92. package/dist/{gizmo-component.d.ts → 3d/gizmo-component.d.ts} +3 -5
  93. package/dist/3d/index.d.ts +4 -0
  94. package/dist/index.d.ts +2 -5
  95. package/dist/index.js +15030 -171
  96. package/dist/index.js.map +1 -1
  97. package/dist/index.min.js +2 -2
  98. package/dist/index.min.js.map +1 -1
  99. package/dist/index.mjs +14871 -173
  100. package/dist/index.mjs.map +1 -1
  101. package/package.json +9 -3
  102. /package/dist/{constants.d.ts → 3d/constants.d.ts} +0 -0
  103. /package/dist/{define.d.ts → 3d/define.d.ts} +0 -0
  104. /package/dist/{geometry → 3d/geometry}/box.d.ts +0 -0
  105. /package/dist/{geometry → 3d/geometry}/cone.d.ts +0 -0
  106. /package/dist/{geometry → 3d/geometry}/cylinder.d.ts +0 -0
  107. /package/dist/{geometry → 3d/geometry}/direction-light.d.ts +0 -0
  108. /package/dist/{geometry → 3d/geometry}/floor-line-edge.d.ts +0 -0
  109. /package/dist/{geometry → 3d/geometry}/floor-line.d.ts +0 -0
  110. /package/dist/{geometry → 3d/geometry}/frustum.d.ts +0 -0
  111. /package/dist/{geometry → 3d/geometry}/geometry.d.ts +0 -0
  112. /package/dist/{geometry → 3d/geometry}/index.d.ts +0 -0
  113. /package/dist/{geometry → 3d/geometry}/plane.d.ts +0 -0
  114. /package/dist/{geometry → 3d/geometry}/point-light.d.ts +0 -0
  115. /package/dist/{geometry → 3d/geometry}/sphere.d.ts +0 -0
  116. /package/dist/{geometry → 3d/geometry}/spot-light.d.ts +0 -0
  117. /package/dist/{geometry → 3d/geometry}/torus.d.ts +0 -0
  118. /package/dist/{gizmo-loader.d.ts → 3d/gizmo-loader.d.ts} +0 -0
  119. /package/dist/{gizmo-vfx-item.d.ts → 3d/gizmo-vfx-item.d.ts} +0 -0
  120. /package/dist/{math-utils.d.ts → 3d/math-utils.d.ts} +0 -0
  121. /package/dist/{mesh.d.ts → 3d/mesh.d.ts} +0 -0
  122. /package/dist/{raycast.d.ts → 3d/raycast.d.ts} +0 -0
  123. /package/dist/{shape.d.ts → 3d/shape.d.ts} +0 -0
  124. /package/dist/{util.d.ts → 3d/util.d.ts} +0 -0
  125. /package/dist/{wireframe.d.ts → 3d/wireframe.d.ts} +0 -0
@@ -0,0 +1,130 @@
1
+ import { Line2, type Box2 } from '@galacean/effects-math/es/extension/index';
2
+ import { Vector2 } from '../math';
3
+ import type { SnapConfig } from '../configs/types';
4
+ import type { VFXItem } from '@galacean/effects';
5
+ import type { GizmoOwner } from '../gizmo-owner';
6
+ /** 位移吸附结果。 */
7
+ export type TranslationSnapResult = {
8
+ /** x 方向吸附距离 */
9
+ x?: number;
10
+ /** y 方向吸附距离 */
11
+ y?: number;
12
+ /** x 方向点吸附信息 */
13
+ xPoints?: TranslationPointSnapTarget[];
14
+ /** y 方向点吸附信息 */
15
+ yPoints?: TranslationPointSnapTarget[];
16
+ };
17
+ /** 平移点吸附信息。 */
18
+ export type TranslationPointSnapTarget = {
19
+ /** 包围盒点 */
20
+ point: Vector2;
21
+ /** 吸附点 */
22
+ targets: Vector2[];
23
+ };
24
+ /** 管理选区吸附目标、修正量和对齐提示。 */
25
+ export declare class SnapManager {
26
+ /** 当前吸附结果。距离为未吸附位置减目标位置,调用方应减去该值。 */
27
+ result: TranslationSnapResult;
28
+ private readonly owner;
29
+ /** 吸附提示线集合。 */
30
+ private results;
31
+ /** 当前拖拽会话缓存的吸附目标。 */
32
+ private targetBoxes;
33
+ /** 本帧每轴选中的最近候选。 */
34
+ private axisSelections;
35
+ /** 本帧尚未施加吸附修正的选区包围盒。 */
36
+ private sourceBox;
37
+ /**
38
+ * @param owner Gizmo 宿主
39
+ */
40
+ constructor(owner: GizmoOwner);
41
+ /** 是否启用吸附。 */
42
+ get enabled(): boolean;
43
+ /** 当前吸附配置。 */
44
+ get config(): Readonly<SnapConfig>;
45
+ /**
46
+ * 缓存一次选区交互使用的吸附目标。
47
+ * @param items 场景元素
48
+ * @param selectedItems 当前选中元素
49
+ * @param containerSize 画布容器尺寸
50
+ */
51
+ cacheSnapTargetsForSelection(items: readonly VFXItem[], selectedItems: readonly VFXItem[], containerSize: Vector2): void;
52
+ /**
53
+ * 缓存视图空间中的吸附目标包围盒。
54
+ * @param boxes 吸附目标包围盒
55
+ */
56
+ cacheSnapTargetBoxes(boxes: readonly Box2[]): void;
57
+ /** 清空当前拖拽会话的吸附目标缓存。 */
58
+ clearCache(): void;
59
+ /** @returns 当前缓存的吸附目标包围盒。 */
60
+ getSnapTargetBoxes(): readonly Box2[];
61
+ /** @returns 当前吸附目标的角点和中心点。 */
62
+ getSnapTargetPoints(): Vector2[];
63
+ /**
64
+ * 包围盒位移吸附。每轴分别选择最近的边、中心或等距间隔候选。
65
+ * @param shift 本次原始偏移值
66
+ * @param box 当前已施加上一帧吸附修正的包围盒
67
+ * @param otherBoxes 吸附包围盒
68
+ * @param xEnabled 是否进行 x 轴吸附
69
+ * @param yEnabled 是否进行 y 轴吸附
70
+ */
71
+ prepareBox(shift: Vector2, box: Box2, otherBoxes?: readonly Box2[], xEnabled?: boolean, yEnabled?: boolean): void;
72
+ /**
73
+ * 点位移吸附。x/y 两轴独立选择最近目标。
74
+ * @param shift 本次原始偏移值
75
+ * @param point 当前已施加上一帧吸附修正的点
76
+ * @param otherPoints 吸附点集合
77
+ * @param xEnabled 是否进行 x 轴吸附
78
+ * @param yEnabled 是否进行 y 轴吸附
79
+ */
80
+ preparePoint(shift: Vector2, point: Vector2, otherPoints?: readonly Vector2[], xEnabled?: boolean, yEnabled?: boolean): void;
81
+ /** @returns 当前视图坐标系中的吸附提示线。 */
82
+ getSnappingVisualizations(): readonly Line2[];
83
+ /** 清空吸附修正量和提示,保留目标缓存。 */
84
+ clearSnappingVisualizations(): void;
85
+ /** 清空全部吸附状态。 */
86
+ reset(): void;
87
+ private update;
88
+ /** 判断元素自身或任一祖先是否属于当前选区。 */
89
+ private isSelectedOrDescendant;
90
+ /** 收集当前选区的全部祖先,避免容器成为自身内容的吸附目标。 */
91
+ private getAncestorIdSet;
92
+ /** 获取元素所在的最近吸附作用域;作用域元素自身属于外层。 */
93
+ private getNearestSnapScopeId;
94
+ /** 获取整个选区共同所在的最近吸附作用域。 */
95
+ private getCommonSnapScopeId;
96
+ /** 画板和动效容器都会隔离内外吸附候选。 */
97
+ private isSnapScopeItem;
98
+ /** 比较一个目标包围盒的 min / center / max 锚点。 */
99
+ private considerBoxAlignment;
100
+ /**
101
+ * 添加等距候选:在现有 gap 中居中,或在 gap 两端复制相同间距。
102
+ */
103
+ private considerGapSnaps;
104
+ /** 只保留阈值内最近的候选;同一修正量的命中全部合并用于渲染。 */
105
+ private considerAxisCandidate;
106
+ /** 将内部轴命中发布到兼容的 TranslationSnapResult。 */
107
+ private publishResult;
108
+ /** 生成贯穿选区和全部命中目标完整范围的对齐线,并标记参与边段的端点。 */
109
+ private appendAlignmentLines;
110
+ private appendSnapMarker;
111
+ /** 创建位于指定吸附轴和正交轴坐标上的点。 */
112
+ private createAxisPoint;
113
+ /** 把等距 gap 绘制为间距线。 */
114
+ private appendGapLines;
115
+ /** 构造两个相邻包围盒之间的 gap 提示。 */
116
+ private createGapSegment;
117
+ /** 把包围盒沿单轴移动到指定 min 坐标。 */
118
+ private moveBoxAlongAxis;
119
+ /** 判断两个包围盒在指定轴上的投影是否相交或相切。 */
120
+ private rangesOverlap;
121
+ private pointsEqual;
122
+ /** 合并共享同一屏幕坐标的吸附锚点。 */
123
+ private deduplicatePoints;
124
+ /** 排除被第三个目标占据的非相邻 gap。 */
125
+ private hasInterveningBox;
126
+ /** 去掉由多组等价命中生成的重复线段。 */
127
+ private deduplicateLines;
128
+ /** 清空本帧求解与渲染状态。 */
129
+ private clearFrameState;
130
+ }
@@ -0,0 +1,2 @@
1
+ export { TextEditSession } from './text-edit-session';
2
+ export type { TextEditActivation } from './text-edit-session';
@@ -0,0 +1,61 @@
1
+ /** 视图坐标点。 */
2
+ export type ViewPoint = {
3
+ /** X 坐标。 */
4
+ x: number;
5
+ /** Y 坐标。 */
6
+ y: number;
7
+ };
8
+ /** 文本插入点计算所需的 DOM 布局样式。 */
9
+ export type TextCaretLayout = {
10
+ /** 文本框左坐标。 */
11
+ left: number;
12
+ /** 文本框上坐标。 */
13
+ top: number;
14
+ /** 文本框宽度。 */
15
+ width: number;
16
+ /** 文本框高度。 */
17
+ height: number;
18
+ /** 文本框旋转弧度。 */
19
+ rotation: number;
20
+ /** 文本内容。 */
21
+ text: string;
22
+ /** 字体。 */
23
+ fontFamily: string;
24
+ /** 字号。 */
25
+ fontSize: number;
26
+ /** 字重。 */
27
+ fontWeight: string | number;
28
+ /** 字间距。 */
29
+ letterSpacing: number;
30
+ /** 行高。 */
31
+ lineHeight: number;
32
+ /** 文本对齐方式。 */
33
+ textAlign: 'left' | 'center' | 'right';
34
+ /** 是否保持单词完整换行。 */
35
+ keepWordIntact: boolean;
36
+ };
37
+ /** 使用浏览器文本布局将视图坐标映射为文本插入点。 */
38
+ export declare class TextCaretMapper {
39
+ private layout;
40
+ private layoutKey;
41
+ private caretPositions;
42
+ /** 清除当前布局。 */
43
+ reset(): void;
44
+ /**
45
+ * 同步文本框样式并按需重新测量插入点。
46
+ * @param style 文本框布局样式
47
+ */
48
+ sync(style: TextCaretLayout): void;
49
+ /**
50
+ * 查找最接近视图坐标的文本插入点。
51
+ * @param point 视图坐标
52
+ * @returns 文本偏移;布局尚未同步时返回 undefined
53
+ */
54
+ resolve(point: ViewPoint): number | undefined;
55
+ /**
56
+ * 使用离屏 DOM 测量全部文本插入点。
57
+ * @param style 文本框布局样式
58
+ * @returns 插入点位置列表
59
+ */
60
+ private measureCaretPositions;
61
+ }
@@ -0,0 +1,169 @@
1
+ import { EventEmitter, type VFXItem } from '@galacean/effects';
2
+ import type { Box2 } from '@galacean/effects-math/es/extension/index';
3
+ import type { GizmoOwner } from '../gizmo-owner';
4
+ import { type Matrix3 } from '../math';
5
+ import { type ViewPoint } from './text-caret-mapper';
6
+ /** 文本编辑进入后选中全文或仅聚焦输入框。 */
7
+ export type TextEditActivation = 'select' | 'focus';
8
+ /** 文本编辑投影结果。 */
9
+ export type TextResult = TextValidResult | TextEmptyResult;
10
+ /** 有效文本编辑投影。 */
11
+ export type TextValidResult = {
12
+ /** 结果类型。 */
13
+ type: 'valid';
14
+ /** 文本视图包围盒。 */
15
+ box: Box2;
16
+ /** 文本局部 Box2 到视图的变换。 */
17
+ transform: Matrix3;
18
+ };
19
+ /** 空文本编辑投影。 */
20
+ export type TextEmptyResult = {
21
+ /** 结果类型。 */
22
+ type: 'empty';
23
+ };
24
+ /** 文本 Gizmo 的交互状态。 */
25
+ export type TextInteractionParam = {
26
+ /** 当前交互类型。 */
27
+ type: 'none' | 'edit';
28
+ /** 文本框激活方式。 */
29
+ textareaType?: TextEditActivation;
30
+ };
31
+ /** 文本输入事件参数。 */
32
+ export type TextInputPayload = {
33
+ /** 文本元素 ID。 */
34
+ itemId: string;
35
+ /** 输入后的文本。 */
36
+ text: string;
37
+ /** 当前字体。 */
38
+ fontFamily: string;
39
+ };
40
+ /** 文本编辑会话事件参数。 */
41
+ type TextEditSessionEvents = {
42
+ /** 文本输入事件。 */
43
+ textInput: [TextInputPayload];
44
+ };
45
+ /** 管理行内文本编辑的 textarea、选区和画布投影。 */
46
+ export declare class TextEditSession extends EventEmitter<TextEditSessionEvents> {
47
+ /** 文本编辑使用的 DOM 输入框。 */
48
+ readonly textAreaElement: HTMLTextAreaElement;
49
+ /** 当前文本交互状态。 */
50
+ interactionParam: TextInteractionParam;
51
+ private readonly owner;
52
+ private _editingItem;
53
+ private readonly attachedProjections;
54
+ private disposed;
55
+ private selectionStart;
56
+ private selectionEnd;
57
+ private pointerSelection;
58
+ private readonly caretMapper;
59
+ /** 画布接管拖选期间使用的无焦点选区预览。 */
60
+ private readonly pointerSelectionPreviewElement;
61
+ private readonly removeTextAreaStyle;
62
+ private readonly removeTextSelectionStyle;
63
+ private readonly removePointerSelectionPreviewStyle;
64
+ /**
65
+ * 将 DOM 输入同步到文本组件并发出输入事件。
66
+ * @param event DOM 输入事件。
67
+ */
68
+ private readonly handleInput;
69
+ /**
70
+ * 隔离输入框键盘事件。
71
+ * @param event DOM 键盘事件。
72
+ */
73
+ private readonly handleKeyDown;
74
+ /**
75
+ * 在新的指针选择开始前折叠原 DOM 选区。
76
+ * @param event DOM 鼠标事件。
77
+ */
78
+ private readonly handleMouseDown;
79
+ /**
80
+ * 阻止浏览器原生文本拖放。
81
+ * @param event DOM 拖拽事件。
82
+ */
83
+ private readonly handleDragStart;
84
+ /**
85
+ * @param owner Gizmo 宿主
86
+ */
87
+ constructor(owner: GizmoOwner);
88
+ /** 当前正在编辑的文本元素。 */
89
+ get editingItem(): VFXItem | undefined;
90
+ /** 是否存在正在编辑的文本元素。 */
91
+ get isEditing(): boolean;
92
+ /**
93
+ * 选中当前编辑文本的全部内容,并将焦点交给输入框。
94
+ *
95
+ * 输入框尚未完成首次画布投影时会先保存全文选区,待投影打开后恢复。
96
+ * @returns 当前存在可编辑文本时返回 true
97
+ */
98
+ selectAllText(): boolean;
99
+ /**
100
+ * 使用当前单选文本元素开始编辑。
101
+ * @param textareaType 文本框激活方式
102
+ * @returns 是否成功开始编辑
103
+ */
104
+ beginFromCurrentSelection(textareaType: TextEditActivation): boolean;
105
+ /**
106
+ * 将当前会话切换到另一个文本元素。
107
+ * @param item 新的文本元素
108
+ * @param textareaType 文本框激活方式
109
+ * @returns 是否切换成功
110
+ */
111
+ retarget(item: VFXItem, textareaType?: TextEditActivation): boolean;
112
+ /**
113
+ * 开始使用画布指针拖拽选择文本。
114
+ * @param point 选择起点
115
+ */
116
+ beginPointerSelection(point: ViewPoint): void;
117
+ /**
118
+ * 更新指针拖拽选择终点。
119
+ * @param point 当前指针位置
120
+ */
121
+ updatePointerSelection(point: ViewPoint): void;
122
+ /**
123
+ * 完成指针拖拽选择。
124
+ * @param point 最终指针位置
125
+ */
126
+ finishPointerSelection(point: ViewPoint): void;
127
+ /** 取消指针拖拽选择。 */
128
+ cancelPointerSelection(): void;
129
+ /**
130
+ * 挂接一个画布文本投影。
131
+ * @param projection 投影实例
132
+ */
133
+ attachProjection(projection: object): void;
134
+ /**
135
+ * 脱离一个画布文本投影。
136
+ * @param projection 投影实例
137
+ */
138
+ detachProjection(projection: object): void;
139
+ /** 结束编辑并释放 DOM 资源和事件监听器。 */
140
+ dispose(): void;
141
+ /**
142
+ * 将 textarea 的位置和排版同步到画布文本投影。
143
+ * @param result 当前文本投影结果
144
+ * @param viewScale 视口缩放
145
+ */
146
+ syncTextArea(result: TextResult, viewScale: number): void;
147
+ /** 保存当前 DOM 文本选区。 */
148
+ private saveSelectionRange;
149
+ /** 隐藏输入框并停止监听输入。 */
150
+ private hideTextArea;
151
+ /**
152
+ * 同步插入点布局并应用待处理的指针选区。
153
+ * @param style 文本插入点布局
154
+ */
155
+ private syncPointerLayout;
156
+ /** @returns 是否成功将指针选区应用到 DOM 输入框。 */
157
+ private applyPointerSelection;
158
+ /** 绘制画布指针拖选对应的文字高亮。 */
159
+ private renderPointerSelectionPreview;
160
+ /** 隐藏画布指针拖选预览。 */
161
+ private hidePointerSelectionPreview;
162
+ /**
163
+ * 将 Effects 文本对齐转换为 CSS 对齐值。
164
+ * @param textAlign Effects 文本对齐
165
+ * @returns CSS 文本对齐值
166
+ */
167
+ private getTextAlign;
168
+ }
169
+ export {};
@@ -0,0 +1,89 @@
1
+ import type { VFXItem } from '@galacean/effects';
2
+ import type { Euler } from '../math';
3
+ import { Matrix4, Vector2, Vector3 } from '../math';
4
+ import { Plane } from '@galacean/effects-math/es/extension/index';
5
+ /**
6
+ * 将世界坐标转换为视图坐标。
7
+ * @param point 世界坐标
8
+ * @param item 播放器元素
9
+ * @param containerSize 视图容器大小
10
+ * @returns 视图坐标
11
+ */
12
+ export declare function projectPoint(point: Vector3, item: VFXItem, containerSize: Vector2): Vector2;
13
+ /**
14
+ * 视图坐标转 NDC 标准化坐标(范围 [-1, 1])。
15
+ * @param point 视图坐标
16
+ * @param containerSize 视图容器大小
17
+ * @returns NDC 坐标
18
+ */
19
+ export declare function viewPositionToNDC(point: Vector2, containerSize: Vector2): Vector2;
20
+ /**
21
+ * 视图大小转 NDC 视图大小。
22
+ * @param viewSize 视图大小
23
+ * @param containerSize 视图容器大小
24
+ * @returns NDC 视图大小
25
+ */
26
+ export declare function viewSizeToNDC(viewSize: Vector2, containerSize: Vector2): Vector2;
27
+ /**
28
+ * NDC 大小转视图大小。
29
+ * @param ndcSize NDC 大小
30
+ * @param containerSize 视图容器大小
31
+ * @returns 视图大小
32
+ */
33
+ export declare function ndcSizeToViewSize(ndcSize: Vector2, containerSize: Vector2): Vector2;
34
+ /**
35
+ * 视图坐标转世界坐标(经 NDC 构造射线并与交互平面求交)。
36
+ * @param viewPoint 视图坐标
37
+ * @param cameraInfo 相机信息
38
+ * @param plane 交互平面
39
+ * @param containerSize 视图容器大小
40
+ * @returns 世界坐标
41
+ */
42
+ export declare function viewPositionToWorld(viewPoint: Vector2, cameraInfo: {
43
+ position: Vector3;
44
+ matrix: Matrix4;
45
+ }, plane: Plane, containerSize: Vector2): Vector3 | undefined;
46
+ /**
47
+ * 视图尺寸对应的世界尺寸(经射线碰撞换算)。
48
+ * @param viewSize 视图尺寸
49
+ * @param containerSize 容器尺寸
50
+ * @param item 播放器元素
51
+ * @param cameraInfo 相机位置与逆视投影矩阵
52
+ * @param plane 交互平面
53
+ * @returns 世界尺寸
54
+ */
55
+ export declare function viewSizeToWorld(viewSize: Vector2, containerSize: Vector2, item: VFXItem, cameraInfo: {
56
+ position: Vector3;
57
+ matrix: Matrix4;
58
+ }, plane: Plane): Vector3;
59
+ /**
60
+ * 世界尺寸转视图尺寸。
61
+ * @param worldSize 世界尺寸
62
+ * @param containerSize 视图容器大小
63
+ * @param item 播放器元素
64
+ * @returns 视图尺寸
65
+ */
66
+ export declare function worldSizeToViewSize(worldSize: Vector2, containerSize: Vector2, item: VFXItem): Vector2;
67
+ /**
68
+ * 视图尺寸转像素尺寸。
69
+ * @param viewSize 视图尺寸
70
+ * @param viewportScale 视口缩放
71
+ * @returns 像素尺寸
72
+ */
73
+ export declare function viewSizeToPixel(viewSize: Vector2, viewportScale: number): Vector2;
74
+ /**
75
+ * 视图坐标转像素坐标。
76
+ * @param viewPosition 视图坐标(像素,左上原点)
77
+ * @param containerSize 视图容器大小
78
+ * @param viewportScale 视口缩放
79
+ * @param viewportTranslation NDC 单位的视口平移
80
+ * @returns 像素坐标
81
+ */
82
+ export declare function viewPositionToPixel(viewPosition: Vector2, containerSize: Vector2, viewportScale: number, viewportTranslation: Vector2): Vector2;
83
+ /**
84
+ * 构造交互平面。
85
+ * @param position 平面位置
86
+ * @param rotation 平面旋转
87
+ * @returns 交互平面
88
+ */
89
+ export declare function createInteractionPlane(position: Vector3, rotation: Euler): Plane;
@@ -0,0 +1,108 @@
1
+ import { InputEventMouseMotion, type InputEventKey, type InputEventMouseButton, type Engine } from '@galacean/effects';
2
+ import { Control } from '@galacean/effects-plugin-gui';
3
+ import { Vector2 } from '../math';
4
+ /** 维护画布输入状态并将绘制和交互事件转发给 Gizmo 层。 */
5
+ export declare class GizmoViewport extends Control {
6
+ /** 鼠标进入回调。 */
7
+ onMouseEnterCallback: ((location: Vector2) => void) | null;
8
+ /** 鼠标悬停移动回调。 */
9
+ onMouseMoveCallback: ((event: InputEventMouseMotion) => void) | null;
10
+ /** 鼠标拖拽回调。 */
11
+ onMouseDragCallback: ((event: InputEventMouseMotion) => void) | null;
12
+ /** 鼠标离开回调。 */
13
+ onMouseLeaveCallback: (() => void) | null;
14
+ /** 鼠标滚轮回调。 */
15
+ onMouseWheelCallback: ((event: InputEventMouseButton) => void) | null;
16
+ /** 鼠标按下回调。 */
17
+ onMouseDownCallback: ((event: InputEventMouseButton) => void) | null;
18
+ /** 鼠标抬起回调。 */
19
+ onMouseUpCallback: ((event: InputEventMouseButton) => void) | null;
20
+ /** 键盘按下回调。 */
21
+ onKeyDownCallback: ((event: InputEventKey) => void) | null;
22
+ /** 键盘抬起回调。 */
23
+ onKeyUpCallback: ((event: InputEventKey) => void) | null;
24
+ /** 每帧更新回调。 */
25
+ onUpdateCallback: (() => void) | null;
26
+ /** 绘制回调。 */
27
+ drawCallBack: (() => void) | null;
28
+ private readonly mousePosition;
29
+ private readonly globalMousePosition;
30
+ private readonly dragStart;
31
+ private mouseInside;
32
+ private mouseButtonMask;
33
+ private dragThresholdState;
34
+ private shiftPressed;
35
+ private altPressed;
36
+ private metaPressed;
37
+ private ctrlPressed;
38
+ /**
39
+ * @param engine Effects 引擎实例
40
+ */
41
+ constructor(engine: Engine);
42
+ /**
43
+ * 在每帧更新时触发 Gizmo 更新回调。
44
+ * @param _deltaTime 帧间隔
45
+ */
46
+ update(_deltaTime: number): void;
47
+ /** 触发 Gizmo 绘制回调。 */
48
+ draw(): void;
49
+ /**
50
+ * 记录鼠标进入位置并转发事件。
51
+ * @param location 鼠标本地坐标
52
+ */
53
+ onMouseEnter(location: Vector2): void;
54
+ /**
55
+ * 更新输入状态,并按按键状态分发移动或拖拽事件。
56
+ * @param event 鼠标移动事件
57
+ */
58
+ onMouseMove(event: InputEventMouseMotion): void;
59
+ /** 记录鼠标离开并转发事件。 */
60
+ onMouseLeave(): void;
61
+ /**
62
+ * 更新输入状态并转发滚轮事件。
63
+ * @param event 鼠标滚轮事件
64
+ */
65
+ onMouseWheel(event: InputEventMouseButton): void;
66
+ /**
67
+ * 开始按键会话并记录拖拽起点。
68
+ * @param event 鼠标按下事件
69
+ */
70
+ onMouseDown(event: InputEventMouseButton): void;
71
+ /**
72
+ * 结束按键会话并重置拖拽阈值。
73
+ * @param event 鼠标抬起事件
74
+ */
75
+ onMouseUp(event: InputEventMouseButton): void;
76
+ /**
77
+ * 更新修饰键状态并转发键盘按下事件。
78
+ * @param event 键盘按下事件
79
+ */
80
+ onKeyDown(event: InputEventKey): void;
81
+ /**
82
+ * 更新修饰键状态并转发键盘抬起事件。
83
+ * @param event 键盘抬起事件
84
+ */
85
+ onKeyUp(event: InputEventKey): void;
86
+ /** @returns 当前鼠标本地坐标。 */
87
+ getMousePosition(): Vector2;
88
+ /** @returns 鼠标是否位于控件内。 */
89
+ isMouseInside(): boolean;
90
+ /** @returns 当前是否有鼠标按钮按下。 */
91
+ isMouseButtonPressed(): boolean;
92
+ /** @returns 当前按键会话是否已越过拖拽阈值。 */
93
+ hasCrossedDragThreshold(): boolean;
94
+ /** @returns 使用当前输入快照创建的鼠标移动事件。 */
95
+ createMouseEventAtCurrentPosition(): InputEventMouseMotion;
96
+ /** 释放回调和输入状态。 */
97
+ onDestroy(): void;
98
+ /**
99
+ * 记录鼠标位置与修饰键状态。
100
+ * @param event 鼠标事件
101
+ */
102
+ private recordMouseInput;
103
+ /**
104
+ * 记录修饰键状态。
105
+ * @param event 带修饰键的输入事件
106
+ */
107
+ private recordModifiers;
108
+ }
@@ -0,0 +1,6 @@
1
+ export * from './coordinates';
2
+ export * from './viewport-operations';
3
+ export * from './viewport-utils';
4
+ export * from './viewport-navigation-controller';
5
+ export { getViewportTranslationRange } from './viewport-range';
6
+ export type { ViewportNavigationRange } from './types';
@@ -0,0 +1,11 @@
1
+ import type { Vector2 } from '../math';
2
+ import type { Box2 } from '@galacean/effects-math/es/extension/index';
3
+ /** 视口导航的缩放与平移边界。未提供的平移边界表示不设限。 */
4
+ export type ViewportNavigationRange = {
5
+ minScale?: number;
6
+ maxScale?: number;
7
+ minTranslation?: Vector2;
8
+ maxTranslation?: Vector2;
9
+ /** 相对视口中心、scale=1 时的内容边界;提供时按当前缩放动态计算平移范围。 */
10
+ translationBounds?: Box2;
11
+ };
@@ -0,0 +1,110 @@
1
+ import { EventEmitter, type InputEventMouseButton } from '@galacean/effects';
2
+ import { Vector2 } from '../math';
3
+ import type { ViewportNavigationRange } from './types';
4
+ import type { ViewportNavigationConfig } from '../configs/types';
5
+ import type { GizmoOwner } from '../gizmo-owner';
6
+ /** 视口平移或缩放后的相机快照。 */
7
+ export type ViewportParam = {
8
+ /** 视口缩放。 */
9
+ scale: number;
10
+ /** 视口平移。 */
11
+ translation: Vector2;
12
+ /** 本次变换中心。 */
13
+ center: Vector2;
14
+ };
15
+ /** 视口导航操作来源。 */
16
+ export type ViewportNavigationSource = 'hand-pan' | 'wheel-pan' | 'wheel-zoom' | 'pinch-zoom';
17
+ /** 带操作来源的视口变更快照。 */
18
+ export type ViewportNavigationChange = ViewportParam & {
19
+ /** 触发视口变更的操作。 */
20
+ source: ViewportNavigationSource;
21
+ };
22
+ /** 视口导航控制器事件参数。 */
23
+ export type ViewportNavigationEvents = {
24
+ /** 视口变更事件。 */
25
+ change: [ViewportNavigationChange];
26
+ };
27
+ /** 统一处理手形工具和滚轮触发的视口平移与缩放。 */
28
+ export declare class ViewportNavigationController extends EventEmitter<ViewportNavigationEvents> {
29
+ private readonly owner;
30
+ private minScale;
31
+ private maxScale;
32
+ private minTranslation;
33
+ private maxTranslation;
34
+ private translationBounds?;
35
+ /**
36
+ * @param owner Gizmo 宿主
37
+ */
38
+ constructor(owner: GizmoOwner);
39
+ /** 当前视口导航配置。 */
40
+ get config(): Readonly<ViewportNavigationConfig>;
41
+ /** 当前 Effects 引擎。 */
42
+ private get engine();
43
+ /**
44
+ * 设置允许的视口缩放范围。
45
+ * @param minScale 最小缩放
46
+ * @param maxScale 最大缩放
47
+ */
48
+ setScaleRange(minScale: number, maxScale: number): void;
49
+ /**
50
+ * 设置视口缩放和平移范围。
51
+ * @param range 视口边界;未提供的缩放边界保留当前值,未提供的平移边界表示不设限
52
+ */
53
+ setViewportRange(range: ViewportNavigationRange): void;
54
+ /** 恢复默认视口范围。 */
55
+ resetViewportRange(): void;
56
+ /** 当前视口范围快照。 */
57
+ get viewportRange(): ViewportNavigationRange;
58
+ /**
59
+ * 根据滚轮来源和修饰键执行平移或缩放。
60
+ * @param event 滚轮事件
61
+ * @param _pointerCaptured 指针是否已被捕获
62
+ * @returns 视口是否发生变化
63
+ */
64
+ handleWheel(event: InputEventMouseButton, _pointerCaptured: boolean): boolean;
65
+ /**
66
+ * 按视图像素增量平移视口。
67
+ * @param delta 视图像素位移
68
+ * @param center 操作中心
69
+ * @param source 操作来源
70
+ * @returns 视口是否发生变化
71
+ */
72
+ panByViewDelta(delta: Vector2, center: Vector2, source: 'hand-pan' | 'wheel-pan'): boolean;
73
+ /**
74
+ * 按倍率缩放视口。
75
+ * @param factor 缩放倍率
76
+ * @param center 缩放中心
77
+ * @param source 操作来源
78
+ * @returns 视口是否发生变化
79
+ */
80
+ zoomByFactor(factor: number, center: Vector2, source: 'wheel-zoom' | 'pinch-zoom'): boolean;
81
+ /** 释放事件监听器。 */
82
+ dispose(): void;
83
+ /**
84
+ * 根据显式配置和修饰键确定导航模式。
85
+ * @param event 滚轮事件
86
+ * @returns 滚轮导航模式
87
+ */
88
+ private classifyWheel;
89
+ /**
90
+ * 将方向型滚轮事件转换为视图位移。
91
+ * @param event 滚轮事件
92
+ * @returns 视图位移
93
+ */
94
+ private normalizeWheel;
95
+ /**
96
+ * 发出当前视口快照。
97
+ * @param center 操作中心
98
+ * @param source 操作来源
99
+ */
100
+ private emitChange;
101
+ /** @returns 当前画布容器尺寸。 */
102
+ private containerSize;
103
+ /** 将当前相机平移收敛到范围内。 */
104
+ private clampCurrentTranslation;
105
+ /** 将当前相机缩放和平移收敛到范围内。 */
106
+ private clampCurrentViewport;
107
+ private isTranslationRangeValid;
108
+ /** @returns 是否存在可操作的画布容器和相机。 */
109
+ private hasViewport;
110
+ }