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:
@@ -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.
|
||||
* 设置变换工具模式。
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user