2025-11-26 11:08:10 +08:00
|
|
|
|
import type { Entity } from '@esengine/ecs-framework';
|
|
|
|
|
|
import type { IGizmoRenderData, IRectGizmoData, GizmoColor } from '@esengine/editor-core';
|
|
|
|
|
|
import { GizmoRegistry } from '@esengine/editor-core';
|
2025-11-27 20:42:46 +08:00
|
|
|
|
import { UITransformComponent } from '../../components';
|
2025-11-26 11:08:10 +08:00
|
|
|
|
|
|
|
|
|
|
const UI_GIZMO_COLOR: GizmoColor = { r: 0.2, g: 0.6, b: 1, a: 0.8 };
|
|
|
|
|
|
const UI_GIZMO_COLOR_UNSELECTED: GizmoColor = { r: 0.2, g: 0.6, b: 1, a: 0.3 };
|
|
|
|
|
|
|
|
|
|
|
|
function uiTransformGizmoProvider(
|
|
|
|
|
|
transform: UITransformComponent,
|
|
|
|
|
|
_entity: Entity,
|
|
|
|
|
|
isSelected: boolean
|
|
|
|
|
|
): IGizmoRenderData[] {
|
|
|
|
|
|
if (!transform.visible) {
|
|
|
|
|
|
return [];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-27 20:42:46 +08:00
|
|
|
|
// Use world coordinates (computed by UILayoutSystem) if available
|
|
|
|
|
|
// Otherwise fallback to local coordinates
|
|
|
|
|
|
// 使用世界坐标(由 UILayoutSystem 计算),如果可用
|
|
|
|
|
|
// 否则回退到本地坐标
|
|
|
|
|
|
const x = transform.worldX ?? transform.x;
|
|
|
|
|
|
const y = transform.worldY ?? transform.y;
|
|
|
|
|
|
const width = (transform.computedWidth ?? transform.width) * transform.scaleX;
|
|
|
|
|
|
const height = (transform.computedHeight ?? transform.height) * transform.scaleY;
|
|
|
|
|
|
|
|
|
|
|
|
// Use bottom-left position with origin at (0, 0)
|
|
|
|
|
|
// x, y is bottom-left corner in UITransform coordinate system (Y-up)
|
|
|
|
|
|
// This matches Gizmo origin=(0,0) which means reference point is at bottom-left
|
|
|
|
|
|
// 使用左下角位置,原点在 (0, 0)
|
|
|
|
|
|
// UITransform 坐标系中 x, y 是左下角(Y 向上)
|
|
|
|
|
|
// 这与 Gizmo origin=(0,0) 匹配,表示参考点在左下角
|
2025-11-26 11:08:10 +08:00
|
|
|
|
const gizmo: IRectGizmoData = {
|
|
|
|
|
|
type: 'rect',
|
2025-11-27 20:42:46 +08:00
|
|
|
|
x,
|
|
|
|
|
|
y,
|
2025-11-26 11:08:10 +08:00
|
|
|
|
width,
|
|
|
|
|
|
height,
|
|
|
|
|
|
rotation: transform.rotation,
|
2025-11-27 20:42:46 +08:00
|
|
|
|
originX: 0,
|
|
|
|
|
|
originY: 0,
|
2025-11-26 11:08:10 +08:00
|
|
|
|
color: isSelected ? UI_GIZMO_COLOR : UI_GIZMO_COLOR_UNSELECTED,
|
|
|
|
|
|
showHandles: isSelected
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return [gizmo];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function registerUITransformGizmo(): void {
|
|
|
|
|
|
GizmoRegistry.register(UITransformComponent, uiTransformGizmoProvider);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function unregisterUITransformGizmo(): void {
|
|
|
|
|
|
GizmoRegistry.unregister(UITransformComponent);
|
|
|
|
|
|
}
|