Skip to content

feat(scene): expose LODGroup bounds recalculation - #886

Merged
star-e merged 6 commits into
cocos:mainfrom
Changdw:feature/lod-group-recalculate-bounds-api
Aug 27, 2026
Merged

feat(scene): expose LODGroup bounds recalculation#886
star-e merged 6 commits into
cocos:mainfrom
Changdw:feature/lod-group-recalculate-bounds-api

Conversation

@Changdw

@Changdw Changdw commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

变更说明

本 PR 为 cocos-cli 增加 cc.LODGroup 包围盒重算能力,同时向 SDK 和 MCP/AI 开放。

CLI SDK

新增:

cli.Scene.Component.recalculateLODGroupBounds({
    path: 'Canvas/LODNode/cc.LODGroup',
    record: true,
});

返回:

{
    localBoundaryCenter: {
        x: number;
        y: number;
        z: number;
    };
    objectSize: number;
}

实现包含:

  • 校验组件是否存在。
  • 限定目标必须是 cc.LODGroup
  • 调用引擎 LODGroup.recalculateBounds()
  • 支持 undo/redo。
  • record: false 时不写入 undo 历史。
  • 无有效 Renderer 时返回零值边界。

MCP/AI Tool

新增工具:

scene-recalculate-lod-group-bounds

调用参数:

{
  "options": {
    "path": "Canvas/LODNode/cc.LODGroup",
    "record": true
  }
}

PinK 对接边界

cocos-cli 已完成底层 SDK 接口。

PinK 侧负责:

  1. InvokeAPIMap.component 注册 recalculate-lod-group-bounds
  2. 在 PinK Scene Webview 的 ComponentAPI 中转发到:
cli.Scene.Component.recalculateLODGroupBounds(params);
  1. Inspector 按钮通过以下方式调用:
const bounds = await scene.invoke(
    'component',
    'recalculate-lod-group-bounds',
    {
        path: componentPath,
        record: true,
    },
);

PinK 不需要调用 MCP Tool。PinK 和 MCP/AI 只是不同入口,最终复用同一个 ComponentService 方法。

测试方法

调用 scene-recalculate-lod-group-bounds

{
  "options": {
    "path": "LODGroupMcpTest/cc.LODGroup",
    "record": false
  }
}

空 LODGroup 的预期结果:

{
  "code": 200,
  "data": {
    "localBoundaryCenter": {
      "x": 0,
      "y": 0,
      "z": 0
    },
    "objectSize": 0
  }
}

path 必须是组件路径,不能只传节点路径。

@Changdw
Changdw requested a review from dogodo-cc August 26, 2026 02:48
@Changdw

Changdw commented Aug 26, 2026

Copy link
Copy Markdown
Contributor Author

本次提交

在已有 recalculateLODGroupBounds() 基础上,补齐 LODGroup 层级编辑、相机屏占比查询及场景 Gizmo。

新增公开接口

  • Scene.Component.insertLOD()
  • Scene.Component.eraseLOD()
  • Scene.Component.queryLODGroupRelativeHeight()

同时新增 MCP Tools:

  • scene-insert-lod
  • scene-erase-lod
  • scene-query-lod-group-relative-height

写操作支持 undo/redo、dirty 状态和 record: false

参数约定

  • screenUsagePercentage 接受 (0, 1]
  • 省略时由引擎自动计算
  • 显式传入 0 会被拒绝;如需支持,需要另行修复引擎的 falsy 判断
  • 最多 8 个 LOD,至少保留 1 个

LODGroup Gizmo

  • 显示当前 LOD nCulled
  • 支持透视和正交编辑器相机
  • 销毁时解除相机监听并销毁独立 Canvas,避免场景重载后残留资源

PinK 对接

PinK 应直接调用 cocos-cli SDK,不需要调用 MCP Tool 或内部 RPC:

await cli.Scene.Component.insertLOD({
    path: 'Root/LOD/cc.LODGroup',
    index: 0,
});

const relativeHeight =
    await cli.Scene.Component.queryLODGroupRelativeHeight({
        path: 'Root/LOD/cc.LODGroup',
    });

await cli.Scene.Component.eraseLOD({
    path: 'Root/LOD/cc.LODGroup',
    index: 0,
});

@Changdw Changdw closed this Aug 27, 2026
@Changdw Changdw reopened this Aug 27, 2026
@star-e
star-e merged commit 978300c into cocos:main Aug 27, 2026
6 of 8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants