Files
esengine/packages/ui/src/editor/gizmos/UITransformGizmo.ts

56 lines
2.0 KiB
TypeScript
Raw Normal View History

import type { Entity } from '@esengine/ecs-framework';
import type { IGizmoRenderData, IRectGizmoData, GizmoColor } from '@esengine/editor-core';
import { GizmoRegistry } from '@esengine/editor-core';
import { UITransformComponent } from '../../components';
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 [];
}
// 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) 匹配,表示参考点在左下角
const gizmo: IRectGizmoData = {
type: 'rect',
x,
y,
width,
height,
rotation: transform.rotation,
originX: 0,
originY: 0,
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);
}