Files
esengine/packages/ui/src/editor/gizmos/UITransformGizmo.ts
YHH 107439d70c Feature/runtime cdn and plugin loader (#240)
* feat(ui): 完善 UI 布局系统和编辑器可视化工具

* refactor: 移除 ModuleRegistry,统一使用 PluginManager 插件系统

* fix: 修复 CodeQL 警告并提升测试覆盖率

* refactor: 分离运行时入口点,解决 runtime bundle 包含 React 的问题

* fix(ci): 添加 editor-core 和 editor-runtime 到 CI 依赖构建步骤

* docs: 完善 ServiceContainer 文档,新增 Symbol.for 模式和 @InjectProperty 说明

* fix(ci): 修复 type-check 失败问题

* fix(ci): 修复类型检查失败问题

* fix(ci): 修复类型检查失败问题

* fix(ci): behavior-tree 构建添加 @tauri-apps 外部依赖

* fix(ci): behavior-tree 添加 @tauri-apps/plugin-fs 类型依赖

* fix(ci): platform-web 添加缺失的 behavior-tree 依赖

* fix(lint): 移除正则表达式中不必要的转义字符
2025-11-27 20:42:46 +08:00

56 lines
2.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}