47 lines
1.4 KiB
TypeScript
47 lines
1.4 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 '@esengine/ui';
|
||
|
|
|
||
|
|
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 [];
|
||
|
|
}
|
||
|
|
|
||
|
|
const width = transform.width * transform.scaleX;
|
||
|
|
const height = transform.height * transform.scaleY;
|
||
|
|
|
||
|
|
const centerX = transform.x + width * transform.pivotX;
|
||
|
|
const centerY = transform.y + height * transform.pivotY;
|
||
|
|
|
||
|
|
const gizmo: IRectGizmoData = {
|
||
|
|
type: 'rect',
|
||
|
|
x: centerX,
|
||
|
|
y: centerY,
|
||
|
|
width,
|
||
|
|
height,
|
||
|
|
rotation: transform.rotation,
|
||
|
|
originX: transform.pivotX,
|
||
|
|
originY: transform.pivotY,
|
||
|
|
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);
|
||
|
|
}
|