2025-11-27 20:42:46 +08:00
|
|
|
import type { IScene } from '@esengine/ecs-framework';
|
|
|
|
|
import { ComponentRegistry } from '@esengine/ecs-framework';
|
2025-12-03 22:15:22 +08:00
|
|
|
import type { IRuntimeModule, IPlugin, ModuleManifest, SystemContext } from '@esengine/engine-core';
|
2025-11-27 20:42:46 +08:00
|
|
|
|
|
|
|
|
import {
|
|
|
|
|
UITransformComponent,
|
|
|
|
|
UIRenderComponent,
|
|
|
|
|
UIInteractableComponent,
|
|
|
|
|
UITextComponent,
|
|
|
|
|
UILayoutComponent,
|
|
|
|
|
UIButtonComponent,
|
|
|
|
|
UIProgressBarComponent,
|
|
|
|
|
UISliderComponent,
|
|
|
|
|
UIScrollViewComponent
|
|
|
|
|
} from './components';
|
|
|
|
|
import { UILayoutSystem } from './systems/UILayoutSystem';
|
|
|
|
|
import { UIInputSystem } from './systems/UIInputSystem';
|
2025-11-27 22:31:05 +08:00
|
|
|
import { UIAnimationSystem } from './systems/UIAnimationSystem';
|
2025-11-27 20:42:46 +08:00
|
|
|
import { UIRenderDataProvider } from './systems/UIRenderDataProvider';
|
|
|
|
|
import {
|
|
|
|
|
UIRenderBeginSystem,
|
|
|
|
|
UIRectRenderSystem,
|
|
|
|
|
UITextRenderSystem,
|
|
|
|
|
UIButtonRenderSystem,
|
|
|
|
|
UIProgressBarRenderSystem,
|
|
|
|
|
UISliderRenderSystem,
|
|
|
|
|
UIScrollViewRenderSystem
|
|
|
|
|
} from './systems/render';
|
|
|
|
|
|
2025-12-01 22:28:51 +08:00
|
|
|
export interface UISystemContext extends SystemContext {
|
|
|
|
|
uiLayoutSystem?: UILayoutSystem;
|
|
|
|
|
uiRenderProvider?: UIRenderDataProvider;
|
|
|
|
|
uiInputSystem?: UIInputSystem;
|
|
|
|
|
uiTextRenderSystem?: UITextRenderSystem;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class UIRuntimeModule implements IRuntimeModule {
|
2025-11-27 20:42:46 +08:00
|
|
|
registerComponents(registry: typeof ComponentRegistry): void {
|
|
|
|
|
registry.register(UITransformComponent);
|
|
|
|
|
registry.register(UIRenderComponent);
|
|
|
|
|
registry.register(UIInteractableComponent);
|
|
|
|
|
registry.register(UITextComponent);
|
|
|
|
|
registry.register(UILayoutComponent);
|
|
|
|
|
registry.register(UIButtonComponent);
|
|
|
|
|
registry.register(UIProgressBarComponent);
|
|
|
|
|
registry.register(UISliderComponent);
|
|
|
|
|
registry.register(UIScrollViewComponent);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
createSystems(scene: IScene, context: SystemContext): void {
|
2025-12-01 22:28:51 +08:00
|
|
|
const uiContext = context as UISystemContext;
|
|
|
|
|
|
2025-11-27 20:42:46 +08:00
|
|
|
const layoutSystem = new UILayoutSystem();
|
|
|
|
|
scene.addSystem(layoutSystem);
|
|
|
|
|
|
2025-11-27 22:31:05 +08:00
|
|
|
const animationSystem = new UIAnimationSystem();
|
|
|
|
|
scene.addSystem(animationSystem);
|
|
|
|
|
|
2025-11-27 20:42:46 +08:00
|
|
|
const renderBeginSystem = new UIRenderBeginSystem();
|
|
|
|
|
scene.addSystem(renderBeginSystem);
|
|
|
|
|
|
|
|
|
|
const rectRenderSystem = new UIRectRenderSystem();
|
|
|
|
|
scene.addSystem(rectRenderSystem);
|
|
|
|
|
|
|
|
|
|
const progressBarRenderSystem = new UIProgressBarRenderSystem();
|
|
|
|
|
scene.addSystem(progressBarRenderSystem);
|
|
|
|
|
|
|
|
|
|
const sliderRenderSystem = new UISliderRenderSystem();
|
|
|
|
|
scene.addSystem(sliderRenderSystem);
|
|
|
|
|
|
|
|
|
|
const scrollViewRenderSystem = new UIScrollViewRenderSystem();
|
|
|
|
|
scene.addSystem(scrollViewRenderSystem);
|
|
|
|
|
|
|
|
|
|
const buttonRenderSystem = new UIButtonRenderSystem();
|
|
|
|
|
scene.addSystem(buttonRenderSystem);
|
|
|
|
|
|
|
|
|
|
const textRenderSystem = new UITextRenderSystem();
|
|
|
|
|
scene.addSystem(textRenderSystem);
|
|
|
|
|
|
2025-12-01 22:28:51 +08:00
|
|
|
if (uiContext.engineBridge) {
|
2025-11-27 20:42:46 +08:00
|
|
|
textRenderSystem.setTextureCallback((id: number, dataUrl: string) => {
|
2025-12-01 22:28:51 +08:00
|
|
|
uiContext.engineBridge.loadTexture(id, dataUrl);
|
2025-11-27 20:42:46 +08:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const uiRenderProvider = new UIRenderDataProvider();
|
|
|
|
|
const inputSystem = new UIInputSystem();
|
2025-11-27 22:31:05 +08:00
|
|
|
inputSystem.setLayoutSystem(layoutSystem);
|
2025-11-27 20:42:46 +08:00
|
|
|
scene.addSystem(inputSystem);
|
|
|
|
|
|
2025-12-01 22:28:51 +08:00
|
|
|
uiContext.uiLayoutSystem = layoutSystem;
|
|
|
|
|
uiContext.uiRenderProvider = uiRenderProvider;
|
|
|
|
|
uiContext.uiInputSystem = inputSystem;
|
|
|
|
|
uiContext.uiTextRenderSystem = textRenderSystem;
|
2025-11-27 20:42:46 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-12-01 22:28:51 +08:00
|
|
|
|
2025-12-03 22:15:22 +08:00
|
|
|
const manifest: ModuleManifest = {
|
|
|
|
|
id: 'ui',
|
|
|
|
|
name: '@esengine/ui',
|
|
|
|
|
displayName: 'UI System',
|
2025-12-01 22:28:51 +08:00
|
|
|
version: '1.0.0',
|
|
|
|
|
description: 'ECS-based UI system',
|
2025-12-03 22:15:22 +08:00
|
|
|
category: 'Rendering',
|
|
|
|
|
icon: 'Layout',
|
|
|
|
|
isCore: false,
|
|
|
|
|
defaultEnabled: false,
|
|
|
|
|
isEngineModule: true,
|
|
|
|
|
canContainContent: true,
|
|
|
|
|
dependencies: ['core', 'math'],
|
|
|
|
|
exports: { components: ['UICanvasComponent'] },
|
|
|
|
|
editorPackage: '@esengine/ui-editor'
|
2025-12-01 22:28:51 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const UIPlugin: IPlugin = {
|
2025-12-03 22:15:22 +08:00
|
|
|
manifest,
|
2025-12-01 22:28:51 +08:00
|
|
|
runtimeModule: new UIRuntimeModule()
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export { UIRuntimeModule };
|