Feature/editor optimization (#251)

* refactor: 编辑器/运行时架构拆分与构建系统升级

* feat(core): 层级系统重构与UI变换矩阵修复

* refactor: 移除 ecs-components 聚合包并修复跨包组件查找问题

* fix(physics): 修复跨包组件类引用问题

* feat: 统一运行时架构与浏览器运行支持

* feat(asset): 实现浏览器运行时资产加载系统

* fix: 修复文档、CodeQL安全问题和CI类型检查错误

* fix: 修复文档、CodeQL安全问题和CI类型检查错误

* fix: 修复文档、CodeQL安全问题、CI类型检查和测试错误

* test: 补齐核心模块测试用例,修复CI构建配置

* fix: 修复测试用例中的类型错误和断言问题

* fix: 修复 turbo build:npm 任务的依赖顺序问题

* fix: 修复 CI 构建错误并优化构建性能
This commit is contained in:
YHH
2025-12-01 22:28:51 +08:00
committed by GitHub
parent 189714c727
commit b42a7b4e43
468 changed files with 18301 additions and 9075 deletions

View File

@@ -0,0 +1,47 @@
{
"name": "@esengine/camera",
"version": "1.0.0",
"description": "Camera component and systems for 2D/3D rendering",
"esengine": {
"plugin": true,
"pluginExport": "CameraPlugin",
"category": "core",
"isEnginePlugin": true
},
"main": "dist/index.js",
"module": "dist/index.js",
"types": "dist/index.d.ts",
"type": "module",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"scripts": {
"build": "tsup",
"build:watch": "tsup --watch",
"type-check": "tsc --noEmit",
"clean": "rimraf dist"
},
"devDependencies": {
"@esengine/ecs-framework": "workspace:*",
"@esengine/engine-core": "workspace:*",
"@esengine/build-config": "workspace:*",
"rimraf": "^5.0.5",
"tsup": "^8.0.0",
"typescript": "^5.3.3"
},
"keywords": [
"ecs",
"camera",
"2d",
"3d",
"rendering"
],
"author": "yhh",
"license": "MIT"
}

View File

@@ -0,0 +1,72 @@
import { Component, ECSComponent, Serializable, Serialize, Property } from '@esengine/ecs-framework';
export enum ECameraProjection {
Perspective = 'perspective',
Orthographic = 'orthographic'
}
@ECSComponent('Camera')
@Serializable({ version: 1, typeId: 'Camera' })
export class CameraComponent extends Component {
@Serialize()
@Property({
type: 'enum',
label: 'Projection',
options: [
{ label: 'Orthographic', value: ECameraProjection.Orthographic },
{ label: 'Perspective', value: ECameraProjection.Perspective }
]
})
public projection: ECameraProjection = ECameraProjection.Orthographic;
/** 透视模式下的视野角度,范围 [1, 179] 度 */
@Serialize()
@Property({ type: 'number', label: 'Field of View', min: 1, max: 179 })
public fieldOfView: number = 60;
/** 正交模式下的可见区域半高度(世界单位) */
@Serialize()
@Property({ type: 'number', label: 'Orthographic Size', min: 0.1, step: 0.1 })
public orthographicSize: number = 5;
@Serialize()
@Property({ type: 'number', label: 'Near Clip', min: 0.01, step: 0.1 })
public nearClipPlane: number = 0.1;
@Serialize()
@Property({ type: 'number', label: 'Far Clip', min: 1, step: 10 })
public farClipPlane: number = 1000;
/** 视口归一化坐标,范围 [0, 1] */
@Serialize()
@Property({ type: 'number', label: 'Viewport X', min: 0, max: 1, step: 0.01 })
public viewportX: number = 0;
@Serialize()
@Property({ type: 'number', label: 'Viewport Y', min: 0, max: 1, step: 0.01 })
public viewportY: number = 0;
@Serialize()
@Property({ type: 'number', label: 'Viewport Width', min: 0, max: 1, step: 0.01 })
public viewportWidth: number = 1;
@Serialize()
@Property({ type: 'number', label: 'Viewport Height', min: 0, max: 1, step: 0.01 })
public viewportHeight: number = 1;
/** 渲染优先级,值越大越后渲染(覆盖在上层) */
@Serialize()
@Property({ type: 'integer', label: 'Depth' })
public depth: number = 0;
@Serialize()
@Property({ type: 'color', label: 'Background Color' })
public backgroundColor: string = '#000000';
constructor() {
super();
}
}
/** @deprecated 使用 ECameraProjection 代替 */
export const CameraProjection = ECameraProjection;

View File

@@ -0,0 +1,24 @@
import type { ComponentRegistry as ComponentRegistryType } from '@esengine/ecs-framework';
import type { IRuntimeModule, IPlugin, PluginDescriptor } from '@esengine/engine-core';
import { CameraComponent } from './CameraComponent';
class CameraRuntimeModule implements IRuntimeModule {
registerComponents(registry: typeof ComponentRegistryType): void {
registry.register(CameraComponent);
}
}
const descriptor: PluginDescriptor = {
id: '@esengine/camera',
name: 'Camera',
version: '1.0.0',
description: '2D/3D 相机组件',
category: 'core',
enabledByDefault: true,
isEnginePlugin: true
};
export const CameraPlugin: IPlugin = {
descriptor,
runtimeModule: new CameraRuntimeModule()
};

View File

@@ -0,0 +1,2 @@
export { CameraComponent, ECameraProjection, CameraProjection } from './CameraComponent';
export { CameraPlugin } from './CameraPlugin';

View File

@@ -0,0 +1,12 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"composite": false,
"declaration": true,
"declarationMap": true,
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist", "**/*.test.ts"]
}

View File

@@ -0,0 +1,13 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"composite": true,
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"],
"references": [
{ "path": "../core" }
]
}

View File

@@ -0,0 +1,7 @@
import { defineConfig } from 'tsup';
import { runtimeOnlyPreset } from '../build-config/src/presets/plugin-tsup';
export default defineConfig({
...runtimeOnlyPreset(),
tsconfig: 'tsconfig.build.json'
});