* feat(platform-common): 添加WASM加载器和环境检测API * feat(rapier2d): 新增Rapier2D WASM绑定包 * feat(physics-rapier2d): 添加跨平台WASM加载器 * feat(asset-system): 添加运行时资产目录和bundle格式 * feat(asset-system-editor): 新增编辑器资产管理包 * feat(editor-core): 添加构建系统和模块管理 * feat(editor-app): 重构浏览器预览使用import maps * feat(platform-web): 添加BrowserRuntime和资产读取 * feat(engine): 添加材质系统和着色器管理 * feat(material): 新增材质系统和着色器编辑器 * feat(tilemap): 增强tilemap编辑器和动画系统 * feat(modules): 添加module.json配置 * feat(core): 添加module.json和类型定义更新 * chore: 更新依赖和构建配置 * refactor(plugins): 更新插件模板使用ModuleManifest * chore: 添加第三方依赖库 * chore: 移除BehaviourTree-ai和ecs-astar子模块 * docs: 更新README和文档主题样式 * fix: 修复Rust文档测试和添加rapier2d WASM绑定 * fix(tilemap-editor): 修复画布高DPI屏幕分辨率适配问题 * feat(ui): 添加UI屏幕适配系统(CanvasScaler/SafeArea) * fix(ecs-engine-bindgen): 添加缺失的ecs-framework-math依赖 * fix: 添加缺失的包依赖修复CI构建 * fix: 修复CodeQL检测到的代码问题 * fix: 修复构建错误和缺失依赖 * fix: 修复类型检查错误 * fix(material-system): 修复tsconfig配置支持TypeScript项目引用 * fix(editor-core): 修复Rollup构建配置添加tauri external * fix: 修复CodeQL检测到的代码问题 * fix: 修复CodeQL检测到的代码问题
121 lines
3.9 KiB
TypeScript
121 lines
3.9 KiB
TypeScript
import type { IScene } from '@esengine/ecs-framework';
|
|
import { ComponentRegistry } from '@esengine/ecs-framework';
|
|
import type { IRuntimeModule, IPlugin, ModuleManifest, SystemContext } from '@esengine/engine-core';
|
|
|
|
import {
|
|
UITransformComponent,
|
|
UIRenderComponent,
|
|
UIInteractableComponent,
|
|
UITextComponent,
|
|
UILayoutComponent,
|
|
UIButtonComponent,
|
|
UIProgressBarComponent,
|
|
UISliderComponent,
|
|
UIScrollViewComponent
|
|
} from './components';
|
|
import { UILayoutSystem } from './systems/UILayoutSystem';
|
|
import { UIInputSystem } from './systems/UIInputSystem';
|
|
import { UIAnimationSystem } from './systems/UIAnimationSystem';
|
|
import { UIRenderDataProvider } from './systems/UIRenderDataProvider';
|
|
import {
|
|
UIRenderBeginSystem,
|
|
UIRectRenderSystem,
|
|
UITextRenderSystem,
|
|
UIButtonRenderSystem,
|
|
UIProgressBarRenderSystem,
|
|
UISliderRenderSystem,
|
|
UIScrollViewRenderSystem
|
|
} from './systems/render';
|
|
|
|
export interface UISystemContext extends SystemContext {
|
|
uiLayoutSystem?: UILayoutSystem;
|
|
uiRenderProvider?: UIRenderDataProvider;
|
|
uiInputSystem?: UIInputSystem;
|
|
uiTextRenderSystem?: UITextRenderSystem;
|
|
}
|
|
|
|
class UIRuntimeModule implements IRuntimeModule {
|
|
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 {
|
|
const uiContext = context as UISystemContext;
|
|
|
|
const layoutSystem = new UILayoutSystem();
|
|
scene.addSystem(layoutSystem);
|
|
|
|
const animationSystem = new UIAnimationSystem();
|
|
scene.addSystem(animationSystem);
|
|
|
|
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);
|
|
|
|
if (uiContext.engineBridge) {
|
|
textRenderSystem.setTextureCallback((id: number, dataUrl: string) => {
|
|
uiContext.engineBridge.loadTexture(id, dataUrl);
|
|
});
|
|
}
|
|
|
|
const uiRenderProvider = new UIRenderDataProvider();
|
|
const inputSystem = new UIInputSystem();
|
|
inputSystem.setLayoutSystem(layoutSystem);
|
|
scene.addSystem(inputSystem);
|
|
|
|
uiContext.uiLayoutSystem = layoutSystem;
|
|
uiContext.uiRenderProvider = uiRenderProvider;
|
|
uiContext.uiInputSystem = inputSystem;
|
|
uiContext.uiTextRenderSystem = textRenderSystem;
|
|
}
|
|
}
|
|
|
|
const manifest: ModuleManifest = {
|
|
id: 'ui',
|
|
name: '@esengine/ui',
|
|
displayName: 'UI System',
|
|
version: '1.0.0',
|
|
description: 'ECS-based UI system',
|
|
category: 'Rendering',
|
|
icon: 'Layout',
|
|
isCore: false,
|
|
defaultEnabled: false,
|
|
isEngineModule: true,
|
|
canContainContent: true,
|
|
dependencies: ['core', 'math'],
|
|
exports: { components: ['UICanvasComponent'] },
|
|
editorPackage: '@esengine/ui-editor'
|
|
};
|
|
|
|
export const UIPlugin: IPlugin = {
|
|
manifest,
|
|
runtimeModule: new UIRuntimeModule()
|
|
};
|
|
|
|
export { UIRuntimeModule };
|