refactor: reorganize package structure and decouple framework packages (#338)

* refactor: reorganize package structure and decouple framework packages

## Package Structure Reorganization
- Reorganized 55 packages into categorized subdirectories:
  - packages/framework/ - Generic framework (Laya/Cocos compatible)
  - packages/engine/ - ESEngine core modules
  - packages/rendering/ - Rendering modules (WASM dependent)
  - packages/physics/ - Physics modules
  - packages/streaming/ - World streaming
  - packages/network-ext/ - Network extensions
  - packages/editor/ - Editor framework and plugins
  - packages/rust/ - Rust WASM engine
  - packages/tools/ - Build tools and SDK

## Framework Package Decoupling
- Decoupled behavior-tree and blueprint packages from ESEngine dependencies
- Created abstracted interfaces (IBTAssetManager, IBehaviorTreeAssetContent)
- ESEngine-specific code moved to esengine/ subpath exports
- Framework packages now usable with Cocos/Laya without ESEngine

## CI Configuration
- Updated CI to only type-check and lint framework packages
- Added type-check:framework and lint:framework scripts

## Breaking Changes
- Package import paths changed due to directory reorganization
- ESEngine integrations now use subpath imports (e.g., '@esengine/behavior-tree/esengine')

* fix: update es-engine file path after directory reorganization

* docs: update README to focus on framework over engine

* ci: only build framework packages, remove Rust/WASM dependencies

* fix: remove esengine subpath from behavior-tree and blueprint builds

ESEngine integration code will only be available in full engine builds.
Framework packages are now purely engine-agnostic.

* fix: move network-protocols to framework, build both in CI

* fix: update workflow paths from packages/core to packages/framework/core

* fix: exclude esengine folder from type-check in behavior-tree and blueprint

* fix: update network tsconfig references to new paths

* fix: add test:ci:framework to only test framework packages in CI

* fix: only build core and math npm packages in CI

* fix: exclude test files from CodeQL and fix string escaping security issue
This commit is contained in:
YHH
2025-12-26 14:50:35 +08:00
committed by GitHub
parent a84ff902e4
commit 155411e743
1936 changed files with 4147 additions and 11578 deletions

View File

@@ -0,0 +1,213 @@
/**
* 物理模块服务令牌
* Physics module service tokens
*
* 定义 physics-rapier2d 模块导出的服务令牌和接口。
* 谁定义接口,谁导出 Token。
*
* Defines service tokens and interfaces exported by physics-rapier2d module.
* Who defines the interface, who exports the Token.
*
* @example
* ```typescript
* // 消费方导入 Token | Consumer imports Token
* import { Physics2DQueryToken, type IPhysics2DQuery } from '@esengine/physics-rapier2d';
*
* // 获取服务 | Get service
* const physicsQuery = context.services.get(Physics2DQueryToken);
* if (physicsQuery) {
* physicsQuery.raycast(...);
* }
* ```
*/
import { createServiceToken } from '@esengine/ecs-framework';
import type { Physics2DSystem } from './systems/Physics2DSystem';
// ============================================================================
// 共享物理接口 | Shared Physics Interfaces
// ============================================================================
/**
* 2D 物理查询接口
* 2D Physics query interface
*
* 跨模块共享的物理查询契约。
* 由 Physics2DWorld 实现,粒子等模块可选依赖。
*
* Cross-module shared physics query contract.
* Implemented by Physics2DWorld, optionally depended by particle and other modules.
*/
export interface IPhysics2DQuery {
/**
* 圆形区域检测
* Circle overlap detection
*
* @param center 圆心 | Circle center
* @param radius 半径 | Radius
* @param collisionMask 碰撞掩码 | Collision mask
* @returns 检测结果 | Detection result
*/
overlapCircle(
center: { x: number; y: number },
radius: number,
collisionMask?: number
): { entityIds: number[]; colliderHandles: number[] };
/**
* 射线检测
* Raycast detection
*
* @param origin 起点 | Origin point
* @param direction 方向(归一化)| Direction (normalized)
* @param maxDistance 最大距离 | Max distance
* @param collisionMask 碰撞掩码 | Collision mask
* @returns 命中结果或 null | Hit result or null
*/
raycast(
origin: { x: number; y: number },
direction: { x: number; y: number },
maxDistance: number,
collisionMask?: number
): {
entityId: number;
point: { x: number; y: number };
normal: { x: number; y: number };
distance: number;
colliderHandle: number;
} | null;
}
/**
* 2D 物理世界接口
* 2D Physics world interface
*
* 跨模块共享的物理世界契约。
* 由 Physics2DWorld 实现tilemap 等模块可选依赖。
*
* Cross-module shared physics world contract.
* Implemented by Physics2DWorld, optionally depended by tilemap and other modules.
*/
export interface IPhysics2DWorld {
/**
* 创建静态碰撞体
* Create static collider
*
* @param entityId 实体 ID | Entity ID
* @param position 碰撞体中心位置 | Collider center position
* @param halfExtents 半宽高 | Half extents
* @param collisionLayer 碰撞层 | Collision layer
* @param collisionMask 碰撞掩码 | Collision mask
* @param friction 摩擦系数 | Friction coefficient
* @param restitution 弹性系数 | Restitution coefficient
* @param isTrigger 是否为触发器 | Whether is trigger
* @returns 碰撞体句柄或 null | Collider handle or null
*/
createStaticCollider(
entityId: number,
position: { x: number; y: number },
halfExtents: { x: number; y: number },
collisionLayer: number,
collisionMask: number,
friction: number,
restitution: number,
isTrigger: boolean
): number | null;
/**
* 移除碰撞体
* Remove collider
*
* @param handle 碰撞体句柄 | Collider handle
*/
removeCollider(handle: number): void;
}
// ============================================================================
// 物理模块特有的接口 | Physics module specific interfaces
// ============================================================================
/**
* 物理配置
* Physics configuration
*/
export interface PhysicsConfig {
gravity?: { x: number; y: number };
timestep?: number;
}
/**
* 碰撞层配置接口
* Collision layer config interface
*
* 跨模块共享的碰撞层配置契约。
* Cross-module shared collision layer config contract.
*/
export interface ICollisionLayerConfig {
/**
* 获取所有层定义
* Get all layer definitions
*/
getLayers(): ReadonlyArray<{ name: string }>;
/**
* 添加监听器
* Add listener
*/
addListener(callback: () => void): void;
/**
* 移除监听器
* Remove listener
*/
removeListener(callback: () => void): void;
}
// ============================================================================
// 服务令牌 | Service Tokens
// ============================================================================
/**
* 2D 物理查询服务令牌
* 2D Physics query service token
*
* 用于获取物理查询能力(射线检测、区域检测等)。
* For getting physics query capabilities (raycast, overlap detection, etc.).
*/
export const Physics2DQueryToken = createServiceToken<IPhysics2DQuery>('physics2DQuery');
/**
* 2D 物理世界服务令牌
* 2D Physics world service token
*
* 用于获取物理世界实例(需要底层访问时使用)。
* For getting physics world instance (when low-level access is needed).
*/
export const Physics2DWorldToken = createServiceToken<IPhysics2DWorld>('physics2DWorld');
/**
* 物理系统令牌
* Physics system token
*
* 用于获取完整的物理系统实例。
* For getting the full physics system instance.
*/
export const Physics2DSystemToken = createServiceToken<Physics2DSystem>('physics2DSystem');
/**
* 物理配置令牌
* Physics config token
*
* 用于传入物理配置(如重力、时间步)。
* For passing physics configuration (gravity, timestep, etc.).
*/
export const PhysicsConfigToken = createServiceToken<PhysicsConfig>('physicsConfig');
/**
* 碰撞层配置令牌
* Collision layer config token
*
* 用于获取碰撞层配置服务。
* For getting collision layer config service.
*/
export const CollisionLayerConfigToken = createServiceToken<ICollisionLayerConfig>('collisionLayerConfig');