Feature/physics and tilemap enhancement (#247)

* feat(behavior-tree,tilemap): 修复编辑器连线缩放问题并增强插件系统

* feat(node-editor,blueprint): 新增通用节点编辑器和蓝图可视化脚本系统

* feat(editor,tilemap): 优化编辑器UI样式和Tilemap编辑器功能

* fix: 修复CodeQL安全警告和CI类型检查错误

* fix: 修复CodeQL安全警告和CI类型检查错误

* fix: 修复CodeQL安全警告和CI类型检查错误
This commit is contained in:
YHH
2025-11-29 23:00:48 +08:00
committed by GitHub
parent f03b73b58e
commit 359886c72f
198 changed files with 33879 additions and 13121 deletions

View File

@@ -520,6 +520,58 @@ export class EngineBridge implements IEngineBridge {
this.getEngine().addGizmoRect(x, y, width, height, rotation, originX, originY, r, g, b, a, showHandles);
}
/**
* Add a circle outline gizmo (native rendering).
* 添加圆形边框Gizmo原生渲染
*/
addGizmoCircle(
x: number,
y: number,
radius: number,
r: number,
g: number,
b: number,
a: number
): void {
if (!this.initialized) return;
this.getEngine().addGizmoCircle(x, y, radius, r, g, b, a);
}
/**
* Add a line gizmo (native rendering).
* 添加线条Gizmo原生渲染
*/
addGizmoLine(
points: number[],
r: number,
g: number,
b: number,
a: number,
closed: boolean
): void {
if (!this.initialized) return;
this.getEngine().addGizmoLine(new Float32Array(points), r, g, b, a, closed);
}
/**
* Add a capsule outline gizmo (native rendering).
* 添加胶囊边框Gizmo原生渲染
*/
addGizmoCapsule(
x: number,
y: number,
radius: number,
halfHeight: number,
rotation: number,
r: number,
g: number,
b: number,
a: number
): void {
if (!this.initialized) return;
this.getEngine().addGizmoCapsule(x, y, radius, halfHeight, rotation, r, g, b, a);
}
/**
* Set transform tool mode.
* 设置变换工具模式。

View File

@@ -68,7 +68,7 @@ interface GizmoColorInternal {
* @internal
*/
interface GizmoRenderDataInternal {
type: 'rect' | 'circle' | 'line' | 'grid';
type: 'rect' | 'circle' | 'line' | 'grid' | 'capsule';
color: GizmoColorInternal;
// Rect specific
x?: number;
@@ -87,6 +87,8 @@ interface GizmoRenderDataInternal {
// Grid specific
cols?: number;
rows?: number;
// Capsule specific
halfHeight?: number;
}
/**
@@ -568,8 +570,6 @@ export class EngineRenderSystem extends EntitySystem {
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) {
@@ -578,18 +578,32 @@ export class EngineRenderSystem extends EntitySystem {
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);
const flatPoints: number[] = [];
for (const p of data.points) {
flatPoints.push(p.x, p.y);
}
this.bridge.addGizmoLine(flatPoints, r, g, b, a, data.closed ?? false);
}
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);
this.bridge.addGizmoCircle(data.x, data.y, data.radius, r, g, b, a);
}
break;
case 'capsule':
if (data.x !== undefined && data.y !== undefined &&
data.radius !== undefined && data.halfHeight !== undefined) {
this.bridge.addGizmoCapsule(
data.x,
data.y,
data.radius,
data.halfHeight,
data.rotation ?? 0,
r, g, b, a
);
}
break;
}
@@ -1041,9 +1055,9 @@ export class EngineRenderSystem extends EntitySystem {
* 将十六进制颜色字符串转换为打包的RGBA。
*/
private hexToPackedColor(hex: string, alpha: number): number {
// Parse hex color like "#ffffff" or "#fff"
let r = 255, g = 255, b = 255;
if (hex.startsWith('#')) {
if (typeof hex === 'string' && hex.startsWith('#')) {
const hexValue = hex.slice(1);
if (hexValue.length === 3) {
r = parseInt(hexValue[0] + hexValue[0], 16);
@@ -1055,6 +1069,7 @@ export class EngineRenderSystem extends EntitySystem {
b = parseInt(hexValue.slice(4, 6), 16);
}
}
const a = Math.round(alpha * 255);
// Pack as 0xAABBGGRR for WebGL
return ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((g & 0xFF) << 8) | (r & 0xFF);

View File

@@ -69,6 +69,11 @@ export class GameEngine {
* 设置网格可见性。
*/
setShowGrid(show: boolean): void;
/**
* Add a line gizmo.
* 添加线条Gizmo。
*/
addGizmoLine(points: Float32Array, r: number, g: number, b: number, a: number, closed: boolean): void;
/**
* Add a rectangle gizmo outline.
* 添加矩形Gizmo边框。
@@ -111,11 +116,21 @@ export class GameEngine {
* 设置辅助工具可见性。
*/
setShowGizmos(show: boolean): void;
/**
* Add a circle gizmo outline.
* 添加圆形Gizmo边框。
*/
addGizmoCircle(x: number, y: number, radius: number, r: number, g: number, b: number, a: number): void;
/**
* Get all registered viewport IDs.
* 获取所有已注册的视口ID。
*/
getViewportIds(): string[];
/**
* Add a capsule gizmo outline.
* 添加胶囊Gizmo边框。
*/
addGizmoCapsule(x: number, y: number, radius: number, half_height: number, rotation: number, r: number, g: number, b: number, a: number): void;
/**
* Register a new viewport.
* 注册新视口。
@@ -252,6 +267,9 @@ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembl
export interface InitOutput {
readonly memory: WebAssembly.Memory;
readonly __wbg_gameengine_free: (a: number, b: number) => void;
readonly gameengine_addGizmoCapsule: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => void;
readonly gameengine_addGizmoCircle: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
readonly gameengine_addGizmoLine: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: 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];