Feature/tilemap editor (#237)
* feat: 添加 Tilemap 编辑器插件和组件生命周期支持 * feat(editor-core): 添加声明式插件注册 API * feat(editor-core): 改进tiledmap结构合并tileset进tiledmapeditor * feat: 添加 editor-runtime SDK 和插件系统改进 * fix(ci): 修复SceneResourceManager里变量未使用问题
This commit is contained in:
304
packages/ecs-engine-bindgen/pnpm-lock.yaml
generated
Normal file
304
packages/ecs-engine-bindgen/pnpm-lock.yaml
generated
Normal file
@@ -0,0 +1,304 @@
|
||||
lockfileVersion: '9.0'
|
||||
|
||||
settings:
|
||||
autoInstallPeers: true
|
||||
excludeLinksFromLockfile: false
|
||||
|
||||
importers:
|
||||
|
||||
.:
|
||||
dependencies:
|
||||
'@esengine/ecs-framework':
|
||||
specifier: workspace:*
|
||||
version: link:../core
|
||||
es-engine:
|
||||
specifier: workspace:*
|
||||
version: link:../engine/pkg
|
||||
devDependencies:
|
||||
rimraf:
|
||||
specifier: ^5.0.0
|
||||
version: 5.0.10
|
||||
typescript:
|
||||
specifier: ^5.8.0
|
||||
version: 5.9.3
|
||||
|
||||
packages:
|
||||
|
||||
'@isaacs/cliui@8.0.2':
|
||||
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
'@pkgjs/parseargs@0.11.0':
|
||||
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
||||
engines: {node: '>=14'}
|
||||
|
||||
ansi-regex@5.0.1:
|
||||
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
ansi-regex@6.2.2:
|
||||
resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
ansi-styles@4.3.0:
|
||||
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
ansi-styles@6.2.3:
|
||||
resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
balanced-match@1.0.2:
|
||||
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
||||
|
||||
brace-expansion@2.0.2:
|
||||
resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
|
||||
|
||||
color-convert@2.0.1:
|
||||
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
|
||||
engines: {node: '>=7.0.0'}
|
||||
|
||||
color-name@1.1.4:
|
||||
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
||||
|
||||
cross-spawn@7.0.6:
|
||||
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
eastasianwidth@0.2.0:
|
||||
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
|
||||
|
||||
emoji-regex@8.0.0:
|
||||
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
|
||||
|
||||
emoji-regex@9.2.2:
|
||||
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
|
||||
|
||||
foreground-child@3.3.1:
|
||||
resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
|
||||
engines: {node: '>=14'}
|
||||
|
||||
glob@10.5.0:
|
||||
resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==}
|
||||
hasBin: true
|
||||
|
||||
is-fullwidth-code-point@3.0.0:
|
||||
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
isexe@2.0.0:
|
||||
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
|
||||
|
||||
jackspeak@3.4.3:
|
||||
resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
|
||||
|
||||
lru-cache@10.4.3:
|
||||
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
|
||||
|
||||
minimatch@9.0.5:
|
||||
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
|
||||
engines: {node: '>=16 || 14 >=14.17'}
|
||||
|
||||
minipass@7.1.2:
|
||||
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
|
||||
engines: {node: '>=16 || 14 >=14.17'}
|
||||
|
||||
package-json-from-dist@1.0.1:
|
||||
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
|
||||
|
||||
path-key@3.1.1:
|
||||
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
path-scurry@1.11.1:
|
||||
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
|
||||
engines: {node: '>=16 || 14 >=14.18'}
|
||||
|
||||
rimraf@5.0.10:
|
||||
resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==}
|
||||
hasBin: true
|
||||
|
||||
shebang-command@2.0.0:
|
||||
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
shebang-regex@3.0.0:
|
||||
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
signal-exit@4.1.0:
|
||||
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
|
||||
engines: {node: '>=14'}
|
||||
|
||||
string-width@4.2.3:
|
||||
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
string-width@5.1.2:
|
||||
resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
strip-ansi@6.0.1:
|
||||
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
strip-ansi@7.1.2:
|
||||
resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
typescript@5.9.3:
|
||||
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
|
||||
engines: {node: '>=14.17'}
|
||||
hasBin: true
|
||||
|
||||
which@2.0.2:
|
||||
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
|
||||
engines: {node: '>= 8'}
|
||||
hasBin: true
|
||||
|
||||
wrap-ansi@7.0.0:
|
||||
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
wrap-ansi@8.1.0:
|
||||
resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
snapshots:
|
||||
|
||||
'@isaacs/cliui@8.0.2':
|
||||
dependencies:
|
||||
string-width: 5.1.2
|
||||
string-width-cjs: string-width@4.2.3
|
||||
strip-ansi: 7.1.2
|
||||
strip-ansi-cjs: strip-ansi@6.0.1
|
||||
wrap-ansi: 8.1.0
|
||||
wrap-ansi-cjs: wrap-ansi@7.0.0
|
||||
|
||||
'@pkgjs/parseargs@0.11.0':
|
||||
optional: true
|
||||
|
||||
ansi-regex@5.0.1: {}
|
||||
|
||||
ansi-regex@6.2.2: {}
|
||||
|
||||
ansi-styles@4.3.0:
|
||||
dependencies:
|
||||
color-convert: 2.0.1
|
||||
|
||||
ansi-styles@6.2.3: {}
|
||||
|
||||
balanced-match@1.0.2: {}
|
||||
|
||||
brace-expansion@2.0.2:
|
||||
dependencies:
|
||||
balanced-match: 1.0.2
|
||||
|
||||
color-convert@2.0.1:
|
||||
dependencies:
|
||||
color-name: 1.1.4
|
||||
|
||||
color-name@1.1.4: {}
|
||||
|
||||
cross-spawn@7.0.6:
|
||||
dependencies:
|
||||
path-key: 3.1.1
|
||||
shebang-command: 2.0.0
|
||||
which: 2.0.2
|
||||
|
||||
eastasianwidth@0.2.0: {}
|
||||
|
||||
emoji-regex@8.0.0: {}
|
||||
|
||||
emoji-regex@9.2.2: {}
|
||||
|
||||
foreground-child@3.3.1:
|
||||
dependencies:
|
||||
cross-spawn: 7.0.6
|
||||
signal-exit: 4.1.0
|
||||
|
||||
glob@10.5.0:
|
||||
dependencies:
|
||||
foreground-child: 3.3.1
|
||||
jackspeak: 3.4.3
|
||||
minimatch: 9.0.5
|
||||
minipass: 7.1.2
|
||||
package-json-from-dist: 1.0.1
|
||||
path-scurry: 1.11.1
|
||||
|
||||
is-fullwidth-code-point@3.0.0: {}
|
||||
|
||||
isexe@2.0.0: {}
|
||||
|
||||
jackspeak@3.4.3:
|
||||
dependencies:
|
||||
'@isaacs/cliui': 8.0.2
|
||||
optionalDependencies:
|
||||
'@pkgjs/parseargs': 0.11.0
|
||||
|
||||
lru-cache@10.4.3: {}
|
||||
|
||||
minimatch@9.0.5:
|
||||
dependencies:
|
||||
brace-expansion: 2.0.2
|
||||
|
||||
minipass@7.1.2: {}
|
||||
|
||||
package-json-from-dist@1.0.1: {}
|
||||
|
||||
path-key@3.1.1: {}
|
||||
|
||||
path-scurry@1.11.1:
|
||||
dependencies:
|
||||
lru-cache: 10.4.3
|
||||
minipass: 7.1.2
|
||||
|
||||
rimraf@5.0.10:
|
||||
dependencies:
|
||||
glob: 10.5.0
|
||||
|
||||
shebang-command@2.0.0:
|
||||
dependencies:
|
||||
shebang-regex: 3.0.0
|
||||
|
||||
shebang-regex@3.0.0: {}
|
||||
|
||||
signal-exit@4.1.0: {}
|
||||
|
||||
string-width@4.2.3:
|
||||
dependencies:
|
||||
emoji-regex: 8.0.0
|
||||
is-fullwidth-code-point: 3.0.0
|
||||
strip-ansi: 6.0.1
|
||||
|
||||
string-width@5.1.2:
|
||||
dependencies:
|
||||
eastasianwidth: 0.2.0
|
||||
emoji-regex: 9.2.2
|
||||
strip-ansi: 7.1.2
|
||||
|
||||
strip-ansi@6.0.1:
|
||||
dependencies:
|
||||
ansi-regex: 5.0.1
|
||||
|
||||
strip-ansi@7.1.2:
|
||||
dependencies:
|
||||
ansi-regex: 6.2.2
|
||||
|
||||
typescript@5.9.3: {}
|
||||
|
||||
which@2.0.2:
|
||||
dependencies:
|
||||
isexe: 2.0.0
|
||||
|
||||
wrap-ansi@7.0.0:
|
||||
dependencies:
|
||||
ansi-styles: 4.3.0
|
||||
string-width: 4.2.3
|
||||
strip-ansi: 6.0.1
|
||||
|
||||
wrap-ansi@8.1.0:
|
||||
dependencies:
|
||||
ansi-styles: 6.2.3
|
||||
string-width: 5.1.2
|
||||
strip-ansi: 7.1.2
|
||||
@@ -8,6 +8,6 @@
|
||||
export { EngineBridge, EngineBridgeConfig } from './core/EngineBridge';
|
||||
export { RenderBatcher } from './core/RenderBatcher';
|
||||
export { SpriteRenderHelper, ITransformComponent } from './core/SpriteRenderHelper';
|
||||
export { EngineRenderSystem, type TransformComponentType } from './systems/EngineRenderSystem';
|
||||
export { EngineRenderSystem, type TransformComponentType, type IRenderDataProvider, type GizmoDataProviderFn, type HasGizmoProviderFn } from './systems/EngineRenderSystem';
|
||||
export { CameraSystem } from './systems/CameraSystem';
|
||||
export * from './types';
|
||||
|
||||
@@ -10,6 +10,87 @@ import { RenderBatcher } from '../core/RenderBatcher';
|
||||
import type { SpriteRenderData } from '../types';
|
||||
import type { ITransformComponent } from '../core/SpriteRenderHelper';
|
||||
|
||||
/**
|
||||
* Render data from a provider
|
||||
* 提供者的渲染数据
|
||||
*/
|
||||
export interface ProviderRenderData {
|
||||
transforms: Float32Array;
|
||||
textureIds: Uint32Array;
|
||||
uvs: Float32Array;
|
||||
colors: Uint32Array;
|
||||
tileCount: number;
|
||||
/** Sorting order for render ordering | 渲染排序顺序 */
|
||||
sortingOrder: number;
|
||||
/** Texture path for loading (optional, used if textureId is 0) */
|
||||
texturePath?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Interface for additional render data providers (e.g., tilemap)
|
||||
* 额外渲染数据提供者接口(如瓦片地图)
|
||||
*/
|
||||
export interface IRenderDataProvider {
|
||||
getRenderData(): readonly ProviderRenderData[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal gizmo color interface (duck-typed, compatible with editor-core GizmoColor)
|
||||
* 内部 gizmo 颜色接口(鸭子类型,与 editor-core GizmoColor 兼容)
|
||||
* @internal
|
||||
*/
|
||||
interface GizmoColorInternal {
|
||||
r: number;
|
||||
g: number;
|
||||
b: number;
|
||||
a: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal gizmo render data type (duck-typed, compatible with editor-core types)
|
||||
* 内部 gizmo 渲染数据类型(鸭子类型,与 editor-core 类型兼容)
|
||||
* @internal
|
||||
*/
|
||||
interface GizmoRenderDataInternal {
|
||||
type: 'rect' | 'circle' | 'line' | 'grid';
|
||||
color: GizmoColorInternal;
|
||||
// Rect specific
|
||||
x?: number;
|
||||
y?: number;
|
||||
width?: number;
|
||||
height?: number;
|
||||
rotation?: number;
|
||||
originX?: number;
|
||||
originY?: number;
|
||||
showHandles?: boolean;
|
||||
// Circle specific
|
||||
radius?: number;
|
||||
// Line specific
|
||||
points?: Array<{ x: number; y: number }>;
|
||||
closed?: boolean;
|
||||
// Grid specific
|
||||
cols?: number;
|
||||
rows?: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function type for getting gizmo data from a component.
|
||||
* Used to inject GizmoRegistry functionality from editor layer.
|
||||
* 从组件获取 gizmo 数据的函数类型。
|
||||
* 用于从编辑器层注入 GizmoRegistry 功能。
|
||||
*/
|
||||
export type GizmoDataProviderFn = (
|
||||
component: Component,
|
||||
entity: Entity,
|
||||
isSelected: boolean
|
||||
) => GizmoRenderDataInternal[];
|
||||
|
||||
/**
|
||||
* Function type for checking if a component has gizmo provider.
|
||||
* 检查组件是否有 gizmo 提供者的函数类型。
|
||||
*/
|
||||
export type HasGizmoProviderFn = (component: Component) => boolean;
|
||||
|
||||
/**
|
||||
* Type for transform component constructor.
|
||||
* 变换组件构造函数类型。
|
||||
@@ -55,6 +136,15 @@ export class EngineRenderSystem extends EntitySystem {
|
||||
// 可重用的映射以避免每帧分配
|
||||
private entityRenderMap: Map<number, SpriteRenderData> = new Map();
|
||||
|
||||
// Additional render data providers (e.g., tilemap)
|
||||
// 额外的渲染数据提供者(如瓦片地图)
|
||||
private renderDataProviders: IRenderDataProvider[] = [];
|
||||
|
||||
// Gizmo registry functions (injected from editor layer)
|
||||
// Gizmo 注册表函数(从编辑器层注入)
|
||||
private gizmoDataProvider: GizmoDataProviderFn | null = null;
|
||||
private hasGizmoProvider: HasGizmoProviderFn | null = null;
|
||||
|
||||
/**
|
||||
* Create a new engine render system.
|
||||
* 创建新的引擎渲染系统。
|
||||
@@ -86,7 +176,6 @@ export class EngineRenderSystem extends EntitySystem {
|
||||
* 处理实体之前调用。
|
||||
*/
|
||||
protected override onBegin(): void {
|
||||
|
||||
// Clear the batch | 清空批处理
|
||||
this.batcher.clear();
|
||||
|
||||
@@ -108,6 +197,12 @@ export class EngineRenderSystem extends EntitySystem {
|
||||
// 清空并重用映射用于绘制gizmo
|
||||
this.entityRenderMap.clear();
|
||||
|
||||
// Collect all render items with sorting order
|
||||
// 收集所有渲染项及其排序顺序
|
||||
const renderItems: Array<{ sortingOrder: number; sprites: SpriteRenderData[] }> = [];
|
||||
|
||||
// Collect sprites from entities
|
||||
// 收集实体的 sprites
|
||||
for (const entity of entities) {
|
||||
const sprite = entity.getComponent(SpriteComponent);
|
||||
const transform = entity.getComponent(this.transformType) as unknown as ITransformComponent | null;
|
||||
@@ -159,35 +254,76 @@ export class EngineRenderSystem extends EntitySystem {
|
||||
color
|
||||
};
|
||||
|
||||
this.batcher.addSprite(renderData);
|
||||
renderItems.push({ sortingOrder: sprite.sortingOrder, sprites: [renderData] });
|
||||
this.entityRenderMap.set(entity.id, renderData);
|
||||
}
|
||||
|
||||
// Submit batch and render at the end of process | 在process结束时提交批处理并渲染
|
||||
// Collect render data from providers (e.g., tilemap)
|
||||
// 收集来自提供者的渲染数据(如瓦片地图)
|
||||
for (const provider of this.renderDataProviders) {
|
||||
const renderDataList = provider.getRenderData();
|
||||
for (const data of renderDataList) {
|
||||
// Get texture ID - load from path if needed
|
||||
let textureId = data.textureIds[0] || 0;
|
||||
if (textureId === 0 && data.texturePath) {
|
||||
textureId = this.bridge.getOrLoadTextureByPath(data.texturePath);
|
||||
}
|
||||
|
||||
// Convert tilemap render data to sprites
|
||||
const tilemapSprites: SpriteRenderData[] = [];
|
||||
for (let i = 0; i < data.tileCount; i++) {
|
||||
const tOffset = i * 7;
|
||||
const uvOffset = i * 4;
|
||||
|
||||
const renderData: SpriteRenderData = {
|
||||
x: data.transforms[tOffset],
|
||||
y: data.transforms[tOffset + 1],
|
||||
rotation: data.transforms[tOffset + 2],
|
||||
scaleX: data.transforms[tOffset + 3],
|
||||
scaleY: data.transforms[tOffset + 4],
|
||||
originX: data.transforms[tOffset + 5],
|
||||
originY: data.transforms[tOffset + 6],
|
||||
textureId,
|
||||
uv: [data.uvs[uvOffset], data.uvs[uvOffset + 1], data.uvs[uvOffset + 2], data.uvs[uvOffset + 3]],
|
||||
color: data.colors[i]
|
||||
};
|
||||
|
||||
tilemapSprites.push(renderData);
|
||||
}
|
||||
|
||||
if (tilemapSprites.length > 0) {
|
||||
renderItems.push({ sortingOrder: data.sortingOrder, sprites: tilemapSprites });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sort by sortingOrder (lower values render first, appear behind)
|
||||
// 按 sortingOrder 排序(值越小越先渲染,显示在后面)
|
||||
renderItems.sort((a, b) => a.sortingOrder - b.sortingOrder);
|
||||
|
||||
// Submit all sprites in sorted order
|
||||
// 按排序顺序提交所有 sprites
|
||||
for (const item of renderItems) {
|
||||
for (const sprite of item.sprites) {
|
||||
this.batcher.addSprite(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
if (!this.batcher.isEmpty) {
|
||||
const sprites = this.batcher.getSprites();
|
||||
this.bridge.submitSprites(sprites);
|
||||
}
|
||||
|
||||
// Draw gizmos for all entities with IGizmoProvider components
|
||||
// 为所有具有 IGizmoProvider 组件的实体绘制 Gizmo
|
||||
if (this.showGizmos) {
|
||||
this.drawComponentGizmos();
|
||||
}
|
||||
|
||||
// Draw gizmos for selected entities (always, even if no sprites)
|
||||
// 为选中的实体绘制Gizmo(始终绘制,即使没有精灵)
|
||||
if (this.showGizmos && this.selectedEntityIds.size > 0) {
|
||||
for (const entityId of this.selectedEntityIds) {
|
||||
const renderData = this.entityRenderMap.get(entityId);
|
||||
if (renderData) {
|
||||
this.bridge.addGizmoRect(
|
||||
renderData.x,
|
||||
renderData.y,
|
||||
renderData.scaleX,
|
||||
renderData.scaleY,
|
||||
renderData.rotation,
|
||||
renderData.originX,
|
||||
renderData.originY,
|
||||
0.0, 1.0, 0.5, 1.0, // Green color | 绿色
|
||||
true // Show transform handles for selection gizmo
|
||||
);
|
||||
}
|
||||
}
|
||||
this.drawSelectedEntityGizmos();
|
||||
}
|
||||
|
||||
// Draw camera frustum gizmos
|
||||
@@ -199,6 +335,296 @@ export class EngineRenderSystem extends EntitySystem {
|
||||
this.bridge.render();
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw gizmos from components that have registered gizmo providers.
|
||||
* 绘制已注册 gizmo 提供者的组件的 gizmo。
|
||||
*/
|
||||
private drawComponentGizmos(): void {
|
||||
const scene = Core.scene;
|
||||
if (!scene || !this.gizmoDataProvider || !this.hasGizmoProvider) return;
|
||||
|
||||
// Iterate all entities in the scene
|
||||
// 遍历场景中的所有实体
|
||||
for (const entity of scene.entities.buffer) {
|
||||
const isSelected = this.selectedEntityIds.has(entity.id);
|
||||
|
||||
// Check each component for gizmo provider
|
||||
// 检查每个组件是否有 gizmo 提供者
|
||||
for (const component of entity.components) {
|
||||
if (this.hasGizmoProvider(component)) {
|
||||
try {
|
||||
const gizmoDataArray = this.gizmoDataProvider(component, entity, isSelected);
|
||||
for (const gizmoData of gizmoDataArray) {
|
||||
this.renderGizmoData(gizmoData);
|
||||
}
|
||||
} catch (e) {
|
||||
// Silently ignore errors from gizmo providers
|
||||
// 静默忽略 gizmo 提供者的错误
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Render a single gizmo data item.
|
||||
* 渲染单个 gizmo 数据项。
|
||||
*/
|
||||
private renderGizmoData(data: GizmoRenderDataInternal): void {
|
||||
const { r, g, b, a } = data.color;
|
||||
|
||||
switch (data.type) {
|
||||
case 'rect':
|
||||
if (data.x !== undefined && data.y !== undefined &&
|
||||
data.width !== undefined && data.height !== undefined) {
|
||||
this.bridge.addGizmoRect(
|
||||
data.x,
|
||||
data.y,
|
||||
data.width,
|
||||
data.height,
|
||||
data.rotation ?? 0,
|
||||
data.originX ?? 0.5,
|
||||
data.originY ?? 0.5,
|
||||
r, g, b, a,
|
||||
data.showHandles ?? false
|
||||
);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'grid':
|
||||
// Render grid as multiple line segments
|
||||
// 将网格渲染为多条线段
|
||||
if (data.x !== undefined && data.y !== undefined &&
|
||||
data.width !== undefined && data.height !== undefined &&
|
||||
data.cols !== undefined && data.rows !== undefined) {
|
||||
this.renderGridGizmo(data.x, data.y, data.width, data.height, data.cols, data.rows, r, g, b, a);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'line':
|
||||
// Lines are rendered as connected rect segments (thin)
|
||||
// 线条渲染为连接的细矩形段
|
||||
if (data.points && data.points.length >= 2) {
|
||||
this.renderLineGizmo(data.points, data.closed ?? false, r, g, b, a);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'circle':
|
||||
// Circle rendered as polygon approximation
|
||||
// 圆形渲染为多边形近似
|
||||
if (data.x !== undefined && data.y !== undefined && data.radius !== undefined) {
|
||||
this.renderCircleGizmo(data.x, data.y, data.radius, r, g, b, a);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Render a grid gizmo using line segments.
|
||||
* 使用线段渲染网格 gizmo。
|
||||
*/
|
||||
private renderGridGizmo(
|
||||
x: number, y: number, width: number, height: number,
|
||||
cols: number, rows: number,
|
||||
r: number, g: number, b: number, a: number
|
||||
): void {
|
||||
const cellWidth = width / cols;
|
||||
const cellHeight = height / rows;
|
||||
const lineThickness = 1;
|
||||
|
||||
// Vertical lines | 垂直线
|
||||
for (let col = 0; col <= cols; col++) {
|
||||
const lineX = x + col * cellWidth;
|
||||
this.bridge.addGizmoRect(
|
||||
lineX, y + height / 2,
|
||||
lineThickness, height,
|
||||
0, 0.5, 0.5,
|
||||
r, g, b, a,
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
// Horizontal lines | 水平线
|
||||
for (let row = 0; row <= rows; row++) {
|
||||
const lineY = y + row * cellHeight;
|
||||
this.bridge.addGizmoRect(
|
||||
x + width / 2, lineY,
|
||||
width, lineThickness,
|
||||
0, 0.5, 0.5,
|
||||
r, g, b, a,
|
||||
false
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Render a line gizmo.
|
||||
* 渲染线条 gizmo。
|
||||
*/
|
||||
private renderLineGizmo(
|
||||
points: Array<{ x: number; y: number }>,
|
||||
closed: boolean,
|
||||
r: number, g: number, b: number, a: number
|
||||
): void {
|
||||
const lineThickness = 2;
|
||||
const count = closed ? points.length : points.length - 1;
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
const p1 = points[i];
|
||||
const p2 = points[(i + 1) % points.length];
|
||||
|
||||
const dx = p2.x - p1.x;
|
||||
const dy = p2.y - p1.y;
|
||||
const length = Math.sqrt(dx * dx + dy * dy);
|
||||
const angle = Math.atan2(dy, dx);
|
||||
|
||||
// Draw line segment as thin rect
|
||||
// 将线段绘制为细矩形
|
||||
this.bridge.addGizmoRect(
|
||||
(p1.x + p2.x) / 2,
|
||||
(p1.y + p2.y) / 2,
|
||||
length, lineThickness,
|
||||
angle, 0.5, 0.5,
|
||||
r, g, b, a,
|
||||
false
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Render a circle gizmo as polygon.
|
||||
* 将圆形 gizmo 渲染为多边形。
|
||||
*/
|
||||
private renderCircleGizmo(
|
||||
x: number, y: number, radius: number,
|
||||
r: number, g: number, b: number, a: number
|
||||
): void {
|
||||
const segments = 32;
|
||||
const points: Array<{ x: number; y: number }> = [];
|
||||
|
||||
for (let i = 0; i < segments; i++) {
|
||||
const angle = (i / segments) * Math.PI * 2;
|
||||
points.push({
|
||||
x: x + Math.cos(angle) * radius,
|
||||
y: y + Math.sin(angle) * radius
|
||||
});
|
||||
}
|
||||
|
||||
this.renderLineGizmo(points, true, r, g, b, a);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw gizmos for selected entities with transform handles.
|
||||
* 为选中的实体绘制带有变换手柄的 gizmo。
|
||||
*
|
||||
* This method ensures that selected entities show transform handles
|
||||
* regardless of whether they have sprite data in entityRenderMap.
|
||||
* 此方法确保选中的实体显示变换手柄,无论它们是否在 entityRenderMap 中有精灵数据。
|
||||
*/
|
||||
private drawSelectedEntityGizmos(): void {
|
||||
const scene = Core.scene;
|
||||
if (!scene) return;
|
||||
|
||||
// Determine if we should show handles based on transform mode
|
||||
// 根据变换模式确定是否显示手柄
|
||||
const shouldShowHandles = this.transformMode !== 'select';
|
||||
|
||||
for (const entityId of this.selectedEntityIds) {
|
||||
// Find the entity
|
||||
// 查找实体
|
||||
const entity = scene.entities.findEntityById(entityId);
|
||||
if (!entity) continue;
|
||||
|
||||
// Get transform component
|
||||
// 获取变换组件
|
||||
const transform = entity.getComponent(TransformComponent);
|
||||
if (!transform) continue;
|
||||
|
||||
// First check if we have sprite data from entityRenderMap
|
||||
// 首先检查是否有来自 entityRenderMap 的精灵数据
|
||||
const spriteData = this.entityRenderMap.get(entityId);
|
||||
if (spriteData) {
|
||||
// Use sprite data for selection gizmo
|
||||
// 使用精灵数据绘制选择 gizmo
|
||||
this.bridge.addGizmoRect(
|
||||
spriteData.x,
|
||||
spriteData.y,
|
||||
spriteData.scaleX,
|
||||
spriteData.scaleY,
|
||||
spriteData.rotation,
|
||||
spriteData.originX,
|
||||
spriteData.originY,
|
||||
0.0, 0.8, 1.0, 1.0, // Selection color (cyan)
|
||||
shouldShowHandles
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
// For entities without sprite data, try to get gizmo data from components via registry
|
||||
// 对于没有精灵数据的实体,尝试通过注册表从组件获取 gizmo 数据
|
||||
let foundGizmo = false;
|
||||
if (this.gizmoDataProvider && this.hasGizmoProvider) {
|
||||
for (const component of entity.components) {
|
||||
if (this.hasGizmoProvider(component)) {
|
||||
try {
|
||||
const gizmoDataArray = this.gizmoDataProvider(component, entity, true);
|
||||
// Use the first rect gizmo for selection handles
|
||||
// 使用第一个矩形 gizmo 来绘制选择手柄
|
||||
for (const gizmoData of gizmoDataArray) {
|
||||
if (gizmoData.type === 'rect' &&
|
||||
gizmoData.x !== undefined && gizmoData.y !== undefined &&
|
||||
gizmoData.width !== undefined && gizmoData.height !== undefined) {
|
||||
|
||||
// Draw selection gizmo with handles
|
||||
// 绘制带手柄的选择 gizmo
|
||||
this.bridge.addGizmoRect(
|
||||
gizmoData.x,
|
||||
gizmoData.y,
|
||||
gizmoData.width,
|
||||
gizmoData.height,
|
||||
gizmoData.rotation ?? 0,
|
||||
gizmoData.originX ?? 0.5,
|
||||
gizmoData.originY ?? 0.5,
|
||||
0.0, 0.8, 1.0, 1.0, // Selection color (cyan)
|
||||
shouldShowHandles
|
||||
);
|
||||
foundGizmo = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (foundGizmo) break;
|
||||
} catch (e) {
|
||||
// Silently ignore errors
|
||||
// 静默忽略错误
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If no gizmo provider found, draw a default gizmo at transform position
|
||||
// 如果没有找到 gizmo 提供者,在变换位置绘制默认 gizmo
|
||||
if (!foundGizmo) {
|
||||
const rotation = typeof transform.rotation === 'number'
|
||||
? transform.rotation
|
||||
: transform.rotation.z;
|
||||
|
||||
// Draw a small default gizmo at entity position
|
||||
// 在实体位置绘制一个小的默认 gizmo
|
||||
this.bridge.addGizmoRect(
|
||||
transform.position.x,
|
||||
transform.position.y,
|
||||
32, // Default size
|
||||
32,
|
||||
rotation,
|
||||
0.5,
|
||||
0.5,
|
||||
0.0, 0.8, 1.0, 1.0, // Selection color (cyan)
|
||||
shouldShowHandles
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw camera frustum gizmos for all cameras in scene.
|
||||
* 为场景中所有相机绘制视锥体 gizmo。
|
||||
@@ -249,6 +675,26 @@ export class EngineRenderSystem extends EntitySystem {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set gizmo registry functions.
|
||||
* 设置 gizmo 注册表函数。
|
||||
*
|
||||
* This allows the editor layer to inject GizmoRegistry functionality
|
||||
* without creating a direct dependency from engine to editor.
|
||||
* 这允许编辑器层注入 GizmoRegistry 功能,
|
||||
* 而不会创建从引擎到编辑器的直接依赖。
|
||||
*
|
||||
* @param provider - Function to get gizmo data from a component
|
||||
* @param hasProvider - Function to check if a component has a gizmo provider
|
||||
*/
|
||||
setGizmoRegistry(
|
||||
provider: GizmoDataProviderFn,
|
||||
hasProvider: HasGizmoProviderFn
|
||||
): void {
|
||||
this.gizmoDataProvider = provider;
|
||||
this.hasGizmoProvider = hasProvider;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set gizmo visibility.
|
||||
* 设置Gizmo可见性。
|
||||
@@ -331,6 +777,27 @@ export class EngineRenderSystem extends EntitySystem {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Register a render data provider.
|
||||
* 注册渲染数据提供者。
|
||||
*/
|
||||
addRenderDataProvider(provider: IRenderDataProvider): void {
|
||||
if (!this.renderDataProviders.includes(provider)) {
|
||||
this.renderDataProviders.push(provider);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a render data provider.
|
||||
* 移除渲染数据提供者。
|
||||
*/
|
||||
removeRenderDataProvider(provider: IRenderDataProvider): void {
|
||||
const index = this.renderDataProviders.indexOf(provider);
|
||||
if (index >= 0) {
|
||||
this.renderDataProviders.splice(index, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the number of sprites rendered.
|
||||
* 获取渲染的精灵数量。
|
||||
|
||||
310
packages/ecs-engine-bindgen/src/wasm/es_engine.d.ts
vendored
Normal file
310
packages/ecs-engine-bindgen/src/wasm/es_engine.d.ts
vendored
Normal file
@@ -0,0 +1,310 @@
|
||||
/* tslint:disable */
|
||||
/* eslint-disable */
|
||||
/**
|
||||
* Initialize panic hook for better error messages in console.
|
||||
* 初始化panic hook以在控制台显示更好的错误信息。
|
||||
*/
|
||||
export function init(): void;
|
||||
/**
|
||||
* Game engine main interface exposed to JavaScript.
|
||||
* 暴露给JavaScript的游戏引擎主接口。
|
||||
*
|
||||
* This is the primary entry point for the engine from TypeScript/JavaScript.
|
||||
* 这是从TypeScript/JavaScript访问引擎的主要入口点。
|
||||
*/
|
||||
export class GameEngine {
|
||||
free(): void;
|
||||
[Symbol.dispose](): void;
|
||||
/**
|
||||
* Get camera state.
|
||||
* 获取相机状态。
|
||||
*
|
||||
* # Returns | 返回
|
||||
* Array of [x, y, zoom, rotation] | 数组 [x, y, zoom, rotation]
|
||||
*/
|
||||
getCamera(): Float32Array;
|
||||
/**
|
||||
* Set camera position, zoom, and rotation.
|
||||
* 设置相机位置、缩放和旋转。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `x` - Camera X position | 相机X位置
|
||||
* * `y` - Camera Y position | 相机Y位置
|
||||
* * `zoom` - Zoom level | 缩放级别
|
||||
* * `rotation` - Rotation in radians | 旋转角度(弧度)
|
||||
*/
|
||||
setCamera(x: number, y: number, zoom: number, rotation: number): void;
|
||||
/**
|
||||
* Check if a key is currently pressed.
|
||||
* 检查某个键是否当前被按下。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `key_code` - The key code to check | 要检查的键码
|
||||
*/
|
||||
isKeyDown(key_code: string): boolean;
|
||||
/**
|
||||
* Load a texture from URL.
|
||||
* 从URL加载纹理。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `id` - Unique texture identifier | 唯一纹理标识符
|
||||
* * `url` - Image URL to load | 要加载的图片URL
|
||||
*/
|
||||
loadTexture(id: number, url: string): void;
|
||||
/**
|
||||
* Update input state. Should be called once per frame.
|
||||
* 更新输入状态。应该每帧调用一次。
|
||||
*/
|
||||
updateInput(): void;
|
||||
/**
|
||||
* Create a new game engine from external WebGL context.
|
||||
* 从外部 WebGL 上下文创建引擎。
|
||||
*
|
||||
* This is designed for WeChat MiniGame and similar environments.
|
||||
* 适用于微信小游戏等环境。
|
||||
*/
|
||||
static fromExternal(gl_context: any, width: number, height: number): GameEngine;
|
||||
/**
|
||||
* Set grid visibility.
|
||||
* 设置网格可见性。
|
||||
*/
|
||||
setShowGrid(show: boolean): void;
|
||||
/**
|
||||
* Add a rectangle gizmo outline.
|
||||
* 添加矩形Gizmo边框。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `x` - Center X position | 中心X位置
|
||||
* * `y` - Center Y position | 中心Y位置
|
||||
* * `width` - Rectangle width | 矩形宽度
|
||||
* * `height` - Rectangle height | 矩形高度
|
||||
* * `rotation` - Rotation in radians | 旋转角度(弧度)
|
||||
* * `origin_x` - Origin X (0-1) | 原点X (0-1)
|
||||
* * `origin_y` - Origin Y (0-1) | 原点Y (0-1)
|
||||
* * `r`, `g`, `b`, `a` - Color (0.0-1.0) | 颜色
|
||||
* * `show_handles` - Whether to show transform handles | 是否显示变换手柄
|
||||
*/
|
||||
addGizmoRect(x: number, y: number, width: number, height: number, rotation: number, origin_x: number, origin_y: number, r: number, g: number, b: number, a: number, show_handles: boolean): void;
|
||||
/**
|
||||
* Resize a specific viewport.
|
||||
* 调整特定视口大小。
|
||||
*/
|
||||
resizeViewport(viewport_id: string, width: number, height: number): void;
|
||||
/**
|
||||
* Set clear color (background color).
|
||||
* 设置清除颜色(背景颜色)。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `r`, `g`, `b`, `a` - Color components (0.0-1.0) | 颜色分量 (0.0-1.0)
|
||||
*/
|
||||
setClearColor(r: number, g: number, b: number, a: number): void;
|
||||
/**
|
||||
* Set gizmo visibility.
|
||||
* 设置辅助工具可见性。
|
||||
*/
|
||||
setShowGizmos(show: boolean): void;
|
||||
/**
|
||||
* Get all registered viewport IDs.
|
||||
* 获取所有已注册的视口ID。
|
||||
*/
|
||||
getViewportIds(): string[];
|
||||
/**
|
||||
* Register a new viewport.
|
||||
* 注册新视口。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `id` - Unique viewport identifier | 唯一视口标识符
|
||||
* * `canvas_id` - HTML canvas element ID | HTML canvas元素ID
|
||||
*/
|
||||
registerViewport(id: string, canvas_id: string): void;
|
||||
/**
|
||||
* Render to a specific viewport.
|
||||
* 渲染到特定视口。
|
||||
*/
|
||||
renderToViewport(viewport_id: string): void;
|
||||
/**
|
||||
* Set transform tool mode.
|
||||
* 设置变换工具模式。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `mode` - 0=Select, 1=Move, 2=Rotate, 3=Scale
|
||||
*/
|
||||
setTransformMode(mode: number): void;
|
||||
/**
|
||||
* Get or load texture by path.
|
||||
* 按路径获取或加载纹理。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `path` - Image path/URL | 图片路径/URL
|
||||
*/
|
||||
getOrLoadTextureByPath(path: string): number;
|
||||
/**
|
||||
* Get camera for a specific viewport.
|
||||
* 获取特定视口的相机。
|
||||
*/
|
||||
getViewportCamera(viewport_id: string): Float32Array | undefined;
|
||||
/**
|
||||
* Set the active viewport.
|
||||
* 设置活动视口。
|
||||
*/
|
||||
setActiveViewport(id: string): boolean;
|
||||
/**
|
||||
* Set camera for a specific viewport.
|
||||
* 为特定视口设置相机。
|
||||
*/
|
||||
setViewportCamera(viewport_id: string, x: number, y: number, zoom: number, rotation: number): void;
|
||||
/**
|
||||
* Set viewport configuration.
|
||||
* 设置视口配置。
|
||||
*/
|
||||
setViewportConfig(viewport_id: string, show_grid: boolean, show_gizmos: boolean): void;
|
||||
/**
|
||||
* Submit sprite batch data for rendering.
|
||||
* 提交精灵批次数据进行渲染。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `transforms` - Float32Array [x, y, rotation, scaleX, scaleY, originX, originY] per sprite
|
||||
* 每个精灵的变换数据
|
||||
* * `texture_ids` - Uint32Array of texture IDs | 纹理ID数组
|
||||
* * `uvs` - Float32Array [u0, v0, u1, v1] per sprite | 每个精灵的UV坐标
|
||||
* * `colors` - Uint32Array of packed RGBA colors | 打包的RGBA颜色数组
|
||||
*/
|
||||
submitSpriteBatch(transforms: Float32Array, texture_ids: Uint32Array, uvs: Float32Array, colors: Uint32Array): void;
|
||||
/**
|
||||
* Unregister a viewport.
|
||||
* 注销视口。
|
||||
*/
|
||||
unregisterViewport(id: string): void;
|
||||
/**
|
||||
* Load texture by path, returning texture ID.
|
||||
* 按路径加载纹理,返回纹理ID。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `path` - Image path/URL to load | 要加载的图片路径/URL
|
||||
*/
|
||||
loadTextureByPath(path: string): number;
|
||||
/**
|
||||
* Get texture ID by path.
|
||||
* 按路径获取纹理ID。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `path` - Image path to lookup | 要查找的图片路径
|
||||
*/
|
||||
getTextureIdByPath(path: string): number | undefined;
|
||||
/**
|
||||
* Create a new game engine instance.
|
||||
* 创建新的游戏引擎实例。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `canvas_id` - The HTML canvas element ID | HTML canvas元素ID
|
||||
*
|
||||
* # Returns | 返回
|
||||
* A new GameEngine instance or an error | 新的GameEngine实例或错误
|
||||
*/
|
||||
constructor(canvas_id: string);
|
||||
/**
|
||||
* Clear the screen with specified color.
|
||||
* 使用指定颜色清除屏幕。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `r` - Red component (0.0-1.0) | 红色分量
|
||||
* * `g` - Green component (0.0-1.0) | 绿色分量
|
||||
* * `b` - Blue component (0.0-1.0) | 蓝色分量
|
||||
* * `a` - Alpha component (0.0-1.0) | 透明度分量
|
||||
*/
|
||||
clear(r: number, g: number, b: number, a: number): void;
|
||||
/**
|
||||
* Render the current frame.
|
||||
* 渲染当前帧。
|
||||
*/
|
||||
render(): void;
|
||||
/**
|
||||
* Resize viewport.
|
||||
* 调整视口大小。
|
||||
*
|
||||
* # Arguments | 参数
|
||||
* * `width` - New viewport width | 新视口宽度
|
||||
* * `height` - New viewport height | 新视口高度
|
||||
*/
|
||||
resize(width: number, height: number): void;
|
||||
/**
|
||||
* Get canvas width.
|
||||
* 获取画布宽度。
|
||||
*/
|
||||
readonly width: number;
|
||||
/**
|
||||
* Get canvas height.
|
||||
* 获取画布高度。
|
||||
*/
|
||||
readonly height: number;
|
||||
}
|
||||
|
||||
export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
|
||||
|
||||
export interface InitOutput {
|
||||
readonly memory: WebAssembly.Memory;
|
||||
readonly __wbg_gameengine_free: (a: number, b: number) => void;
|
||||
readonly gameengine_addGizmoRect: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number) => void;
|
||||
readonly gameengine_clear: (a: number, b: number, c: number, d: number, e: number) => void;
|
||||
readonly gameengine_fromExternal: (a: any, b: number, c: number) => [number, number, number];
|
||||
readonly gameengine_getCamera: (a: number) => [number, number];
|
||||
readonly gameengine_getOrLoadTextureByPath: (a: number, b: number, c: number) => [number, number, number];
|
||||
readonly gameengine_getTextureIdByPath: (a: number, b: number, c: number) => number;
|
||||
readonly gameengine_getViewportCamera: (a: number, b: number, c: number) => [number, number];
|
||||
readonly gameengine_getViewportIds: (a: number) => [number, number];
|
||||
readonly gameengine_height: (a: number) => number;
|
||||
readonly gameengine_isKeyDown: (a: number, b: number, c: number) => number;
|
||||
readonly gameengine_loadTexture: (a: number, b: number, c: number, d: number) => [number, number];
|
||||
readonly gameengine_loadTextureByPath: (a: number, b: number, c: number) => [number, number, number];
|
||||
readonly gameengine_new: (a: number, b: number) => [number, number, number];
|
||||
readonly gameengine_registerViewport: (a: number, b: number, c: number, d: number, e: number) => [number, number];
|
||||
readonly gameengine_render: (a: number) => [number, number];
|
||||
readonly gameengine_renderToViewport: (a: number, b: number, c: number) => [number, number];
|
||||
readonly gameengine_resize: (a: number, b: number, c: number) => void;
|
||||
readonly gameengine_resizeViewport: (a: number, b: number, c: number, d: number, e: number) => void;
|
||||
readonly gameengine_setActiveViewport: (a: number, b: number, c: number) => number;
|
||||
readonly gameengine_setCamera: (a: number, b: number, c: number, d: number, e: number) => void;
|
||||
readonly gameengine_setClearColor: (a: number, b: number, c: number, d: number, e: number) => void;
|
||||
readonly gameengine_setShowGizmos: (a: number, b: number) => void;
|
||||
readonly gameengine_setShowGrid: (a: number, b: number) => void;
|
||||
readonly gameengine_setTransformMode: (a: number, b: number) => void;
|
||||
readonly gameengine_setViewportCamera: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
|
||||
readonly gameengine_setViewportConfig: (a: number, b: number, c: number, d: number, e: number) => void;
|
||||
readonly gameengine_submitSpriteBatch: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => [number, number];
|
||||
readonly gameengine_unregisterViewport: (a: number, b: number, c: number) => void;
|
||||
readonly gameengine_updateInput: (a: number) => void;
|
||||
readonly gameengine_width: (a: number) => number;
|
||||
readonly init: () => void;
|
||||
readonly wasm_bindgen__convert__closures_____invoke__hdbeb4a641c76f980: (a: number, b: number) => void;
|
||||
readonly wasm_bindgen__closure__destroy__h201da39d82f7cf6e: (a: number, b: number) => void;
|
||||
readonly __wbindgen_malloc: (a: number, b: number) => number;
|
||||
readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|
||||
readonly __wbindgen_exn_store: (a: number) => void;
|
||||
readonly __externref_table_alloc: () => number;
|
||||
readonly __wbindgen_externrefs: WebAssembly.Table;
|
||||
readonly __wbindgen_free: (a: number, b: number, c: number) => void;
|
||||
readonly __externref_table_dealloc: (a: number) => void;
|
||||
readonly __externref_drop_slice: (a: number, b: number) => void;
|
||||
readonly __wbindgen_start: () => void;
|
||||
}
|
||||
|
||||
export type SyncInitInput = BufferSource | WebAssembly.Module;
|
||||
/**
|
||||
* Instantiates the given `module`, which can either be bytes or
|
||||
* a precompiled `WebAssembly.Module`.
|
||||
*
|
||||
* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated.
|
||||
*
|
||||
* @returns {InitOutput}
|
||||
*/
|
||||
export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput;
|
||||
|
||||
/**
|
||||
* If `module_or_path` is {RequestInfo} or {URL}, makes a request and
|
||||
* for everything else, calls `WebAssembly.instantiate` directly.
|
||||
*
|
||||
* @param {{ module_or_path: InitInput | Promise<InitInput> }} module_or_path - Passing `InitInput` directly is deprecated.
|
||||
*
|
||||
* @returns {Promise<InitOutput>}
|
||||
*/
|
||||
export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise<InitInput> } | InitInput | Promise<InitInput>): Promise<InitOutput>;
|
||||
@@ -9,6 +9,7 @@
|
||||
"outDir": "./bin",
|
||||
"rootDir": "./src",
|
||||
"strict": true,
|
||||
"composite": true,
|
||||
"esModuleInterop": true,
|
||||
"skipLibCheck": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
|
||||
Reference in New Issue
Block a user