* 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): 移除正则表达式中不必要的转义字符
56 lines
2.0 KiB
TypeScript
56 lines
2.0 KiB
TypeScript
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);
|
||
}
|